case-editor-tools 1.0.0-beta.15 → 1.0.0-beta.16

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 (113) hide show
  1. package/.editorconfig +13 -0
  2. package/{index.d.ts → CHANGELOG.md} +0 -0
  3. package/LICENSE +202 -0
  4. package/package.json +3 -3
  5. package/publish.sh +9 -0
  6. package/readme.md +18 -0
  7. package/rollup.config.js +49 -0
  8. package/src/constants/key-definitions.ts +14 -0
  9. package/src/exporter/index.ts +101 -0
  10. package/{expression-utils/expressionGen.js → src/expression-utils/expressionGen.ts} +26 -29
  11. package/src/expression-utils/studyEngineExpressions.ts +359 -0
  12. package/src/index.ts +1 -0
  13. package/{logger/index.d.ts → src/logger/index.ts} +1 -1
  14. package/src/logger/logger.ts +31 -0
  15. package/{surveys/index.d.ts → src/surveys/index.ts} +3 -3
  16. package/src/surveys/survey-editor/component-editor.ts +133 -0
  17. package/{surveys/survey-editor/data-types.d.ts → src/surveys/survey-editor/data-types.ts} +18 -13
  18. package/src/surveys/survey-editor/item-editor.ts +529 -0
  19. package/src/surveys/survey-editor/survey-editor.ts +261 -0
  20. package/src/surveys/survey-engine-expressions.ts +483 -0
  21. package/src/surveys/survey-items.ts +1490 -0
  22. package/src/surveys/types/group.ts +73 -0
  23. package/{surveys/types/index.d.ts → src/surveys/types/index.ts} +4 -4
  24. package/src/surveys/types/item-properties.ts +204 -0
  25. package/{surveys/types/item.d.ts → src/surveys/types/item.ts} +42 -22
  26. package/src/surveys/types/survey-definition.ts +83 -0
  27. package/src/surveys/utils/componentGenerators.ts +76 -0
  28. package/src/surveys/utils/optionDefGenerators.ts +195 -0
  29. package/{surveys/utils/randomKeyGenerator.js → src/surveys/utils/randomKeyGenerator.ts} +9 -14
  30. package/src/surveys/utils/simple-generators.ts +106 -0
  31. package/src/surveys/utils/simple-question-editor.ts +52 -0
  32. package/{types/duration.js → src/types/duration.ts} +30 -27
  33. package/src/types/expression.ts +22 -0
  34. package/src/types/study.ts +17 -0
  35. package/src/types/studyRules.ts +39 -0
  36. package/tsconfig.json +100 -0
  37. package/constants/key-definitions.d.ts +0 -13
  38. package/constants/key-definitions.js +0 -32
  39. package/constants/key-definitions.js.map +0 -1
  40. package/exporter/index.d.ts +0 -2
  41. package/exporter/index.js +0 -99
  42. package/exporter/index.js.map +0 -1
  43. package/expression-utils/expressionGen.d.ts +0 -2
  44. package/expression-utils/expressionGen.js.map +0 -1
  45. package/expression-utils/studyEngineExpressions.d.ts +0 -114
  46. package/expression-utils/studyEngineExpressions.js +0 -283
  47. package/expression-utils/studyEngineExpressions.js.map +0 -1
  48. package/index.js +0 -3
  49. package/index.js.map +0 -1
  50. package/item-editor-7f825952.js +0 -522
  51. package/item-editor-7f825952.js.map +0 -1
  52. package/logger/index.js +0 -10
  53. package/logger/index.js.map +0 -1
  54. package/logger/logger.d.ts +0 -9
  55. package/logger/logger.js +0 -31
  56. package/logger/logger.js.map +0 -1
  57. package/surveys/index.js +0 -26
  58. package/surveys/index.js.map +0 -1
  59. package/surveys/survey-editor/component-editor.d.ts +0 -84
  60. package/surveys/survey-editor/component-editor.js +0 -112
  61. package/surveys/survey-editor/component-editor.js.map +0 -1
  62. package/surveys/survey-editor/data-types.js +0 -3
  63. package/surveys/survey-editor/data-types.js.map +0 -1
  64. package/surveys/survey-editor/item-editor.d.ts +0 -65
  65. package/surveys/survey-editor/item-editor.js +0 -13
  66. package/surveys/survey-editor/item-editor.js.map +0 -1
  67. package/surveys/survey-editor/survey-editor.d.ts +0 -43
  68. package/surveys/survey-editor/survey-editor.js +0 -231
  69. package/surveys/survey-editor/survey-editor.js.map +0 -1
  70. package/surveys/survey-engine-expressions.d.ts +0 -120
  71. package/surveys/survey-engine-expressions.js +0 -407
  72. package/surveys/survey-engine-expressions.js.map +0 -1
  73. package/surveys/survey-items.d.ts +0 -132
  74. package/surveys/survey-items.js +0 -1018
  75. package/surveys/survey-items.js.map +0 -1
  76. package/surveys/types/group.d.ts +0 -23
  77. package/surveys/types/group.js +0 -71
  78. package/surveys/types/group.js.map +0 -1
  79. package/surveys/types/index.js +0 -20
  80. package/surveys/types/index.js.map +0 -1
  81. package/surveys/types/item-properties.d.ts +0 -189
  82. package/surveys/types/item-properties.js +0 -3
  83. package/surveys/types/item-properties.js.map +0 -1
  84. package/surveys/types/item.js +0 -34
  85. package/surveys/types/item.js.map +0 -1
  86. package/surveys/types/survey-definition.d.ts +0 -19
  87. package/surveys/types/survey-definition.js +0 -60
  88. package/surveys/types/survey-definition.js.map +0 -1
  89. package/surveys/utils/componentGenerators.d.ts +0 -24
  90. package/surveys/utils/componentGenerators.js +0 -58
  91. package/surveys/utils/componentGenerators.js.map +0 -1
  92. package/surveys/utils/optionDefGenerators.d.ts +0 -68
  93. package/surveys/utils/optionDefGenerators.js +0 -162
  94. package/surveys/utils/optionDefGenerators.js.map +0 -1
  95. package/surveys/utils/randomKeyGenerator.d.ts +0 -1
  96. package/surveys/utils/randomKeyGenerator.js.map +0 -1
  97. package/surveys/utils/simple-generators.d.ts +0 -13
  98. package/surveys/utils/simple-generators.js +0 -102
  99. package/surveys/utils/simple-generators.js.map +0 -1
  100. package/surveys/utils/simple-question-editor.d.ts +0 -14
  101. package/surveys/utils/simple-question-editor.js +0 -45
  102. package/surveys/utils/simple-question-editor.js.map +0 -1
  103. package/types/duration.d.ts +0 -9
  104. package/types/duration.js.map +0 -1
  105. package/types/expression.d.ts +0 -4
  106. package/types/expression.js +0 -23
  107. package/types/expression.js.map +0 -1
  108. package/types/study.d.ts +0 -13
  109. package/types/study.js +0 -3
  110. package/types/study.js.map +0 -1
  111. package/types/studyRules.d.ts +0 -8
  112. package/types/studyRules.js +0 -32
  113. package/types/studyRules.js.map +0 -1
