diff --git a/package-lock.json b/package-lock.json index 869bf0ef32c38fd10a852cb361ab40a225e2046c..16b0801ba76e71f7c526a9427f43f2841a4f2aca 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17,7 +17,7 @@ "@angular/platform-browser": "^17.3.9", "@angular/platform-browser-dynamic": "^17.3.9", "@angular/router": "^17.3.9", - "@iqb/responses": "^0.20.0", + "@iqb/responses": "^2.1.5", "@ngx-translate/core": "^15.0.0", "@ngx-translate/http-loader": "^8.0.0", "@tiptap/core": "^2.4.0", @@ -3132,9 +3132,12 @@ } }, "node_modules/@iqb/responses": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@iqb/responses/-/responses-0.20.0.tgz", - "integrity": "sha512-l9TL86H5MUDa2Jm0TRb0r2xRtuz0joKGHMXdVJHTdnsXVOXNOgRLi0XAKvInIHytOlm8Ew9Txy99+fdCcgm+BA==" + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@iqb/responses/-/responses-2.1.5.tgz", + "integrity": "sha512-ZKv4wtX0ORjUJFHxH3nN+a0OVgCvC7raqmwCmSDNQGYGkhB4HlzQSoCg1WFzG2tQchVaB+GEWuFkfjm0ZGDT8w==", + "dependencies": { + "mathjs": "^12.4.2" + } }, "node_modules/@isaacs/cliui": { "version": "8.0.2", @@ -7078,6 +7081,18 @@ "node": ">=4.0.0" } }, + "node_modules/complex.js": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/complex.js/-/complex.js-2.1.1.tgz", + "integrity": "sha512-8njCHOTtFFLtegk6zQo0kkVX1rngygb/KQI6z1qZxlFI3scluC+LVTCFbrkWjBv4vvLlbQ9t88IPMC6k95VTTg==", + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://www.patreon.com/infusion" + } + }, "node_modules/compressible": { "version": "2.0.18", "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", @@ -7764,6 +7779,11 @@ } } }, + "node_modules/decimal.js": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", + "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==" + }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -8412,6 +8432,11 @@ "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", "dev": true }, + "node_modules/escape-latex": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/escape-latex/-/escape-latex-1.2.0.tgz", + "integrity": "sha512-nV5aVWW1K0wEiUIEdZ4erkGGH8mDxGyxSeqPzRNtWP7ataw+/olFObw7hujFWlVjNsaDFw5VZ5NzVSIqRgfTiw==" + }, "node_modules/escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", @@ -11167,6 +11192,11 @@ "integrity": "sha512-2oIUMGn00FdUiqz6epiiJr7xcFyNYj3rDcfmnzfkBnHyBQ3cBQUs4mmyGsOb7TTLb9kxk7dBcmEmqhDKkBoDyA==", "dev": true }, + "node_modules/javascript-natural-sort": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/javascript-natural-sort/-/javascript-natural-sort-0.7.1.tgz", + "integrity": "sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw==" + }, "node_modules/jest-worker": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", @@ -12097,6 +12127,51 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, + "node_modules/mathjs": { + "version": "12.4.2", + "resolved": "https://registry.npmjs.org/mathjs/-/mathjs-12.4.2.tgz", + "integrity": "sha512-lW14EzwAFgbNN7AZikxplmhs7wiXDhMphBOGCA3KS6T29ECEkHJsBtbEW5cnCz7sXtl4nDyvTdR+DqVsZyiiEw==", + "dependencies": { + "@babel/runtime": "^7.24.4", + "complex.js": "^2.1.1", + "decimal.js": "^10.4.3", + "escape-latex": "^1.2.0", + "fraction.js": "4.3.4", + "javascript-natural-sort": "^0.7.1", + "seedrandom": "^3.0.5", + "tiny-emitter": "^2.1.0", + "typed-function": "^4.1.1" + }, + "bin": { + "mathjs": "bin/cli.js" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/mathjs/node_modules/@babel/runtime": { + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.5.tgz", + "integrity": "sha512-Nms86NXrsaeU9vbBJKni6gXiEXZ4CVpYVzEjDH9Sb8vmZ3UljyA1GSOJl/6LGPO8EHLuSF9H+IxNXHPX8QHJ4g==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/mathjs/node_modules/fraction.js": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.4.tgz", + "integrity": "sha512-pwiTgt0Q7t+GHZA4yaLjObx4vXmmdcS0iSJ19o8d/goUGgItX9UZWKWNnLHehxviD8wU2IWRsnR8cD5+yOJP2Q==", + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" + } + }, "node_modules/mathlive": { "version": "0.84.0", "resolved": "https://registry.npmjs.org/mathlive/-/mathlive-0.84.0.tgz", @@ -14720,6 +14795,11 @@ "url": "https://opencollective.com/webpack" } }, + "node_modules/seedrandom": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-3.0.5.tgz", + "integrity": "sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==" + }, "node_modules/select-hose": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", @@ -15836,6 +15916,11 @@ "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", "dev": true }, + "node_modules/tiny-emitter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz", + "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==" + }, "node_modules/tippy.js": { "version": "6.3.7", "resolved": "https://registry.npmjs.org/tippy.js/-/tippy.js-6.3.7.tgz", @@ -16063,6 +16148,14 @@ "integrity": "sha512-KNNZtayBCtmnNmbo5mG47p1XsCyrx6iVqomjcZnec/1Y5GGARaxPs6r49RnSPeUP3YjNYiU9sQHAtY4BBvnZwg==", "dev": true }, + "node_modules/typed-function": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/typed-function/-/typed-function-4.1.1.tgz", + "integrity": "sha512-Pq1DVubcvibmm8bYcMowjVnnMwPVMeh0DIdA8ad8NZY2sJgapANJmiigSUwlt+EgXxpfIv8MWrQXTIzkfYZLYQ==", + "engines": { + "node": ">= 14" + } + }, "node_modules/typescript": { "version": "5.4.5", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", diff --git a/package.json b/package.json index a794422c2bfe802a63fd22431213f3caeaba73f2..8c53d398f7a2e6d107b396277f7db0db286ba196 100644 --- a/package.json +++ b/package.json @@ -68,7 +68,7 @@ "@angular/platform-browser": "^17.3.9", "@angular/platform-browser-dynamic": "^17.3.9", "@angular/router": "^17.3.9", - "@iqb/responses": "^0.20.0", + "@iqb/responses": "^2.1.5", "@ngx-translate/core": "^15.0.0", "@ngx-translate/http-loader": "^8.0.0", "@tiptap/core": "^2.4.0", diff --git a/projects/player/modules/verona/models/verona.ts b/projects/player/modules/verona/models/verona.ts index 3103d6d6ebc5404793e932694b846c64acef5386..d71ffe49c82326eb6c2fbbb260c1263f2ba8027f 100644 --- a/projects/player/modules/verona/models/verona.ts +++ b/projects/player/modules/verona/models/verona.ts @@ -4,8 +4,8 @@ export type NavigationTarget = 'first' | 'last' | 'previous' | 'next' | 'end'; export type Progress = 'none' | 'some' | 'complete'; export type PagingMode = 'separate' | 'buttons' | 'concat-scroll' | 'concat-scroll-snap'; export enum ElementCodeStatusValue { - UNSET = 0, NOT_REACHED = 1, DISPLAYED = 2, VALUE_CHANGED = 3, VALUE_DERIVED = 4, SOURCE_MISSING = 5, - DERIVE_ERROR = 6, CODING_COMPLETE = 7, NO_CODING = 8, CODING_INCOMPLETE = 9, CODING_ERROR = 10 + UNSET = 0, NOT_REACHED = 1, DISPLAYED = 2, VALUE_CHANGED = 3, INVALID = 4, + DERIVE_ERROR = 5, CODING_COMPLETE = 6, NO_CODING = 7, CODING_INCOMPLETE = 8, CODING_ERROR = 9 } export interface StatusChangeElement { diff --git a/projects/player/src/app/components/elements/compound-group-element/compound-group-element.component.ts b/projects/player/src/app/components/elements/compound-group-element/compound-group-element.component.ts index 419cb348b1ed6c92b59eec1d732049853d5b5c0d..819e2ad1bea9393ca4d71469f1077167d8ae9ec4 100644 --- a/projects/player/src/app/components/elements/compound-group-element/compound-group-element.component.ts +++ b/projects/player/src/app/components/elements/compound-group-element/compound-group-element.component.ts @@ -9,9 +9,7 @@ import { } from 'common/components/compound-elements/cloze/cloze-child-elements/text-field-simple.component'; import { ClozeElement } from 'common/models/elements/compound-elements/cloze/cloze'; import { LikertElement } from 'common/models/elements/compound-elements/likert/likert'; -import { - CompoundElement, InputElement, InputElementValue -} from 'common/models/elements/element'; +import { CompoundElement, InputElement } from 'common/models/elements/element'; import { ButtonComponent } from 'common/components/button/button.component'; import { VeronaPostService } from 'player/modules/verona/services/verona-post.service'; import { NavigationService } from 'player/src/app/services/navigation.service'; @@ -20,6 +18,7 @@ import { UnitNavParam } from 'common/models/elements/button/button'; import { StateVariableStateService } from 'player/src/app/services/state-variable-state.service'; import { Subscription } from 'rxjs'; import { TextInputGroupDirective } from 'player/src/app/directives/text-input-group.directive'; +import { ResponseValueType } from '@iqb/responses'; import { UnitStateService } from '../../../services/unit-state.service'; import { ElementModelElementCodeMappingService } from '../../../services/element-model-element-code-mapping.service'; import { ValidationService } from '../../../services/validation.service'; @@ -75,7 +74,7 @@ export class CompoundGroupElementComponent extends TextInputGroupDirective imple registerCompoundChildren(children: ElementComponent[]): void { children.forEach(child => { const childModel = child.elementModel as InputElement; - const initialValue: InputElementValue = childModel.type === 'button' ? + const initialValue: ResponseValueType = childModel.type === 'button' ? null : ElementModelElementCodeMappingService.mapToElementCodeValue(childModel.value, childModel.type); this.registerAtUnitStateService(childModel.id, initialValue, child, this.pageIndex); diff --git a/projects/player/src/app/services/element-model-element-code-mapping.service.ts b/projects/player/src/app/services/element-model-element-code-mapping.service.ts index acd310d4454834276bcf76adbf62deef6eaa484d..750e11f8b2a54eb83cf358e273dd3a8a7a537299 100644 --- a/projects/player/src/app/services/element-model-element-code-mapping.service.ts +++ b/projects/player/src/app/services/element-model-element-code-mapping.service.ts @@ -70,9 +70,11 @@ export class ElementModelElementCodeMappingService { return elementCodeValue !== undefined && elementCodeValue !== null ? elementCodeValue as number - 1 : (elementModel as InputElement).value; case 'geometry': - return elementCodeValue !== undefined ? elementCodeValue : (elementModel as GeometryElement).appDefinition; + return elementCodeValue !== undefined ? + elementCodeValue as string : (elementModel as GeometryElement).appDefinition; default: - return elementCodeValue !== undefined ? elementCodeValue : (elementModel as InputElement).value; + return elementCodeValue !== undefined ? + elementCodeValue as InputElementValue : (elementModel as InputElement).value; } }