@citolab/qti-components 7.14.2 → 7.15.0
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/cdn/index.global.js +1 -1
- package/cdn/index.js +4070 -4048
- package/custom-elements.json +10320 -25886
- package/dist/base.d.ts +8 -0
- package/dist/base.js +50 -0
- package/dist/{chunks/chunk-7567ZPN6.js → chunk-2DOYPVF5.js} +252 -136
- package/dist/chunk-2DOYPVF5.js.map +1 -0
- package/dist/chunk-2ZEJ3RR5.js +89 -0
- package/dist/chunk-2ZEJ3RR5.js.map +1 -0
- package/dist/{chunks/chunk-Z2FFXTKX.js → chunk-352OTVTY.js} +1483 -445
- package/dist/chunk-352OTVTY.js.map +1 -0
- package/dist/{chunks/chunk-2X2C5WI5.js → chunk-C2HQFI2C.js} +939 -3842
- package/dist/chunk-C2HQFI2C.js.map +1 -0
- package/dist/chunk-DWIRLYDS.js +20 -0
- package/dist/chunk-DWIRLYDS.js.map +1 -0
- package/dist/{chunks/chunk-H2JE6IVU.js → chunk-EUXUH3YW.js} +1 -1
- package/dist/chunk-F44CI35W.js +145 -0
- package/dist/chunk-F44CI35W.js.map +1 -0
- package/dist/{chunks/chunk-XBPO6E25.js → chunk-INKI27D5.js} +6 -5
- package/dist/chunk-INKI27D5.js.map +1 -0
- package/dist/chunk-JEUY3MYB.js +2010 -0
- package/dist/chunk-JEUY3MYB.js.map +1 -0
- package/dist/chunk-O4XIWHTF.js +1139 -0
- package/dist/chunk-O4XIWHTF.js.map +1 -0
- package/dist/chunk-RI47B4ZT.js +1753 -0
- package/dist/chunk-RI47B4ZT.js.map +1 -0
- package/dist/{qti-loader/index.js → chunk-VEV4DGPH.js} +6 -6
- package/dist/chunk-VEV4DGPH.js.map +1 -0
- package/dist/{chunks/chunk-PT5ASWGQ.js → chunk-W4SQRNWO.js} +105 -2
- package/dist/chunk-W4SQRNWO.js.map +1 -0
- package/dist/elements.d.ts +1 -0
- package/dist/elements.js +42 -0
- package/dist/index.d.ts +8 -24
- package/dist/index.js +118 -284
- package/dist/index.js.map +1 -1
- package/dist/interactions.d.ts +1 -0
- package/dist/interactions.js +72 -0
- package/dist/item.css +8 -0
- package/dist/item.d.ts +1 -0
- package/dist/item.js +23 -0
- package/dist/loader.d.ts +1 -0
- package/dist/loader.js +11 -0
- package/dist/processing.d.ts +1 -0
- package/dist/processing.js +103 -0
- package/dist/qti-components-jsx.d.ts +1540 -2452
- package/dist/test.d.ts +1 -0
- package/dist/{qti-test/index.js → test.js} +11 -19
- package/dist/transformers.d.ts +1 -0
- package/dist/{qti-transformers/index.js → transformers.js} +3 -3
- package/dist/vscode.html-custom-data.json +469 -631
- package/package.json +71 -167
- package/LICENSE.md +0 -674
- package/dist/chunks/chunk-2X2C5WI5.js.map +0 -1
- package/dist/chunks/chunk-4OGJBG35.js +0 -8
- package/dist/chunks/chunk-4OGJBG35.js.map +0 -1
- package/dist/chunks/chunk-7567ZPN6.js.map +0 -1
- package/dist/chunks/chunk-BHJSX3Q6.js +0 -8
- package/dist/chunks/chunk-BHJSX3Q6.js.map +0 -1
- package/dist/chunks/chunk-C5RLRG3L.js +0 -10
- package/dist/chunks/chunk-C5RLRG3L.js.map +0 -1
- package/dist/chunks/chunk-CJADUWEC.js +0 -10
- package/dist/chunks/chunk-CJADUWEC.js.map +0 -1
- package/dist/chunks/chunk-DVQQ7I6Y.js +0 -8
- package/dist/chunks/chunk-DVQQ7I6Y.js.map +0 -1
- package/dist/chunks/chunk-ELDMXTUQ.js +0 -31
- package/dist/chunks/chunk-ELDMXTUQ.js.map +0 -1
- package/dist/chunks/chunk-GAAFN7QF.js +0 -146
- package/dist/chunks/chunk-GAAFN7QF.js.map +0 -1
- package/dist/chunks/chunk-H6KHXSIO.js +0 -8
- package/dist/chunks/chunk-H6KHXSIO.js.map +0 -1
- package/dist/chunks/chunk-JQ6HWGRY.js +0 -22
- package/dist/chunks/chunk-JQ6HWGRY.js.map +0 -1
- package/dist/chunks/chunk-NJNQOQUU.js +0 -8
- package/dist/chunks/chunk-NJNQOQUU.js.map +0 -1
- package/dist/chunks/chunk-P4QBOVQ2.js +0 -206
- package/dist/chunks/chunk-P4QBOVQ2.js.map +0 -1
- package/dist/chunks/chunk-PT5ASWGQ.js.map +0 -1
- package/dist/chunks/chunk-SV4K25ZI.js +0 -19
- package/dist/chunks/chunk-SV4K25ZI.js.map +0 -1
- package/dist/chunks/chunk-XBPO6E25.js.map +0 -1
- package/dist/chunks/chunk-YD7FVKDP.js +0 -236
- package/dist/chunks/chunk-YD7FVKDP.js.map +0 -1
- package/dist/chunks/chunk-Z2FFXTKX.js.map +0 -1
- package/dist/exports/computed-item.context.d.ts +0 -23
- package/dist/exports/computed-item.context.js +0 -8
- package/dist/exports/computed.context.d.ts +0 -34
- package/dist/exports/computed.context.js +0 -8
- package/dist/exports/config.context.d.ts +0 -14
- package/dist/exports/config.context.js +0 -8
- package/dist/exports/expression-result.d.ts +0 -19
- package/dist/exports/expression-result.js +0 -1
- package/dist/exports/interaction.d.ts +0 -46
- package/dist/exports/interaction.interface.d.ts +0 -13
- package/dist/exports/interaction.interface.js +0 -1
- package/dist/exports/interaction.js +0 -12
- package/dist/exports/item.context.d.ts +0 -11
- package/dist/exports/item.context.js +0 -8
- package/dist/exports/qti-assessment-item.context.d.ts +0 -9
- package/dist/exports/qti-assessment-item.context.js +0 -8
- package/dist/exports/qti-condition-expression.d.ts +0 -14
- package/dist/exports/qti-condition-expression.js +0 -11
- package/dist/exports/qti-condition-expression.js.map +0 -1
- package/dist/exports/qti-expression.d.ts +0 -23
- package/dist/exports/qti-expression.js +0 -10
- package/dist/exports/qti-expression.js.map +0 -1
- package/dist/exports/qti-test.d.ts +0 -12
- package/dist/exports/qti-test.js +0 -1
- package/dist/exports/qti-test.js.map +0 -1
- package/dist/exports/qti.context.d.ts +0 -14
- package/dist/exports/qti.context.js +0 -8
- package/dist/exports/qti.context.js.map +0 -1
- package/dist/exports/session.context.d.ts +0 -15
- package/dist/exports/session.context.js +0 -10
- package/dist/exports/session.context.js.map +0 -1
- package/dist/exports/test.context.d.ts +0 -16
- package/dist/exports/test.context.js +0 -10
- package/dist/exports/test.context.js.map +0 -1
- package/dist/exports/variables.d.ts +0 -2
- package/dist/exports/variables.js +0 -1
- package/dist/exports/variables.js.map +0 -1
- package/dist/qti-assessment-item-l-mN3teH.d.ts +0 -105
- package/dist/qti-components/index.d.ts +0 -1522
- package/dist/qti-components/index.js +0 -214
- package/dist/qti-components/index.js.map +0 -1
- package/dist/qti-item/index.d.ts +0 -114
- package/dist/qti-item/index.js +0 -19
- package/dist/qti-item/index.js.map +0 -1
- package/dist/qti-loader/index.d.ts +0 -21
- package/dist/qti-loader/index.js.map +0 -1
- package/dist/qti-modal-feedback-PKbhO-3w.d.ts +0 -30
- package/dist/qti-test/index.d.ts +0 -480
- package/dist/qti-test/index.js.map +0 -1
- package/dist/qti-test-Db7oNIWY.d.ts +0 -120
- package/dist/qti-transform-test-Bz9A3hmD.d.ts +0 -63
- package/dist/qti-transformers/index.d.ts +0 -18
- package/dist/qti-transformers/index.js.map +0 -1
- package/dist/variables-BCkyLoXK.d.ts +0 -55
- package/readme.md +0 -59
- /package/dist/{chunks/chunk-H2JE6IVU.js.map → base.js.map} +0 -0
- /package/dist/{exports/computed-item.context.js.map → chunk-EUXUH3YW.js.map} +0 -0
- /package/dist/{exports/computed.context.js.map → elements.js.map} +0 -0
- /package/dist/{exports/config.context.js.map → interactions.js.map} +0 -0
- /package/dist/{exports/expression-result.js.map → item.js.map} +0 -0
- /package/dist/{exports/interaction.interface.js.map → loader.js.map} +0 -0
- /package/dist/{exports/interaction.js.map → processing.js.map} +0 -0
- /package/dist/{exports/item.context.js.map → test.js.map} +0 -0
- /package/dist/{exports/qti-assessment-item.context.js.map → transformers.js.map} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/lib/exports/computed-item.context.ts"],"sourcesContent":["import { createContext } from '@lit/context';\n\nimport type { VariableDeclaration } from './variables';\n\nexport type ComputedItemContext = {\n identifier: string;\n href?: string;\n correct?: boolean;\n incorrect?: boolean;\n completed?: boolean;\n adaptive?: boolean;\n timeDependent?: boolean;\n title?: string;\n label?: string;\n score?: number;\n maxScore?: number;\n completionStatus?: string;\n variables: ReadonlyArray<VariableDeclaration<string | string[] | null>>;\n};\n\nexport const computedItemContext = createContext<Readonly<ComputedItemContext>>(Symbol('computedItemContext'));\n"],"mappings":";AAAA,SAAS,qBAAqB;AAoBvB,IAAM,sBAAsB,cAA6C,OAAO,qBAAqB,CAAC;","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/lib/qti-item/components/item-container.ts","../../src/lib/qti-item/components/print-item-variables.ts","../../src/lib/qti-item/components/item-show-correct-response.ts","../../src/lib/qti-item/components/styles.ts","../../src/lib/qti-item/core/qti-item.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 { qtiTransformItem } from '../../qti-transformers';\n\n/**\n * `<item-container>` is a custom element designed for hosting the qti-assessment-item.\n * The `qti-assessment-item` will be placed inside the shadow DOM of this element.\n * The element loads the item from the provided URL and renders it inside the shadow DOM.\n *\n * ### Styling\n * Add a class to the element for styling.\n *\n * ```html\n * <qti-item>\n * <item-container class=\"m-4 bg-white\" item-url=\"./path/to/item.xml\"></item-container>\n * </qti-item>\n * ```\n */\n@customElement('item-container')\nexport class ItemContainer extends LitElement {\n /** URL of the item to load */\n @property({ type: String, attribute: 'item-url' })\n itemURL: string = null;\n\n /** A parsed HTML document */\n @state()\n itemDoc: DocumentFragment = null;\n\n /** The raw XML string */\n @state()\n itemXML: string = null;\n\n /** Template content if provided */\n private templateContent = null;\n\n @watch('itemURL', { waitUntilFirstUpdate: true })\n protected async handleItemURLChange() {\n if (!this.itemURL) return;\n try {\n const api = await qtiTransformItem().load(this.itemURL);\n this.itemDoc = api.htmlDoc();\n } catch (error) {\n console.error('Error loading or parsing XML:', error);\n }\n }\n\n @watch('itemXML', { waitUntilFirstUpdate: true })\n protected handleItemXMLChange() {\n if (!this.itemXML) return;\n try {\n this.itemDoc = qtiTransformItem().parse(this.itemXML).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.itemURL) {\n this.handleItemURLChange();\n }\n if (this.itemXML) {\n this.handleItemXMLChange();\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.itemDoc, html`<span>Loading...</span>`)}\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'item-container': ItemContainer;\n }\n}\n","import { consume } from '@lit/context';\nimport { css, html, LitElement } from 'lit';\nimport { customElement } from 'lit/decorators.js';\n\nimport { computedItemContext } from '../../exports/computed-item.context';\n\nimport type { ResponseVariable } from '../../exports/variables';\nimport type { ComputedItemContext } from '../../exports/computed-item.context';\n\n@customElement('print-item-variables')\nexport class PrintItemVariables extends LitElement {\n @consume({ context: computedItemContext, subscribe: true })\n protected computedContext?: ComputedItemContext;\n\n static styles = css`\n table {\n width: 100%;\n border-collapse: collapse;\n margin: 20px 0;\n font-size: 14px;\n text-align: left;\n }\n th,\n td {\n border: 1px solid #ddd;\n padding: 8px;\n }\n th {\n background-color: #f4f4f4;\n font-weight: bold;\n }\n h3 {\n margin-top: 20px;\n font-size: 16px;\n }\n `;\n\n render() {\n const activeItem = this.computedContext;\n\n if (!activeItem || !activeItem.variables) return html``;\n\n const responseVariables: ResponseVariable[] = activeItem.variables.filter(v => v.type === 'response');\n const outcomeVariables = activeItem.variables.filter(v => v.type === 'outcome');\n\n const renderTable = (variables: ResponseVariable[], title: string) => html`\n <h3>${title}</h3>\n <table>\n <thead>\n <tr>\n <th>Identifier</th>\n <th>Value</th>\n <th>Cardinality</th>\n <th>Base Type</th>\n <th>Correct Response / Mappings</th>\n </tr>\n </thead>\n <tbody>\n ${variables.map(v => {\n const correctResponse = v.correctResponse\n ? Array.isArray(v.correctResponse)\n ? v.correctResponse.join(', ')\n : v.correctResponse\n : '';\n\n const mapEntries = v.mapping?.mapEntries?.map(m => `${m.mapKey}=${m.mappedValue}pt`).join(', ') || '';\n\n const areaMapEntries =\n v.areaMapping?.areaMapEntries?.map(m => `${m.shape}(${m.coords})=${m.mappedValue}pt`).join(', ') || '';\n\n return html`\n <tr>\n <td>${v.identifier}</td>\n <td>${Array.isArray(v.value) ? v.value.join(', ') : v.value}</td>\n <td>${v.cardinality}</td>\n <td>${v.baseType}</td>\n <td>${correctResponse || mapEntries || areaMapEntries}</td>\n </tr>\n `;\n })}\n </tbody>\n </table>\n `;\n\n return html`\n ${renderTable(responseVariables, 'Response Variables')} ${renderTable(outcomeVariables, 'Outcome Variables')}\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'print-item-variables': PrintItemVariables;\n }\n}\n","import { css, html, LitElement } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { consume } from '@lit/context';\n\nimport * as styles from './styles';\nimport { computedItemContext } from '../../exports/computed-item.context';\n\nimport type { ComputedItemContext } from '../../exports/computed-item.context';\n\n@customElement('item-show-correct-response')\nexport class ItemShowCorrectResponse extends LitElement {\n @consume({ context: computedItemContext, subscribe: true })\n public computedContext?: ComputedItemContext;\n\n static styles = css`\n :host {\n ${styles.btn};\n }\n :host([disabled]) {\n ${styles.dis};\n }\n `;\n\n @property({ type: Boolean, reflect: true }) shown = false;\n @property({ type: Boolean, reflect: true }) disabled = false; // Reflects to `disabled` attribute\n @property({ type: String }) showCorrectText = 'Show correct response';\n @property({ type: String }) hideCorrectText = 'Hide correct response';\n @property({ type: String }) noCorrectResponseText = 'No correct response specified';\n\n private _hasCorrectResponse = false; // correct response is removed on certain point\n private _previousActiveItem = ''; // Store previous active item reference\n\n updated() {\n if (!this._hasCorrectResponse || this._previousActiveItem !== this.computedContext?.identifier) {\n this._previousActiveItem = this.computedContext?.identifier;\n const containsCorrectResponse = !!this.computedContext?.variables.some(v => v['correctResponse']);\n const containsMapping = !!this.computedContext?.variables.some(v => {\n return v['mapping']?.mapEntries?.length > 0 || v['areaMapping']?.areaMapEntries?.length > 0;\n });\n this._hasCorrectResponse = containsCorrectResponse || containsMapping;\n }\n this.disabled = !this._hasCorrectResponse;\n }\n\n private _toggleState() {\n if (this.disabled) return; // Prevent toggle if disabled\n\n this.dispatchEvent(\n new CustomEvent('item-show-correct-response', {\n detail: !this.shown,\n bubbles: true\n })\n );\n }\n\n private _getDisplayedText(): string {\n return this.disabled ? this.noCorrectResponseText : this.shown ? this.hideCorrectText : this.showCorrectText;\n }\n\n render() {\n return html` <div @click=\"${this._toggleState}\">${this._getDisplayedText()}</div> `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'item-show-correct-response': ItemShowCorrectResponse;\n }\n}\n","// /* eslint-disable lit-plugin(no-invalid-css) */\nimport { css } from 'lit';\n\nexport const form = css`\n display: inline-flex;\n align-items: center;\n cursor: pointer;\n padding: 0.5rem 1rem;\n border-radius: 0.25rem;\n user-select: none;\n`;\n\nexport const btn = css`\n background-color: lightgray;\n ${form};\n`;\n\nexport const dis = css`\n cursor: not-allowed;\n opacity: 0.8;\n`;\n\nexport const ind = css`\n ${form};\n border: 1px solid gray;\n`;\n","import { provide } from '@lit/context';\nimport { html, LitElement } from 'lit';\nimport { customElement, state } from 'lit/decorators.js';\n\nimport { computedItemContext } from '../../exports/computed-item.context';\nimport { configContext } from '../../exports/config.context.ts';\n\nimport type { QtiAssessmentItem } from '../../qti-components/qti-assessment-item/qti-assessment-item.ts';\nimport type { ConfigContext, CorrectResponseMode } from '../../exports/config.context.ts';\nimport type { ItemContext } from '../../exports/item.context';\nimport type { VariableDeclaration } from '../../exports/variables';\nimport type { ComputedItemContext } from '../../exports/computed-item.context';\n\n/**\n * `<qti-item>` is a custom element designed for rendering a single `qti-assessment-item`.\n * It can also host some functionalities to interact with the item like scoring, showing feedback, etc.\n * Placing a mandatory `<item-container>` inside '<qti-item>' will load or parse the item and render it.\n * See `<item-container>` for more details.\n *\n * ```html\n * <qti-item>\n * <item-container class=\"m-4 bg-white\" item-url=\"./path/to/item.xml\"></item-container>\n * </qti-item>\n * ```\n */\n@customElement('qti-item')\nexport class QtiItem extends LitElement {\n @state()\n @provide({ context: computedItemContext })\n public computedContext: ComputedItemContext;\n private _qtiAssessmentItem?: QtiAssessmentItem;\n\n @state()\n @provide({ context: configContext })\n public configContext: ConfigContext = {};\n\n // Store event handlers as instance properties\n private _onItemContextChanged = this._handleItemContextChanged.bind(this);\n private _onAssessmentItemConnected = this._handleAssessmentItemConnected.bind(this);\n\n private _onHandleShowCorrectResponse = this._handleShowCorrectResponse.bind(this);\n private _onHandleShowCandidateCorrection = this._handleShowCandidateCorrection.bind(this);\n private _onHandleSwitchCorrectResponseMode = this._handleSwitchCorrectResponseMode.bind(this);\n\n constructor() {\n super();\n this.addEventListener('qti-item-context-updated', this._onItemContextChanged);\n this.addEventListener('qti-assessment-item-connected', this._onAssessmentItemConnected);\n this.addEventListener('item-show-correct-response', this._onHandleShowCorrectResponse);\n this.addEventListener('item-show-candidate-correction', this._onHandleShowCandidateCorrection);\n this.addEventListener('item-switch-correct-response-mode', this._onHandleSwitchCorrectResponseMode);\n }\n\n private _handleItemContextChanged(e: CustomEvent<{ itemContext: ItemContext }>) {\n this._updateItemVariablesInTestContext(e.detail.itemContext.identifier, e.detail?.itemContext?.variables || []);\n }\n\n private _handleAssessmentItemConnected(e: CustomEvent<QtiAssessmentItem>) {\n const fullVariables = (e.detail as any)._context.variables;\n this._qtiAssessmentItem = e.detail;\n this.computedContext =\n this.computedContext?.identifier === this._qtiAssessmentItem.identifier\n ? { ...this.computedContext, title: this._qtiAssessmentItem.title }\n : ({\n identifier: this._qtiAssessmentItem.identifier,\n title: this._qtiAssessmentItem.title,\n adaptive: this._qtiAssessmentItem.getAttribute('adaptive')?.toLowerCase() === 'true' || false,\n variables: fullVariables,\n correctResponseMode: 'internal'\n } as ComputedItemContext);\n this._updateItemVariablesInTestContext(this._qtiAssessmentItem.identifier, fullVariables || []);\n }\n\n private _handleShowCorrectResponse(e: CustomEvent<boolean>) {\n if (this._qtiAssessmentItem) {\n this._qtiAssessmentItem.showCorrectResponse(e.detail);\n }\n }\n\n private _handleShowCandidateCorrection(e: CustomEvent<boolean>) {\n if (this._qtiAssessmentItem) {\n this._qtiAssessmentItem.showCandidateCorrection(e.detail);\n }\n }\n\n private _handleSwitchCorrectResponseMode(e: CustomEvent<CorrectResponseMode>) {\n // Switch off the correct response first\n this._handleShowCorrectResponse(new CustomEvent('item-show-correct-response', { detail: false, bubbles: true }));\n\n this.configContext = {\n ...this.configContext,\n correctResponseMode: e.detail\n };\n }\n\n private _updateItemVariablesInTestContext(\n identifier: string,\n variables: readonly VariableDeclaration<string | string[] | null>[]\n ): void {\n const rawscore = variables?.find(vr => vr.identifier == 'SCORE')?.value;\n const score = parseFloat(rawscore?.toString());\n const completionStatus = variables?.find(v => v.identifier === 'completionStatus')?.value;\n\n const correct = score !== undefined && !isNaN(score) && score > 0;\n const incorrect = score !== undefined && !isNaN(score) && score <= 0;\n const completed = completionStatus === 'completed';\n this.computedContext = {\n ...this.computedContext,\n identifier,\n correct,\n incorrect,\n completed,\n variables\n };\n }\n\n render() {\n return html`<slot></slot>`;\n }\n\n override disconnectedCallback() {\n super.disconnectedCallback();\n this.removeEventListener('qti-item-context-changed', this._onItemContextChanged);\n this.removeEventListener('qti-assessment-item-connected', this._onAssessmentItemConnected);\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-item': QtiItem;\n }\n}\n"],"mappings":"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","names":["html","LitElement","customElement","LitElement","html","customElement","css","html","LitElement","customElement","property","consume","css","LitElement","html","css","consume","property","customElement","html","LitElement","customElement","state","LitElement","html","state","customElement"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/lib/exports/config.context.ts"],"sourcesContent":["import { createContext } from '@lit/context';\n\nexport type CorrectResponseMode = 'internal' | 'full';\n\nexport interface ConfigContext {\n infoItemCategory?: string;\n reportValidityAfterScoring?: boolean;\n disableAfterIfMaxChoicesReached?: boolean;\n correctResponseMode?: CorrectResponseMode;\n inlineChoicePrompt?: string;\n fullCorrectResponseOnlyWhenIncorrect?: boolean;\n}\n\nexport const configContext = createContext<Readonly<ConfigContext>>(Symbol('configContext'));\n"],"mappings":";AAAA,SAAS,qBAAqB;AAavB,IAAM,gBAAgB,cAAuC,OAAO,eAAe,CAAC;","names":[]}
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
// src/lib/exports/session.context.ts
|
|
2
|
-
import { createContext } from "@lit/context";
|
|
3
|
-
var INITIAL_SESSION_CONTEXT = { view: "candidate" };
|
|
4
|
-
var sessionContext = createContext(Symbol("testContext"));
|
|
5
|
-
|
|
6
|
-
export {
|
|
7
|
-
INITIAL_SESSION_CONTEXT,
|
|
8
|
-
sessionContext
|
|
9
|
-
};
|
|
10
|
-
//# sourceMappingURL=chunk-C5RLRG3L.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/lib/exports/session.context.ts"],"sourcesContent":["import { createContext } from '@lit/context';\n\nexport type View = 'author' | 'candidate' | 'proctor' | 'scorer' | 'testConstructor' | 'tutor' | '';\n\nexport interface SessionContext {\n navPartId?: string | null;\n navSectionId?: string | null;\n navItemRefId?: string | null;\n navItemLoading?: boolean;\n navTestLoading?: boolean;\n view?: View;\n}\n\nexport const INITIAL_SESSION_CONTEXT: Readonly<SessionContext> = { view: 'candidate' };\n\nexport const sessionContext = createContext<Readonly<SessionContext>>(Symbol('testContext'));\n"],"mappings":";AAAA,SAAS,qBAAqB;AAavB,IAAM,0BAAoD,EAAE,MAAM,YAAY;AAE9E,IAAM,iBAAiB,cAAwC,OAAO,aAAa,CAAC;","names":[]}
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
// src/lib/exports/test.context.ts
|
|
2
|
-
import { createContext } from "@lit/context";
|
|
3
|
-
var INITIAL_TEST_CONTEXT = { items: [], testOutcomeVariables: [] };
|
|
4
|
-
var testContext = createContext(Symbol("testContext"));
|
|
5
|
-
|
|
6
|
-
export {
|
|
7
|
-
INITIAL_TEST_CONTEXT,
|
|
8
|
-
testContext
|
|
9
|
-
};
|
|
10
|
-
//# sourceMappingURL=chunk-CJADUWEC.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/lib/exports/test.context.ts"],"sourcesContent":["import { createContext } from '@lit/context';\n\nimport type { ItemContext } from './item.context';\nimport type { VariableDeclaration } from './variables';\n\nexport interface TestContext {\n items: (ItemContext & { category?: string })[];\n testOutcomeVariables?: VariableDeclaration<string | string[] | null>[];\n}\n\nexport const INITIAL_TEST_CONTEXT: Readonly<TestContext> = { items: [], testOutcomeVariables: [] };\n\nexport const testContext = createContext<Readonly<TestContext>>(Symbol('testContext'));\n"],"mappings":";AAAA,SAAS,qBAAqB;AAUvB,IAAM,uBAA8C,EAAE,OAAO,CAAC,GAAG,sBAAsB,CAAC,EAAE;AAE1F,IAAM,cAAc,cAAqC,OAAO,aAAa,CAAC;","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/lib/exports/computed.context.ts"],"sourcesContent":["import { createContext } from '@lit/context';\n\nimport type { View } from './session.context';\nimport type { ComputedItemContext } from './computed-item.context';\n\nexport type ComputedItem = ComputedItemContext & {\n categories?: string[]; // not necessary for outside world\n type?: 'info' | 'regular';\n index?: number;\n active?: boolean;\n};\n\nexport type ComputedContext = {\n view: View;\n identifier: string;\n title: string;\n testParts: {\n active?: boolean;\n identifier: string;\n navigationMode: 'linear' | 'nonlinear';\n submissionMode: 'individual' | 'simultaneous';\n sections: {\n active?: boolean;\n identifier: string;\n title: string;\n completed?: boolean;\n items: ComputedItem[];\n }[];\n }[];\n};\n\nexport const computedContext = createContext<Readonly<ComputedContext>>(Symbol('computedContext'));\n"],"mappings":";AAAA,SAAS,qBAAqB;AA+BvB,IAAM,kBAAkB,cAAyC,OAAO,iBAAiB,CAAC;","names":[]}
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
// src/lib/decorators/watch.ts
|
|
2
|
-
function watch(propertyName, options) {
|
|
3
|
-
const resolvedOptions = {
|
|
4
|
-
waitUntilFirstUpdate: false,
|
|
5
|
-
...options
|
|
6
|
-
};
|
|
7
|
-
return (proto, decoratedFnName) => {
|
|
8
|
-
const { update } = proto;
|
|
9
|
-
const watchedProperties = Array.isArray(propertyName) ? propertyName : [propertyName];
|
|
10
|
-
proto.update = function(changedProps) {
|
|
11
|
-
watchedProperties.forEach((property) => {
|
|
12
|
-
const key = property;
|
|
13
|
-
if (changedProps.has(key)) {
|
|
14
|
-
const oldValue = changedProps.get(key);
|
|
15
|
-
const newValue = this[key];
|
|
16
|
-
if (oldValue !== newValue) {
|
|
17
|
-
if (!resolvedOptions.waitUntilFirstUpdate || this.hasUpdated) {
|
|
18
|
-
this[decoratedFnName](oldValue, newValue);
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
});
|
|
23
|
-
update.call(this, changedProps);
|
|
24
|
-
};
|
|
25
|
-
};
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
export {
|
|
29
|
-
watch
|
|
30
|
-
};
|
|
31
|
-
//# sourceMappingURL=chunk-ELDMXTUQ.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/lib/decorators/watch.ts"],"sourcesContent":["import type { LitElement } from 'lit';\n\ntype UpdateHandler = (prev?: unknown, next?: unknown) => void;\n\ntype NonUndefined<A> = A extends undefined ? never : A;\n\nexport type UpdateHandlerFunctionKeys<T extends object> = {\n [K in keyof T]-?: NonUndefined<T[K]> extends UpdateHandler ? K : never;\n}[keyof T];\n\ninterface WatchOptions {\n /**\n * If true, will only start watching after the initial update/render\n */\n waitUntilFirstUpdate?: boolean;\n}\n\n/**\n * Runs when observed properties change, e.g. @property or @state, but before the component updates. To wait for an\n * update to complete after a change occurs, use `await this.updateComplete` in the handler. To start watching after the\n * initial update/render, use `{ waitUntilFirstUpdate: true }` or `this.hasUpdated` in the handler.\n *\n * Usage:\n *\n * @watch('propName')\n * handlePropChange(oldValue, newValue) {\n * ...\n * }\n */\nexport function watch(propertyName: string | string[], options?: WatchOptions) {\n const resolvedOptions: Required<WatchOptions> = {\n waitUntilFirstUpdate: false,\n ...options\n };\n return <ElemClass extends LitElement>(\n proto: ElemClass,\n decoratedFnName: UpdateHandlerFunctionKeys<ElemClass> | any\n ) => {\n // @ts-expect-error - update is a protected property\n const { update } = proto;\n const watchedProperties = Array.isArray(propertyName) ? propertyName : [propertyName];\n\n // @ts-expect-error - update is a protected property\n proto.update = function (this: ElemClass, changedProps: Map<keyof ElemClass, ElemClass[keyof ElemClass]>) {\n watchedProperties.forEach(property => {\n const key = property as keyof ElemClass;\n if (changedProps.has(key)) {\n const oldValue = changedProps.get(key);\n const newValue = this[key];\n\n if (oldValue !== newValue) {\n if (!resolvedOptions.waitUntilFirstUpdate || this.hasUpdated) {\n (this[decoratedFnName] as unknown as UpdateHandler)(oldValue, newValue);\n }\n }\n }\n });\n\n update.call(this, changedProps);\n };\n };\n}\n"],"mappings":";AA6BO,SAAS,MAAM,cAAiC,SAAwB;AAC7E,QAAM,kBAA0C;AAAA,IAC9C,sBAAsB;AAAA,IACtB,GAAG;AAAA,EACL;AACA,SAAO,CACL,OACA,oBACG;AAEH,UAAM,EAAE,OAAO,IAAI;AACnB,UAAM,oBAAoB,MAAM,QAAQ,YAAY,IAAI,eAAe,CAAC,YAAY;AAGpF,UAAM,SAAS,SAA2B,cAAgE;AACxG,wBAAkB,QAAQ,cAAY;AACpC,cAAM,MAAM;AACZ,YAAI,aAAa,IAAI,GAAG,GAAG;AACzB,gBAAM,WAAW,aAAa,IAAI,GAAG;AACrC,gBAAM,WAAW,KAAK,GAAG;AAEzB,cAAI,aAAa,UAAU;AACzB,gBAAI,CAAC,gBAAgB,wBAAwB,KAAK,YAAY;AAC5D,cAAC,KAAK,eAAe,EAA+B,UAAU,QAAQ;AAAA,YACxE;AAAA,UACF;AAAA,QACF;AAAA,MACF,CAAC;AAED,aAAO,KAAK,MAAM,YAAY;AAAA,IAChC;AAAA,EACF;AACF;","names":[]}
|
|
@@ -1,146 +0,0 @@
|
|
|
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
|
|
@@ -1 +0,0 @@
|
|
|
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":[]}
|
|
@@ -1 +0,0 @@
|
|
|
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":[]}
|
|
@@ -1,22 +0,0 @@
|
|
|
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
|
|
@@ -1 +0,0 @@
|
|
|
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 +0,0 @@
|
|
|
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":[]}
|
|
@@ -1,206 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
itemContext
|
|
3
|
-
} from "./chunk-NJNQOQUU.js";
|
|
4
|
-
import {
|
|
5
|
-
configContext
|
|
6
|
-
} from "./chunk-BHJSX3Q6.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
|
-
const showFullCorrectResponse = show && (this?.configContext?.fullCorrectResponseOnlyWhenIncorrect === false || this.correctness !== "correct" /* Correct */);
|
|
79
|
-
if (!showFullCorrectResponse) {
|
|
80
|
-
if (!nextSiblingIsFullCorrectResponse) {
|
|
81
|
-
return;
|
|
82
|
-
}
|
|
83
|
-
this.parentElement?.removeChild(nextSibling);
|
|
84
|
-
}
|
|
85
|
-
if (nextSiblingIsFullCorrectResponse) {
|
|
86
|
-
return;
|
|
87
|
-
}
|
|
88
|
-
const clone = this.cloneNode(true);
|
|
89
|
-
const containerDiv = document.createElement("div");
|
|
90
|
-
containerDiv.classList.add("full-correct-response");
|
|
91
|
-
if (this.isInline) {
|
|
92
|
-
containerDiv.classList.add("full-correct-response-inline");
|
|
93
|
-
} else {
|
|
94
|
-
containerDiv.classList.add("full-correct-response-block");
|
|
95
|
-
}
|
|
96
|
-
containerDiv.role = "full-correct-response";
|
|
97
|
-
containerDiv.appendChild(clone);
|
|
98
|
-
clone.isFullCorrectResponse = true;
|
|
99
|
-
this.parentElement?.insertBefore(containerDiv, this.nextSibling);
|
|
100
|
-
await clone.updateComplete;
|
|
101
|
-
clone.response = Array.isArray(responseVariable.correctResponse) ? [...responseVariable.correctResponse] : responseVariable.correctResponse;
|
|
102
|
-
}
|
|
103
|
-
toggleInternalCorrectResponse(show) {
|
|
104
|
-
const responseVariable = this.responseVariable;
|
|
105
|
-
this.correctResponse = show ? responseVariable?.correctResponse : responseVariable?.cardinality === "single" ? "" : [];
|
|
106
|
-
}
|
|
107
|
-
toggleCandidateCorrection(show) {
|
|
108
|
-
const responseVariable = this.responseVariable;
|
|
109
|
-
if (!responseVariable) return;
|
|
110
|
-
this._internals.states.delete("candidate-correct");
|
|
111
|
-
this._internals.states.delete("candidate-partially-correct");
|
|
112
|
-
this._internals.states.delete("candidate-incorrect");
|
|
113
|
-
if (!show) {
|
|
114
|
-
return;
|
|
115
|
-
}
|
|
116
|
-
if (this.correctness === "correct" /* Correct */) {
|
|
117
|
-
this._internals.states.add("candidate-correct");
|
|
118
|
-
}
|
|
119
|
-
if (this.correctness === "partially-correct" /* PartiallyCorrect */) {
|
|
120
|
-
this._internals.states.add("candidate-partially-correct");
|
|
121
|
-
}
|
|
122
|
-
if (this.correctness === "incorrect" /* Incorrect */) {
|
|
123
|
-
this._internals.states.add("candidate-incorrect");
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
get value() {
|
|
127
|
-
return JSON.stringify(this.response);
|
|
128
|
-
}
|
|
129
|
-
set value(val) {
|
|
130
|
-
this.response = val ? JSON.parse(val) : null;
|
|
131
|
-
}
|
|
132
|
-
reportValidity() {
|
|
133
|
-
return this._internals.reportValidity();
|
|
134
|
-
}
|
|
135
|
-
reset() {
|
|
136
|
-
this.response = null;
|
|
137
|
-
}
|
|
138
|
-
// attributeChangedCallback(name: string, _old: string | null, value: string | null): void {
|
|
139
|
-
// super.attributeChangedCallback(name, _old, value);
|
|
140
|
-
// // changing attributes in lit is not a thing, they are defined in the QTI XML and will never change
|
|
141
|
-
// // except in storybook where we can change the value of the attribute
|
|
142
|
-
// // this can make the internal state out of sync with the attribute
|
|
143
|
-
// // so we reset the value to null to force the internal state to be reset
|
|
144
|
-
// const attributeNamesToExclude = ['style', 'class'];
|
|
145
|
-
// if (!attributeNamesToExclude.includes(name)) {
|
|
146
|
-
// this.reset();
|
|
147
|
-
// }
|
|
148
|
-
// }
|
|
149
|
-
connectedCallback() {
|
|
150
|
-
super.connectedCallback();
|
|
151
|
-
if (this.isFullCorrectResponse) {
|
|
152
|
-
return;
|
|
153
|
-
}
|
|
154
|
-
this.dispatchEvent(
|
|
155
|
-
new CustomEvent("qti-register-interaction", {
|
|
156
|
-
bubbles: true,
|
|
157
|
-
composed: true,
|
|
158
|
-
cancelable: false,
|
|
159
|
-
detail: {
|
|
160
|
-
interactionElement: this,
|
|
161
|
-
responseIdentifier: this.responseIdentifier
|
|
162
|
-
}
|
|
163
|
-
})
|
|
164
|
-
);
|
|
165
|
-
}
|
|
166
|
-
saveResponse(value) {
|
|
167
|
-
this.dispatchEvent(
|
|
168
|
-
new CustomEvent("qti-interaction-response", {
|
|
169
|
-
bubbles: true,
|
|
170
|
-
composed: true,
|
|
171
|
-
cancelable: false,
|
|
172
|
-
detail: {
|
|
173
|
-
responseIdentifier: this.responseIdentifier,
|
|
174
|
-
response: Array.isArray(value) ? [...value] : value
|
|
175
|
-
}
|
|
176
|
-
})
|
|
177
|
-
);
|
|
178
|
-
}
|
|
179
|
-
};
|
|
180
|
-
__decorateClass([
|
|
181
|
-
consume({ context: itemContext, subscribe: true })
|
|
182
|
-
], Interaction.prototype, "_context", 2);
|
|
183
|
-
__decorateClass([
|
|
184
|
-
consume({ context: configContext, subscribe: true })
|
|
185
|
-
], Interaction.prototype, "configContext", 2);
|
|
186
|
-
__decorateClass([
|
|
187
|
-
property({ type: String, attribute: "response-identifier" })
|
|
188
|
-
], Interaction.prototype, "responseIdentifier", 2);
|
|
189
|
-
__decorateClass([
|
|
190
|
-
property({ reflect: true, type: Boolean })
|
|
191
|
-
], Interaction.prototype, "disabled", 2);
|
|
192
|
-
__decorateClass([
|
|
193
|
-
property({ reflect: true, type: Boolean })
|
|
194
|
-
], Interaction.prototype, "readonly", 2);
|
|
195
|
-
__decorateClass([
|
|
196
|
-
state()
|
|
197
|
-
], Interaction.prototype, "_isFullCorrectResponse", 2);
|
|
198
|
-
__decorateClass([
|
|
199
|
-
state()
|
|
200
|
-
], Interaction.prototype, "_correctResponse", 2);
|
|
201
|
-
|
|
202
|
-
export {
|
|
203
|
-
Correctness,
|
|
204
|
-
Interaction
|
|
205
|
-
};
|
|
206
|
-
//# sourceMappingURL=chunk-P4QBOVQ2.js.map
|
|
@@ -1 +0,0 @@
|
|
|
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 const showFullCorrectResponse = show && (this?.configContext?.fullCorrectResponseOnlyWhenIncorrect === false || this.correctness !== Correctness.Correct)\n\n if (!showFullCorrectResponse) {\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\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"]}
|