diff --git a/app/models/facet.rb b/app/models/facet.rb new file mode 100644 index 000000000..ca50225bc --- /dev/null +++ b/app/models/facet.rb @@ -0,0 +1,25 @@ +class Facet + def initialize(table:, column:, label: nil, virtual: false, type: :text, value_column: :value, filterable: true, classname: nil, scope: '') + @table = table + @column = column + @label = label || I18n.t(column, scope: [:activerecord, :attributes, :procedure_presentation, :fields, table]) + @classname = classname + @virtual = virtual + @type = type + @scope = scope + @value_column = value_column + @filterable = filterable + end + + attr_reader :table, :column, :label, :classname, :virtual, :type, :scope, :value_column, :filterable + + def ==(other) + other.to_json == to_json + end + + def to_json + { + table:, column:, label:, classname:, virtual:, type:, scope:, value_column:, filterable: + } + end +end diff --git a/app/models/procedure_presentation.rb b/app/models/procedure_presentation.rb index b5e981a45..553c2dd4b 100644 --- a/app/models/procedure_presentation.rb +++ b/app/models/procedure_presentation.rb @@ -94,24 +94,24 @@ class ProcedurePresentation < ApplicationRecord def displayable_fields_for_select [ - fields.reject { |field| field['virtual'] } - .map { |field| [field['label'], field_id(field)] }, - displayed_fields.map { |field| field_id(field) } + fields.reject(&:virtual) + .map { |field| [field.label, field_id(field)] }, + displayed_fields.map { field_id(Facet.new(**_1.deep_symbolize_keys)) } ] end def filterable_fields_options fields.filter_map do |field| - next if field['filterable'] == false + next if field.filterable == false - [field['label'], field_id(field)] + [field.label, field_id(field)] end end def displayed_fields_for_headers [ field_hash('self', 'id', classname: 'number-col'), - *displayed_fields, + *displayed_fields.map { Facet.new(**_1.deep_symbolize_keys) }, field_hash('self', 'state', classname: 'state-col'), *sva_svr_fields ] @@ -201,15 +201,15 @@ class ProcedurePresentation < ApplicationRecord value_column = filters.pluck('value_column').compact.first || :value case table when 'self' - field = self_fields.find { |h| h['column'] == column } - if field['type'] == :date + field = self_fields.find { |h| h.column == column } + if field.type == :date dates = values .filter_map { |v| Time.zone.parse(v).beginning_of_day rescue nil } dossiers.filter_by_datetimes(column, dates) - elsif field['column'] == "state" && values.include?("pending_correction") + elsif field.column == "state" && values.include?("pending_correction") dossiers.joins(:corrections).where(corrections: DossierCorrection.pending) - elsif field['column'] == "state" && values.include?("en_construction") + elsif field.column == "state" && values.include?("en_construction") dossiers.where("dossiers.#{column} IN (?)", values).includes(:corrections).where.not(corrections: DossierCorrection.pending) else dossiers.where("dossiers.#{column} IN (?)", values) @@ -284,7 +284,7 @@ class ProcedurePresentation < ApplicationRecord else field = find_field(filter[TABLE], filter[COLUMN]) - if field["type"] == :date + if field.type == :date parsed_date = safe_parse_date(filter['value']) return parsed_date.present? ? I18n.l(parsed_date) : nil @@ -303,7 +303,8 @@ class ProcedurePresentation < ApplicationRecord def add_filter(statut, field, value) if value.present? table, column = field.split(SLASH) - label, value_column = find_field(table, column).values_at('label', 'value_column') + label = find_field(table, column).label + value_column = find_field(table, column).value_column case table when TYPE_DE_CHAMP, TYPE_DE_CHAMP_PRIVATE @@ -371,26 +372,27 @@ class ProcedurePresentation < ApplicationRecord end def field_type(field_id) - find_field(*field_id.split(SLASH))['type'] + find_field(*field_id.split(SLASH)).type end def field_enum(field_id) field = find_field(*field_id.split(SLASH)) - if field['scope'].present? - I18n.t(field['scope']).map(&:to_a).map(&:reverse) - elsif field['table'] == 'groupe_instructeur' + if field.scope.present? + I18n.t(field.scope).map(&:to_a).map(&:reverse) + elsif field.table == 'groupe_instructeur' instructeur.groupe_instructeurs.filter_map do if _1.procedure_id == procedure.id [_1.label, _1.id] end end else - find_type_de_champ(field['column']).options_for_select + find_type_de_champ(field.column).options_for_select end end def sortable?(field) - sort['table'] == field['table'] && sort['column'] == field['column'] + sort['table'] == field.table && + sort['column'] == field.column end def aria_sort(order, field) @@ -407,12 +409,23 @@ class ProcedurePresentation < ApplicationRecord private - def field_id(field) - field.values_at(TABLE, COLUMN).join(SLASH) + # type_de_champ/4373429 + def field_id(field_or_sort) + if field_or_sort.is_a?(Hash) + sort = field_or_sort + [sort[TABLE], sort[COLUMN]].join(SLASH) + else + field = field_or_sort + if field.label == 'rna – commune' + "#{[field.table, field.column].join(SLASH)}->#{field.value_column}" + else + [field.table, field.column].join(SLASH) + end + end end def find_field(table, column) - fields.find { |field| field.values_at(TABLE, COLUMN) == [table, column] } + fields.find { [_1.table, _1.column] == [table, column] } end def find_type_de_champ(column) @@ -466,17 +479,7 @@ class ProcedurePresentation < ApplicationRecord end def field_hash(table, column, label: nil, classname: '', virtual: false, type: :text, scope: '', value_column: :value, filterable: true) - { - 'label' => label || I18n.t(column, scope: [:activerecord, :attributes, :procedure_presentation, :fields, table]), - TABLE => table, - COLUMN => column, - 'classname' => classname, - 'virtual' => virtual, - 'type' => type, - 'scope' => scope, - 'value_column' => value_column, - 'filterable' => filterable - } + Facet.new(table:, column:, label:, classname:, virtual:, type:, scope:, value_column:, filterable:) end def field_hash_for_type_de_champ_public(type_champ, libelle, stable_id) @@ -500,8 +503,8 @@ class ProcedurePresentation < ApplicationRecord def valid_columns_for_table(table) @column_whitelist ||= fields - .group_by { |field| field[TABLE] } - .transform_values { |fields| Set.new(fields.pluck(COLUMN)) } + .group_by(&:table) + .transform_values { |facets| Set.new(facets.map(&:column)) } @column_whitelist[table] || [] end diff --git a/app/views/instructeurs/procedures/_header_field.html.haml b/app/views/instructeurs/procedures/_header_field.html.haml index e4a54d673..e66d2f683 100644 --- a/app/views/instructeurs/procedures/_header_field.html.haml +++ b/app/views/instructeurs/procedures/_header_field.html.haml @@ -1,10 +1,9 @@ -%th{ @procedure_presentation.aria_sort(@procedure_presentation.sort['order'], field), scope: "col", class: classname } - - = link_to update_sort_instructeur_procedure_path(@procedure, table: field['table'], column: field['column'], order: @procedure_presentation.opposite_order_for(field['table'], field['column'])) do +%th{ @procedure_presentation.aria_sort(@procedure_presentation.sort['order'], field), scope: "col", class: field.classname } + = link_to update_sort_instructeur_procedure_path(@procedure, table: field.table, column: field.column, order: @procedure_presentation.opposite_order_for(field.table, field.column)) do - if @procedure_presentation.sortable?(field) - if @procedure_presentation.sort['order'] == 'asc' - #{field['label']} ↑ + #{field.label} ↑ - else - #{field['label']} ↓ + #{field.label} ↓ - else - #{field['label']} + #{field.label} diff --git a/app/views/instructeurs/procedures/show.html.haml b/app/views/instructeurs/procedures/show.html.haml index d73df00cd..a9fa7783f 100644 --- a/app/views/instructeurs/procedures/show.html.haml +++ b/app/views/instructeurs/procedures/show.html.haml @@ -99,7 +99,7 @@ %input{ type: "checkbox", disabled: @disable_checkbox_all, checked: @disable_checkbox_all, data: { action: "batch-operation#onCheckAll" }, id: dom_id(BatchOperation.new, :checkbox_all), aria: { label: t('views.instructeurs.dossiers.select_all') } } - @procedure_presentation.displayed_fields_for_headers.each do |field| - = render partial: "header_field", locals: { field: field, classname: field['classname'] } + = render partial: "header_field", locals: { field: field } %th.follow-col Actions diff --git a/spec/models/procedure_presentation_spec.rb b/spec/models/procedure_presentation_spec.rb index 498d6b817..27cc13b27 100644 --- a/spec/models/procedure_presentation_spec.rb +++ b/spec/models/procedure_presentation_spec.rb @@ -10,10 +10,10 @@ describe ProcedurePresentation do create(:procedure_presentation, assign_to: assign_to, displayed_fields: [ - { "label" => "test1", "table" => "user", "column" => "email" }, - { "label" => "test2", "table" => "type_de_champ", "column" => first_type_de_champ_id } + { label: "test1", table: "user", column: "email" }, + { label: "test2", table: "type_de_champ", column: first_type_de_champ_id } ], - sort: { "table" => "user", "column" => "email", "order" => "asc" }, + sort: { table: "user", column: "email", "order" => "asc" }, filters: filters) } let(:procedure_presentation_id) { procedure_presentation.id } @@ -35,19 +35,19 @@ describe ProcedurePresentation do it { expect(build(:procedure_presentation)).to be_valid } context 'of displayed fields' do - it { expect(build(:procedure_presentation, displayed_fields: [{ "table" => "user", "column" => "reset_password_token", "order" => "asc" }])).to be_invalid } + it { expect(build(:procedure_presentation, displayed_fields: [{ table: "user", column: "reset_password_token", "order" => "asc" }])).to be_invalid } end context 'of sort' do - it { expect(build(:procedure_presentation, sort: { "table" => "notifications", "column" => "notifications", "order" => "asc" })).to be_valid } - it { expect(build(:procedure_presentation, sort: { "table" => "self", "column" => "id", "order" => "asc" })).to be_valid } - it { expect(build(:procedure_presentation, sort: { "table" => "self", "column" => "state", "order" => "asc" })).to be_valid } - it { expect(build(:procedure_presentation, sort: { "table" => "user", "column" => "reset_password_token", "order" => "asc" })).to be_invalid } + it { expect(build(:procedure_presentation, sort: { table: "notifications", column: "notifications", "order" => "asc" })).to be_valid } + it { expect(build(:procedure_presentation, sort: { table: "self", column: "id", "order" => "asc" })).to be_valid } + it { expect(build(:procedure_presentation, sort: { table: "self", column: "state", "order" => "asc" })).to be_valid } + it { expect(build(:procedure_presentation, sort: { table: "user", column: "reset_password_token", "order" => "asc" })).to be_invalid } end context 'of filters' do - it { expect(build(:procedure_presentation, filters: { "suivis" => [{ "table" => "user", "column" => "reset_password_token", "order" => "asc" }] })).to be_invalid } - it { expect(build(:procedure_presentation, filters: { "suivis" => [{ "table" => "user", "column" => "email", "value" => "exceedingly long filter value" * 10 }] })).to be_invalid } + it { expect(build(:procedure_presentation, filters: { "suivis" => [{ table: "user", column: "reset_password_token", "order" => "asc" }] })).to be_invalid } + it { expect(build(:procedure_presentation, filters: { "suivis" => [{ table: "user", column: "email", "value" => "exceedingly long filter value" * 10 }] })).to be_invalid } end end @@ -64,36 +64,36 @@ describe ProcedurePresentation do let(:tdc_private_2) { procedure.active_revision.types_de_champ_private[1] } let(:expected) { [ - { "label" => 'Créé le', "table" => 'self', "column" => 'created_at', 'classname' => '', 'virtual' => false, 'type' => :date, "scope" => '', "value_column" => :value, 'filterable' => true }, - { "label" => 'Mis à jour le', "table" => 'self', "column" => 'updated_at', 'classname' => '', 'virtual' => false, 'type' => :date, "scope" => '', "value_column" => :value, 'filterable' => true }, - { "label" => 'Déposé le', "table" => 'self', "column" => 'depose_at', 'classname' => '', 'virtual' => false, 'type' => :date, "scope" => '', "value_column" => :value, 'filterable' => true }, - { "label" => 'En construction le', "table" => 'self', "column" => 'en_construction_at', 'classname' => '', 'virtual' => false, 'type' => :date, "scope" => '', "value_column" => :value, 'filterable' => true }, - { "label" => 'En instruction le', "table" => 'self', "column" => 'en_instruction_at', 'classname' => '', 'virtual' => false, 'type' => :date, "scope" => '', "value_column" => :value, 'filterable' => true }, - { "label" => 'Terminé le', "table" => 'self', "column" => 'processed_at', 'classname' => '', 'virtual' => false, 'type' => :date, "scope" => '', "value_column" => :value, 'filterable' => true }, - { "label" => "Mis à jour depuis", "table" => "self", "column" => "updated_since", "classname" => "", 'virtual' => true, 'type' => :date, 'scope' => '', "value_column" => :value, 'filterable' => true }, - { "label" => "Déposé depuis", "table" => "self", "column" => "depose_since", "classname" => "", 'virtual' => true, 'type' => :date, 'scope' => '', "value_column" => :value, 'filterable' => true }, - { "label" => "En construction depuis", "table" => "self", "column" => "en_construction_since", "classname" => "", 'virtual' => true, 'type' => :date, 'scope' => '', "value_column" => :value, 'filterable' => true }, - { "label" => "En instruction depuis", "table" => "self", "column" => "en_instruction_since", "classname" => "", 'virtual' => true, 'type' => :date, 'scope' => '', "value_column" => :value, 'filterable' => true }, - { "label" => "Terminé depuis", "table" => "self", "column" => "processed_since", "classname" => "", 'virtual' => true, 'type' => :date, 'scope' => '', "value_column" => :value, 'filterable' => true }, - { "label" => "Statut", "table" => "self", "column" => "state", "classname" => "", 'virtual' => true, 'scope' => 'instructeurs.dossiers.filterable_state', 'type' => :enum, "value_column" => :value, 'filterable' => true }, - { "label" => 'Demandeur', "table" => 'user', "column" => 'email', 'classname' => '', 'virtual' => false, 'type' => :text, "scope" => '', "value_column" => :value, 'filterable' => true }, - { "label" => 'Email instructeur', "table" => 'followers_instructeurs', "column" => 'email', 'classname' => '', 'virtual' => false, 'type' => :text, "scope" => '', "value_column" => :value, 'filterable' => true }, - { "label" => 'Groupe instructeur', "table" => 'groupe_instructeur', "column" => 'id', 'classname' => '', 'virtual' => false, 'type' => :enum, "scope" => '', "value_column" => :value, 'filterable' => true }, - { "label" => 'Avis oui/non', "table" => 'avis', "column" => 'question_answer', 'classname' => '', 'virtual' => false, 'type' => :text, "scope" => '', "value_column" => :value, 'filterable' => false }, - { "label" => 'SIREN', "table" => 'etablissement', "column" => 'entreprise_siren', 'classname' => '', 'virtual' => false, 'type' => :text, "scope" => '', "value_column" => :value, 'filterable' => true }, - { "label" => 'Forme juridique', "table" => 'etablissement', "column" => 'entreprise_forme_juridique', 'classname' => '', 'virtual' => false, 'type' => :text, "scope" => '', "value_column" => :value, 'filterable' => true }, - { "label" => 'Nom commercial', "table" => 'etablissement', "column" => 'entreprise_nom_commercial', 'classname' => '', 'virtual' => false, 'type' => :text, "scope" => '', "value_column" => :value, 'filterable' => true }, - { "label" => 'Raison sociale', "table" => 'etablissement', "column" => 'entreprise_raison_sociale', 'classname' => '', 'virtual' => false, 'type' => :text, "scope" => '', "value_column" => :value, 'filterable' => true }, - { "label" => 'SIRET siège social', "table" => 'etablissement', "column" => 'entreprise_siret_siege_social', 'classname' => '', 'virtual' => false, 'type' => :text, "scope" => '', "value_column" => :value, 'filterable' => true }, - { "label" => 'Date de création', "table" => 'etablissement', "column" => 'entreprise_date_creation', 'classname' => '', 'virtual' => false, 'type' => :date, "scope" => '', "value_column" => :value, 'filterable' => true }, - { "label" => 'SIRET', "table" => 'etablissement', "column" => 'siret', 'classname' => '', 'virtual' => false, 'type' => :text, "scope" => '', "value_column" => :value, 'filterable' => true }, - { "label" => 'Libellé NAF', "table" => 'etablissement', "column" => 'libelle_naf', 'classname' => '', 'virtual' => false, 'type' => :text, "scope" => '', "value_column" => :value, 'filterable' => true }, - { "label" => 'Code postal', "table" => 'etablissement', "column" => 'code_postal', 'classname' => '', 'virtual' => false, 'type' => :text, "scope" => '', "value_column" => :value, 'filterable' => true }, - { "label" => tdc_1.libelle, "table" => 'type_de_champ', "column" => tdc_1.stable_id.to_s, 'classname' => '', 'virtual' => false, 'type' => :text, "scope" => '', "value_column" => :value, 'filterable' => true }, - { "label" => tdc_2.libelle, "table" => 'type_de_champ', "column" => tdc_2.stable_id.to_s, 'classname' => '', 'virtual' => false, 'type' => :text, "scope" => '', "value_column" => :value, 'filterable' => true }, - { "label" => tdc_private_1.libelle, "table" => 'type_de_champ_private', "column" => tdc_private_1.stable_id.to_s, 'classname' => '', 'virtual' => false, 'type' => :text, "scope" => '', "value_column" => :value, 'filterable' => true }, - { "label" => tdc_private_2.libelle, "table" => 'type_de_champ_private', "column" => tdc_private_2.stable_id.to_s, 'classname' => '', 'virtual' => false, 'type' => :text, "scope" => '', "value_column" => :value, 'filterable' => true } - ] + { label: 'Créé le', table: 'self', column: 'created_at', classname: '', virtual: false, type: :date, scope: '', value_column: :value, filterable: true }, + { label: 'Mis à jour le', table: 'self', column: 'updated_at', classname: '', virtual: false, type: :date, scope: '', value_column: :value, filterable: true }, + { label: 'Déposé le', table: 'self', column: 'depose_at', classname: '', virtual: false, type: :date, scope: '', value_column: :value, filterable: true }, + { label: 'En construction le', table: 'self', column: 'en_construction_at', classname: '', virtual: false, type: :date, scope: '', value_column: :value, filterable: true }, + { label: 'En instruction le', table: 'self', column: 'en_instruction_at', classname: '', virtual: false, type: :date, scope: '', value_column: :value, filterable: true }, + { label: 'Terminé le', table: 'self', column: 'processed_at', classname: '', virtual: false, type: :date, scope: '', value_column: :value, filterable: true }, + { label: "Mis à jour depuis", table: "self", column: "updated_since", classname: "", virtual: true, type: :date, scope: '', value_column: :value, filterable: true }, + { label: "Déposé depuis", table: "self", column: "depose_since", classname: "", virtual: true, type: :date, scope: '', value_column: :value, filterable: true }, + { label: "En construction depuis", table: "self", column: "en_construction_since", classname: "", virtual: true, type: :date, scope: '', value_column: :value, filterable: true }, + { label: "En instruction depuis", table: "self", column: "en_instruction_since", classname: "", virtual: true, type: :date, scope: '', value_column: :value, filterable: true }, + { label: "Terminé depuis", table: "self", column: "processed_since", classname: "", virtual: true, type: :date, scope: '', value_column: :value, filterable: true }, + { label: "Statut", table: "self", column: "state", classname: "", virtual: true, scope: 'instructeurs.dossiers.filterable_state', type: :enum, value_column: :value, filterable: true }, + { label: 'Demandeur', table: 'user', column: 'email', classname: '', virtual: false, type: :text, scope: '', value_column: :value, filterable: true }, + { label: 'Email instructeur', table: 'followers_instructeurs', column: 'email', classname: '', virtual: false, type: :text, scope: '', value_column: :value, filterable: true }, + { label: 'Groupe instructeur', table: 'groupe_instructeur', column: 'id', classname: '', virtual: false, type: :enum, scope: '', value_column: :value, filterable: true }, + { label: 'Avis oui/non', table: 'avis', column: 'question_answer', classname: '', virtual: false, type: :text, scope: '', value_column: :value, filterable: false }, + { label: 'SIREN', table: 'etablissement', column: 'entreprise_siren', classname: '', virtual: false, type: :text, scope: '', value_column: :value, filterable: true }, + { label: 'Forme juridique', table: 'etablissement', column: 'entreprise_forme_juridique', classname: '', virtual: false, type: :text, scope: '', value_column: :value, filterable: true }, + { label: 'Nom commercial', table: 'etablissement', column: 'entreprise_nom_commercial', classname: '', virtual: false, type: :text, scope: '', value_column: :value, filterable: true }, + { label: 'Raison sociale', table: 'etablissement', column: 'entreprise_raison_sociale', classname: '', virtual: false, type: :text, scope: '', value_column: :value, filterable: true }, + { label: 'SIRET siège social', table: 'etablissement', column: 'entreprise_siret_siege_social', classname: '', virtual: false, type: :text, scope: '', value_column: :value, filterable: true }, + { label: 'Date de création', table: 'etablissement', column: 'entreprise_date_creation', classname: '', virtual: false, type: :date, scope: '', value_column: :value, filterable: true }, + { label: 'SIRET', table: 'etablissement', column: 'siret', classname: '', virtual: false, type: :text, scope: '', value_column: :value, filterable: true }, + { label: 'Libellé NAF', table: 'etablissement', column: 'libelle_naf', classname: '', virtual: false, type: :text, scope: '', value_column: :value, filterable: true }, + { label: 'Code postal', table: 'etablissement', column: 'code_postal', classname: '', virtual: false, type: :text, scope: '', value_column: :value, filterable: true }, + { label: tdc_1.libelle, table: 'type_de_champ', column: tdc_1.stable_id.to_s, classname: '', virtual: false, type: :text, scope: '', value_column: :value, filterable: true }, + { label: tdc_2.libelle, table: 'type_de_champ', column: tdc_2.stable_id.to_s, classname: '', virtual: false, type: :text, scope: '', value_column: :value, filterable: true }, + { label: tdc_private_1.libelle, table: 'type_de_champ_private', column: tdc_private_1.stable_id.to_s, classname: '', virtual: false, type: :text, scope: '', value_column: :value, filterable: true }, + { label: tdc_private_2.libelle, table: 'type_de_champ_private', column: tdc_private_2.stable_id.to_s, classname: '', virtual: false, type: :text, scope: '', value_column: :value, filterable: true } + ].map { Facet.new(**_1) } } before do @@ -105,13 +105,29 @@ describe ProcedurePresentation do subject { create(:procedure_presentation, assign_to: assign_to) } - it { expect(subject.fields).to eq(expected) } + context 'with explication/header_sections' do + let(:types_de_champ_public) { Array.new(4) { { type: :text } } } + let(:types_de_champ_private) { Array.new(4) { { type: :text } } } + before do + procedure.active_revision.types_de_champ_public[2].update_attribute(:type_champ, TypeDeChamp.type_champs.fetch(:header_section)) + procedure.active_revision.types_de_champ_public[3].update_attribute(:type_champ, TypeDeChamp.type_champs.fetch(:explication)) + procedure.active_revision.types_de_champ_private[2].update_attribute(:type_champ, TypeDeChamp.type_champs.fetch(:header_section)) + procedure.active_revision.types_de_champ_private[3].update_attribute(:type_champ, TypeDeChamp.type_champs.fetch(:explication)) + end + it { expect(subject.fields).to eq(expected) } + end + + context 'with rna' do + let(:types_de_champ_public) { [{ type: :rna, libelle: 'rna' }] } + let(:types_de_champ_private) { [] } + xit { expect(subject.fields.map(&:label)).to include('rna – commune') } + end end context 'when the procedure is for individuals' do - let(:name_field) { { "label" => "Prénom", "table" => "individual", "column" => "prenom", 'classname' => '', 'virtual' => false, "type" => :text, "scope" => '', "value_column" => :value, 'filterable' => true } } - let(:surname_field) { { "label" => "Nom", "table" => "individual", "column" => "nom", 'classname' => '', 'virtual' => false, "type" => :text, "scope" => '', "value_column" => :value, 'filterable' => true } } - let(:gender_field) { { "label" => "Civilité", "table" => "individual", "column" => "gender", 'classname' => '', 'virtual' => false, "type" => :text, "scope" => '', "value_column" => :value, 'filterable' => true } } + let(:name_field) { Facet.new(label: "Prénom", table: "individual", column: "prenom", classname: '', virtual: false, type: :text, scope: '', value_column: :value, filterable: true) } + let(:surname_field) { Facet.new(label: "Nom", table: "individual", column: "nom", classname: '', virtual: false, type: :text, scope: '', value_column: :value, filterable: true) } + let(:gender_field) { Facet.new(label: "Civilité", table: "individual", column: "gender", classname: '', virtual: false, type: :text, scope: '', value_column: :value, filterable: true) } let(:procedure) { create(:procedure, :for_individual) } let(:procedure_presentation) { create(:procedure_presentation, assign_to: assign_to) } @@ -124,8 +140,8 @@ describe ProcedurePresentation do let(:procedure) { create(:procedure, :for_individual, :sva) } let(:procedure_presentation) { create(:procedure_presentation, assign_to: assign_to) } - let(:decision_on) { { "label" => "Date décision SVA", "table" => "self", "column" => "sva_svr_decision_on", 'classname' => '', 'virtual' => false, "type" => :date, "scope" => '', "value_column" => :value, 'filterable' => true } } - let(:decision_before_field) { { "label" => "Date décision SVA avant", "table" => "self", "column" => "sva_svr_decision_before", 'classname' => '', 'virtual' => true, "type" => :date, "scope" => '', "value_column" => :value, 'filterable' => true } } + let(:decision_on) { Facet.new(label: "Date décision SVA", table: "self", column: "sva_svr_decision_on", classname: '', virtual: false, type: :date, scope: '', value_column: :value, filterable: true) } + let(:decision_before_field) { Facet.new(label: "Date décision SVA avant", table: "self", column: "sva_svr_decision_before", classname: '', virtual: true, type: :date, scope: '', value_column: :value, filterable: true) } subject { procedure_presentation.fields } @@ -136,8 +152,8 @@ describe ProcedurePresentation do let(:procedure) { create(:procedure, :for_individual, :svr) } let(:procedure_presentation) { create(:procedure_presentation, assign_to: assign_to) } - let(:decision_on) { { "label" => "Date décision SVR", "table" => "self", "column" => "sva_svr_decision_on", 'classname' => '', 'virtual' => false, "type" => :date, "scope" => '', "value_column" => :value, 'filterable' => true } } - let(:decision_before_field) { { "label" => "Date décision SVR avant", "table" => "self", "column" => "sva_svr_decision_before", 'classname' => '', 'virtual' => true, "type" => :date, "scope" => '', "value_column" => :value, 'filterable' => true } } + let(:decision_on) { Facet.new(label: "Date décision SVR", table: "self", column: "sva_svr_decision_on", classname: '', virtual: false, type: :date, scope: '', value_column: :value, filterable: true) } + let(:decision_before_field) { Facet.new(label: "Date décision SVR avant", table: "self", column: "sva_svr_decision_before", classname: '', virtual: true, type: :date, scope: '', value_column: :value, filterable: true) } subject { procedure_presentation.fields } @@ -147,8 +163,8 @@ describe ProcedurePresentation do describe "#displayable_fields_for_select" do subject { create(:procedure_presentation, assign_to: assign_to) } - let(:excluded_displayable_field) { { "label" => "depose_since", "table" => "self", "column" => "depose_since", 'virtual' => true } } - let(:included_displayable_field) { { "label" => "label1", "table" => "table1", "column" => "column1", 'virtual' => false } } + let(:excluded_displayable_field) { Facet.new(label: "depose_since", table: "self", column: "depose_since", virtual: true) } + let(:included_displayable_field) { Facet.new(label: "label1", table: "table1", column: "column1", virtual: false) } before do allow(subject).to receive(:fields).and_return([ @@ -161,15 +177,25 @@ describe ProcedurePresentation do end describe "#filterable_fields_options" do subject { create(:procedure_presentation, assign_to: assign_to) } - let(:included_displayable_field) do - [ - { "label" => "label1", "table" => "table1", "column" => "column1", 'virtual' => false }, - { "label" => "depose_since", "table" => "self", "column" => "depose_since", 'virtual' => true } - ] - end - before do - allow(subject).to receive(:fields).and_return(included_displayable_field) + context 'filders' do + let(:included_displayable_field) do + [ + Facet.new(label: "label1", table: "table1", column: "column1", virtual: false), + Facet.new(label: "depose_since", table: "self", column: "depose_since", virtual: true) + ] + end + + before do + allow(subject).to receive(:fields).and_return(included_displayable_field) + end + + it { expect(subject.filterable_fields_options).to eq([["label1", "table1/column1"], ["depose_since", "self/depose_since"]]) } + end + context 'with rna' do + let(:procedure) { create(:procedure, :published, types_de_champ_public: [{ type: :rna, libelle: 'rna', stable_id: 1 }]) } + it { expect(subject.filterable_fields_options.map { _1[0] }).to include('rna – commune') } + it { expect(subject.filterable_fields_options.map { _1[1] }).to include('type_de_champ/1->data.commune') } end it { expect(subject.filterable_fields_options).to eq([["label1", "table1/column1"], ["depose_since", "self/depose_since"]]) } @@ -859,7 +885,7 @@ describe ProcedurePresentation do end describe "#human_value_for_filter" do - let(:filters) { { "suivis" => [{ "label" => "label1", "table" => "type_de_champ", "column" => first_type_de_champ_id, "value" => "true" }] } } + let(:filters) { { "suivis" => [{ label: "label1", table: "type_de_champ", column: first_type_de_champ_id, "value" => "true" }] } } subject { procedure_presentation.human_value_for_filter(procedure_presentation.filters["suivis"].first) } @@ -878,7 +904,7 @@ describe ProcedurePresentation do end context 'when filter is state' do - let(:filters) { { "suivis" => [{ "table" => "self", "column" => "state", "value" => "en_construction" }] } } + let(:filters) { { "suivis" => [{ table: "self", column: "state", "value" => "en_construction" }] } } it 'should get i18n value' do expect(subject).to eq("En construction") @@ -886,7 +912,7 @@ describe ProcedurePresentation do end context 'when filter is a date' do - let(:filters) { { "suivis" => [{ "table" => "self", "column" => "en_instruction_at", "value" => "15/06/2023" }] } } + let(:filters) { { "suivis" => [{ table: "self", column: "en_instruction_at", "value" => "15/06/2023" }] } } it 'should get formatted value' do expect(subject).to eq("15/06/2023")