decidim-forms 0.20.1 → 0.23.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/assets/config/admin/decidim_forms_manifest.css +3 -0
- data/app/assets/config/admin/decidim_forms_manifest.js +1 -0
- data/app/assets/config/decidim_forms_manifest.css +1 -0
- data/app/assets/images/decidim/surveys/icon.svg +1 -19
- data/app/assets/javascripts/decidim/forms/admin/auto_select_options_from_url.component.js.es6 +40 -0
- data/app/assets/javascripts/decidim/forms/admin/collapsible_questions.js.es6 +13 -0
- data/app/assets/javascripts/decidim/forms/admin/forms.js.es6 +260 -16
- data/app/assets/javascripts/decidim/forms/admin/live_text_update.component.js.es6 +52 -0
- data/app/assets/javascripts/decidim/forms/autosortable_checkboxes.component.js.es6 +54 -34
- data/app/assets/javascripts/decidim/forms/display_conditions.component.js.es6 +203 -0
- data/app/assets/javascripts/decidim/forms/forms.js.es6 +49 -1
- data/app/assets/javascripts/decidim/forms/max_choices_alert.component.js.es6 +44 -0
- data/app/assets/stylesheets/decidim/forms/forms.scss +39 -0
- data/app/assets/stylesheets/decidim/forms/questionnaire-answers-pdf.scss +69 -0
- data/app/cells/decidim/forms/matrix_readonly/show.erb +5 -0
- data/app/cells/decidim/forms/matrix_readonly_cell.rb +12 -0
- data/app/cells/decidim/forms/question_readonly/show.erb +5 -1
- data/app/cells/decidim/forms/question_readonly_cell.rb +5 -0
- data/app/cells/decidim/forms/step_navigation/show.erb +35 -0
- data/app/cells/decidim/forms/step_navigation_cell.rb +46 -0
- data/app/commands/decidim/forms/admin/update_questionnaire.rb +33 -1
- data/app/commands/decidim/forms/answer_questionnaire.rb +2 -1
- data/app/controllers/decidim/forms/admin/concerns/has_questionnaire.rb +52 -2
- data/app/controllers/decidim/forms/admin/concerns/has_questionnaire_answers.rb +97 -0
- data/app/controllers/decidim/forms/concerns/has_questionnaire.rb +11 -2
- data/app/forms/decidim/forms/admin/display_condition_form.rb +100 -0
- data/app/forms/decidim/forms/admin/question_form.rb +21 -1
- data/app/forms/decidim/forms/admin/question_matrix_row_form.rb +26 -0
- data/app/forms/decidim/forms/answer_choice_form.rb +1 -0
- data/app/forms/decidim/forms/answer_form.rb +31 -2
- data/app/forms/decidim/forms/questionnaire_form.rb +30 -3
- data/app/helpers/decidim/forms/admin/application_helper.rb +37 -0
- data/app/helpers/decidim/forms/admin/concerns/has_questionnaire_answers_pagination_helper.rb +49 -0
- data/app/helpers/decidim/forms/admin/concerns/has_questionnaire_answers_url_helper.rb +40 -0
- data/app/helpers/decidim/forms/admin/questionnaire_answers_helper.rb +27 -0
- data/app/jobs/decidim/forms/export_questionnaire_answers_job.rb +19 -0
- data/app/models/decidim/forms/answer.rb +0 -3
- data/app/models/decidim/forms/answer_choice.rb +7 -0
- data/app/models/decidim/forms/answer_option.rb +14 -0
- data/app/models/decidim/forms/display_condition.rb +65 -0
- data/app/models/decidim/forms/question.rb +52 -2
- data/app/models/decidim/forms/question_matrix_row.rb +15 -0
- data/app/models/decidim/forms/questionnaire.rb +11 -1
- data/app/presenters/decidim/forms/admin/questionnaire_answer_presenter.rb +43 -0
- data/app/presenters/decidim/forms/admin/questionnaire_participant_presenter.rb +60 -0
- data/app/presenters/decidim/forms/answer_option_presenter.rb +20 -0
- data/app/presenters/decidim/forms/question_presenter.rb +16 -0
- data/app/queries/decidim/forms/questionnaire_participant.rb +35 -0
- data/app/queries/decidim/forms/questionnaire_participants.rb +43 -0
- data/app/types/decidim/forms/answer_option_type.rb +14 -0
- data/app/types/decidim/forms/question_type.rb +23 -0
- data/app/types/decidim/forms/questionnaire_type.rb +22 -0
- data/app/views/decidim/forms/admin/questionnaires/_answer_option_template.html.erb +1 -1
- data/app/views/decidim/forms/admin/questionnaires/_display_condition.html.erb +88 -0
- data/app/views/decidim/forms/admin/questionnaires/_display_condition_template.html.erb +7 -0
- data/app/views/decidim/forms/admin/questionnaires/_form.html.erb +67 -8
- data/app/views/decidim/forms/admin/questionnaires/_matrix_row.html.erb +34 -0
- data/app/views/decidim/forms/admin/questionnaires/_matrix_row_template.html.erb +7 -0
- data/app/views/decidim/forms/admin/questionnaires/_question.html.erb +45 -6
- data/app/views/decidim/forms/admin/questionnaires/_separator.html.erb +41 -0
- data/app/views/decidim/forms/admin/questionnaires/answers/export/_answer.html.erb +31 -0
- data/app/views/decidim/forms/admin/questionnaires/answers/export/pdf.html.erb +13 -0
- data/app/views/decidim/forms/admin/questionnaires/answers/index.html.erb +53 -0
- data/app/views/decidim/forms/admin/questionnaires/answers/show.html.erb +48 -0
- data/app/views/decidim/forms/admin/questionnaires/edit.html.erb +9 -5
- data/app/views/decidim/forms/questionnaires/_answer.html.erb +28 -99
- data/app/views/decidim/forms/questionnaires/answers/_long_answer.html.erb +1 -0
- data/app/views/decidim/forms/questionnaires/answers/_matrix_multiple.html.erb +43 -0
- data/app/views/decidim/forms/questionnaires/answers/_matrix_single.html.erb +43 -0
- data/app/views/decidim/forms/questionnaires/answers/_multiple_option.html.erb +23 -0
- data/app/views/decidim/forms/questionnaires/answers/_separator.html.erb +1 -0
- data/app/views/decidim/forms/questionnaires/answers/_short_answer.html.erb +1 -0
- data/app/views/decidim/forms/questionnaires/answers/_single_option.html.erb +30 -0
- data/app/views/decidim/forms/questionnaires/answers/_sorting.html.erb +23 -0
- data/app/views/decidim/forms/questionnaires/show.html.erb +78 -26
- data/app/views/layouts/decidim/forms/admin/questionnaires/questionnaire_answers.html.erb +12 -0
- data/config/initializers/wicked_pdf.rb +25 -0
- data/config/locales/am-ET.yml +1 -0
- data/config/locales/ar.yml +7 -4
- data/config/locales/bg-BG.yml +14 -0
- data/config/locales/bg.yml +14 -0
- data/config/locales/ca.yml +89 -5
- data/config/locales/cs.yml +89 -5
- data/config/locales/da-DK.yml +1 -0
- data/config/locales/da.yml +1 -0
- data/config/locales/de.yml +92 -4
- data/config/locales/el.yml +118 -0
- data/config/locales/en.yml +89 -5
- data/config/locales/eo.yml +1 -0
- data/config/locales/es-MX.yml +88 -4
- data/config/locales/es-PY.yml +88 -4
- data/config/locales/es.yml +88 -4
- data/config/locales/et-EE.yml +1 -0
- data/config/locales/et.yml +1 -0
- data/config/locales/eu.yml +7 -4
- data/config/locales/fi-plain.yml +88 -4
- data/config/locales/fi.yml +88 -4
- data/config/locales/fr-CA.yml +172 -0
- data/config/locales/fr.yml +89 -5
- data/config/locales/ga-IE.yml +1 -0
- data/config/locales/gl.yml +7 -4
- data/config/locales/hr-HR.yml +1 -0
- data/config/locales/hr.yml +1 -0
- data/config/locales/hu.yml +11 -5
- data/config/locales/id-ID.yml +7 -4
- data/config/locales/is.yml +1 -0
- data/config/locales/it.yml +89 -5
- data/config/locales/ja-JP.yml +170 -0
- data/config/locales/ja.yml +170 -0
- data/config/locales/ko-KR.yml +1 -0
- data/config/locales/ko.yml +1 -0
- data/config/locales/lt-LT.yml +1 -0
- data/config/locales/lt.yml +1 -0
- data/config/locales/lv.yml +118 -0
- data/config/locales/mt-MT.yml +1 -0
- data/config/locales/mt.yml +1 -0
- data/config/locales/nl.yml +92 -8
- data/config/locales/no.yml +54 -5
- data/config/locales/om-ET.yml +1 -0
- data/config/locales/pl.yml +113 -26
- data/config/locales/pt-BR.yml +8 -5
- data/config/locales/pt.yml +111 -24
- data/config/locales/ro-RO.yml +167 -0
- data/config/locales/ru.yml +4 -2
- data/config/locales/sk-SK.yml +88 -0
- data/config/locales/sk.yml +90 -0
- data/config/locales/sl.yml +12 -0
- data/config/locales/so-SO.yml +1 -0
- data/config/locales/sr-CS.yml +1 -0
- data/config/locales/sv.yml +88 -7
- data/config/locales/ti-ER.yml +1 -0
- data/config/locales/tr-TR.yml +7 -4
- data/config/locales/vi-VN.yml +1 -0
- data/config/locales/vi.yml +1 -0
- data/config/locales/zh-CN.yml +172 -0
- data/config/locales/zh-TW.yml +1 -0
- data/db/migrate/20200130194123_create_decidim_forms_display_conditions.rb +20 -0
- data/db/migrate/20200225123810_create_decidim_forms_question_matrix_rows.rb +11 -0
- data/db/migrate/20200304152939_add_matrix_row_id_to_decidim_forms_answer_choices.rb +11 -0
- data/lib/decidim/api/questionnaire_entity_interface.rb +18 -0
- data/lib/decidim/exporters/form_pdf.rb +33 -0
- data/lib/decidim/exporters/form_pdf_controller_helper.rb +11 -0
- data/lib/decidim/forms.rb +6 -0
- data/lib/decidim/forms/admin_engine.rb +1 -1
- data/lib/decidim/forms/api.rb +7 -0
- data/lib/decidim/forms/test.rb +6 -0
- data/lib/decidim/forms/test/factories.rb +55 -0
- data/lib/decidim/forms/test/shared_examples/has_questionnaire.rb +918 -60
- data/lib/decidim/forms/test/shared_examples/manage_questionnaire_answers.rb +108 -0
- data/lib/decidim/forms/test/shared_examples/manage_questionnaires.rb +33 -575
- data/lib/decidim/forms/test/shared_examples/manage_questionnaires/add_display_conditions.rb +179 -0
- data/lib/decidim/forms/test/shared_examples/manage_questionnaires/add_questions.rb +463 -0
- data/lib/decidim/forms/test/shared_examples/manage_questionnaires/update_display_conditions.rb +93 -0
- data/lib/decidim/forms/test/shared_examples/manage_questionnaires/update_questions.rb +461 -0
- data/lib/decidim/forms/user_answers_serializer.rb +21 -4
- data/lib/decidim/forms/version.rb +1 -1
- metadata +133 -10
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 00b6fa084292af8d4b343f801ccc5725a7983e3390b41dcd00f2b84b34afc914
|
4
|
+
data.tar.gz: 9f037814dca4fd315e6425074dc2d8c42f8c144d1bb8c5042897dd8ab5410bdf
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fc48b056500a941f30b72dd044e9614008b8a0e84111e10af937ce00bab58d13a2e8938a4fa7a8dea9660dbb6c00ffc5b897330f42a9f73a2203edd5c86dd6d9
|
7
|
+
data.tar.gz: a0dbe8818ba0efbe2d7d8b1f9503c5b07cde7023437d81ab5ee1c1695a16631d26e054cc8dd072460c97c652101ef34ef5489e6bfb596cc6376d58f3e53fd184
|
@@ -1,19 +1 @@
|
|
1
|
-
|
2
|
-
<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
3
|
-
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
4
|
-
viewBox="0 0 36 36" style="enable-background:new 0 0 36 36;" xml:space="preserve">
|
5
|
-
<path d="M27,28H9c-0.6,0-1-0.4-1-1V11c0-0.6,0.4-1,1-1h3.1c0.6,0,1,0.4,1,1v1.9h9.7V11c0-0.6,0.4-1,1-1H27c0.6,0,1,0.4,1,1v16
|
6
|
-
C28,27.6,27.6,28,27,28z M10,26h16V12h-1.2v1.9c0,0.6-0.4,1-1,1H12.1c-0.6,0-1-0.4-1-1V12H10V26z"/>
|
7
|
-
<g>
|
8
|
-
<g>
|
9
|
-
<path d="M21,11h-6c-0.6,0-1-0.4-1-1s0.4-1,1-1h6c0.6,0,1,0.4,1,1S21.6,11,21,11z"/>
|
10
|
-
</g>
|
11
|
-
<g>
|
12
|
-
<path d="M18.7,11h-1.5c-0.6,0-1-0.4-1-1V8c0-0.6,0.4-1,1-1h1.5c0.6,0,1,0.4,1,1v2C19.7,10.5,19.3,11,18.7,11z"/>
|
13
|
-
</g>
|
14
|
-
</g>
|
15
|
-
<g>
|
16
|
-
<path d="M18,36.1c-9.9,0-18-8.1-18-18s8.1-18,18-18s18,8.1,18,18S27.9,36.1,18,36.1z M18,2.1c-8.8,0-16,7.2-16,16s7.2,16,16,16
|
17
|
-
s16-7.2,16-16S26.8,2.1,18,2.1z"/>
|
18
|
-
</g>
|
19
|
-
</svg>
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" id="Layer_1" x="0" y="0" enable-background="new 0 0 36 36" version="1.1" viewBox="0 0 36 36" xml:space="preserve"><path d="M27,28H9c-0.6,0-1-0.4-1-1V11c0-0.6,0.4-1,1-1h3.1c0.6,0,1,0.4,1,1v1.9h9.7V11c0-0.6,0.4-1,1-1H27c0.6,0,1,0.4,1,1v16 C28,27.6,27.6,28,27,28z M10,26h16V12h-1.2v1.9c0,0.6-0.4,1-1,1H12.1c-0.6,0-1-0.4-1-1V12H10V26z"/><g><g><path d="M21,11h-6c-0.6,0-1-0.4-1-1s0.4-1,1-1h6c0.6,0,1,0.4,1,1S21.6,11,21,11z"/></g><g><path d="M18.7,11h-1.5c-0.6,0-1-0.4-1-1V8c0-0.6,0.4-1,1-1h1.5c0.6,0,1,0.4,1,1v2C19.7,10.5,19.3,11,18.7,11z"/></g></g><g><path d="M18,36.1c-9.9,0-18-8.1-18-18s8.1-18,18-18s18,8.1,18,18S27.9,36.1,18,36.1z M18,2.1c-8.8,0-16,7.2-16,16s7.2,16,16,16 s16-7.2,16-16S26.8,2.1,18,2.1z"/></g></svg>
|
@@ -0,0 +1,40 @@
|
|
1
|
+
((exports) => {
|
2
|
+
class AutoSelectOptionsFromUrl {
|
3
|
+
constructor(options = {}) {
|
4
|
+
this.$source = options.source;
|
5
|
+
this.$select = options.select;
|
6
|
+
this.sourceToParams = options.sourceToParams;
|
7
|
+
this.run();
|
8
|
+
}
|
9
|
+
|
10
|
+
run() {
|
11
|
+
this.$source.on("change", this._onSourceChange.bind(this));
|
12
|
+
this._onSourceChange();
|
13
|
+
}
|
14
|
+
|
15
|
+
_onSourceChange() {
|
16
|
+
const select = this.$select;
|
17
|
+
const params = this.sourceToParams(this.$source);
|
18
|
+
const url = this.$source.data("url");
|
19
|
+
|
20
|
+
$.getJSON(url, params, function (data) {
|
21
|
+
select.find("option:not([value=''])").remove();
|
22
|
+
const selectedValue = select.data("selected");
|
23
|
+
|
24
|
+
data.forEach((option) => {
|
25
|
+
let optionElement = $(`<option value="${option.id}">${option.body}</option>`).appendTo(select);
|
26
|
+
if (option.id === selectedValue) {
|
27
|
+
optionElement.attr("selected", true);
|
28
|
+
}
|
29
|
+
});
|
30
|
+
|
31
|
+
if (selectedValue) {
|
32
|
+
select.val(selectedValue);
|
33
|
+
}
|
34
|
+
});
|
35
|
+
}
|
36
|
+
}
|
37
|
+
|
38
|
+
exports.DecidimAdmin = exports.DecidimAdmin || {};
|
39
|
+
exports.DecidimAdmin.AutoSelectOptionsFromUrl = AutoSelectOptionsFromUrl;
|
40
|
+
})(window);
|
@@ -0,0 +1,13 @@
|
|
1
|
+
(() => {
|
2
|
+
$("button.collapse-all").on("click", () => {
|
3
|
+
$(".collapsible").addClass("hide");
|
4
|
+
$(".question--collapse .icon-expand").removeClass("hide");
|
5
|
+
$(".question--collapse .icon-collapse").addClass("hide");
|
6
|
+
});
|
7
|
+
|
8
|
+
$("button.expand-all").on("click", () => {
|
9
|
+
$(".collapsible").removeClass("hide");
|
10
|
+
$(".question--collapse .icon-expand").addClass("hide");
|
11
|
+
$(".question--collapse .icon-collapse").removeClass("hide");
|
12
|
+
});
|
13
|
+
})(window);
|
@@ -1,8 +1,12 @@
|
|
1
|
+
/* eslint-disable max-lines */
|
2
|
+
|
1
3
|
// = require ./auto_buttons_by_min_items.component
|
2
4
|
// = require ./auto_select_options_by_total_items.component
|
5
|
+
// = require ./auto_select_options_from_url.component
|
6
|
+
// = require ./live_text_update.component
|
3
7
|
|
4
8
|
((exports) => {
|
5
|
-
const { AutoLabelByPositionComponent, AutoButtonsByPositionComponent, AutoButtonsByMinItemsComponent, AutoSelectOptionsByTotalItemsComponent, createFieldDependentInputs, createDynamicFields, createSortList } = exports.DecidimAdmin;
|
9
|
+
const { AutoLabelByPositionComponent, AutoButtonsByPositionComponent, AutoButtonsByMinItemsComponent, AutoSelectOptionsByTotalItemsComponent, AutoSelectOptionsFromUrl, createLiveTextUpdateComponent, createFieldDependentInputs, createDynamicFields, createSortList } = exports.DecidimAdmin;
|
6
10
|
const { createQuillEditor } = exports.Decidim;
|
7
11
|
|
8
12
|
const wrapperSelector = ".questionnaire-questions";
|
@@ -11,21 +15,60 @@
|
|
11
15
|
const answerOptionFieldSelector = ".questionnaire-question-answer-option";
|
12
16
|
const answerOptionsWrapperSelector = ".questionnaire-question-answer-options";
|
13
17
|
const answerOptionRemoveFieldButtonSelector = ".remove-answer-option";
|
18
|
+
const matrixRowFieldSelector = ".questionnaire-question-matrix-row";
|
19
|
+
const matrixRowsWrapperSelector = ".questionnaire-question-matrix-rows";
|
20
|
+
const matrixRowRemoveFieldButtonSelector = ".remove-matrix-row";
|
21
|
+
const addMatrixRowButtonSelector = ".add-matrix-row";
|
14
22
|
const maxChoicesWrapperSelector = ".questionnaire-question-max-choices";
|
15
23
|
|
24
|
+
const displayConditionFieldSelector = ".questionnaire-question-display-condition";
|
25
|
+
const displayConditionsWrapperSelector = ".questionnaire-question-display-conditions";
|
26
|
+
const displayConditionRemoveFieldButtonSelector = ".remove-display-condition";
|
27
|
+
|
28
|
+
const displayConditionQuestionSelector = "select[name$=\\[decidim_condition_question_id\\]]";
|
29
|
+
const displayConditionAnswerOptionSelector = "select[name$=\\[decidim_answer_option_id\\]]";
|
30
|
+
const displayConditionTypeSelector = "select[name$=\\[condition_type\\]]";
|
31
|
+
const deletedInputSelector = "input[name$=\\[deleted\\]]";
|
32
|
+
|
33
|
+
const displayConditionValueWrapperSelector = ".questionnaire-question-display-condition-value";
|
34
|
+
const displayconditionAnswerOptionWrapperSelector = ".questionnaire-question-display-condition-answer-option";
|
35
|
+
|
36
|
+
const addDisplayConditionButtonSelector = ".add-display-condition";
|
37
|
+
|
38
|
+
const removeDisplayConditionsForFirstQuestion = () => {
|
39
|
+
$(fieldSelector).each((idx, el) => {
|
40
|
+
const $question = $(el);
|
41
|
+
if (idx) {
|
42
|
+
$question.find(displayConditionsWrapperSelector).find(deletedInputSelector).val("false");
|
43
|
+
$question.find(displayConditionsWrapperSelector).show();
|
44
|
+
}
|
45
|
+
else {
|
46
|
+
$question.find(displayConditionsWrapperSelector).find(deletedInputSelector).val("true");
|
47
|
+
$question.find(displayConditionsWrapperSelector).hide();
|
48
|
+
}
|
49
|
+
});
|
50
|
+
};
|
51
|
+
|
52
|
+
const autoButtonsByPosition = new AutoButtonsByPositionComponent({
|
53
|
+
listSelector: ".questionnaire-question:not(.hidden)",
|
54
|
+
hideOnFirstSelector: ".move-up-question",
|
55
|
+
hideOnLastSelector: ".move-down-question"
|
56
|
+
});
|
57
|
+
|
16
58
|
const autoLabelByPosition = new AutoLabelByPositionComponent({
|
17
59
|
listSelector: ".questionnaire-question:not(.hidden)",
|
18
60
|
labelSelector: ".card-title span:first",
|
19
61
|
onPositionComputed: (el, idx) => {
|
20
62
|
$(el).find("input[name$=\\[position\\]]").val(idx);
|
63
|
+
|
64
|
+
autoButtonsByPosition.run();
|
65
|
+
|
66
|
+
removeDisplayConditionsForFirstQuestion();
|
21
67
|
}
|
22
68
|
});
|
23
69
|
|
24
|
-
const
|
25
|
-
|
26
|
-
hideOnFirstSelector: ".move-up-question",
|
27
|
-
hideOnLastSelector: ".move-down-question"
|
28
|
-
});
|
70
|
+
const MULTIPLE_CHOICE_VALUES = ["single_option", "multiple_option", "sorting", "matrix_single", "matrix_multiple"];
|
71
|
+
const MATRIX_VALUES = ["matrix_single", "matrix_multiple"];
|
29
72
|
|
30
73
|
const createAutoMaxChoicesByNumberOfAnswerOptions = (fieldId) => {
|
31
74
|
return new AutoSelectOptionsByTotalItemsComponent({
|
@@ -44,15 +87,51 @@
|
|
44
87
|
})
|
45
88
|
};
|
46
89
|
|
90
|
+
const createAutoSelectOptionsFromUrl = ($field) => {
|
91
|
+
return new AutoSelectOptionsFromUrl({
|
92
|
+
source: $field.find(displayConditionQuestionSelector),
|
93
|
+
select: $field.find(displayConditionAnswerOptionSelector),
|
94
|
+
sourceToParams: ($element) => { return { id: $element.val() } }
|
95
|
+
})
|
96
|
+
};
|
97
|
+
|
47
98
|
const createSortableList = () => {
|
48
99
|
createSortList(".questionnaire-questions-list:not(.published)", {
|
49
100
|
handle: ".question-divider",
|
50
101
|
placeholder: '<div style="border-style: dashed; border-color: #000"></div>',
|
51
102
|
forcePlaceholderSize: true,
|
52
|
-
onSortUpdate: () => {
|
103
|
+
onSortUpdate: () => {
|
104
|
+
autoLabelByPosition.run();
|
105
|
+
autoButtonsByPosition.run();
|
106
|
+
}
|
53
107
|
});
|
54
108
|
};
|
55
109
|
|
110
|
+
const createDynamicQuestionTitle = (fieldId) => {
|
111
|
+
const targetSelector = `#${fieldId} .question-title-statement`;
|
112
|
+
const locale = $(targetSelector).data("locale");
|
113
|
+
const maxLength = $(targetSelector).data("max-length");
|
114
|
+
const omission = $(targetSelector).data("omission");
|
115
|
+
const placeholder = $(targetSelector).data("placeholder");
|
116
|
+
|
117
|
+
return createLiveTextUpdateComponent({
|
118
|
+
inputSelector: `#${fieldId} input[name$=\\[body_${locale}\\]]`,
|
119
|
+
targetSelector: targetSelector,
|
120
|
+
maxLength: maxLength,
|
121
|
+
omission: omission,
|
122
|
+
placeholder: placeholder
|
123
|
+
});
|
124
|
+
}
|
125
|
+
|
126
|
+
const createCollapsibleQuestion = ($target) => {
|
127
|
+
const $collapsible = $target.find(".collapsible");
|
128
|
+
if ($collapsible.length > 0) {
|
129
|
+
const collapsibleId = $collapsible.attr("id").replace("-question-card", "");
|
130
|
+
const toggleAttr = `${collapsibleId}-question-card button--collapse-question-${collapsibleId} button--expand-question-${collapsibleId}`;
|
131
|
+
$target.find(".question--collapse").data("toggle", toggleAttr);
|
132
|
+
}
|
133
|
+
};
|
134
|
+
|
56
135
|
const createDynamicFieldsForAnswerOptions = (fieldId) => {
|
57
136
|
const autoButtons = createAutoButtonsByMinItemsForAnswerOptions(fieldId);
|
58
137
|
const autoSelectOptions = createAutoMaxChoicesByNumberOfAnswerOptions(fieldId);
|
@@ -63,6 +142,7 @@
|
|
63
142
|
containerSelector: ".questionnaire-question-answer-options-list",
|
64
143
|
fieldSelector: answerOptionFieldSelector,
|
65
144
|
addFieldButtonSelector: ".add-answer-option",
|
145
|
+
fieldTemplateSelector: ".decidim-answer-option-template",
|
66
146
|
removeFieldButtonSelector: answerOptionRemoveFieldButtonSelector,
|
67
147
|
onAddField: () => {
|
68
148
|
autoButtons.run();
|
@@ -77,23 +157,149 @@
|
|
77
157
|
|
78
158
|
const dynamicFieldsForAnswerOptions = {};
|
79
159
|
|
80
|
-
const
|
81
|
-
|
160
|
+
const createDynamicFieldsForMatrixRows = (fieldId) => {
|
161
|
+
return createDynamicFields({
|
162
|
+
placeholderId: "questionnaire-question-matrix-row-id",
|
163
|
+
wrapperSelector: `#${fieldId} ${matrixRowsWrapperSelector}`,
|
164
|
+
containerSelector: ".questionnaire-question-matrix-rows-list",
|
165
|
+
fieldSelector: matrixRowFieldSelector,
|
166
|
+
addFieldButtonSelector: addMatrixRowButtonSelector,
|
167
|
+
fieldTemplateSelector: ".decidim-matrix-row-template",
|
168
|
+
removeFieldButtonSelector: matrixRowRemoveFieldButtonSelector,
|
169
|
+
onAddField: () => {
|
170
|
+
},
|
171
|
+
onRemoveField: () => {
|
172
|
+
}
|
173
|
+
});
|
174
|
+
};
|
175
|
+
|
176
|
+
const dynamicFieldsForMatrixRows = {};
|
177
|
+
|
178
|
+
const isMultipleChoiceOption = (value) => {
|
179
|
+
return MULTIPLE_CHOICE_VALUES.indexOf(value) >= 0;
|
180
|
+
}
|
181
|
+
|
182
|
+
const isMatrix = (value) => {
|
183
|
+
return MATRIX_VALUES.indexOf(value) >= 0;
|
184
|
+
}
|
185
|
+
|
186
|
+
const getSelectedQuestionType = (select) => {
|
187
|
+
const selectedOption = select.options[select.selectedIndex];
|
188
|
+
return $(selectedOption).data("type");
|
189
|
+
};
|
190
|
+
|
191
|
+
const onDisplayConditionQuestionChange = ($field) => {
|
192
|
+
const $questionSelector = $field.find(displayConditionQuestionSelector);
|
193
|
+
const selectedQuestionType = getSelectedQuestionType($questionSelector[0]);
|
194
|
+
|
195
|
+
const isMultiple = isMultipleChoiceOption(selectedQuestionType);
|
196
|
+
|
197
|
+
let conditionTypes = ["answered", "not_answered"];
|
198
|
+
|
199
|
+
if (isMultiple) {
|
200
|
+
conditionTypes.push("equal");
|
201
|
+
conditionTypes.push("not_equal");
|
202
|
+
}
|
203
|
+
|
204
|
+
conditionTypes.push("match");
|
205
|
+
|
206
|
+
const $conditionTypeSelect = $field.find(displayConditionTypeSelector);
|
207
|
+
|
208
|
+
$conditionTypeSelect.find("option").each((idx, option) => {
|
209
|
+
const $option = $(option);
|
210
|
+
const value = $option.val();
|
211
|
+
|
212
|
+
if (!value) {
|
213
|
+
return;
|
214
|
+
}
|
215
|
+
|
216
|
+
$option.show();
|
217
|
+
|
218
|
+
if (conditionTypes.indexOf(value) < 0) {
|
219
|
+
$option.hide();
|
220
|
+
}
|
221
|
+
});
|
222
|
+
|
223
|
+
if (conditionTypes.indexOf($conditionTypeSelect.val()) < 0) {
|
224
|
+
$conditionTypeSelect.val(conditionTypes[0]);
|
225
|
+
}
|
226
|
+
|
227
|
+
$conditionTypeSelect.trigger("change");
|
228
|
+
};
|
229
|
+
|
230
|
+
const onDisplayConditionTypeChange = ($field) => {
|
231
|
+
const value = $field.find(displayConditionTypeSelector).val();
|
232
|
+
const $valueWrapper = $field.find(displayConditionValueWrapperSelector);
|
233
|
+
const $answerOptionWrapper = $field.find(displayconditionAnswerOptionWrapperSelector);
|
234
|
+
|
235
|
+
const $questionSelector = $field.find(displayConditionQuestionSelector);
|
236
|
+
const selectedQuestionType = getSelectedQuestionType($questionSelector[0]);
|
237
|
+
|
238
|
+
const isMultiple = isMultipleChoiceOption(selectedQuestionType);
|
239
|
+
|
240
|
+
if (value === "match") {
|
241
|
+
$valueWrapper.show();
|
242
|
+
}
|
243
|
+
else {
|
244
|
+
$valueWrapper.hide();
|
245
|
+
}
|
246
|
+
|
247
|
+
if (isMultiple && (value === "not_equal" || value === "equal")) {
|
248
|
+
$answerOptionWrapper.show();
|
249
|
+
}
|
250
|
+
else {
|
251
|
+
$answerOptionWrapper.hide();
|
252
|
+
}
|
253
|
+
};
|
254
|
+
|
255
|
+
const initializeDisplayConditionField = ($field) => {
|
256
|
+
const autoSelectByUrl = createAutoSelectOptionsFromUrl($field);
|
257
|
+
autoSelectByUrl.run();
|
258
|
+
|
259
|
+
$field.find(displayConditionQuestionSelector).on("change", () => {
|
260
|
+
onDisplayConditionQuestionChange($field);
|
261
|
+
});
|
262
|
+
|
263
|
+
$field.find(displayConditionTypeSelector).on("change", () => {
|
264
|
+
onDisplayConditionTypeChange($field);
|
265
|
+
});
|
82
266
|
|
83
|
-
|
267
|
+
onDisplayConditionTypeChange($field);
|
268
|
+
onDisplayConditionQuestionChange($field);
|
84
269
|
}
|
85
270
|
|
271
|
+
const createDynamicFieldsForDisplayConditions = (fieldId) => {
|
272
|
+
return createDynamicFields({
|
273
|
+
placeholderId: "questionnaire-question-display-condition-id",
|
274
|
+
wrapperSelector: `#${fieldId} ${displayConditionsWrapperSelector}`,
|
275
|
+
containerSelector: ".questionnaire-question-display-conditions-list",
|
276
|
+
fieldSelector: displayConditionFieldSelector,
|
277
|
+
addFieldButtonSelector: addDisplayConditionButtonSelector,
|
278
|
+
removeFieldButtonSelector: displayConditionRemoveFieldButtonSelector,
|
279
|
+
onAddField: ($field) => {
|
280
|
+
initializeDisplayConditionField($field);
|
281
|
+
},
|
282
|
+
onRemoveField: () => {
|
283
|
+
}
|
284
|
+
});
|
285
|
+
};
|
286
|
+
|
287
|
+
const dynamicFieldsForDisplayConditions = {};
|
288
|
+
|
86
289
|
const setupInitialQuestionAttributes = ($target) => {
|
87
290
|
const fieldId = $target.attr("id");
|
88
291
|
const $fieldQuestionTypeSelect = $target.find(questionTypeSelector);
|
89
292
|
|
293
|
+
createCollapsibleQuestion($target);
|
294
|
+
createDynamicQuestionTitle(fieldId);
|
295
|
+
|
90
296
|
createFieldDependentInputs({
|
91
297
|
controllerField: $fieldQuestionTypeSelect,
|
92
298
|
wrapperSelector: fieldSelector,
|
93
299
|
dependentFieldsSelector: answerOptionsWrapperSelector,
|
94
300
|
dependentInputSelector: `${answerOptionFieldSelector} input`,
|
95
301
|
enablingCondition: ($field) => {
|
96
|
-
return isMultipleChoiceOption($field);
|
302
|
+
return isMultipleChoiceOption($field.val());
|
97
303
|
}
|
98
304
|
});
|
99
305
|
|
@@ -103,21 +309,43 @@
|
|
103
309
|
dependentFieldsSelector: maxChoicesWrapperSelector,
|
104
310
|
dependentInputSelector: "select",
|
105
311
|
enablingCondition: ($field) => {
|
106
|
-
return $field.val() === "multiple_option"
|
312
|
+
return $field.val() === "multiple_option" || $field.val() === "matrix_multiple";
|
313
|
+
}
|
314
|
+
});
|
315
|
+
|
316
|
+
createFieldDependentInputs({
|
317
|
+
controllerField: $fieldQuestionTypeSelect,
|
318
|
+
wrapperSelector: fieldSelector,
|
319
|
+
dependentFieldsSelector: matrixRowsWrapperSelector,
|
320
|
+
dependentInputSelector: `${matrixRowFieldSelector} input`,
|
321
|
+
enablingCondition: ($field) => {
|
322
|
+
return isMatrix($field.val());
|
107
323
|
}
|
108
324
|
});
|
109
325
|
|
110
326
|
dynamicFieldsForAnswerOptions[fieldId] = createDynamicFieldsForAnswerOptions(fieldId);
|
327
|
+
dynamicFieldsForMatrixRows[fieldId] = createDynamicFieldsForMatrixRows(fieldId);
|
328
|
+
dynamicFieldsForDisplayConditions[fieldId] = createDynamicFieldsForDisplayConditions(fieldId);
|
111
329
|
|
112
|
-
const
|
330
|
+
const dynamicFieldsAnswerOptions = dynamicFieldsForAnswerOptions[fieldId];
|
331
|
+
const dynamicFieldsMatrixRows = dynamicFieldsForMatrixRows[fieldId];
|
113
332
|
|
114
333
|
const onQuestionTypeChange = () => {
|
115
|
-
if (isMultipleChoiceOption($fieldQuestionTypeSelect)) {
|
334
|
+
if (isMultipleChoiceOption($fieldQuestionTypeSelect.val())) {
|
116
335
|
const nOptions = $fieldQuestionTypeSelect.parents(fieldSelector).find(answerOptionFieldSelector).length;
|
117
336
|
|
118
337
|
if (nOptions === 0) {
|
119
|
-
|
120
|
-
|
338
|
+
dynamicFieldsAnswerOptions._addField();
|
339
|
+
dynamicFieldsAnswerOptions._addField();
|
340
|
+
}
|
341
|
+
}
|
342
|
+
|
343
|
+
if (isMatrix($fieldQuestionTypeSelect.val())) {
|
344
|
+
const nRows = $fieldQuestionTypeSelect.parents(fieldSelector).find(matrixRowFieldSelector).length;
|
345
|
+
|
346
|
+
if (nRows === 0) {
|
347
|
+
dynamicFieldsMatrixRows._addField();
|
348
|
+
dynamicFieldsMatrixRows._addField();
|
121
349
|
}
|
122
350
|
}
|
123
351
|
};
|
@@ -142,6 +370,9 @@
|
|
142
370
|
containerSelector: ".questionnaire-questions-list",
|
143
371
|
fieldSelector: fieldSelector,
|
144
372
|
addFieldButtonSelector: ".add-question",
|
373
|
+
addSeparatorButtonSelector: ".add-separator",
|
374
|
+
fieldTemplateSelector: ".decidim-question-template",
|
375
|
+
separatorTemplateSelector: ".decidim-separator-template",
|
145
376
|
removeFieldButtonSelector: ".remove-question",
|
146
377
|
moveUpFieldButtonSelector: ".move-up-question",
|
147
378
|
moveDownFieldButtonSelector: ".move-down-question",
|
@@ -163,6 +394,14 @@
|
|
163
394
|
$field.find(answerOptionRemoveFieldButtonSelector).each((idx, el) => {
|
164
395
|
dynamicFieldsForAnswerOptions[$field.attr("id")]._removeField(el);
|
165
396
|
});
|
397
|
+
|
398
|
+
$field.find(matrixRowRemoveFieldButtonSelector).each((idx, el) => {
|
399
|
+
dynamicFieldsForMatrixRows[$field.attr("id")]._removeField(el);
|
400
|
+
});
|
401
|
+
|
402
|
+
$field.find(displayConditionRemoveFieldButtonSelector).each((idx, el) => {
|
403
|
+
dynamicFieldsForDisplayConditions[$field.attr("id")]._removeField(el);
|
404
|
+
});
|
166
405
|
},
|
167
406
|
onMoveUpField: () => {
|
168
407
|
autoLabelByPosition.run();
|
@@ -183,6 +422,11 @@
|
|
183
422
|
setupInitialQuestionAttributes($target);
|
184
423
|
});
|
185
424
|
|
425
|
+
$(displayConditionFieldSelector).each((idx, el) => {
|
426
|
+
const $field = $(el);
|
427
|
+
initializeDisplayConditionField($field)
|
428
|
+
});
|
429
|
+
|
186
430
|
autoLabelByPosition.run();
|
187
431
|
autoButtonsByPosition.run();
|
188
432
|
})(window);
|