Revoking a device redirected away from the storage dashboard, which closed the details modal and reloaded the page. Refreshing the affected parts instead keeps the modal open and shows the change where it happened. - Extract the card and the modal's access list into their own components, so either can be re-rendered without touching the modal's open state, and share the group summaries between the components - Derive the app's DOM ids from its client_id (the grouping key) and the device row ids from the authorization, through one helper used by both the templates and the controller - Revoke one of several devices as a Turbo Stream: remove the row and refresh the card behind the modal and the access list - Revoke an app's last device with a redirect, so the dashboard re-renders itself and grouping, sorting and the empty state stay in one place - Fade the removed row out, deferring Turbo's own removal until the animation has ended Part of #254
40 lines
1.1 KiB
Ruby
40 lines
1.1 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
# Summaries of a group of authorizations for the same app, shared by the card,
|
|
# the details modal and the Turbo Stream responses that refresh them.
|
|
module RsAuthSummary
|
|
# The union of the group's scopes: an older token may grant more than the
|
|
# newest one.
|
|
def permissions
|
|
@authorizations.flat_map(&:permissions).uniq
|
|
end
|
|
|
|
def root_access?
|
|
(permissions & [":r", ":rw"]).any?
|
|
end
|
|
|
|
def category_summary
|
|
return "All categories and files" if root_access?
|
|
|
|
count = permissions.size
|
|
"#{count} #{'category'.pluralize(count)}"
|
|
end
|
|
|
|
def known_device_count
|
|
@authorizations.map(&:device_name).compact.uniq.size
|
|
end
|
|
|
|
def unrecorded_device?
|
|
@authorizations.any? { |auth| auth.device_name.blank? }
|
|
end
|
|
|
|
def device_summary
|
|
count = known_device_count
|
|
return "#{count} #{'device'.pluralize(count)}" unless unrecorded_device?
|
|
|
|
# An authorization without a recorded user agent may cover several devices,
|
|
# so only a lower bound can be given.
|
|
lower_bound = count + 1
|
|
"#{lower_bound}+ #{'device'.pluralize(lower_bound)}"
|
|
end
|
|
end |