diff --git a/hypha/apply/funds/templates/funds/application_base.html b/hypha/apply/funds/templates/funds/application_base.html index 5e4ac8d337ecbcb4a3dc779ade8a9ae3e273605d..adb4ccce6a39d6073f57f167a39d03636b2bcfbe 100644 --- a/hypha/apply/funds/templates/funds/application_base.html +++ b/hypha/apply/funds/templates/funds/application_base.html @@ -42,7 +42,7 @@ {% for field in form %} {% if field.field %} - {% if field.field.only_input %} + {% if field.field.multi_input_field %} {% include "forms/includes/multi_input_field.html" %} {% else %} {% include "forms/includes/field.html" with is_application=True %} @@ -74,5 +74,5 @@ {% if not show_all_group_fields %} <script src="{% static 'js/apply/form-group-toggle.js' %}"></script> {% endif %} - <script src="{% static 'js/apply/multi-input-add-button.js' %}"></script> + <script src="{% static 'js/apply/multi-input-fields.js' %}"></script> {% endblock %} diff --git a/hypha/apply/funds/templates/funds/applicationsubmission_form.html b/hypha/apply/funds/templates/funds/applicationsubmission_form.html index 75a79a23e90f30aeeddc62b3f8ff73d999a7b394..5580b435da1ba738c4533c0dd3aa8b83f629566f 100644 --- a/hypha/apply/funds/templates/funds/applicationsubmission_form.html +++ b/hypha/apply/funds/templates/funds/applicationsubmission_form.html @@ -18,7 +18,7 @@ {% for field in form %} {% if field.field %} - {% if field.field.only_input %} + {% if field.field.multi_input_field %} {% include "forms/includes/multi_input_field.html" %} {% else %} {% include "forms/includes/field.html" %} @@ -39,5 +39,5 @@ {% block extra_js %} <script src="{% static 'js/apply/list-input-files.js' %}"></script> <script src="{% static 'js/apply/tinymce-word-count.js' %}"></script> - <script src="{% static 'js/apply/multi-input-add-button.js' %}"></script> + <script src="{% static 'js/apply/multi-input-fields.js' %}"></script> {% endblock %} diff --git a/hypha/apply/stream_forms/models.py b/hypha/apply/stream_forms/models.py index 4e92920be5783c159797aa2996deeb6672b6a3ea..348c10b96f9d1354b744ab8d1737fa1139f57166 100644 --- a/hypha/apply/stream_forms/models.py +++ b/hypha/apply/stream_forms/models.py @@ -68,17 +68,19 @@ class BaseStreamForm: if isinstance(block, TextFieldBlock): field_from_block.word_limit = struct_value.get('word_limit') if isinstance(block, MultiInputCharFieldBlock): - inputs = struct_value.get('number_of_inputs') - for i in range(inputs): - form_fields[struct_child.id + '_' + str(i)] = field_from_block - if i != 0: - field_from_block.only_input = True + number_of_inputs = struct_value.get('number_of_inputs') + for index in range(number_of_inputs): + form_fields[struct_child.id + '_' + str(index)] = field_from_block + field_from_block.multi_input_id = struct_child.id + if index == number_of_inputs - 1: + field_from_block.multi_input_add_button = True + field_from_block.visibility_index = 0 + field_from_block.max_index = index + if index != 0: + field_from_block.multi_input_field = True field_from_block.required = False field_from_block.initial = None - else: - field_from_block.show_add_button = True - field_from_block.number_of_inputs = inputs - field_from_block = copy.copy(field_from_block) + field_from_block = copy.copy(field_from_block) else: form_fields[struct_child.id] = field_from_block elif isinstance(block, GroupToggleEndBlock): diff --git a/hypha/apply/templates/forms/includes/field.html b/hypha/apply/templates/forms/includes/field.html index 90e147e7a5b29ff8981e494b21d4b88245e90099..4d341358010de71ace08f6ec77bfeb792d6dcdfc 100644 --- a/hypha/apply/templates/forms/includes/field.html +++ b/hypha/apply/templates/forms/includes/field.html @@ -1,4 +1,4 @@ -{% load util_tags static %} +{% load util_tags %} {% with widget_type=field|widget_type field_type=field|field_type %} @@ -11,7 +11,6 @@ <span class="form__required">*</span> {% endif %} </label> - {% elif field.field.only_input %} {% else %} <label for="{{ field.id_for_label }}" class="form__question form__question--{{ field_type }} {{ widget_type }}" {% if field.field.required %}required{% endif %}> <span>{{ field.label }}</span> @@ -22,10 +21,7 @@ {% endif %} {% if field.help_text %} - {% if field.field.only_input %} - {% else %} <p class="form__help">{{ field.help_text|safe }}</p> - {% endif %} {% endif %} {% if field.field.help_link %} @@ -39,12 +35,8 @@ {% if widget_type == 'date_input' or widget_type == 'date_time_input' %} <div class="{{ widget_type }}"> {% endif %} - - {{ field }} - {% if field.field.show_add_button %} - <button class="multi-input-add-btn" type="button">Add new item</button> - {% endif %} + {{ field }} {% if field.errors %}<h6 class="form__error-text">{{ field.errors.as_text|linebreaksbr }}</h6>{% endif %} {% if widget_type == 'clearable_file_input' or widget_type == 'multi_file_input' %} diff --git a/hypha/apply/templates/forms/includes/multi_input_field.html b/hypha/apply/templates/forms/includes/multi_input_field.html index b946d9ce3440c7c239ea940b3ca4cef9b845ec4e..c934ff72cb4e7cfec111729aa84c1104a4989bcb 100644 --- a/hypha/apply/templates/forms/includes/multi_input_field.html +++ b/hypha/apply/templates/forms/includes/multi_input_field.html @@ -1,26 +1,7 @@ -<div class="form__item"> - {% if field.initial %} - <div class="multi-input-field-show"> - {{ field }} - </div> - {% else %} - <div class="multi-input-field-hidden"> - {{ field }} - </div> - {% endif %} +<div class="form__item {% if not field.initial %}multi-input-field-hidden{% endif %}" data-multi-field-for="{{ field.field.multi_input_id }}"> + {{ field }} </div> -{% block extra_css %} - -<style> - .multi-input-field-hidden { - display: none; - } - .multi-input-field-show { - display: block; - position: relative; - padding-bottom: 22px; - } -</style> - -{% endblock %} +{% if field.field.multi_input_add_button %} + <button class="link link--button link--button--narrow multi-input-add-btn" type="button" data-multi-field-id="{{ field.field.multi_input_id }}" data-multi-visibility-index="{{ field.field.visibility_index }}" data-multi-max-index="{{ field.field.max_index }}">Add new item</button> +{% endif %} diff --git a/hypha/static_src/src/javascript/apply/multi-input-add-button.js b/hypha/static_src/src/javascript/apply/multi-input-add-button.js deleted file mode 100644 index 3310bb22fc5e2720bf9409e409675fbe7206fd32..0000000000000000000000000000000000000000 --- a/hypha/static_src/src/javascript/apply/multi-input-add-button.js +++ /dev/null @@ -1,11 +0,0 @@ -(function ($) { - - 'use strict'; - - $('.multi-input-add-btn').click(function () { - var allElements = document.getElementsByClassName('multi-input-field-hidden'); - if (allElements.hasOwnProperty(0)) { - allElements[0].className = 'multi-input-field-show'; - } - }); -})(jQuery); diff --git a/hypha/static_src/src/javascript/apply/multi-input-fields.js b/hypha/static_src/src/javascript/apply/multi-input-fields.js new file mode 100644 index 0000000000000000000000000000000000000000..da3e68e581f3213002f8e4e2d9fd9d911786cb57 --- /dev/null +++ b/hypha/static_src/src/javascript/apply/multi-input-fields.js @@ -0,0 +1,34 @@ +(function ($) { + + 'use strict'; + + $('.multi-input-add-btn').each(function () { + var multiFieldId = $(this).data('multi-field-id'); + const multiMaxIndex = $(this).data('multi-max-index'); + var multiFieldInputs = $(".form__item[data-multi-field-for='" + multiFieldId + "']"); + var multiFieldHiddenInput = $(".form__item.multi-input-field-hidden[data-multi-field-for='" + multiFieldId + "']"); + var multiVisibilityIndex = multiFieldInputs.index(multiFieldHiddenInput); + if (multiVisibilityIndex >= 0) { + $(this).data('multi-visibility-index', multiVisibilityIndex); + } + else if (multiVisibilityIndex == -1) { + $(this).data('multi-visibility-index', multiMaxIndex); + } + }); + + $('.multi-input-add-btn').click(function () { + var multiFieldId = $(this).data('multi-field-id'); + var multiVisibilityIndex = $(this).data('multi-visibility-index'); + const multiMaxIndex = $(this).data('multi-max-index'); + + var multiShowIndex = multiVisibilityIndex + 1; + if (multiShowIndex <= multiMaxIndex) { + var multiShowId = 'id_' + multiFieldId + '_' + multiShowIndex; + $('#' + multiShowId).parent('.form__item').removeClass('multi-input-field-hidden'); + $(this).data('multi-visibility-index', multiShowIndex); + } + else { + $(this).hide(); + } + }); +})(jQuery); diff --git a/hypha/static_src/src/sass/apply/components/_form.scss b/hypha/static_src/src/sass/apply/components/_form.scss index 896eaba00a0f3bb8334a0f0d672714a6b1a21487..ca67df2d2eea3a764e3b8012543078b0cda4cb4a 100644 --- a/hypha/static_src/src/sass/apply/components/_form.scss +++ b/hypha/static_src/src/sass/apply/components/_form.scss @@ -549,6 +549,10 @@ max-width: 410px; } + .multi-input-field-hidden { + display: none; + } + &__info-box { background-color: $color--light-blue-90; padding: 1rem; diff --git a/hypha/static_src/src/sass/public/components/_form.scss b/hypha/static_src/src/sass/public/components/_form.scss index 12f529d49f3043fa388614cd1b0430da8a19fd86..fe845c796f4dccb74c15c8038ac4b5219b0b2d43 100644 --- a/hypha/static_src/src/sass/public/components/_form.scss +++ b/hypha/static_src/src/sass/public/components/_form.scss @@ -364,4 +364,8 @@ border: 1px solid $color--mid-grey; max-width: 410px; } + + .multi-input-field-hidden { + display: none; + } }