@media-quest/builder 0.0.38 → 0.0.40

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/dist/public-api.d.ts +82 -99
  2. package/dist/public-api.js +36 -101
  3. package/dist/public-api.js.map +1 -1
  4. package/package.json +29 -29
  5. package/src/{theme → ARKIV}/button-bar/button-text-utils.ts +233 -233
  6. package/src/{theme → ARKIV}/button-bar/text-utils.spec.ts +105 -105
  7. package/src/Builder-option.ts +78 -62
  8. package/src/Builder-question.ts +98 -98
  9. package/src/Builder-schema.spec.ts +348 -348
  10. package/src/Builder-schema.ts +308 -306
  11. package/src/builder-compiler.ts +14 -20
  12. package/src/code-book/codebook-variable.ts +27 -27
  13. package/src/code-book/codebook.ts +89 -89
  14. package/src/media-files.ts +28 -32
  15. package/src/page/Builder-page-collection.spec.ts +219 -219
  16. package/src/page/Builder-page-collection.ts +129 -129
  17. package/src/page/Builder-page.spec.ts +177 -177
  18. package/src/page/Builder-page.ts +250 -250
  19. package/src/primitives/ID.ts +135 -135
  20. package/src/public-api.ts +29 -30
  21. package/src/rulebuilder/RuleAction.ts +105 -105
  22. package/src/schema-config.ts +25 -26
  23. package/src/sum-score/sum-score-variable-collection.spec.ts +68 -68
  24. package/src/sum-score/sum-score-variable-collection.ts +101 -101
  25. package/src/sum-score/sum-score-variable.ts +0 -1
  26. package/src/sum-score/sum-score.ts +166 -167
  27. package/src/tag/BuilderTag.ts +45 -45
  28. package/src/tag/Tag-Collection.ts +53 -53
  29. package/src/theme/Default-theme.ts +173 -188
  30. package/src/theme/IDefault-theme.ts +125 -125
  31. package/src/theme/ThemeCompiler.ts +10 -11
  32. package/src/theme/default-theme-compiler.spec.ts +31 -31
  33. package/src/theme/default-theme-compiler.ts +655 -652
  34. package/src/theme/icon-urls.ts +29 -29
  35. package/src/theme/icons.ts +117 -117
  36. package/src/theme/theme-utils.spec.ts +52 -52
  37. package/src/theme/theme-utils.ts +56 -56
  38. package/src/theme/theme2.ts +388 -386
  39. package/tsconfig.json +19 -19
  40. package/src/Builder-schema-dto.spec.ts +0 -155
  41. package/src/Builder-schema-dto.ts +0 -86
