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? %> -