diff --git a/app/controllers/madmp_fragments_controller.rb b/app/controllers/madmp_fragments_controller.rb index 4ad370e..e7b7f98 100644 --- a/app/controllers/madmp_fragments_controller.rb +++ b/app/controllers/madmp_fragments_controller.rb @@ -94,7 +94,12 @@ schema = @schemas.find(p_params[:schema_id]) source = p_params[:source] - data = data_reformater(schema.schema, schema_params(schema), schema.classname) + data = data_reformater( + schema.schema, + schema_params(schema), + schema.classname, + p_params[:template_locale] + ) # rubocop:disable Metrics/BlockLength Answer.transaction do diff --git a/app/controllers/paginable/registries_controller.rb b/app/controllers/paginable/registries_controller.rb new file mode 100644 index 0000000..fd2c582 --- /dev/null +++ b/app/controllers/paginable/registries_controller.rb @@ -0,0 +1,16 @@ +# frozen_string_literal: true + +class Paginable::RegistriesController < ApplicationController + + include Paginable + + # /paginable/registries/index/:page + def index + authorize(Registries) + paginable_renderise( + partial: "index", + scope: Registry.all, + query_params: { sort_field: "registries.name", sort_direction: :asc }) + end + +end diff --git a/app/controllers/super_admin/registries_controller.rb b/app/controllers/super_admin/registries_controller.rb new file mode 100644 index 0000000..83dbde9 --- /dev/null +++ b/app/controllers/super_admin/registries_controller.rb @@ -0,0 +1,72 @@ +# frozen_string_literal: true + +module SuperAdmin + class RegistriesController < ApplicationController + + # GET /madmp_schemas + def index + authorize(Registry) + render(:index, locals: { registries: Registry.all.page(1) }) + end + + def show + authorize(Registry) + @registry = Registry.includes(:registry_values).find(params[:id]) + end + + def new + authorize(Registry) + @registry = Registry.new + end + + def create + authorize(Registry) + @registry = Registry.new(permitted_params) + if @registry.save + flash.now[:notice] = success_message(@registry, _("created")) + render :edit + else + flash.now[:alert] = failure_message(@registry, _("create")) + render :new + end + end + + def edit + authorize(Registry) + @registry = Registry.find(params[:id]) + end + + + def update + authorize(Registry) + @registry = Registry.find(params[:id]) + if @registry.update_attributes(permitted_params) + flash.now[:notice] = success_message(@registry, _("updated")) + else + flash.now[:alert] = failure_message(@registry, _("update")) + end + render :edit + end + + def destroy + authorize(Registry) + @registry = Registry.find(params[:id]) + if @registry.destroy + msg = success_message(@registry, _("deleted")) + redirect_to super_admin_registries_path, notice: msg + else + flash.now[:alert] = failure_message(@registry, _("delete")) + redner :edit + end + end + + + # Private instance methods + private + + def permitted_params + params.require(:registry).permit(:name, :description, :uri, :version) + end + + end +end diff --git a/app/controllers/super_admin/registry_values_controller.rb b/app/controllers/super_admin/registry_values_controller.rb new file mode 100644 index 0000000..ac5c1a1 --- /dev/null +++ b/app/controllers/super_admin/registry_values_controller.rb @@ -0,0 +1,66 @@ +# frozen_string_literal: true + +module SuperAdmin + class RegistryValuesController < ApplicationController + + def new + @registry = Registry.find(params[:registry_id]) + authorize(@registry) + @registry_value = RegistryValue.new + end + + def create + @registry = Registry.find(permitted_params[:registry_id]) + authorize(@registry) + + @registry_value = RegistryValue.new(permitted_params) + if @registry_value.save + flash.now[:notice] = success_message(@registry_value, _("created")) + else + flash.now[:alert] = failure_message(@registry_value, _("create")) + end + redirect_to super_admin_registry_path(@registry) + end + + def edit + @registry_value = RegistryValue.find(params[:id]) + @registry = @registry_value.registry + authorize(@registry) + end + + + def update + @registry_value = RegistryValue.find(params[:id]) + @registry = @registry_value.registry + authorize(@registry) + if @registry_value.update_attributes(permitted_params) + flash.now[:notice] = success_message(@registry_value, _("updated")) + else + flash.now[:alert] = failure_message(@registry_value, _("update")) + end + redirect_to super_admin_registry_path(@registry) + end + + def destroy + @registry_value = RegistryValue.find(params[:id]) + @registry = @registry_value.registry + authorize(@registry) + if @registry_value.destroy + msg = success_message(@registry_value, _("deleted")) + redirect_to super_admin_registry_path(@registry), notice: msg + else + flash.now[:alert] = failure_message(@registry_value, _("delete")) + render :edit + end + end + + + # Private instance methods + private + + def permitted_params + params.require(:registry_value).permit(:id, :data, :registry_id) + end + + end +end diff --git a/app/helpers/dynamic_form_helper.rb b/app/helpers/dynamic_form_helper.rb index 6744233..5004494 100644 --- a/app/helpers/dynamic_form_helper.rb +++ b/app/helpers/dynamic_form_helper.rb @@ -136,7 +136,7 @@ } end - def create_select_field(form, value, name, label, field_id, select_values, required: false, validation: nil, html_class: nil, readonly: false, multiple: false, ttip: nil, default_value: nil) + def create_select_field(form, value, name, label, field_id, select_values, locale, required: false, validation: nil, html_class: nil, readonly: false, multiple: false, ttip: nil, default_value: nil) render partial: "shared/dynamic_form/fields/select_field", locals: { f: form, @@ -144,6 +144,7 @@ field_name: name, field_label: label, select_values: select_values, + locale: locale, field_class: html_class, field_id: field_id, multiple: multiple, @@ -172,9 +173,20 @@ message end + # Generate a select option "value" depending on the type of registry value + # if it as a "complex" value, returns the id of the registry value + # else returns the value (simple enum are save as String most of the time) + def select_value(registry_value, locale) + if registry_value.data["label"].present? + registry_value.id + else + registry_value.to_s(locale) + end + end + # Formats the data extract from the structured answer form to valid JSON data # This is useful because Rails converts all form data to strings and JSON needs the actual types - def data_reformater(schema, data, classname) + def data_reformater(schema, data, classname, locale) schema["properties"].each do |key, prop| next if data[key].nil? @@ -189,17 +201,23 @@ when "array" data[key] = data[key].is_a?(Array) ? data[key] : [data[key]] when "object" - if prop["schema_id"].present? + if prop["registry_id"].present? + data[key] = RegistryValue.find(data[key].to_i).data.merge( + { "id": data[key].to_i } + ) + elsif prop["schema_id"].present? if prop["inputType"].present? && prop["inputType"].eql?("pickOrCreate") data[key] = { "dbid" => data[key].to_i } else sub_schema = MadmpSchema.find(prop["schema_id"]) - data[key] = data_reformater(sub_schema.schema, data[key], sub_schema.classname) + data[key] = data_reformater( + sub_schema.schema, + data[key], + sub_schema.classname, + locale + ) end end - # if value["dictionnary"] - # data[key] = JSON.parse(DictionnaryValue.where(id: data[key]).select(:id, :uri, :label).take.to_json) - # end else data[key] = data[key] end diff --git a/app/models/madmp_fragment.rb b/app/models/madmp_fragment.rb index 1c0865b..8fc95f8 100644 --- a/app/models/madmp_fragment.rb +++ b/app/models/madmp_fragment.rb @@ -258,7 +258,9 @@ fragmented_data = {} param_data.each do |prop, content| schema_prop = schema.schema["properties"][prop] - if schema_prop["type"].present? && schema_prop["type"].eql?("object") + if schema_prop["type"].present? && + schema_prop["type"].eql?("object") && + schema_prop["schema_id"].present? sub_data = content # TMP: for readability sub_schema = MadmpSchema.find(schema_prop["schema_id"]) instantiate unless data[prop].present? diff --git a/app/models/registry.rb b/app/models/registry.rb new file mode 100644 index 0000000..d2ffdf7 --- /dev/null +++ b/app/models/registry.rb @@ -0,0 +1,32 @@ +# == Schema Information +# +# Table name: registry_values +# +# id :integer not null, primary key +# name :string not null +# description :string +# uri :string +# version :integer +# created_at :datetime not null +# updated_at :datetime not null +# org_id :integer +# + +class Registry < ActiveRecord::Base + include ValidationMessages + + # ================ + # = Associations = + # ================ + + has_many :registry_values, dependent: :destroy + + belongs_to :org + + # =============== + # = Validations = + # =============== + + validates :name, presence: { message: PRESENCE_MESSAGE } + +end \ No newline at end of file diff --git a/app/models/registry_value.rb b/app/models/registry_value.rb new file mode 100644 index 0000000..76ec720 --- /dev/null +++ b/app/models/registry_value.rb @@ -0,0 +1,33 @@ +# == Schema Information +# +# Table name: registry_values +# +# id :integer not null, primary key +# data :json +# created_at :datetime not null +# updated_at :datetime not null +# registry_id :integer +# + +class RegistryValue < ActiveRecord::Base + + # ================ + # = Associations = + # ================ + + belongs_to :registry + + # Prints a representation of the registry_value according to the locale + # If there's a label, then the registry value is a complex object, return the label + # else returns the registry value is a simple string, returns the string + def to_s(locale=nil) + return data if locale.nil? + + if data["label"].present? + data["label"][locale] + elsif data["value"].present? + data["value"][locale] || data["value"] + end + end + +end diff --git a/app/policies/registry_policy.rb b/app/policies/registry_policy.rb new file mode 100644 index 0000000..53d78c0 --- /dev/null +++ b/app/policies/registry_policy.rb @@ -0,0 +1,34 @@ +class RegistryPolicy < ApplicationPolicy + def initialize(user, *args) + raise Pundit::NotAuthorizedError, _("must be logged in") unless user + @user = user + end + + def index? + @user.can_super_admin? + end + + def show? + @user.can_super_admin? + end + + def new? + @user.can_super_admin? + end + + def create? + @user.can_super_admin? + end + + def edit? + @user.can_super_admin? + end + + def update? + @user.can_super_admin? + end + + def destroy? + @user.can_super_admin? + end +end diff --git a/app/views/branded/layouts/_branding.html.erb b/app/views/branded/layouts/_branding.html.erb index 83e5ffc..4137e08 100644 --- a/app/views/branded/layouts/_branding.html.erb +++ b/app/views/branded/layouts/_branding.html.erb @@ -92,29 +92,38 @@ <%= link_to _('Users'), admin_index_users_path, class: 'main_nav_last_li' %> <% end %> - <% if current_user.can_super_admin? %> -
  • > - <%= link_to(_('Themes'), super_admin_themes_path) %> -
  • - <% end %> <% if current_user.can_org_admin? || current_user.can_super_admin? %>
  • > <%= link_to(_('Usage'), usage_index_path) %>
  • - <% end %> + <% end %> + + + <% if current_user.can_super_admin? %> +
  • > + <%= link_to(_('Themes'), super_admin_themes_path) %> +
  • + <% end %> <% if current_user.can_super_admin? %>
  • > <%= link_to d_('dmpopidor', 'Static pages'), super_admin_static_pages_path %>
  • - <% end %> + <% end %> + <% if current_user.can_super_admin? %> +
  • > + <%= link_to _('Notifications'), super_admin_notifications_path %> +
  • + <% end %> + + <% if current_user.can_super_admin? %>
  • > <%= link_to d_('dmpopidor', 'Schemas'), super_admin_madmp_schemas_path %>
  • <% end %> <% if current_user.can_super_admin? %> -
  • > - <%= link_to _('Notifications'), super_admin_notifications_path %> +
  • > + <%= link_to d_('dmpopidor', 'Registries'), super_admin_registries_path %>
  • <% end %> diff --git a/app/views/branded/madmp_fragments/_edit.html.erb b/app/views/branded/madmp_fragments/_edit.html.erb index 2f761bd..422b5eb 100644 --- a/app/views/branded/madmp_fragments/_edit.html.erb +++ b/app/views/branded/madmp_fragments/_edit.html.erb @@ -20,6 +20,7 @@ <%= f.hidden_field :schema_id, :value => madmp_schema.id, id: nil, class: "schema_id" %> <%= f.hidden_field :dmp_id, :value => dmp_id, id: nil %> <%= f.hidden_field :parent_id, :value => parent_id, id: nil %> + <%= f.hidden_field :template_locale, :value => question.template.locale, id: nil %> <%= f.hidden_field "source", :value => "form" %>
    diff --git a/app/views/branded/paginable/registries/_index.html.erb b/app/views/branded/paginable/registries/_index.html.erb new file mode 100644 index 0000000..c18b73e --- /dev/null +++ b/app/views/branded/paginable/registries/_index.html.erb @@ -0,0 +1,40 @@ +
    + + + + + + + + + + + + <% scope.each do |registry| %> + + + + + + + + <% end %> + +
    <%= _('Name') %> <%= paginable_sort_link('registries.name') %><%= _('Description') %><%= _('URI') %><%= _('Version') %><%= _('Actions') %>
    <%= link_to registry.name, super_admin_registry_path(registry) %><%= registry.description %><%= registry.uri %><%= registry.version %> + +
    +
    diff --git a/app/views/branded/shared/dynamic_form/_form.html.erb b/app/views/branded/shared/dynamic_form/_form.html.erb index c102b20..7eaff5b 100644 --- a/app/views/branded/shared/dynamic_form/_form.html.erb +++ b/app/views/branded/shared/dynamic_form/_form.html.erb @@ -7,7 +7,6 @@ <% dmp_fragments = current_fragment.present? ? current_fragment.get_dmp_fragments() : [] %> <% schema_properties = schema.schema["properties"]%> <% required_fields = schema.schema["required"] %> - <% schema_properties.each do |key, prop| %> <% value = data[key] unless data.nil? %> <% field_name = defined?(form_prefix) ? "#{form_prefix}[#{key}]" : key %> @@ -28,13 +27,14 @@ <% case prop['type'] %> <% when 'string' %> <% if prop['inputType'].present? %> - <% if prop['inputType'] == 'dropdown' && dropdownValues %> - <%= create_select_field(f, value, "#{f.object_name}[#{field_name}]", label, field_id, dropdownValues, required: required, readonly: readonly, validation: validation, ttip: ttip, default_value: default_value) %> + <% if prop['inputType'] == 'dropdown' && prop['registry_id'] %> + <% registryValues = RegistryValue.where(registry_id: prop['registry_id'])%> + <%= create_select_field(f, value, "#{f.object_name}[#{field_name}]", label, field_id, registryValues, template_locale, readonly: readonly, validation: validation, ttip: ttip, default_value: default_value) %> <% elsif prop['inputType'] == 'textarea' %> <%= create_textarea_field(f, value, field_name, label, field_id, required: required, readonly: readonly, validation: validation, example: example, ttip: ttip, default_value: default_value) %> <% end %> - <% elsif prop['format'].nil?%> - <%= create_text_field(f, value, field_name, label, field_id, required: required, readonly: readonly, validation: validation, ttip: ttip, example: example, default_value: default_value) %> + <% elsif prop['format'].nil? %> + <%= create_text_field(f, value, field_name, label, field_id, required: required, readonly: readonly, validation: validation, ttip: ttip, example: example, default_value: default_value) %> <% elsif prop['format'] == 'date' %> <%= create_date_field(f, value, field_name, label, field_id, required: required, readonly: readonly, validation: validation, ttip: ttip, example: example, default_value: default_value) %> <% elsif prop['format'] == 'uri' %> @@ -134,6 +134,10 @@
    <% end %> + <% elsif prop['inputType'] == 'dropdown' && prop['registry_id'] %> + <% registryValues = RegistryValue.where(registry_id: prop['registry_id'])%> + <% value = value["id"] if value.present? %> + <%= create_select_field(f, value, "#{f.object_name}[#{field_name}]", label, field_id, registryValues, template_locale, readonly: readonly, multiple: false, validation: validation, ttip: ttip, default_value: default_value) %> <% end %> <% end %> <% end %> diff --git a/app/views/branded/shared/dynamic_form/fields/_select_field.html.erb b/app/views/branded/shared/dynamic_form/fields/_select_field.html.erb index e98f816..b7efa8e 100644 --- a/app/views/branded/shared/dynamic_form/fields/_select_field.html.erb +++ b/app/views/branded/shared/dynamic_form/fields/_select_field.html.erb @@ -1,4 +1,4 @@ -<%# locals: { f, field_label, field_name, select_values, selected_value, field_class, required, readonly, multiple, validation, ttip } %> +<%# locals: { f, field_label, field_name, select_values, locale, selected_value, field_class, required, readonly, multiple, validation, ttip } %> <% field_label = field_label || 'No label defined' %> <% field_label = required ? "* #{field_label}" : field_label%> @@ -9,8 +9,14 @@
    <%= select_tag field_name, - options_for_select(select_values, - selected: selected_value), + options_for_select( + select_values.map {|v| [ + v.to_s(locale), + select_value(v, locale) + ] + }, + selected: selected_value + ), disabled: readonly, multiple: multiple, include_blank: include_blank, diff --git a/app/views/branded/shared/export/_display_madmp_fragment.erb b/app/views/branded/shared/export/_display_madmp_fragment.erb index 8af889c..eb31a42 100644 --- a/app/views/branded/shared/export/_display_madmp_fragment.erb +++ b/app/views/branded/shared/export/_display_madmp_fragment.erb @@ -1,6 +1,6 @@ <% sub_schemas = schema.get_sub_schemas %> <% data = fragment.data unless fragment.nil? %> -<% dmp_fragments = fragment.present? ? fragment.get_dmp_fragments() : [] %> +<% dmp_fragments = fragment.present? ? fragment.dmp_fragments() : [] %> <% schema_properties = schema.schema["properties"]%> <% schema_properties.each do |key, prop| %> diff --git a/app/views/branded/shared/fragments/_display.html.erb b/app/views/branded/shared/fragments/_display.html.erb index 2428405..1d67b29 100644 --- a/app/views/branded/shared/fragments/_display.html.erb +++ b/app/views/branded/shared/fragments/_display.html.erb @@ -1,6 +1,6 @@ <% sub_schemas = schema.get_sub_schemas %> <% data = fragment.data unless fragment.nil? %> -<% dmp_fragments = fragment.present? ? fragment.get_dmp_fragments() : [] %> +<% dmp_fragments = fragment.present? ? fragment.dmp_fragments() : [] %> <% schema_properties = schema.schema["properties"]%>
    <% schema_properties.each do |key, prop| %> diff --git a/app/views/branded/super_admin/madmp_schemas/_form.html.erb b/app/views/branded/super_admin/madmp_schemas/_form.html.erb index 31bbbbc..8dd1081 100644 --- a/app/views/branded/super_admin/madmp_schemas/_form.html.erb +++ b/app/views/branded/super_admin/madmp_schemas/_form.html.erb @@ -1,33 +1,35 @@ <% url = @schema.new_record? ? super_admin_madmp_schemas_path : super_admin_madmp_schema_path(@schema) %> <%= form_for @schema, url: url, html: { class: 'schema' } do |f| %> -
    - <%= f.label(:label, _('Label'), class: 'control-label') %> - <%= f.text_field(:label, class: "form-control", spellcheck: true, "aria-required": true) %> -
    -
    - <%= f.label(:name, _('Name'), class: 'control-label') %> - <%= f.text_field(:name, class: "form-control", spellcheck: true, "aria-required": true) %> -
    -
    - <%= f.label(:name, _('Classname'), class: 'control-label') %> - <%= f.text_field(:classname, class: "form-control", spellcheck: true, "aria-required": true) %> -
    -
    - <%= f.label(:version, _('Version'), class: 'control-label') %> - <%= f.number_field(:version, class: "form-control", spellcheck: true, "aria-required": true) %> -
    -
    - <%= f.label(:schema, _('Schema')) %> - <%= f.text_area(:schema, class: "form-control", rows: 10, value: @schema.schema.to_json) %> -
    -
    - <%= f.button(_('Save'), class: "btn btn-default", type: "submit") %> - <% unless @schema.new_record? %> - <%= link_to(_('Delete'), super_admin_madmp_schema_path(@schema), class: 'btn btn-default', - rel: 'nofollow', 'data-method': 'delete', - 'data-confirm': _("Are you sure you want to delete the schema \"%{title}\"?") % { title: @schema.name }) %> - <% end %> - <%= link_to(_('Cancel'), super_admin_madmp_schemas_path, class: 'btn btn-default', role: 'button') %> +
    +
    + <%= f.label(:label, _('Label'), class: 'control-label') %> + <%= f.text_field(:label, class: "form-control", spellcheck: true, "aria-required": true) %> +
    +
    + <%= f.label(:name, _('Name'), class: 'control-label') %> + <%= f.text_field(:name, class: "form-control", spellcheck: true, "aria-required": true) %> +
    +
    + <%= f.label(:name, _('Classname'), class: 'control-label') %> + <%= f.text_field(:classname, class: "form-control", spellcheck: true, "aria-required": true) %> +
    +
    + <%= f.label(:version, _('Version'), class: 'control-label') %> + <%= f.number_field(:version, class: "form-control", spellcheck: true, "aria-required": true) %> +
    +
    + <%= f.label(:schema, _('Schema')) %> + <%= f.text_area(:schema, class: "form-control", rows: 10, value: @schema.schema.to_json) %> +
    +
    + <%= f.button(_('Save'), class: "btn btn-default", type: "submit") %> + <% unless @schema.new_record? %> + <%= link_to(_('Delete'), super_admin_madmp_schema_path(@schema), class: 'btn btn-default', + rel: 'nofollow', 'data-method': 'delete', + 'data-confirm': _("Are you sure you want to delete the schema \"%{title}\"?") % { title: @schema.name }) %> + <% end %> + <%= link_to(_('Cancel'), super_admin_madmp_schemas_path, class: 'btn btn-default', role: 'button') %> +
    <% end %> \ No newline at end of file diff --git a/app/views/branded/super_admin/madmp_schemas/edit.html.erb b/app/views/branded/super_admin/madmp_schemas/edit.html.erb index b4a7c1d..cc1397a 100644 --- a/app/views/branded/super_admin/madmp_schemas/edit.html.erb +++ b/app/views/branded/super_admin/madmp_schemas/edit.html.erb @@ -1,6 +1,10 @@ -

    - <%= @schema.label %> - <%= link_to(_('View all schemas'), super_admin_madmp_schemas_path, - class: 'btn btn-default pull-right', role: 'button') %> -

    +
    +
    +

    + <%= @schema.label %> + <%= link_to(_('View all schemas'), super_admin_madmp_schemas_path, + class: 'btn btn-default pull-right', role: 'button') %> +

    +
    +
    <%= render partial: 'form' %> \ No newline at end of file diff --git a/app/views/branded/super_admin/madmp_schemas/new.html.erb b/app/views/branded/super_admin/madmp_schemas/new.html.erb index 33b244b..9539388 100644 --- a/app/views/branded/super_admin/madmp_schemas/new.html.erb +++ b/app/views/branded/super_admin/madmp_schemas/new.html.erb @@ -1,6 +1,10 @@ -

    - <%= _("New schema") %> - <%= link_to(_('View all schemas'), super_admin_madmp_schemas_path, - class: 'btn btn-default pull-right', role: 'button') %> -

    +
    +
    +

    + <%= _("New schema") %> + <%= link_to(_('View all schemas'), super_admin_madmp_schemas_path, + class: 'btn btn-default pull-right', role: 'button') %> +

    +
    +
    <%= render partial: 'form' %> \ No newline at end of file diff --git a/app/views/branded/super_admin/registries/_form.html.erb b/app/views/branded/super_admin/registries/_form.html.erb new file mode 100644 index 0000000..66c02d4 --- /dev/null +++ b/app/views/branded/super_admin/registries/_form.html.erb @@ -0,0 +1,32 @@ +<% url = @registry.new_record? ? super_admin_registries_path : super_admin_registry_path(@registry) %> + + <%= form_for @registry, url: url, html: { class: 'registry' } do |f| %> +
    +
    + <%= f.label(:name, _('Name'), class: 'control-label') %> + <%= f.text_field(:name, class: "form-control", spellcheck: true, "aria-required": true) %> +
    +
    + <%= f.label(:description, _('Description'), class: 'control-label') %> + <%= f.text_field(:description, class: "form-control", spellcheck: true) %> +
    +
    + <%= f.label(:uri, _('URI'), class: 'control-label') %> + <%= f.url_field(:uri, class: "form-control", spellcheck: true) %> +
    +
    + <%= f.label(:version, _('Version'), class: 'control-label') %> + <%= f.number_field(:version, class: "form-control", spellcheck: true) %> +
    + +
    + <%= f.button(_('Save'), class: "btn btn-default", type: "submit") %> + <% unless @registry.new_record? %> + <%= link_to(_('Delete'), super_admin_registry_path(@registry), class: 'btn btn-default', + rel: 'nofollow', 'data-method': 'delete', + 'data-confirm': _("Are you sure you want to delete the registry \"%{title}\"?") % { title: @registry.name }) %> + <% end %> + <%= link_to(_('Cancel'), super_admin_registries_path, class: 'btn btn-default', role: 'button') %> +
    +
    + <% end %> \ No newline at end of file diff --git a/app/views/branded/super_admin/registries/_values_list.html.erb b/app/views/branded/super_admin/registries/_values_list.html.erb new file mode 100644 index 0000000..82ab1b7 --- /dev/null +++ b/app/views/branded/super_admin/registries/_values_list.html.erb @@ -0,0 +1,26 @@ +<%# locals: { values } %> +<% values.each do |reg_val| %> +
    + + + +<% end %> \ No newline at end of file diff --git a/app/views/branded/super_admin/registries/edit.html.erb b/app/views/branded/super_admin/registries/edit.html.erb new file mode 100644 index 0000000..cef1d88 --- /dev/null +++ b/app/views/branded/super_admin/registries/edit.html.erb @@ -0,0 +1,10 @@ +
    +
    +

    + <%= @registry.name %> + <%= link_to(_('View all registries'), super_admin_registries_path, + class: 'btn btn-default pull-right', role: 'button') %> +

    +
    +
    +<%= render partial: 'form' %> \ No newline at end of file diff --git a/app/views/branded/super_admin/registries/index.html.erb b/app/views/branded/super_admin/registries/index.html.erb new file mode 100644 index 0000000..e543671 --- /dev/null +++ b/app/views/branded/super_admin/registries/index.html.erb @@ -0,0 +1,23 @@ +<%# Available locals: orgs %> +<% title _('Registries') %> +
    +
    +

    + <%= _('Registries') %> + <%= _('Create Registry') %> +

    +
    +
    +
    +
    + + <%= paginable_renderise( + partial: '/paginable/registries/index', + controller: 'paginable/registries', + action: 'index', + scope: registries, + query_params: { sort_field: 'registries.name', sort_direction: :asc }) %> +
    +
    +
    \ No newline at end of file diff --git a/app/views/branded/super_admin/registries/new.html.erb b/app/views/branded/super_admin/registries/new.html.erb new file mode 100644 index 0000000..e314ccf --- /dev/null +++ b/app/views/branded/super_admin/registries/new.html.erb @@ -0,0 +1,10 @@ +
    +
    +

    + <%= _("New registry value") %> + <%= link_to(_('View all registries'), super_admin_registries_path, + class: 'btn btn-default pull-right', role: 'button') %> +

    +
    +
    +<%= render partial: 'form' %> \ No newline at end of file diff --git a/app/views/branded/super_admin/registries/show.html.erb b/app/views/branded/super_admin/registries/show.html.erb new file mode 100644 index 0000000..e1f03bd --- /dev/null +++ b/app/views/branded/super_admin/registries/show.html.erb @@ -0,0 +1,35 @@ +
    +
    +

    + <%= @registry.name %> + <%= link_to(_('View all registries'), super_admin_registries_path, + class: 'btn btn-default pull-right', role: 'button') %> +

    +
    +
    +
    +
    +
    +
    <%= _('Name') %>
    +
    <%= @registry.name %>
    +
    <%= _('Description') %>
    +
    <%= sanitize @registry.description %>
    +
    <%= _('URI') %>
    +
    <%= @registry.uri %>
    +
    <%= _('Version') %>
    +
    <%= @registry.version %>
    +

    <%= _('Values') %>

    +
    <%= reg_val.to_s %> + +
    + + + + + + <%= render partial: 'values_list', locals: { values: @registry.registry_values } %> + +
    <%= _('Value') %><%= _('Actions') %>
    + <%= _('Create Value') %> + +
    + \ No newline at end of file diff --git a/app/views/branded/super_admin/registry_values/_form.html.erb b/app/views/branded/super_admin/registry_values/_form.html.erb new file mode 100644 index 0000000..8e39273 --- /dev/null +++ b/app/views/branded/super_admin/registry_values/_form.html.erb @@ -0,0 +1,20 @@ +<% url = @registry_value.new_record? ? super_admin_registry_values_path : super_admin_registry_value_path(@registry_value) %> + + <%= form_for @registry_value, url: url, html: { class: 'registry-value' } do |f| %> +
    + <%= f.hidden_field :registry_id, value: @registry.id %> +
    + <%= f.label(:data, _('Data'), class: 'control-label') %> + <%= f.text_area(:data, class: "form-control", spellcheck: true, "aria-required": true, value: @registry_value.data.to_json) %> +
    + +
    + <%= f.button(_('Save'), class: "btn btn-default", type: "submit") %> + <% unless @registry_value.new_record? %> + <%= link_to(_('Delete'), super_admin_registry_value_path(@registry_value), class: 'btn btn-default', + rel: 'nofollow', 'data-method': 'delete', + 'data-confirm': _("Are you sure you want to delete the registry value?")) %> + <% end %> +
    +
    + <% end %> \ No newline at end of file diff --git a/app/views/branded/super_admin/registry_values/edit.html.erb b/app/views/branded/super_admin/registry_values/edit.html.erb new file mode 100644 index 0000000..9c40479 --- /dev/null +++ b/app/views/branded/super_admin/registry_values/edit.html.erb @@ -0,0 +1,10 @@ +
    +
    +

    + <%= _("Edit registry value") %> + <%= link_to(_('View registry'), super_admin_registry_path(@registry), + class: 'btn btn-default pull-right', role: 'button') %> +

    +
    +
    +<%= render partial: 'form' %> \ No newline at end of file diff --git a/app/views/branded/super_admin/registry_values/new.html.erb b/app/views/branded/super_admin/registry_values/new.html.erb new file mode 100644 index 0000000..c7d0a38 --- /dev/null +++ b/app/views/branded/super_admin/registry_values/new.html.erb @@ -0,0 +1,10 @@ +
    +
    +

    + <%= _("New registry value") %> + <%= link_to(_('View registry'), super_admin_registry_path(@registry), + class: 'btn btn-default pull-right', role: 'button') %> +

    +
    +
    +<%= render partial: 'form' %> \ No newline at end of file diff --git a/config/routes.rb b/config/routes.rb index dea787e..0d464c1 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -232,10 +232,14 @@ resources :departments, only: [] do get 'index/:page', action: :index, on: :collection, as: :index end - # Paginable actions for structured data schemas + # Paginable actions for madmp schemas resources :madmp_schemas, only: [] do get 'index/:page', action: :index, on: :collection, as: :index end + # Paginable actions for registries + resources :registries, only: [] do + get 'index/:page', action: :index, on: :collection, as: :index + end end resources :template_options, only: [:index], constraints: { format: /json/ } @@ -302,6 +306,8 @@ resources :orgs, only: [:index, :new, :create, :destroy] resources :themes, only: [:index, :new, :create, :edit, :update, :destroy] resources :madmp_schemas, only: [:index, :new, :create, :edit, :update, :destroy] + resources :registries + resources :registry_values, only: [:new, :create, :edit, :update, :destroy] resources :users, only: [:edit, :update] do member do put :merge diff --git a/db/madmp_seeds.rb b/db/madmp_seeds.rb index aed66dc..485efa8 100644 --- a/db/madmp_seeds.rb +++ b/db/madmp_seeds.rb @@ -2,6 +2,10 @@ # frozen_string_literal: true # warn_indent: true +include FactoryBot::Syntax::Methods + +require "factory_bot" +require "faker" # This file should contain all the record creation needed to seed the database # with its default values. The data can then be loaded with the rake db:seed diff --git a/db/migrate/20201012085046_create_registries.rb b/db/migrate/20201012085046_create_registries.rb new file mode 100644 index 0000000..a604626 --- /dev/null +++ b/db/migrate/20201012085046_create_registries.rb @@ -0,0 +1,13 @@ +class CreateRegistries < ActiveRecord::Migration + def change + create_table :registries do |t| + t.string :name, null: false + t.string :description + t.string :uri + t.integer :version + t.belongs_to :org, foreign_key: true, index: true + + t.timestamps null: false + end + end +end diff --git a/db/migrate/20201012085101_create_registry_values.rb b/db/migrate/20201012085101_create_registry_values.rb new file mode 100644 index 0000000..08fef77 --- /dev/null +++ b/db/migrate/20201012085101_create_registry_values.rb @@ -0,0 +1,10 @@ +class CreateRegistryValues < ActiveRecord::Migration + def change + create_table :registry_values do |t| + t.json :data + t.belongs_to :registry, foreign_key: true, index: true + + t.timestamps null: false + end + end +end diff --git a/db/schema.rb b/db/schema.rb index a6fad3d..0126cd5 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,7 +11,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20200902060740) do +ActiveRecord::Schema.define(version: 20201012085101) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -343,6 +343,27 @@ t.integer "super_region_id" end + create_table "registries", force: :cascade do |t| + t.string "name", null: false + t.string "description" + t.string "uri" + t.integer "version" + t.integer "org_id" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + end + + add_index "registries", ["org_id"], name: "index_registries_on_org_id", using: :btree + + create_table "registry_values", force: :cascade do |t| + t.json "data" + t.integer "registry_id" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + end + + add_index "registry_values", ["registry_id"], name: "index_registry_values_on_registry_id", using: :btree + create_table "research_output_types", force: :cascade do |t| t.string "label", null: false t.string "slug", null: false @@ -580,6 +601,8 @@ add_foreign_key "questions", "sections" add_foreign_key "questions_themes", "questions" add_foreign_key "questions_themes", "themes" + add_foreign_key "registries", "orgs" + add_foreign_key "registry_values", "registries" add_foreign_key "research_outputs", "plans" add_foreign_key "research_outputs", "research_output_types" add_foreign_key "roles", "plans" diff --git a/lib/dmpopidor/controllers/application.rb b/lib/dmpopidor/controllers/application.rb index 0aa0d59..d4ac345 100644 --- a/lib/dmpopidor/controllers/application.rb +++ b/lib/dmpopidor/controllers/application.rb @@ -17,7 +17,9 @@ Pref: _("preferences"), Department: _("department"), User: obj == current_user ? _("profile") : _("user"), - MadmpSchema: _("schema") + MadmpSchema: _("schema"), + Registry: _("registry"), + RegistryValue: _("registry value") } if obj.respond_to?(:customization_of) && obj.send(:customization_of).present? display_name[:Template] = "customization"