diff --git a/Gemfile b/Gemfile index f3084d8..1a3b3fb 100644 --- a/Gemfile +++ b/Gemfile @@ -134,9 +134,6 @@ # Minimal embedded v8 for Ruby (https://github.com/discourse/mini_racer) gem 'mini_racer' -# Nested forms for datasets implementation (https://github.com/nathanvda/cocoon) -gem 'cocoon' - # ------------------------------------------------ # EXPORTING # Provides binaries for WKHTMLTOPDF project in an easily accessible package. diff --git a/Gemfile.lock b/Gemfile.lock index df3d530..09d17aa 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -91,7 +91,6 @@ chromedriver-helper (2.1.0) archive-zip (~> 0.10) nokogiri (~> 1.8) - cocoon (1.2.12) coderay (1.1.2) concurrent-ruby (1.1.3) contact_us (1.2.0) @@ -494,7 +493,6 @@ capybara capybara-screenshot chromedriver-helper (>= 1.2.0) - cocoon contact_us database_cleaner devise diff --git a/app/assets/stylesheets/dmpopidor.scss b/app/assets/stylesheets/dmpopidor.scss index 249feba..ffbedca 100644 --- a/app/assets/stylesheets/dmpopidor.scss +++ b/app/assets/stylesheets/dmpopidor.scss @@ -682,10 +682,8 @@ .datasets-description { width: 50vw; - border: 0.5px groove #ddd; padding: 0 5px; margin-top: 5px; - box-shadow: 0px 0px 0px 0px #000; .dataset-element { display: flex; diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index e859d56..03a057a 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -111,12 +111,12 @@ } end - def success_message(obj, action = "saved") - _("Successfully %{action} the %{object}.") % { - object: obj_name_for_display(obj), - action: action || "save", - } - end + # def success_message(obj, action = "saved") + # _("Successfully %{action} the %{object}.") % { + # object: obj_name_for_display(obj), + # action: action || "save", + # } + # end def errors_for_display(obj) if obj.present? && obj.errors.any? @@ -125,21 +125,21 @@ end end - def obj_name_for_display(obj) - display_name = { - ExportedPlan: _("plan"), - GuidanceGroup: _("guidance group"), - Note: _("comment"), - Org: _("organisation"), - Perm: _("permission"), - Pref: _("preferences"), - User: obj == current_user ? _("profile") : _("user") - } - if obj.respond_to?(:customization_of) && obj.send(:customization_of).present? - display_name[:Template] = "customization" - end - display_name[obj.class.name.to_sym] || obj.class.name.downcase || "record" - end + # def obj_name_for_display(obj) + # display_name = { + # ExportedPlan: _("plan"), + # GuidanceGroup: _("guidance group"), + # Note: _("comment"), + # Org: _("organisation"), + # Perm: _("permission"), + # Pref: _("preferences"), + # User: obj == current_user ? _("profile") : _("user") + # } + # if obj.respond_to?(:customization_of) && obj.send(:customization_of).present? + # display_name[:Template] = "customization" + # end + # display_name[obj.class.name.to_sym] || obj.class.name.downcase || "record" + # end # Override rails default render action to look for a branded version of a # template instead of using the default one. If no override exists, the diff --git a/app/controllers/datasets_controller.rb b/app/controllers/datasets_controller.rb new file mode 100644 index 0000000..9d6bcd4 --- /dev/null +++ b/app/controllers/datasets_controller.rb @@ -0,0 +1,38 @@ +# frozen_string_literal: true + +class DatasetsController < ApplicationController + + after_action :verify_authorized + + # GET /plans/:plan_id/datasets + def index + begin + @plan = Plan.find(params[:plan_id]) + @datasets = @plan.datasets + + authorize @plan + render('plans/datasets', locals: { plan: @plan, datasets: @datasets }) + rescue ActiveRecord::RecordNotFound + flash[:alert] = _("There is no plan associated with id %{id}") % { + id: params[:id] + } + redirect_to(:controller => 'plans', :action => 'index') + end + end + + def destroy + @plan = Plan.find(params[:plan_id]) + @dataset = Dataset.find(params[:id]) + authorize @plan + if @dataset.destroy + flash[:notice] = success_message(@plan, _("deleted")) + redirect_to(:action => 'index') + else + flash[:alert] = failure_message(@plan, _("delete")) + redirect_to(:action => 'index') + end + end + + + +end diff --git a/app/javascript/packs/application.js b/app/javascript/packs/application.js index 12f89ea..6624b5b 100644 --- a/app/javascript/packs/application.js +++ b/app/javascript/packs/application.js @@ -1,7 +1,6 @@ // Rails setup import 'jquery-ujs'; import 'jquery-accessible-autocomplete-list-aria/jquery-accessible-autocomplete-list-aria'; -import 'cocoon-js'; // Generic JS that is applicable across multiple pages import '../utils/array'; @@ -34,6 +33,7 @@ import '../views/orgs/admin_edit'; import '../views/orgs/shibboleth_ds'; import '../views/plans/download'; +import '../views/plans/datasets'; import '../views/plans/edit_details'; import '../views/plans/index'; import '../views/plans/new'; diff --git a/app/javascript/views/plans/datasets.js b/app/javascript/views/plans/datasets.js new file mode 100644 index 0000000..5a9ffab --- /dev/null +++ b/app/javascript/views/plans/datasets.js @@ -0,0 +1,36 @@ + +$(() => { + $('#datasets').sortable({ + handle: '.dataset-actions .handle', + stop: () => { + $('#datasets .dataset-element').each(function callback(index) { + $(this).find('.dataset-order').val(index + 1); + }); + }, + }); + + $('#add-dataset').click(() => { + const lastDataset = $('#datasets .dataset-element').last(); + const lastDatasetOrder = parseInt(lastDataset.find('.dataset-order').val(), 10); + const duplicated = lastDataset.clone(false, false); + const duplicatedId = `plan_datasets_attributes_${new Date().getTime()}`; + const duplicatedName = `plan[datasets_attributes][${new Date().getTime()}]`; + + // Dataset name + duplicated.find('.dataset-name input').attr('id', `${duplicatedId}_name`); + duplicated.find('.dataset-name input').attr('name', `${duplicatedName}[name]`); + duplicated.find('.dataset-name label').attr('for', `${duplicatedId}_name`); + duplicated.find('.dataset-name input').val(null); + // Dataset description + duplicated.find('.dataset-description input').attr('id', `${duplicatedId}_description`); + duplicated.find('.dataset-description input').attr('name', `${duplicatedName}[description]`); + duplicated.find('.dataset-description label').attr('for', `${duplicatedId}_description`); + duplicated.find('.dataset-description input').val(null); + // Dataset order + duplicated.find('.dataset-order').attr('id', `${duplicatedId}_order`); + duplicated.find('.dataset-order').attr('name', `${duplicatedName}[order]`); + duplicated.find('.dataset-order').val(lastDatasetOrder + 1); + + duplicated.appendTo('#datasets'); + }); +}); diff --git a/app/javascript/views/plans/edit_details.js b/app/javascript/views/plans/edit_details.js index 55d1eca..0000d75 100644 --- a/app/javascript/views/plans/edit_details.js +++ b/app/javascript/views/plans/edit_details.js @@ -76,13 +76,4 @@ }); toggleCheckboxes($('#priority-guidance-orgs input[type="checkbox"]:checked').map((i, el) => $(el).val()).get()); - - $('#datasets').sortable({ - handle: '.dataset-actions .handle', - stop: () => { - $('#datasets .dataset-element').each(function callback(index) { - $(this).find('.dataset-order').val(index + 1); - }); - }, - }); }); diff --git a/app/policies/plan_policy.rb b/app/policies/plan_policy.rb index 09dee32..5eeb0d5 100644 --- a/app/policies/plan_policy.rb +++ b/app/policies/plan_policy.rb @@ -1,6 +1,7 @@ class PlanPolicy < ApplicationPolicy attr_reader :user attr_reader :plan + include Dmpopidor::Policies::Plan def initialize(user, plan) raise Pundit::NotAuthorizedError, _("must be logged in") unless user diff --git a/app/views/branded/plans/_dataset_fields.html.erb b/app/views/branded/plans/_dataset_fields.html.erb index 6fb2588..b14d633 100644 --- a/app/views/branded/plans/_dataset_fields.html.erb +++ b/app/views/branded/plans/_dataset_fields.html.erb @@ -1,4 +1,5 @@ -