Merge pull request #7345 from tchak/refactor-dossier-champs
refactor(dossier): champs order by coordinate
This commit is contained in:
commit
79fd90da75
4 changed files with 70 additions and 43 deletions
|
@ -55,19 +55,14 @@ class Champ < ApplicationRecord
|
|||
scope :updated_since?, -> (date) { where('champs.updated_at > ?', date) }
|
||||
scope :public_only, -> { where(private: false) }
|
||||
scope :private_only, -> { where(private: true) }
|
||||
scope :ordered, -> { includes(:type_de_champ).order(:row, 'types_de_champ.order_place') }
|
||||
scope :public_ordered, -> { public_only.joins(dossier: { revision: :revision_types_de_champ_public }).where('procedure_revision_types_de_champ.type_de_champ_id = champs.type_de_champ_id').order(:position) }
|
||||
# we need to do private champs order as manual join to avoid conflicting join names
|
||||
scope :private_ordered, -> do
|
||||
private_only.joins('
|
||||
INNER JOIN dossiers dossiers_private on dossiers_private.id = champs.dossier_id
|
||||
INNER JOIN types_de_champ types_de_champ_private on types_de_champ_private.id = champs.type_de_champ_id
|
||||
INNER JOIN procedure_revision_types_de_champ procedure_revision_types_de_champ_private
|
||||
ON procedure_revision_types_de_champ_private.revision_id = dossiers_private.revision_id')
|
||||
.where('procedure_revision_types_de_champ_private.type_de_champ_id = champs.type_de_champ_id')
|
||||
.order(:position)
|
||||
scope :ordered, -> do
|
||||
includes(:type_de_champ)
|
||||
.joins(dossier: { revision: :revision_types_de_champ })
|
||||
.where('procedure_revision_types_de_champ.type_de_champ_id = champs.type_de_champ_id')
|
||||
.order(:row, :position)
|
||||
end
|
||||
|
||||
scope :public_ordered, -> { public_only.ordered }
|
||||
scope :private_ordered, -> { private_only.ordered }
|
||||
scope :root, -> { where(parent_id: nil) }
|
||||
|
||||
before_create :set_dossier_id, if: :needs_dossier_id?
|
||||
|
|
|
@ -215,24 +215,40 @@ FactoryBot.define do
|
|||
end
|
||||
|
||||
after(:build) do |champ_repetition, evaluator|
|
||||
types_de_champ = champ_repetition.type_de_champ.types_de_champ
|
||||
existing_type_de_champ_text = types_de_champ.find { |tdc| tdc.libelle == 'Nom' }
|
||||
type_de_champ_text = existing_type_de_champ_text || build(
|
||||
:type_de_champ_text,
|
||||
position: 0,
|
||||
parent: champ_repetition.type_de_champ,
|
||||
libelle: 'Nom'
|
||||
)
|
||||
revision = champ_repetition.type_de_champ.procedure&.active_revision || build(:procedure_revision)
|
||||
parent = revision.revision_types_de_champ.find { |rtdc| rtdc.type_de_champ == champ_repetition.type_de_champ }
|
||||
types_de_champ = revision.revision_types_de_champ.filter { |rtdc| rtdc.parent == parent }.map(&:type_de_champ)
|
||||
|
||||
existing_type_de_champ_number = types_de_champ.find { |tdc| tdc.libelle == 'Age' }
|
||||
type_de_champ_number = existing_type_de_champ_number || build(
|
||||
:type_de_champ_number,
|
||||
position: 1,
|
||||
parent: champ_repetition.type_de_champ,
|
||||
libelle: 'Age'
|
||||
)
|
||||
type_de_champ_text = types_de_champ.find { |tdc| tdc.libelle == 'Nom' }
|
||||
if !type_de_champ_text
|
||||
type_de_champ_text = build(:type_de_champ_text,
|
||||
position: 0,
|
||||
parent: champ_repetition.type_de_champ,
|
||||
libelle: 'Nom')
|
||||
revision.revision_types_de_champ << build(:procedure_revision_type_de_champ,
|
||||
revision: revision,
|
||||
type_de_champ: type_de_champ_text,
|
||||
parent: parent,
|
||||
position: 0)
|
||||
|
||||
champ_repetition.type_de_champ.types_de_champ << type_de_champ_text
|
||||
end
|
||||
|
||||
type_de_champ_number = types_de_champ.find { |tdc| tdc.libelle == 'Age' }
|
||||
if !type_de_champ_number
|
||||
type_de_champ_number = build(:type_de_champ_number,
|
||||
position: 1,
|
||||
parent: champ_repetition.type_de_champ,
|
||||
libelle: 'Age')
|
||||
revision.revision_types_de_champ << build(:procedure_revision_type_de_champ,
|
||||
revision: revision,
|
||||
type_de_champ: type_de_champ_number,
|
||||
parent: parent,
|
||||
position: 1)
|
||||
|
||||
champ_repetition.type_de_champ.types_de_champ << type_de_champ_number
|
||||
end
|
||||
|
||||
champ_repetition.type_de_champ.types_de_champ << [type_de_champ_text, type_de_champ_number]
|
||||
evaluator.rows.times do |row|
|
||||
champ_repetition.champs << [
|
||||
build(:champ_text, dossier: champ_repetition.dossier, row: row, type_de_champ: type_de_champ_text, parent: champ_repetition),
|
||||
|
|
|
@ -176,24 +176,37 @@ FactoryBot.define do
|
|||
end
|
||||
|
||||
after(:build) do |type_de_champ_repetition, evaluator|
|
||||
evaluator.procedure&.save!
|
||||
evaluator.types_de_champ.each do |type_de_champ|
|
||||
type_de_champ.order_place = type_de_champ_repetition.types_de_champ.size
|
||||
revision = evaluator.procedure&.active_revision || build(:procedure_revision)
|
||||
parent = revision.revision_types_de_champ.find { |rtdc| rtdc.type_de_champ == type_de_champ_repetition }
|
||||
types_de_champ = revision.revision_types_de_champ.filter { |rtdc| rtdc.parent == parent }
|
||||
position = types_de_champ.size
|
||||
|
||||
revision.revision_types_de_champ << build(:procedure_revision_type_de_champ,
|
||||
revision: revision,
|
||||
type_de_champ: type_de_champ,
|
||||
parent: parent,
|
||||
position: position)
|
||||
|
||||
# old system
|
||||
type_de_champ.order_place = position
|
||||
type_de_champ_repetition.types_de_champ << type_de_champ
|
||||
end
|
||||
end
|
||||
|
||||
trait :with_types_de_champ do
|
||||
after(:build) do |type_de_champ, evaluator|
|
||||
tdc = build(:type_de_champ, libelle: 'sub type de champ', parent: type_de_champ)
|
||||
after(:build) do |type_de_champ_repetition, evaluator|
|
||||
type_de_champ = build(:type_de_champ, libelle: 'sub type de champ', parent: type_de_champ_repetition)
|
||||
revision = evaluator.procedure.active_revision
|
||||
parent = revision.revision_types_de_champ.find { |rtdc| rtdc.type_de_champ == type_de_champ_repetition }
|
||||
|
||||
evaluator.procedure.save
|
||||
|
||||
ProcedureRevisionTypeDeChamp.create!(
|
||||
revision_id: evaluator.procedure.active_revision.id,
|
||||
type_de_champ_id: tdc.id,
|
||||
parent_id: tdc.parent.revision_type_de_champ.id,
|
||||
position: 0
|
||||
)
|
||||
evaluator.procedure.save!
|
||||
revision.revision_types_de_champ << build(:procedure_revision_type_de_champ,
|
||||
revision: revision,
|
||||
type_de_champ: type_de_champ,
|
||||
parent: parent,
|
||||
position: 0)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -509,6 +509,8 @@ describe Champ do
|
|||
|
||||
describe 'repetition' do
|
||||
let(:procedure) { create(:procedure, :published, :with_type_de_champ, :with_type_de_champ_private, types_de_champ: [build(:type_de_champ_repetition, types_de_champ: [tdc_text, tdc_integer])]) }
|
||||
let(:revision) { procedure.published_revision }
|
||||
let(:rtdc_repetition) { revision.revision_types_de_champ.find { |rtdc| rtdc.type_de_champ.repetition? } }
|
||||
let(:tdc_text) { build(:type_de_champ_text) }
|
||||
let(:tdc_integer) { build(:type_de_champ_integer_number) }
|
||||
|
||||
|
@ -518,6 +520,11 @@ describe Champ do
|
|||
let(:champ_integer) { champ.champs.find { |c| c.type_champ == 'integer_number' } }
|
||||
let(:champ_text_attrs) { attributes_for(:champ_text, type_de_champ: tdc_text, row: 1) }
|
||||
|
||||
before do
|
||||
create(:procedure_revision_type_de_champ, revision: revision, type_de_champ: tdc_text, parent: rtdc_repetition, position: 1)
|
||||
create(:procedure_revision_type_de_champ, revision: revision, type_de_champ: tdc_integer, parent: rtdc_repetition, position: 0)
|
||||
end
|
||||
|
||||
context 'when creating the model directly' do
|
||||
let(:champ_text_row_1) { create(:champ_text, type_de_champ: tdc_text, row: 2, parent: champ, dossier: nil) }
|
||||
|
||||
|
@ -547,10 +554,6 @@ describe Champ do
|
|||
expect(second_row.size).to eq(1)
|
||||
expect(second_row.first.dossier).to eq(dossier)
|
||||
|
||||
# Make champs ordered
|
||||
champ_integer.type_de_champ.update(order_place: 0)
|
||||
champ_text.type_de_champ.update(order_place: 1)
|
||||
|
||||
champ.champs << champ_integer
|
||||
first_row = champ.reload.rows.first
|
||||
expect(first_row.size).to eq(2)
|
||||
|
|
Loading…
Add table
Reference in a new issue