diff --git a/app/assets/stylesheets/card-columns.css b/app/assets/stylesheets/card-columns.css index 648cd1df7..675f3fe13 100644 --- a/app/assets/stylesheets/card-columns.css +++ b/app/assets/stylesheets/card-columns.css @@ -400,6 +400,10 @@ box-shadow: none !important; color: color-mix(in srgb, var(--card-color) 70%, var(--color-canvas)); + .cards--considering & { + background-color: var(--card-bg-color) !important; + } + p { font-size: var(--text-small); overflow: hidden; diff --git a/app/assets/stylesheets/cards.css b/app/assets/stylesheets/cards.css index 4b0569b54..2591332d9 100644 --- a/app/assets/stylesheets/cards.css +++ b/app/assets/stylesheets/cards.css @@ -179,17 +179,20 @@ display: none; } - & ~ .btn { - --btn-background: var(--card-color); - --btn-color: var(--color-ink-inverted); - } - } - - .card-field__description { lexxy-toolbar { border-block-start: 1px solid var(--color-ink-light); margin-block-start: var(--block-space-half) !important; } + + & ~ .btn.btn--reversed { + --btn-background: var(--card-color); + --btn-color: var(--color-ink-inverted); + } + + & ~ .btn { + --btn-border-color: var(--card-color); + --btn-color: var(--card-color); + } } .card__stages { diff --git a/app/assets/stylesheets/panels.css b/app/assets/stylesheets/panels.css index 9b0345096..a82dc1665 100644 --- a/app/assets/stylesheets/panels.css +++ b/app/assets/stylesheets/panels.css @@ -6,12 +6,22 @@ color: var(--color-ink); inline-size: var(--panel-size, 60ch); max-inline-size: 100%; - padding: var(--panel-padding, calc(var(--block-space) * 2)); + padding: var(--panel-padding, var(--block-space)); + + @media (min-width: 640px) { + --panel-size: 100%; + + padding: var(--panel-padding, var(--block-space-double)); + } } .panel--centered { --panel-border-size: 0; - --panel-size: 42ch; + --panel-size: 100%; + + @media (min-width: 640px) { + --panel-size: 42ch; + } #main:has(&) { display: grid; diff --git a/app/assets/stylesheets/tooltips.css b/app/assets/stylesheets/tooltips.css index 20a02985b..419664fc6 100644 --- a/app/assets/stylesheets/tooltips.css +++ b/app/assets/stylesheets/tooltips.css @@ -1,5 +1,5 @@ @layer components { - [data-controller^="tooltip"] { + [data-controller~="tooltip"] { --tooltip-delay: 750ms; --tooltip-duration: 150ms; diff --git a/app/controllers/account/entropies_controller.rb b/app/controllers/account/entropies_controller.rb index f45f3ef5f..00d195584 100644 --- a/app/controllers/account/entropies_controller.rb +++ b/app/controllers/account/entropies_controller.rb @@ -1,4 +1,6 @@ class Account::EntropiesController < ApplicationController + before_action :ensure_admin + def update Account.sole.entropy.update!(entropy_params) redirect_to account_settings_path, notice: "Account updated" diff --git a/app/controllers/account/join_codes_controller.rb b/app/controllers/account/join_codes_controller.rb index 026c692f9..562ffaa0d 100644 --- a/app/controllers/account/join_codes_controller.rb +++ b/app/controllers/account/join_codes_controller.rb @@ -1,5 +1,6 @@ class Account::JoinCodesController < ApplicationController before_action :set_join_code + before_action :ensure_admin, only: %i[ update destroy ] def show end diff --git a/app/controllers/boards/entropies_controller.rb b/app/controllers/boards/entropies_controller.rb index 153dafe5f..e07272e9b 100644 --- a/app/controllers/boards/entropies_controller.rb +++ b/app/controllers/boards/entropies_controller.rb @@ -1,6 +1,8 @@ class Boards::EntropiesController < ApplicationController include BoardScoped + before_action :ensure_permission_to_admin_board + def update @board.entropy.update!(entropy_params) end diff --git a/app/controllers/boards/publications_controller.rb b/app/controllers/boards/publications_controller.rb index b7cda07ee..9435bd8bf 100644 --- a/app/controllers/boards/publications_controller.rb +++ b/app/controllers/boards/publications_controller.rb @@ -1,6 +1,8 @@ class Boards::PublicationsController < ApplicationController include BoardScoped + before_action :ensure_permission_to_admin_board + def create @board.publish end diff --git a/app/controllers/boards_controller.rb b/app/controllers/boards_controller.rb index 4bff8dde4..70383e139 100644 --- a/app/controllers/boards_controller.rb +++ b/app/controllers/boards_controller.rb @@ -2,7 +2,7 @@ class BoardsController < ApplicationController include FilterScoped before_action :set_board, except: %i[ new create ] - before_action :ensure_permission_to_change_accesses, only: %i[ update ] + before_action :ensure_permission_to_admin_board, only: %i[ update ] def show if @filter.used?(ignore_boards: true) @@ -48,20 +48,12 @@ class BoardsController < ApplicationController @board = Current.user.boards.find params[:id] end - def ensure_permission_to_change_accesses - if trying_to_change_accesses? && !Current.user.can_administer_board?(@board) + def ensure_permission_to_admin_board + unless Current.user.can_administer_board?(@board) head :forbidden end end - def trying_to_change_accesses? - all_access_changed? || grantees_changed? - end - - def all_access_changed? - params[:board]&.key?(:all_access) - end - def grantees_changed? params.key?(:user_ids) end diff --git a/app/controllers/cards/assignments_controller.rb b/app/controllers/cards/assignments_controller.rb index cac32efde..fdd2a86dc 100644 --- a/app/controllers/cards/assignments_controller.rb +++ b/app/controllers/cards/assignments_controller.rb @@ -3,7 +3,7 @@ class Cards::AssignmentsController < ApplicationController def new @users = @board.users.active.alphabetically - fresh_when @users + fresh_when etag: [ @users, @card.assignees ] end def create diff --git a/app/controllers/cards/taggings_controller.rb b/app/controllers/cards/taggings_controller.rb index 50f58e34b..23bac85e3 100644 --- a/app/controllers/cards/taggings_controller.rb +++ b/app/controllers/cards/taggings_controller.rb @@ -3,7 +3,7 @@ class Cards::TaggingsController < ApplicationController def new @tags = Tag.all.alphabetically - fresh_when @tags + fresh_when etag: [ @tags, @card.tags ] end def create diff --git a/app/controllers/concerns/board_scoped.rb b/app/controllers/concerns/board_scoped.rb index 2772c7d01..f4f3a3e2b 100644 --- a/app/controllers/concerns/board_scoped.rb +++ b/app/controllers/concerns/board_scoped.rb @@ -9,4 +9,10 @@ module BoardScoped def set_board @board = Current.user.boards.find(params[:board_id]) end + + def ensure_permission_to_admin_board + unless Current.user.can_administer_board?(@board) + head :forbidden + end + end end diff --git a/app/controllers/memberships/email_addresses_controller.rb b/app/controllers/memberships/email_addresses_controller.rb index c75783ac1..0870410a9 100644 --- a/app/controllers/memberships/email_addresses_controller.rb +++ b/app/controllers/memberships/email_addresses_controller.rb @@ -1,6 +1,8 @@ class Memberships::EmailAddressesController < ApplicationController require_untenanted_access + layout "public" + before_action :set_membership rate_limit to: 5, within: 1.hour, only: :create diff --git a/app/helpers/boards_helper.rb b/app/helpers/boards_helper.rb index 7c83c5799..3fde0d2ad 100644 --- a/app/helpers/boards_helper.rb +++ b/app/helpers/boards_helper.rb @@ -1,8 +1,8 @@ module BoardsHelper def link_back_to_board(board) link_to board, class: "btn borderless txt-medium", - data: { controller: "hotkey", action: "keydown.b@document->hotkey#click click->turbo-navigation#backIfSamePath" } do - tag.span ("←" + tag.strong(board.name, class: "overflow-ellipsis") + tag.kbd("b", class: "txt-x-small margin-inline-start hide-on-touch")).html_safe + data: { controller: "hotkey", action: "keydown.left@document->hotkey#click click->turbo-navigation#backIfSamePath" } do + tag.span(tag.strong("Back to #{board.name}", class: "overflow-ellipsis") + tag.kbd("←", class: "txt-x-small margin-inline-start hide-on-touch"), class: "flex align-center").html_safe end end diff --git a/app/helpers/clipboard_helper.rb b/app/helpers/clipboard_helper.rb index b079dc6a9..972856b15 100644 --- a/app/helpers/clipboard_helper.rb +++ b/app/helpers/clipboard_helper.rb @@ -1,7 +1,7 @@ module ClipboardHelper def button_to_copy_to_clipboard(url, &) tag.button class: "btn", data: { - controller: "copy-to-clipboard", action: "copy-to-clipboard#copy", + controller: "copy-to-clipboard tooltip", action: "copy-to-clipboard#copy", copy_to_clipboard_success_class: "btn--success", copy_to_clipboard_content_value: url }, & end diff --git a/app/models/user/role.rb b/app/models/user/role.rb index a327ffcf6..e12bf0191 100644 --- a/app/models/user/role.rb +++ b/app/models/user/role.rb @@ -18,7 +18,7 @@ module User::Role admin? || other == self end - def can_administer?(other = nil) + def can_administer?(other) admin? && other != self end diff --git a/app/views/account/join_codes/edit.html.erb b/app/views/account/join_codes/edit.html.erb index de53bf8c8..14958a44c 100644 --- a/app/views/account/join_codes/edit.html.erb +++ b/app/views/account/join_codes/edit.html.erb @@ -2,8 +2,11 @@ <% content_for :header do %>
Fizzy doesn’t let stale cards stick around forever. Cards automatically close as “Not Now” without activity for specific period of time. This is the default, global setting — you can override it on each board.
- <%= render "entropy/auto_close", model: account.entropy, url: account_entropy_path, disabled: !Current.user.can_administer? %> + <%= render "entropy/auto_close", model: account.entropy, url: account_entropy_path, disabled: !Current.user.admin? %>We just sent an email to <%= params[:email_address] %>
Hit the link in the email to confirm this is the email address you want to use with Fizzy going forward.
diff --git a/app/views/memberships/email_addresses/new.html.erb b/app/views/memberships/email_addresses/new.html.erb index e99596471..4b493d667 100644 --- a/app/views/memberships/email_addresses/new.html.erb +++ b/app/views/memberships/email_addresses/new.html.erb @@ -1,28 +1,30 @@ <% @page_title = "Change your email" %> <% content_for :header do %> -Enter your new email address, then hit the link to confirm it
-Enter your new email address, then hit the link to confirm it
+Then enter the verfifcation code included in the email below:
+Then enter the verification code included in the email below: