Commit Graph

53 Commits

Author SHA1 Message Date
Jeremy Daer 723c8180b4 Add JSON response format for full SDK/CLI coverage (#2675)
* Add JSON response format to void-response controller actions

Add respond_to blocks with JSON format to 14 controllers that
previously only rendered HTML or Turbo Stream responses. JSON
callers get head :no_content (or :created/:ok for push
subscriptions, distinguishing new vs existing).

Covers: board involvements, board/account entropies, column
reordering, card readings, card publishing, user roles, user
avatars, account settings, notification settings, join codes
(with 422 error branch), and push subscriptions.

* Add steps index endpoint with JSON view

Add index action to Cards::StepsController so SDK/CLI callers
can list all steps for a card. Reuses the existing _step.json
partial.

* Add JSON views for paginated card list endpoints

Add show.json.jbuilder for stream, not-now, and closed column
endpoints. No controller changes needed — set_page_and_extract_
portion_from and fresh_when already work format-agnostically.

* Add JSON search endpoint with distinct-card pagination

JSON search paginates distinct Card records (via the existing
Card.mentioning scope with .distinct) rather than Search::Record
objects. This ensures page boundaries, Link headers, and counts
reflect unique cards — no short pages from post-pagination dedup.

ID-match searches return a uniform single-element Card[] array
through the same pagination path.

* Add JSON views for settings and configuration endpoints

Add show.json.jbuilder for account settings (name), join codes
(code, usage_count, usage_limit, url, active), and notification
settings (bundle_email_frequency). Tests for show and update
were added in the void-response commit.

* Add JSON response format to data exports

Create returns 201 with export id, status, and created_at so
callers can poll. Show returns any-status exports for JSON (not
just completed) with a download_url when ready, or 404 for
missing/other-user exports.

* Extend access token JSON API

Add index.json and _access_token.json partial for listing tokens.
Add JSON format to destroy. Include id and created_at in the
create response alongside the existing token/description/permission
fields.

* Fix ambiguous precedence warning in export JSON view

* Assert X-Total-Count pagination header in streams JSON test

* Address review feedback

- Guard steps index against HTML requests (redirect to card)
- Normalize created_at to UTC in access token and export JSON
- Add deterministic ordering (.latest) to search JSON pagination

* Return 406 for HTML requests to steps index instead of redirect

* Add wrap_parameters for flat SDK JSON payload compatibility

Five controllers infer the wrong wrapper key from their class
name, so flat JSON bodies like {"role":"admin"} fail with 400.
Add explicit wrap_parameters declarations:

- Users::RolesController → :user
- Notifications::SettingsController → :user_settings
- Account::JoinCodesController → :account_join_code
- Account::SettingsController → :account
- Boards::EntropiesController → :board

Add integration tests that send flat (unwrapped) JSON payloads
for all seven param-bearing endpoints to prove SDK compatibility.

* Address PR review feedback

- Use 201 Created (not 204) for all create actions: publishes, readings,
  left/right positions, push subscriptions
- Simplify push subscription to always return :created (no 200/201 variance)
- Remove superfluous respond_to block from steps#index
- Merge exports#show into single respond_to block
- Move export download_url conditional out of inline args
- Ensure join code active is explicitly boolean
- Remove extra parens from search controller assignment
- Add blank lines between format blocks for readability

* Return JSON bodies on create actions

Create actions for boards, cards, columns, comments, and steps now
render the resource as JSON (via their show views) instead of returning
empty 201 responses with only a Location header. SDKs expect a JSON
body they can deserialize into the created resource.

* Return JSON bodies on reaction create actions

Card and comment reaction creates now render the reaction as JSON
instead of returning empty 201 responses, consistent with the other
resource-creating endpoints.

* Allow access tokens API without account scope

Access tokens are identity-level (not account-scoped), so the
controller needs to work with bearer token auth and no account slug
in the URL. Skip require_account so the bearer token auth path
can proceed.

Also fix involvement test to send params in JSON body (not query
string) to match real SDK usage.
2026-03-09 11:39:49 -07:00
Fernando Olivares 3c54cd84fc Add native push notification infrastructure
- Add action_push_native gem and SaaS configuration
- Add device registration API and UI
- Add User::Devices concern
- Add NotificationPusher::Native for push delivery
- Add tests and fixtures for native push
2026-02-25 19:31:13 +01:00
Andy Smith 17d869cf08 Cleanup unused classes 2026-02-20 11:09:15 -06:00
Andy Smith f835c211af Make generic scrollable list class for settings 2026-02-20 11:05:26 -06:00
Alexander Zaytsev 6f839c5b2f Remove periods after ellipses 2026-02-13 18:21:47 +01:00
Alexander Zaytsev da5e67a0a6 Use h3 instead of h2 2026-02-13 18:19:38 +01:00
Adrien Maston 2ab9dd8a30 Remove no-longer wanted margin
... after getting the newer stuff from main
2026-02-03 11:25:35 +01:00
Adrien Maston a6a20fa56e Merge branch 'main' into mobile/hide-sections-from-apps
* main: (65 commits)
  Fix crash due to missing ActiveStorage URL options
  Capture backtrace of nested errors
  Remove debug code
  Add more debug info
  Pass all service options
  Prevent duplicate files in user data export
  Write in binmode
  Replace custom IO object with a transport manager IO
  Explain imports & exports
  Add missing method to IO object
  Rename jobs
  Finishing touches
  Delete accounts for failed imports
  Check that associations don't exist
  Bust the cache after import
  Explicitly use the default storage service
  Fix ActiveStorage writing to disk
  Fix crash on successful import email
  Fix orphaned attachments when deleting the whole account
  Add size to remote io
  ...
2026-02-03 10:49:16 +01:00
Adrien Maston 270eacf43a Hide push notifications settings 2026-02-02 17:37:47 +01:00
Andy Smith 4f2cb01143 Polish up notification settings to match 2026-02-02 12:36:48 +01:00
Denis Švara 4f7cec3b71 Rename bride page controller to title controller and remove text size related code. 2026-01-13 09:36:24 +01:00
Denis Švara eae17b82b4 Merge branch 'main' into mobile/bridge-components
* main: (65 commits)
  Repair scope for card styles within the columns view
  Add missing list to cards page
  Account for simpler public views
  Fix public layout
  Pull board-tools outside of the list for mobile
  saas: move log_level setting into an environment variable
  Restore log level configurability in production environment
  Remove engagements
  Use notch class so Save button is positioned correctly
  Go back to board after clearing filters
  Revert "Use existing no_filtering_url to direct back to the board when clearing filters"
  Use existing no_filtering_url to direct back to the board when clearing filters
  Ensure filters sit on top of cards
  Fix public boards
  Fix card grid layout
  Fix Chinese/Japanese characters missing from printed PDFs on macOS
  Add SQLite FTS5 support for CJK search
  Add CJK (Chinese, Japanese, Korean) search support
  Fix scrolling on mobile
  Remember expanded state on navigation
  ...
2026-01-08 14:34:10 +01:00
Denis Švara ecf0921af9 Add bridge page targets. 2026-01-06 16:03:28 +01:00
Alexander Zaytsev 43d56b39ea Show full browser name for Chrome in instructions 2025-12-24 16:13:48 +01:00
Alexander Zaytsev 2d5e441bf5 Consistent spacing 2025-12-24 15:51:46 +01:00
Alexander Zaytsev 77279d470f Notifications settings -> Notification Settings 2025-12-23 22:53:16 +01:00
David Heinemeier Hansson fef9c2dab6 turbo_frame_tag has built-in dom_id expansion 2025-11-08 16:42:41 +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 7d154b682e Rename 'BOXCAR' to 'Fizzy'
Missed files
2025-11-03 16:30:44 -06:00
David Heinemeier Hansson 70a506c4a3 My menu is on every screen when the user is logged in 2025-10-30 16:28:51 +01:00
Jason Zimdars f5384baf63 Boxcar -> BOXCAR 2025-10-23 15:05:36 -07:00
Jason Zimdars 49e87310d7 Rename Fizzy, Boxcar 2025-10-22 13:42:41 -07:00
Jason Zimdars ea27e4e6bd Missed a few instances of "Collection" in the UI 2025-10-17 17:02:34 -05:00
Jorge Manrubia 4527dcbeda Remove unnecessary filtering code
After removing collections from the filtering menu, there was quite a good cleanup here pending
2025-10-03 10:56:34 +02:00
Andy Smith 2ecbe2cb7e Add option for icon-only involvement buttons 2025-09-19 16:19:37 -05:00
Jason Zimdars 34e5b14b58 Move the watchers list into the turbo frame
Passes around a param to opt-out of rendering the watchers on the
notification settings screen
2025-09-11 18:05:34 -05:00
Jorge Manrubia 6f2670d6dd Merge main into bundle-emails branch and resolve conflicts 2025-09-01 11:49:20 +02:00
Jason Zimdars 48802ab6cd Make collection list scrollable 2025-08-31 15:22:10 -05:00
Jason Zimdars af9f28d0bb Two panel design for notifications settings, design and copy for email block 2025-08-28 22:18:11 -05:00
Jorge Manrubia 243779dbcf Copy 2025-08-28 13:07:27 +02:00
Jorge Manrubia fb95c8aa92 Copy 2025-08-28 12:02:12 +02:00
Jorge Manrubia 53144a379c Add option to change the bundled email notification frequency 2025-08-28 11:56:40 +02:00
Andy Smith 27ac5b1fc1 Menu on notification settings page 2025-08-27 13:55:54 -05:00
Andy Smith bb04512b0c Consolidate header and nav layouts 2025-08-27 13:48:47 -05:00
Jason Zimdars c779224d67 Fix missing image assets 2025-08-14 12:11:29 -05:00
Jason Zimdars c3b946c961 Design flow for enabling push and the various status that go with it 2025-07-21 18:27:31 -05:00
Jason Zimdars 04df81bc75 Move to settings screen 2025-07-17 17:49:07 -05:00
Andy Smith 8308151500 Use header component everywhere 2025-06-26 14:54:27 -05:00
Jason Zimdars 91cca616ba Fix broken spacing 2025-04-26 18:57:47 -05:00
Andy Smith ec7161bde5 Clean up abstractions 2025-04-17 15:42:17 -05:00
Jorge Manrubia 723e6d94f5 Rename bubbles => cards 2025-04-09 14:50:58 +02:00
Jorge Manrubia a7aae833d1 Extract helper with fallback for the "go to back" and use consistently 2025-04-07 11:28:03 +02:00
Kevin McConnell 0820badcc3 Add involvement types to accesses
This provides a way to set the level of involvement that a user has with
a collection, and from which we determine the level of notifications to
send. Users can be access-only, watching, or being notified about
everything.

If you're access-only, you won't get an notifications. If you're
watching, you'll only get notifications for the items you're watching
(which includes the items you've been assigned, have commented on, etc).
If you're set to everything you'll get notifications about all activity
in that collection.

This change replaces our previous concept of subscriptions. Where
previously you'd subscribe to a collection to get notifications in it,
now you'll simply set the notification level on your access.
2025-04-03 16:35:13 +01:00
David Heinemeier Hansson de6f782ca3 Extract icon_tag helper to reduce repetition 2025-03-29 17:22:51 +01:00
Jason Zimdars 28a569c49b Tickets 2025-03-17 21:24:08 -05:00
Jason Zimdars a87ffd6473 Avoid squishing the switch when the bucket name is very long 2025-03-03 08:55:49 -06:00
Kevin McConnell 8bd207096b Pass user in locals 2025-02-27 10:45:18 +00:00
Jason Zimdars 8ddf8d1ad3 Use local_assigns 2025-02-26 15:57:16 -06:00
Kevin McConnell fc1939d771 Avoid using Current in the partial 2025-02-26 10:53:03 +00:00