Stanko K.R.
f64a49dcc0
Determine staff members based on flag
...
This replaces the old system based on email addresses, the aim is to make it more generic and thus appropriate for OSS/self-hosting
See: https://3.basecamp.com/2914079/buckets/37331921/todos/9302705265#__recording_9320051455
2025-11-25 14:09:31 +01:00
Mike Dalessio
e0aa1d257e
Drop User.system and replace with Account#system_user
2025-11-24 13:23:57 -05:00
Stanko K.R.
e85c5736c9
Render system user avatars using redirects
2025-11-24 12:05:32 +01:00
Jason Zimdars
433a19e103
Add an avatar for the System user
2025-11-24 12:04:33 +01:00
Jason Zimdars
0c49d3c2a6
Use "Done" for consistency
...
Closed is domain language
2025-11-24 12:04:33 +01:00
Jason Zimdars
86932803e4
Clarify not now move actions copy
2025-11-24 12:03:34 +01:00
Jason Zimdars
5fac18d01f
Restore auto-postponed events to the timeline
2025-11-24 12:03:34 +01:00
Mike Dalessio
09e6a15c6e
Merge pull request #1696 from basecamp/flavorjones/avoid-overlapping-bundles
...
Prevent overlapping bundles from being created
2025-11-23 10:20:17 -05:00
Jorge Manrubia
f0851988a2
Revert tentatively
...
Kevin got a bunch of dups, need to look into this more calmly https://3.basecamp.com/2914079/buckets/37331921/chats/9301300227
2025-11-23 10:18:39 +01:00
Mike Dalessio
db51b616bb
Handle notifs created before the current bundle starts_at
2025-11-22 22:38:23 -05:00
Mike Dalessio
a29dd89683
Make sure Bundle#ends_at is set before validation
...
otherwise we risk creating overlapping bundles and not catching it.
2025-11-22 22:19:05 -05:00
Mike Dalessio
bcb43305b6
Improve avatar image handling
...
- redirect avatar image requests to the rails_blob_url, instead of
streaming them through the web app
- use a thumbnail variant for avatar images
- only put avatar initials behind the stale? check (not the image
redirect, which would result in browsers rendering broken images when
an avatar is changed, until max-age expires)
2025-11-21 15:16:46 -05:00
Jason Zimdars
2382326a13
Merge pull request #1638 from basecamp/expand-activity-columns
...
Expand activity columns
2025-11-21 09:11:22 -06:00
Jorge Manrubia
41905068c0
Bundle after notification is committed to mitigate reading stale data when bundling
...
Attempt to deal with overlapping bundles being created by notifications created immediately
one after the other.
2025-11-21 14:34:05 +01:00
Donal McBreen
adff4591fe
Search with the tenant key
...
The key has been added and populated so use it for searching.
2025-11-21 11:09:06 +00:00
Donal McBreen
74d1cf735b
Only add and fill account_key
2025-11-21 10:20:27 +00:00
Donal McBreen
70dd754cf7
Account key for search records
...
Add an account key field to improve search performance. This field
allows us to filter the records by account directly in the fulltext
index, so we only need to examine rows belonging to the relevant account.
2025-11-21 09:38:35 +00:00
Jorge Manrubia
e4558f00ab
Merge branch 'main' into expand-activity-columns
2025-11-21 10:25:39 +01:00
Mike Dalessio
1bbb6d0c03
Fix race condition in Card::ActivitySpike::DetectionJob
...
The check-then-act pattern in `register_activity_spike` has been
replaced with `find_or_create_by!` to eliminate the race condition
that could lead to creating multiple activity spikes for a card. To
support this change, the `card_id` index on `cards_activity_spikes`
has been made unique.
ref: https://app.fizzy.do/5986089/cards/3063
2025-11-20 15:40:42 -05:00
Mike Dalessio
88750a3498
Prefer Time.current to Time.now
2025-11-20 09:13:17 -05:00
Stanko Krtalić
f6cfb5fde4
Merge pull request #1648 from basecamp/fix-user-avatars-in-notification-bundles
...
Fix missing avatars in notification bundle emails
2025-11-20 11:19:13 +01:00
Stanko K.R.
cc41a42221
Fix missing avatars in notification bundle emails
2025-11-20 10:33:42 +01:00
Kevin McConnell
e37038c0a6
Merge pull request #1647 from basecamp/avoid-notification-deadlocks
...
Process notification recipients in consistent order
2025-11-20 09:27:57 +00:00
Kevin McConnell
bc73cf692d
Process notification recipients in consistent order
...
We've seen some cases of deadlock when processing notifications, because
locks are gathered on the users in different orders. Let's try sticking
to a consistent order instead, which should cause the jobs to serialize
rather than deadlock.
2025-11-20 09:20:48 +00:00
Mike Dalessio
378705a30d
Deduplicate filter results
...
when both a card and that card's comments match the search term, we
don't want to show it multiple times.
ref: https://app.fizzy.do/5986089/cards/3030
2025-11-19 17:51:38 -05:00
Jason Zimdars
eba749a193
Expand activity columns
2025-11-19 12:48:36 -06:00
Jorge Manrubia
63d08c5b13
Prevent creating overlapping records
...
https://3.basecamp.com/2914079/buckets/27/card_tables/cards/9275047474
2025-11-19 11:02:00 +01:00
Mike Dalessio
dbbee2c661
Stalled cards are unstalled by anything that touches updated_at
...
ref: https://app.fizzy.do/5986089/cards/2492
2025-11-18 17:46:56 -05:00
David Heinemeier Hansson
c606de7b41
Instead of trying to suppress from the wrong layer of the stick, just don't touch until published?
2025-11-18 15:35:40 +01:00
Jorge Manrubia
4a86e3a298
Don't show closed carsd when filtering by "added by"
...
You can still select the done filter if you want to.
https://app.fizzy.do/5986089/cards/2639
2025-11-18 11:40:01 +01:00
Jorge Manrubia
793aace69a
Remove implicit order when filtering by closed cards
...
We set the order in the dedicated column controllers and we don't want this in place when using composable filters.
Also, this raises an error with the MySQL move when combined with assignees. Because we inject a .distinct there,
that messes up with the query select, resulting in having to add a redundant select to the closed sorting scope, so that
the closure.created_at is not lost.
2025-11-18 11:36:47 +01:00
Jason Zimdars
385b70eea5
Should be "Done" when user-facing
2025-11-17 16:59:56 -06:00
Mike Dalessio
97a6916ae1
Update a card's created_at when it is published
...
ref: https://app.fizzy.do/5986089/cards/2854
2025-11-17 17:39:25 -05:00
Mike Dalessio
e3ce26c53d
rubocop: more style fixes
2025-11-17 14:54:42 -05:00
Stanko K.R.
0f7b1312eb
Fix tests broken by optimizations
2025-11-17 17:45:24 +01:00
Stanko K.R.
0b8c51c2e9
Preload cards for columns
2025-11-17 16:16:19 +01:00
Mike Dalessio
2cb050af33
Missed a few changes in a rebase somewhere
...
This changeset now matches plan-b commit 609a0041
2025-11-17 09:19:46 -05:00
Mike Dalessio
3b09a92193
rubocop: style fixes
2025-11-17 09:12:41 -05:00
Stanko K.R.
e539754e2c
Preload cards
2025-11-17 09:12:41 -05:00
Stanko K.R.
ee85c25672
Include association used to render events
2025-11-17 09:12:41 -05:00
Mike Dalessio
f5305b2fe6
Use Card number as the model param
...
instead of the UUID `id`
2025-11-17 09:12:41 -05:00
Mike Dalessio
3ed36004e4
Use script_name and url helpers
...
instead of string concatenation
2025-11-17 09:12:41 -05:00
Mike Dalessio
29aa0f7fea
Make sure notifications jobs don't need Current.account set
2025-11-17 09:12:41 -05:00
Mike Dalessio
4976e4a7bb
Update Card::Entropic so its scopes work cross-accounts
...
with an eye towards making the postpone_all_due recurring job work efficiently.
2025-11-17 09:12:41 -05:00
Mike Dalessio
e3d86bb21e
Clean up some spots where "current account" is ambiguous
...
Primarily this is in tests (which were caught by temporarily
introducing acts_as_tenant and enabling safety checks), but notably
action cable connections were not working properly, and that's now
fixed.
2025-11-17 09:12:41 -05:00
Mike Dalessio
2c765fa03f
rubocop: style fixes
2025-11-17 09:12:41 -05:00
Stanko K.R.
15eeba82f5
Scope model methods by account
2025-11-17 09:12:41 -05:00
Stanko K.R.
a0251255a7
Rename IdenityMailer to UserMailer
2025-11-17 09:12:41 -05:00
Stanko K.R.
e0693de7c3
Scope jobs and controllers by account
2025-11-17 09:12:41 -05:00
Donal McBreen
28efe28f24
Replace Search::Index with Search::Records
...
Lean on ActiveRecord models for searching and strip out the raw SQL.
Replaces the search_index_* tables with sharded search_records_* tables
as that allows us to use a Search::Record model name.
A Class is dynamically created for each record table shard so that we
and we can access it via the Search::Record.for_account(account_id)
method.
2025-11-17 09:12:40 -05:00