@@ -1,167 +1,166 @@
1
- import { SumScoreVariableDto } from "./sum-score-variable";
2
- import { SumScoreVariableID } from "../primitives/ID";
3
- import { SumScoreAnswer } from "./sum-score-answer";
4
- import { CodeBook } from "../code-book/codebook";
5
-
6
- import { BuilderSchemaDto } from "../Builder-schema-dto";
7
-
8
- /**
9
- *
10
- * A constant Array that contains all legal
11
- */
12
- const ALLOWED_VALUES = [0, 1, 2, 3, 4, 5, 6, 7, 8];
13
- const isAllowedValue = (num: number) => {
14
- const notNegative = num >= 0;
15
- const lessThanNine = num < 9;
16
- return notNegative && lessThanNine;
17
- };
18
-
19
- type BasedOnEntry =
20
- | { kind: "missing"; varId: string }
21
- | { kind: "invalid-variable"; varId: string; message: string }
22
- | { kind: "has-value"; varId: string; value: number; weight: number; varLabel: string };
23
-
24
- export interface SumScore {
25
- readonly sumScoreVariableId: SumScoreVariableID;
26
- readonly name: string;
27
- readonly description: string;
28
- sumScore: number;
29
- avg: number; // Alle besvarte spørsmål som ikke er 9.
30
- useAvg: boolean;
31
- includedAnswerCount: number;
32
- missingAnswerCount: number;
33
- skippedBy9Count: number; // Antall vetikke / hopp over
34
- basedOn: Array<{ varId: string; value: number; weight: number; varLabel: string }>;
35
- errorMessages: string[];
36
- }
37
-
38
- const calculateAll = (
39
- schemaDto: BuilderSchemaDto,
40
- answers: Array<SumScoreAnswer>,
41
- ): ReadonlyArray<SumScore> => {
42
- const vs = schemaDto.sumScoreVariables ?? [];
43
-
44
- const basedOnMap = new Map<SumScoreVariableID, Array<{ varId: string; weight: number }>>();
45
- const codeBook = CodeBook.fromSchema(schemaDto);
46
- // codeBook.pageVariables.find(v => v.pageId === )
47
- const pages = schemaDto.pages;
48
- // const a: Array<{pageId: PageID, sumScoreVariableId: SumScoreVariableID, weight: number, varId: string}> = []
49
-
50
- pages.forEach((page) => {
51
- page.includedInSumScores.forEach((includedInScores) => {
52
- const variableId = includedInScores.sumScoreVariableId;
53
- const weight = includedInScores.weight;
54
- const p = codeBook.pageVariables.find((v) => v.pageId === page.id);
55
- if (p) {
56
- const currentBasedOnArray = basedOnMap.get(variableId) ?? [];
57
- currentBasedOnArray.push({ varId: p.varId, weight });
58
- basedOnMap.set(variableId, currentBasedOnArray);
59
- } else {
60
- // TODO - Global event-bus for errors?
61
- console.error("INVALID DATA in calculate all sum-scores.");
62
- // throw Error("Invalid data...");
63
- }
64
- });
65
- });
66
- // const pages = Array.isArray(schemaDto.pages) ? schemaDto.pages : [];
67
- const results: ReadonlyArray<SumScore> = vs.map((v) => {
68
- const basedOn = basedOnMap.get(v.id) ?? [];
69
- return calculate(v, basedOn, answers);
70
- });
71
-
72
- return results;
73
- };
74
- const calculate = (
75
- sumScoreVariable: SumScoreVariableDto,
76
- basedOnVariables: Array<{ varId: string; weight: number }>,
77
- answers: Array<SumScoreAnswer>,
78
- ): SumScore => {
79
- const legalValues: Array<number> = [...ALLOWED_VALUES];
80
- // CALCULATE THESE!!
81
- let includedAnswerCount = 0;
82
- let skippedBy9Count = 0;
83
- let missingAnswerCount = 0;
84
- let sumScore = 0;
85
- const errorMessages: string[] = [];
86
- const basedOn: SumScore["basedOn"] = [];
87
- const useAvg = sumScoreVariable.useAvg;
88
- const basedOnEntries: BasedOnEntry[] = basedOnVariables.map((scv) => {
89
- const maybeAnswer = answers.find((v) => v.varId === scv.varId);
90
- let result: BasedOnEntry = { kind: "missing", varId: scv.varId };
91
- if (!maybeAnswer) {
92
- return result;
93
- }
94
-
95
- const value = maybeAnswer.value;
96
- const varLabel = maybeAnswer.varLabel;
97
- const weight = scv.weight ?? 1;
98
- const varId = maybeAnswer.varId;
99
-
100
- result = {
101
- kind: "has-value",
102
- varId,
103
- weight,
104
- value,
105
- varLabel,
106
- };
107
-
108
- return result;
109
- });
110
-
111
- basedOnEntries.forEach((entry) => {
112
- if (entry.kind === "missing") {
113
- missingAnswerCount++;
114
- }
115
- if (entry.kind === "has-value") {
116
- const { varId, varLabel, weight, value } = { ...entry };
117
- const isAllowed = isAllowedValue(value);
118
- if (isAllowed) {
119
- basedOn.push({ varId, weight, value, varLabel });
120
- sumScore += entry.value * entry.weight;
121
- includedAnswerCount++;
122
- }
123
- if (value === 9) {
124
- skippedBy9Count++;
125
- basedOn.push({ varId, weight, value, varLabel });
126
- }
127
- }
128
- if (entry.kind === "invalid-variable") {
129
- errorMessages.push(entry.message);
130
- }
131
- });
132
-
133
- const avg = sumScore / includedAnswerCount;
134
- const result: SumScore = {
135
- sumScoreVariableId: sumScoreVariable.id,
136
- name: sumScoreVariable.name,
137
- description: sumScoreVariable.description,
138
- avg,
139
- useAvg,
140
- includedAnswerCount,
141
- skippedBy9Count,
142
- sumScore,
143
- basedOn,
144
- missingAnswerCount,
145
- errorMessages,
146
- };
147
- // Calculate avg
148
-
149
- return result;
150
- };
151
- const createVariable = (): SumScoreVariableDto => {
152
- const id = SumScoreVariableID.create();
153
- return {
154
- id,
155
- name: "",
156
- useAvg: true,
157
- description: "",
158
- // basedOn: [],
159
- };
160
- };
161
- export const SumScore = {
162
- ALLOWED_VALUES,
163
- calculate,
164
- calculateAll,
165
- isAllowedValue,
166
- createVariable,
167
- };
1
+ import { SumScoreVariableDto } from "./sum-score-variable";
2
+ import { SumScoreVariableID } from "../primitives/ID";
3
+ import { SumScoreAnswer } from "./sum-score-answer";
4
+ import { CodeBook } from "../code-book/codebook";
5
+ import { BuilderSchemaDto } from "../Builder-schema";
6
+
7
+ /**
8
+ *
9
+ * A constant Array that contains all legal
10
+ */
11
+ const ALLOWED_VALUES = [0, 1, 2, 3, 4, 5, 6, 7, 8];
12
+ const isAllowedValue = (num: number) => {
13
+ const notNegative = num >= 0;
14
+ const lessThanNine = num < 9;
15
+ return notNegative && lessThanNine;
16
+ };
17
+
18
+ type BasedOnEntry =
19
+ | { kind: "missing"; varId: string }
20
+ | { kind: "invalid-variable"; varId: string; message: string }
21
+ | { kind: "has-value"; varId: string; value: number; weight: number; varLabel: string };
22
+
23
+ export interface SumScore {
24
+ readonly sumScoreVariableId: SumScoreVariableID;
25
+ readonly name: string;
26
+ readonly description: string;
27
+ sumScore: number;
28
+ avg: number; // Alle besvarte spørsmål som ikke er 9.
29
+ useAvg: boolean;
30
+ includedAnswerCount: number;
31
+ missingAnswerCount: number;
32
+ skippedBy9Count: number; // Antall vetikke / hopp over
33
+ basedOn: Array<{ varId: string; value: number; weight: number; varLabel: string }>;
34
+ errorMessages: string[];
35
+ }
36
+
37
+ const calculateAll = (
38
+ schemaDto: BuilderSchemaDto,
39
+ answers: Array<SumScoreAnswer>,
40
+ ): ReadonlyArray<SumScore> => {
41
+ const vs = schemaDto.sumScoreVariables ?? [];
42
+
43
+ const basedOnMap = new Map<SumScoreVariableID, Array<{ varId: string; weight: number }>>();
44
+ const codeBook = CodeBook.fromSchema(schemaDto);
45
+ // codeBook.pageVariables.find(v => v.pageId === )
46
+ const pages = schemaDto.pages;
47
+ // const a: Array<{pageId: PageID, sumScoreVariableId: SumScoreVariableID, weight: number, varId: string}> = []
48
+
49
+ pages.forEach((page) => {
50
+ page.includedInSumScores.forEach((includedInScores) => {
51
+ const variableId = includedInScores.sumScoreVariableId;
52
+ const weight = includedInScores.weight;
53
+ const p = codeBook.pageVariables.find((v) => v.pageId === page.id);
54
+ if (p) {
55
+ const currentBasedOnArray = basedOnMap.get(variableId) ?? [];
56
+ currentBasedOnArray.push({ varId: p.varId, weight });
57
+ basedOnMap.set(variableId, currentBasedOnArray);
58
+ } else {
59
+ // TODO - Global event-bus for errors?
60
+ console.error("INVALID DATA in calculate all sum-scores.");
61
+ // throw Error("Invalid data...");
62
+ }
63
+ });
64
+ });
65
+ // const pages = Array.isArray(schemaDto.pages) ? schemaDto.pages : [];
66
+ const results: ReadonlyArray<SumScore> = vs.map((v) => {
67
+ const basedOn = basedOnMap.get(v.id) ?? [];
68
+ return calculate(v, basedOn, answers);
69
+ });
70
+
71
+ return results;
72
+ };
73
+ const calculate = (
74
+ sumScoreVariable: SumScoreVariableDto,
75
+ basedOnVariables: Array<{ varId: string; weight: number }>,
76
+ answers: Array<SumScoreAnswer>,
77
+ ): SumScore => {
78
+ const legalValues: Array<number> = [...ALLOWED_VALUES];
79
+ // CALCULATE THESE!!
80
+ let includedAnswerCount = 0;
81
+ let skippedBy9Count = 0;
82
+ let missingAnswerCount = 0;
83
+ let sumScore = 0;
84
+ const errorMessages: string[] = [];
85
+ const basedOn: SumScore["basedOn"] = [];
86
+ const useAvg = sumScoreVariable.useAvg;
87
+ const basedOnEntries: BasedOnEntry[] = basedOnVariables.map((scv) => {
88
+ const maybeAnswer = answers.find((v) => v.varId === scv.varId);
89
+ let result: BasedOnEntry = { kind: "missing", varId: scv.varId };
90
+ if (!maybeAnswer) {
91
+ return result;
92
+ }
93
+
94
+ const value = maybeAnswer.value;
95
+ const varLabel = maybeAnswer.varLabel;
96
+ const weight = scv.weight ?? 1;
97
+ const varId = maybeAnswer.varId;
98
+
99
+ result = {
100
+ kind: "has-value",
101
+ varId,
102
+ weight,
103
+ value,
104
+ varLabel,
105
+ };
106
+
107
+ return result;
108
+ });
109
+
110
+ basedOnEntries.forEach((entry) => {
111
+ if (entry.kind === "missing") {
112
+ missingAnswerCount++;
113
+ }
114
+ if (entry.kind === "has-value") {
115
+ const { varId, varLabel, weight, value } = { ...entry };
116
+ const isAllowed = isAllowedValue(value);
117
+ if (isAllowed) {
118
+ basedOn.push({ varId, weight, value, varLabel });
119
+ sumScore += entry.value * entry.weight;
120
+ includedAnswerCount++;
121
+ }
122
+ if (value === 9) {
123
+ skippedBy9Count++;
124
+ basedOn.push({ varId, weight, value, varLabel });
125
+ }
126
+ }
127
+ if (entry.kind === "invalid-variable") {
128
+ errorMessages.push(entry.message);
129
+ }
130
+ });
131
+
132
+ const avg = sumScore / includedAnswerCount;
133
+ const result: SumScore = {
134
+ sumScoreVariableId: sumScoreVariable.id,
135
+ name: sumScoreVariable.name,
136
+ description: sumScoreVariable.description,
137
+ avg,
138
+ useAvg,
139
+ includedAnswerCount,
140
+ skippedBy9Count,
141
+ sumScore,
142
+ basedOn,
143
+ missingAnswerCount,
144
+ errorMessages,
145
+ };
146
+ // Calculate avg
147
+
148
+ return result;
149
+ };
150
+ const createVariable = (): SumScoreVariableDto => {
151
+ const id = SumScoreVariableID.create();
152
+ return {
153
+ id,
154
+ name: "",
155
+ useAvg: true,
156
+ description: "",
157
+ // basedOn: [],
158
+ };
159
+ };
160
+ export const SumScore = {
161
+ ALLOWED_VALUES,
162
+ calculate,
163
+ calculateAll,
164
+ isAllowedValue,
165
+ createVariable,
166
+ };
@@ -1,45 +1,45 @@
1
- import { BuilderObject } from "../BuilderObject";
2
- import { TagID } from "../primitives/ID";
3
-
4
- export interface BuilderTagDto {
5
- readonly id: TagID;
6
- readonly tag: string;
7
- readonly description: string;
8
- }
9
-
10
- export class BuilderTag extends BuilderObject<"builder-tag", BuilderTagDto> {
11
- readonly objectType: "builder-tag" = "builder-tag";
12
- readonly id: TagID;
13
- tagText = "";
14
- tagDescription = "";
15
- public static readonly MAX_LENGTH = 20;
16
- public static readonly MIN_LENGTH = 1;
17
-
18
- public static readonly create = (tag: string, description: string = "") => {
19
- const id = TagID.create();
20
- const dto: BuilderTagDto = {
21
- id,
22
- tag,
23
- description,
24
- };
25
- return new BuilderTag(dto);
26
- };
27
- public static readonly fromDto = (dto: BuilderTagDto) => {
28
- return new BuilderTag(dto);
29
- };
30
- protected constructor(dto: BuilderTagDto) {
31
- const id = TagID.validateOrCreate(dto.id);
32
- const withId = { ...dto, id };
33
- super(withId);
34
- this.id = id;
35
- this.tagText = dto.tag ?? "";
36
- this.tagDescription = dto.description ?? "";
37
- }
38
- clone(): BuilderTagDto {
39
- return this.toJson();
40
- }
41
-
42
- toJson(): BuilderTagDto {
43
- return { tag: this.tagText, description: this.tagDescription, id: this.id };
44
- }
45
- }
1
+ import { BuilderObject } from "../BuilderObject";
2
+ import { TagID } from "../primitives/ID";
3
+
4
+ export interface BuilderTagDto {
5
+ readonly id: TagID;
6
+ readonly tag: string;
7
+ readonly description: string;
8
+ }
9
+
10
+ export class BuilderTag extends BuilderObject<"builder-tag", BuilderTagDto> {
11
+ readonly objectType: "builder-tag" = "builder-tag";
12
+ readonly id: TagID;
13
+ tagText = "";
14
+ tagDescription = "";
15
+ public static readonly MAX_LENGTH = 20;
16
+ public static readonly MIN_LENGTH = 1;
17
+
18
+ public static readonly create = (tag: string, description: string = "") => {
19
+ const id = TagID.create();
20
+ const dto: BuilderTagDto = {
21
+ id,
22
+ tag,
23
+ description,
24
+ };
25
+ return new BuilderTag(dto);
26
+ };
27
+ public static readonly fromDto = (dto: BuilderTagDto) => {
28
+ return new BuilderTag(dto);
29
+ };
30
+ protected constructor(dto: BuilderTagDto) {
31
+ const id = TagID.validateOrCreate(dto.id);
32
+ const withId = { ...dto, id };
33
+ super(withId);
34
+ this.id = id;
35
+ this.tagText = dto.tag ?? "";
36
+ this.tagDescription = dto.description ?? "";
37
+ }
38
+ clone(): BuilderTagDto {
39
+ return this.toJson();
40
+ }
41
+
42
+ toJson(): BuilderTagDto {
43
+ return { tag: this.tagText, description: this.tagDescription, id: this.id };
44
+ }
45
+ }
@@ -1,53 +1,53 @@
1
- import { BuilderTag, BuilderTagDto } from "./BuilderTag";
2
-
3
- export class TagCollection implements Iterable<BuilderTag> {
4
- private readonly _tags = new Set<BuilderTag>();
5
- public static readonly create = () => {
6
- return new TagCollection([]);
7
- };
8
-
9
- [Symbol.iterator]() {
10
- const list = [...this._tags];
11
- return list[Symbol.iterator]();
12
- }
13
-
14
- private constructor(initialTags: ReadonlyArray<BuilderTag>) {
15
- initialTags.forEach((tag) => {
16
- this._tags.add(tag);
17
- });
18
- }
19
-
20
- init(tags: ReadonlyArray<BuilderTagDto>) {
21
- const dtoList: ReadonlyArray<BuilderTagDto> = Array.isArray(tags) ? tags : [];
22
- const all = dtoList.map(BuilderTag.fromDto);
23
- all.forEach((tag) => {
24
- this._tags.add(tag);
25
- });
26
- }
27
-
28
- add(tag: BuilderTag) {
29
- this._tags.add(tag);
30
- }
31
-
32
- /**
33
- * Delete this tag from collection;
34
- * @param tag
35
- */
36
- delete(tag: BuilderTag) {
37
- this._tags.delete(tag);
38
- }
39
-
40
- toJson(): ReadonlyArray<BuilderTagDto> {
41
- const list = [...this._tags];
42
- const dtoList = list.map((t) => t.toJson());
43
- return dtoList;
44
- }
45
-
46
- deleteAll(tags: Iterable<BuilderTag>) {
47
- const l = tags[Symbol.iterator]();
48
- const asList = [...tags];
49
- asList.forEach((t) => {
50
- this.delete(t);
51
- });
52
- }
53
- }
1
+ import { BuilderTag, BuilderTagDto } from "./BuilderTag";
2
+
3
+ export class TagCollection implements Iterable<BuilderTag> {
4
+ private readonly _tags = new Set<BuilderTag>();
5
+ public static readonly create = () => {
6
+ return new TagCollection([]);
7
+ };
8
+
9
+ [Symbol.iterator]() {
10
+ const list = [...this._tags];
11
+ return list[Symbol.iterator]();
12
+ }
13
+
14
+ private constructor(initialTags: ReadonlyArray<BuilderTag>) {
15
+ initialTags.forEach((tag) => {
16
+ this._tags.add(tag);
17
+ });
18
+ }
19
+
20
+ init(tags: ReadonlyArray<BuilderTagDto>) {
21
+ const dtoList: ReadonlyArray<BuilderTagDto> = Array.isArray(tags) ? tags : [];
22
+ const all = dtoList.map(BuilderTag.fromDto);
23
+ all.forEach((tag) => {
24
+ this._tags.add(tag);
25
+ });
26
+ }
27
+
28
+ add(tag: BuilderTag) {
29
+ this._tags.add(tag);
30
+ }
31
+
32
+ /**
33
+ * Delete this tag from collection;
34
+ * @param tag
35
+ */
36
+ delete(tag: BuilderTag) {
37
+ this._tags.delete(tag);
38
+ }
39
+
40
+ toJson(): ReadonlyArray<BuilderTagDto> {
41
+ const list = [...this._tags];
42
+ const dtoList = list.map((t) => t.toJson());
43
+ return dtoList;
44
+ }
45
+
46
+ deleteAll(tags: Iterable<BuilderTag>) {
47
+ const l = tags[Symbol.iterator]();
48
+ const asList = [...tags];
49
+ asList.forEach((t) => {
50
+ this.delete(t);
51
+ });
52
+ }
53
+ }