mirror of
https://github.com/we-promise/sure.git
synced 2026-08-05 08:32:15 +00:00
* fix(ds): route remaining literal yellow warning surfaces onto --color-warning Completes the #2198 warning consolidation for view-level surfaces: - rules/index recent-runs status badges → DS::Pill (warning / success / error). - accounts/_account_sidebar_tabs missing-data notice: bg-yellow-tint-10 / text-yellow-600 → bg-warning/10 / text-warning. - import/confirms/_mappings unassigned-account notice → bg-warning/10 / border-warning/20 (also fixes a missing dark variant — it was light-yellow in dark mode). - simplefin/_replacement_prompt card → bg-warning/10 / border-warning/20, dropping the now-redundant theme-dark: companions (the token is theme-aware). rules' blue/purple execution-type badges and the red failed-row highlight are left as-is (not warning surfaces). Part of #2198. * fix(ds): neutral text in sidebar missing-data notice (match DS::Alert recipe) Warning surfaces follow the DS::Alert recipe — warning tint + warning-colored icon, but neutral body text (text-primary / text-secondary). The sidebar missing-data notice was the lone holdout still painting its text (and link) with text-warning. Switch to neutral text; keep the bg-warning/10 tint and the warning-colored triangle/chevron as the accent. More readable (color-on-tint text is low-contrast) and consistent with the DS::Alert migrations. * fix(ds): missing-data sidebar notice → static DS::Alert (drop disclosure) The notice was a raw collapsible <details> styled as a warning — a hybrid that hid its own primary action (the "Configure providers" link) and its explanation behind a chevron click. A warning's job is to surface a problem and its fix; a disclosure's job is to hide secondary detail. The two fought each other (triangle-alert "act on this" vs chevron "optional, expand"). Replace with a static DS::Alert(:warning): icon + title + body + the Configure link, always visible. Fixes the affordance, surfaces the action, canonicalizes the last warning-styled raw <details>, and matches the other DS::Alert notices. * fix(ds): grey body text in missing-data alert for title/body hierarchy DS::Alert renders its body in text-primary (same dark as the title). For this notice, drop the description to text-secondary so the title (primary, semibold) reads above the supporting body (grey) — clearer hierarchy. Still neutral (no colored text); the Configure link stays primary + underline so the action remains the prominent element. * fix(ds): bump account_sidebar_tabs cache version v1→v2 Flush stale <details>-markup fragments on deploy. The sidebar missing-data notice migrated from <details> to a static DS::Alert, but the fragment is cached with a 12h TTL — without a key change, old markup renders until expiry (and inconsistently across staggered multi-server cache warmups). Bumping the version string changes the cache-key namespace so every cached fragment is bypassed immediately.
49 lines
1.7 KiB
Ruby
49 lines
1.7 KiB
Ruby
module AccountsHelper
|
|
def summary_card(title:, &block)
|
|
content = capture(&block)
|
|
render "accounts/summary_card", title: title, content: content
|
|
end
|
|
|
|
def sync_path_for(account)
|
|
# Always use the account sync path, which handles syncing all providers
|
|
sync_account_path(account)
|
|
end
|
|
|
|
# Returns the account id segment from `/accounts/<id>(/...)?`, or nil.
|
|
# Used as a cache-key component so the sidebar's active-link styling is
|
|
# correct without busting the cache for every unrelated path change.
|
|
def sidebar_active_account_id
|
|
match = request.path.match(%r{\A/accounts/([\w-]+)})
|
|
match && match[1]
|
|
end
|
|
|
|
# Cache key for `accounts/_account_sidebar_tabs.html.erb`.
|
|
# Kept here (not in the ERB) so the partial stays render-only.
|
|
#
|
|
# `shares_version` includes both row count and `max(updated_at)` because
|
|
# deleting a non-most-recent share would not move `max(updated_at)` and
|
|
# could otherwise serve stale fragments to a user who lost access.
|
|
# Both are pulled in a single SQL round-trip via `pick`. Note: Rails
|
|
# returns the values as Strings for raw SQL fragments — that's fine
|
|
# since they only feed into a cache key (concat-stable, never coerced).
|
|
def account_sidebar_tabs_cache_key(family:, active_tab:, mobile:)
|
|
shares_version =
|
|
if Current.user
|
|
count, max_at = AccountShare
|
|
.where(user_id: Current.user.id)
|
|
.pick(Arel.sql("count(*)"), Arel.sql("max(updated_at)"))
|
|
"#{count}-#{max_at}"
|
|
end
|
|
|
|
[
|
|
family.build_cache_key("account_sidebar_tabs_v2", invalidate_on_data_updates: true),
|
|
Current.user&.id,
|
|
shares_version,
|
|
active_tab,
|
|
mobile,
|
|
I18n.locale,
|
|
sidebar_active_account_id
|
|
]
|
|
end
|
|
end
|