Skip to content
Open
Show file tree
Hide file tree
Changes from 90 commits
Commits
Show all changes
117 commits
Select commit Hold shift + click to select a range
956cdd9
Document Backlogs drag and drop language
myabc May 16, 2026
66bbb7e
Add Pragmatic Drag and Drop dependencies
myabc Apr 29, 2026
f18c69e
[AGILE-251] Port backlogs to Pragmatic DnD
myabc Jun 8, 2026
aa5262f
Switch to gray row hover color
myabc Jun 8, 2026
64cae4a
Strip include-fragment nodes from previews
myabc Jun 8, 2026
2a6f4c4
Extract Backlogs::MoveTarget value object
myabc Jun 8, 2026
38bb518
Use Backlogs move URL template for drag and drop
myabc Jun 9, 2026
eb09fc5
[AGILE-284] Reorder sortable lists optimistically
myabc Jun 9, 2026
ac738af
Split sortable list DOM helpers from DnD module
myabc Jun 9, 2026
1f5f8a0
Extract drop intent resolution from controller
myabc Jun 9, 2026
ac12abd
Preserve Pragmatic DnD morph markers
myabc Jun 9, 2026
98b60e9
Tighten sortable drop intent
myabc Jun 9, 2026
760dbf4
Avoid duplicate move failure toasts
myabc Jun 9, 2026
d4ddd2f
Keep Backlogs list refresh connected
myabc Jun 9, 2026
2fdc804
Normalize Backlogs card row padding
myabc Jun 9, 2026
22a47b4
Permit position moves in Backlogs
myabc Jun 9, 2026
6756858
Fix Backlogs DnD probe assertions
myabc Jun 10, 2026
4a3c463
Remove obsolete sortable refresh code
myabc Jun 10, 2026
11582a1
Stabilize sortable list request specs
myabc Jun 10, 2026
dab2a0d
Harden Backlogs DnD edge cases
myabc Jun 10, 2026
7055e4e
Stabilize 422 rollback spec
myabc Jun 10, 2026
42f050d
Handle Backlogs menu modal cleanup
myabc Jun 10, 2026
7c43cf3
Add url-template frontend dependency
myabc Jun 10, 2026
c63c266
Expand sortable move URLs via url-template
myabc Jun 10, 2026
7b9bcf3
Remove per-item move URL from sortable lists
myabc Jun 10, 2026
efd516f
Scope Pragmatic DnD morph guard to sortable roots
myabc Jun 10, 2026
171a8c5
Move Box list styles to BorderBoxListComponent
myabc Jun 10, 2026
30ebba4
Remove border from drag preview
myabc Jun 10, 2026
80bb755
Apply box-list-item state colors to card rows
myabc Jun 10, 2026
f5038ad
Show first-row state border in transparent lists
myabc Jun 10, 2026
5da17b8
[AGILE-272] Remove rounded corners on edge rows
myabc Jun 10, 2026
4ff6b3b
Merge branch 'dev' into implementation/74970-backlogs-pragmatic-dnd
myabc Jun 10, 2026
2aab2f7
Stop Backlogs story spec nav leak
myabc Jun 10, 2026
9b1486c
Add useServices mixin for Angular services
myabc Jun 10, 2026
dca73e2
Handle menu close race in Backlogs dismiss_menu
myabc Jun 10, 2026
899edbd
Factor list_id into Backlogs move target checks
myabc Jun 10, 2026
39955b7
Declare Backlogs controllers on the turbo frame
myabc Jun 10, 2026
56af6d6
Preserve grab offset on Backlogs drag preview
myabc Jun 10, 2026
d80e063
Use list target data for drops
myabc Jun 11, 2026
e8b14ee
Remove redundant type check on drop
myabc Jun 11, 2026
cda8028
Merge branch 'dev' into implementation/74970-backlogs-pragmatic-dnd
myabc Jun 13, 2026
d488ce1
Move edge-borders mixin to top of sass file
myabc Jun 13, 2026
69ad88f
Fix backlogs move-to-sprint spec
myabc Jun 13, 2026
7e3453b
Replace move spinner with progress bar
myabc Jun 13, 2026
d54f9e7
Merge branch 'dev' into implementation/74970-backlogs-pragmatic-dnd
myabc Jun 15, 2026
43918a9
Fix Firefox drag preview offset under pointer
myabc Jun 15, 2026
a5f3b48
Add Reorder and Move to Backlogs glossary
myabc Jun 15, 2026
7522e89
Merge branch 'dev' into implementation/74970-backlogs-pragmatic-dnd
myabc Jun 17, 2026
7e4c9cb
Merge branch 'dev' into implementation/74970-backlogs-pragmatic-dnd
myabc Jun 17, 2026
ab20102
UX/UI feedback round: Remove progress bar
myabc Jun 17, 2026
9d7d9b4
Bump @types/hotwired__turbo from 8.0.10 to 8.0.11 in /frontend
myabc Jun 18, 2026
36547ee
Merge branch 'dev' into implementation/74970-backlogs-pragmatic-dnd
myabc Jun 22, 2026
7139e84
Merge branch 'dev' into implementation/74970-backlogs-pragmatic-dnd
myabc Jun 22, 2026
950cd1e
Fix backlog DnD filter preservation
myabc Jun 23, 2026
ec8f076
Stabilize inbox show all URL expectation
myabc Jun 23, 2026
8331016
[AGILE-302] Do not carry the filter state in all the backlog urls
dombesz Jun 23, 2026
2d26a66
Fix specs
dombesz Jun 23, 2026
9936030
Use the backlogs story#openSplitPane action inside the work package m…
dombesz Jun 24, 2026
9d57bbe
Merge branch 'dev' into 74970-backlogs-pragmatic-dnd
myabc Jun 24, 2026
a942005
Update menu specs for openSplitPane action
myabc Jun 24, 2026
d333de0
Fix frontend typed-lint on sortable-lists specs
myabc Jun 24, 2026
ac0fdf3
Split sortable-lists DnD into outlet controllers
myabc Jun 17, 2026
b9582a2
Harden sortable-lists DnD and document contract
myabc Jun 17, 2026
bd0ef00
Refine sortable-lists DnD morph and guards
myabc Jun 17, 2026
ac4c433
Add configurable drop position for sortable lists
myabc Jun 24, 2026
86524cd
Add drop-zone outline for sortable list containers
myabc Jun 24, 2026
c28621c
Outline list only when no row is targeted
myabc Jun 24, 2026
1bf420a
Set user-select: none on cards
myabc Jun 24, 2026
e47d792
Merge branch 'dev' into implementation/74970-backlogs-pragmatic-dnd
myabc Jun 25, 2026
939dbdf
Merge branch 'dev' into implementation/74970-backlogs-pragmatic-dnd
myabc Jun 26, 2026
3479ec6
Bump Pragmatic Drag and Drop dependencies
myabc Jun 26, 2026
de811fa
Merge remote-tracking branch 'origin/dev' into implementation/74970-b…
myabc Jun 26, 2026
7ce4b9e
Run npm audit fix
myabc Jun 26, 2026
c3b9162
Wait for backlogs frame reload in DnD specs
myabc Jun 26, 2026
3d18ded
Merge branch 'dev' into implementation/74970-backlogs-pragmatic-dnd
myabc Jun 29, 2026
2057ea1
Delegate backlogs turbo wait to shared helpers
myabc Jun 27, 2026
6b5046b
Align backlogs turbo wait default with Capybara
myabc Jun 29, 2026
b4cf115
Merge branch 'dev' into implementation/74970-backlogs-pragmatic-dnd
myabc Jun 30, 2026
d17290e
Rename Backlogs story controller to work-package
myabc Jun 30, 2026
de3ac38
Merge branch 'dev' into implementation/74970-backlogs-pragmatic-dnd
myabc Jul 4, 2026
62e9627
Regenerate package-lock.json from dev
myabc Jul 4, 2026
aa9dfd2
Ignore blank position params in backlogs moves
myabc Jul 4, 2026
77e68f6
Preserve split view selection across Turbo morphs
myabc Jul 4, 2026
1cf8a01
Preserve drop indicator markers across morphs
myabc Jul 4, 2026
4eec777
Remove dead drag handle check in backlogs cards
myabc Jul 4, 2026
99cd753
Add drop zone overlay to empty backlogs lists
myabc Jul 5, 2026
25abcd9
Drop inert frame attributes from backlogs partial
myabc Jul 5, 2026
fb0fb84
Placate Yamllint: sort Backlog component keys
myabc Jul 5, 2026
f61a453
Hide empty-state row once sibling rows exist
myabc Jul 5, 2026
1731e92
Consolidate border box list component styles
myabc Jul 5, 2026
29f095e
Merge branch 'dev' into implementation/74970-backlogs-pragmatic-dnd
myabc Jul 6, 2026
688a6b4
Suppress native drags on work-package card links
myabc Jul 6, 2026
980c9d4
Flag PDD-internal morph marker attribute
myabc Jul 6, 2026
4f073c2
Extract sortable-lists scrollable controller
myabc Jul 6, 2026
c2d3fa9
Use Backlogs target list types
myabc Jul 6, 2026
8fbd268
Hoist sortable list PDD mocks
myabc Jul 6, 2026
b9f317c
Scope backlogs drag styling to the border-box list
myabc Jul 6, 2026
e99c2a8
Guard optimistic rollback against detached DOM
myabc Jul 6, 2026
7f3e261
Clear drop indicator when a sortable item disconnects
myabc Jul 6, 2026
f1be723
Document the sortable-lists drop container
myabc Jul 6, 2026
bb7f5f4
Remove dead backlogs spec page helpers
myabc Jul 6, 2026
3777403
Tidy backlogs move controller conventions
myabc Jul 6, 2026
cbba52d
Wrap over-long backlogs lines
myabc Jul 6, 2026
4f00894
Refresh stale sortable-lists controller comments
myabc Jul 6, 2026
5b4ae95
Narrow resolveDropIntent with type guards
myabc Jul 6, 2026
2a617b6
Skip the source list as a list-level drop target
myabc Jul 6, 2026
850bb51
Extract the sortable-lists toaster event constant
myabc Jul 6, 2026
eff6cc4
Revert "Skip the source list as a list-level drop target"
myabc Jul 6, 2026
9007cc4
Colocate the sortable list busy state on the list
myabc Jul 6, 2026
1277399
Cap the backlogs DnD pickup retry via retry_block
myabc Jul 6, 2026
c330ed0
Extract the sortable item drag preview builder
myabc Jul 6, 2026
9d6117a
Add, integrate stimulus-elements
myabc Jul 6, 2026
2824dac
Carry the rows container on the list payload
myabc Jul 6, 2026
6efcf64
Resolve sortable rows from the rows container
myabc Jul 6, 2026
862c81e
Document the structural rows vocabulary
myabc Jul 6, 2026
b58afc8
Flag the drag source row's residual li lookup
myabc Jul 7, 2026
30e72ac
Merge branch 'dev' into implementation/74970-backlogs-pragmatic-dnd
myabc Jul 7, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 14 additions & 3 deletions app/components/open_project/common/border_box_list_component.rb
Original file line number Diff line number Diff line change
Expand Up @@ -141,12 +141,23 @@ class BorderBoxListComponent < ApplicationComponent
# # @param title [String] empty-state title.
# # @param description [String, nil] optional supporting text.
# # @param icon [Symbol, nil] optional Primer icon.
# # @param drop_target_label [String, nil] when given, renders a
# # drop-zone overlay with this label. The overlay becomes visible
# # while a sortable item hovers the surrounding
# # `[data-drop-container]` list.
# # @param system_arguments [Hash] forwarded to `Primer::Beta::Blankslate`.
# # @return [ViewComponent::Slot]
# def with_empty_state(title:, description: nil, icon: nil, **system_arguments)
# def with_empty_state(title:, description: nil, icon: nil, drop_target_label: nil, **system_arguments)
# end
renders_one :empty_state, ->(title:, description: nil, icon: nil, **system_arguments) {
EmptyState.new(title:, description:, icon:, interactive: interactive?, **system_arguments)
renders_one :empty_state, ->(title:, description: nil, icon: nil, drop_target_label: nil, **system_arguments) {
EmptyState.new(
title:,
description:,
icon:,
interactive: interactive?,
drop_target_label:,
**system_arguments
)
}

# Optional footer row.
Expand Down
198 changes: 191 additions & 7 deletions app/components/open_project/common/border_box_list_component.sass
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,19 @@
// See COPYRIGHT and LICENSE files for more details.
//++

.op-border-box-list_transparent
> .Box-header
background-color: transparent
border-bottom: none
padding-bottom: var(--stack-padding-condensed)
// Edge borders for row states. The top edge is the row's own top border, the
// bottom edge is the following row's top border; the last row draws its own
// bottom border, overlapping the Box border like the upstream
// Box-body:last-of-type rule.
@mixin op-box-list-item-edge-borders($color)
border-top-color: $color

> ul > .Box-row:first-of-type
border-top: none
& + .Box-row
border-top-color: $color

&:last-child
margin-bottom: calc(var(--borderWidth-thin) * -1)
border-bottom: var(--borderWidth-thin) solid $color

.op-border-box-list
--op-border-box-list-header-row-gap: calc(var(--stack-gap-condensed) / 2)
Expand Down Expand Up @@ -47,12 +52,54 @@
.Box-title
font-size: var(--text-title-size-medium)

&_transparent
> .Box-header
background-color: transparent
border-bottom: none
padding-bottom: var(--stack-padding-condensed)

// A transparent (not absent) border keeps the first row's height stable
// when a state recolors it. These recolors repeat the state rules from
// further down because this selector outweighs them.
> ul > .Box-row:first-of-type
border-top-color: transparent

&:has(> .Box-card[data-selected])
border-top-color: var(--box-list-item-selected-border-color)

&:has(> .Box-card[aria-current="true"])
border-top-color: var(--box-list-item-pressed-border-color)

&.op-border-box-list_transparent
&.op-border-box-list_header-padding-default,
&.op-border-box-list_header-padding-spacious
> .Box-header
padding-bottom: var(--stack-padding-condensed)

// Upstream rounds the outer row corners for boxes whose rows form the box
// edge. With a header or footer between the row and the box edge, a row
// background (hover, focus, selected) would show rounded corners mid-box.
&:has(> .Box-header) > ul > .Box-row:first-of-type
border-top-left-radius: 0
border-top-right-radius: 0

&:has(> .Box-footer) > ul > .Box-row:last-of-type
border-bottom-left-radius: 0
border-bottom-right-radius: 0

// Container drop zone: the whole list outlines while a sortable item hovers
// it, signalling the item will land inside this list.
&[data-drop-container]
outline: var(--borderWidth-thick) solid var(--fgColor-accent)
outline-offset: calc(var(--borderWidth-thick) * -1)
border-radius: var(--borderRadius-medium)

// The empty-state row only makes sense while it is alone in the list. Hiding
// it as soon as a sibling row appears (e.g. dropped by drag and drop) avoids
// a flicker between the drop and the server render removing it.
> .Box-list > .Box-row[data-empty-list-item]:not(:only-child)
display: none

.op-border-box-list-header
display: grid
grid-template-columns: minmax(0, 1fr) minmax(5rem, max-content) auto
Expand Down Expand Up @@ -82,3 +129,140 @@

&--description
margin-top: var(--op-border-box-list-header-row-gap)

.Box-card--clickable
cursor: pointer

.Box-card--draggable
cursor: grab
user-select: none

&:active
cursor: grabbing

// Rows wrapping a card delegate their padding to the card and take their
// colors from the box-list-item state variables.
.Box-row:has(> .Box-card)
padding: 0
background-color: var(--box-list-item-bg-color)
border-top-color: var(--box-list-item-border-color)

&:hover
background-color: var(--box-list-item-bg-hover-color)

&:has(> .Box-card:focus-visible)
background-color: var(--bgColor-muted)

// Selected state: applied synchronously on activation by the backlogs--story
// controller (single selection), so the list reacts before the split screen
// has loaded.
.Box-row:has(> .Box-card[data-selected])
background-color: var(--box-list-item-selected-bg-color)
@include op-box-list-item-edge-borders(var(--box-list-item-selected-border-color))

&:hover,
&:has(> .Box-card:focus-visible)
background-color: var(--box-list-item-selected-bg-hover-color)

// Current state: the card is open in the split screen. aria-current is
// maintained by the backlogs--story controller once the URL reflects the
// details pane; the strong border wins over a simultaneous selected state.
.Box-row:has(> .Box-card[aria-current="true"])
@include op-box-list-item-edge-borders(var(--box-list-item-pressed-border-color))

.Box-row[data-dragging="source"]
opacity: 0.4
background-color: var(--bgColor-inset)
box-shadow: inset 0 0 0 var(--borderWidth-default) var(--borderColor-muted)

.Box-row[data-drop-position]
--op-backlogs-drop-gap-border-width: 2px
--op-backlogs-drop-gap-height: 8px

position: relative

&::before,
&::after
position: absolute
left: 0
right: 0
height: var(--op-backlogs-drop-gap-height)
background: linear-gradient(
to bottom,
var(--bgColor-accent-muted) 0,
var(--bgColor-accent-muted) calc(50% - var(--op-backlogs-drop-gap-border-width) / 2),
var(--fgColor-accent) calc(50% - var(--op-backlogs-drop-gap-border-width) / 2),
var(--fgColor-accent) calc(50% + var(--op-backlogs-drop-gap-border-width) / 2),
var(--bgColor-accent-muted) calc(50% + var(--op-backlogs-drop-gap-border-width) / 2),
var(--bgColor-accent-muted) 100%

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This seems overly complex for something that is only 8px high and partially overlapped by the drag element.. But I guess that was coming from the product team, right?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@HDinger this styling is something I/Claude came up with. @psatyal and I will revisit this over the coming days - although the current appearance shouldn't be a blocker either.

)
pointer-events: none
z-index: 1

&[data-drop-position="top"]::before
content: ''
top: calc(var(--op-backlogs-drop-gap-height) / -2)

&[data-drop-position="bottom"]::after
content: ''
bottom: calc(var(--op-backlogs-drop-gap-height) / -2)

// Empty-state wrapper. With a drop target label, an overlay covers the
// blankslate while a sortable item hovers the list, labelling it as a drop
// zone. Hidden via visibility so it is unreachable while inactive; the
// visibility delay keeps the overlay shown until the fade-out finishes.
.op-border-box-list-empty-state
position: relative

&--drop-overlay
position: absolute
// Bottom inset keeps the box's bottom border and rounding visible.
inset: 0 0 var(--base-size-4) 0
border: var(--borderWidth-thin) dashed var(--borderColor-default)
z-index: 1

display: flex
align-items: center
justify-content: center

background: var(--bgColor-default)
color: var(--fgColor-default)

opacity: 0
visibility: hidden
pointer-events: none

@media (prefers-reduced-motion: no-preference)
transition: opacity 0.1s ease-in-out, visibility 0s linear 0.1s

.op-border-box-list[data-drop-container] .op-border-box-list-empty-state--drop-overlay
opacity: 1
visibility: visible
pointer-events: auto

@media (prefers-reduced-motion: no-preference)
transition: opacity 0.1s ease-in-out, visibility 0s

// Reapplies the padding removed from the containing .Box-row, matching the
// .Box-row padding of each Box density variant upstream.
.Box-card
padding: var(--stack-padding-normal)

&[data-preview]
background-color: var(--bgColor-default)
border-radius: var(--borderRadius-medium)
box-shadow: var(--shadow-floating-medium)
opacity: 1

// Firefox folds a card's box-shadow ink overflow into the native drag-image
// snapshot, shifting the snapshot origin off the border box so the grab
// offset no longer lines up under the pointer. Drop the lift shadow on
// Firefox only; other browsers snapshot the border box and are unaffected.
.-browser-firefox &
box-shadow: none

.Box--condensed .Box-card
padding: var(--stack-padding-condensed) var(--stack-padding-normal)

.Box--spacious .Box-card
padding: var(--stack-padding-spacious)
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
<%# -- copyright
OpenProject is an open source project management software.
Copyright (C) the OpenProject GmbH

This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License version 3.

OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:
Copyright (C) 2006-2013 Jean-Philippe Lang
Copyright (C) 2010-2013 the ChiliProject Team

This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.

See COPYRIGHT and LICENSE files for more details.

++# %>

<%= render(Primer::Box.new(classes: "op-border-box-list-empty-state")) do %>
<%= render(blankslate) %>

<% if drop_target_label %>
<%# The overlay only duplicates the drop affordance for pointer
interactions, so it is hidden from assistive technology. %>
<%= render(Primer::Box.new(aria: { hidden: true }, classes: "op-border-box-list-empty-state--drop-overlay")) do %>
<%= render(Primer::Beta::Text.new(tag: :p, font_size: 4)) { drop_target_label } %>
<% end %>
<% end %>
<% end %>
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,8 @@
module OpenProject
module Common
class BorderBoxListComponent
# Empty-state content rendered as a Primer Blankslate.
# Empty-state content rendered as a Primer Blankslate, wrapped in an
# empty-state container that can host a drop-zone overlay.
#
# This component is part of {BorderBoxListComponent} and should not be
# used as a standalone component.
Expand All @@ -44,13 +45,24 @@ class EmptyState < ApplicationComponent
# @param icon [Symbol, nil] optional Primer icon.
# @param interactive [Boolean] whether empty-state updates should be
# announced politely to assistive technology.
# @param drop_target_label [String, nil] when given, renders a drop-zone
# overlay with this label. The overlay becomes visible while a
# sortable item hovers the surrounding `[data-drop-container]` list.
# @param system_arguments [Hash] forwarded to `Primer::Beta::Blankslate`.
def initialize(title:, description: nil, icon: nil, interactive: false, **system_arguments)
def initialize(
title:,
description: nil,
icon: nil,
interactive: false,
drop_target_label: nil,

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

not sure about the naming

**system_arguments
)
super()

@title = title
@description = description
@icon = icon
@drop_target_label = drop_target_label

@system_arguments = system_arguments
return unless interactive
Expand All @@ -62,13 +74,17 @@ def initialize(title:, description: nil, icon: nil, interactive: false, **system
)
end

def call
private

attr_reader :drop_target_label

def blankslate
blankslate = Primer::Beta::Blankslate.new(**@system_arguments)
blankslate.with_heading(tag: :h4).with_content(@title)
blankslate.with_description_content(@description) if @description
blankslate.with_visual_icon(icon: @icon) if @icon

render(blankslate)
blankslate
end
end
end
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -78,12 +78,7 @@ def initialize(
def row_args
row_arguments = @system_arguments.deep_dup
row_arguments[:id] ||= dom_id(work_package)
row_arguments[:tabindex] ||= 0
row_arguments[:test_selector] ||= "work-package-#{work_package.id}"
row_arguments[:classes] = class_names(
row_classes,
row_arguments[:classes]
)
row_arguments[:data] = merge_data(
{ data: row_data },
row_arguments
Expand All @@ -110,15 +105,14 @@ def card
#
# @return [ApplicationComponent]
def build_card
WorkPackageCardComponent.new(work_package:)
WorkPackageCardComponent.new(work_package:, classes: card_classes)
end

def row_classes
def card_classes
class_names(
"Box-row--hover-blue",
"Box-row--focus-gray",
"Box-row--clickable",
"Box-row--draggable" => draggable?
"Box-card",
"Box-card--clickable",

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

for follow up: implement a clickable? option

"Box-card--draggable" => draggable?
)
end

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,11 +27,7 @@ See COPYRIGHT and LICENSE files for more details.

++# %>

<%= grid_layout(
"op-work-package-card",
tag: :article,
classes: layout_classes
) do |grid| %>
<%= grid_layout("op-work-package-card", **@system_arguments) do |grid| %>
<% if show_drag_handle %>
<% grid.with_area(:drag_handle, classes: "hide-when-print") do %>
<%= render(Primer::OpenProject::DragHandle.new) %>
Expand Down
Loading
Loading