@citolab/qti-components 7.24.0 → 7.26.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 +147 -95
- package/custom-elements.json +132 -9
- package/dist/{chunk-4A7ZMQKU.js → chunk-DUBGJJ75.js} +25 -2
- package/dist/chunk-DUBGJJ75.js.map +1 -0
- package/dist/{chunk-2X7747Q4.js → chunk-I4NHZ6D6.js} +87 -8
- package/dist/chunk-I4NHZ6D6.js.map +1 -0
- package/dist/{chunk-ES2FREAP.js → chunk-LPVYU726.js} +2 -2
- package/dist/{chunk-53QVHUUQ.js → chunk-RKXUA6D6.js} +3 -7
- package/dist/{chunk-53QVHUUQ.js.map → chunk-RKXUA6D6.js.map} +1 -1
- package/dist/elements.js +1 -1
- package/dist/index.js +4 -4
- package/dist/interactions.js +1 -1
- package/dist/processing.d.ts +0 -2
- package/dist/processing.js +1 -1
- package/dist/test.js +2 -2
- package/package.json +18 -18
- package/LICENSE.md +0 -674
- package/dist/chunk-2X7747Q4.js.map +0 -1
- package/dist/chunk-4A7ZMQKU.js.map +0 -1
- /package/dist/{chunk-ES2FREAP.js.map → chunk-LPVYU726.js.map} +0 -0
package/custom-elements.json
CHANGED
|
@@ -1523,6 +1523,16 @@
|
|
|
1523
1523
|
"name": "#removeEventListeners",
|
|
1524
1524
|
"privacy": "private"
|
|
1525
1525
|
},
|
|
1526
|
+
{
|
|
1527
|
+
"kind": "method",
|
|
1528
|
+
"name": "#resetOutcomeVariablesBeforeResponseProcessing",
|
|
1529
|
+
"privacy": "private",
|
|
1530
|
+
"return": {
|
|
1531
|
+
"type": {
|
|
1532
|
+
"text": "void"
|
|
1533
|
+
}
|
|
1534
|
+
}
|
|
1535
|
+
},
|
|
1526
1536
|
{
|
|
1527
1537
|
"kind": "field",
|
|
1528
1538
|
"name": "#templateProcessing",
|
|
@@ -22731,6 +22741,16 @@
|
|
|
22731
22741
|
},
|
|
22732
22742
|
"description": "Parse the require shim JSON string into an object"
|
|
22733
22743
|
},
|
|
22744
|
+
{
|
|
22745
|
+
"kind": "method",
|
|
22746
|
+
"name": "#hasNonEmptyResponse",
|
|
22747
|
+
"privacy": "private",
|
|
22748
|
+
"return": {
|
|
22749
|
+
"type": {
|
|
22750
|
+
"text": "boolean"
|
|
22751
|
+
}
|
|
22752
|
+
}
|
|
22753
|
+
},
|
|
22734
22754
|
{
|
|
22735
22755
|
"kind": "method",
|
|
22736
22756
|
"name": "#initializeInteraction",
|
|
@@ -22755,6 +22775,24 @@
|
|
|
22755
22775
|
},
|
|
22756
22776
|
"default": "null"
|
|
22757
22777
|
},
|
|
22778
|
+
{
|
|
22779
|
+
"kind": "field",
|
|
22780
|
+
"name": "#pciCustomValidityMessage",
|
|
22781
|
+
"privacy": "private",
|
|
22782
|
+
"type": {
|
|
22783
|
+
"text": "string"
|
|
22784
|
+
},
|
|
22785
|
+
"default": "''"
|
|
22786
|
+
},
|
|
22787
|
+
{
|
|
22788
|
+
"kind": "field",
|
|
22789
|
+
"name": "#pciValidity",
|
|
22790
|
+
"privacy": "private",
|
|
22791
|
+
"type": {
|
|
22792
|
+
"text": "boolean | null"
|
|
22793
|
+
},
|
|
22794
|
+
"default": "null"
|
|
22795
|
+
},
|
|
22758
22796
|
{
|
|
22759
22797
|
"kind": "field",
|
|
22760
22798
|
"name": "#previousState",
|
|
@@ -22776,6 +22814,31 @@
|
|
|
22776
22814
|
"privacy": "private",
|
|
22777
22815
|
"description": "IFRAME MODE: Send initialization data to iframe"
|
|
22778
22816
|
},
|
|
22817
|
+
{
|
|
22818
|
+
"kind": "method",
|
|
22819
|
+
"name": "#setInteractionValidity",
|
|
22820
|
+
"privacy": "private",
|
|
22821
|
+
"return": {
|
|
22822
|
+
"type": {
|
|
22823
|
+
"text": "void"
|
|
22824
|
+
}
|
|
22825
|
+
},
|
|
22826
|
+
"parameters": [
|
|
22827
|
+
{
|
|
22828
|
+
"name": "isValid",
|
|
22829
|
+
"type": {
|
|
22830
|
+
"text": "boolean"
|
|
22831
|
+
}
|
|
22832
|
+
},
|
|
22833
|
+
{
|
|
22834
|
+
"name": "customMessage",
|
|
22835
|
+
"optional": true,
|
|
22836
|
+
"type": {
|
|
22837
|
+
"text": "string"
|
|
22838
|
+
}
|
|
22839
|
+
}
|
|
22840
|
+
]
|
|
22841
|
+
},
|
|
22779
22842
|
{
|
|
22780
22843
|
"kind": "method",
|
|
22781
22844
|
"name": "#unescapeDataAttributes",
|
|
@@ -24137,6 +24200,20 @@
|
|
|
24137
24200
|
"module": "packages/qti-interactions/src/components/qti-portable-custom-interaction/qti-portable-custom-interaction.ts"
|
|
24138
24201
|
}
|
|
24139
24202
|
},
|
|
24203
|
+
{
|
|
24204
|
+
"kind": "method",
|
|
24205
|
+
"name": "#hasNonEmptyResponse",
|
|
24206
|
+
"privacy": "private",
|
|
24207
|
+
"return": {
|
|
24208
|
+
"type": {
|
|
24209
|
+
"text": "boolean"
|
|
24210
|
+
}
|
|
24211
|
+
},
|
|
24212
|
+
"inheritedFrom": {
|
|
24213
|
+
"name": "QtiPortableCustomInteraction",
|
|
24214
|
+
"module": "packages/qti-interactions/src/components/qti-portable-custom-interaction/qti-portable-custom-interaction.ts"
|
|
24215
|
+
}
|
|
24216
|
+
},
|
|
24140
24217
|
{
|
|
24141
24218
|
"kind": "method",
|
|
24142
24219
|
"name": "#initializeInteraction",
|
|
@@ -24173,6 +24250,32 @@
|
|
|
24173
24250
|
"module": "packages/qti-interactions/src/components/qti-portable-custom-interaction/qti-portable-custom-interaction.ts"
|
|
24174
24251
|
}
|
|
24175
24252
|
},
|
|
24253
|
+
{
|
|
24254
|
+
"kind": "field",
|
|
24255
|
+
"name": "#pciCustomValidityMessage",
|
|
24256
|
+
"privacy": "private",
|
|
24257
|
+
"type": {
|
|
24258
|
+
"text": "string"
|
|
24259
|
+
},
|
|
24260
|
+
"default": "''",
|
|
24261
|
+
"inheritedFrom": {
|
|
24262
|
+
"name": "QtiPortableCustomInteraction",
|
|
24263
|
+
"module": "packages/qti-interactions/src/components/qti-portable-custom-interaction/qti-portable-custom-interaction.ts"
|
|
24264
|
+
}
|
|
24265
|
+
},
|
|
24266
|
+
{
|
|
24267
|
+
"kind": "field",
|
|
24268
|
+
"name": "#pciValidity",
|
|
24269
|
+
"privacy": "private",
|
|
24270
|
+
"type": {
|
|
24271
|
+
"text": "boolean | null"
|
|
24272
|
+
},
|
|
24273
|
+
"default": "null",
|
|
24274
|
+
"inheritedFrom": {
|
|
24275
|
+
"name": "QtiPortableCustomInteraction",
|
|
24276
|
+
"module": "packages/qti-interactions/src/components/qti-portable-custom-interaction/qti-portable-custom-interaction.ts"
|
|
24277
|
+
}
|
|
24278
|
+
},
|
|
24176
24279
|
{
|
|
24177
24280
|
"kind": "field",
|
|
24178
24281
|
"name": "#previousState",
|
|
@@ -24215,6 +24318,35 @@
|
|
|
24215
24318
|
"module": "packages/qti-interactions/src/components/qti-portable-custom-interaction/qti-portable-custom-interaction.ts"
|
|
24216
24319
|
}
|
|
24217
24320
|
},
|
|
24321
|
+
{
|
|
24322
|
+
"kind": "method",
|
|
24323
|
+
"name": "#setInteractionValidity",
|
|
24324
|
+
"privacy": "private",
|
|
24325
|
+
"return": {
|
|
24326
|
+
"type": {
|
|
24327
|
+
"text": "void"
|
|
24328
|
+
}
|
|
24329
|
+
},
|
|
24330
|
+
"parameters": [
|
|
24331
|
+
{
|
|
24332
|
+
"name": "isValid",
|
|
24333
|
+
"type": {
|
|
24334
|
+
"text": "boolean"
|
|
24335
|
+
}
|
|
24336
|
+
},
|
|
24337
|
+
{
|
|
24338
|
+
"name": "customMessage",
|
|
24339
|
+
"optional": true,
|
|
24340
|
+
"type": {
|
|
24341
|
+
"text": "string"
|
|
24342
|
+
}
|
|
24343
|
+
}
|
|
24344
|
+
],
|
|
24345
|
+
"inheritedFrom": {
|
|
24346
|
+
"name": "QtiPortableCustomInteraction",
|
|
24347
|
+
"module": "packages/qti-interactions/src/components/qti-portable-custom-interaction/qti-portable-custom-interaction.ts"
|
|
24348
|
+
}
|
|
24349
|
+
},
|
|
24218
24350
|
{
|
|
24219
24351
|
"kind": "method",
|
|
24220
24352
|
"name": "#unescapeDataAttributes",
|
|
@@ -37526,15 +37658,6 @@
|
|
|
37526
37658
|
"description": "",
|
|
37527
37659
|
"name": "QtiSum",
|
|
37528
37660
|
"members": [
|
|
37529
|
-
{
|
|
37530
|
-
"kind": "field",
|
|
37531
|
-
"name": "#expression",
|
|
37532
|
-
"privacy": "private",
|
|
37533
|
-
"type": {
|
|
37534
|
-
"text": "QtiSumExpression"
|
|
37535
|
-
},
|
|
37536
|
-
"default": "new QtiSumExpression(Array.from(this.children as unknown as QtiExpressionBase<number>[]))"
|
|
37537
|
-
},
|
|
37538
37661
|
{
|
|
37539
37662
|
"kind": "method",
|
|
37540
37663
|
"name": "calculate",
|
|
@@ -28,7 +28,7 @@ import {
|
|
|
28
28
|
} from "./chunk-QXBXORM3.js";
|
|
29
29
|
|
|
30
30
|
// ../qti-elements/src/components/qti-assessment-item/qti-assessment-item.ts
|
|
31
|
-
var _itemTitle, _templateProcessing, _initialContext, _feedbackElements, _interactionElements, _QtiAssessmentItem_instances, attachEventListeners_fn, removeEventListeners_fn, _handleRegisterVariable, _handleRegisterFeedback, _handleRegisterInteraction, _handleEndAttempt, _handleSetOutcomeValue, _handleUpdateResponseVariable, processTemplates_fn, getCompletionStatus_fn;
|
|
31
|
+
var _itemTitle, _templateProcessing, _initialContext, _feedbackElements, _interactionElements, _QtiAssessmentItem_instances, attachEventListeners_fn, removeEventListeners_fn, _handleRegisterVariable, _handleRegisterFeedback, _handleRegisterInteraction, _handleEndAttempt, _handleSetOutcomeValue, _handleUpdateResponseVariable, processTemplates_fn, getCompletionStatus_fn, resetOutcomeVariablesBeforeResponseProcessing_fn;
|
|
32
32
|
var QtiAssessmentItem = class extends i2 {
|
|
33
33
|
constructor() {
|
|
34
34
|
super(...arguments);
|
|
@@ -244,6 +244,9 @@ var QtiAssessmentItem = class extends i2 {
|
|
|
244
244
|
(+this._context.variables.find((v) => v.identifier === "numAttempts")?.value + 1).toString()
|
|
245
245
|
);
|
|
246
246
|
}
|
|
247
|
+
if (this.adaptive === "false") {
|
|
248
|
+
__privateMethod(this, _QtiAssessmentItem_instances, resetOutcomeVariablesBeforeResponseProcessing_fn).call(this);
|
|
249
|
+
}
|
|
247
250
|
const responseProcessor = this.querySelector("qti-response-processing");
|
|
248
251
|
const canProcess = !!(responseProcessor && typeof responseProcessor.process === "function");
|
|
249
252
|
if (canProcess) {
|
|
@@ -411,6 +414,26 @@ getCompletionStatus_fn = function() {
|
|
|
411
414
|
if (valid === false) return "incomplete";
|
|
412
415
|
return "not_attempted";
|
|
413
416
|
};
|
|
417
|
+
resetOutcomeVariablesBeforeResponseProcessing_fn = function() {
|
|
418
|
+
this._context = {
|
|
419
|
+
...this._context,
|
|
420
|
+
variables: this._context.variables.map((variable) => {
|
|
421
|
+
if (variable.type !== "outcome") {
|
|
422
|
+
return variable;
|
|
423
|
+
}
|
|
424
|
+
const hasDefaultValue = "defaultValue" in variable;
|
|
425
|
+
const declaredDefault = hasDefaultValue ? variable.defaultValue : null;
|
|
426
|
+
let value = declaredDefault ?? null;
|
|
427
|
+
if ((value === null || value === void 0) && (variable.baseType === "integer" || variable.baseType === "float")) {
|
|
428
|
+
value = "0";
|
|
429
|
+
}
|
|
430
|
+
return {
|
|
431
|
+
...variable,
|
|
432
|
+
value
|
|
433
|
+
};
|
|
434
|
+
})
|
|
435
|
+
};
|
|
436
|
+
};
|
|
414
437
|
__decorateClass([
|
|
415
438
|
n({ type: String })
|
|
416
439
|
], QtiAssessmentItem.prototype, "identifier", 2);
|
|
@@ -1322,4 +1345,4 @@ export {
|
|
|
1322
1345
|
QtiTemplateDeclaration,
|
|
1323
1346
|
QtiContextDeclaration
|
|
1324
1347
|
};
|
|
1325
|
-
//# sourceMappingURL=chunk-
|
|
1348
|
+
//# sourceMappingURL=chunk-DUBGJJ75.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../qti-elements/src/components/qti-assessment-item/qti-assessment-item.ts","../../qti-elements/src/components/qti-assessment-stimulus-ref/qti-assessment-stimulus-ref.ts","../../qti-elements/src/components/qti-companion-materials-info/qti-companion-materials-info.ts","../../qti-elements/src/components/qti-custom-operator/qti-custom-operator.ts","../../qti-elements/src/components/qti-feedback-block/qti-feedback-block.ts","../../qti-elements/src/components/qti-feedback-inline/qti-feedback-inline.ts","../../qti-elements/src/components/qti-modal-feedback/qti-modal-feedback.ts","../../qti-elements/src/components/qti-item-body/qti-item-body.styles.ts","../../qti-elements/src/components/qti-item-body/qti-item-body.ts","../../qti-elements/src/components/qti-content-body/qti-content-body.ts","../../qti-elements/src/components/qti-rubric-block/qti-rubric-block.ts","../../qti-elements/src/components/qti-stylesheet/qti-stylesheet.ts","../../qti-elements/src/components/qti-response-declaration/qti-response-declaration.ts","../../qti-elements/src/components/qti-outcome-declaration/qti-outcome-declaration.ts","../../qti-elements/src/internal/template-strings.ts","../../qti-elements/src/components/qti-response-processing/qti-response-processing.ts","../../qti-elements/src/components/qti-template-declaration/qti-template-declaration.ts","../../qti-elements/src/components/qti-context-declaration/qti-context-declaration.ts"],"sourcesContent":["import { provide } from '@lit/context';\nimport { LitElement, html } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\n\nimport { itemContext, itemContextVariables } from '@qti-components/base';\nimport { watch } from '@qti-components/utilities';\n\nimport type { QtiTemplateProcessing } from '../qti-template-processing/qti-template-processing.js';\nimport type { InteractionChangedDetails, OutcomeChangedDetails } from '../../internal/event-types.ts';\nimport type { QtiFeedback, ResponseInteraction } from '@qti-components/base';\nimport type { VariableDeclaration, VariableValue } from '@qti-components/base';\nimport type { OutcomeVariable, ResponseVariable } from '@qti-components/base';\nimport type { QtiResponseProcessing } from '../qti-response-processing/qti-response-processing.ts';\nimport type QtiRegisterVariable from '../../internal/events/qti-register-variable.ts';\nimport type { ItemContext } from '@qti-components/base';\nimport type { Interaction } from '@qti-components/base';\n// import type { ItemShowCandidateCorrection } from '../../qti-item/components/item-show-candidate-correction.ts';\n// import type { ItemShowCorrectResponse } from '../../qti-item/components/item-show-correct-response.ts';\n\n/**\n * @summary The qti-assessment-item element contains all the other QTI 3 item structures.\n * @documentation https://www.imsglobal.org/spec/qti/v3p0/impl#h.dltnnj87l0yj\n *\n * @dependency qti-feedback\n * @dependency qti-responseprocessing\n *\n * @event qti-item-context-updated - Emitted when through a user action the itemContext is updated,\n * typically on interaction with the interactions, or calling response processing.\n */\n@customElement('qti-assessment-item')\nexport class QtiAssessmentItem extends LitElement {\n #itemTitle: string | undefined;\n #templateProcessing: QtiTemplateProcessing | null = null;\n\n @property({ type: String }) identifier: string = '';\n @property({ type: String }) adaptive: 'true' | 'false' = 'false';\n @property({ type: String }) timeDependent: 'true' | 'false' | null = null;\n\n @property({ type: String })\n override get title(): string {\n return this.#itemTitle;\n }\n override set title(value: string) {\n this.#itemTitle = value;\n this.removeAttribute('title');\n this.setAttribute('data-title', value);\n }\n\n @property({ type: Boolean }) disabled: boolean;\n @watch('disabled', { waitUntilFirstUpdate: true })\n protected _handleDisabledChange = (_: boolean, disabled: boolean) => {\n this.#interactionElements.forEach(ch => (ch.disabled = disabled));\n };\n\n @property({ type: Boolean }) readonly: boolean;\n @watch('readonly', { waitUntilFirstUpdate: true })\n protected _handleReadonlyChange = (_: boolean, readonly: boolean) =>\n this.#interactionElements.forEach(ch => (ch.readonly = readonly));\n\n @provide({ context: itemContext })\n private _context: ItemContext = {\n variables: itemContextVariables\n };\n\n /**\n * Sets the identifier for the assessment item reference if this item is in a test.\n *\n * @param identifier - The identifier for the assessment item reference.\n */\n public set assessmentItemRefId(identifier: string) {\n this._context = { ...this._context, identifier };\n }\n\n public get assessmentItemRefId(): string {\n return this._context.identifier;\n }\n\n public get variables(): VariableValue<string | string[] | null>[] {\n return this._context.variables.map(v => ({\n identifier: v.identifier,\n value: v.value,\n type: v.type,\n // add externalscored, a fixed prop to the test, so the testcontext can read and decide how to score this item\n ...(v.type === 'outcome' && v.identifier === 'SCORE'\n ? { externalScored: (v as OutcomeVariable).externalScored }\n : {})\n }));\n }\n\n public set variables(value: VariableValue<string | string[] | null>[]) {\n if (!Array.isArray(value) || value.some(v => !('identifier' in v))) {\n console.warn('variables property should be an array of VariableDeclaration');\n return;\n }\n this._context = {\n ...this._context,\n variables: this._context.variables.map(variable => {\n const matchingValue = value.find(v => v.identifier === variable.identifier);\n if (matchingValue) {\n return {\n ...variable,\n ...matchingValue,\n interpolationTable: (variable as OutcomeVariable).interpolationTable\n };\n }\n return variable;\n })\n };\n\n this._context.variables.forEach(variable => {\n if (variable.type === 'response') {\n const interactionElement = this.#interactionElements.find(\n (el: Interaction) => el.responseIdentifier === variable.identifier\n );\n if (interactionElement) {\n interactionElement.response = variable.value as string | string[];\n }\n }\n });\n\n this.variables.forEach(variable => {\n if (variable.type === 'outcome') {\n this.#feedbackElements.forEach(fe => fe.checkShowFeedback(variable.identifier));\n }\n });\n }\n\n public get state(): ItemContext['state'] {\n return this._context.state;\n }\n\n public set state(value: ItemContext['state']) {\n this._context = {\n ...this._context,\n state: value ? { ...value } : undefined\n };\n }\n\n #initialContext: Readonly<ItemContext> = { ...this._context, variables: this._context.variables };\n #feedbackElements: QtiFeedback[] = [];\n #interactionElements: Interaction[] = [];\n\n /** @deprecated use variables property instead */\n set responses(myResponses: ResponseInteraction[]) {\n if (myResponses) {\n for (const response of myResponses) {\n const responseVariable = this.getResponse(response.responseIdentifier);\n if (responseVariable) {\n this.updateResponseVariable(response.responseIdentifier, response.response);\n }\n\n const interaction: Interaction | undefined = this.#interactionElements.find(\n i => i.getAttribute('response-identifier') === response.responseIdentifier\n );\n if (interaction) {\n interaction.response = response.response;\n }\n }\n }\n }\n\n override render() {\n return html`<slot></slot>`;\n }\n\n override connectedCallback(): void {\n this.#attachEventListeners();\n super.connectedCallback();\n this.updateComplete.then(() => {\n this.dispatchEvent(\n new CustomEvent<QtiAssessmentItem>('qti-assessment-item-connected', {\n bubbles: true,\n composed: true,\n detail: this\n })\n );\n this.#processTemplates();\n });\n }\n\n override disconnectedCallback(): void {\n this.#removeEventListeners();\n super.disconnectedCallback();\n }\n\n #attachEventListeners() {\n this.addEventListener('qti-register-variable', this.#handleRegisterVariable);\n this.addEventListener('qti-register-feedback', this.#handleRegisterFeedback);\n this.addEventListener('qti-register-interaction', this.#handleRegisterInteraction);\n this.addEventListener('end-attempt', this.#handleEndAttempt);\n this.addEventListener('qti-set-outcome-value', this.#handleSetOutcomeValue);\n this.addEventListener('qti-interaction-response', this.#handleUpdateResponseVariable);\n }\n\n #removeEventListeners() {\n this.removeEventListener('qti-register-variable', this.#handleRegisterVariable);\n this.removeEventListener('qti-register-feedback', this.#handleRegisterFeedback);\n this.removeEventListener('qti-register-interaction', this.#handleRegisterInteraction);\n this.removeEventListener('end-attempt', this.#handleEndAttempt);\n this.removeEventListener('qti-set-outcome-value', this.#handleSetOutcomeValue);\n this.removeEventListener('qti-interaction-response', this.#handleUpdateResponseVariable);\n }\n\n #handleRegisterVariable = (e: QtiRegisterVariable) => {\n e.stopImmediatePropagation();\n this._context = { ...this._context, variables: [...this._context.variables, e.detail.variable] };\n this.#initialContext = this._context;\n e.stopPropagation();\n };\n\n #handleRegisterFeedback = (e: CustomEvent<QtiFeedback>) => {\n e.stopImmediatePropagation();\n const feedbackElement = e.detail;\n this.#feedbackElements.push(feedbackElement);\n const numAttempts = Number(this._context.variables.find(v => v.identifier === 'numAttempts')?.value) || 0;\n if (numAttempts > 0) {\n feedbackElement.checkShowFeedback(feedbackElement.outcomeIdentifier);\n }\n };\n\n #handleRegisterInteraction = (e: CustomEvent<{ interaction: string; interactionElement: Interaction }>) => {\n e.stopImmediatePropagation();\n this.#interactionElements.push(e.detail.interactionElement);\n };\n\n #handleEndAttempt = (e: CustomEvent<{ responseIdentifier: string; countAttempt: boolean }>) => {\n e.stopImmediatePropagation();\n const { responseIdentifier, countAttempt } = e.detail;\n this.validate();\n this.updateResponseVariable(responseIdentifier, 'true');\n this.processResponse(countAttempt);\n };\n\n #handleSetOutcomeValue = (e: CustomEvent<{ outcomeIdentifier: string; value: string | string[] }>) => {\n e.stopImmediatePropagation();\n const { outcomeIdentifier, value } = e.detail;\n this.updateOutcomeVariable(outcomeIdentifier, value);\n e.stopPropagation();\n };\n\n #handleUpdateResponseVariable = (e: CustomEvent<ResponseInteraction>) => {\n e.stopImmediatePropagation();\n\n const { responseIdentifier, response, state } = e.detail;\n this.updateResponseVariable(responseIdentifier, response);\n if (state !== undefined) {\n this._context = {\n ...this._context,\n state: {\n ...(this._context.state || {}),\n [responseIdentifier]: state\n }\n };\n }\n\n this.dispatchEvent(\n new CustomEvent<{ itemContext: ItemContext }>('qti-item-context-updated', {\n bubbles: true,\n composed: true,\n detail: { itemContext: this._context }\n })\n );\n };\n\n /**\n * Toggles the display of correct responses for all interactions.\n * @param show - A boolean indicating whether to show or hide correct responses.\n */\n public showCorrectResponse(show: boolean): void {\n // Iterate through all interaction elements\n for (const interaction of this.#interactionElements) {\n interaction.toggleCorrectResponse(show);\n }\n\n // Update one or more toggle component states // ItemShowCorrectResponse\n document.querySelectorAll('item-show-correct-response').forEach((el: HTMLElement & { shown: boolean }) => {\n el.shown = show;\n });\n }\n\n /**\n * Toggles the display of the candidate correction for all interactions.\n * @param show - A boolean indicating whether to show or hide candidate correction.\n */\n public showCandidateCorrection(show: boolean): void {\n // Iterate through all interaction elements\n for (const interaction of this.#interactionElements) {\n interaction.toggleCandidateCorrection(show);\n }\n\n // Update one or more toggle component states // ItemShowCandidateCorrection\n document.querySelectorAll('item-show-candidate-correction').forEach((el: HTMLElement & { shown: boolean }) => {\n el.shown = show;\n });\n }\n\n #processTemplates(): void {\n this.#templateProcessing = this.querySelector<QtiTemplateProcessing>('qti-template-processing');\n if (this.#templateProcessing) {\n // Run template processing before first presentation\n this.#templateProcessing.process();\n }\n }\n\n public processResponse(countNumAttempts = true, reportValidityAfterScoring = true): boolean {\n this.validate(reportValidityAfterScoring);\n\n if (countNumAttempts) {\n this.updateOutcomeVariable(\n 'numAttempts',\n (+this._context.variables.find(v => v.identifier === 'numAttempts')?.value + 1).toString()\n );\n }\n\n if (this.adaptive === 'false') {\n this.#resetOutcomeVariablesBeforeResponseProcessing();\n }\n\n const responseProcessor = this.querySelector<QtiResponseProcessing>('qti-response-processing');\n const canProcess = !!(responseProcessor && typeof responseProcessor.process === 'function');\n if (canProcess) {\n responseProcessor.process();\n }\n if (this.adaptive === 'false') {\n // if adaptive, completionStatus is set by the processing template\n this.updateOutcomeVariable('completionStatus', this.#getCompletionStatus());\n }\n\n this.dispatchEvent(\n new CustomEvent<{ itemContext: ItemContext }>('qti-item-context-updated', {\n bubbles: true,\n composed: true,\n detail: { itemContext: this._context }\n })\n );\n\n return canProcess;\n }\n\n public resetResponses() {\n this._context = this.#initialContext;\n }\n\n protected getResponse(identifier: string): Readonly<ResponseVariable> {\n return this.getVariable(identifier) as ResponseVariable;\n }\n\n public getOutcome(identifier: string): Readonly<OutcomeVariable> {\n return this.getVariable(identifier) as OutcomeVariable;\n }\n\n protected getVariable(identifier: string): Readonly<VariableDeclaration<string | string[] | null>> {\n return this._context.variables.find(v => v.identifier === identifier) || null;\n }\n\n // saving privates here: ------------------------------------------------------------------------------\n\n /**\n * Updates the response variable with the specified identifier to the given value.\n *\n * @protected\n *\n * This method is intended for internal use within the class and subclasses.\n * It should not be called externally by third parties.\n *\n * @param identifier - The identifier of the response variable to update.\n * @param value - The new value for the response variable.\n */\n public updateResponseVariable(identifier: string, value: string | string[] | undefined) {\n this._context = {\n ...this._context,\n variables: this._context.variables.map(v => (v.identifier !== identifier ? v : { ...v, value: value }))\n };\n\n // Turn off candidate correction after change of response variable\n this.showCandidateCorrection(false);\n\n this.dispatchEvent(\n new CustomEvent<InteractionChangedDetails>('qti-interaction-changed', {\n bubbles: true,\n composed: true,\n detail: {\n item: this.identifier,\n responseIdentifier: identifier,\n response: Array.isArray(value) ? [...value] : value\n }\n })\n );\n\n if (this.adaptive === 'false') {\n // if adaptive, completionStatus is set by the processing template\n this.updateOutcomeVariable('completionStatus', this.#getCompletionStatus());\n }\n }\n\n public setOutcomeVariable(identifier: string, value: string | string[] | undefined) {\n this.updateOutcomeVariable(identifier, value);\n this.dispatchEvent(\n new CustomEvent<{ itemContext: ItemContext }>('qti-item-context-updated', {\n bubbles: true,\n composed: true,\n detail: { itemContext: this._context }\n })\n );\n }\n\n /**\n * Updates the outcome variable with the specified identifier to the given value.\n *\n * @protected\n *\n * This method is intended for internal use within the class and subclasses.\n * It should not be called externally by third parties.\n *\n * @param identifier - The identifier of the response variable to update.\n * @param value - The new value for the response variable.\n */\n public updateOutcomeVariable(identifier: string, value: string | string[] | undefined) {\n const outcomeVariable = this.getOutcome(identifier);\n\n if (!outcomeVariable) {\n console.warn(`Can not set qti-outcome-identifier: ${identifier}, it is not available`);\n return;\n }\n\n this._context = {\n ...this._context,\n variables: this._context.variables.map(v => {\n if (v.identifier !== identifier) {\n return v;\n }\n return {\n ...v,\n value: outcomeVariable.cardinality === 'single' ? value : Array.isArray(value) ? value : [value]\n };\n })\n };\n this.#feedbackElements.forEach(fe => fe.checkShowFeedback(identifier));\n\n this.dispatchEvent(\n new CustomEvent<OutcomeChangedDetails>('qti-outcome-changed', {\n bubbles: true,\n composed: true,\n detail: {\n item: this.identifier,\n outcomeIdentifier: identifier,\n value: this._context.variables.find(v => v.identifier === identifier)?.value\n }\n })\n );\n }\n\n public validate(reportValidity = true): boolean {\n const isValid = this.#interactionElements.every(interactionElement => interactionElement.validate());\n\n if (reportValidity) {\n this.reportValidity();\n }\n\n return isValid;\n }\n\n public reportValidity() {\n for (const interactionElement of this.#interactionElements) {\n interactionElement.reportValidity();\n }\n }\n\n #getCompletionStatus(): 'completed' | 'incomplete' | 'not_attempted' | 'unknown' {\n const valid = this.validate(false);\n if (valid === true) return 'completed';\n if (valid === false) return 'incomplete';\n return 'not_attempted';\n }\n\n #resetOutcomeVariablesBeforeResponseProcessing(): void {\n this._context = {\n ...this._context,\n variables: this._context.variables.map(variable => {\n if (variable.type !== 'outcome') {\n return variable;\n }\n\n const hasDefaultValue = 'defaultValue' in variable;\n const declaredDefault = hasDefaultValue ? variable.defaultValue : null;\n\n let value = declaredDefault ?? null;\n if ((value === null || value === undefined) && (variable.baseType === 'integer' || variable.baseType === 'float')) {\n value = '0';\n }\n\n return {\n ...variable,\n value\n };\n })\n };\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-assessment-item': QtiAssessmentItem;\n }\n}\n","import { LitElement } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\n\nimport { qtiTransformItem } from '@qti-components/transformers';\n\nimport type { QtiAssessmentItem } from '../qti-assessment-item/qti-assessment-item';\n\nexport class QtiAssessmentStimulusRefConnectedEvent extends Event {\n public static eventName = 'qti-assessment-stimulus-ref-connected';\n constructor(\n public element: QtiAssessmentStimulusRef,\n public item: QtiAssessmentItem\n ) {\n super(QtiAssessmentStimulusRefConnectedEvent.eventName, { bubbles: true, composed: true, cancelable: true });\n }\n}\n\n/**\n * Represents a custom element for referencing an assessment stimulus.\n */\n@customElement('qti-assessment-stimulus-ref')\nexport class QtiAssessmentStimulusRef extends LitElement {\n @property({ type: String }) identifier = '';\n @property({ type: String }) href = '';\n\n /**\n * Lifecycle method called when the element is connected to the DOM.\n * First checks if there's a data-stimulus-idref element. If found, loads the stimulus directly.\n * If not found, delegates to the delivery platform via an event.\n */\n public override async connectedCallback(): Promise<void> {\n super.connectedCallback();\n // VERY important to wait for updateComplete to ensure that the stimulusRef is connected after item\n // for the test-navigation to correctly process everything in order\n await this.updateComplete;\n\n const item = this.closest<QtiAssessmentItem>('qti-assessment-item');\n\n const event = new QtiAssessmentStimulusRefConnectedEvent(this, item);\n this.dispatchEvent(event);\n\n const stimulusRef = item?.querySelector(`[data-stimulus-idref=\"${this.identifier}\"]`);\n if (!event.defaultPrevented && stimulusRef) {\n await this.updateStimulusRef(stimulusRef);\n }\n }\n\n /**\n * Loads and appends the stimulus to the specified element.\n * @param stimulusRef - The element to which the stimulus will be appended.\n */\n public async updateStimulusRef(stimulusRef: Element) {\n const stimulus = await qtiTransformItem()\n .load(this.href)\n .then(api => api.htmlDoc());\n if (stimulus) {\n const elements = stimulus.querySelectorAll('qti-stimulus-body, qti-stylesheet');\n stimulusRef.innerHTML = '';\n stimulusRef.append(...elements);\n }\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-assessment-stimulus-ref': QtiAssessmentStimulusRef;\n }\n}\n","import { LitElement } from 'lit';\nimport { customElement } from 'lit/decorators.js';\n\n@customElement('qti-companion-materials-info')\nexport class QtiCompanionMaterialsInfo extends LitElement {\n // static override styles = css`\n // slot {\n // display: hidden;\n // }\n // `;\n // override render() {\n // return html` <slot></slot> `;\n // }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-companion-materials-info': QtiCompanionMaterialsInfo;\n }\n}\n","import { consume } from '@lit/context';\nimport { LitElement, html } from 'lit';\nimport { customElement, state } from 'lit/decorators.js';\n\nimport { itemContext } from '@qti-components/base';\n\nimport type { ResponseVariable } from '@qti-components/base';\nimport type { Calculate } from '@qti-components/base';\nimport type { ItemContext } from '@qti-components/base';\n\n/**\n * https://www.imsglobal.org/spec/qti/v3p0/impl#h.fi29q8dubjgw\n * <qti-custom-operator class=\"js.org\">\n <qti-base-value base-type=\"string\"><![CDATA[\n console.log(context.variables);\n return 'B'\n document.querySelector('qti-end-attempt-interaction').disabled = true;\n ]]></qti-base-value>\n </qti-custom-operator>\n </qti-set-outcome-value>\n */\n@customElement('qti-custom-operator')\nexport class QtiCustomOperator extends LitElement implements Calculate {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n #operatorFunction: Function;\n\n @consume({ context: itemContext, subscribe: true })\n @state()\n private _context?: ItemContext;\n\n override render() {\n return html`<slot @slotchange=${this.handleSlotChange}></slot>`;\n }\n\n handleSlotChange() {\n // expecting <[!CDATA[ ... ]]> is converted into <!-- ... --> with qti-transform: cDataToComment\n const commentNode = Array.from(this.firstElementChild?.childNodes ?? []).find(\n node => node.nodeType === Node.COMMENT_NODE\n );\n try {\n this.#operatorFunction = new Function('context', 'fn', 'item', commentNode?.textContent ?? '');\n } catch (e) {\n console.error('custom-operator contains invalid javascript code', e);\n }\n }\n\n public calculate() {\n const fn = {\n variable: (responseIdentifier: string) =>\n this._context?.variables.find(v => v.identifier === responseIdentifier)?.value ?? '',\n correct: (responseIdentifier: string) =>\n (this._context?.variables.find(v => v.identifier === responseIdentifier) as ResponseVariable)\n ?.correctResponse ?? ''\n };\n const item = {\n getVariable: (variableIdentifier: string) =>\n this._context?.variables.find(v => v.identifier === variableIdentifier),\n updateOutcomeVariable: (outcomeIdentifier: string, value: string | string[]) => {\n this.dispatchEvent(\n new CustomEvent<{ outcomeIdentifier: string; value: string | string[] }>('qti-set-outcome-value', {\n bubbles: true,\n composed: true,\n detail: {\n outcomeIdentifier,\n value\n }\n })\n );\n },\n updateResponseVariable: (responseIdentifier: string, response: string | string[]) => {\n this.dispatchEvent(\n new CustomEvent<{ responseIdentifier: string; response: string | string[] }>('qti-interaction-response', {\n bubbles: true,\n composed: true,\n detail: {\n responseIdentifier,\n response\n }\n })\n );\n }\n };\n\n return this.#operatorFunction(this._context, fn, item);\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-custom-operator': QtiCustomOperator;\n }\n}\n","import { css, html } from 'lit';\nimport { customElement } from 'lit/decorators.js';\n\nimport { QtiFeedback } from '@qti-components/base';\n\n@customElement('qti-feedback-block')\nexport class QtiFeedbackBlock extends QtiFeedback {\n static override styles = css`\n :host {\n display: block;\n }\n .on {\n display: block;\n }\n .off {\n display: none;\n }\n `;\n\n override render() {\n return html` <slot part=\"feedback\" class=\"feedback ${this.showStatus}\"></slot> `;\n }\n\n public override connectedCallback(): void {\n super.connectedCallback();\n this.checkShowFeedback(this.outcomeIdentifier);\n }\n}\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-feedback-block': QtiFeedbackBlock;\n }\n}\n","import { css, html } from 'lit';\nimport { customElement } from 'lit/decorators.js';\nimport { ifDefined } from 'lit/directives/if-defined.js';\n\nimport { QtiFeedback } from '@qti-components/base';\n\n@customElement('qti-feedback-inline')\nexport class QtiFeedbackInline extends QtiFeedback {\n static override styles = css`\n .on {\n display: inline-block;\n }\n .off {\n display: none;\n }\n `;\n\n override render = () => html` <slot part=\"feedback\" class=\"${ifDefined(this.showStatus)}\"></slot> `;\n\n public override connectedCallback(): void {\n super.connectedCallback();\n this.checkShowFeedback(this.outcomeIdentifier);\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-feedback-inline': QtiFeedbackInline;\n }\n}\n","import { css, html } from 'lit';\nimport { customElement } from 'lit/decorators.js';\n\nimport { QtiFeedback } from '@qti-components/base';\n\n@customElement('qti-modal-feedback')\nexport class QtiModalFeedback extends QtiFeedback {\n static override styles = css`\n .qti-dialog {\n background: var(--qti-bg);\n border: var(--qti-border-thickness) var(--qti-border-style) var(--qti-border-color);\n border-radius: var(--qti-border-radius);\n padding: var(--qti-padding-vertical) var(--qti-padding-horizontal);\n box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);\n position: fixed;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n z-index: 1000;\n width: auto;\n max-width: 90%;\n }\n\n .button {\n border-radius: var(--qti-border-radius);\n padding: var(--qti-padding-vertical) var(--qti-padding-horizontal);\n background-color: var(--qti-bg-active);\n border: var(--qti-border-active);\n cursor: pointer;\n position: relative;\n display: inline-block;\n }\n\n .button:hover {\n background-color: var(--qti-hover-bg);\n }\n\n .button:disabled {\n background-color: var(--qti-disabled-bg);\n color: var(--qti-disabled-color);\n cursor: not-allowed;\n }\n\n .button:focus {\n outline: var(--qti-focus-border-width) solid var(--qti-focus-color);\n }\n `;\n\n override render() {\n return html`\n <dialog class=\"qti-dialog\" part=\"feedback\" ?open=\"${this.showStatus === 'on'}\">\n <slot></slot>\n <div style=\"margin-top: var(--qti-gap-size); text-align: center;\">\n <button class=\"button close-button\" @click=\"${this.closeFeedback}\">Close</button>\n </div>\n </dialog>\n `;\n }\n\n openFeedback() {\n const dialog = this.shadowRoot?.querySelector('dialog') as HTMLDialogElement | null;\n if (dialog && !dialog.open) {\n dialog.showModal();\n }\n }\n\n closeFeedback() {\n const dialog = this.shadowRoot?.querySelector('dialog') as HTMLDialogElement | null;\n if (dialog && dialog.open) {\n dialog.close();\n this.showStatus = 'off';\n }\n }\n\n public override connectedCallback(): void {\n super.connectedCallback();\n if (this.showStatus === 'on') {\n this.openFeedback();\n }\n }\n\n protected override updated(changedProperties: Map<string | number | symbol, unknown>): void {\n if (changedProperties.has('showStatus')) {\n if (this.showStatus === 'on') {\n this.openFeedback();\n } else {\n this.closeFeedback();\n }\n }\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-modal-feedback': QtiModalFeedback;\n }\n}\n","import { css } from 'lit';\n\nexport default css`\n :host {\n display: block;\n }\n`;\n","import { customElement } from 'lit/decorators.js';\nimport { html, LitElement } from 'lit';\n\nimport styles from './qti-item-body.styles';\n\nimport type { CSSResultGroup } from 'lit';\n\n/**\n * @summary The qti-item-body node contains the text, graphics, media objects and interactions that describe the item's content and information about how it is structured.\n * @documentation https://www.imsglobal.org/spec/qti/v3p0/impl#h.sphpo6lu6zqi\n * @status stable\n * @since 4.0\n *\n * @slot - item body content.\n * @slot qti-rubric-block - the qti rubric block is placed above the item\n * @part qti-rubric-block - the qti rubric block part\n */\n@customElement('qti-item-body')\nexport class QtiItemBody extends LitElement {\n static override styles: CSSResultGroup = styles;\n\n override render() {\n return html`<slot part=\"qti-rubric-blocks\" name=\"qti-rubric-block\"></slot><slot></slot>`;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-item-body': QtiItemBody;\n }\n}\n","import { LitElement, html } from 'lit';\nimport { customElement } from 'lit/decorators.js';\n\n@customElement('qti-content-body')\nexport class QtiContentBody extends LitElement {\n override render() {\n return html`<slot></slot>`;\n }\n}\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-content-body': QtiContentBody;\n }\n}\n","import { LitElement, css, html } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\n\nimport { watch } from '@qti-components/utilities';\n\n@customElement('qti-rubric-block')\nexport class QtiRubricBlock extends LitElement {\n @property({ type: String }) override id: string; // =\"qtiAspectInhoudRubricBlock\"\n\n @property({ type: String }) use: 'instructions' | 'scoring' | 'navigation'; // = \"scoring\"\n\n @property({ type: String }) view: 'author' | 'candidate' | 'proctor' | 'scorer' | 'testConstructor' | 'tutor';\n\n @property({ type: String, attribute: 'class' }) classNames: string;\n @watch('classNames', { waitUntilFirstUpdate: true })\n handleclassNamesChange() {\n const classNames = this.classNames.split(' ');\n classNames.forEach((className: string) => {\n switch (className) {\n case 'qti-rubric-discretionary-placement':\n {\n const event = new CustomEvent('qti-rubric:discretionary-placement', {\n detail: { className, element: this },\n bubbles: true,\n composed: true,\n cancelable: true\n });\n const notCancelled = this.dispatchEvent(event);\n if (!notCancelled) return;\n this.setAttribute('slot', 'qti-rubric-block');\n }\n break;\n case 'qti-rubric-inline':\n this.setAttribute('slot', '');\n break;\n default:\n break;\n }\n });\n }\n\n static override styles = css`\n :host {\n display: block;\n }\n `;\n\n override render() {\n return html`<slot></slot>`;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-rubric-block': QtiRubricBlock;\n }\n}\n","import { LitElement } from 'lit';\nimport { customElement } from 'lit/decorators.js';\n\nimport type { PropertyValueMap } from 'lit';\n\n@customElement('qti-stylesheet')\nexport class QtiStylesheet extends LitElement {\n #styleElement: HTMLStyleElement | null = null;\n\n protected override firstUpdated(_changedProperties: PropertyValueMap<any> | Map<PropertyKey, unknown>): void {\n super.firstUpdated(_changedProperties);\n\n const link = this.getAttribute('href');\n\n if (link !== null) {\n // Fetch the stylesheet content\n fetch(link)\n .then(response => response.text())\n .then(cssContent => {\n // Minify the CSS content by removing whitespace and comments\n const minifiedCss = this.#minifyCss(cssContent);\n\n // Create a <style> element with @scope surrounding the minified CSS\n this.#styleElement = document.createElement('style');\n this.#styleElement.media = 'screen';\n this.#styleElement.textContent = `@scope {${minifiedCss}}`;\n\n // Append the style element to the parent element of this component\n if (this.parentElement) {\n this.parentElement.appendChild(this.#styleElement);\n } else {\n console.warn('No parent element to append the scoped stylesheet to.');\n }\n })\n .catch(error => {\n console.error('Failed to load stylesheet:', error);\n });\n }\n\n if (this.textContent !== null && this.textContent.trim() !== '') {\n // Minify the inline CSS content\n const minifiedCss = this.#minifyCss(this.textContent);\n\n // Directly create a <style> element with the @scope surrounding the minified inline styles\n this.#styleElement = document.createElement('style');\n this.#styleElement.media = 'screen';\n this.#styleElement.textContent = `@scope {${minifiedCss}}`;\n\n // Append the style element to the parent element of this component\n if (this.parentElement) {\n this.parentElement.appendChild(this.#styleElement);\n } else {\n console.warn('No parent element to append the scoped stylesheet to.');\n }\n }\n }\n\n #minifyCss(cssContent: string): string {\n // Remove comments, whitespace, and newline characters\n return cssContent\n .replace(/\\/\\*[\\s\\S]*?\\*\\//g, '') // Remove comments\n .replace(/\\s+/g, ' ') // Collapse whitespace\n .replace(/\\s*([{}:;])\\s*/g, '$1') // Remove spaces around {}, :, ;\n .trim(); // Trim leading/trailing whitespace\n }\n\n override disconnectedCallback() {\n if (this.#styleElement) {\n try {\n this.#styleElement.remove();\n } catch (error) {\n console.error('Could not remove stylesheet:', error);\n }\n }\n super.disconnectedCallback();\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-stylesheet': QtiStylesheet;\n }\n}\n","import { consume } from '@lit/context';\nimport { css, html } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\n\nimport { itemContext } from '@qti-components/base';\nimport { QtiVariableDeclaration } from '@qti-components/base';\n\nimport type { QtiAreaMapping } from '@qti-components/base';\nimport type { BaseType, Cardinality } from '@qti-components/base';\nimport type { ResponseVariable } from '@qti-components/base';\nimport type { QtiMapping } from '@qti-components/base';\nimport type { ItemContext } from '@qti-components/base';\n\n@customElement('qti-response-declaration')\nexport class QtiResponseDeclaration extends QtiVariableDeclaration {\n @property({ type: String, attribute: 'base-type' }) baseType: BaseType;\n\n @property({ type: String }) identifier: string;\n\n @property({ type: String }) cardinality: Cardinality;\n\n @consume({ context: itemContext, subscribe: true })\n @state()\n public itemContext?: ItemContext;\n\n static override styles = [\n css`\n :host {\n display: none;\n }\n `\n ];\n\n override render() {\n const value = this.itemContext?.variables.find(v => v.identifier === this.identifier)?.value;\n return html`${JSON.stringify(value, null, 2)}`;\n }\n\n public override connectedCallback() {\n super.connectedCallback();\n const defaultValue = this.defaultValues(this.cardinality);\n\n const responseVariable: ResponseVariable = {\n baseType: this.baseType,\n identifier: this.identifier,\n correctResponse: this.#correctResponse,\n cardinality: this.cardinality || 'single',\n mapping: this.#mapping,\n defaultValue,\n areaMapping: this.#areaMapping,\n value: null,\n type: 'response',\n candidateResponse: null\n };\n responseVariable.value = defaultValue;\n\n this.dispatchEvent(\n new CustomEvent('qti-register-variable', {\n bubbles: true,\n composed: true,\n detail: { variable: responseVariable }\n })\n );\n }\n\n get #correctResponse(): string | string[] {\n let result: string | string[];\n const correctResponse = this.querySelector('qti-correct-response');\n if (correctResponse) {\n const values = correctResponse.querySelectorAll('qti-value');\n if (this.cardinality === 'single' && values.length > 0) {\n result = values[0].textContent.trim();\n values[0].remove();\n } else if (this.cardinality !== 'single') {\n result = [];\n for (let i = 0; i < values.length; i++) {\n result.push(values[i].textContent.trim());\n values[i].remove();\n }\n }\n }\n return result;\n }\n\n get #mapping(): QtiMapping {\n const mappingElement = this.querySelector('qti-mapping');\n const lowerBound = parseFloat(mappingElement?.getAttribute('lower-bound'));\n const uppperBound = parseFloat(mappingElement?.getAttribute('upper-bound'));\n const mappingValue = {\n defaultValue: Number(mappingElement?.getAttribute('default-value')) || 0,\n lowerBound: isNaN(lowerBound) ? null : lowerBound,\n upperBound: isNaN(uppperBound) ? null : uppperBound,\n mapEntries: Array.from(mappingElement?.querySelectorAll('qti-map-entry') || []).map(el => ({\n mapKey: el.getAttribute('map-key') || '',\n mappedValue: Number(el.getAttribute('mapped-value')) || 0,\n caseSensitive: el.hasAttribute('case-sensitive') ? el.getAttribute('case-sensitive') !== 'false' : false\n }))\n };\n return mappingValue;\n }\n\n get #areaMapping(): QtiAreaMapping {\n const areaMappingElement = this.querySelector('qti-area-mapping') as HTMLElement;\n\n const defaultValue = Number(areaMappingElement?.getAttribute('default-value')) || 0;\n const lowerBound = parseFloat(areaMappingElement?.getAttribute('lower-bound'));\n const uppperBound = parseFloat(areaMappingElement?.getAttribute('upper-bound'));\n\n const areaMapEntries = Array.from(areaMappingElement?.querySelectorAll('qti-area-map-entry') || []).map(\n (el: HTMLElement) => ({\n shape: (el.getAttribute('shape') as 'default' | 'circle' | 'rect' | 'ellipse' | 'poly') || 'default',\n coords: el.getAttribute('coords') || '',\n mappedValue: Number(el.getAttribute('mapped-value')) || 0,\n defaultValue: Number(el.getAttribute('default-value')) || 0\n })\n );\n\n return {\n defaultValue,\n lowerBound: isNaN(lowerBound) ? null : lowerBound,\n upperBound: isNaN(uppperBound) ? null : uppperBound,\n areaMapEntries\n };\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-response-declaration': QtiResponseDeclaration;\n }\n}\n","import { consume } from '@lit/context';\nimport { css, html } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\n\nimport { itemContext } from '@qti-components/base';\nimport { QtiVariableDeclaration } from '@qti-components/base';\n\nimport type { BaseType, Cardinality } from '@qti-components/base';\nimport type { OutcomeVariable } from '@qti-components/base';\nimport type { ItemContext } from '@qti-components/base';\n\n@customElement('qti-outcome-declaration')\nexport class QtiOutcomeDeclaration extends QtiVariableDeclaration {\n @property({ type: String, attribute: 'base-type' }) baseType: BaseType;\n @property({ type: String, attribute: 'external-scored' }) externalScored: 'human' | 'externalMachine' | null = null;\n @property({ type: String }) identifier: string;\n @property({ type: String }) cardinality: Cardinality;\n\n @consume({ context: itemContext, subscribe: true })\n @state()\n public itemContext?: ItemContext;\n\n static override styles = [\n css`\n :host {\n display: none;\n }\n `\n ];\n\n override render() {\n const value = this.itemContext?.variables.find(v => v.identifier === this.identifier)?.value;\n return html`${JSON.stringify(value, null, 2)}`;\n }\n\n get interpolationTable(): Map<number, number> | null {\n const table = this.querySelector('qti-interpolation-table');\n if (table) {\n const entries = new Map<number, number>();\n for (const entry of table.querySelectorAll('qti-interpolation-table-entry')) {\n if (!entry.getAttribute('source-value') && entry.getAttribute('target-value')) {\n console.error('source-value or target-value is missing in qti-interpolation-table-entry');\n }\n const sourceValue = parseFloat(entry.getAttribute('source-value'));\n const targetValue = parseFloat(entry.getAttribute('target-value'));\n if (isNaN(sourceValue) || isNaN(targetValue)) {\n console.error('source-value or target-value is not a number in qti-interpolation-table-entry');\n }\n entries.set(sourceValue, targetValue);\n }\n return entries;\n }\n return null;\n }\n\n public override connectedCallback() {\n super.connectedCallback();\n\n const defaultValue = this.defaultValues(this.cardinality);\n\n const outcomeVariable: OutcomeVariable = {\n identifier: this.identifier,\n cardinality: this.cardinality,\n baseType: this.baseType,\n defaultValue: defaultValue,\n type: 'outcome',\n value: null,\n interpolationTable: this.interpolationTable,\n externalScored: this.externalScored\n };\n // At runtime, outcome variables are instantiated as part of an item session.\n // Their values may be initialized with a default value and/or set during response processing.\n // If no default value is given in the declaration then the outcome variable is initialized to NULL unless the outcome is of a numeric type (integer or float) in which case it is initialized to 0.\n outcomeVariable.value = defaultValue;\n if (\n (outcomeVariable.value === null || outcomeVariable.value == undefined) &&\n (outcomeVariable.baseType === 'integer' || outcomeVariable.baseType === 'float')\n ) {\n outcomeVariable.value = '0';\n }\n this.dispatchEvent(\n new CustomEvent('qti-register-variable', {\n bubbles: true,\n composed: true,\n detail: { variable: outcomeVariable }\n })\n );\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-outcome-declaration': QtiOutcomeDeclaration;\n }\n}\n","export const matchCorrect = `<qti-response-processing>\n <qti-response-condition>\n <qti-response-if>\n <qti-match>\n <qti-variable identifier=\"RESPONSE\"></qti-variable>\n <qti-correct identifier=\"RESPONSE\"></qti-correct>\n </qti-match>\n <qti-set-outcome-value identifier=\"SCORE\">\n <qti-base-value base-type=\"float\">1</qti-base-value>\n </qti-set-outcome-value>\n </qti-response-if>\n <qti-response-else>\n <qti-set-outcome-value identifier=\"SCORE\">\n <qti-base-value base-type=\"float\">0</qti-base-value>\n </qti-set-outcome-value>\n </qti-response-else>\n </qti-response-condition>\n</qti-response-processing>`;\n\nexport const mapResponse = `<qti-response-processing>\n <qti-response-condition>\n <qti-response-if>\n <qti-is-null>\n <qti-variable identifier=\"RESPONSE\"></qti-variable>\n </qti-is-null>\n <qti-set-outcome-value identifier=\"SCORE\">\n <qti-base-value base-type=\"float\">0.0</qti-base-value>\n </qti-set-outcome-value>\n </qti-response-if>\n <qti-response-else>\n <qti-set-outcome-value identifier=\"SCORE\">\n <qti-map-response identifier=\"RESPONSE\"> </qti-map-response>\n </qti-set-outcome-value>\n </qti-response-else>\n </qti-response-condition>\n</qti-response-processing>`;\n\nexport const mapResponsePoint = `<qti-response-processing>\n <qti-response-condition>\n <qti-response-if>\n <qti-is-null>\n <qti-variable identifier=\"RESPONSE\"></qti-variable>\n </qti-is-null>\n <qti-set-outcome-value identifier=\"SCORE\">\n <qti-base-value base-type=\"float\">0</qti-base-value>\n </qti-set-outcome-value>\n </qti-response-if>\n <qti-response-else>\n <qti-set-outcome-value identifier=\"SCORE\">\n <qti-map-response-point identifier=\"RESPONSE\"></qti-map-response-point>\n </qti-set-outcome-value>\n </qti-response-else>\n </qti-response-condition>\n</qti-response-processing>`;\n","import { css, html, LitElement } from 'lit';\nimport { customElement } from 'lit/decorators.js';\n\nimport { type QtiRuleBase } from '@qti-components/base';\n\nimport { mapResponse, mapResponsePoint, matchCorrect } from '../../internal/template-strings';\n\nimport type { PropertyValueMap } from 'lit';\n\n@customElement('qti-response-processing')\nexport class QtiResponseProcessing extends LitElement {\n static override styles = [\n css`\n :host {\n display: none;\n }\n `\n ];\n\n override render() {\n return html`<slot></slot>`;\n }\n\n public process() {\n const assessmentItem = this.closest('qti-assessment-item');\n if (!assessmentItem) return;\n const rules = [...this.children] as unknown as QtiRuleBase[];\n for (const rule of rules) {\n rule.process();\n }\n }\n\n public override firstUpdated(_changedProperties: PropertyValueMap<any> | Map<PropertyKey, unknown>): void {\n if (this.getAttribute('template')) {\n const splittedTemplateName = this.getAttribute('template')!.split('/');\n const templateName = splittedTemplateName[splittedTemplateName.length - 1].replace('.xml', '');\n this.innerHTML = '';\n switch (templateName) {\n case 'map_response': {\n this.appendChild(this.#fragmentFromString(mapResponse).firstElementChild.firstElementChild);\n break;\n }\n case 'map_response_point': {\n this.appendChild(this.#fragmentFromString(mapResponsePoint).firstElementChild.firstElementChild);\n break;\n }\n case 'match_correct':\n this.appendChild(this.#fragmentFromString(matchCorrect).firstElementChild.firstElementChild);\n break;\n }\n }\n }\n\n #fragmentFromString(strHTML: string) {\n return document.createRange().createContextualFragment(strHTML);\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-response-processing': QtiResponseProcessing;\n }\n}\n","import { css, LitElement, html } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\n\nimport type { TemplateVariable } from '@qti-components/base';\nimport type { BaseType } from '@qti-components/base';\n\n/**\n * @summary The qti-template-declaration element declares template variables for item cloning.\n * @documentation https://www.imsglobal.org/spec/qti/v3p0/impl#h.template-declaration\n */\n@customElement('qti-template-declaration')\nexport class QtiTemplateDeclaration extends LitElement {\n @property({ type: String }) identifier: string = '';\n @property({ type: String }) cardinality: 'single' | 'multiple' | 'ordered' | 'record' = 'single';\n @property({ type: String, attribute: 'base-type' }) baseType: BaseType = 'string';\n @property({ type: Boolean, attribute: 'math-variable' }) mathVariable: boolean = false;\n @property({ type: Boolean, attribute: 'param-variable' }) paramVariable: boolean = false;\n\n #defaultValue: any = null;\n\n static override styles = [\n css`\n :host {\n display: none;\n }\n `\n ];\n\n override render() {\n return html`<slot></slot>`;\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n this.updateComplete.then(() => {\n this.#processDefaultValue();\n this.#registerTemplateVariable();\n });\n }\n\n /**\n * Process qti-default-value to extract the default value\n */\n #processDefaultValue(): void {\n const defaultValueElement = this.querySelector('qti-default-value');\n if (!defaultValueElement) {\n return;\n }\n\n // For now, just get the text content - this could be enhanced to handle expressions\n const textContent = defaultValueElement.textContent?.trim() || '';\n this.#defaultValue = this.#convertValue(textContent);\n }\n\n /**\n * Convert string value based on base-type\n */\n #convertValue(value: string): any {\n if (!value) return null;\n\n switch (this.baseType) {\n case 'integer':\n return parseInt(value, 10);\n case 'float':\n case 'duration':\n return parseFloat(value);\n case 'boolean':\n return value.toLowerCase() === 'true';\n case 'string':\n default:\n return value;\n }\n }\n\n /**\n * Register this template variable with the assessment item\n */\n #registerTemplateVariable(): void {\n const templateVariable: TemplateVariable = {\n identifier: this.identifier,\n cardinality: this.cardinality,\n baseType: this.baseType,\n defaultValue: this.#defaultValue,\n value: this.#defaultValue,\n type: 'template',\n mathVariable: this.mathVariable,\n paramVariable: this.paramVariable\n };\n\n // Dispatch event to register the variable\n\n // value must string or string[]\n const variable = { ...templateVariable, value: this.#defaultValue?.toString() || '' };\n this.dispatchEvent(\n new CustomEvent('qti-register-variable', {\n bubbles: true,\n composed: true,\n detail: { variable }\n })\n );\n }\n\n /**\n * Get the template variable definition\n */\n public getTemplateVariable(): TemplateVariable {\n return {\n identifier: this.identifier,\n cardinality: this.cardinality,\n baseType: this.baseType,\n value: this.#defaultValue,\n type: 'template',\n mathVariable: this.mathVariable,\n paramVariable: this.paramVariable\n };\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-template-declaration': QtiTemplateDeclaration;\n }\n}\n","import { css, LitElement, html } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\n\n/**\n * @summary The qti-context-declaration element declares context variables for an item.\n * @documentation https://www.imsglobal.org/spec/qti/v3p0/impl#h.qti-context-declaration\n */\n@customElement('qti-context-declaration')\nexport class QtiContextDeclaration extends LitElement {\n @property({ type: String }) identifier: string = '';\n @property({ type: String }) cardinality: 'single' | 'multiple' | 'ordered' | 'record' = 'record';\n\n static override styles = [\n css`\n :host {\n display: none;\n }\n `\n ];\n\n override render() {\n return html`<slot></slot>`;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-context-declaration': QtiContextDeclaration;\n }\n}\n"],"mappings":"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","names":["i","e","i","i","i","e","i","i","i","i","i","i","i","i"]}
|
|
@@ -3897,6 +3897,8 @@ var QtiPortableCustomInteraction = class extends Interaction {
|
|
|
3897
3897
|
this.response = null;
|
|
3898
3898
|
this.#parsedRequirePaths = null;
|
|
3899
3899
|
this.#parsedRequireShim = null;
|
|
3900
|
+
this.#pciValidity = null;
|
|
3901
|
+
this.#pciCustomValidityMessage = "";
|
|
3900
3902
|
/**
|
|
3901
3903
|
* IFRAME MODE: Handle iframe messages
|
|
3902
3904
|
*/
|
|
@@ -3946,6 +3948,17 @@ var QtiPortableCustomInteraction = class extends Interaction {
|
|
|
3946
3948
|
case "interactionChanged": {
|
|
3947
3949
|
const raw = data?.params?.value;
|
|
3948
3950
|
const converted = raw && typeof raw === "object" ? this.#convertQtiVariableJSON(raw) : null;
|
|
3951
|
+
const pciValid = typeof data?.params?.valid === "boolean" ? data.params.valid : null;
|
|
3952
|
+
const pciCustomValidity = typeof data?.params?.customValidity === "string" ? data.params.customValidity : null;
|
|
3953
|
+
if (pciValid !== null) {
|
|
3954
|
+
this.#pciValidity = pciValid;
|
|
3955
|
+
if (pciValid && pciCustomValidity === null) {
|
|
3956
|
+
this.#pciCustomValidityMessage = "";
|
|
3957
|
+
}
|
|
3958
|
+
}
|
|
3959
|
+
if (pciCustomValidity !== null) {
|
|
3960
|
+
this.#pciCustomValidityMessage = pciCustomValidity;
|
|
3961
|
+
}
|
|
3949
3962
|
const stateRaw = data?.params?.state;
|
|
3950
3963
|
let state;
|
|
3951
3964
|
if (stateRaw === void 0) {
|
|
@@ -3998,6 +4011,8 @@ var QtiPortableCustomInteraction = class extends Interaction {
|
|
|
3998
4011
|
}
|
|
3999
4012
|
#parsedRequirePaths;
|
|
4000
4013
|
#parsedRequireShim;
|
|
4014
|
+
#pciValidity;
|
|
4015
|
+
#pciCustomValidityMessage;
|
|
4001
4016
|
/**
|
|
4002
4017
|
* Parse the require paths JSON string into an object
|
|
4003
4018
|
*/
|
|
@@ -4364,7 +4379,7 @@ var QtiPortableCustomInteraction = class extends Interaction {
|
|
|
4364
4379
|
return base;
|
|
4365
4380
|
}
|
|
4366
4381
|
}
|
|
4367
|
-
|
|
4382
|
+
#hasNonEmptyResponse() {
|
|
4368
4383
|
if (this.response === null || this.response === void 0) return false;
|
|
4369
4384
|
if (Array.isArray(this.response)) {
|
|
4370
4385
|
if (this.response.length === 0) return false;
|
|
@@ -4372,6 +4387,16 @@ var QtiPortableCustomInteraction = class extends Interaction {
|
|
|
4372
4387
|
}
|
|
4373
4388
|
return this.response !== "";
|
|
4374
4389
|
}
|
|
4390
|
+
#setInteractionValidity(isValid, customMessage) {
|
|
4391
|
+
const fallbackMessage = this.dataset.invalidresponsemessage || "Invalid response.";
|
|
4392
|
+
const message = isValid ? "" : customMessage && customMessage.trim().length > 0 ? customMessage : fallbackMessage;
|
|
4393
|
+
this._internals.setValidity(isValid ? {} : { customError: true }, message);
|
|
4394
|
+
}
|
|
4395
|
+
validate() {
|
|
4396
|
+
const isValid = typeof this.#pciValidity === "boolean" ? this.#pciValidity : this.#hasNonEmptyResponse();
|
|
4397
|
+
this.#setInteractionValidity(isValid, this.#pciCustomValidityMessage);
|
|
4398
|
+
return isValid;
|
|
4399
|
+
}
|
|
4375
4400
|
set value(v2) {
|
|
4376
4401
|
if (v2 === null) {
|
|
4377
4402
|
this.#value = [];
|
|
@@ -4566,6 +4591,8 @@ var QtiPortableCustomInteraction = class extends Interaction {
|
|
|
4566
4591
|
}
|
|
4567
4592
|
connectedCallback() {
|
|
4568
4593
|
super.connectedCallback();
|
|
4594
|
+
this.#pciValidity = null;
|
|
4595
|
+
this.#pciCustomValidityMessage = "";
|
|
4569
4596
|
this.response = this.responseVariable?.value ?? null;
|
|
4570
4597
|
window.addEventListener("message", this.handleIframeMessage);
|
|
4571
4598
|
this.createIframe();
|
|
@@ -4801,11 +4828,37 @@ var QtiPortableCustomInteraction = class extends Interaction {
|
|
|
4801
4828
|
self.interactionChangedViaEvent = true;
|
|
4802
4829
|
const value = evt && evt.detail ? evt.detail.value : undefined;
|
|
4803
4830
|
if (value !== undefined) {
|
|
4831
|
+
const validFromEvent =
|
|
4832
|
+
evt && evt.detail && typeof evt.detail.valid === 'boolean' ? evt.detail.valid : undefined;
|
|
4833
|
+
let valid = validFromEvent;
|
|
4834
|
+
if (valid === undefined && self.pciInstance && typeof self.pciInstance.checkValidity === 'function') {
|
|
4835
|
+
try {
|
|
4836
|
+
valid = self.pciInstance.checkValidity();
|
|
4837
|
+
} catch (e) {
|
|
4838
|
+
// Keep undefined on PCI validity read errors.
|
|
4839
|
+
}
|
|
4840
|
+
}
|
|
4841
|
+
const customValidityFromEvent =
|
|
4842
|
+
evt && evt.detail && typeof evt.detail.customValidity === 'string'
|
|
4843
|
+
? evt.detail.customValidity
|
|
4844
|
+
: undefined;
|
|
4845
|
+
let customValidity = customValidityFromEvent;
|
|
4846
|
+
if (
|
|
4847
|
+
customValidity === undefined &&
|
|
4848
|
+
self.pciInstance &&
|
|
4849
|
+
typeof self.pciInstance.getCustomValidity === 'function'
|
|
4850
|
+
) {
|
|
4851
|
+
try {
|
|
4852
|
+
customValidity = self.pciInstance.getCustomValidity();
|
|
4853
|
+
} catch (e) {
|
|
4854
|
+
// Keep undefined on PCI custom validity read errors.
|
|
4855
|
+
}
|
|
4856
|
+
}
|
|
4804
4857
|
const state =
|
|
4805
4858
|
self.pciInstance && typeof self.pciInstance.getState === 'function'
|
|
4806
4859
|
? self.pciInstance.getState()
|
|
4807
4860
|
: null;
|
|
4808
|
-
self.notifyInteractionChanged(value, state);
|
|
4861
|
+
self.notifyInteractionChanged(value, state, valid, customValidity);
|
|
4809
4862
|
}
|
|
4810
4863
|
} catch (e) {
|
|
4811
4864
|
// ignore bridge errors, polling fallback may still work
|
|
@@ -4893,7 +4946,20 @@ var QtiPortableCustomInteraction = class extends Interaction {
|
|
|
4893
4946
|
this.notifyReady();
|
|
4894
4947
|
},
|
|
4895
4948
|
ondone: (pciInstance, response, state, status) => {
|
|
4896
|
-
|
|
4949
|
+
const valid =
|
|
4950
|
+
this.pciInstance && typeof this.pciInstance.checkValidity === 'function'
|
|
4951
|
+
? this.pciInstance.checkValidity()
|
|
4952
|
+
: undefined;
|
|
4953
|
+
const customValidity =
|
|
4954
|
+
this.pciInstance && typeof this.pciInstance.getCustomValidity === 'function'
|
|
4955
|
+
? this.pciInstance.getCustomValidity()
|
|
4956
|
+
: undefined;
|
|
4957
|
+
this.notifyInteractionChanged(
|
|
4958
|
+
response,
|
|
4959
|
+
typeof state === 'string' ? state : null,
|
|
4960
|
+
valid,
|
|
4961
|
+
customValidity
|
|
4962
|
+
);
|
|
4897
4963
|
},
|
|
4898
4964
|
responseIdentifier: config.responseIdentifier,
|
|
4899
4965
|
boundTo: config.boundTo
|
|
@@ -5017,13 +5083,18 @@ var QtiPortableCustomInteraction = class extends Interaction {
|
|
|
5017
5083
|
);
|
|
5018
5084
|
},
|
|
5019
5085
|
|
|
5020
|
-
notifyInteractionChanged: function (response, state) {
|
|
5086
|
+
notifyInteractionChanged: function (response, state, valid, customValidity) {
|
|
5021
5087
|
window.parent.postMessage(
|
|
5022
5088
|
{
|
|
5023
5089
|
source: 'qti-pci-iframe',
|
|
5024
5090
|
responseIdentifier: this.responseIdentifier,
|
|
5025
5091
|
method: 'interactionChanged',
|
|
5026
|
-
params: {
|
|
5092
|
+
params: {
|
|
5093
|
+
value: response,
|
|
5094
|
+
state: state,
|
|
5095
|
+
valid: typeof valid === 'boolean' ? valid : undefined,
|
|
5096
|
+
customValidity: typeof customValidity === 'string' ? customValidity : undefined
|
|
5097
|
+
}
|
|
5027
5098
|
},
|
|
5028
5099
|
'*'
|
|
5029
5100
|
);
|
|
@@ -5404,6 +5475,14 @@ var QtiPortableCustomInteraction = class extends Interaction {
|
|
|
5404
5475
|
if (PCIManager.interactionChangedViaEvent) return;
|
|
5405
5476
|
if (PCIManager.pciInstance && PCIManager.pciInstance.getResponse) {
|
|
5406
5477
|
const response = PCIManager.pciInstance.getResponse();
|
|
5478
|
+
const valid =
|
|
5479
|
+
PCIManager.pciInstance && typeof PCIManager.pciInstance.checkValidity === 'function'
|
|
5480
|
+
? PCIManager.pciInstance.checkValidity()
|
|
5481
|
+
: undefined;
|
|
5482
|
+
const customValidity =
|
|
5483
|
+
PCIManager.pciInstance && typeof PCIManager.pciInstance.getCustomValidity === 'function'
|
|
5484
|
+
? PCIManager.pciInstance.getCustomValidity()
|
|
5485
|
+
: undefined;
|
|
5407
5486
|
if (response === undefined) {
|
|
5408
5487
|
// Don't emit an initial empty on load; only emit a clear if we previously had a value
|
|
5409
5488
|
if (!PCIManager.hadResponse) return;
|
|
@@ -5418,7 +5497,7 @@ var QtiPortableCustomInteraction = class extends Interaction {
|
|
|
5418
5497
|
source: 'qti-pci-iframe',
|
|
5419
5498
|
responseIdentifier: PCIManager.responseIdentifier,
|
|
5420
5499
|
method: 'interactionChanged',
|
|
5421
|
-
params: { value: null, state: state }
|
|
5500
|
+
params: { value: null, state: state, valid: valid, customValidity: customValidity }
|
|
5422
5501
|
},
|
|
5423
5502
|
'*'
|
|
5424
5503
|
);
|
|
@@ -5439,7 +5518,7 @@ var QtiPortableCustomInteraction = class extends Interaction {
|
|
|
5439
5518
|
source: 'qti-pci-iframe',
|
|
5440
5519
|
responseIdentifier: PCIManager.responseIdentifier,
|
|
5441
5520
|
method: 'interactionChanged',
|
|
5442
|
-
params: { value: response, state: state }
|
|
5521
|
+
params: { value: response, state: state, valid: valid, customValidity: customValidity }
|
|
5443
5522
|
},
|
|
5444
5523
|
'*'
|
|
5445
5524
|
);
|
|
@@ -7604,4 +7683,4 @@ lit-html/node/directives/ref.js:
|
|
|
7604
7683
|
* SPDX-License-Identifier: BSD-3-Clause
|
|
7605
7684
|
*)
|
|
7606
7685
|
*/
|
|
7607
|
-
//# sourceMappingURL=chunk-
|
|
7686
|
+
//# sourceMappingURL=chunk-I4NHZ6D6.js.map
|