Skip to content

Commit 2ba2deb

Browse files
authored
Merge pull request #22393 from opf/feature/73109-sorting-and-uniqueness-constraint-in-inbox-and-sprints
Feature/73109 sorting and uniqueness constraint in inbox and sprints
2 parents 5bc53a6 + 0459379 commit 2ba2deb

26 files changed

+1268
-109
lines changed

modules/backlogs/app/components/backlogs/backlog_component.html.erb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ See COPYRIGHT and LICENSE files for more details.
5656
),
5757
tabindex: 0
5858
) do %>
59-
<%= render(Backlogs::StoryComponent.new(story:, sprint:, max_position:)) %>
59+
<%= render(Backlogs::StoryComponent.new(story:, project:, sprint:, max_position:)) %>
6060
<% end %>
6161
<% end %>
6262
<% end %>

modules/backlogs/app/components/backlogs/sprint_component.html.erb

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ See COPYRIGHT and LICENSE files for more details.
3030
<%= component_wrapper(tag: :section) do %>
3131
<%= render(Primer::Beta::BorderBox.new(**@system_arguments)) do |border_box| %>
3232
<% border_box.with_header(id: dom_target(sprint, :header)) do %>
33-
<%= render(Backlogs::SprintHeaderComponent.new(sprint:, folded: folded?)) %>
33+
<%= render(Backlogs::SprintHeaderComponent.new(sprint:, project:, folded: folded?)) %>
3434
<% end %>
3535
<% if stories.empty? %>
3636
<% border_box.with_row(data: { empty_list_item: true }) do %>
@@ -45,18 +45,11 @@ See COPYRIGHT and LICENSE files for more details.
4545
<% stories.each do |story| %>
4646
<% border_box.with_row(
4747
id: dom_id(story),
48-
classes: "Box-row--hover-blue Box-row--focus-gray Box-row--clickable Box-row--draggable",
49-
data: draggable_item_config(story).merge(
50-
story: true,
51-
controller: "backlogs--story",
52-
backlogs__story_id_value: story.id,
53-
backlogs__story_split_url_value: details_backlogs_project_backlogs_path(project, story),
54-
backlogs__story_full_url_value: work_package_path(story),
55-
backlogs__story_selected_class: "Box-row--blue"
56-
),
48+
classes: story_classes_attribute,
49+
data: story_data_attribute(story),
5750
tabindex: 0
5851
) do %>
59-
<%= render(Backlogs::StoryComponent.new(story:, sprint:, max_position:)) %>
52+
<%= render(Backlogs::StoryComponent.new(story:, sprint:, project:, max_position:)) %>
6053
<% end %>
6154
<% end %>
6255
<% end %>

modules/backlogs/app/components/backlogs/sprint_component.rb

Lines changed: 38 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -34,14 +34,13 @@ class SprintComponent < ApplicationComponent
3434
include OpTurbo::Streamable
3535
include RbCommonHelper
3636

37-
attr_reader :sprint, :current_user
37+
attr_reader :sprint, :current_user, :project
3838

39-
delegate :project, to: :sprint
40-
41-
def initialize(sprint:, current_user: User.current, **system_arguments)
39+
def initialize(sprint:, project:, current_user: User.current, **system_arguments)
4240
super()
4341

4442
@sprint = sprint
43+
@project = project
4544
@current_user = current_user
4645

4746
@system_arguments = system_arguments
@@ -50,12 +49,13 @@ def initialize(sprint:, current_user: User.current, **system_arguments)
5049
@system_arguments[:padding] = :condensed
5150
@system_arguments[:data] = merge_data(
5251
@system_arguments,
53-
{ data: drop_target_config }
52+
{ data: drop_target_config },
53+
{ data: { test_selector: "sprint-#{sprint.id}" } }
5454
)
5555
end
5656

5757
def stories
58-
sprint.work_packages
58+
sprint.work_packages.where(project:).order(:position)
5959
end
6060

6161
def wrapper_uniq_by
@@ -81,12 +81,44 @@ def drop_target_config
8181
}
8282
end
8383

84+
def story_classes_attribute
85+
classes = "Box-row--hover-blue Box-row--focus-gray Box-row--clickable"
86+
87+
if work_package_draggable?
88+
classes += " Box-row--draggable"
89+
end
90+
91+
classes
92+
end
93+
94+
def story_data_attribute(story)
95+
draggable_item_config(story).merge(
96+
story: true,
97+
controller: "backlogs--story",
98+
backlogs__story_id_value: story.id,
99+
backlogs__story_split_url_value: details_backlogs_project_backlogs_path(project, story),
100+
backlogs__story_full_url_value: work_package_path(story),
101+
backlogs__story_selected_class: "Box-row--blue",
102+
test_selector: card_test_selector(story)
103+
)
104+
end
105+
84106
def draggable_item_config(story)
107+
return {} unless work_package_draggable?
108+
85109
{
86110
draggable_id: story.id,
87111
draggable_type: "story",
88112
drop_url: move_project_sprint_story_path(project, sprint, story)
89113
}
90114
end
115+
116+
def card_test_selector(story)
117+
"work-package-#{story.id}"
118+
end
119+
120+
def work_package_draggable?
121+
current_user.allowed_in_project?(:manage_sprint_items, project)
122+
end
91123
end
92124
end

modules/backlogs/app/components/backlogs/sprint_header_component.rb

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,19 +36,20 @@ class SprintHeaderComponent < ApplicationComponent
3636
include Redmine::I18n
3737
include RbCommonHelper
3838

39-
attr_reader :sprint, :collapsed, :current_user
39+
attr_reader :sprint, :project, :collapsed, :current_user
4040