@@ -0,0 +1,261 @@
1
+ import { Survey, LocalizedString, SurveyItem, isSurveyGroupItem, SurveyGroupItem, SurveyContextDef, Expression } from "survey-engine/lib/data_types";
2
+ import { Logger } from "../../logger/logger";
3
+ import { NewItemProps } from "./data-types";
4
+ import { ItemEditor } from "./item-editor";
5
+
6
+ interface SurveyEditorInt {
7
+ setSurveyName: (name: Array<LocalizedString>) => void;
8
+ setSurveyDescription: (description: Array<LocalizedString>) => void;
9
+ setSurveyDuration: (duration: Array<LocalizedString>) => void;
10
+ setSurveyContextRules: (contextRules: SurveyContextDef) => void;
11
+ setPrefillRules: (rules: Expression[]) => void;
12
+
13
+
14
+ changeItemKey: (oldKey: string, newKey: string) => void;
15
+ addNewSurveyItem: (itemProps: NewItemProps, parentKey?: string, atPosition?: number) => SurveyItem | undefined;
16
+ updateSurveyItem: (item: SurveyItem) => void;
17
+ removeItem: (key: string) => void;
18
+ findSurveyItem: (itemKey: string) => SurveyItem | undefined;
19
+ moveSurveyItem: (item: SurveyItem, destination: string) => void;
20
+
21
+
22
+ getSurvey: () => Survey;
23
+ getSurveyJSON: (pretty?: boolean) => string;
24
+ }
25
+
26
+ export class SurveyEditor implements SurveyEditorInt {
27
+ private survey: Survey;
28
+ private surveyKey: string;
29
+
30
+ constructor(survey?: Survey) {
31
+ if (survey) {
32
+ this.survey = { ...survey };
33
+ this.surveyKey = this.survey.current.surveyDefinition.key;
34
+ } else {
35
+ this.surveyKey = 'survey';
36
+ this.survey = {
37
+ props: {},
38
+ current: {
39
+ versionId: '',
40
+ surveyDefinition: {
41
+ key: this.surveyKey,
42
+ version: 1,
43
+ items: []
44
+ }
45
+ }
46
+ }
47
+ }
48
+ }
49
+
50
+ setSurveyName(name: Array<LocalizedString>) {
51
+ if (!this.survey.props) {
52
+ this.survey.props = {};
53
+ }
54
+ this.survey.props.name = name;
55
+ };
56
+
57
+ setSurveyDescription(description: Array<LocalizedString>) {
58
+ if (!this.survey.props) {
59
+ this.survey.props = {};
60
+ }
61
+ this.survey.props.description = description;
62
+ };
63
+
64
+ setSurveyDuration(duration: Array<LocalizedString>) {
65
+ if (!this.survey.props) {
66
+ this.survey.props = {};
67
+ }
68
+ this.survey.props.typicalDuration = duration;
69
+ };
70
+
71
+ setMaxItemPerPage(itemLimits: { small: number; large: number }) {
72
+ this.survey.maxItemsPerPage = itemLimits;
73
+ }
74
+
75
+ setSurveyContextRules(contextRules: SurveyContextDef) {
76
+ this.survey.contextRules = { ...contextRules };
77
+ };
78
+
79
+ setPrefillRules(rules: Expression[]) {
80
+ this.survey.prefillRules = [...rules];
81
+ };
82
+
83
+ addNewSurveyItem(newItem: NewItemProps, parentKey?: string, atPosition?: number): SurveyItem | undefined {
84
+ if (!parentKey) {
85
+ newItem.itemKey = this.surveyKey + '.' + newItem.itemKey;
86
+
87
+ if (this.survey.current.surveyDefinition.items.find(it => newItem.itemKey === it.key)) {
88
+ Logger.criticalError('Duplicate key in survey: ' + newItem.itemKey);
89
+ return undefined;
90
+ }
91
+ const item = (new ItemEditor(undefined, newItem)).getItem();
92
+
93
+ if (atPosition !== undefined) {
94
+ this.survey.current.surveyDefinition.items.splice(atPosition, 0, item);
95
+ } else {
96
+ this.survey.current.surveyDefinition.items.push(item);
97
+ }
98
+ return item;
99
+ }
100
+ const obj = this.findSurveyItem(parentKey);
101
+ if (!obj) {
102
+ console.warn('parent survey item cannot be found: ', parentKey);
103
+ return
104
+ }
105
+
106
+ newItem.itemKey = parentKey + '.' + newItem.itemKey;
107
+ if ((obj as SurveyGroupItem).items.find(it => newItem.itemKey === it.key)) {
108
+ Logger.criticalError('Duplicate key in survey: ' + newItem.itemKey);
109
+ return undefined;
110
+ }
111
+ const item = (new ItemEditor(undefined, newItem)).getItem();
112
+ if (atPosition !== undefined) {
113
+ (obj as SurveyGroupItem).items.splice(atPosition, 0, item);
114
+ } else {
115
+ (obj as SurveyGroupItem).items.push(item);
116
+ }
117
+ return item;
118
+ }
119
+
120
+ addExistingSurveyItem(surveyItem: SurveyItem, parentKey: string, atPosition?: number): SurveyItem | undefined {
121
+ const parent = this.findSurveyItem(parentKey);
122
+ if (!parent) {
123
+ console.warn('parent survey item cannot be found: ', parentKey);
124
+ return
125
+ }
126
+ if ((parent as SurveyGroupItem).items.find(it => surveyItem.key === it.key)) {
127
+ Logger.criticalError('Duplicate key in survey: ' + surveyItem.key);
128
+ return undefined;
129
+ }
130
+ if (atPosition !== undefined) {
131
+ (parent as SurveyGroupItem).items.splice(atPosition, 0, surveyItem);
132
+ } else {
133
+ (parent as SurveyGroupItem).items.push(surveyItem);
134
+ }
135
+ return surveyItem;
136
+ }
137
+
138
+ changeItemKey(oldKey: string, newKey: string, ignoreReferences?: boolean) {
139
+ if (oldKey === this.surveyKey) {
140
+ this.surveyKey = newKey;
141
+ this.survey.current.surveyDefinition = this.changeItemKeyForSubtree(this.survey.current.surveyDefinition, newKey) as SurveyGroupItem;
142
+ return;
143
+ }
144
+
145
+ let obj = this.findSurveyItem(oldKey);
146
+ if (!obj) {
147
+ console.warn('survey item cannot be found: ', oldKey);
148
+ return
149
+ }
150
+ obj = Object.assign(obj, this.changeItemKeyForSubtree(obj, newKey));
151
+
152
+ if (!ignoreReferences) {
153
+ // replace key in every expression of the survey
154
+ // replace key in every follows
155
+ console.warn('unimplemented UPDATING KEY REFERENCES');
156
+ }
157
+ };
158
+
159
+ updateSurveyItem(item: SurveyItem) {
160
+ if (item.key === this.surveyKey) {
161
+ this.survey.current.surveyDefinition = {
162
+ ...this.survey.current.surveyDefinition,
163
+ ...item
164
+ }
165
+ return;
166
+ }
167
+ const ids = item.key.split('.');
168
+ const parentIds = ids.slice(0, ids.length - 1);
169
+ const parentKey = parentIds.join('.');
170
+
171
+ const obj = this.findSurveyItem(parentKey);
172
+ if (!obj) {
173
+ console.warn('parent survey item cannot be found: ', parentKey);
174
+ return
175
+ }
176
+
177
+ const index = (obj as SurveyGroupItem).items.findIndex(it => it.key === item.key);
178
+ if (index < 0) {
179
+ console.warn('survey item cannot be found: ', item.key);
180
+ return;
181
+ }
182
+ (obj as SurveyGroupItem).items[index] = {
183
+ ...(obj as SurveyGroupItem).items[index],
184
+ ...item
185
+ };
186
+ return;
187
+ };
188
+
189
+ removeItem(key: string) {
190
+ // <- error if item is not found
191
+ console.warn('removeItem unimplemented');
192
+ return;
193
+ };
194
+
195
+ moveSurveyItem(item: SurveyItem, destination: string) {
196
+ console.warn('moveSurveyItem unimplemented');
197
+ // error if destination not exists
198
+ // change item key
199
+ // change key for all children recursivly
200
+ };
201
+
202
+ findSurveyItem(itemKey: string): SurveyItem | undefined {
203
+ const ids = itemKey.split('.');
204
+ const paths = this.getKeyListForPath(ids);
205
+
206
+ let obj: SurveyItem | undefined = undefined;
207
+ for (const currentKey of paths) {
208
+ if (!obj) {
209
+ obj = this.survey.current.surveyDefinition;
210
+ continue;
211
+ }
212
+ if (!isSurveyGroupItem(obj)) {
213
+ console.warn('survey item is not a group: ', obj.key);
214
+ return;
215
+ }
216
+ const index = obj.items.findIndex(it => it.key === currentKey);
217
+ if (index < 0) {
218
+ console.warn('survey item cannot be found: ', currentKey);
219
+ return;
220
+ }
221
+ obj = (obj.items[index] as SurveyGroupItem);
222
+ }
223
+ return obj;
224
+ };
225
+
226
+ getSurvey(): Survey {
227
+ return { ...this.survey };
228
+ };
229
+
230
+ getSurveyJSON(pretty?: boolean): string {
231
+ return JSON.stringify(this.survey, undefined, pretty ? ' ' : undefined);
232
+ };
233
+
234
+ // Private methods:
235
+ private getKeyListForPath(ids: string[]): string[] {
236
+ const paths: string[] = [];
237
+ let compID = '';
238
+ for (let i = 0; i < ids.length; i++) {
239
+ const id = ids[i];
240
+ if (compID.length < 1) {
241
+ compID = id;
242
+ } else {
243
+ compID += '.' + id;
244
+ }
245
+ paths.push(compID);
246
+ }
247
+ return paths;
248
+ }
249
+
250
+ private changeItemKeyForSubtree(currentItem: SurveyItem, newKey: string): SurveyItem {
251
+ currentItem = { ...currentItem };
252
+ if (isSurveyGroupItem(currentItem)) {
253
+ currentItem.items = currentItem.items.map(item => {
254
+ const newSubkey = newKey + '.' + item.key.slice(item.key.lastIndexOf('.') + 1);
255
+ return this.changeItemKeyForSubtree(item, newSubkey);
256
+ });
257
+ }
258
+ currentItem.key = newKey;
259
+ return currentItem;
260
+ }
261
+ }