@longsightgroup/qti3-player 0.2.1 → 0.4.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/README.md +7 -0
- package/dist/icons.d.ts +8 -0
- package/dist/icons.d.ts.map +1 -0
- package/dist/icons.js +45 -0
- package/dist/icons.js.map +1 -0
- package/dist/index.d.ts +3 -134
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -4712
- package/dist/index.js.map +1 -1
- package/dist/interaction-support.d.ts +34 -0
- package/dist/interaction-support.d.ts.map +1 -0
- package/dist/interaction-support.js +189 -0
- package/dist/interaction-support.js.map +1 -0
- package/dist/movement.d.ts +3 -0
- package/dist/movement.d.ts.map +1 -0
- package/dist/movement.js +21 -0
- package/dist/movement.js.map +1 -0
- package/dist/player-element.d.ts +60 -0
- package/dist/player-element.d.ts.map +1 -0
- package/dist/player-element.js +367 -0
- package/dist/player-element.js.map +1 -0
- package/dist/player-locale.d.ts +6 -0
- package/dist/player-locale.d.ts.map +1 -0
- package/dist/player-locale.js +205 -0
- package/dist/player-locale.js.map +1 -0
- package/dist/player-messages.d.ts +40 -0
- package/dist/player-messages.d.ts.map +1 -0
- package/dist/player-messages.js +2 -0
- package/dist/player-messages.js.map +1 -0
- package/dist/player-styles.d.ts +3 -0
- package/dist/player-styles.d.ts.map +1 -0
- package/dist/player-styles.js +24 -0
- package/dist/player-styles.js.map +1 -0
- package/dist/player-types.d.ts +71 -0
- package/dist/player-types.d.ts.map +1 -0
- package/dist/player-types.js +2 -0
- package/dist/player-types.js.map +1 -0
- package/dist/player-validation-dom.d.ts +3 -0
- package/dist/player-validation-dom.d.ts.map +1 -0
- package/dist/player-validation-dom.js +28 -0
- package/dist/player-validation-dom.js.map +1 -0
- package/dist/player-validation.d.ts +13 -0
- package/dist/player-validation.d.ts.map +1 -0
- package/dist/player-validation.js +123 -0
- package/dist/player-validation.js.map +1 -0
- package/dist/portable-custom-support.d.ts +11 -0
- package/dist/portable-custom-support.d.ts.map +1 -0
- package/dist/portable-custom-support.js +70 -0
- package/dist/portable-custom-support.js.map +1 -0
- package/dist/response-limits.d.ts +9 -0
- package/dist/response-limits.d.ts.map +1 -0
- package/dist/response-limits.js +44 -0
- package/dist/response-limits.js.map +1 -0
- package/package.json +4 -4
- package/src/content/content-dom.ts +274 -0
- package/src/content/content-renderer.ts +114 -0
- package/src/controls/remove-button.ts +13 -0
- package/src/icons.ts +47 -0
- package/src/index.ts +26 -5307
- package/src/interaction-support.ts +263 -0
- package/src/interactions/choice-interaction.ts +92 -0
- package/src/interactions/drawing-interaction.ts +447 -0
- package/src/interactions/end-attempt-interaction.ts +19 -0
- package/src/interactions/gap-match-interaction.ts +337 -0
- package/src/interactions/graphic-associate-interaction.ts +324 -0
- package/src/interactions/graphic-context.ts +33 -0
- package/src/interactions/hotspot-interaction.ts +87 -0
- package/src/interactions/hottext-interaction.ts +81 -0
- package/src/interactions/inline-choice-interaction.ts +45 -0
- package/src/interactions/inline-controls.ts +21 -0
- package/src/interactions/interaction-diagnostics.ts +159 -0
- package/src/interactions/interaction-dispatch.ts +9 -0
- package/src/interactions/interaction-label.ts +10 -0
- package/src/interactions/interaction-registry.ts +209 -0
- package/src/interactions/match-interaction.ts +199 -0
- package/src/interactions/object-asset.ts +212 -0
- package/src/interactions/pair-interaction.ts +147 -0
- package/src/interactions/point-value.ts +41 -0
- package/src/interactions/portable-custom-interaction.ts +139 -0
- package/src/interactions/position-object-interaction.ts +210 -0
- package/src/interactions/routing.ts +27 -0
- package/src/interactions/select-point-interaction.ts +185 -0
- package/src/interactions/shared.ts +56 -0
- package/src/interactions/text-interaction.ts +127 -0
- package/src/interactions/unsupported-interaction.ts +25 -0
- package/src/interactions/upload-interaction.ts +16 -0
- package/src/movement.ts +29 -0
- package/src/player/attempt-availability.ts +36 -0
- package/src/player/content-state.ts +74 -0
- package/src/player/dynamic-body.ts +40 -0
- package/src/player/feedback-panel.ts +23 -0
- package/src/player/fetch-xml.ts +8 -0
- package/src/player/interaction-render.ts +89 -0
- package/src/player/render-shell.ts +44 -0
- package/src/player/resolve-assets.ts +12 -0
- package/src/player/validation-messages.ts +42 -0
- package/src/player-element.ts +493 -0
- package/src/player-locale.ts +232 -0
- package/src/player-messages.ts +31 -0
- package/src/player-styles.ts +25 -0
- package/src/player-types.ts +99 -0
- package/src/player-validation-dom.ts +31 -0
- package/src/player-validation.ts +158 -0
- package/src/portable-custom-support.ts +74 -0
- package/src/reorder/a11y.ts +40 -0
- package/src/reorder/graphic-order-interaction.ts +260 -0
- package/src/reorder/list-controls.ts +114 -0
- package/src/reorder/order-interaction.ts +75 -0
- package/src/response-limits.ts +47 -0
- package/src/styles/base-styles.ts +117 -0
- package/src/styles/choice-hottext-styles.ts +75 -0
- package/src/styles/control-styles.ts +113 -0
- package/src/styles/drawing-styles.ts +29 -0
- package/src/styles/gap-match-styles.ts +32 -0
- package/src/styles/graphic-styles.ts +294 -0
- package/src/styles/match-pair-styles.ts +61 -0
- package/src/styles/text-slider-styles.ts +34 -0
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
export interface QtiPlayerRemoveMessageParams {
|
|
2
|
+
label: string;
|
|
3
|
+
}
|
|
4
|
+
export interface QtiPlayerAssociationPairLabelParams {
|
|
5
|
+
source: string;
|
|
6
|
+
target: string;
|
|
7
|
+
}
|
|
8
|
+
export type QtiPlayerMovementDirection = "up" | "down" | "left" | "right";
|
|
9
|
+
export interface QtiPlayerMessages {
|
|
10
|
+
remove: () => string;
|
|
11
|
+
removePair: (params: QtiPlayerRemoveMessageParams) => string;
|
|
12
|
+
clearDrawing: () => string;
|
|
13
|
+
clearPoints: () => string;
|
|
14
|
+
endAttempt: () => string;
|
|
15
|
+
uploadResponse: () => string;
|
|
16
|
+
movableObject: () => string;
|
|
17
|
+
placeObject: () => string;
|
|
18
|
+
inlineChoicePrompt: () => string;
|
|
19
|
+
noPointSelected: () => string;
|
|
20
|
+
noRegionSelected: () => string;
|
|
21
|
+
noAssociationsMade: () => string;
|
|
22
|
+
associationsMade: (params: {
|
|
23
|
+
count: number;
|
|
24
|
+
}) => string;
|
|
25
|
+
associationPairLabel: (params: QtiPlayerAssociationPairLabelParams) => string;
|
|
26
|
+
hotspotSelectedChooseAnother: (params: {
|
|
27
|
+
label: string;
|
|
28
|
+
}) => string;
|
|
29
|
+
moveChoice: (params: {
|
|
30
|
+
label: string;
|
|
31
|
+
direction: QtiPlayerMovementDirection;
|
|
32
|
+
}) => string;
|
|
33
|
+
movePoint: (params: {
|
|
34
|
+
direction: QtiPlayerMovementDirection;
|
|
35
|
+
}) => string;
|
|
36
|
+
moveObject: (params: {
|
|
37
|
+
direction: QtiPlayerMovementDirection;
|
|
38
|
+
}) => string;
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=player-messages.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"player-messages.d.ts","sourceRoot":"","sources":["../src/player-messages.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,4BAA4B;IAC3C,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,mCAAmC;IAClD,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,MAAM,0BAA0B,GAAG,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAE1E,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,MAAM,CAAC;IACrB,UAAU,EAAE,CAAC,MAAM,EAAE,4BAA4B,KAAK,MAAM,CAAC;IAC7D,YAAY,EAAE,MAAM,MAAM,CAAC;IAC3B,WAAW,EAAE,MAAM,MAAM,CAAC;IAC1B,UAAU,EAAE,MAAM,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,MAAM,CAAC;IAC7B,aAAa,EAAE,MAAM,MAAM,CAAC;IAC5B,WAAW,EAAE,MAAM,MAAM,CAAC;IAC1B,kBAAkB,EAAE,MAAM,MAAM,CAAC;IACjC,eAAe,EAAE,MAAM,MAAM,CAAC;IAC9B,gBAAgB,EAAE,MAAM,MAAM,CAAC;IAC/B,kBAAkB,EAAE,MAAM,MAAM,CAAC;IACjC,gBAAgB,EAAE,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,KAAK,MAAM,CAAC;IACxD,oBAAoB,EAAE,CAAC,MAAM,EAAE,mCAAmC,KAAK,MAAM,CAAC;IAC9E,4BAA4B,EAAE,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,KAAK,MAAM,CAAC;IACpE,UAAU,EAAE,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,0BAA0B,CAAA;KAAE,KAAK,MAAM,CAAC;IACzF,SAAS,EAAE,CAAC,MAAM,EAAE;QAAE,SAAS,EAAE,0BAA0B,CAAA;KAAE,KAAK,MAAM,CAAC;IACzE,UAAU,EAAE,CAAC,MAAM,EAAE;QAAE,SAAS,EAAE,0BAA0B,CAAA;KAAE,KAAK,MAAM,CAAC;CAC3E"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"player-messages.js","sourceRoot":"","sources":["../src/player-messages.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"player-styles.d.ts","sourceRoot":"","sources":["../src/player-styles.ts"],"names":[],"mappings":"AASA,eAAO,MAAM,aAAa,QASZ,CAAC;AAEf,wBAAgB,kBAAkB,IAAI,gBAAgB,CAIrD"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { BASE_PLAYER_STYLES } from "./styles/base-styles.js";
|
|
2
|
+
import { CHOICE_HOTTEXT_PLAYER_STYLES } from "./styles/choice-hottext-styles.js";
|
|
3
|
+
import { CONTROL_PLAYER_STYLES } from "./styles/control-styles.js";
|
|
4
|
+
import { DRAWING_PLAYER_STYLES } from "./styles/drawing-styles.js";
|
|
5
|
+
import { GAP_MATCH_PLAYER_STYLES } from "./styles/gap-match-styles.js";
|
|
6
|
+
import { GRAPHIC_PLAYER_STYLES } from "./styles/graphic-styles.js";
|
|
7
|
+
import { MATCH_PAIR_PLAYER_STYLES } from "./styles/match-pair-styles.js";
|
|
8
|
+
import { TEXT_SLIDER_PLAYER_STYLES } from "./styles/text-slider-styles.js";
|
|
9
|
+
export const PLAYER_STYLES = [
|
|
10
|
+
BASE_PLAYER_STYLES,
|
|
11
|
+
CONTROL_PLAYER_STYLES,
|
|
12
|
+
MATCH_PAIR_PLAYER_STYLES,
|
|
13
|
+
GAP_MATCH_PLAYER_STYLES,
|
|
14
|
+
CHOICE_HOTTEXT_PLAYER_STYLES,
|
|
15
|
+
TEXT_SLIDER_PLAYER_STYLES,
|
|
16
|
+
DRAWING_PLAYER_STYLES,
|
|
17
|
+
GRAPHIC_PLAYER_STYLES,
|
|
18
|
+
].join("\n\n");
|
|
19
|
+
export function playerStyleElement() {
|
|
20
|
+
const style = document.createElement("style");
|
|
21
|
+
style.textContent = PLAYER_STYLES;
|
|
22
|
+
return style;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=player-styles.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"player-styles.js","sourceRoot":"","sources":["../src/player-styles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,4BAA4B,EAAE,MAAM,mCAAmC,CAAC;AACjF,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAE3E,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,kBAAkB;IAClB,qBAAqB;IACrB,wBAAwB;IACxB,uBAAuB;IACvB,4BAA4B;IAC5B,yBAAyB;IACzB,qBAAqB;IACrB,qBAAqB;CACtB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAEf,MAAM,UAAU,kBAAkB;IAChC,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IAC9C,KAAK,CAAC,WAAW,GAAG,aAAa,CAAC;IAClC,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import type { QtiAssessmentItem, QtiAttemptStateV1, QtiAttemptStatus, QtiDiagnostic, QtiInteraction, QtiPortableCustomDefinition, QtiPortableCustomStateValue, QtiScoreResult, QtiValue } from "@longsightgroup/qti3-core";
|
|
2
|
+
import type { QtiPlayerMessages } from "./player-messages.js";
|
|
3
|
+
export interface QtiPlayerSessionControl {
|
|
4
|
+
validateResponses?: boolean | undefined;
|
|
5
|
+
showFeedback?: boolean | undefined;
|
|
6
|
+
}
|
|
7
|
+
export interface QtiScoreAttemptOptions {
|
|
8
|
+
validateResponses?: boolean | undefined;
|
|
9
|
+
}
|
|
10
|
+
export type QtiPlayerFetchXml = (url: string) => Promise<string>;
|
|
11
|
+
export type QtiPlayerResolveAsset = (url: string) => string;
|
|
12
|
+
export interface QtiPlayerLoadOptions {
|
|
13
|
+
state?: QtiAttemptStateV1 | undefined;
|
|
14
|
+
status?: QtiAttemptStatus | undefined;
|
|
15
|
+
sessionControl?: QtiPlayerSessionControl | undefined;
|
|
16
|
+
fetchXml?: QtiPlayerFetchXml | undefined;
|
|
17
|
+
resolveAsset?: QtiPlayerResolveAsset | undefined;
|
|
18
|
+
}
|
|
19
|
+
export type QtiPlayerMessageOverrides = Partial<QtiPlayerMessages>;
|
|
20
|
+
export interface QtiReadyEventDetail {
|
|
21
|
+
item: QtiAssessmentItem;
|
|
22
|
+
}
|
|
23
|
+
export interface QtiStateChangeEventDetail {
|
|
24
|
+
/**
|
|
25
|
+
* Attempt snapshot. `state.validationMessages` combines load-time authoring diagnostics
|
|
26
|
+
* (unsupported interactions, missing choices, illegal embeds) with response validation
|
|
27
|
+
* messages. After `restore()`, response messages are reapplied separately from authoring
|
|
28
|
+
* diagnostics captured at `loadXml`.
|
|
29
|
+
*/
|
|
30
|
+
state: QtiAttemptStateV1;
|
|
31
|
+
}
|
|
32
|
+
export interface QtiResponseChangeEventDetail {
|
|
33
|
+
responseIdentifier: string;
|
|
34
|
+
value: QtiValue;
|
|
35
|
+
}
|
|
36
|
+
export interface QtiPortableCustomMountEventDetail {
|
|
37
|
+
responseIdentifier: string;
|
|
38
|
+
interaction: QtiInteraction;
|
|
39
|
+
definition: QtiPortableCustomDefinition;
|
|
40
|
+
host: HTMLElement;
|
|
41
|
+
value: QtiValue;
|
|
42
|
+
state?: QtiPortableCustomStateValue | undefined;
|
|
43
|
+
}
|
|
44
|
+
export type QtiScoreEventDetail = QtiScoreResult;
|
|
45
|
+
export interface QtiValidationEventDetail {
|
|
46
|
+
/** Authoring and response validation messages currently visible to the candidate. */
|
|
47
|
+
validationMessages: QtiDiagnostic[];
|
|
48
|
+
state: QtiAttemptStateV1;
|
|
49
|
+
}
|
|
50
|
+
export interface QtiSuspendEventDetail {
|
|
51
|
+
state: QtiAttemptStateV1;
|
|
52
|
+
}
|
|
53
|
+
export interface QtiEndAttemptEventDetail {
|
|
54
|
+
state: QtiAttemptStateV1;
|
|
55
|
+
}
|
|
56
|
+
export interface QtiAssessmentItemPlayerEventDetailMap {
|
|
57
|
+
"qti-ready": QtiReadyEventDetail;
|
|
58
|
+
"qti-statechange": QtiStateChangeEventDetail;
|
|
59
|
+
"qti-responsechange": QtiResponseChangeEventDetail;
|
|
60
|
+
"qti-portable-custom-mount": QtiPortableCustomMountEventDetail;
|
|
61
|
+
"qti-score": QtiScoreEventDetail;
|
|
62
|
+
"qti-validation": QtiValidationEventDetail;
|
|
63
|
+
"qti-suspend": QtiSuspendEventDetail;
|
|
64
|
+
"qti-endattempt": QtiEndAttemptEventDetail;
|
|
65
|
+
}
|
|
66
|
+
export type QtiAssessmentItemPlayerEventName = keyof QtiAssessmentItemPlayerEventDetailMap;
|
|
67
|
+
export type QtiAssessmentItemPlayerEvent<T extends QtiAssessmentItemPlayerEventName = QtiAssessmentItemPlayerEventName> = CustomEvent<QtiAssessmentItemPlayerEventDetailMap[T]>;
|
|
68
|
+
export type QtiAssessmentItemPlayerCustomEventMap = {
|
|
69
|
+
[T in QtiAssessmentItemPlayerEventName]: CustomEvent<QtiAssessmentItemPlayerEventDetailMap[T]>;
|
|
70
|
+
};
|
|
71
|
+
//# sourceMappingURL=player-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"player-types.d.ts","sourceRoot":"","sources":["../src/player-types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,EAChB,aAAa,EACb,cAAc,EACd,2BAA2B,EAC3B,2BAA2B,EAC3B,cAAc,EACd,QAAQ,EACT,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAE9D,MAAM,WAAW,uBAAuB;IACtC,iBAAiB,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACxC,YAAY,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CACpC;AAED,MAAM,WAAW,sBAAsB;IACrC,iBAAiB,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CACzC;AAED,MAAM,MAAM,iBAAiB,GAAG,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;AACjE,MAAM,MAAM,qBAAqB,GAAG,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC;AAE5D,MAAM,WAAW,oBAAoB;IACnC,KAAK,CAAC,EAAE,iBAAiB,GAAG,SAAS,CAAC;IACtC,MAAM,CAAC,EAAE,gBAAgB,GAAG,SAAS,CAAC;IACtC,cAAc,CAAC,EAAE,uBAAuB,GAAG,SAAS,CAAC;IACrD,QAAQ,CAAC,EAAE,iBAAiB,GAAG,SAAS,CAAC;IACzC,YAAY,CAAC,EAAE,qBAAqB,GAAG,SAAS,CAAC;CAClD;AAED,MAAM,MAAM,yBAAyB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;AAEnE,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,iBAAiB,CAAC;CACzB;AAED,MAAM,WAAW,yBAAyB;IACxC;;;;;OAKG;IACH,KAAK,EAAE,iBAAiB,CAAC;CAC1B;AAED,MAAM,WAAW,4BAA4B;IAC3C,kBAAkB,EAAE,MAAM,CAAC;IAC3B,KAAK,EAAE,QAAQ,CAAC;CACjB;AAED,MAAM,WAAW,iCAAiC;IAChD,kBAAkB,EAAE,MAAM,CAAC;IAC3B,WAAW,EAAE,cAAc,CAAC;IAC5B,UAAU,EAAE,2BAA2B,CAAC;IACxC,IAAI,EAAE,WAAW,CAAC;IAClB,KAAK,EAAE,QAAQ,CAAC;IAChB,KAAK,CAAC,EAAE,2BAA2B,GAAG,SAAS,CAAC;CACjD;AAED,MAAM,MAAM,mBAAmB,GAAG,cAAc,CAAC;AAEjD,MAAM,WAAW,wBAAwB;IACvC,qFAAqF;IACrF,kBAAkB,EAAE,aAAa,EAAE,CAAC;IACpC,KAAK,EAAE,iBAAiB,CAAC;CAC1B;AAED,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,iBAAiB,CAAC;CAC1B;AAED,MAAM,WAAW,wBAAwB;IACvC,KAAK,EAAE,iBAAiB,CAAC;CAC1B;AAED,MAAM,WAAW,qCAAqC;IACpD,WAAW,EAAE,mBAAmB,CAAC;IACjC,iBAAiB,EAAE,yBAAyB,CAAC;IAC7C,oBAAoB,EAAE,4BAA4B,CAAC;IACnD,2BAA2B,EAAE,iCAAiC,CAAC;IAC/D,WAAW,EAAE,mBAAmB,CAAC;IACjC,gBAAgB,EAAE,wBAAwB,CAAC;IAC3C,aAAa,EAAE,qBAAqB,CAAC;IACrC,gBAAgB,EAAE,wBAAwB,CAAC;CAC5C;AAED,MAAM,MAAM,gCAAgC,GAAG,MAAM,qCAAqC,CAAC;AAE3F,MAAM,MAAM,4BAA4B,CACtC,CAAC,SAAS,gCAAgC,GAAG,gCAAgC,IAC3E,WAAW,CAAC,qCAAqC,CAAC,CAAC,CAAC,CAAC,CAAC;AAE1D,MAAM,MAAM,qCAAqC,GAAG;KACjD,CAAC,IAAI,gCAAgC,GAAG,WAAW,CAAC,qCAAqC,CAAC,CAAC,CAAC,CAAC;CAC/F,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"player-types.js","sourceRoot":"","sources":["../src/player-types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"player-validation-dom.d.ts","sourceRoot":"","sources":["../src/player-validation-dom.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAE/D,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,aAAa,EAAE,GAAG,IAAI,CA4BxF"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export function syncValidationMessages(root, messages) {
|
|
2
|
+
const messagesByIdentifier = new Map(messages.filter((message) => message.path).map((message) => [message.path, message]));
|
|
3
|
+
for (const section of root.querySelectorAll("[data-response-identifier]")) {
|
|
4
|
+
const responseIdentifier = section.dataset.responseIdentifier;
|
|
5
|
+
if (!responseIdentifier)
|
|
6
|
+
continue;
|
|
7
|
+
const message = messagesByIdentifier.get(responseIdentifier);
|
|
8
|
+
const messageElement = section.querySelector(`[data-validation-for="${responseIdentifier}"]`);
|
|
9
|
+
const controls = section.querySelectorAll("input, select, textarea, button");
|
|
10
|
+
if (message && messageElement) {
|
|
11
|
+
messageElement.textContent = message.message;
|
|
12
|
+
messageElement.hidden = false;
|
|
13
|
+
for (const control of controls) {
|
|
14
|
+
control.setAttribute("aria-invalid", "true");
|
|
15
|
+
control.setAttribute("aria-describedby", messageElement.id);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
else if (messageElement) {
|
|
19
|
+
messageElement.textContent = "";
|
|
20
|
+
messageElement.hidden = true;
|
|
21
|
+
for (const control of controls) {
|
|
22
|
+
control.removeAttribute("aria-invalid");
|
|
23
|
+
control.removeAttribute("aria-describedby");
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=player-validation-dom.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"player-validation-dom.js","sourceRoot":"","sources":["../src/player-validation-dom.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,sBAAsB,CAAC,IAAgB,EAAE,QAAyB;IAChF,MAAM,oBAAoB,GAAG,IAAI,GAAG,CAClC,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,IAAK,EAAE,OAAO,CAAC,CAAC,CACtF,CAAC;IACF,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,gBAAgB,CAAc,4BAA4B,CAAC,EAAE,CAAC;QACvF,MAAM,kBAAkB,GAAG,OAAO,CAAC,OAAO,CAAC,kBAAkB,CAAC;QAC9D,IAAI,CAAC,kBAAkB;YAAE,SAAS;QAClC,MAAM,OAAO,GAAG,oBAAoB,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;QAC7D,MAAM,cAAc,GAAG,OAAO,CAAC,aAAa,CAC1C,yBAAyB,kBAAkB,IAAI,CAChD,CAAC;QACF,MAAM,QAAQ,GAAG,OAAO,CAAC,gBAAgB,CAAc,iCAAiC,CAAC,CAAC;QAC1F,IAAI,OAAO,IAAI,cAAc,EAAE,CAAC;YAC9B,cAAc,CAAC,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC;YAC7C,cAAc,CAAC,MAAM,GAAG,KAAK,CAAC;YAC9B,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;gBAC/B,OAAO,CAAC,YAAY,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;gBAC7C,OAAO,CAAC,YAAY,CAAC,kBAAkB,EAAE,cAAc,CAAC,EAAE,CAAC,CAAC;YAC9D,CAAC;QACH,CAAC;aAAM,IAAI,cAAc,EAAE,CAAC;YAC1B,cAAc,CAAC,WAAW,GAAG,EAAE,CAAC;YAChC,cAAc,CAAC,MAAM,GAAG,IAAI,CAAC;YAC7B,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;gBAC/B,OAAO,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC;gBACxC,OAAO,CAAC,eAAe,CAAC,kBAAkB,CAAC,CAAC;YAC9C,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { QtiAttemptStateV1, QtiDiagnostic, QtiDocument, QtiInteraction, QtiValue } from "@longsightgroup/qti3-core";
|
|
2
|
+
export declare function errorView(message: string): HTMLElement;
|
|
3
|
+
export declare function validationMessageElement(responseIdentifier: string): HTMLElement;
|
|
4
|
+
export declare function inlineValidationMessageElement(responseIdentifier: string): HTMLElement;
|
|
5
|
+
export declare function validationMessageId(responseIdentifier: string): string;
|
|
6
|
+
export declare function cloneDiagnostics(diagnostics: QtiDiagnostic[]): QtiDiagnostic[];
|
|
7
|
+
export declare function responseIsEmpty(value: QtiValue): boolean;
|
|
8
|
+
export declare function responseCount(value: QtiValue): number;
|
|
9
|
+
export declare function minimumRequiredResponses(interaction: QtiInteraction | undefined): number;
|
|
10
|
+
export declare function matchMaxDiagnostics(responseIdentifier: string, interaction: QtiInteraction, response: QtiValue): QtiDiagnostic[];
|
|
11
|
+
export declare function responseChoiceIdentifiers(response: QtiValue): string[];
|
|
12
|
+
export declare function validateItemResponses(document: QtiDocument, state: QtiAttemptStateV1): QtiDiagnostic[];
|
|
13
|
+
//# sourceMappingURL=player-validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"player-validation.d.ts","sourceRoot":"","sources":["../src/player-validation.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,iBAAiB,EACjB,aAAa,EACb,WAAW,EACX,cAAc,EACd,QAAQ,EACT,MAAM,2BAA2B,CAAC;AAQnC,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,CAKtD;AAED,wBAAgB,wBAAwB,CAAC,kBAAkB,EAAE,MAAM,GAAG,WAAW,CAOhF;AAED,wBAAgB,8BAA8B,CAAC,kBAAkB,EAAE,MAAM,GAAG,WAAW,CAOtF;AAED,wBAAgB,mBAAmB,CAAC,kBAAkB,EAAE,MAAM,GAAG,MAAM,CAEtE;AAED,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,aAAa,EAAE,GAAG,aAAa,EAAE,CAK9E;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,QAAQ,GAAG,OAAO,CAExD;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,QAAQ,GAAG,MAAM,CAErD;AAED,wBAAgB,wBAAwB,CAAC,WAAW,EAAE,cAAc,GAAG,SAAS,GAAG,MAAM,CAQxF;AAED,wBAAgB,mBAAmB,CACjC,kBAAkB,EAAE,MAAM,EAC1B,WAAW,EAAE,cAAc,EAC3B,QAAQ,EAAE,QAAQ,GACjB,aAAa,EAAE,CAsBjB;AAED,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,EAAE,CAEtE;AAED,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,WAAW,EACrB,KAAK,EAAE,iBAAiB,GACvB,aAAa,EAAE,CAqDjB"}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { qtiValueToIdentifierList } from "@longsightgroup/qti3-core";
|
|
2
|
+
import { maximumAllowedResponses, mediaPlayCount, minimumMediaPlays, parseUnlimitedMaximum, } from "./response-limits.js";
|
|
3
|
+
export function errorView(message) {
|
|
4
|
+
const element = document.createElement("p");
|
|
5
|
+
element.role = "alert";
|
|
6
|
+
element.textContent = message;
|
|
7
|
+
return element;
|
|
8
|
+
}
|
|
9
|
+
export function validationMessageElement(responseIdentifier) {
|
|
10
|
+
const element = document.createElement("p");
|
|
11
|
+
element.id = validationMessageId(responseIdentifier);
|
|
12
|
+
element.dataset.validationFor = responseIdentifier;
|
|
13
|
+
element.hidden = true;
|
|
14
|
+
element.role = "alert";
|
|
15
|
+
return element;
|
|
16
|
+
}
|
|
17
|
+
export function inlineValidationMessageElement(responseIdentifier) {
|
|
18
|
+
const element = document.createElement("span");
|
|
19
|
+
element.id = validationMessageId(responseIdentifier);
|
|
20
|
+
element.dataset.validationFor = responseIdentifier;
|
|
21
|
+
element.hidden = true;
|
|
22
|
+
element.role = "alert";
|
|
23
|
+
return element;
|
|
24
|
+
}
|
|
25
|
+
export function validationMessageId(responseIdentifier) {
|
|
26
|
+
return `qti3-validation-${responseIdentifier}`;
|
|
27
|
+
}
|
|
28
|
+
export function cloneDiagnostics(diagnostics) {
|
|
29
|
+
return diagnostics.map((diagnostic) => ({
|
|
30
|
+
...diagnostic,
|
|
31
|
+
source: diagnostic.source ? { ...diagnostic.source } : undefined,
|
|
32
|
+
}));
|
|
33
|
+
}
|
|
34
|
+
export function responseIsEmpty(value) {
|
|
35
|
+
return value === null || value === "" || (Array.isArray(value) && value.length === 0);
|
|
36
|
+
}
|
|
37
|
+
export function responseCount(value) {
|
|
38
|
+
return responseIsEmpty(value) ? 0 : Array.isArray(value) ? value.length : 1;
|
|
39
|
+
}
|
|
40
|
+
export function minimumRequiredResponses(interaction) {
|
|
41
|
+
if (!interaction)
|
|
42
|
+
return 1;
|
|
43
|
+
if (interaction.type === "media")
|
|
44
|
+
return minimumMediaPlays(interaction);
|
|
45
|
+
const explicit = interaction.attributes["min-choices"] ?? interaction.attributes["min-associations"];
|
|
46
|
+
if (explicit === undefined)
|
|
47
|
+
return 1;
|
|
48
|
+
const parsed = Number(explicit);
|
|
49
|
+
return Number.isInteger(parsed) && parsed >= 0 ? parsed : 1;
|
|
50
|
+
}
|
|
51
|
+
export function matchMaxDiagnostics(responseIdentifier, interaction, response) {
|
|
52
|
+
const identifiers = responseChoiceIdentifiers(response);
|
|
53
|
+
if (identifiers.length === 0)
|
|
54
|
+
return [];
|
|
55
|
+
const counts = new Map();
|
|
56
|
+
for (const identifier of identifiers) {
|
|
57
|
+
counts.set(identifier, (counts.get(identifier) ?? 0) + 1);
|
|
58
|
+
}
|
|
59
|
+
const diagnostics = [];
|
|
60
|
+
for (const choice of interaction.choices) {
|
|
61
|
+
const maximum = parseUnlimitedMaximum(choice.attributes["match-max"]);
|
|
62
|
+
if (maximum === undefined)
|
|
63
|
+
continue;
|
|
64
|
+
const count = counts.get(choice.identifier) ?? 0;
|
|
65
|
+
if (count <= maximum)
|
|
66
|
+
continue;
|
|
67
|
+
diagnostics.push({
|
|
68
|
+
code: "response.matchMax",
|
|
69
|
+
severity: "error",
|
|
70
|
+
message: `${choice.text || choice.identifier} may be used at most ${maximum} time${maximum === 1 ? "" : "s"}.`,
|
|
71
|
+
path: responseIdentifier,
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
return diagnostics;
|
|
75
|
+
}
|
|
76
|
+
export function responseChoiceIdentifiers(response) {
|
|
77
|
+
return qtiValueToIdentifierList(response).flatMap((value) => value.split(/\s+/).filter(Boolean));
|
|
78
|
+
}
|
|
79
|
+
export function validateItemResponses(document, state) {
|
|
80
|
+
const interactionsByResponse = new Map(document.item.interactions
|
|
81
|
+
.filter((interaction) => interaction.responseIdentifier)
|
|
82
|
+
.map((interaction) => [interaction.responseIdentifier, interaction]));
|
|
83
|
+
const diagnostics = [];
|
|
84
|
+
for (const declaration of document.item.responseDeclarations) {
|
|
85
|
+
const interaction = interactionsByResponse.get(declaration.identifier);
|
|
86
|
+
if (declaration.correctResponse === null && interaction?.type !== "media")
|
|
87
|
+
continue;
|
|
88
|
+
const minimum = minimumRequiredResponses(interaction);
|
|
89
|
+
const count = interaction?.type === "media"
|
|
90
|
+
? mediaPlayCount(state.responses[declaration.identifier] ?? null)
|
|
91
|
+
: responseCount(state.responses[declaration.identifier] ?? null);
|
|
92
|
+
const maximum = maximumAllowedResponses(interaction);
|
|
93
|
+
if (count < minimum) {
|
|
94
|
+
diagnostics.push({
|
|
95
|
+
code: "response.required",
|
|
96
|
+
severity: "error",
|
|
97
|
+
message: interaction?.attributes["data-min-selections-message"] ??
|
|
98
|
+
(interaction?.type === "media"
|
|
99
|
+
? `${declaration.identifier} requires at least ${minimum} play${minimum === 1 ? "" : "s"}.`
|
|
100
|
+
: minimum === 1
|
|
101
|
+
? `${declaration.identifier} requires a response.`
|
|
102
|
+
: `${declaration.identifier} requires at least ${minimum} responses.`),
|
|
103
|
+
path: declaration.identifier,
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
if (maximum !== undefined && count > maximum) {
|
|
107
|
+
diagnostics.push({
|
|
108
|
+
code: "response.maximum",
|
|
109
|
+
severity: "error",
|
|
110
|
+
message: interaction?.attributes["data-max-selections-message"] ??
|
|
111
|
+
(interaction?.type === "media"
|
|
112
|
+
? `${declaration.identifier} allows at most ${maximum} play${maximum === 1 ? "" : "s"}.`
|
|
113
|
+
: `${declaration.identifier} allows at most ${maximum} response${maximum === 1 ? "" : "s"}.`),
|
|
114
|
+
path: declaration.identifier,
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
if (interaction) {
|
|
118
|
+
diagnostics.push(...matchMaxDiagnostics(declaration.identifier, interaction, state.responses[declaration.identifier] ?? null));
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
return diagnostics;
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=player-validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"player-validation.js","sourceRoot":"","sources":["../src/player-validation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { QtiInteraction, QtiPortableCustomDefinition, QtiPortableCustomStateValue, QtiValue } from "@longsightgroup/qti3-core";
|
|
2
|
+
export declare function scalarString(value: QtiValue): string;
|
|
3
|
+
export declare function portableCustomDefinitionFromAttributes(interaction: QtiInteraction): QtiPortableCustomDefinition;
|
|
4
|
+
export declare function portableCustomEventValue(event: Event): QtiValue | undefined;
|
|
5
|
+
export declare function portableCustomEventState(event: Event): QtiPortableCustomStateValue | undefined;
|
|
6
|
+
export declare function portableCustomEventValidity(event: Event): {
|
|
7
|
+
valid: boolean;
|
|
8
|
+
message?: string | undefined;
|
|
9
|
+
} | undefined;
|
|
10
|
+
export declare function isPortableCustomStateValue(value: unknown): value is QtiPortableCustomStateValue;
|
|
11
|
+
//# sourceMappingURL=portable-custom-support.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"portable-custom-support.d.ts","sourceRoot":"","sources":["../src/portable-custom-support.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,2BAA2B,EAC3B,2BAA2B,EAC3B,QAAQ,EACT,MAAM,2BAA2B,CAAC;AAEnC,wBAAgB,YAAY,CAAC,KAAK,EAAE,QAAQ,GAAG,MAAM,CAGpD;AAED,wBAAgB,sCAAsC,CACpD,WAAW,EAAE,cAAc,GAC1B,2BAA2B,CAe7B;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,KAAK,GAAG,QAAQ,GAAG,SAAS,CAU3E;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,KAAK,GAAG,2BAA2B,GAAG,SAAS,CAK9F;AAED,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,KAAK,GACX;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,GAAG,SAAS,CAU9D;AAED,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,2BAA2B,CAS/F"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
export function scalarString(value) {
|
|
2
|
+
if (value === null || Array.isArray(value) || typeof value === "object")
|
|
3
|
+
return "";
|
|
4
|
+
return String(value);
|
|
5
|
+
}
|
|
6
|
+
export function portableCustomDefinitionFromAttributes(interaction) {
|
|
7
|
+
return {
|
|
8
|
+
responseIdentifier: interaction.responseIdentifier,
|
|
9
|
+
customInteractionTypeIdentifier: interaction.attributes["custom-interaction-type-identifier"],
|
|
10
|
+
module: interaction.attributes.module,
|
|
11
|
+
interactionMarkup: [],
|
|
12
|
+
templateVariables: [],
|
|
13
|
+
contextVariables: [],
|
|
14
|
+
stylesheets: [],
|
|
15
|
+
dataAttributes: Object.fromEntries(Object.entries(interaction.attributes).filter(([name]) => name.startsWith("data-"))),
|
|
16
|
+
attributes: interaction.attributes,
|
|
17
|
+
source: interaction.source,
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
export function portableCustomEventValue(event) {
|
|
21
|
+
if (!("detail" in event))
|
|
22
|
+
return undefined;
|
|
23
|
+
const detail = event.detail;
|
|
24
|
+
if (detail === undefined)
|
|
25
|
+
return undefined;
|
|
26
|
+
if (typeof detail === "object" && detail !== null && !Array.isArray(detail)) {
|
|
27
|
+
if ("value" in detail)
|
|
28
|
+
return detail.value ?? null;
|
|
29
|
+
if ("response" in detail)
|
|
30
|
+
return detail.response ?? null;
|
|
31
|
+
if ("state" in detail || "valid" in detail)
|
|
32
|
+
return undefined;
|
|
33
|
+
}
|
|
34
|
+
return detail;
|
|
35
|
+
}
|
|
36
|
+
export function portableCustomEventState(event) {
|
|
37
|
+
if (!("detail" in event))
|
|
38
|
+
return undefined;
|
|
39
|
+
const detail = event.detail;
|
|
40
|
+
if (typeof detail !== "object" || detail === null || !("state" in detail))
|
|
41
|
+
return undefined;
|
|
42
|
+
return isPortableCustomStateValue(detail.state) ? detail.state : undefined;
|
|
43
|
+
}
|
|
44
|
+
export function portableCustomEventValidity(event) {
|
|
45
|
+
if (!("detail" in event))
|
|
46
|
+
return undefined;
|
|
47
|
+
const detail = event.detail;
|
|
48
|
+
if (typeof detail !== "object" || detail === null || typeof detail.valid !== "boolean") {
|
|
49
|
+
return undefined;
|
|
50
|
+
}
|
|
51
|
+
return {
|
|
52
|
+
valid: detail.valid,
|
|
53
|
+
message: typeof detail.message === "string" ? detail.message : undefined,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
export function isPortableCustomStateValue(value) {
|
|
57
|
+
if (value === null)
|
|
58
|
+
return true;
|
|
59
|
+
if (typeof value === "string" || typeof value === "boolean")
|
|
60
|
+
return true;
|
|
61
|
+
if (typeof value === "number")
|
|
62
|
+
return Number.isFinite(value);
|
|
63
|
+
if (Array.isArray(value))
|
|
64
|
+
return value.every(isPortableCustomStateValue);
|
|
65
|
+
if (typeof value === "object") {
|
|
66
|
+
return Object.values(value).every(isPortableCustomStateValue);
|
|
67
|
+
}
|
|
68
|
+
return false;
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=portable-custom-support.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"portable-custom-support.js","sourceRoot":"","sources":["../src/portable-custom-support.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { QtiChoice, QtiInteraction, QtiValue } from "@longsightgroup/qti3-core";
|
|
2
|
+
export declare function maximumAllowedResponses(interaction: QtiInteraction | undefined): number | undefined;
|
|
3
|
+
declare function maximumMediaPlays(interaction: QtiInteraction): number | undefined;
|
|
4
|
+
export declare function minimumMediaPlays(interaction: QtiInteraction): number;
|
|
5
|
+
export { maximumMediaPlays };
|
|
6
|
+
export declare function mediaPlayCount(value: QtiValue): number;
|
|
7
|
+
export declare function exceedsHotspotMatchMax(choice: QtiChoice, selectedPairs: string[]): boolean;
|
|
8
|
+
export declare function parseUnlimitedMaximum(value: string | undefined): number | undefined;
|
|
9
|
+
//# sourceMappingURL=response-limits.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"response-limits.d.ts","sourceRoot":"","sources":["../src/response-limits.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAErF,wBAAgB,uBAAuB,CACrC,WAAW,EAAE,cAAc,GAAG,SAAS,GACtC,MAAM,GAAG,SAAS,CASpB;AAED,iBAAS,iBAAiB,CAAC,WAAW,EAAE,cAAc,GAAG,MAAM,GAAG,SAAS,CAG1E;AAED,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,cAAc,GAAG,MAAM,CAGrE;AAED,OAAO,EAAE,iBAAiB,EAAE,CAAC;AAE7B,wBAAgB,cAAc,CAAC,KAAK,EAAE,QAAQ,GAAG,MAAM,CAGtD;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,EAAE,GAAG,OAAO,CAO1F;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAKnF"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
export function maximumAllowedResponses(interaction) {
|
|
2
|
+
if (!interaction)
|
|
3
|
+
return undefined;
|
|
4
|
+
if (interaction.type === "media")
|
|
5
|
+
return maximumMediaPlays(interaction);
|
|
6
|
+
const explicit = interaction.attributes["max-choices"] ?? interaction.attributes["max-associations"];
|
|
7
|
+
if (explicit === undefined)
|
|
8
|
+
return undefined;
|
|
9
|
+
const parsed = Number(explicit);
|
|
10
|
+
if (!Number.isInteger(parsed) || parsed <= 0)
|
|
11
|
+
return undefined;
|
|
12
|
+
return parsed;
|
|
13
|
+
}
|
|
14
|
+
function maximumMediaPlays(interaction) {
|
|
15
|
+
const parsed = Number(interaction.attributes["max-plays"] ?? "0");
|
|
16
|
+
return Number.isInteger(parsed) && parsed > 0 ? parsed : undefined;
|
|
17
|
+
}
|
|
18
|
+
export function minimumMediaPlays(interaction) {
|
|
19
|
+
const parsed = Number(interaction.attributes["min-plays"] ?? "0");
|
|
20
|
+
return Number.isInteger(parsed) && parsed >= 0 ? parsed : 0;
|
|
21
|
+
}
|
|
22
|
+
export { maximumMediaPlays };
|
|
23
|
+
export function mediaPlayCount(value) {
|
|
24
|
+
const parsed = typeof value === "number" ? value : typeof value === "string" ? Number(value) : 0;
|
|
25
|
+
return Number.isInteger(parsed) && parsed > 0 ? parsed : 0;
|
|
26
|
+
}
|
|
27
|
+
export function exceedsHotspotMatchMax(choice, selectedPairs) {
|
|
28
|
+
const maximum = parseUnlimitedMaximum(choice.attributes["match-max"]);
|
|
29
|
+
if (maximum === undefined)
|
|
30
|
+
return false;
|
|
31
|
+
const currentUseCount = selectedPairs
|
|
32
|
+
.flatMap((pair) => pair.split(" "))
|
|
33
|
+
.filter((identifier) => identifier === choice.identifier).length;
|
|
34
|
+
return currentUseCount + 1 > maximum;
|
|
35
|
+
}
|
|
36
|
+
export function parseUnlimitedMaximum(value) {
|
|
37
|
+
if (value === undefined)
|
|
38
|
+
return undefined;
|
|
39
|
+
const parsed = Number(value);
|
|
40
|
+
if (!Number.isInteger(parsed) || parsed <= 0)
|
|
41
|
+
return undefined;
|
|
42
|
+
return parsed;
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=response-limits.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"response-limits.js","sourceRoot":"","sources":["../src/response-limits.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,uBAAuB,CACrC,WAAuC;IAEvC,IAAI,CAAC,WAAW;QAAE,OAAO,SAAS,CAAC;IACnC,IAAI,WAAW,CAAC,IAAI,KAAK,OAAO;QAAE,OAAO,iBAAiB,CAAC,WAAW,CAAC,CAAC;IACxE,MAAM,QAAQ,GACZ,WAAW,CAAC,UAAU,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,UAAU,CAAC,kBAAkB,CAAC,CAAC;IACtF,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC7C,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;IAChC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,MAAM,IAAI,CAAC;QAAE,OAAO,SAAS,CAAC;IAC/D,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,iBAAiB,CAAC,WAA2B;IACpD,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,GAAG,CAAC,CAAC;IAClE,OAAO,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;AACrE,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,WAA2B;IAC3D,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,GAAG,CAAC,CAAC;IAClE,OAAO,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;AAC9D,CAAC;AAED,OAAO,EAAE,iBAAiB,EAAE,CAAC;AAE7B,MAAM,UAAU,cAAc,CAAC,KAAe;IAC5C,MAAM,MAAM,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACjG,OAAO,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;AAC7D,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,MAAiB,EAAE,aAAuB;IAC/E,MAAM,OAAO,GAAG,qBAAqB,CAAC,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC;IACtE,IAAI,OAAO,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IACxC,MAAM,eAAe,GAAG,aAAa;SAClC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;SAClC,MAAM,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,KAAK,MAAM,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC;IACnE,OAAO,eAAe,GAAG,CAAC,GAAG,OAAO,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,KAAyB;IAC7D,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC1C,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC7B,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,MAAM,IAAI,CAAC;QAAE,OAAO,SAAS,CAAC;IAC/D,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@longsightgroup/qti3-player",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0",
|
|
4
4
|
"description": "Style-neutral web component player for rendering and scoring QTI 3 assessment items.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"assessment",
|
|
@@ -36,7 +36,7 @@
|
|
|
36
36
|
"type": "module",
|
|
37
37
|
"exports": {
|
|
38
38
|
".": {
|
|
39
|
-
"types": "./
|
|
39
|
+
"types": "./src/index.ts",
|
|
40
40
|
"import": "./dist/index.js"
|
|
41
41
|
}
|
|
42
42
|
},
|
|
@@ -45,8 +45,8 @@
|
|
|
45
45
|
"registry": "https://registry.npmjs.org"
|
|
46
46
|
},
|
|
47
47
|
"dependencies": {
|
|
48
|
-
"@longsightgroup/qti3-core": "0.
|
|
49
|
-
"@longsightgroup/qti3-fixtures": "0.
|
|
48
|
+
"@longsightgroup/qti3-core": "0.4.0",
|
|
49
|
+
"@longsightgroup/qti3-fixtures": "0.4.0"
|
|
50
50
|
},
|
|
51
51
|
"scripts": {}
|
|
52
52
|
}
|