Commit Graph

258 Commits

Author SHA1 Message Date
Mike Dalessio cb61b36715 Allow boosts on cards (#2411)
* Add reactions association to Card model

Adds `has_many :reactions` to Card, matching the implementation in Comment.
This allows cards to be reacted to directly with emoji reactions.

The association:
- Orders reactions chronologically
- Uses polymorphic `:reactable` interface
- Deletes reactions when card is destroyed

Includes test coverage for the new association.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Add reactions UI to card detail view

- Create Cards::ReactionsController with turbo stream responses
- Add card reactions views (reactions list, new form, menu partial)
- Position reaction button flush-right when no reactions exist
- Show reactions on bottom-left when present, with button inline
- Handle narrow viewports by flowing button below meta section
- Add controller tests for card reactions

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Add boost count to card preview

Display reaction count alongside comment count on card tiles in board
columns. Introduces a .card__counts wrapper to group both counts with
proper positioning on all viewport sizes.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Consolidate reaction views for cards and comments

Extract shared views to app/views/reactions/ using polymorphic routing.
Both card and comment reactions now render the same partials, with a
helper to compute the correct path prefix for nested routes.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Fix emoji picker width in card reactions

Override .card .popup { inline-size: 260px } for the reaction popup
so the emoji grid displays without horizontal scrollbar.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Hide boost count where comment count is hidden

Add .card__boosts alongside .card__comments in:
- Tray view (display: none)
- Cards with background images (opacity toggle on hover)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Fix reactions button overlap with zoom button in card footer

When a card has a background image, the footer contains both a reactions
button and a zoom button. Previously they would overlap because the
reactions button was absolutely positioned to the bottom-right.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Tighten up previews

* Move card reactions from meta partial to container

Fixes two issues:

1. Reactions were duplicated each time a card was assigned because the
   turbo stream replaced the meta div with the full perma/meta partial,
   which included reactions outside the replaced element.

2. Draft cards incorrectly showed the boost button because the meta
   partial was shared between published and draft containers.

Moving reactions to _container.html.erb (published cards only) fixes
both issues and keeps the meta partial focused on meta content.

Fixes https://app.fizzy.do/5986089/cards/3837
Fixes https://app.fizzy.do/5986089/cards/3835

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* WIP adjust perma page

* Position and style the footer

* Render the stamp in the card body instead of the footer

* Fix undefined local variable in public cards view

Changed `card` to `@card` when rendering the stamp partial.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Preload card reactions to avoid N+1 queries

Include reactions and their reacters in the preloaded scope, matching
what we already do for comments.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Add model tests for card and comment reaction cleanup

Test that:
- Creating a card reaction touches the card's last_active_at
- Reactions are deleted when their parent comment is destroyed
- Reactions are deleted when their parent card is destroyed

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Minor improvements to reactions code

- Use size instead of count in boosts partial to avoid extra SQL query
  on already-loaded collection
- Add else clause to reaction_path_prefix_for to raise ArgumentError
  for unknown reactable types instead of silently returning nil

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Bump specificity of reaction popup in the card perma

---------

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
Co-authored-by: Andy Smith <andy@37signals.com>
2026-01-23 13:25:55 -05:00
Andy Smith 036768fede Create popup initial alignment classes 2026-01-16 14:30:47 -06:00
Andy Smith 6a7ca930cf Hide the board selector button if card is closed 2026-01-16 14:07:00 -06:00
Andy Smith 19ce79965b Align board and tag picker dialogs without using math 2026-01-16 14:00:04 -06:00
Mike Dalessio 2527f07365 Fix "M" hotkey using stale user from fragment cache
Add a SelfAssignmentsController to resolve the current user at request
time, avoiding the use of an incorrect user id baked into a cached URL.

ref: #2211 originally added the "M" hotkey
ref: https://app.fizzy.do/5986089/cards/3722
2026-01-16 13:41:33 -05:00
Jason Zimdars 3a43e5e6c5 Don't render this at all in the preview template
Avoids situations where the hotkey could be triggered on the board view
2025-12-22 16:42:42 -06:00
Jason Zimdars 6e90a6dbfb Add hotkeys for triaging cards in columns
Hover to select items
2025-12-19 14:33:47 -06:00
Jason Zimdars 478fc26337 Only apply when Current.user is set so that broadcasts don't fail 2025-12-18 20:45:11 -06:00
Jason Zimdars fa2b2fb194 Hotkey m to toggle assignment to self 2025-12-18 16:47:36 -06:00
Jason Zimdars a56f200e1f Show comments on preview cards 2025-12-18 10:29:36 -06:00
Mike Dalessio e9cb2956ee Lightbox uses Stimulus target callbacks instead of data-action
Remove data-action from the sanitizer allowlist to disallow injection
of potentially malicious Stimulus actions in user-provided
content. The lightbox controller now uses imageTarget callbacks to
handle clicks on image links.

Also add the file name as a caption in the light box, and fix the
caption color for dark mode visibility.
2025-12-13 17:06:03 -05:00
gijigae e03c002efd Fix Japanese IME input handling for tags and form fields
When typing in Japanese, the Enter key is used to confirm kanji conversion
during IME composition. Previously, pressing Enter would immediately save
the tag, which prevented users from completing the conversion.

Changes:
- Add isComposing check to navigable_list_controller.js Enter handler
- Add IME composition tracking to form_controller.js
- Add compositionstart/compositionend event handlers to tag, step, and
  reaction input fields
- Add preventComposingSubmit action to prevent form submission during
  composition

This fix supports all IME input methods (Japanese, Chinese, Korean, etc.)
using standard browser composition events.
2025-12-06 17:26:35 +09:00
Jorge Manrubia effb96537a Use buil-in support for :self in Stimulus
Thanks to @brunoprietog for advice https://github.com/basecamp/fizzy/pull/1927/files/9639e07ab88f628f5f37ad2aa9acee2b86d4fb1a#diff-24a46f2ca97f2964d4d8940123b7f76578694567df84256f576aa4bee221179e
2025-12-04 22:16:00 +01:00
Jorge Manrubia 9639e07ab8 Save a bunch of invocations on morph events from children elements 2025-12-04 21:27:22 +01:00
Jorge Manrubia a380492b32 Animate the column height with a stimulus controller so that it does not depend to the server to update when you D&D 2025-12-04 19:15:38 +01:00
Ross van Zyl 244d92d92a hide "add a step" input when card is closed 2025-12-02 22:22:24 -05:00
Marco Roth 2f88908cdf Address HTML markup issues reported by Herb 2025-12-02 17:23:51 +01:00
Jason Zimdars 0747eadb81 For some reason 1pw wants to fill this field, avoid overflow 2025-11-21 14:11:44 -06:00
Jorge Manrubia a4cc568a71 Merge branch 'main' into column-nav-keyboard
Resolved conflict in app/views/boards/show/_columns.html.erb by combining:
- hide-scrollbar class from main
- navigable-list controller from column-nav-keyboard

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-21 10:54:45 +01:00
Mike Dalessio 71f2ffbf59 Change "ADDED" to "DRAFTED" when rendering draft cards
ref: https://app.fizzy.do/5986089/cards/3062
2025-11-20 09:32:42 -05:00
Jorge Manrubia 95b2d6ffe6 Make cards activable via keyboard 2025-11-20 11:41:37 +01:00
Jorge Manrubia 0726da2708 Things more or less working 2025-11-20 11:29:09 +01:00
David Heinemeier Hansson 66d397fa80 Eager load lazy frames inside dialogs on hover 2025-11-19 08:28:18 +01:00
Mike Dalessio c2a5c81e21 Older cards do not have a postponed_by user 2025-11-18 15:46:29 -05:00
Andy Smith 7c8ebd1f02 Make sure assign button isn't tabbable when previewing 2025-11-18 11:29:31 +00:00
Kevin McConnell a764a08863 Use card number as ID when dragging
Because the endpoints are `CardScoped` by number, we should also use the
number here for consistency.
2025-11-17 09:12:41 -05:00
Stanko K.R. 32d96db7d9 Replace card id with card number 2025-11-17 09:12:15 -05:00
Jason Zimdars 7650bf9c33 Display stamp in cards view when it's auto-postponed by the system 2025-11-13 18:12:24 -06:00
Jason Zimdars 44edaed18a Hotkey for opening assignees picker 2025-11-10 18:11:36 -06:00
Jason Zimdars 3114ec7a82 Hotkey to open tags, focus field, move add to bottom 2025-11-10 18:07:32 -06:00
Andy Smith 8cc4f2ee8e Clicking assignee opens popup 2025-11-10 11:36:31 -06:00
David Heinemeier Hansson 07ec3f49fd Save three requests per card view
Trade off is potentially a tiny delay on opening when reassigning, but
that seems worth it.
2025-11-07 17:40:20 +01:00
Jorge Manrubia 39ec6cf062 Replace collection with board in the code, tests green 2025-11-05 13:41:12 +01:00
Jorge Manrubia 03a345609e Baseline replacing collection with board across code 2025-11-05 13:31:54 +01:00
Jason Zimdars 81ec0154ea Don't indicate drafts in preview cards 2025-11-04 21:55:36 -06:00
Jorge Manrubia 65c98a5d65 This is not cache-friendly
https://chat.37signals.com/rooms/440/@45201
2025-11-03 17:06:59 +01:00
Jorge Manrubia 37ce2c98d1 Refresh the cards perma dynamically with page refreshes 2025-11-03 13:04:21 +01:00
Jorge Manrubia 5f7feed6c4 Refresh activity-related bits in the card perma dynamically:
- Remove entropy bubble
- Refresh the auto close notice https://app.box-car.com/5986089/cards/2683
2025-11-03 12:48:57 +01:00
Jorge Manrubia da6d1011fd Replace card replacement with stream actions to prevent flickering when managing steps 2025-11-03 10:59:24 +01:00
Jorge Manrubia 9d4dd3b00e Remove "save as draft"
Removes the creating status completely as well as the abandoned cards system. It will
always resume drafts if they exist, for a given collection and user.

https://app.box-car.com/5986089/cards/2489
2025-11-03 09:32:29 +01:00
Jorge Manrubia 11e872eb69 Format 2025-10-31 14:57:28 +01:00
Jorge Manrubia 272388918b No need for this helper anymore 2025-10-31 10:41:22 +01:00
Jorge Manrubia 108d7b2835 Rename collection to cards since this is a regular partial now 2025-10-31 10:39:53 +01:00
Jorge Manrubia 12545dac80 Extract common partials 2025-10-31 10:39:53 +01:00
Jorge Manrubia 176b8ad3b5 Move caching to collection rendering 2025-10-31 10:39:51 +01:00
Jorge Manrubia 2a79cb413e Remove cacheable concern, inline cache helper 2025-10-31 10:38:52 +01:00
Jorge Manrubia bcac3fad10 Move perma collection picker to turbo frame 2025-10-31 10:37:36 +01:00
David Heinemeier Hansson 1baf554864 Spacing 2025-10-30 16:59:21 +01:00
David Heinemeier Hansson d3028262af Spacing 2025-10-30 16:47:17 +01:00
Andy Smith b21be8fc0b Fix remaining popup check icons 2025-10-28 16:10:59 -05:00