refactor(Facet): extract Facet from ProcedurePresentation
Co-Authored-By: LeSim <mail@simon.lehericey.net>
clean(code): no comment 🎶
This commit is contained in:
parent
385277d5a0
commit
b3cb3e974e
5 changed files with 155 additions and 102 deletions
25
app/models/facet.rb
Normal file
25
app/models/facet.rb
Normal file
|
@ -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
|
|
@ -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
|
||||
|
|
|
@ -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}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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")
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue