diff --git a/app/assets/stylesheets/dmpopidor.scss b/app/assets/stylesheets/dmpopidor.scss index 06bad7d..46cfcd6 100644 --- a/app/assets/stylesheets/dmpopidor.scss +++ b/app/assets/stylesheets/dmpopidor.scss @@ -609,16 +609,6 @@ .run-zone { display: flex; flex-direction: column; - .loading-zone { - justify-content: center; - font-size: 20px; - font-weight: 700; - align-items: center; - display: none; - .spinner { - margin: 0 10px; - } - } .message-zone { text-align: center; font-weight: bold; @@ -673,6 +663,23 @@ // Project Details .plan-details { + + .project-selector { + display: none; + .error-zone { + font-weight: bold; + color: $rust; + display: none; + } + } + .project-selector-link { + cursor: pointer; + color: $blue; + font-weight: bold; + &:hover { + text-decoration: underline; + } + } .question-text { border-color: $rust; @@ -698,16 +705,6 @@ .run-zone { display: flex; flex-direction: column; - .loading-zone { - justify-content: center; - font-size: 20px; - font-weight: 700; - align-items: center; - display: none; - .spinner { - margin: 0 10px; - } - } .message-zone { text-align: center; font-weight: bold; diff --git a/app/controllers/madmp_codebase_controller.rb b/app/controllers/madmp_codebase_controller.rb index 0d25739..e65676a 100644 --- a/app/controllers/madmp_codebase_controller.rb +++ b/app/controllers/madmp_codebase_controller.rb @@ -48,6 +48,49 @@ end end + def anr_search + anr_project_id = params[:project_id] + fragment = MadmpFragment.find(params[:fragment_id]) + script_id = params[:script_id] + + authorize fragment + # EXAMPLE DATA + # file_path = Rails.root.join("config/madmp/schemas/anr_example_data.json") + # response = JSON.load(File.open(file_path)) + # fragment.save_api_fragment(response, fragment.madmp_schema) + # render json: { + # "message" => d_("dmpopidor", 'New data have been added to your plan, please click on the "Reload" button.') + # }, status: 200 + # return + + begin + response = ExternalApis::MadmpCodebaseService.run(script_id, body: + { + "data": anr_project_id, + "dmp_id": fragment.dmp_id + } + ) + if response["return_code"]&.eql?(0) + fragment.save_codebase_fragment(response["data"], fragment.madmp_schema) + render json: { + "message" => d_("dmpopidor", 'New data have been added to your plan, please click on the "Reload" button.'), + "needs_reload" => true + }, status: 200 + update_run_log(fragment, script_id) + else + # Rails.cache.delete(["codebase_run", fragment.id]) + render json: { + "error" => "#{d_('dmpopidor', 'An error has occured: ')} #{response['result_message']}" + }, status: 500 + end + rescue StandardError => e + # Rails.cache.delete(["codebase_run", fragment.id]) + render json: { + "error" => "Internal Server error: #{e.message}" + }, status: 500 + end + end + private def fetch_run_data(fragment, script_id) diff --git a/app/controllers/registries_controller.rb b/app/controllers/registries_controller.rb new file mode 100644 index 0000000..4c7cf36 --- /dev/null +++ b/app/controllers/registries_controller.rb @@ -0,0 +1,22 @@ +# frozen_string_literal: true + +class RegistriesController < ApplicationController + + after_action :verify_authorized + include DynamicFormHelper + + def load_values + registry = Registry.find(params[:id]) + plan = Plan.find(params[:plan_id]) + locale = plan.template.locale + search_term = params[:term] || "" + values_list = registry.registry_values + formatted_list = values_list.select { |v| v.to_s(locale).downcase.include?(search_term) } + .map { |v| { "id" => select_value(v, locale), "text" => v.to_s(locale) } } + authorize plan + render json: { + "results" => formatted_list + } + end + +end diff --git a/app/javascript/utils/select2.js b/app/javascript/utils/select2.js index 1f11704..ecff048 100644 --- a/app/javascript/utils/select2.js +++ b/app/javascript/utils/select2.js @@ -5,7 +5,90 @@ theme: 'bootstrap4', }); }, +}; +export const projectSelectorHandler = (selectField, value, text) => { + const overlay = $('#plan_project .overlay'); + const errorZone = $('#plan_project .error-zone'); + // eslint-disable-next-line + if (confirm(`Souhaitez vous charger les données du projet "${text}" dans votre plan ?`)) { + $.ajax({ + url: '/codebase/anr_search', + method: 'get', + data: { + project_id: value, + fragment_id: selectField.data('fragment-id'), + script_id: selectField.data('script-id'), + }, + beforeSend: () => { + overlay.show(); + errorZone.hide(); + }, + }).done(() => { + $('#plan_project').trigger('reload.form'); + $('#plan_project .project-selector').fadeOut(); + }).fail((response) => { + errorZone.html(response.responseJSON.error); + errorZone.show(); + overlay.hide(); + }); + } +}; +export const multipleSelectorHandler = (selectField, value, selected) => { + const messageZone = selectField.find('.message-area'); + const requestData = { + locale: selectField.data('locale'), + parent_id: selectField.data('parent-id'), + schema_id: selectField.data('schema-id'), + query_id: selectField.data('query-id'), + property_name: selectField.data('property-name'), + }; + if (selected) { + requestData.registry_value_id = value; + } else { + requestData.custom_value = value; + } + + $.ajax({ + url: '/madmp_fragments/create_from_registry', + method: 'get', + data: requestData, + }).done((response) => { + messageZone.hide(); + $(`table.list-${response.query_id} tbody`).html(response.html); + selectField.find('select').val('').trigger('change'); + }).fail((response) => { + messageZone.html(response.responseJSON.error); + messageZone.show(); + }); +}; + +export const linkedFragmentSelectorHandler = (selectField, value, text) => { + /* + * Changes the url of the "View" link according to the selected value in the fragment select + */ + const selectedValue = selectField.next('.selected-value'); + const viewLink = selectedValue.find('a'); + selectedValue.find('span').html(text); + viewLink.attr('href', viewLink.attr('href').replace(/fragment_id=([^&]+)/, `fragment_id=${value}`)); + selectedValue.show(); +}; + +export const singleSelectHandler = (selectField, target, value, selected) => { + const removeButton = selectField.find('.remove-button'); + + if (selected) { + removeButton.show(); + selectField.find('.custom-value').hide(); + selectField.find('.custom-value input').val(''); + } else { + target.parents('fieldset.registry').find('.fragment-display').hide(); + removeButton.show(); + selectField.find('.custom-value').show(); + selectField.find('.custom-value input').val(value); + selectField.find('.custom-value span').html(value); + selectField.find('select').val('').trigger('change'); + } }; export default Select2; diff --git a/app/javascript/views/shared/dynamic_form.js b/app/javascript/views/shared/dynamic_form.js index 0d2d611..1822050 100644 --- a/app/javascript/views/shared/dynamic_form.js +++ b/app/javascript/views/shared/dynamic_form.js @@ -1,3 +1,9 @@ +import { + projectSelectorHandler, + multipleSelectorHandler, + linkedFragmentSelectorHandler, + singleSelectHandler, +} from '../../utils/select2'; $(() => { // When clicking on the "+" of a duplicable field, clone the field & remove @@ -57,62 +63,22 @@ if (!value) return; if (selectField.hasClass('single-select') && target.data('tags') === true) { - const removeButton = selectField.find('.remove-button'); - - if (selected) { - removeButton.show(); - selectField.find('.custom-value').hide(); - selectField.find('.custom-value input').val(''); - } else { - target.parents('fieldset.registry').find('.fragment-display').hide(); - removeButton.show(); - selectField.find('.custom-value').show(); - selectField.find('.custom-value input').val(value); - selectField.find('.custom-value span').html(value); - selectField.find('select').val('').trigger('change'); - } + singleSelectHandler(selectField, target, value, selected); } if (selectField.hasClass('linked-fragments-select')) { - /* - * Changes the url of the "View" link according to the selected value in the fragment select - */ - const selectedValue = selectField.next('.selected-value'); - const viewLink = selectedValue.find('a'); - selectedValue.find('span').html(text); - viewLink.attr('href', viewLink.attr('href').replace(/fragment_id=([^&]+)/, `fragment_id=${value}`)); - selectedValue.show(); + linkedFragmentSelectorHandler(selectField, value, text); } if (selectField.hasClass('multiple-select')) { - const messageZone = selectField.find('.message-area'); - const requestData = { - locale: selectField.data('locale'), - parent_id: selectField.data('parent-id'), - schema_id: selectField.data('schema-id'), - query_id: selectField.data('query-id'), - property_name: selectField.data('property-name'), - }; - if (selected) { - requestData.registry_value_id = value; - } else { - requestData.custom_value = value; - } + multipleSelectorHandler(selectField, value, selected); + } - $.ajax({ - url: '/madmp_fragments/create_from_registry', - method: 'get', - data: requestData, - }).done((response) => { - messageZone.hide(); - $(`table.list-${response.query_id} tbody`).html(response.html); - selectField.find('select').val('').trigger('change'); - }).fail((response) => { - messageZone.html(response.responseJSON.error); - messageZone.show(); - }); + if (selectField.hasClass('project-selector')) { + projectSelectorHandler(selectField, value, text); } }); + $(document).on('click', '.select-field .remove-button', (e) => { const target = $(e.target); const selectField = target.parents('.select-field'); @@ -150,18 +116,20 @@ const target = $(e.target); const reloadButton = target.parent().find('.reload-button'); const messageZone = target.parent().find('.message-zone'); - const loadingZone = target.parent().find('.loading-zone'); + const overlay = target.parents('form').find('.overlay'); const url = target.data('url'); + const form = target.parents('form'); $.ajax({ url, method: 'get', beforeSend: () => { target.hide(); - loadingZone.css('display', 'flex'); + overlay.show(); + form.find('.overlay').show(); }, complete: () => { - loadingZone.hide(); + overlay.hide(); }, }).done((data) => { target.hide(); @@ -183,4 +151,13 @@ const target = $(e.target); target.parents('.panel-collapse').trigger('reload.form'); }); + + $(document).on('click', '.project-selector-link', () => { + $('#plan_project').find('.project-selector').fadeIn(); + $('#plan_project .error-zone').fadeOut(); + }); + $(document).on('click', '.cancel-project-search', () => { + $('#plan_project').find('.project-selector').fadeOut(); + $('#plan_project .error-zone').fadeOut(); + }); }); diff --git a/app/policies/madmp_fragment_policy.rb b/app/policies/madmp_fragment_policy.rb index 44354c6..5bc554a 100644 --- a/app/policies/madmp_fragment_policy.rb +++ b/app/policies/madmp_fragment_policy.rb @@ -49,4 +49,8 @@ @fragment.plan.editable_by?(@user.id) || @user == @answer.plan.owner end + def anr_search? + @fragment.plan.editable_by?(@user.id) || @user == @answer.plan.owner + end + end diff --git a/app/policies/plan_policy.rb b/app/policies/plan_policy.rb index 71f8141..7586bf9 100644 --- a/app/policies/plan_policy.rb +++ b/app/policies/plan_policy.rb @@ -88,4 +88,8 @@ @plan.editable_by?(@user.id) end + def load_values? + @plan.readable_by?(@user.id) + end + end diff --git a/app/services/external_apis/madmp_codebase_service.rb b/app/services/external_apis/madmp_codebase_service.rb index 3e94ffc..577d6ae 100644 --- a/app/services/external_apis/madmp_codebase_service.rb +++ b/app/services/external_apis/madmp_codebase_service.rb @@ -59,6 +59,10 @@ JSON.parse(resp.body) end + def anr_search(project_id) + + end + end end diff --git a/app/views/branded/madmp_fragments/_edit.html.erb b/app/views/branded/madmp_fragments/_edit.html.erb index e6dd19f..99a6748 100644 --- a/app/views/branded/madmp_fragments/_edit.html.erb +++ b/app/views/branded/madmp_fragments/_edit.html.erb @@ -40,7 +40,7 @@