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.
- package/.editorconfig +13 -0
- package/{index.d.ts → CHANGELOG.md} +0 -0
- package/LICENSE +202 -0
- package/package.json +3 -3
- package/publish.sh +9 -0
- package/readme.md +18 -0
- package/rollup.config.js +49 -0
- package/src/constants/key-definitions.ts +14 -0
- package/src/exporter/index.ts +101 -0
- package/{expression-utils/expressionGen.js → src/expression-utils/expressionGen.ts} +26 -29
- package/src/expression-utils/studyEngineExpressions.ts +359 -0
- package/src/index.ts +1 -0
- package/{logger/index.d.ts → src/logger/index.ts} +1 -1
- package/src/logger/logger.ts +31 -0
- package/{surveys/index.d.ts → src/surveys/index.ts} +3 -3
- package/src/surveys/survey-editor/component-editor.ts +133 -0
- package/{surveys/survey-editor/data-types.d.ts → src/surveys/survey-editor/data-types.ts} +18 -13
- package/src/surveys/survey-editor/item-editor.ts +529 -0
- package/src/surveys/survey-editor/survey-editor.ts +261 -0
- package/src/surveys/survey-engine-expressions.ts +483 -0
- package/src/surveys/survey-items.ts +1490 -0
- package/src/surveys/types/group.ts +73 -0
- package/{surveys/types/index.d.ts → src/surveys/types/index.ts} +4 -4
- package/src/surveys/types/item-properties.ts +204 -0
- package/{surveys/types/item.d.ts → src/surveys/types/item.ts} +42 -22
- package/src/surveys/types/survey-definition.ts +83 -0
- package/src/surveys/utils/componentGenerators.ts +76 -0
- package/src/surveys/utils/optionDefGenerators.ts +195 -0
- package/{surveys/utils/randomKeyGenerator.js → src/surveys/utils/randomKeyGenerator.ts} +9 -14
- package/src/surveys/utils/simple-generators.ts +106 -0
- package/src/surveys/utils/simple-question-editor.ts +52 -0
- package/{types/duration.js → src/types/duration.ts} +30 -27
- package/src/types/expression.ts +22 -0
- package/src/types/study.ts +17 -0
- package/src/types/studyRules.ts +39 -0
- package/tsconfig.json +100 -0
- package/constants/key-definitions.d.ts +0 -13
- package/constants/key-definitions.js +0 -32
- package/constants/key-definitions.js.map +0 -1
- package/exporter/index.d.ts +0 -2
- package/exporter/index.js +0 -99
- package/exporter/index.js.map +0 -1
- package/expression-utils/expressionGen.d.ts +0 -2
- package/expression-utils/expressionGen.js.map +0 -1
- package/expression-utils/studyEngineExpressions.d.ts +0 -114
- package/expression-utils/studyEngineExpressions.js +0 -283
- package/expression-utils/studyEngineExpressions.js.map +0 -1
- package/index.js +0 -3
- package/index.js.map +0 -1
- package/item-editor-7f825952.js +0 -522
- package/item-editor-7f825952.js.map +0 -1
- package/logger/index.js +0 -10
- package/logger/index.js.map +0 -1
- package/logger/logger.d.ts +0 -9
- package/logger/logger.js +0 -31
- package/logger/logger.js.map +0 -1
- package/surveys/index.js +0 -26
- package/surveys/index.js.map +0 -1
- package/surveys/survey-editor/component-editor.d.ts +0 -84
- package/surveys/survey-editor/component-editor.js +0 -112
- package/surveys/survey-editor/component-editor.js.map +0 -1
- package/surveys/survey-editor/data-types.js +0 -3
- package/surveys/survey-editor/data-types.js.map +0 -1
- package/surveys/survey-editor/item-editor.d.ts +0 -65
- package/surveys/survey-editor/item-editor.js +0 -13
- package/surveys/survey-editor/item-editor.js.map +0 -1
- package/surveys/survey-editor/survey-editor.d.ts +0 -43
- package/surveys/survey-editor/survey-editor.js +0 -231
- package/surveys/survey-editor/survey-editor.js.map +0 -1
- package/surveys/survey-engine-expressions.d.ts +0 -120
- package/surveys/survey-engine-expressions.js +0 -407
- package/surveys/survey-engine-expressions.js.map +0 -1
- package/surveys/survey-items.d.ts +0 -132
- package/surveys/survey-items.js +0 -1018
- package/surveys/survey-items.js.map +0 -1
- package/surveys/types/group.d.ts +0 -23
- package/surveys/types/group.js +0 -71
- package/surveys/types/group.js.map +0 -1
- package/surveys/types/index.js +0 -20
- package/surveys/types/index.js.map +0 -1
- package/surveys/types/item-properties.d.ts +0 -189
- package/surveys/types/item-properties.js +0 -3
- package/surveys/types/item-properties.js.map +0 -1
- package/surveys/types/item.js +0 -34
- package/surveys/types/item.js.map +0 -1
- package/surveys/types/survey-definition.d.ts +0 -19
- package/surveys/types/survey-definition.js +0 -60
- package/surveys/types/survey-definition.js.map +0 -1
- package/surveys/utils/componentGenerators.d.ts +0 -24
- package/surveys/utils/componentGenerators.js +0 -58
- package/surveys/utils/componentGenerators.js.map +0 -1
- package/surveys/utils/optionDefGenerators.d.ts +0 -68
- package/surveys/utils/optionDefGenerators.js +0 -162
- package/surveys/utils/optionDefGenerators.js.map +0 -1
- package/surveys/utils/randomKeyGenerator.d.ts +0 -1
- package/surveys/utils/randomKeyGenerator.js.map +0 -1
- package/surveys/utils/simple-generators.d.ts +0 -13
- package/surveys/utils/simple-generators.js +0 -102
- package/surveys/utils/simple-generators.js.map +0 -1
- package/surveys/utils/simple-question-editor.d.ts +0 -14
- package/surveys/utils/simple-question-editor.js +0 -45
- package/surveys/utils/simple-question-editor.js.map +0 -1
- package/types/duration.d.ts +0 -9
- package/types/duration.js.map +0 -1
- package/types/expression.d.ts +0 -4
- package/types/expression.js +0 -23
- package/types/expression.js.map +0 -1
- package/types/study.d.ts +0 -13
- package/types/study.js +0 -3
- package/types/study.js.map +0 -1
- package/types/studyRules.d.ts +0 -8
- package/types/studyRules.js +0 -32
- 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
|
+
}
|