41-
delegate :project, to: :sprint
4241
delegate :name, to: :sprint, prefix: :sprint
4342

4443
def initialize(
4544
sprint:,
45+
project:,
4646
folded: false,
4747
current_user: User.current
4848
)
4949
super()
5050

5151
@sprint = sprint
52+
@project = project
5253
@collapsed = folded
5354
@current_user = current_user
5455
end

modules/backlogs/app/components/backlogs/story_component.html.erb

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -29,14 +29,14 @@ See COPYRIGHT and LICENSE files for more details.
2929

3030
<%= grid_layout("op-backlogs-story", tag: :article) do |grid| %>
3131
<% grid.with_area(:drag_handle, classes: "hide-when-print") do %>
32-
<%=
33-
render(
34-
Primer::OpenProject::DragHandle.new(
35-
classes: "op-backlogs-story--drag_handle_button",
36-
label: t(".label_drag_story", name: story.subject)
37-
)
38-
)
39-
%>
32+
<%= if draggable?
33+
render(
34+
Primer::OpenProject::DragHandle.new(
35+
classes: "op-backlogs-story--drag_handle_button",
36+
label: t(".label_drag_story", name: story.subject)
37+
)
38+
)
39+
end %>
4040
<% end %>
4141

4242
<% grid.with_area(:info_line) do %>
@@ -51,7 +51,7 @@ See COPYRIGHT and LICENSE files for more details.
5151
<% end %>
5252

5353
<% grid.with_area(:menu) do %>
54-
<%= render(Backlogs::StoryMenuComponent.new(story:, sprint:, max_position:)) %>
54+
<%= render(Backlogs::StoryMenuComponent.new(story:, sprint:, project:, max_position:)) %>
5555
<% end %>
5656

5757
<% grid.with_area(:subject) do %>

modules/backlogs/app/components/backlogs/story_component.rb

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,13 +32,14 @@ module Backlogs
3232
class StoryComponent < ApplicationComponent
3333
include OpPrimer::ComponentHelpers
3434

35-
attr_reader :story, :sprint, :max_position, :current_user
35+
attr_reader :story, :sprint, :project, :max_position, :current_user
3636

37-
def initialize(story:, sprint:, max_position:, current_user: User.current)
37+
def initialize(story:, sprint:, project:, max_position:, current_user: User.current)
3838
super()
3939

4040
@story = story
4141
@sprint = sprint
42+
@project = project
4243
@max_position = max_position
4344
@current_user = current_user
4445
end
@@ -48,5 +49,9 @@ def initialize(story:, sprint:, max_position:, current_user: User.current)
4849
def story_points
4950
story.story_points || 0
5051
end
52+
53+
def draggable?
54+
current_user.allowed_in_project?(:manage_sprint_items, project)
55+
end
5156
end
5257
end

modules/backlogs/app/components/backlogs/story_menu_component.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,12 +32,12 @@ module Backlogs
3232
class StoryMenuComponent < ApplicationComponent
3333
attr_reader :story, :sprint, :project, :max_position, :current_user
3434

35-
def initialize(story:, sprint:, max_position:, current_user: User.current, **system_arguments)
35+
def initialize(story:, sprint:, project:, max_position:, current_user: User.current, **system_arguments)
3636
super()
3737

3838
@story = story
3939
@sprint = sprint
40-
@project = sprint.project
40+
@project = project
4141
@max_position = max_position
4242
@current_user = current_user
4343

modules/backlogs/app/controllers/projects/settings/backlogs_controller.rb

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,11 @@ def update
4242
end
4343

4444
def rebuild_positions
45-
@project.rebuild_positions
45+
if OpenProject::FeatureDecisions.scrum_projects_active?
46+
WorkPackages::RebuildPositionsService.new(project: @project).call
47+
else
48+
@project.rebuild_positions
49+
end
4650
flash[:notice] = I18n.t("backlogs.positions_rebuilt_successfully")
4751

4852
redirect_to_backlogs_settings

modules/backlogs/app/controllers/rb_application_controller.rb

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -43,17 +43,24 @@ class RbApplicationController < ApplicationController
4343
def load_sprint_and_project
4444
load_project
4545

46-
# because of strong params, we want to pluck this variable out right now,
47-
# otherwise it causes issues where we are doing `attributes=`.
48-
if (@sprint_id = params.delete(:sprint_id))
49-
@sprint = Sprint.visible.apply_to(@project).find(@sprint_id)
50-
end
46+
load_sprint
5147
end
5248

5349
def load_project
5450
@project = Project.visible.find(params[:project_id])
5551
end
5652

53+
def load_sprint
54+
@sprint_id = params.delete(:sprint_id)
55+
return unless @sprint_id
56+
57+
@sprint = if OpenProject::FeatureDecisions.scrum_projects_active?
58+
Agile::Sprint.for_project(@project).visible.find(@sprint_id)
59+
else
60+
Sprint.visible.apply_to(@project).find(@sprint_id)
61+
end
62+
end
63+
5764
def check_if_plugin_is_configured
5865
return if OpenProject::FeatureDecisions.scrum_projects_active?
5966

modules/backlogs/app/controllers/rb_sprints_controller.rb

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,8 @@ def update_header_component_via_turbo_stream(state: :show)
155155

156156
def update_sprint_header_component_via_turbo_stream(sprint:)
157157
update_via_turbo_stream(
158-
component: Backlogs::SprintHeaderComponent.new(sprint:),
158+
component: Backlogs::SprintHeaderComponent.new(sprint:,
159+
project: @project),
159160
method: :morph
160161
)
161162
end

0 commit comments

Comments
 (0)