Skip to content

Commit 765a34c

Browse files
authored
Merge pull request #12899 from demarche-numerique/admin-can-personnalize-dossiers-table-migration-ldu
[PART:1] ETQ administrateur, je peux personnaliser le tableau de suivi des dossiers et l’appliquer en vue par défaut pour tous les instructeurs
2 parents 9984562 + 3491c44 commit 765a34c

6 files changed

Lines changed: 81 additions & 2 deletions

app/controllers/instructeurs/procedure_presentation_controller.rb

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -96,10 +96,14 @@ def procedure_presentation_params
9696
h[filter_name] = h.delete("filters") # move filters to the right key, ex: tous_filters
9797
end
9898

99-
# React ComboBox/MultiComboBox return [''] when no value is selected
100-
# We need to remove them
10199
if h[:displayed_columns].present?
100+
# React ComboBox/MultiComboBox return [''] when no value is selected
101+
# We need to remove them
102102
h[:displayed_columns] = h[:displayed_columns].reject(&:empty?)
103+
104+
# when instructeur update displayed_columns, `customized` becomes true
105+
# we consider he knows how to use the personnalization
106+
h[:customized] = true
103107
end
104108

105109
h
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
# frozen_string_literal: true
2+
3+
module Maintenance
4+
class T20260303BackfillCustomizedOnProcedurePresentationsTask < MaintenanceTasks::Task
5+
include RunnableOnDeployConcern
6+
7+
def collection
8+
ProcedurePresentation.includes(assign_to: :procedure)
9+
end
10+
11+
def process(presentation)
12+
procedure = presentation.assign_to.procedure
13+
14+
presentation.update_columns(
15+
customized: presentation.displayed_columns.map(&:h_id).sort != procedure.default_displayed_columns.map(&:h_id).sort
16+
)
17+
18+
# a column can be not found for various reasons (deleted tdc, changed type, etc)
19+
# in this case we just ignore the error and continue
20+
rescue ActiveRecord::RecordNotFound
21+
end
22+
end
23+
end
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
# frozen_string_literal: true
2+
3+
class AddCustomizedToProcedurePresentations < ActiveRecord::Migration[7.2]
4+
def change
5+
add_column :procedure_presentations, :customized, :boolean, default: false, null: false
6+
end
7+
end

db/schema.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1001,6 +1001,7 @@
10011001
t.jsonb "archives_filters", default: [], null: false, array: true
10021002
t.integer "assign_to_id"
10031003
t.datetime "created_at", precision: nil
1004+
t.boolean "customized", default: false, null: false
10041005
t.jsonb "displayed_columns", default: [], null: false, array: true
10051006
t.jsonb "displayed_fields", default: [{"label"=>"Demandeur", "table"=>"user", "column"=>"email"}], null: false
10061007
t.jsonb "expirant_filters", default: [], null: false, array: true

spec/controllers/instructeurs/procedure_presentation_controller_spec.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747

4848
filtered_column = FilteredColumn.new(column: state_column, filter: 'en_construction')
4949
expect(procedure_presentation.tous_filters).to eq([filtered_column])
50+
expect(procedure_presentation.customized).to eq(true)
5051
end
5152
end
5253

@@ -108,6 +109,7 @@
108109
expect(response.body).to include('<turbo-stream action="refresh">')
109110

110111
expect(procedure_presentation.reload.tous_filters).to eq([FilteredColumn.new(column:, filter: { operator: 'in', value: ['Marseille'] })])
112+
expect(procedure_presentation.reload.customized).to eq(false)
111113
end
112114
end
113115

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
# frozen_string_literal: true
2+
3+
module Maintenance
4+
RSpec.describe T20260303BackfillCustomizedOnProcedurePresentationsTask do
5+
describe "#process" do
6+
let(:procedure) { create(:procedure, :published) }
7+
let(:instructeur) { create(:instructeur) }
8+
9+
let!(:assign_to_default) { create(:assign_to, procedure: procedure, instructeur: instructeur) }
10+
11+
let!(:assign_to_custom) { create(:assign_to, procedure: procedure, instructeur: create(:instructeur)) }
12+
13+
let!(:presentation_default) do
14+
create(
15+
:procedure_presentation,
16+
assign_to: assign_to_default,
17+
displayed_columns: procedure.default_displayed_columns
18+
)
19+
end
20+
21+
let!(:custom_column) { procedure.find_column(label: "Date de dépôt") }
22+
23+
let!(:presentation_custom) do
24+
pres = create(:procedure_presentation, assign_to: assign_to_custom)
25+
pres.update!(displayed_columns: [custom_column])
26+
pres
27+
end
28+
29+
it "marks presentations with default columns as customized: false" do
30+
task = described_class.new
31+
task.collection.each { |p| task.process(p) }
32+
expect(presentation_default.reload.customized).to eq(false)
33+
end
34+
35+
it "marks presentations with custom columns as customized: true" do
36+
task = described_class.new
37+
task.collection.each { |p| task.process(p) }
38+
expect(presentation_custom.reload.customized).to eq(true)
39+
end
40+
end
41+
end
42+
end

0 commit comments

Comments
 (0)