case-editor-tools 1.1.1 → 1.2.1

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.
@@ -3,6 +3,7 @@ export declare const singleChoiceKey = "scg";
3
3
  export declare const likertScaleGroupKey = "lg";
4
4
  export declare const responsiveSingleChoiceArrayKey = "rsca";
5
5
  export declare const responsiveBipolarLikertArrayKey = "rsbla";
6
+ export declare const responsiveMatrix = "rm";
6
7
  export declare const likertScaleKey = "likert";
7
8
  export declare const multipleChoiceKey = "mcg";
8
9
  export declare const dropDownKey = "ddg";
@@ -7,6 +7,7 @@ const singleChoiceKey = 'scg';
7
7
  const likertScaleGroupKey = 'lg';
8
8
  const responsiveSingleChoiceArrayKey = 'rsca';
9
9
  const responsiveBipolarLikertArrayKey = 'rsbla';
10
+ const responsiveMatrix = 'rm';
10
11
  const likertScaleKey = 'likert';
11
12
  const multipleChoiceKey = 'mcg';
12
13
  const dropDownKey = 'ddg';
@@ -31,6 +32,7 @@ exports.multipleChoiceKey = multipleChoiceKey;
31
32
  exports.numericInputKey = numericInputKey;
32
33
  exports.responseGroupKey = responseGroupKey;
33
34
  exports.responsiveBipolarLikertArrayKey = responsiveBipolarLikertArrayKey;
35
+ exports.responsiveMatrix = responsiveMatrix;
34
36
  exports.responsiveSingleChoiceArrayKey = responsiveSingleChoiceArrayKey;
35
37
  exports.singleChoiceKey = singleChoiceKey;
36
38
  exports.sliderCategoricalKey = sliderCategoricalKey;
@@ -1 +1 @@
1
- {"version":3,"file":"key-definitions.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"key-definitions.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "case-editor-tools",
3
3
  "description": "Javascript tools to simplify survey and study coding for CASE.",
4
- "version": "1.1.1",
4
+ "version": "1.2.1",
5
5
  "main": "index.js",
6
6
  "license": "Apache-2.0",
7
7
  "repository": "github:case-framework/case-editor-tools",
@@ -1,5 +1,5 @@
1
1
  import { Expression, ItemComponent, ItemGroupComponent } from "survey-engine/data_types";
2
- import { ResponsiveBipolarLikertArrayProps, ResponsiveSingleChoiceArrayProps } from "../types";
2
+ import { ResponsiveBipolarLikertArrayProps, ResponsiveMatrixProps, ResponsiveSingleChoiceArrayProps } from "../types";
3
3
  export interface LikertGroupRow {
4
4
  key: string;
5
5
  content: Map<string, string>;
@@ -19,6 +19,7 @@ export declare const initLikertScaleGroup: (key: string, rows: Array<LikertGroup
19
19
  }[], stackOnSmallScreen?: boolean | undefined, displayCondition?: Expression | undefined) => ItemGroupComponent;
20
20
  export declare const initResponsiveSingleChoiceArray: (rgKey: string, props: ResponsiveSingleChoiceArrayProps, displayCondition?: Expression | undefined) => ItemGroupComponent;
21
21
  export declare const initResponsiveBipolarLikertArray: (rgKey: string, props: ResponsiveBipolarLikertArrayProps, displayCondition?: Expression | undefined) => ItemGroupComponent;
22
+ export declare const initResponsiveMatrixItem: (rgKey: string, props: ResponsiveMatrixProps, displayCondition?: Expression | undefined) => ItemGroupComponent;
22
23
  export declare const initLikertScaleItem: (key: string, options: {
23
24
  key: string;
24
25
  className?: string | undefined;
@@ -311,6 +311,96 @@ const initResponsiveBipolarLikertArray = (rgKey, props, displayCondition) => {
311
311
  });
312
312
  return groupEdit.getComponent();
313
313
  };
314
+ function hasDuplicates(array) {
315
+ return (new Set(array)).size !== array.length;
316
+ }
317
+ const initResponsiveMatrixItem = (rgKey, props, displayCondition) => {
318
+ const groupEdit = new surveys_surveyEditor_componentEditor.ComponentEditor(undefined, {
319
+ key: rgKey,
320
+ isGroup: true,
321
+ role: 'responsiveMatrix',
322
+ });
323
+ if (hasDuplicates(props.rows.map(item => item.key))) {
324
+ throw Error(`has duplicate row keys in ${rgKey}`);
325
+ }
326
+ if (hasDuplicates(props.columns.map(item => item.key))) {
327
+ throw Error(`has duplicate column keys in ${rgKey}`);
328
+ }
329
+ if (displayCondition) {
330
+ groupEdit.setDisplayCondition(displayCondition);
331
+ }
332
+ const style = [
333
+ { key: 'responseType', value: props.responseType },
334
+ ];
335
+ if (props.breakpoint) {
336
+ style.push({ key: 'breakpoint', value: props.breakpoint });
337
+ }
338
+ groupEdit.setStyles(style);
339
+ // ADD COLUMNS
340
+ groupEdit.addItemComponent({
341
+ key: 'cols',
342
+ role: 'columns',
343
+ items: props.columns.map(option => {
344
+ return {
345
+ key: option.key,
346
+ role: 'category',
347
+ content: !Array.isArray(option.label) ? surveys_utils_simpleGenerators.generateLocStrings(option.label) : undefined,
348
+ items: Array.isArray(option.label) ? option.label.map((cont, index) => {
349
+ return {
350
+ key: index.toFixed(),
351
+ role: 'text',
352
+ content: surveys_utils_simpleGenerators.generateLocStrings(cont.content),
353
+ style: cont.className ? [{ key: 'className', value: cont.className }] : undefined,
354
+ };
355
+ }) : [],
356
+ };
357
+ })
358
+ });
359
+ // ADD DROPDOWN OPTIONS (if applicable)
360
+ if (props.responseType == 'dropdown' && props.dropdownConfig !== undefined) {
361
+ groupEdit.addItemComponent({
362
+ key: 'do',
363
+ role: 'dropdownOptions',
364
+ content: surveys_utils_simpleGenerators.generateLocStrings(props.dropdownConfig.unselectedLabeL),
365
+ items: props.dropdownConfig.options.map(option => {
366
+ return {
367
+ key: option.key,
368
+ role: 'option',
369
+ content: surveys_utils_simpleGenerators.generateLocStrings(option.label),
370
+ };
371
+ })
372
+ });
373
+ }
374
+ // ADD ROWS
375
+ const rowGroupEdit = new surveys_surveyEditor_componentEditor.ComponentEditor(undefined, {
376
+ key: 'rows',
377
+ isGroup: true,
378
+ role: 'rows',
379
+ });
380
+ props.rows.forEach((row, index) => {
381
+ const rowStyles = [];
382
+ if (row.className !== undefined) {
383
+ rowStyles.push({ key: 'className', value: row.className });
384
+ }
385
+ rowGroupEdit.addItemComponent({
386
+ key: row.key,
387
+ role: row.role,
388
+ displayCondition: row.displayCondition,
389
+ style: rowStyles.length > 0 ? rowStyles : undefined,
390
+ content: !Array.isArray(row.label) ? surveys_utils_simpleGenerators.generateLocStrings(row.label) : undefined,
391
+ items: Array.isArray(row.label) ? row.label.map((cont, index) => {
392
+ return {
393
+ key: index.toFixed(),
394
+ role: 'text',
395
+ content: surveys_utils_simpleGenerators.generateLocStrings(cont.content),
396
+ style: cont.className ? [{ key: 'className', value: cont.className }] : undefined,
397
+ };
398
+ }) : [],
399
+ });
400
+ });
401
+ groupEdit.addItemComponent(rowGroupEdit.getComponent());
402
+ return groupEdit.getComponent();
403
+ };
314
404
  const initLikertScaleItem = (key, options, stackOnSmallScreen, displayCondition) => {
315
405
  // init group
316
406
  const groupEdit = new surveys_surveyEditor_componentEditor.ComponentEditor(undefined, {
@@ -346,5 +436,6 @@ const initLikertScaleItem = (key, options, stackOnSmallScreen, displayCondition)
346
436
  exports.initLikertScaleGroup = initLikertScaleGroup;
347
437
  exports.initLikertScaleItem = initLikertScaleItem;
348
438
  exports.initResponsiveBipolarLikertArray = initResponsiveBipolarLikertArray;
439
+ exports.initResponsiveMatrixItem = initResponsiveMatrixItem;
349
440
  exports.initResponsiveSingleChoiceArray = initResponsiveSingleChoiceArray;
350
441
  //# sourceMappingURL=likertGroupComponents.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"likertGroupComponents.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"likertGroupComponents.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -1,5 +1,5 @@
1
1
  import { ItemGroupComponent, Expression, ItemComponent, SurveyItem, ExpressionArg, ResponseComponent } from "survey-engine/data_types";
2
- import { ClozeQuestionProps, ConsentQuestionProps, DateInputQuestionProps, GenericQuestionProps, MultiLineTextInput, NumericInputQuestionProps, OptionDef, ResponsiveBipolarLikertArrayQuestionProps, ResponsiveSingleChoiceArrayQuestionProps, TextInputQuestionProps, TimeInputQuestionProps } from "./types/item-properties";
2
+ import { ClozeQuestionProps, ConsentQuestionProps, DateInputQuestionProps, GenericQuestionProps, MultiLineTextInput, NumericInputQuestionProps, OptionDef, ResponsiveBipolarLikertArrayQuestionProps, ResponsiveMatrixQuestionProps, ResponsiveSingleChoiceArrayQuestionProps, TextInputQuestionProps, TimeInputQuestionProps } from "./types/item-properties";
3
3
  import { LikertGroupRow } from "./responseTypeGenerators/likertGroupComponents";
4
4
  interface OptionQuestionProps extends GenericQuestionProps {
5
5
  responseOptions: Array<OptionDef>;
@@ -53,6 +53,7 @@ export declare const SurveyItems: {
53
53
  singleChoice: (props: OptionQuestionProps) => SurveyItem;
54
54
  responsiveSingleChoiceArray: (props: ResponsiveSingleChoiceArrayQuestionProps) => SurveyItem;
55
55
  responsiveBipolarLikertArray: (props: ResponsiveBipolarLikertArrayQuestionProps) => SurveyItem;
56
+ responsiveMatrix: (props: ResponsiveMatrixQuestionProps) => SurveyItem;
56
57
  multipleChoice: (props: OptionQuestionProps) => SurveyItem;
57
58
  dateInput: (props: DateInputQuestionProps) => SurveyItem;
58
59
  timeInput: (props: TimeInputQuestionProps) => SurveyItem;
@@ -141,6 +141,32 @@ const generateResponsiveBipolarLikertArray = (props) => {
141
141
  }
142
142
  return commonQuestionGenerator(props, rg_inner);
143
143
  };
144
+ const generateResponsiveMatrix = (props) => {
145
+ var _a;
146
+ const rg_inner = surveys_responseTypeGenerators_likertGroupComponents.initResponsiveMatrixItem(constants_keyDefinitions.responsiveMatrix, Object.assign({}, props));
147
+ // Add extra validation
148
+ if (props.isRequired) {
149
+ if (!props.customValidations) {
150
+ props.customValidations = [];
151
+ }
152
+ (_a = props.customValidations) === null || _a === void 0 ? void 0 : _a.push({
153
+ key: 'r',
154
+ type: 'hard',
155
+ rule: surveys_utils_simpleGenerators.expWithArgs('and', ...props.rows.map(row => {
156
+ return [
157
+ ...props.columns.map(col => {
158
+ const hasRespExp = surveys_surveyEngineExpressions.SurveyEngine.hasResponse([props.parentKey, props.itemKey].join('.'), [constants_keyDefinitions.responseGroupKey, constants_keyDefinitions.responsiveMatrix, `${row.key}-${col.key}`].join('.'));
159
+ if (row.displayCondition === undefined) {
160
+ return hasRespExp;
161
+ }
162
+ return surveys_surveyEngineExpressions.SurveyEngine.logic.or(surveys_surveyEngineExpressions.SurveyEngine.logic.not(row.displayCondition), hasRespExp);
163
+ })
164
+ ];
165
+ }))
166
+ });
167
+ }
168
+ return commonQuestionGenerator(props, rg_inner);
169
+ };
144
170
  const generateNumericSliderQuestion = (props) => {
145
171
  const rg_inner = {
146
172
  key: 'slider', role: 'sliderNumeric',
@@ -364,6 +390,7 @@ const SurveyItems = {
364
390
  singleChoice: generateSingleChoiceQuestion,
365
391
  responsiveSingleChoiceArray: generateResponsiveSingleChoiceArrayQuestion,
366
392
  responsiveBipolarLikertArray: generateResponsiveBipolarLikertArray,
393
+ responsiveMatrix: generateResponsiveMatrix,
367
394
  multipleChoice: generateMultipleChoiceQuestion,
368
395
  dateInput: generateDatePickerInput,
369
396
  timeInput: generateTimeInput,
@@ -1 +1 @@
1
- {"version":3,"file":"survey-items.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"survey-items.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -222,3 +222,30 @@ export interface ResponsiveBipolarLikertArrayProps {
222
222
  };
223
223
  }
224
224
  export declare type ResponsiveBipolarLikertArrayQuestionProps = GenericQuestionProps & ResponsiveBipolarLikertArrayProps;
225
+ /**
226
+ * Responsive Matrix
227
+ */
228
+ export declare type ResponsiveMatrixResponseType = 'dropdown' | 'input' | 'numberInput';
229
+ export interface ResponsiveMatrixProps {
230
+ responseType: ResponsiveMatrixResponseType;
231
+ breakpoint?: 'sm' | 'md' | 'lg' | 'xl';
232
+ columns: Array<{
233
+ key: string;
234
+ label: Map<string, string> | StyledTextComponentProp[];
235
+ }>;
236
+ rows: Array<{
237
+ key: string;
238
+ role: 'row' | 'category';
239
+ label: Map<string, string> | StyledTextComponentProp[];
240
+ displayCondition?: Expression;
241
+ className?: string;
242
+ }>;
243
+ dropdownConfig?: {
244
+ unselectedLabeL: Map<string, string>;
245
+ options: Array<{
246
+ key: string;
247
+ label: Map<string, string>;
248
+ }>;
249
+ };
250
+ }
251
+ export declare type ResponsiveMatrixQuestionProps = GenericQuestionProps & ResponsiveMatrixProps;