@wg-npm/survey-creator 0.5.166 → 0.5.168
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.
|
@@ -303,328 +303,306 @@ function currentLang() {
|
|
|
303
303
|
}
|
|
304
304
|
var locale = { use, t, i18n, currentLang };
|
|
305
305
|
|
|
306
|
-
class QuestionFactory {
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
306
|
+
class QuestionFactory {
|
|
307
|
+
constructor(locale) {
|
|
308
|
+
this.creatorHash = {};
|
|
309
|
+
this.locale = locale;
|
|
310
|
+
this.registerQuestion("FILL_BLANK", locale => {
|
|
311
|
+
return new BaseQuestionModel("FILL_BLANK", locale);
|
|
312
|
+
});
|
|
313
|
+
this.registerQuestion("SHORT_ANSWER", locale => {
|
|
314
|
+
return new BaseQuestionModel("SHORT_ANSWER", locale);
|
|
315
|
+
});
|
|
316
|
+
this.registerQuestion("MATRIX", locale => {
|
|
317
|
+
return new QuestionMatrixModel("MATRIX", locale);
|
|
318
|
+
});
|
|
319
|
+
this.registerQuestion("SCORING", locale => {
|
|
320
|
+
return new QuestionScoringModel("SCORING", locale);
|
|
321
|
+
});
|
|
322
|
+
this.registerQuestion("TEXT_TITLE", locale => {
|
|
323
|
+
return new QuestionTextTitleModel("TEXT_TITLE", locale);
|
|
324
|
+
});
|
|
325
|
+
this.registerQuestion("SINGLE_SELECTION", locale => {
|
|
326
|
+
return new QuestionCheckBoxModel("SINGLE_SELECTION", locale);
|
|
327
|
+
});
|
|
328
|
+
this.registerQuestion("MULTI_SELECTION", locale => {
|
|
329
|
+
return new QuestionCheckBoxModel("MULTI_SELECTION", locale);
|
|
330
|
+
});
|
|
331
|
+
this.registerQuestion("EVALUATION", locale => {
|
|
332
|
+
return new QuestionEvaluationModel("EVALUATION", locale);
|
|
333
|
+
});
|
|
334
|
+
}
|
|
335
|
+
static getInstance(locale) {
|
|
336
|
+
if (!QuestionFactory.instance) {
|
|
337
|
+
QuestionFactory.instance = new QuestionFactory(locale);
|
|
338
|
+
}
|
|
339
|
+
return QuestionFactory.instance;
|
|
340
|
+
}
|
|
341
|
+
static createDefault(locale) {
|
|
342
|
+
return new ChoiceModel(locale);
|
|
343
|
+
}
|
|
344
|
+
static createSubQuestion(locale) {
|
|
345
|
+
return new SubQuestionModel(locale);
|
|
346
|
+
}
|
|
347
|
+
static createEvaluationItem(locale) {
|
|
348
|
+
return new StarEvaluationItemModel(locale);
|
|
349
|
+
}
|
|
350
|
+
static createSelectionQuestionChoices(locale) {
|
|
351
|
+
return _.range(4).map(() => this.createDefault(locale));
|
|
352
|
+
}
|
|
353
|
+
static createMatrixQuestionChoices(locale) {
|
|
354
|
+
return _.range(5).map(() => this.createDefault(locale));
|
|
355
|
+
}
|
|
356
|
+
static createEvaluationItems(locale) {
|
|
357
|
+
return _.range(5).map(() => this.createEvaluationItem(locale));
|
|
358
|
+
}
|
|
359
|
+
registerQuestion(questionType, questionCreator) {
|
|
360
|
+
this.creatorHash[questionType] = questionCreator;
|
|
361
|
+
}
|
|
362
|
+
createQuestion(questionType) {
|
|
363
|
+
const creator = this.creatorHash[questionType];
|
|
364
|
+
return creator(this.locale);
|
|
365
|
+
}
|
|
366
|
+
static createExclusiveChoice(locale) {
|
|
367
|
+
return new ExclusiveChoiceModel(locale);
|
|
368
|
+
}
|
|
369
369
|
}
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
}
|
|
381
|
-
}
|
|
382
|
-
class ChoiceModel {
|
|
383
|
-
constructor(locale) {
|
|
384
|
-
this.id = ChoiceModel.createChoiceId();
|
|
385
|
-
this.text = defaultText(locale);
|
|
386
|
-
this.options = new ChoiceOptionModel();
|
|
387
|
-
}
|
|
388
|
-
static createChoiceId() {
|
|
389
|
-
return `Choice-${_.now()}-${_.random(0, 9999999)}`;
|
|
390
|
-
}
|
|
391
|
-
}
|
|
392
|
-
class ExclusiveChoiceModel extends ChoiceModel {
|
|
393
|
-
constructor(locale) {
|
|
394
|
-
super(locale);
|
|
395
|
-
if (!_.isEmpty(this.options)) {
|
|
396
|
-
_.set(this.options, "exclusiveEnabled", true);
|
|
397
|
-
}
|
|
398
|
-
}
|
|
399
|
-
}
|
|
400
|
-
class EvaluationItemModel {
|
|
401
|
-
constructor(locale) {
|
|
402
|
-
this.id = EvaluationItemModel.createChoiceId();
|
|
403
|
-
this.text = defaultText(locale);
|
|
404
|
-
}
|
|
405
|
-
static createChoiceId() {
|
|
406
|
-
return `Evaluation-Item-${_.now()}-${_.random(0, 9999999)}`;
|
|
407
|
-
}
|
|
408
|
-
}
|
|
409
|
-
class StarEvaluationItemModel extends EvaluationItemModel {
|
|
410
|
-
constructor(locale) {
|
|
411
|
-
super(locale);
|
|
412
|
-
}
|
|
413
|
-
}
|
|
414
|
-
class QuestionOptionsModel {
|
|
415
|
-
constructor(required) {
|
|
416
|
-
this.inputMinLength = 10;
|
|
417
|
-
this.required = required;
|
|
418
|
-
this.visible = true;
|
|
419
|
-
}
|
|
420
|
-
}
|
|
421
|
-
class QuestionHeaderModel {
|
|
422
|
-
constructor(locale) {
|
|
423
|
-
this.text = defaultText(locale);
|
|
424
|
-
this.number = null;
|
|
425
|
-
}
|
|
426
|
-
}
|
|
427
|
-
class SubQuestionModel {
|
|
428
|
-
constructor(locale) {
|
|
429
|
-
this.id = `SubQ-${_.now()}-${_.random(0, 9999999)}`;
|
|
430
|
-
this.text = defaultText(locale);
|
|
431
|
-
this.number = null;
|
|
432
|
-
}
|
|
433
|
-
}
|
|
434
|
-
class BaseQuestionModel {
|
|
435
|
-
constructor(type, locale) {
|
|
436
|
-
this.id = BaseQuestionModel.createQuestionId();
|
|
437
|
-
this.type = type;
|
|
438
|
-
this.header = new QuestionHeaderModel(locale);
|
|
439
|
-
this.options = new QuestionOptionsModel(false);
|
|
440
|
-
}
|
|
441
|
-
static getMaxScore(question) {
|
|
442
|
-
if (question.type == "SINGLE_SELECTION") {
|
|
443
|
-
return (_.max(_.map(question.choices, (choice) => parseFloat(_.get(choice, "options.score", 0) || 0))) || 0);
|
|
444
|
-
}
|
|
445
|
-
else if (question.type == "MULTI_SELECTION") {
|
|
446
|
-
return _.sumBy(question.choices, (item) => parseFloat(_.get(item, "options.score") || 0));
|
|
447
|
-
}
|
|
448
|
-
else if (question.type == "MATRIX") {
|
|
449
|
-
const score = _.max(_.map(question.choices, (choice) => parseFloat(_.get(choice, "options.score", 0) || 0))) || 0;
|
|
450
|
-
return score * question.subQuestions.length;
|
|
451
|
-
}
|
|
452
|
-
else if (question.type == "SCORING") {
|
|
453
|
-
const score = question.options.maxRange;
|
|
454
|
-
return (score *
|
|
455
|
-
(_.isEmpty(question.subQuestions) ? 1 : question.subQuestions.length));
|
|
456
|
-
}
|
|
457
|
-
return 0;
|
|
458
|
-
}
|
|
459
|
-
static getScoreRange(question) {
|
|
460
|
-
if (question.type == "SCORING") {
|
|
461
|
-
const minRange = question.options.minRange;
|
|
462
|
-
const maxRange = question.options.maxRange;
|
|
463
|
-
return minRange + " - " + maxRange;
|
|
464
|
-
}
|
|
465
|
-
return "";
|
|
466
|
-
}
|
|
467
|
-
static createQuestionId() {
|
|
468
|
-
return `Q-${_.now()}-${_.random(0, 9999999)}`;
|
|
469
|
-
}
|
|
470
|
-
static getNumber(preNumber, question) {
|
|
471
|
-
return preNumber + 1;
|
|
472
|
-
}
|
|
473
|
-
static refreshSurvey(survey) {
|
|
474
|
-
this.rebuildQuestionNumber(survey.questions);
|
|
475
|
-
this.deleteUnusedProperties(survey.questions);
|
|
476
|
-
survey.statistics.maxScore = this.calculationAllQuestionMaxScore(survey.questions);
|
|
477
|
-
survey.statistics.questionCount = this.calculationAllQuestionCount(survey.questions);
|
|
478
|
-
}
|
|
479
|
-
static calculationAllQuestionCount(questions) {
|
|
480
|
-
let count = 0;
|
|
481
|
-
const exclude = ["TEXT_TITLE"];
|
|
482
|
-
_.forEach(questions, (question) => {
|
|
483
|
-
if (!_.includes(exclude, question.type)) {
|
|
484
|
-
count++;
|
|
485
|
-
}
|
|
486
|
-
});
|
|
487
|
-
return count;
|
|
488
|
-
}
|
|
489
|
-
static calculationAllQuestionMaxScore(questions) {
|
|
490
|
-
let maxScore = 0;
|
|
491
|
-
_.forEach(questions, (question) => {
|
|
492
|
-
maxScore += this.getMaxScore(question);
|
|
493
|
-
});
|
|
494
|
-
return maxScore;
|
|
495
|
-
}
|
|
496
|
-
static setActiveQuestion(currentQuestion, questions) {
|
|
497
|
-
_.forEach(questions, (question) => {
|
|
498
|
-
if (question.id == currentQuestion.id) {
|
|
499
|
-
question.active = true;
|
|
500
|
-
}
|
|
501
|
-
else {
|
|
502
|
-
question.active = false;
|
|
503
|
-
}
|
|
504
|
-
});
|
|
505
|
-
}
|
|
506
|
-
static rebuildQuestionNumber(questions) {
|
|
507
|
-
let preNumber = 0;
|
|
508
|
-
_.forEach(questions, function (question) {
|
|
509
|
-
let number;
|
|
510
|
-
if (question.type === "TEXT_TITLE") {
|
|
511
|
-
number = QuestionTextTitleModel.getNumber(preNumber, question);
|
|
512
|
-
}
|
|
513
|
-
else if (question.type === "MATRIX") {
|
|
514
|
-
number = QuestionMatrixModel.getNumber(preNumber, question);
|
|
515
|
-
}
|
|
516
|
-
else if (question.type === "SCORING") {
|
|
517
|
-
number = QuestionScoringModel.getNumber(preNumber, question);
|
|
518
|
-
}
|
|
519
|
-
else {
|
|
520
|
-
number = BaseQuestionModel.getNumber(preNumber, question);
|
|
521
|
-
}
|
|
522
|
-
question.header.number = number;
|
|
523
|
-
if (number) {
|
|
524
|
-
preNumber = number;
|
|
525
|
-
}
|
|
526
|
-
});
|
|
527
|
-
}
|
|
528
|
-
static deleteUnusedProperties(questions) {
|
|
529
|
-
_.forEach(questions, function (question) {
|
|
530
|
-
if (question.type === "SCORING") {
|
|
531
|
-
QuestionScoringModel.removeUnusedProperty(question);
|
|
532
|
-
}
|
|
533
|
-
});
|
|
534
|
-
}
|
|
535
|
-
}
|
|
536
|
-
class QuestionCheckBoxModel extends BaseQuestionModel {
|
|
537
|
-
constructor(type, locale) {
|
|
538
|
-
super(type, locale);
|
|
539
|
-
this.choices = QuestionFactory.createSelectionQuestionChoices(locale);
|
|
540
|
-
}
|
|
541
|
-
}
|
|
542
|
-
class QuestionEvaluationModel extends BaseQuestionModel {
|
|
543
|
-
constructor(type, locale) {
|
|
544
|
-
super(type, locale);
|
|
545
|
-
this.evaluationItems = QuestionFactory.createEvaluationItems(locale);
|
|
546
|
-
}
|
|
547
|
-
}
|
|
548
|
-
class QuestionTextTitleModel extends BaseQuestionModel {
|
|
549
|
-
constructor(type, locale) {
|
|
550
|
-
super(type, locale);
|
|
551
|
-
}
|
|
552
|
-
static getNumber(preNumber, question) {
|
|
553
|
-
return null;
|
|
554
|
-
}
|
|
555
|
-
}
|
|
556
|
-
class QuestionMatrixModel extends BaseQuestionModel {
|
|
557
|
-
constructor(type, locale) {
|
|
558
|
-
super(type, locale);
|
|
559
|
-
this.choices = QuestionFactory.createMatrixQuestionChoices(locale);
|
|
560
|
-
this.subQuestions = [QuestionFactory.createSubQuestion(locale)];
|
|
561
|
-
}
|
|
562
|
-
static getNumber(preNumber, question) {
|
|
563
|
-
const number = preNumber + 1;
|
|
564
|
-
_.forEach(question.subQuestions, (sq, index) => {
|
|
565
|
-
sq.number = index + 1;
|
|
566
|
-
});
|
|
567
|
-
return number;
|
|
568
|
-
}
|
|
569
|
-
}
|
|
570
|
-
class QuestionScoringModel extends BaseQuestionModel {
|
|
571
|
-
constructor(type, locale) {
|
|
572
|
-
super(type, locale);
|
|
573
|
-
this.subQuestions = [];
|
|
574
|
-
}
|
|
575
|
-
static getNumber(preNumber, question) {
|
|
576
|
-
const number = preNumber + 1;
|
|
577
|
-
_.forEach(question.subQuestions, (sq, index) => {
|
|
578
|
-
sq.number = index + 1;
|
|
579
|
-
});
|
|
580
|
-
return number;
|
|
581
|
-
}
|
|
582
|
-
static removeUnusedProperty(question) {
|
|
583
|
-
const options = question.options;
|
|
584
|
-
delete options.sliderValue;
|
|
585
|
-
_.forEach(question.subQuestions, (subQuestion) => {
|
|
586
|
-
delete subQuestion.sliderValue;
|
|
587
|
-
});
|
|
588
|
-
}
|
|
589
|
-
}
|
|
590
|
-
|
|
591
|
-
const ZH_CN = _.camelCase("zh-CN");
|
|
592
|
-
const EN_US = _.camelCase("en-US");
|
|
593
|
-
const ZH_TW = _.camelCase("zh-TW");
|
|
594
|
-
function getValue(obj, locale) {
|
|
595
|
-
const value = _.get(obj, _.camelCase(locale), "");
|
|
596
|
-
if (!_.isEmpty(value)) {
|
|
597
|
-
return value;
|
|
598
|
-
}
|
|
599
|
-
return _.get(obj, locale, "");
|
|
600
|
-
}
|
|
601
|
-
function translate(obj, locale, prettyMath = false) {
|
|
602
|
-
const value = getValue(obj, locale);
|
|
603
|
-
if (!_.isEmpty(value) || !prettyMath) {
|
|
604
|
-
return value;
|
|
605
|
-
}
|
|
606
|
-
return (obj[ZH_CN] ||
|
|
607
|
-
obj["zh-CN"] ||
|
|
608
|
-
obj[EN_US] ||
|
|
609
|
-
obj["en-US"] ||
|
|
610
|
-
obj[ZH_TW] ||
|
|
611
|
-
obj["zh-TW"]);
|
|
370
|
+
const defaultText = function getText(locale) {
|
|
371
|
+
return _.set({}, locale, "");
|
|
372
|
+
};
|
|
373
|
+
class ChoiceOptionModel {
|
|
374
|
+
constructor() {
|
|
375
|
+
this.score = null;
|
|
376
|
+
this.star = false;
|
|
377
|
+
this.starCount = null;
|
|
378
|
+
this.exclusiveEnabled = false;
|
|
379
|
+
}
|
|
612
380
|
}
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
381
|
+
class ChoiceModel {
|
|
382
|
+
constructor(locale) {
|
|
383
|
+
this.id = ChoiceModel.createChoiceId();
|
|
384
|
+
this.text = defaultText(locale);
|
|
385
|
+
this.options = new ChoiceOptionModel();
|
|
386
|
+
}
|
|
387
|
+
static createChoiceId() {
|
|
388
|
+
return `Choice-${_.now()}-${_.random(0, 9999999)}`;
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
class ExclusiveChoiceModel extends ChoiceModel {
|
|
392
|
+
constructor(locale) {
|
|
393
|
+
super(locale);
|
|
394
|
+
if (!_.isEmpty(this.options)) {
|
|
395
|
+
_.set(this.options, "exclusiveEnabled", true);
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
class EvaluationItemModel {
|
|
400
|
+
constructor(locale) {
|
|
401
|
+
this.id = EvaluationItemModel.createChoiceId();
|
|
402
|
+
this.text = defaultText(locale);
|
|
403
|
+
}
|
|
404
|
+
static createChoiceId() {
|
|
405
|
+
return `Evaluation-Item-${_.now()}-${_.random(0, 9999999)}`;
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
class StarEvaluationItemModel extends EvaluationItemModel {
|
|
409
|
+
constructor(locale) {
|
|
410
|
+
super(locale);
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
class QuestionOptionsModel {
|
|
414
|
+
constructor(required) {
|
|
415
|
+
this.inputMinLength = 10;
|
|
416
|
+
this.required = required;
|
|
417
|
+
this.visible = true;
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
class QuestionHeaderModel {
|
|
421
|
+
constructor(locale) {
|
|
422
|
+
this.text = defaultText(locale);
|
|
423
|
+
this.number = null;
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
class SubQuestionModel {
|
|
427
|
+
constructor(locale) {
|
|
428
|
+
this.id = `SubQ-${_.now()}-${_.random(0, 9999999)}`;
|
|
429
|
+
this.text = defaultText(locale);
|
|
430
|
+
this.number = null;
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
class BaseQuestionModel {
|
|
434
|
+
constructor(type, locale) {
|
|
435
|
+
this.id = BaseQuestionModel.createQuestionId();
|
|
436
|
+
this.type = type;
|
|
437
|
+
this.header = new QuestionHeaderModel(locale);
|
|
438
|
+
this.options = new QuestionOptionsModel(false);
|
|
439
|
+
}
|
|
440
|
+
static getMaxScore(question) {
|
|
441
|
+
if (question.type == "SINGLE_SELECTION") {
|
|
442
|
+
return _.max(_.map(question.choices, choice => parseFloat(_.get(choice, "options.score", 0) || 0))) || 0;
|
|
443
|
+
} else if (question.type == "MULTI_SELECTION") {
|
|
444
|
+
return _.sumBy(question.choices, item => parseFloat(_.get(item, "options.score") || 0));
|
|
445
|
+
} else if (question.type == "MATRIX") {
|
|
446
|
+
const score = _.max(_.map(question.choices, choice => parseFloat(_.get(choice, "options.score", 0) || 0))) || 0;
|
|
447
|
+
return score * question.subQuestions.length;
|
|
448
|
+
} else if (question.type == "SCORING") {
|
|
449
|
+
const score = question.options.maxRange;
|
|
450
|
+
return score * (_.isEmpty(question.subQuestions) ? 1 : question.subQuestions.length);
|
|
451
|
+
}
|
|
452
|
+
return 0;
|
|
453
|
+
}
|
|
454
|
+
static getScoreRange(question) {
|
|
455
|
+
if (question.type == "SCORING") {
|
|
456
|
+
const minRange = question.options.minRange;
|
|
457
|
+
const maxRange = question.options.maxRange;
|
|
458
|
+
return minRange + " - " + maxRange;
|
|
459
|
+
}
|
|
460
|
+
return "";
|
|
461
|
+
}
|
|
462
|
+
static createQuestionId() {
|
|
463
|
+
return `Q-${_.now()}-${_.random(0, 9999999)}`;
|
|
464
|
+
}
|
|
465
|
+
static getNumber(preNumber, question) {
|
|
466
|
+
return preNumber + 1;
|
|
467
|
+
}
|
|
468
|
+
static refreshSurvey(survey) {
|
|
469
|
+
this.rebuildQuestionNumber(survey.questions);
|
|
470
|
+
this.deleteUnusedProperties(survey.questions);
|
|
471
|
+
survey.statistics.maxScore = this.calculationAllQuestionMaxScore(survey.questions);
|
|
472
|
+
survey.statistics.questionCount = this.calculationAllQuestionCount(survey.questions);
|
|
473
|
+
}
|
|
474
|
+
static calculationAllQuestionCount(questions) {
|
|
475
|
+
let count = 0;
|
|
476
|
+
const exclude = ["TEXT_TITLE"];
|
|
477
|
+
_.forEach(questions, question => {
|
|
478
|
+
if (!_.includes(exclude, question.type)) {
|
|
479
|
+
count++;
|
|
480
|
+
}
|
|
481
|
+
});
|
|
482
|
+
return count;
|
|
483
|
+
}
|
|
484
|
+
static calculationAllQuestionMaxScore(questions) {
|
|
485
|
+
let maxScore = 0;
|
|
486
|
+
_.forEach(questions, question => {
|
|
487
|
+
maxScore += this.getMaxScore(question);
|
|
488
|
+
});
|
|
489
|
+
return maxScore;
|
|
490
|
+
}
|
|
491
|
+
static setActiveQuestion(currentQuestion, questions) {
|
|
492
|
+
_.forEach(questions, question => {
|
|
493
|
+
if (question.id == currentQuestion.id) {
|
|
494
|
+
question.active = true;
|
|
495
|
+
} else {
|
|
496
|
+
question.active = false;
|
|
497
|
+
}
|
|
498
|
+
});
|
|
499
|
+
}
|
|
500
|
+
static rebuildQuestionNumber(questions) {
|
|
501
|
+
let preNumber = 0;
|
|
502
|
+
_.forEach(questions, function (question) {
|
|
503
|
+
let number;
|
|
504
|
+
if (question.type === "TEXT_TITLE") {
|
|
505
|
+
number = QuestionTextTitleModel.getNumber(preNumber, question);
|
|
506
|
+
} else if (question.type === "MATRIX") {
|
|
507
|
+
number = QuestionMatrixModel.getNumber(preNumber, question);
|
|
508
|
+
} else if (question.type === "SCORING") {
|
|
509
|
+
number = QuestionScoringModel.getNumber(preNumber, question);
|
|
510
|
+
} else {
|
|
511
|
+
number = BaseQuestionModel.getNumber(preNumber, question);
|
|
512
|
+
}
|
|
513
|
+
question.header.number = number;
|
|
514
|
+
if (number) {
|
|
515
|
+
preNumber = number;
|
|
516
|
+
}
|
|
517
|
+
});
|
|
518
|
+
}
|
|
519
|
+
static deleteUnusedProperties(questions) {
|
|
520
|
+
_.forEach(questions, function (question) {
|
|
521
|
+
if (question.type === "SCORING") {
|
|
522
|
+
QuestionScoringModel.removeUnusedProperty(question);
|
|
523
|
+
}
|
|
524
|
+
});
|
|
525
|
+
}
|
|
526
|
+
}
|
|
527
|
+
class QuestionCheckBoxModel extends BaseQuestionModel {
|
|
528
|
+
constructor(type, locale) {
|
|
529
|
+
super(type, locale);
|
|
530
|
+
this.choices = QuestionFactory.createSelectionQuestionChoices(locale);
|
|
531
|
+
}
|
|
532
|
+
}
|
|
533
|
+
class QuestionEvaluationModel extends BaseQuestionModel {
|
|
534
|
+
constructor(type, locale) {
|
|
535
|
+
super(type, locale);
|
|
536
|
+
this.evaluationItems = QuestionFactory.createEvaluationItems(locale);
|
|
537
|
+
}
|
|
538
|
+
}
|
|
539
|
+
class QuestionTextTitleModel extends BaseQuestionModel {
|
|
540
|
+
constructor(type, locale) {
|
|
541
|
+
super(type, locale);
|
|
542
|
+
}
|
|
543
|
+
static getNumber(preNumber, question) {
|
|
544
|
+
return null;
|
|
545
|
+
}
|
|
546
|
+
}
|
|
547
|
+
class QuestionMatrixModel extends BaseQuestionModel {
|
|
548
|
+
constructor(type, locale) {
|
|
549
|
+
super(type, locale);
|
|
550
|
+
this.choices = QuestionFactory.createMatrixQuestionChoices(locale);
|
|
551
|
+
this.subQuestions = [QuestionFactory.createSubQuestion(locale)];
|
|
552
|
+
}
|
|
553
|
+
static getNumber(preNumber, question) {
|
|
554
|
+
const number = preNumber + 1;
|
|
555
|
+
_.forEach(question.subQuestions, (sq, index) => {
|
|
556
|
+
sq.number = index + 1;
|
|
557
|
+
});
|
|
558
|
+
return number;
|
|
559
|
+
}
|
|
560
|
+
}
|
|
561
|
+
class QuestionScoringModel extends BaseQuestionModel {
|
|
562
|
+
constructor(type, locale) {
|
|
563
|
+
super(type, locale);
|
|
564
|
+
this.subQuestions = [];
|
|
565
|
+
}
|
|
566
|
+
static getNumber(preNumber, question) {
|
|
567
|
+
const number = preNumber + 1;
|
|
568
|
+
_.forEach(question.subQuestions, (sq, index) => {
|
|
569
|
+
sq.number = index + 1;
|
|
570
|
+
});
|
|
571
|
+
return number;
|
|
572
|
+
}
|
|
573
|
+
static removeUnusedProperty(question) {
|
|
574
|
+
const options = question.options;
|
|
575
|
+
delete options.sliderValue;
|
|
576
|
+
_.forEach(question.subQuestions, subQuestion => {
|
|
577
|
+
delete subQuestion.sliderValue;
|
|
578
|
+
});
|
|
579
|
+
}
|
|
580
|
+
}
|
|
581
|
+
const ZH_CN = _.camelCase("zh-CN");
|
|
582
|
+
const EN_US = _.camelCase("en-US");
|
|
583
|
+
const ZH_TW = _.camelCase("zh-TW");
|
|
584
|
+
function getValue(obj, locale) {
|
|
585
|
+
const value = _.get(obj, _.camelCase(locale), "");
|
|
586
|
+
if (!_.isEmpty(value)) {
|
|
587
|
+
return value;
|
|
588
|
+
}
|
|
589
|
+
return _.get(obj, locale, "");
|
|
590
|
+
}
|
|
591
|
+
function translate(obj, locale, prettyMath = false) {
|
|
592
|
+
const value = getValue(obj, locale);
|
|
593
|
+
if (!_.isEmpty(value) || !prettyMath) {
|
|
594
|
+
return value;
|
|
595
|
+
}
|
|
596
|
+
return obj[ZH_CN] || obj["zh-CN"] || obj[EN_US] || obj["en-US"] || obj[ZH_TW] || obj["zh-TW"];
|
|
597
|
+
}
|
|
598
|
+
const CUSTOM_INPUT_REG = /(_{5,})/g;
|
|
599
|
+
function formatTitle(question, locale) {
|
|
600
|
+
const title = translate(question.header.text, locale, true);
|
|
601
|
+
if (!_.get(question, "options.richTextEnabled", false)) {
|
|
602
|
+
return [title];
|
|
603
|
+
}
|
|
604
|
+
const trimmedTitles = title.split(CUSTOM_INPUT_REG);
|
|
605
|
+
return trimmedTitles;
|
|
628
606
|
}
|
|
629
607
|
|
|
630
608
|
var LocaleMixin = Vue.extend({
|
|
@@ -1023,16 +1001,18 @@ var script$K = Vue.component("question-title-dynamic", {
|
|
|
1023
1001
|
let corespondTitle = _.find(self.customFilledTitle, (title) => {
|
|
1024
1002
|
return title.index === index;
|
|
1025
1003
|
});
|
|
1026
|
-
|
|
1027
|
-
|
|
1028
|
-
|
|
1029
|
-
|
|
1030
|
-
|
|
1031
|
-
|
|
1032
|
-
|
|
1004
|
+
if (corespondTitle !== undefined) {
|
|
1005
|
+
childArr.push(createElement(Input, {
|
|
1006
|
+
domProps: {
|
|
1007
|
+
value: corespondTitle.title
|
|
1008
|
+
},
|
|
1009
|
+
on: {
|
|
1010
|
+
input: function (value) {
|
|
1011
|
+
corespondTitle.title = value;
|
|
1012
|
+
}
|
|
1033
1013
|
}
|
|
1034
|
-
}
|
|
1035
|
-
}
|
|
1014
|
+
}));
|
|
1015
|
+
}
|
|
1036
1016
|
}
|
|
1037
1017
|
else {
|
|
1038
1018
|
childArr.push(title);
|
|
@@ -1103,11 +1083,11 @@ const __vue_script__$K = script$K;
|
|
|
1103
1083
|
/* style */
|
|
1104
1084
|
const __vue_inject_styles__$K = function (inject) {
|
|
1105
1085
|
if (!inject) return
|
|
1106
|
-
inject("data-v-
|
|
1086
|
+
inject("data-v-8a19c0a4_0", { source: "[data-v-8a19c0a4] .ivu-input-wrapper{width:auto}", map: undefined, media: undefined });
|
|
1107
1087
|
|
|
1108
1088
|
};
|
|
1109
1089
|
/* scoped */
|
|
1110
|
-
const __vue_scope_id__$K = "data-v-
|
|
1090
|
+
const __vue_scope_id__$K = "data-v-8a19c0a4";
|
|
1111
1091
|
/* module identifier */
|
|
1112
1092
|
const __vue_module_identifier__$K = undefined;
|
|
1113
1093
|
/* functional template */
|
|
@@ -2039,96 +2019,113 @@ var __vue_staticRenderFns__$z = [];
|
|
|
2039
2019
|
|
|
2040
2020
|
var Star$1 = __vue_component__$z;
|
|
2041
2021
|
|
|
2042
|
-
class ExprEvaluationQuestion {
|
|
2043
|
-
|
|
2044
|
-
|
|
2045
|
-
|
|
2046
|
-
|
|
2047
|
-
|
|
2048
|
-
|
|
2049
|
-
|
|
2050
|
-
|
|
2051
|
-
|
|
2052
|
-
|
|
2053
|
-
|
|
2054
|
-
|
|
2055
|
-
|
|
2056
|
-
|
|
2057
|
-
|
|
2058
|
-
|
|
2059
|
-
|
|
2060
|
-
|
|
2061
|
-
|
|
2062
|
-
|
|
2063
|
-
|
|
2064
|
-
|
|
2065
|
-
|
|
2066
|
-
|
|
2067
|
-
|
|
2068
|
-
|
|
2069
|
-
|
|
2070
|
-
|
|
2071
|
-
|
|
2072
|
-
|
|
2073
|
-
|
|
2074
|
-
|
|
2075
|
-
|
|
2076
|
-
|
|
2077
|
-
|
|
2078
|
-
|
|
2079
|
-
|
|
2080
|
-
|
|
2081
|
-
|
|
2082
|
-
|
|
2083
|
-
|
|
2084
|
-
|
|
2085
|
-
|
|
2086
|
-
|
|
2087
|
-
|
|
2088
|
-
|
|
2089
|
-
|
|
2090
|
-
|
|
2091
|
-
|
|
2092
|
-
|
|
2093
|
-
|
|
2094
|
-
|
|
2095
|
-
|
|
2096
|
-
|
|
2097
|
-
|
|
2098
|
-
|
|
2099
|
-
|
|
2100
|
-
|
|
2101
|
-
|
|
2102
|
-
|
|
2103
|
-
|
|
2104
|
-
|
|
2105
|
-
|
|
2106
|
-
|
|
2107
|
-
|
|
2108
|
-
|
|
2109
|
-
|
|
2110
|
-
|
|
2111
|
-
|
|
2112
|
-
|
|
2113
|
-
|
|
2114
|
-
|
|
2115
|
-
|
|
2116
|
-
|
|
2117
|
-
|
|
2118
|
-
|
|
2119
|
-
|
|
2120
|
-
|
|
2121
|
-
|
|
2122
|
-
|
|
2123
|
-
|
|
2124
|
-
|
|
2125
|
-
|
|
2126
|
-
|
|
2127
|
-
|
|
2128
|
-
|
|
2129
|
-
|
|
2130
|
-
|
|
2131
|
-
|
|
2022
|
+
class ExprEvaluationQuestion {
|
|
2023
|
+
questions;
|
|
2024
|
+
scope;
|
|
2025
|
+
questionMap;
|
|
2026
|
+
|
|
2027
|
+
constructor(questions, scope) {
|
|
2028
|
+
this.questions = questions;
|
|
2029
|
+
this.scope = _.sortBy(scope);
|
|
2030
|
+
|
|
2031
|
+
this.questionMap = this.buildQuestionMap();
|
|
2032
|
+
}
|
|
2033
|
+
|
|
2034
|
+
calculateNumbers() {
|
|
2035
|
+
const checkedQuestions = this.checkedQuestion();
|
|
2036
|
+
const checkedNumberElements = new Array();
|
|
2037
|
+
this.recurs(checkedQuestions, checkedNumberElements);
|
|
2038
|
+
|
|
2039
|
+
return checkedNumberElements;
|
|
2040
|
+
}
|
|
2041
|
+
|
|
2042
|
+
buildQuestionMap() {
|
|
2043
|
+
const questionMap = {};
|
|
2044
|
+
_.forEach(this.questions, (question) => {
|
|
2045
|
+
questionMap[question.id] = question;
|
|
2046
|
+
if (question.type == "MATRIX") {
|
|
2047
|
+
_.forEach(_.get(question, "subQuestions", []), (subQuestion) => {
|
|
2048
|
+
questionMap[subQuestion.id] = subQuestion;
|
|
2049
|
+
});
|
|
2050
|
+
}
|
|
2051
|
+
});
|
|
2052
|
+
return questionMap;
|
|
2053
|
+
}
|
|
2054
|
+
|
|
2055
|
+
checkedQuestion() {
|
|
2056
|
+
const questions = new Array();
|
|
2057
|
+
_.forEach(this.questions, (question) => {
|
|
2058
|
+
if (_.get(question, "type") == "MATRIX") {
|
|
2059
|
+
const markedQuestions = new Array();
|
|
2060
|
+
_.forEach(_.get(question, "subQuestions", []), (subQuestion) => {
|
|
2061
|
+
if (_.includes(this.scope, subQuestion.id)) {
|
|
2062
|
+
const newSubQuestion = _.cloneDeep(subQuestion);
|
|
2063
|
+
_.set(newSubQuestion, "type", "MATRIX");
|
|
2064
|
+
_.set(newSubQuestion, "parentId", _.get(question, "id"));
|
|
2065
|
+
markedQuestions.push(newSubQuestion);
|
|
2066
|
+
}
|
|
2067
|
+
});
|
|
2068
|
+
if (!_.isEmpty(markedQuestions)) {
|
|
2069
|
+
questions.push(markedQuestions);
|
|
2070
|
+
}
|
|
2071
|
+
} else if (_.includes(this.scope, question.id)) {
|
|
2072
|
+
questions.push(question);
|
|
2073
|
+
}
|
|
2074
|
+
});
|
|
2075
|
+
return questions;
|
|
2076
|
+
}
|
|
2077
|
+
|
|
2078
|
+
recurs(elements, numbers) {
|
|
2079
|
+
for (let i = 0; i < elements.length; i++) {
|
|
2080
|
+
const element = elements[i];
|
|
2081
|
+
if (_.isArray(element)) {
|
|
2082
|
+
numbers.push(new Array());
|
|
2083
|
+
this.recurs(element, numbers[numbers.length - 1]);
|
|
2084
|
+
} else {
|
|
2085
|
+
const temp = new Array();
|
|
2086
|
+
temp.push(this.getFullNumber(element));
|
|
2087
|
+
if (i == elements.length - 1) {
|
|
2088
|
+
numbers.push(temp);
|
|
2089
|
+
continue;
|
|
2090
|
+
}
|
|
2091
|
+
for (let j = i + 1; ; j++) {
|
|
2092
|
+
if (
|
|
2093
|
+
j == elements.length ||
|
|
2094
|
+
!this.isContinuous(elements[j - 1], elements[j])
|
|
2095
|
+
) {
|
|
2096
|
+
numbers.push(temp);
|
|
2097
|
+
i = j - 1;
|
|
2098
|
+
break;
|
|
2099
|
+
}
|
|
2100
|
+
if (_.size(temp) > 1) {
|
|
2101
|
+
temp.pop();
|
|
2102
|
+
}
|
|
2103
|
+
temp.push(this.getFullNumber(elements[j]));
|
|
2104
|
+
}
|
|
2105
|
+
}
|
|
2106
|
+
}
|
|
2107
|
+
}
|
|
2108
|
+
|
|
2109
|
+
isContinuous(front, hind) {
|
|
2110
|
+
return (
|
|
2111
|
+
!_.isArray(hind) && this.getNumber(hind) - this.getNumber(front) == 1
|
|
2112
|
+
);
|
|
2113
|
+
}
|
|
2114
|
+
|
|
2115
|
+
getFullNumber(question) {
|
|
2116
|
+
if (question.type == "MATRIX") {
|
|
2117
|
+
return (
|
|
2118
|
+
this.questionMap[question.parentId].header.number +
|
|
2119
|
+
"." +
|
|
2120
|
+
this.getNumber(question)
|
|
2121
|
+
);
|
|
2122
|
+
}
|
|
2123
|
+
return this.getNumber(question).toString();
|
|
2124
|
+
}
|
|
2125
|
+
|
|
2126
|
+
getNumber(question) {
|
|
2127
|
+
return question.type == "MATRIX" ? question.number : question.header.number;
|
|
2128
|
+
}
|
|
2132
2129
|
}
|
|
2133
2130
|
|
|
2134
2131
|
const SPLIT_LENGTH = 60;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@wg-npm/survey-creator",
|
|
3
|
-
"version": "0.5.
|
|
3
|
+
"version": "0.5.168",
|
|
4
4
|
"description": "",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"scripts": {
|
|
@@ -12,8 +12,8 @@
|
|
|
12
12
|
"lint-fix": "eslint \"**/*.ts\" \"**/*.vue\" --fix --no-error-on-unmatched-pattern"
|
|
13
13
|
},
|
|
14
14
|
"peerDependencies": {
|
|
15
|
-
"@wg-npm/survey-core": "0.5.
|
|
16
|
-
"@wg-npm/survey-service-api": "0.5.
|
|
15
|
+
"@wg-npm/survey-core": "0.5.168",
|
|
16
|
+
"@wg-npm/survey-service-api": "0.5.168",
|
|
17
17
|
"axios": "^0.19.2",
|
|
18
18
|
"camelcase": "^6.0.0",
|
|
19
19
|
"deepmerge": "^4.2.2",
|
|
@@ -38,8 +38,8 @@
|
|
|
38
38
|
"@typescript-eslint/eslint-plugin": "^3.6.0",
|
|
39
39
|
"@typescript-eslint/parser": "^3.6.0",
|
|
40
40
|
"@vue/eslint-config-prettier": "^6.0.0",
|
|
41
|
-
"@wg-npm/survey-core": "0.5.
|
|
42
|
-
"@wg-npm/survey-service-api": "0.5.
|
|
41
|
+
"@wg-npm/survey-core": "0.5.168",
|
|
42
|
+
"@wg-npm/survey-service-api": "0.5.168",
|
|
43
43
|
"acorn": "^7.3.1",
|
|
44
44
|
"axios": "^0.19.2",
|
|
45
45
|
"babelrc-rollup": "^3.0.0",
|
|
@@ -29,6 +29,7 @@ export default Vue.component("question-title-dynamic", {
|
|
|
29
29
|
let corespondTitle = _.find(self.customFilledTitle, (title) => {
|
|
30
30
|
return title.index === index;
|
|
31
31
|
});
|
|
32
|
+
if(corespondTitle!==undefined){
|
|
32
33
|
childArr.push(createElement(Input, {
|
|
33
34
|
domProps: {
|
|
34
35
|
value: corespondTitle.title
|
|
@@ -38,7 +39,7 @@ export default Vue.component("question-title-dynamic", {
|
|
|
38
39
|
corespondTitle.title = value;
|
|
39
40
|
}
|
|
40
41
|
}
|
|
41
|
-
}));
|
|
42
|
+
}));}
|
|
42
43
|
} else {
|
|
43
44
|
childArr.push(title);
|
|
44
45
|
}
|
|
@@ -52,4 +53,4 @@ export default Vue.component("question-title-dynamic", {
|
|
|
52
53
|
/deep/ .ivu-input-wrapper {
|
|
53
54
|
width: auto;
|
|
54
55
|
}
|
|
55
|
-
</style>
|
|
56
|
+
</style>
|