diff --git a/app/assets/images/collection-add.svg b/app/assets/images/board-add.svg similarity index 100% rename from app/assets/images/collection-add.svg rename to app/assets/images/board-add.svg diff --git a/app/assets/images/collection.svg b/app/assets/images/board.svg similarity index 100% rename from app/assets/images/collection.svg rename to app/assets/images/board.svg diff --git a/app/assets/stylesheets/bubble.css b/app/assets/stylesheets/bubble.css index 3eb595b65..33dd732c2 100644 --- a/app/assets/stylesheets/bubble.css +++ b/app/assets/stylesheets/bubble.css @@ -45,7 +45,7 @@ .bubble__number { display: grid; - font-size: clamp(10px, 50cqi, var(--bubble-number-max)); /* FF bug: https://app.fizzy.do/5986089/collections/2/cards/1373 */ + font-size: clamp(10px, 50cqi, var(--bubble-number-max)); /* FF bug: https://app.fizzy.do/5986089/boards/2/cards/1373 */ font-weight: 900; inset: 0; place-content: center; diff --git a/app/assets/stylesheets/card-columns.css b/app/assets/stylesheets/card-columns.css index eebbb74f9..a74e8e3f8 100644 --- a/app/assets/stylesheets/card-columns.css +++ b/app/assets/stylesheets/card-columns.css @@ -492,7 +492,7 @@ } } - .card__collection { + .card__board { background-color: transparent; color: var(--card-content-color); } @@ -519,10 +519,10 @@ } } - /* Collection tools + /* Board tools /* -------------------------------------------------------------------------- */ - .collection-tools.card { + .board-tools.card { --border-color: var(--color-selected-dark); --border-size: 1px; --card-padding-block: var(--block-space); @@ -560,7 +560,7 @@ } } - .collection-tools__watching { + .board-tools__watching { --btn-size: 32px; --gap: 0.5ch; @@ -572,7 +572,7 @@ position: relative; } - .collection-tools__watching-dialog { + .board-tools__watching-dialog { --panel-padding: 2ch; --panel-size: 100%; diff --git a/app/assets/stylesheets/card-perma.css b/app/assets/stylesheets/card-perma.css index d12e3eddc..0160fdaaf 100644 --- a/app/assets/stylesheets/card-perma.css +++ b/app/assets/stylesheets/card-perma.css @@ -85,7 +85,7 @@ } } - .collection-picker__button { + .board-picker__button { --btn-border-size: 0; font-size: 0.5em; diff --git a/app/assets/stylesheets/cards.css b/app/assets/stylesheets/cards.css index c32dc74c5..2b61ac4ce 100644 --- a/app/assets/stylesheets/cards.css +++ b/app/assets/stylesheets/cards.css @@ -55,7 +55,7 @@ } } - .card__collection { + .card__board { background-color: var(--card-color); border-radius: var(--border-radius) 0 var(--border-radius) 0; color: var(--color-ink-inverted); @@ -66,7 +66,7 @@ padding-block: 0.25lh; padding-inline: var(--card-padding-inline) 1ch; - &:has(.collection-picker__button) { + &:has(.board-picker__button) { cursor: pointer; transition: background-color 100ms ease-out; @@ -92,7 +92,7 @@ } } - .card__collection-name { + .card__board-name { border-inline-start: 1px solid color-mix(in hsl, transparent 75%, currentColor); color: currentColor; display: flex; @@ -404,7 +404,7 @@ padding-block-end: 0; } - .card__collection { + .card__board { font-size: var(--text-xx-small); padding-block: 0.5ch; padding-inline-start: var(--inline-space-double); @@ -487,7 +487,7 @@ } } - .card__collection-public-description { + .card__board-public-description { max-inline-size: 66ch; > *:first-child { margin-block-start: 0; } diff --git a/app/assets/stylesheets/events.css b/app/assets/stylesheets/events.css index 2ff88e5eb..06eaaa15c 100644 --- a/app/assets/stylesheets/events.css +++ b/app/assets/stylesheets/events.css @@ -270,7 +270,7 @@ z-index: 0; } - .card__collection { + .card__board { background-color: transparent; color: color-mix(in srgb, var(--card-color) 40%, var(--color-ink)); font-size: 0.7em; @@ -278,7 +278,7 @@ translate: 0 -0.3em; } - .card__collection-name { + .card__board-name { border-inline-start: 1px solid color-mix(in srgb, var(--color-ink) 33%, var(--color-canvas)); color: color-mix(in srgb, var(--card-color) 40%, var(--color-ink)); margin: 0 0 0 calc(var(--inline-space) * 0.75); diff --git a/app/assets/stylesheets/icons.css b/app/assets/stylesheets/icons.css index e1c4df1d7..8575b72f2 100644 --- a/app/assets/stylesheets/icons.css +++ b/app/assets/stylesheets/icons.css @@ -42,8 +42,8 @@ .icon--clipboard { --svg: url("clipboard.svg "); } .icon--close { --svg: url("close.svg "); } .icon--close-circle { --svg: url("close-circle.svg "); } - .icon--collection { --svg: url("collection.svg "); } - .icon--collection-add { --svg: url("collection-add.svg "); } + .icon--board { --svg: url("board.svg "); } + .icon--board-add { --svg: url("board-add.svg "); } .icon--column-left { --svg: url("column-left.svg "); } .icon--column-right { --svg: url("column-right.svg "); } .icon--comment { --svg: url("comment.svg "); } diff --git a/app/assets/stylesheets/print.css b/app/assets/stylesheets/print.css index d3f849805..df7f8d3a8 100644 --- a/app/assets/stylesheets/print.css +++ b/app/assets/stylesheets/print.css @@ -63,7 +63,7 @@ } .card { - .card__collection { + .card__board { background: var(--color-canvas); border-block-end: var(--border-light); border-inline-end: var(--border-light); @@ -118,7 +118,7 @@ } } - /* Collections + /* Boards /* ------------------------------------------------------------------------ */ .filters, @@ -181,7 +181,7 @@ .card__meta-avatars--assignees > div > div:last-child, .steps > .step:last-child, div:has(> .tag-picker__button), - div:has(> .collection-picker__button), + div:has(> .board-picker__button), .delete-card, .header--card .header__title { display: none; diff --git a/app/assets/stylesheets/trays.css b/app/assets/stylesheets/trays.css index 519baca57..2352cb2b4 100644 --- a/app/assets/stylesheets/trays.css +++ b/app/assets/stylesheets/trays.css @@ -314,7 +314,7 @@ padding-block-end: 0; } - .card__collection { + .card__board { padding-block: 0.25ch; } diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 6c16b1906..dc70236ef 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -7,4 +7,6 @@ class ApplicationController < ActionController::Base stale_when_importmap_changes allow_browser versions: :modern + + etag { "v1" } # 2025-11-05 @todo: To invalidate HTTP cache after big renaming. To remove after a few days. end diff --git a/app/controllers/boards/columns/closeds_controller.rb b/app/controllers/boards/columns/closeds_controller.rb new file mode 100644 index 000000000..b9aad40b3 --- /dev/null +++ b/app/controllers/boards/columns/closeds_controller.rb @@ -0,0 +1,8 @@ +class Boards::Columns::ClosedsController < ApplicationController + include BoardScoped + + def show + set_page_and_extract_portion_from @board.cards.closed.recently_closed_first + fresh_when etag: @page.records + end +end diff --git a/app/controllers/boards/columns/not_nows_controller.rb b/app/controllers/boards/columns/not_nows_controller.rb new file mode 100644 index 000000000..a65f538c4 --- /dev/null +++ b/app/controllers/boards/columns/not_nows_controller.rb @@ -0,0 +1,8 @@ +class Boards::Columns::NotNowsController < ApplicationController + include BoardScoped + + def show + set_page_and_extract_portion_from @board.cards.postponed.reverse_chronologically.with_golden_first + fresh_when etag: @page.records + end +end diff --git a/app/controllers/boards/columns/streams_controller.rb b/app/controllers/boards/columns/streams_controller.rb new file mode 100644 index 000000000..03b48d900 --- /dev/null +++ b/app/controllers/boards/columns/streams_controller.rb @@ -0,0 +1,8 @@ +class Boards::Columns::StreamsController < ApplicationController + include BoardScoped + + def show + set_page_and_extract_portion_from @board.cards.awaiting_triage.latest.with_golden_first + fresh_when etag: @page.records + end +end diff --git a/app/controllers/collections/columns_controller.rb b/app/controllers/boards/columns_controller.rb similarity index 68% rename from app/controllers/collections/columns_controller.rb rename to app/controllers/boards/columns_controller.rb index a6c9103c5..1648da401 100644 --- a/app/controllers/collections/columns_controller.rb +++ b/app/controllers/boards/columns_controller.rb @@ -1,5 +1,5 @@ -class Collections::ColumnsController < ApplicationController - include CollectionScoped +class Boards::ColumnsController < ApplicationController + include BoardScoped before_action :set_column, only: %i[ show update destroy ] @@ -9,7 +9,7 @@ class Collections::ColumnsController < ApplicationController end def create - @column = @collection.columns.create!(column_params) + @column = @board.columns.create!(column_params) end def update @@ -22,7 +22,7 @@ class Collections::ColumnsController < ApplicationController private def set_column - @column = @collection.columns.find(params[:id]) + @column = @board.columns.find(params[:id]) end def column_params diff --git a/app/controllers/boards/entropies_controller.rb b/app/controllers/boards/entropies_controller.rb new file mode 100644 index 000000000..153dafe5f --- /dev/null +++ b/app/controllers/boards/entropies_controller.rb @@ -0,0 +1,12 @@ +class Boards::EntropiesController < ApplicationController + include BoardScoped + + def update + @board.entropy.update!(entropy_params) + end + + private + def entropy_params + params.expect(board: [ :auto_postpone_period ]) + end +end diff --git a/app/controllers/boards/involvements_controller.rb b/app/controllers/boards/involvements_controller.rb new file mode 100644 index 000000000..a904f2989 --- /dev/null +++ b/app/controllers/boards/involvements_controller.rb @@ -0,0 +1,7 @@ +class Boards::InvolvementsController < ApplicationController + include BoardScoped + + def update + @board.access_for(Current.user).update!(involvement: params[:involvement]) + end +end diff --git a/app/controllers/boards/publications_controller.rb b/app/controllers/boards/publications_controller.rb new file mode 100644 index 000000000..b7cda07ee --- /dev/null +++ b/app/controllers/boards/publications_controller.rb @@ -0,0 +1,12 @@ +class Boards::PublicationsController < ApplicationController + include BoardScoped + + def create + @board.publish + end + + def destroy + @board.unpublish + @board.reload + end +end diff --git a/app/controllers/boards_controller.rb b/app/controllers/boards_controller.rb new file mode 100644 index 000000000..4bff8dde4 --- /dev/null +++ b/app/controllers/boards_controller.rb @@ -0,0 +1,94 @@ +class BoardsController < ApplicationController + include FilterScoped + + before_action :set_board, except: %i[ new create ] + before_action :ensure_permission_to_change_accesses, only: %i[ update ] + + def show + if @filter.used?(ignore_boards: true) + show_filtered_cards + else + show_columns + end + end + + def new + @board = Board.new + end + + def create + @board = Board.create! board_params.with_defaults(all_access: true) + redirect_to board_path(@board) + end + + def edit + selected_user_ids = @board.users.pluck :id + @selected_users, @unselected_users = \ + User.active.alphabetically.partition { |user| selected_user_ids.include? user.id } + end + + def update + @board.update! board_params + @board.accesses.revise granted: grantees, revoked: revokees if grantees_changed? + + if @board.accessible_to?(Current.user) + redirect_to edit_board_path(@board), notice: "Saved" + else + redirect_to root_path, notice: "Saved (you were removed from the board)" + end + end + + def destroy + @board.destroy + redirect_to root_path + end + + private + def set_board + @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) + 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 + + def show_filtered_cards + @filter.board_ids = [ @board.id ] + set_page_and_extract_portion_from @filter.cards + end + + def show_columns + set_page_and_extract_portion_from @board.cards.awaiting_triage.latest.with_golden_first + fresh_when etag: [ @board, @page.records, @user_filtering ] + end + + def board_params + params.expect(board: [ :name, :all_access, :auto_postpone_period, :public_description ]) + end + + def grantees + User.active.where id: grantee_ids + end + + def revokees + @board.users.where.not id: grantee_ids + end + + def grantee_ids + params.fetch :user_ids, [] + end +end diff --git a/app/controllers/cards/assignments_controller.rb b/app/controllers/cards/assignments_controller.rb index d32696f11..cac32efde 100644 --- a/app/controllers/cards/assignments_controller.rb +++ b/app/controllers/cards/assignments_controller.rb @@ -2,11 +2,11 @@ class Cards::AssignmentsController < ApplicationController include CardScoped def new - @users = @collection.users.active.alphabetically + @users = @board.users.active.alphabetically fresh_when @users end def create - @card.toggle_assignment @collection.users.active.find(params[:assignee_id]) + @card.toggle_assignment @board.users.active.find(params[:assignee_id]) end end diff --git a/app/controllers/cards/boards_controller.rb b/app/controllers/cards/boards_controller.rb new file mode 100644 index 000000000..dfbc522a4 --- /dev/null +++ b/app/controllers/cards/boards_controller.rb @@ -0,0 +1,21 @@ +class Cards::BoardsController < ApplicationController + include BoardScoped + + skip_before_action :set_board, only: %i[ edit ] + before_action :set_card + + def edit + @boards = Current.user.boards.ordered_by_recently_accessed + fresh_when @boards + end + + def update + @card.move_to(@board) + redirect_to @card + end + + private + def set_card + @card = Current.user.accessible_cards.find(params[:card_id]) + end +end diff --git a/app/controllers/cards/collections_controller.rb b/app/controllers/cards/collections_controller.rb deleted file mode 100644 index 791fd945e..000000000 --- a/app/controllers/cards/collections_controller.rb +++ /dev/null @@ -1,21 +0,0 @@ -class Cards::CollectionsController < ApplicationController - include CollectionScoped - - skip_before_action :set_collection, only: %i[ edit ] - before_action :set_card - - def edit - @collections = Current.user.collections.ordered_by_recently_accessed - fresh_when @collections - end - - def update - @card.move_to(@collection) - redirect_to @card - end - - private - def set_card - @card = Current.user.accessible_cards.find(params[:card_id]) - end -end diff --git a/app/controllers/cards/columns_controller.rb b/app/controllers/cards/columns_controller.rb index e41225050..f250f2dd6 100644 --- a/app/controllers/cards/columns_controller.rb +++ b/app/controllers/cards/columns_controller.rb @@ -1,7 +1,7 @@ class Cards::ColumnsController < ApplicationController def edit @card = Current.user.accessible_cards.find(params[:card_id]) - @columns = @card.collection.columns + @columns = @card.board.columns fresh_when etag: [ @card, @columns ] end diff --git a/app/controllers/cards/publishes_controller.rb b/app/controllers/cards/publishes_controller.rb index 9aeab76ce..641f728cd 100644 --- a/app/controllers/cards/publishes_controller.rb +++ b/app/controllers/cards/publishes_controller.rb @@ -5,9 +5,9 @@ class Cards::PublishesController < ApplicationController @card.publish if add_another_param? - redirect_to @collection.cards.create!, notice: "Card added" + redirect_to @board.cards.create!, notice: "Card added" else - redirect_to @card.collection + redirect_to @card.board end end diff --git a/app/controllers/cards/readings_controller.rb b/app/controllers/cards/readings_controller.rb index d2e1bb8d1..e6a728829 100644 --- a/app/controllers/cards/readings_controller.rb +++ b/app/controllers/cards/readings_controller.rb @@ -5,11 +5,11 @@ class Cards::ReadingsController < ApplicationController def create @notifications = @card.read_by(Current.user) - record_collection_access + record_board_access end private - def record_collection_access - @card.collection.accessed_by(Current.user) + def record_board_access + @card.board.accessed_by(Current.user) end end diff --git a/app/controllers/cards/triages_controller.rb b/app/controllers/cards/triages_controller.rb index 10fb3df34..0c1a7bd1e 100644 --- a/app/controllers/cards/triages_controller.rb +++ b/app/controllers/cards/triages_controller.rb @@ -2,7 +2,7 @@ class Cards::TriagesController < ApplicationController include CardScoped def create - column = @card.collection.columns.find(params[:column_id]) + column = @card.board.columns.find(params[:column_id]) @card.triage_into(column) redirect_to @card diff --git a/app/controllers/cards_controller.rb b/app/controllers/cards_controller.rb index 7fcd7123e..3b9f0fcde 100644 --- a/app/controllers/cards_controller.rb +++ b/app/controllers/cards_controller.rb @@ -1,15 +1,16 @@ class CardsController < ApplicationController include FilterScoped - before_action :set_collection, only: %i[ create ] + before_action :set_board, only: %i[ create ] before_action :set_card, only: %i[ show edit update destroy ] + before_action :ensure_permission_to_administer_card, only: %i[ destroy ] def index set_page_and_extract_portion_from @filter.cards end def create - card = @collection.cards.find_or_create_by!(creator: Current.user, status: "drafted") + card = @board.cards.find_or_create_by!(creator: Current.user, status: "drafted") redirect_to card end @@ -30,23 +31,27 @@ class CardsController < ApplicationController def destroy @card.destroy! - redirect_to @card.collection, notice: "Card deleted" + redirect_to @card.board, notice: "Card deleted" end private - def set_collection - @collection = Current.user.collections.find params[:collection_id] + def set_board + @board = Current.user.boards.find params[:board_id] end def set_card @card = Current.user.accessible_cards.find params[:id] end + def ensure_permission_to_administer_card + head :forbidden unless Current.user.can_administer_card?(@card) + end + def suppressing_broadcasts_unless_published(card, &block) if card.published? yield else - Collection.suppressing_turbo_broadcasts(&block) + Board.suppressing_turbo_broadcasts(&block) end end diff --git a/app/controllers/collections/columns/closeds_controller.rb b/app/controllers/collections/columns/closeds_controller.rb deleted file mode 100644 index b5bf35953..000000000 --- a/app/controllers/collections/columns/closeds_controller.rb +++ /dev/null @@ -1,8 +0,0 @@ -class Collections::Columns::ClosedsController < ApplicationController - include CollectionScoped - - def show - set_page_and_extract_portion_from @collection.cards.closed.recently_closed_first - fresh_when etag: @page.records - end -end diff --git a/app/controllers/collections/columns/not_nows_controller.rb b/app/controllers/collections/columns/not_nows_controller.rb deleted file mode 100644 index 4c1a6796b..000000000 --- a/app/controllers/collections/columns/not_nows_controller.rb +++ /dev/null @@ -1,8 +0,0 @@ -class Collections::Columns::NotNowsController < ApplicationController - include CollectionScoped - - def show - set_page_and_extract_portion_from @collection.cards.postponed.reverse_chronologically.with_golden_first - fresh_when etag: @page.records - end -end diff --git a/app/controllers/collections/columns/streams_controller.rb b/app/controllers/collections/columns/streams_controller.rb deleted file mode 100644 index dccc9aa15..000000000 --- a/app/controllers/collections/columns/streams_controller.rb +++ /dev/null @@ -1,8 +0,0 @@ -class Collections::Columns::StreamsController < ApplicationController - include CollectionScoped - - def show - set_page_and_extract_portion_from @collection.cards.awaiting_triage.latest.with_golden_first - fresh_when etag: @page.records - end -end diff --git a/app/controllers/collections/entropies_controller.rb b/app/controllers/collections/entropies_controller.rb deleted file mode 100644 index 4affaf5af..000000000 --- a/app/controllers/collections/entropies_controller.rb +++ /dev/null @@ -1,12 +0,0 @@ -class Collections::EntropiesController < ApplicationController - include CollectionScoped - - def update - @collection.entropy.update!(entropy_params) - end - - private - def entropy_params - params.expect(collection: [ :auto_postpone_period ]) - end -end diff --git a/app/controllers/collections/involvements_controller.rb b/app/controllers/collections/involvements_controller.rb deleted file mode 100644 index 69f7f2fbc..000000000 --- a/app/controllers/collections/involvements_controller.rb +++ /dev/null @@ -1,7 +0,0 @@ -class Collections::InvolvementsController < ApplicationController - include CollectionScoped - - def update - @collection.access_for(Current.user).update!(involvement: params[:involvement]) - end -end diff --git a/app/controllers/collections/publications_controller.rb b/app/controllers/collections/publications_controller.rb deleted file mode 100644 index 78400dd3c..000000000 --- a/app/controllers/collections/publications_controller.rb +++ /dev/null @@ -1,12 +0,0 @@ -class Collections::PublicationsController < ApplicationController - include CollectionScoped - - def create - @collection.publish - end - - def destroy - @collection.unpublish - @collection.reload - end -end diff --git a/app/controllers/collections_controller.rb b/app/controllers/collections_controller.rb deleted file mode 100644 index b7c722eca..000000000 --- a/app/controllers/collections_controller.rb +++ /dev/null @@ -1,79 +0,0 @@ -class CollectionsController < ApplicationController - include FilterScoped - - before_action :set_collection, except: %i[ new create ] - - def show - if @filter.used?(ignore_collections: true) - show_filtered_cards - else - show_columns - end - end - - def new - @collection = Collection.new - end - - def create - @collection = Collection.create! collection_params.with_defaults(all_access: true) - redirect_to collection_path(@collection) - end - - def edit - selected_user_ids = @collection.users.pluck :id - @selected_users, @unselected_users = \ - User.active.alphabetically.partition { |user| selected_user_ids.include? user.id } - end - - def update - @collection.update! collection_params - @collection.accesses.revise granted: grantees, revoked: revokees if grantees_changed? - - if @collection.accessible_to?(Current.user) - redirect_to edit_collection_path(@collection), notice: "Saved" - else - redirect_to root_path, notice: "Saved (you were removed from the collection)" - end - end - - def destroy - @collection.destroy - redirect_to root_path - end - - private - def set_collection - @collection = Current.user.collections.find params[:id] - end - - def show_filtered_cards - @filter.collection_ids = [ @collection.id ] - set_page_and_extract_portion_from @filter.cards - end - - def show_columns - set_page_and_extract_portion_from @collection.cards.awaiting_triage.latest.with_golden_first - fresh_when etag: [ @collection, @page.records, @user_filtering ] - end - - def collection_params - params.expect(collection: [ :name, :all_access, :auto_postpone_period, :public_description ]) - end - - def grantees - User.active.where id: grantee_ids - end - - def revokees - @collection.users.where.not id: grantee_ids - end - - def grantee_ids - params.fetch :user_ids, [] - end - - def grantees_changed? - params.key?(:user_ids) - end -end diff --git a/app/controllers/columns/cards/drops/columns_controller.rb b/app/controllers/columns/cards/drops/columns_controller.rb index 3de47992e..1d2bd8ce5 100644 --- a/app/controllers/columns/cards/drops/columns_controller.rb +++ b/app/controllers/columns/cards/drops/columns_controller.rb @@ -2,7 +2,7 @@ class Columns::Cards::Drops::ColumnsController < ApplicationController include CardScoped def create - @column = @card.collection.columns.find(params[:column_id]) + @column = @card.board.columns.find(params[:column_id]) @card.triage_into(@column) end end diff --git a/app/controllers/columns/cards/drops/streams_controller.rb b/app/controllers/columns/cards/drops/streams_controller.rb index d3ce8d1fa..fefdbb23f 100644 --- a/app/controllers/columns/cards/drops/streams_controller.rb +++ b/app/controllers/columns/cards/drops/streams_controller.rb @@ -3,6 +3,6 @@ class Columns::Cards::Drops::StreamsController < ApplicationController def create @card.send_back_to_triage - set_page_and_extract_portion_from @collection.cards.awaiting_triage.latest.with_golden_first + set_page_and_extract_portion_from @board.cards.awaiting_triage.latest.with_golden_first end end diff --git a/app/controllers/concerns/board_scoped.rb b/app/controllers/concerns/board_scoped.rb new file mode 100644 index 000000000..2772c7d01 --- /dev/null +++ b/app/controllers/concerns/board_scoped.rb @@ -0,0 +1,12 @@ +module BoardScoped + extend ActiveSupport::Concern + + included do + before_action :set_board + end + + private + def set_board + @board = Current.user.boards.find(params[:board_id]) + end +end diff --git a/app/controllers/concerns/card_scoped.rb b/app/controllers/concerns/card_scoped.rb index 5438871c1..77496e160 100644 --- a/app/controllers/concerns/card_scoped.rb +++ b/app/controllers/concerns/card_scoped.rb @@ -2,7 +2,7 @@ module CardScoped extend ActiveSupport::Concern included do - before_action :set_card, :set_collection + before_action :set_card, :set_board end private @@ -10,8 +10,8 @@ module CardScoped @card = Current.user.accessible_cards.find(params[:card_id]) end - def set_collection - @collection = @card.collection + def set_board + @board = @card.board end def render_card_replacement diff --git a/app/controllers/concerns/collection_scoped.rb b/app/controllers/concerns/collection_scoped.rb deleted file mode 100644 index 2ddde9531..000000000 --- a/app/controllers/concerns/collection_scoped.rb +++ /dev/null @@ -1,12 +0,0 @@ -module CollectionScoped - extend ActiveSupport::Concern - - included do - before_action :set_collection - end - - private - def set_collection - @collection = Current.user.collections.find(params[:collection_id]) - end -end diff --git a/app/controllers/landings_controller.rb b/app/controllers/landings_controller.rb index 5c2709a1f..f7f7558c4 100644 --- a/app/controllers/landings_controller.rb +++ b/app/controllers/landings_controller.rb @@ -1,7 +1,7 @@ class LandingsController < ApplicationController def show - if Current.user.collections.one? - redirect_to collection_path(Current.user.collections.first) + if Current.user.boards.one? + redirect_to board_path(Current.user.boards.first) else redirect_to events_path end diff --git a/app/controllers/notifications/settings_controller.rb b/app/controllers/notifications/settings_controller.rb index 42608b558..c4aab7f69 100644 --- a/app/controllers/notifications/settings_controller.rb +++ b/app/controllers/notifications/settings_controller.rb @@ -2,7 +2,7 @@ class Notifications::SettingsController < ApplicationController before_action :set_settings def show - @collections = Current.user.collections.alphabetically + @boards = Current.user.boards.alphabetically end def update diff --git a/app/controllers/prompts/boards/users_controller.rb b/app/controllers/prompts/boards/users_controller.rb new file mode 100644 index 000000000..e5f8775a6 --- /dev/null +++ b/app/controllers/prompts/boards/users_controller.rb @@ -0,0 +1,11 @@ +class Prompts::Boards::UsersController < ApplicationController + include BoardScoped + + def index + @users = @board.users.alphabetically + + if stale? etag: @users + render layout: false + end + end +end diff --git a/app/controllers/prompts/collections/users_controller.rb b/app/controllers/prompts/collections/users_controller.rb deleted file mode 100644 index 19edbbd5d..000000000 --- a/app/controllers/prompts/collections/users_controller.rb +++ /dev/null @@ -1,11 +0,0 @@ -class Prompts::Collections::UsersController < ApplicationController - include CollectionScoped - - def index - @users = @collection.users.alphabetically - - if stale? etag: @users - render layout: false - end - end -end diff --git a/app/controllers/public/base_controller.rb b/app/controllers/public/base_controller.rb index 7fa2e69fb..28a1bf463 100644 --- a/app/controllers/public/base_controller.rb +++ b/app/controllers/public/base_controller.rb @@ -1,17 +1,17 @@ class Public::BaseController < ApplicationController allow_unauthenticated_access - before_action :set_collection, :set_card, :set_public_cache_expiration + before_action :set_board, :set_card, :set_public_cache_expiration layout "public" private - def set_collection - @collection = Collection.find_by_published_key(params[:collection_id] || params[:id]) + def set_board + @board = Board.find_by_published_key(params[:board_id] || params[:id]) end def set_card - @card = @collection.cards.find(params[:id]) if params[:collection_id] && params[:id] + @card = @board.cards.find(params[:id]) if params[:board_id] && params[:id] end def set_public_cache_expiration diff --git a/app/controllers/public/boards/columns/closeds_controller.rb b/app/controllers/public/boards/columns/closeds_controller.rb new file mode 100644 index 000000000..63ca9de7b --- /dev/null +++ b/app/controllers/public/boards/columns/closeds_controller.rb @@ -0,0 +1,5 @@ +class Public::Boards::Columns::ClosedsController < Public::BaseController + def show + set_page_and_extract_portion_from @board.cards.closed.recently_closed_first + end +end diff --git a/app/controllers/public/boards/columns/not_nows_controller.rb b/app/controllers/public/boards/columns/not_nows_controller.rb new file mode 100644 index 000000000..d518fb8e0 --- /dev/null +++ b/app/controllers/public/boards/columns/not_nows_controller.rb @@ -0,0 +1,5 @@ +class Public::Boards::Columns::NotNowsController < Public::BaseController + def show + set_page_and_extract_portion_from @board.cards.postponed.reverse_chronologically.with_golden_first + end +end diff --git a/app/controllers/public/boards/columns/streams_controller.rb b/app/controllers/public/boards/columns/streams_controller.rb new file mode 100644 index 000000000..778817b3e --- /dev/null +++ b/app/controllers/public/boards/columns/streams_controller.rb @@ -0,0 +1,5 @@ +class Public::Boards::Columns::StreamsController < Public::BaseController + def show + set_page_and_extract_portion_from @board.cards.awaiting_triage.latest.with_golden_first + end +end diff --git a/app/controllers/public/collections/columns_controller.rb b/app/controllers/public/boards/columns_controller.rb similarity index 71% rename from app/controllers/public/collections/columns_controller.rb rename to app/controllers/public/boards/columns_controller.rb index 44262c545..5a5c23d5e 100644 --- a/app/controllers/public/collections/columns_controller.rb +++ b/app/controllers/public/boards/columns_controller.rb @@ -1,4 +1,4 @@ -class Public::Collections::ColumnsController < Public::BaseController +class Public::Boards::ColumnsController < Public::BaseController before_action :set_column def show @@ -11,6 +11,6 @@ class Public::Collections::ColumnsController < Public::BaseController end def set_column - @column = @collection.columns.find(params[:id]) + @column = @board.columns.find(params[:id]) end end diff --git a/app/controllers/public/boards_controller.rb b/app/controllers/public/boards_controller.rb new file mode 100644 index 000000000..d56a1f684 --- /dev/null +++ b/app/controllers/public/boards_controller.rb @@ -0,0 +1,5 @@ +class Public::BoardsController < Public::BaseController + def show + set_page_and_extract_portion_from @board.cards.awaiting_triage.latest.with_golden_first + end +end diff --git a/app/controllers/public/collections/columns/closeds_controller.rb b/app/controllers/public/collections/columns/closeds_controller.rb deleted file mode 100644 index f782fbc8f..000000000 --- a/app/controllers/public/collections/columns/closeds_controller.rb +++ /dev/null @@ -1,5 +0,0 @@ -class Public::Collections::Columns::ClosedsController < Public::BaseController - def show - set_page_and_extract_portion_from @collection.cards.closed.recently_closed_first - end -end diff --git a/app/controllers/public/collections/columns/not_nows_controller.rb b/app/controllers/public/collections/columns/not_nows_controller.rb deleted file mode 100644 index 6ee68e3e7..000000000 --- a/app/controllers/public/collections/columns/not_nows_controller.rb +++ /dev/null @@ -1,5 +0,0 @@ -class Public::Collections::Columns::NotNowsController < Public::BaseController - def show - set_page_and_extract_portion_from @collection.cards.postponed.reverse_chronologically.with_golden_first - end -end diff --git a/app/controllers/public/collections/columns/streams_controller.rb b/app/controllers/public/collections/columns/streams_controller.rb deleted file mode 100644 index 602b3d91d..000000000 --- a/app/controllers/public/collections/columns/streams_controller.rb +++ /dev/null @@ -1,5 +0,0 @@ -class Public::Collections::Columns::StreamsController < Public::BaseController - def show - set_page_and_extract_portion_from @collection.cards.awaiting_triage.latest.with_golden_first - end -end diff --git a/app/controllers/public/collections_controller.rb b/app/controllers/public/collections_controller.rb deleted file mode 100644 index d7e4977af..000000000 --- a/app/controllers/public/collections_controller.rb +++ /dev/null @@ -1,5 +0,0 @@ -class Public::CollectionsController < Public::BaseController - def show - set_page_and_extract_portion_from @collection.cards.awaiting_triage.latest.with_golden_first - end -end diff --git a/app/controllers/webhooks_controller.rb b/app/controllers/webhooks_controller.rb index b9ad06187..7d79c4587 100644 --- a/app/controllers/webhooks_controller.rb +++ b/app/controllers/webhooks_controller.rb @@ -1,22 +1,22 @@ class WebhooksController < ApplicationController - include CollectionScoped + include BoardScoped before_action :ensure_admin before_action :set_webhook, except: %i[ index new create ] def index - set_page_and_extract_portion_from @collection.webhooks.ordered + set_page_and_extract_portion_from @board.webhooks.ordered end def show end def new - @webhook = @collection.webhooks.new + @webhook = @board.webhooks.new end def create - webhook = @collection.webhooks.create!(webhook_params) + webhook = @board.webhooks.create!(webhook_params) redirect_to webhook end @@ -30,17 +30,17 @@ class WebhooksController < ApplicationController def destroy @webhook.destroy! - redirect_to collection_webhooks_path + redirect_to board_webhooks_path end private def set_webhook - @webhook = @collection.webhooks.find(params[:id]) + @webhook = @board.webhooks.find(params[:id]) end def webhook_params params .expect(webhook: [ :name, :url, subscribed_actions: [] ]) - .merge(collection_id: @collection.id) + .merge(board_id: @board.id) end end diff --git a/app/helpers/accesses_helper.rb b/app/helpers/accesses_helper.rb index ec98acc22..01aa57b7c 100644 --- a/app/helpers/accesses_helper.rb +++ b/app/helpers/accesses_helper.rb @@ -1,8 +1,8 @@ module AccessesHelper MAX_DISPLAYED_WATCHERS = 8 - def access_menu_tag(collection, **options, &) - tag.menu class: [ options[:class], { "toggler--toggled": collection.all_access? } ], data: { + def access_menu_tag(board, **options, &) + tag.menu class: [ options[:class], { "toggler--toggled": board.all_access? } ], data: { controller: "filter toggle-class navigable-list", action: "keydown->navigable-list#navigate filter:changed->navigable-list#reset", navigable_list_focus_on_selection_value: true, @@ -10,36 +10,36 @@ module AccessesHelper toggle_class_toggle_class: "toggler--toggled" }, & end - def access_toggles_for(users, selected:) - render partial: "collections/access_toggle", + def access_toggles_for(users, selected:, disabled: false) + render partial: "boards/access_toggle", collection: users, as: :user, - locals: { selected: selected }, + locals: { selected: selected, disabled: disabled }, cached: ->(user) { [ user, selected ] } end - def access_involvement_advance_button(collection, user, show_watchers: true, icon_only: false) - access = collection.access_for(user) + def access_involvement_advance_button(board, user, show_watchers: true, icon_only: false) + access = board.access_for(user) - turbo_frame_tag dom_id(collection, :involvement_button) do - concat collection_watchers_list(collection) if show_watchers - concat involvement_button(collection, access, show_watchers, icon_only) + turbo_frame_tag dom_id(board, :involvement_button) do + concat board_watchers_list(board) if show_watchers + concat involvement_button(board, access, show_watchers, icon_only) end end - def collection_watchers_list(collection) - watchers = collection.watchers + def board_watchers_list(board) + watchers = board.watchers displayed_watchers = watchers.limit(MAX_DISPLAYED_WATCHERS) overflow_count = watchers.count - MAX_DISPLAYED_WATCHERS safe_join([ tag.strong(displayed_watchers.any? ? "Watching for new cards" : "No one is watching for new cards", class: "txt-uppercase"), - tag.div(class: "collection-tools__watching") do + tag.div(class: "board-tools__watching") do safe_join([ safe_join(displayed_watchers.map { |watcher| avatar_tag(watcher) }), (tag.div(data: { controller: "dialog", action: "keydown.esc->dialog#close click@document->dialog#closeOnClickOutside" }) do concat tag.button("+#{overflow_count}", class: "overflow-count btn btn--circle borderless", data: { action: "dialog#open" }, aria: { label: "Show #{overflow_count} more watchers" }) - concat(tag.dialog(class: "collection-tools__watching-dialog dialog panel", data: { dialog_target: "dialog" }, aria: { hidden: "true" }) do + concat(tag.dialog(class: "board-tools__watching-dialog dialog panel", data: { dialog_target: "dialog" }, aria: { hidden: "true" }) do safe_join(watchers.map { |watcher| avatar_tag(watcher) }) end) end if overflow_count > 0) @@ -48,11 +48,11 @@ module AccessesHelper ]) end - def involvement_button(collection, access, show_watchers, icon_only) - involvement_label_id = dom_id(collection, :involvement_label) + def involvement_button(board, access, show_watchers, icon_only) + involvement_label_id = dom_id(board, :involvement_label) button_to( - collection_involvement_path(collection), + board_involvement_path(board), method: :put, aria: { labelledby: involvement_label_id }, class: class_names("btn", { "btn--reversed": access.watching? && icon_only }), diff --git a/app/helpers/boards_helper.rb b/app/helpers/boards_helper.rb new file mode 100644 index 000000000..ae8739d05 --- /dev/null +++ b/app/helpers/boards_helper.rb @@ -0,0 +1,14 @@ +module BoardsHelper + def link_back_to_board(board) + link_to board, class: "btn borderless txt-medium", + data: { controller: "hotkey", action: "keydown.esc@document->hotkey#click click->turbo-navigation#backIfSamePath" } do + tag.span ("←" + tag.strong(board.name, class: "overflow-ellipsis")).html_safe + end + end + + def link_to_edit_board(board) + link_to edit_board_path(board), class: "btn", data: { controller: "tooltip" } do + icon_tag("settings") + tag.span("Settings for #{board.name}", class: "for-screen-reader") + end + end +end diff --git a/app/helpers/cards_helper.rb b/app/helpers/cards_helper.rb index 2b67f8750..56df2f54d 100644 --- a/app/helpers/cards_helper.rb +++ b/app/helpers/cards_helper.rb @@ -27,14 +27,14 @@ module CardsHelper title = [ card.title, "added by #{card.creator.name}", - "in #{card.collection.name}" + "in #{card.board.name}" ] title << "assigned to #{card.assignees.map(&:name).to_sentence}" if card.assignees.any? title.join(" ") end def card_social_tags(card) - tag.meta(property: "og:title", content: "#{card.title} | #{card.collection.name}") + + tag.meta(property: "og:title", content: "#{card.title} | #{card.board.name}") + tag.meta(property: "og:description", content: format_excerpt(@card&.description, length: 200)) + tag.meta(property: "og:image", content: @card.image.attached? ? "#{request.base_url}#{url_for(@card.image)}" : "#{request.base_url}/app-icon.png") + tag.meta(property: "og:url", content: card_url(@card)) diff --git a/app/helpers/collections_helper.rb b/app/helpers/collections_helper.rb deleted file mode 100644 index d10b00a4c..000000000 --- a/app/helpers/collections_helper.rb +++ /dev/null @@ -1,14 +0,0 @@ -module CollectionsHelper - def link_back_to_collection(collection) - link_to collection, class: "btn borderless txt-medium", - data: { controller: "hotkey", action: "keydown.esc@document->hotkey#click click->turbo-navigation#backIfSamePath" } do - tag.span ("←" + tag.strong(collection.name, class: "overflow-ellipsis")).html_safe - end - end - - def link_to_edit_collection(collection) - link_to edit_collection_path(collection), class: "btn", data: { controller: "tooltip" } do - icon_tag("settings") + tag.span("Settings for #{collection.name}", class: "for-screen-reader") - end - end -end diff --git a/app/helpers/events_helper.rb b/app/helpers/events_helper.rb index 7c55f857e..992463740 100644 --- a/app/helpers/events_helper.rb +++ b/app/helpers/events_helper.rb @@ -102,8 +102,8 @@ module EventsHelper "#{event_creator_name(event)} resumed #{event_card_title(card)}" when "card_title_changed" "#{event_creator_name(event)} renamed #{event_card_title(card)} (was: “#{h event.particulars.dig('particulars', 'old_title')}”)" - when "card_collection_changed" - "#{event_creator_name(event)} moved #{event_card_title(card)} to “#{h event.particulars.dig('particulars', 'new_collection')}”" + when "card_board_changed", "card_collection_changed" + "#{event_creator_name(event)} moved #{event_card_title(card)} to “#{h (event.particulars.dig('particulars', 'new_board') || event.particulars.dig('particulars', 'new_collection'))}”" when "card_triaged" "#{event_creator_name(event)} moved #{event_card_title(card)} to “#{h event.particulars.dig('particulars', 'column')}”" when "card_sent_back_to_triage" @@ -129,7 +129,7 @@ module EventsHelper "comment" when "card_title_changed" "rename" - when "card_collection_changed" + when "card_board_changed" "move" else "person" diff --git a/app/helpers/filters_helper.rb b/app/helpers/filters_helper.rb index cfb634223..49f175067 100644 --- a/app/helpers/filters_helper.rb +++ b/app/helpers/filters_helper.rb @@ -11,8 +11,8 @@ module FiltersHelper hidden_field_tag name, value, id: nil end - def filter_selected_collections_title(user_filtering) - user_filtering.selected_collection_titles.collect { tag.strong it }.to_sentence.html_safe + def filter_selected_boards_title(user_filtering) + user_filtering.selected_board_titles.collect { tag.strong it }.to_sentence.html_safe end def filter_place_menu_item(path, label, icon, new_window: false, current: false) diff --git a/app/helpers/my/menu_helper.rb b/app/helpers/my/menu_helper.rb index a972a3408..2962a49ac 100644 --- a/app/helpers/my/menu_helper.rb +++ b/app/helpers/my/menu_helper.rb @@ -3,7 +3,7 @@ module My::MenuHelper text_field_tag :search, nil, type: "search", role: "combobox", - placeholder: "Type to jump to a collection, person, place, or tag…", + placeholder: "Type to jump to a board, person, place, or tag…", class: "input input--transparent txt-small", autofocus: true, autocorrect: "off", diff --git a/app/helpers/rich_text_helper.rb b/app/helpers/rich_text_helper.rb index 752af1075..c1bc2232a 100644 --- a/app/helpers/rich_text_helper.rb +++ b/app/helpers/rich_text_helper.rb @@ -1,6 +1,6 @@ module RichTextHelper - def mentions_prompt(collection) - content_tag "lexxy-prompt", "", trigger: "@", src: prompts_collection_users_path(collection), name: "mention" + def mentions_prompt(board) + content_tag "lexxy-prompt", "", trigger: "@", src: prompts_board_users_path(board), name: "mention" end def global_mentions_prompt @@ -19,7 +19,7 @@ module RichTextHelper content_tag "lexxy-code-language-picker" end - def general_prompts(collection) - safe_join([ mentions_prompt(collection), cards_prompt, code_language_picker ]) + def general_prompts(board) + safe_join([ mentions_prompt(board), cards_prompt, code_language_picker ]) end end diff --git a/app/helpers/webhooks_helper.rb b/app/helpers/webhooks_helper.rb index c809ac6ef..e0e0e3387 100644 --- a/app/helpers/webhooks_helper.rb +++ b/app/helpers/webhooks_helper.rb @@ -2,7 +2,7 @@ module WebhooksHelper ACTION_LABELS = { card_published: "Card added", card_title_changed: "Card title changed", - card_collection_changed: "Card collection changed", + card_board_changed: "Card board changed", comment_created: "Comment added", card_assigned: "Card assigned", card_unassigned: "Card unassigned", @@ -22,9 +22,9 @@ module WebhooksHelper ACTION_LABELS[action] || action.to_s.humanize end - def link_to_webhooks(collection, &) - link_to collection_webhooks_path(collection_id: collection), - class: [ "btn", { "btn--reversed": collection.webhooks.any? } ], + def link_to_webhooks(board, &) + link_to board_webhooks_path(board_id: board), + class: [ "btn", { "btn--reversed": board.webhooks.any? } ], data: { controller: "tooltip" } do icon_tag("world") + tag.span("Webhooks", class: "for-screen-reader") end diff --git a/app/javascript/controllers/collections_form_controller.js b/app/javascript/controllers/boards_form_controller.js similarity index 100% rename from app/javascript/controllers/collections_form_controller.js rename to app/javascript/controllers/boards_form_controller.js diff --git a/app/javascript/controllers/collapsible_columns_controller.js b/app/javascript/controllers/collapsible_columns_controller.js index 0a87e47d5..74dd1ff65 100644 --- a/app/javascript/controllers/collapsible_columns_controller.js +++ b/app/javascript/controllers/collapsible_columns_controller.js @@ -5,7 +5,7 @@ export default class extends Controller { static classes = [ "collapsed", "noTransitions" ] static targets = [ "column", "button" ] static values = { - collection: String + board: String } initialize() { @@ -104,6 +104,6 @@ export default class extends Controller { } #localStorageKeyFor(column) { - return `expand-${this.collectionValue}-${column.getAttribute("id")}` + return `expand-${this.boardValue}-${column.getAttribute("id")}` } } diff --git a/app/javascript/controllers/toggle_class_controller.js b/app/javascript/controllers/toggle_class_controller.js index 357525f67..04969aee2 100644 --- a/app/javascript/controllers/toggle_class_controller.js +++ b/app/javascript/controllers/toggle_class_controller.js @@ -24,7 +24,7 @@ export default class extends Controller { checkNone() { this.checkboxTargets.forEach(checkbox => { - if (checkbox.dataset.collectionsFormTarget === "meCheckbox") return + if (checkbox.dataset.boardsFormTarget === "meCheckbox") return checkbox.checked = false }) } diff --git a/app/jobs/board/clean_inaccessible_data_job.rb b/app/jobs/board/clean_inaccessible_data_job.rb new file mode 100644 index 000000000..b2cdff085 --- /dev/null +++ b/app/jobs/board/clean_inaccessible_data_job.rb @@ -0,0 +1,5 @@ +class Board::CleanInaccessibleDataJob < ApplicationJob + def perform(user, board) + board.clean_inaccessible_data_for(user) + end +end diff --git a/app/jobs/collection/clean_inaccessible_data_job.rb b/app/jobs/collection/clean_inaccessible_data_job.rb deleted file mode 100644 index 16ff1b90f..000000000 --- a/app/jobs/collection/clean_inaccessible_data_job.rb +++ /dev/null @@ -1,5 +0,0 @@ -class Collection::CleanInaccessibleDataJob < ApplicationJob - def perform(user, collection) - collection.clean_inaccessible_data_for(user) - end -end diff --git a/app/models/access.rb b/app/models/access.rb index fe4efe590..27026fb87 100644 --- a/app/models/access.rb +++ b/app/models/access.rb @@ -1,5 +1,5 @@ class Access < ApplicationRecord - belongs_to :collection, touch: true + belongs_to :board, touch: true belongs_to :user, touch: true enum :involvement, %i[ access_only watching ].index_by(&:itself), default: :access_only @@ -18,6 +18,6 @@ class Access < ApplicationRecord end def clean_inaccessible_data_later - Collection::CleanInaccessibleDataJob.perform_later(user, collection) + Board::CleanInaccessibleDataJob.perform_later(user, board) end end diff --git a/app/models/account/seeder.rb b/app/models/account/seeder.rb index 624f4abd1..991877833 100644 --- a/app/models/account/seeder.rb +++ b/app/models/account/seeder.rb @@ -26,9 +26,9 @@ class Account::Seeder def populate # --------------- - # Playground Collection + # Playground Board # --------------- - playground = Collection.create! name: "Playground", creator: creator, all_access: true + playground = Board.create! name: "Playground", creator: creator, all_access: true # Cards playground.cards.create! creator: creator, title: "Watch this: Fizzy orientation video", status: "published", description: <<~HTML @@ -105,7 +105,7 @@ class Account::Seeder def delete_everything Current.set session: session do - Collection.destroy_all + Board.destroy_all end end end diff --git a/app/models/collection.rb b/app/models/board.rb similarity index 72% rename from app/models/collection.rb rename to app/models/board.rb index ae09d9471..9e259d652 100644 --- a/app/models/collection.rb +++ b/app/models/board.rb @@ -1,5 +1,5 @@ -class Collection < ApplicationRecord - include AutoClosing, Accessible, Broadcastable, Cards, Entropic, Filterable, Publishable, Triageable +class Board < ApplicationRecord + include AutoPostponing, Accessible, Broadcastable, Cards, Entropic, Filterable, Publishable, Triageable belongs_to :creator, class_name: "User", default: -> { Current.user } diff --git a/app/models/collection/accessible.rb b/app/models/board/accessible.rb similarity index 86% rename from app/models/collection/accessible.rb rename to app/models/board/accessible.rb index 2d6aee476..6d62c0b21 100644 --- a/app/models/collection/accessible.rb +++ b/app/models/board/accessible.rb @@ -1,4 +1,4 @@ -module Collection::Accessible +module Board::Accessible extend ActiveSupport::Concern included do @@ -11,7 +11,7 @@ module Collection::Accessible end def grant_to(users) - Access.insert_all Array(users).collect { |user| { collection_id: proxy_association.owner.id, user_id: user.id } } + Access.insert_all Array(users).collect { |user| { board_id: proxy_association.owner.id, user_id: user.id } } end def revoke_from(users) @@ -69,7 +69,7 @@ module Collection::Accessible .joins("LEFT JOIN cards ON mentions.source_id = cards.id AND mentions.source_type = 'Card'") .joins("LEFT JOIN comments ON mentions.source_id = comments.id AND mentions.source_type = 'Comment'") .joins("LEFT JOIN cards AS comment_cards ON comments.card_id = comment_cards.id") - .where("(mentions.source_type = 'Card' AND cards.collection_id = ?) OR (mentions.source_type = 'Comment' AND comment_cards.collection_id = ?)", id, id) + .where("(mentions.source_type = 'Card' AND cards.board_id = ?) OR (mentions.source_type = 'Comment' AND comment_cards.board_id = ?)", id, id) end def notifications_for_user(user) @@ -85,8 +85,8 @@ module Collection::Accessible .joins("LEFT JOIN cards AS event_cards ON events.eventable_id = event_cards.id AND events.eventable_type = 'Card'") .joins("LEFT JOIN comments AS event_comments ON events.eventable_id = event_comments.id AND events.eventable_type = 'Comment'") .joins("LEFT JOIN cards AS event_comment_cards ON event_comments.card_id = event_comment_cards.id") - .where("(notifications.source_type = 'Event' AND events.eventable_type = 'Card' AND event_cards.collection_id = ?) OR - (notifications.source_type = 'Event' AND events.eventable_type = 'Comment' AND event_comment_cards.collection_id = ?)", + .where("(notifications.source_type = 'Event' AND events.eventable_type = 'Card' AND event_cards.board_id = ?) OR + (notifications.source_type = 'Event' AND events.eventable_type = 'Comment' AND event_comment_cards.board_id = ?)", id, id) end end diff --git a/app/models/collection/auto_closing.rb b/app/models/board/auto_postponing.rb similarity index 61% rename from app/models/collection/auto_closing.rb rename to app/models/board/auto_postponing.rb index 98cf21385..4911c5e33 100644 --- a/app/models/collection/auto_closing.rb +++ b/app/models/board/auto_postponing.rb @@ -1,4 +1,4 @@ -module Collection::AutoClosing +module Board::AutoPostponing extend ActiveSupport::Concern included do @@ -6,9 +6,9 @@ module Collection::AutoClosing end private - DEFAULT_auto_postpone_period = 30.days + DEFAULT_AUTO_POSTPONE_PERIOD = 30.days def set_default_auto_postpone_period - self.auto_postpone_period ||= DEFAULT_auto_postpone_period unless attribute_present?(:auto_postpone_period) + self.auto_postpone_period ||= DEFAULT_AUTO_POSTPONE_PERIOD unless attribute_present?(:auto_postpone_period) end end diff --git a/app/models/board/broadcastable.rb b/app/models/board/broadcastable.rb new file mode 100644 index 000000000..177509800 --- /dev/null +++ b/app/models/board/broadcastable.rb @@ -0,0 +1,8 @@ +module Board::Broadcastable + extend ActiveSupport::Concern + + included do + broadcasts_refreshes + broadcasts_refreshes_to ->(_) { :all_boards } + end +end diff --git a/app/models/collection/cards.rb b/app/models/board/cards.rb similarity index 87% rename from app/models/collection/cards.rb rename to app/models/board/cards.rb index 105f4912b..096400957 100644 --- a/app/models/collection/cards.rb +++ b/app/models/board/cards.rb @@ -1,4 +1,4 @@ -module Collection::Cards +module Board::Cards extend ActiveSupport::Concern included do diff --git a/app/models/collection/entropic.rb b/app/models/board/entropic.rb similarity index 93% rename from app/models/collection/entropic.rb rename to app/models/board/entropic.rb index a84e7eb62..b29d5ea42 100644 --- a/app/models/collection/entropic.rb +++ b/app/models/board/entropic.rb @@ -1,4 +1,4 @@ -module Collection::Entropic +module Board::Entropic extend ActiveSupport::Concern included do diff --git a/app/models/board/publication.rb b/app/models/board/publication.rb new file mode 100644 index 000000000..a21fb00b6 --- /dev/null +++ b/app/models/board/publication.rb @@ -0,0 +1,5 @@ +class Board::Publication < ApplicationRecord + belongs_to :board + + has_secure_token :key +end diff --git a/app/models/collection/publishable.rb b/app/models/board/publishable.rb similarity index 65% rename from app/models/collection/publishable.rb rename to app/models/board/publishable.rb index 25b7f3fc7..6c1ce47d4 100644 --- a/app/models/collection/publishable.rb +++ b/app/models/board/publishable.rb @@ -1,14 +1,14 @@ -module Collection::Publishable +module Board::Publishable extend ActiveSupport::Concern included do - has_one :publication, class_name: "Collection::Publication", dependent: :destroy + has_one :publication, class_name: "Board::Publication", dependent: :destroy scope :published, -> { joins(:publication) } end class_methods do def find_by_published_key(key) - Collection::Publication.find_by!(key: key).collection + Board::Publication.find_by!(key: key).board end end diff --git a/app/models/collection/triageable.rb b/app/models/board/triageable.rb similarity index 76% rename from app/models/collection/triageable.rb rename to app/models/board/triageable.rb index a314868c8..3e922b4a2 100644 --- a/app/models/collection/triageable.rb +++ b/app/models/board/triageable.rb @@ -1,4 +1,4 @@ -module Collection::Triageable +module Board::Triageable extend ActiveSupport::Concern included do diff --git a/app/models/card.rb b/app/models/card.rb index 7ac40ca09..65c7cab18 100644 --- a/app/models/card.rb +++ b/app/models/card.rb @@ -3,7 +3,7 @@ class Card < ApplicationRecord Eventable, Golden, Mentions, Multistep, Pinnable, Postponable, Promptable, Readable, Searchable, Stallable, Statuses, Taggable, Triageable, Watchable - belongs_to :collection, touch: true + belongs_to :board, touch: true belongs_to :creator, class_name: "User", default: -> { Current.user } has_many :comments, dependent: :destroy @@ -12,7 +12,7 @@ class Card < ApplicationRecord has_rich_text :description before_save :set_default_title, if: :published? - after_update :handle_collection_change, if: :saved_change_to_collection_id? + after_update :handle_board_change, if: :saved_change_to_board_id? scope :reverse_chronologically, -> { order created_at: :desc, id: :desc } scope :chronologically, -> { order created_at: :asc, id: :asc } @@ -39,16 +39,16 @@ class Card < ApplicationRecord end end - delegate :accessible_to?, to: :collection + delegate :accessible_to?, to: :board def card self end - def move_to(new_collection) + def move_to(new_board) transaction do - card.update!(collection: new_collection) - card.events.update_all(collection_id: new_collection.id) + card.update!(board: new_board) + card.events.update_all(board_id: new_board.id) end end @@ -61,23 +61,23 @@ class Card < ApplicationRecord self.title = "Untitled" if title.blank? end - def handle_collection_change - old_collection = Collection.find_by(id: collection_id_before_last_save) + def handle_board_change + old_board = Board.find_by(id: board_id_before_last_save) transaction do update! column: nil - track_collection_change_event(old_collection.name) - grant_access_to_assignees unless collection.all_access? + track_board_change_event(old_board.name) + grant_access_to_assignees unless board.all_access? end remove_inaccessible_notifications_later end - def track_collection_change_event(old_collection_name) - track_event "collection_changed", particulars: { old_collection: old_collection_name, new_collection: collection.name } + def track_board_change_event(old_board_name) + track_event "board_changed", particulars: { old_board: old_board_name, new_board: board.name } end def grant_access_to_assignees - collection.accesses.grant_to(assignees) + board.accesses.grant_to(assignees) end end diff --git a/app/models/card/entropic.rb b/app/models/card/entropic.rb index 68c0c6aa1..478d4bc52 100644 --- a/app/models/card/entropic.rb +++ b/app/models/card/entropic.rb @@ -4,19 +4,19 @@ module Card::Entropic included do scope :due_to_be_postponed, -> do active - .left_outer_joins(collection: :entropy) + .left_outer_joins(board: :entropy) .where("last_active_at <= DATETIME('now', '-' || COALESCE(entropies.auto_postpone_period, ?) || ' seconds')", Account.sole.entropy.auto_postpone_period) end scope :postponing_soon, -> do active - .left_outer_joins(collection: :entropy) + .left_outer_joins(board: :entropy) .where("last_active_at > DATETIME('now', '-' || COALESCE(entropies.auto_postpone_period, ?) || ' seconds')", Account.sole.entropy.auto_postpone_period) .where("last_active_at <= DATETIME('now', '-' || CAST(COALESCE(entropies.auto_postpone_period, ?) * 0.75 AS INTEGER) || ' seconds')", Account.sole.entropy.auto_postpone_period) end - delegate :auto_postpone_period, to: :collection + delegate :auto_postpone_period, to: :board end class_methods do diff --git a/app/models/card/eventable/system_commenter.rb b/app/models/card/eventable/system_commenter.rb index e74475c79..ace5701bf 100644 --- a/app/models/card/eventable/system_commenter.rb +++ b/app/models/card/eventable/system_commenter.rb @@ -28,8 +28,8 @@ class Card::Eventable::SystemCommenter "Closed as “Not Now” due to inactivity" when "card_title_changed" "#{event.creator.name} changed the title from “#{event.particulars.dig('particulars', 'old_title')}” to “#{event.particulars.dig('particulars', 'new_title')}”." - when "card_collection_changed" - "#{event.creator.name} moved this from “#{event.particulars.dig('particulars', 'old_collection')}” to “#{event.particulars.dig('particulars', 'new_collection')}”." + when "card_board_changed" + "#{event.creator.name} moved this from “#{event.particulars.dig('particulars', 'old_board')}” to “#{event.particulars.dig('particulars', 'new_board')}”." when "card_triaged" "#{event.creator.name} moved this to “#{event.particulars.dig('particulars', 'column')}”" when "card_sent_back_to_triage" diff --git a/app/models/card/promptable.rb b/app/models/card/promptable.rb index efbcd64db..e30816023 100644 --- a/app/models/card/promptable.rb +++ b/app/models/card/promptable.rb @@ -21,8 +21,8 @@ module Card::Promptable * Assigned to: #{assignees.map(&:name).join(", ")} * Column: #{column_prompt_label} * Created at: #{created_at}} - * Collection id: #{collection_id} - * Collection name: #{collection.name} + * Board id: #{board_id} + * Board name: #{board.name} * Number of comments: #{comments.count} * Path: #{card_path(self, script_name: Account.sole.slug)} diff --git a/app/models/card/triageable.rb b/app/models/card/triageable.rb index c324c709b..d15663902 100644 --- a/app/models/card/triageable.rb +++ b/app/models/card/triageable.rb @@ -17,7 +17,7 @@ module Card::Triageable end def triage_into(column) - raise "The column must belong to the card collection" unless collection == column.collection + raise "The column must belong to the card board" unless board == column.board transaction do resume diff --git a/app/models/collection/broadcastable.rb b/app/models/collection/broadcastable.rb deleted file mode 100644 index e44adc0ac..000000000 --- a/app/models/collection/broadcastable.rb +++ /dev/null @@ -1,8 +0,0 @@ -module Collection::Broadcastable - extend ActiveSupport::Concern - - included do - broadcasts_refreshes - broadcasts_refreshes_to ->(_) { :all_collections } - end -end diff --git a/app/models/collection/publication.rb b/app/models/collection/publication.rb deleted file mode 100644 index fbbc68741..000000000 --- a/app/models/collection/publication.rb +++ /dev/null @@ -1,5 +0,0 @@ -class Collection::Publication < ApplicationRecord - belongs_to :collection - - has_secure_token :key -end diff --git a/app/models/column.rb b/app/models/column.rb index 87772367f..ec5fd6217 100644 --- a/app/models/column.rb +++ b/app/models/column.rb @@ -1,10 +1,10 @@ class Column < ApplicationRecord include Positioned - belongs_to :collection, touch: true + belongs_to :board, touch: true has_many :cards, dependent: :nullify before_validation -> { self.color ||= Card::DEFAULT_COLOR } after_save_commit -> { cards.touch_all }, if: -> { saved_change_to_name? || saved_change_to_color? } - after_destroy_commit -> { collection.cards.touch_all } + after_destroy_commit -> { board.cards.touch_all } end diff --git a/app/models/column/positioned.rb b/app/models/column/positioned.rb index 333882e36..8518172de 100644 --- a/app/models/column/positioned.rb +++ b/app/models/column/positioned.rb @@ -16,11 +16,11 @@ module Column::Positioned end def left_column - collection.columns.where("position < ?", position).sorted.last + board.columns.where("position < ?", position).sorted.last end def right_column - collection.columns.where("position > ?", position).sorted.first + board.columns.where("position > ?", position).sorted.first end def leftmost? @@ -33,7 +33,7 @@ module Column::Positioned private def set_position - max_position = collection.columns.maximum(:position) || 0 + max_position = board.columns.maximum(:position) || 0 self.position = max_position + 1 end diff --git a/app/models/comment.rb b/app/models/comment.rb index 703c3e6a9..4428c8e48 100644 --- a/app/models/comment.rb +++ b/app/models/comment.rb @@ -14,7 +14,7 @@ class Comment < ApplicationRecord after_create_commit :watch_card_by_creator - delegate :collection, :watch_by, to: :card + delegate :board, :watch_by, to: :card def to_partial_path "cards/#{super}" diff --git a/app/models/comment/eventable.rb b/app/models/comment/eventable.rb index 0b30c0504..7fe7abebb 100644 --- a/app/models/comment/eventable.rb +++ b/app/models/comment/eventable.rb @@ -17,6 +17,6 @@ module Comment::Eventable end def track_creation - track_event("created", collection: card.collection, creator: creator) + track_event("created", board: card.board, creator: creator) end end diff --git a/app/models/concerns/mentions.rb b/app/models/concerns/mentions.rb index fa50de543..055c114fc 100644 --- a/app/models/concerns/mentions.rb +++ b/app/models/concerns/mentions.rb @@ -41,7 +41,7 @@ module Mentions end def mentionable_users - collection.users + board.users end def rich_text_associations diff --git a/app/models/event.rb b/app/models/event.rb index c45702833..ad77d3492 100644 --- a/app/models/event.rb +++ b/app/models/event.rb @@ -1,7 +1,7 @@ class Event < ApplicationRecord include Notifiable, Particulars, Promptable - belongs_to :collection + belongs_to :board belongs_to :creator, class_name: "User" belongs_to :eventable, polymorphic: true diff --git a/app/models/eventable.rb b/app/models/eventable.rb index e14803f09..c5e58cc08 100644 --- a/app/models/eventable.rb +++ b/app/models/eventable.rb @@ -5,9 +5,9 @@ module Eventable has_many :events, as: :eventable, dependent: :destroy end - def track_event(action, creator: Current.user, collection: self.collection, **particulars) + def track_event(action, creator: Current.user, board: self.board, **particulars) if should_track_event? - collection.events.create!(action: "#{eventable_prefix}_#{action}", creator:, collection:, eventable: self, particulars:) + board.events.create!(action: "#{eventable_prefix}_#{action}", creator:, board:, eventable: self, particulars:) end end diff --git a/app/models/filter.rb b/app/models/filter.rb index 903007c9f..459d18621 100644 --- a/app/models/filter.rb +++ b/app/models/filter.rb @@ -27,7 +27,7 @@ class Filter < ApplicationRecord result = result.unassigned if assignment_status.unassigned? result = result.assigned_to(assignees.ids) if assignees.present? result = result.where(creator_id: creators.ids) if creators.present? - result = result.where(collection: collections.ids) if collections.present? + result = result.where(board: boards.ids) if boards.present? result = result.tagged_with(tags.ids) if tags.present? result = result.where("cards.created_at": creation_window) if creation_window result = result.closed_at_window(closure_window) if closure_window @@ -44,16 +44,16 @@ class Filter < ApplicationRecord self.class.normalize_params(as_params).blank? end - def single_collection - collections.first if collections.one? + def single_board + boards.first if boards.one? end def single_workflow - collections.first.workflow if collections.pluck(:workflow_id).uniq.one? + boards.first.workflow if boards.pluck(:workflow_id).uniq.one? end def cacheable? - collections.exists? + boards.exists? end def cache_key diff --git a/app/models/filter/params.rb b/app/models/filter/params.rb index 166436e4b..586a75885 100644 --- a/app/models/filter/params.rb +++ b/app/models/filter/params.rb @@ -11,7 +11,7 @@ module Filter::Params assignee_ids: [], creator_ids: [], closer_ids: [], - collection_ids: [], + board_ids: [], tag_ids: [], terms: [] ] @@ -40,9 +40,9 @@ module Filter::Params before_save { self.params_digest = self.class.digest_params(as_params) } end - def used?(ignore_collections: false) + def used?(ignore_boards: false) tags.any? || assignees.any? || creators.any? || closers.any? || - terms.any? || card_ids&.any? || (!ignore_collections && collections.present?) || + terms.any? || card_ids&.any? || (!ignore_boards && boards.present?) || assignment_status.unassigned? || !indexed_by.all? || !sorted_by.latest? end @@ -57,7 +57,7 @@ module Filter::Params params[:assignment_status] = assignment_status params[:terms] = terms params[:tag_ids] = tags.ids - params[:collection_ids] = collections.ids + params[:board_ids] = boards.ids params[:card_ids] = card_ids params[:assignee_ids] = assignees.ids params[:creator_ids] = creators.ids diff --git a/app/models/filter/resources.rb b/app/models/filter/resources.rb index 3dc777b2f..f7045f38e 100644 --- a/app/models/filter/resources.rb +++ b/app/models/filter/resources.rb @@ -3,7 +3,7 @@ module Filter::Resources included do has_and_belongs_to_many :tags - has_and_belongs_to_many :collections + has_and_belongs_to_many :boards has_and_belongs_to_many :assignees, class_name: "User", join_table: "assignees_filters", association_foreign_key: "assignee_id" has_and_belongs_to_many :creators, class_name: "User", join_table: "creators_filters", association_foreign_key: "creator_id" has_and_belongs_to_many :closers, class_name: "User", join_table: "closers_filters", association_foreign_key: "closer_id" @@ -17,19 +17,19 @@ module Filter::Resources destroy! end - def collections - creator.collections.where id: super.ids + def boards + creator.boards.where id: super.ids end - def collection_titles - if collections.none? - Collection.one? ? [ Collection.first.name ] : [ "all boards" ] + def board_titles + if boards.none? + Board.one? ? [ Board.first.name ] : [ "all boards" ] else - collections.map(&:name) + boards.map(&:name) end end - def collections_label - collection_titles.to_sentence + def boards_label + board_titles.to_sentence end end diff --git a/app/models/notifier/card_event_notifier.rb b/app/models/notifier/card_event_notifier.rb index f6801d7ec..570989566 100644 --- a/app/models/notifier/card_event_notifier.rb +++ b/app/models/notifier/card_event_notifier.rb @@ -1,6 +1,6 @@ class Notifier::CardEventNotifier < Notifier delegate :creator, to: :source - delegate :collection, to: :card + delegate :board, to: :card private def recipients @@ -8,11 +8,11 @@ class Notifier::CardEventNotifier < Notifier when "card_assigned" source.assignees.excluding(creator) when "card_published" - collection.watchers.without(creator, *card.mentionees) + board.watchers.without(creator, *card.mentionees) when "comment_created" card.watchers.without(creator, *source.eventable.mentionees) else - collection.watchers.without(creator) + board.watchers.without(creator) end end diff --git a/app/models/search.rb b/app/models/search.rb index a51e757f6..518462094 100644 --- a/app/models/search.rb +++ b/app/models/search.rb @@ -21,7 +21,7 @@ class Search "highlight(cards_search_index, 0, '#{HIGHLIGHT_OPENING_MARK}', '#{HIGHLIGHT_CLOSING_MARK}') AS card_title", "snippet(cards_search_index, 1, '#{HIGHLIGHT_OPENING_MARK}', '#{HIGHLIGHT_CLOSING_MARK}', '...', 20) AS card_description", "null as comment_body", - "collections.name as collection_name", + "boards.name as board_name", "cards.creator_id", "cards.created_at", "bm25(cards_search_index, 10.0, 2.0) AS score" @@ -34,7 +34,7 @@ class Search "cards.title AS card_title", "null AS card_description", "snippet(comments_search_index, 0, '#{HIGHLIGHT_OPENING_MARK}', '#{HIGHLIGHT_CLOSING_MARK}', '...', 20) AS comment_body", - "collections.name as collection_name", + "boards.name as board_name", "comments.creator_id", "comments.created_at", "bm25(comments_search_index, 1.0) AS score" diff --git a/app/models/user/accessor.rb b/app/models/user/accessor.rb index c538c87a4..a7826b0b4 100644 --- a/app/models/user/accessor.rb +++ b/app/models/user/accessor.rb @@ -3,15 +3,15 @@ module User::Accessor included do has_many :accesses, dependent: :destroy - has_many :collections, through: :accesses - has_many :accessible_cards, through: :collections, source: :cards + has_many :boards, through: :accesses + has_many :accessible_cards, through: :boards, source: :cards has_many :accessible_comments, through: :accessible_cards, source: :comments - after_create_commit :grant_access_to_collections, unless: :system? + after_create_commit :grant_access_to_boards, unless: :system? end private - def grant_access_to_collections - Access.insert_all Collection.all_access.pluck(:id).collect { |collection_id| { collection_id: collection_id, user_id: id } } + def grant_access_to_boards + Access.insert_all Board.all_access.pluck(:id).collect { |board_id| { board_id: board_id, user_id: id } } end end diff --git a/app/models/user/day_timeline.rb b/app/models/user/day_timeline.rb index ec3d53760..367eccdcb 100644 --- a/app/models/user/day_timeline.rb +++ b/app/models/user/day_timeline.rb @@ -41,6 +41,7 @@ class User::DayTimeline card_closed card_reopened card_collection_changed + card_board_changed card_postponed card_triaged card_sent_back_to_triage @@ -57,12 +58,12 @@ class User::DayTimeline def timelineable_events Event - .where(collection: collections) + .where(board: boards) .where(action: TIMELINEABLE_ACTIONS) end - def collections - filter.collections.presence || user.collections + def boards + filter.boards.presence || user.boards end def latest_event_before diff --git a/app/models/user/filtering.rb b/app/models/user/filtering.rb index fdc7f2bcb..4ac9cf86a 100644 --- a/app/models/user/filtering.rb +++ b/app/models/user/filtering.rb @@ -1,23 +1,23 @@ class User::Filtering attr_reader :user, :filter, :expanded - delegate :as_params, :single_collection, to: :filter + delegate :as_params, :single_board, to: :filter delegate :only_closed?, to: :filter def initialize(user, filter, expanded: false) @user, @filter, @expanded = user, filter, expanded end - def collections - @collections ||= user.collections.ordered_by_recently_accessed + def boards + @boards ||= user.boards.ordered_by_recently_accessed end - def selected_collection_titles - filter.collection_titles + def selected_board_titles + filter.board_titles end - def selected_collections_label - filter.collections_label + def selected_boards_label + filter.boards_label end def tags @@ -37,7 +37,7 @@ class User::Filtering end def any? - filter.used?(ignore_collections: true) + filter.used?(ignore_boards: true) end def show_indexed_by? @@ -65,16 +65,16 @@ class User::Filtering filter.closers.any? end - def show_collections? - filter.collections.any? + def show_boards? + filter.boards.any? end - def single_collection_or_first + def single_board_or_first # Default to the first selected or, when no selection, to the first one - filter.collections.first || collections.first + filter.boards.first || boards.first end def cache_key - ActiveSupport::Cache.expand_cache_key([ user, filter, expanded?, collections, tags, users, filters ], "user-filtering") + ActiveSupport::Cache.expand_cache_key([ user, filter, expanded?, boards, tags, users, filters ], "user-filtering") end end diff --git a/app/models/user/role.rb b/app/models/user/role.rb index aaa4bd5ff..a327ffcf6 100644 --- a/app/models/user/role.rb +++ b/app/models/user/role.rb @@ -21,4 +21,12 @@ module User::Role def can_administer?(other = nil) admin? && other != self end + + def can_administer_board?(board) + admin? || board.creator == self + end + + def can_administer_card?(card) + admin? || card.creator == self + end end diff --git a/app/models/user/timelined.rb b/app/models/user/timelined.rb index 1f5f2c8fe..2cd808a44 100644 --- a/app/models/user/timelined.rb +++ b/app/models/user/timelined.rb @@ -2,7 +2,7 @@ module User::Timelined extend ActiveSupport::Concern included do - has_many :accessible_events, through: :collections, source: :events + has_many :accessible_events, through: :boards, source: :events end def timeline_for(day, filter:) diff --git a/app/models/webhook.rb b/app/models/webhook.rb index 1af19cd47..f66cc6942 100644 --- a/app/models/webhook.rb +++ b/app/models/webhook.rb @@ -11,7 +11,7 @@ class Webhook < ApplicationRecord card_closed card_postponed card_auto_postponed - card_collection_changed + card_board_changed card_published card_reopened card_sent_back_to_triage @@ -25,7 +25,7 @@ class Webhook < ApplicationRecord has_many :deliveries, dependent: :delete_all has_one :delinquency_tracker, dependent: :delete - belongs_to :collection + belongs_to :board serialize :subscribed_actions, type: Array, coder: JSON diff --git a/app/models/webhook/triggerable.rb b/app/models/webhook/triggerable.rb index a2f5ea186..443c801fd 100644 --- a/app/models/webhook/triggerable.rb +++ b/app/models/webhook/triggerable.rb @@ -2,7 +2,7 @@ module Webhook::Triggerable extend ActiveSupport::Concern included do - scope :triggered_by, ->(event) { where(collection: event.collection).triggered_by_action(event.action) } + scope :triggered_by, ->(event) { where(board: event.board).triggered_by_action(event.action) } scope :triggered_by_action, ->(action) { where("subscribed_actions LIKE ?", "%\"#{action}\"%") } end diff --git a/app/views/collections/_access_toggle.erb b/app/views/boards/_access_toggle.erb similarity index 86% rename from app/views/collections/_access_toggle.erb rename to app/views/boards/_access_toggle.erb index 829efa05e..6d9541f3a 100644 --- a/app/views/collections/_access_toggle.erb +++ b/app/views/boards/_access_toggle.erb @@ -13,8 +13,8 @@ diff --git a/app/views/boards/_board.json.jbuilder b/app/views/boards/_board.json.jbuilder new file mode 100644 index 000000000..ce2ef0451 --- /dev/null +++ b/app/views/boards/_board.json.jbuilder @@ -0,0 +1,8 @@ +json.cache! board do + json.(board, :id, :name, :all_access) + json.created_at board.created_at.utc + + json.creator do + json.partial! "users/user", user: board.creator + end +end diff --git a/app/views/collections/columns/_list.html.erb b/app/views/boards/columns/_list.html.erb similarity index 100% rename from app/views/collections/columns/_list.html.erb rename to app/views/boards/columns/_list.html.erb diff --git a/app/views/collections/columns/closeds/show.html.erb b/app/views/boards/columns/closeds/show.html.erb similarity index 74% rename from app/views/collections/columns/closeds/show.html.erb rename to app/views/boards/columns/closeds/show.html.erb index 853e02087..9aeb21044 100644 --- a/app/views/collections/columns/closeds/show.html.erb +++ b/app/views/boards/columns/closeds/show.html.erb @@ -2,10 +2,10 @@ <% content_for :header do %>
- <%= link_to @collection, class: "btn borderless txt-medium", data: { controller: "hotkey", action: "keydown.esc@document->hotkey#click" } do %> + <%= link_to @board, class: "btn borderless txt-medium", data: { controller: "hotkey", action: "keydown.esc@document->hotkey#click" } do %> ← - <%= @collection.name %> + <%= @board.name %> <% end %>
@@ -19,7 +19,7 @@ <%= turbo_frame_tag :closed_column do %> <% if @page.used? %> <%= with_automatic_pagination :closed_column, @page do %> - <%= render "collections/columns/list", cards: @page.records, draggable: true %> + <%= render "boards/columns/list", cards: @page.records, draggable: true %> <% end %> <% else %>
diff --git a/app/views/boards/columns/create.turbo_stream.erb b/app/views/boards/columns/create.turbo_stream.erb new file mode 100644 index 000000000..957547c09 --- /dev/null +++ b/app/views/boards/columns/create.turbo_stream.erb @@ -0,0 +1 @@ +<%= turbo_stream.before("closed-cards", partial: "boards/show/column", method: :morph, locals: { column: @column }) %> diff --git a/app/views/collections/columns/destroy.turbo_stream.erb b/app/views/boards/columns/destroy.turbo_stream.erb similarity index 100% rename from app/views/collections/columns/destroy.turbo_stream.erb rename to app/views/boards/columns/destroy.turbo_stream.erb diff --git a/app/views/collections/columns/not_nows/show.html.erb b/app/views/boards/columns/not_nows/show.html.erb similarity index 74% rename from app/views/collections/columns/not_nows/show.html.erb rename to app/views/boards/columns/not_nows/show.html.erb index 4b0bed5e7..4bd6a0524 100644 --- a/app/views/collections/columns/not_nows/show.html.erb +++ b/app/views/boards/columns/not_nows/show.html.erb @@ -2,10 +2,10 @@ <% content_for :header do %>
- <%= link_to @collection, class: "btn borderless txt-medium", data: { controller: "hotkey", action: "keydown.esc@document->hotkey#click" } do %> + <%= link_to @board, class: "btn borderless txt-medium", data: { controller: "hotkey", action: "keydown.esc@document->hotkey#click" } do %> ← - <%= @collection.name %> + <%= @board.name %> <% end %>
@@ -19,7 +19,7 @@ <%= turbo_frame_tag :not_now_column do %> <% if @page.used? %> <%= with_automatic_pagination :not_now_column, @page do %> - <%= render "collections/columns/list", cards: @page.records, draggable: true %> + <%= render "boards/columns/list", cards: @page.records, draggable: true %> <% end %> <% else %>
diff --git a/app/views/collections/columns/show.html.erb b/app/views/boards/columns/show.html.erb similarity index 74% rename from app/views/collections/columns/show.html.erb rename to app/views/boards/columns/show.html.erb index 989965939..4c29f5099 100644 --- a/app/views/collections/columns/show.html.erb +++ b/app/views/boards/columns/show.html.erb @@ -2,10 +2,10 @@ <% content_for :header do %>
- <%= link_to @column.collection, class: "btn borderless txt-medium", data: { controller: "hotkey", action: "keydown.esc@document->hotkey#click" } do %> + <%= link_to @column.board, class: "btn borderless txt-medium", data: { controller: "hotkey", action: "keydown.esc@document->hotkey#click" } do %> ← - <%= @column.collection.name %> + <%= @column.board.name %> <% end %>
@@ -19,7 +19,7 @@ <%= turbo_frame_tag dom_id(@column, :cards) do %> <% if @page.used? %> <%= with_automatic_pagination dom_id(@column, :cards), @page do %> - <%= render "collections/columns/list", cards: @page.records, draggable: true %> + <%= render "boards/columns/list", cards: @page.records, draggable: true %> <% end %> <% else %>
diff --git a/app/views/collections/columns/streams/show.html.erb b/app/views/boards/columns/streams/show.html.erb similarity index 72% rename from app/views/collections/columns/streams/show.html.erb rename to app/views/boards/columns/streams/show.html.erb index 0be3bdde1..59e929464 100644 --- a/app/views/collections/columns/streams/show.html.erb +++ b/app/views/boards/columns/streams/show.html.erb @@ -2,10 +2,10 @@ <% content_for :header do %>
- <%= link_to @collection, class: "btn borderless txt-medium", data: { controller: "hotkey", action: "keydown.esc@document->hotkey#click" } do %> + <%= link_to @board, class: "btn borderless txt-medium", data: { controller: "hotkey", action: "keydown.esc@document->hotkey#click" } do %> ← - <%= @collection.name %> + <%= @board.name %> <% end %>
@@ -19,7 +19,7 @@ <%= turbo_frame_tag :stream_column do %> <% if @page.used? %> <%= with_automatic_pagination :stream_column, @page do %> - <%= render "collections/columns/list", cards: @page.records, draggable: true %> + <%= render "boards/columns/list", cards: @page.records, draggable: true %> <% end %> <% else %>
diff --git a/app/views/boards/columns/update.turbo_stream.erb b/app/views/boards/columns/update.turbo_stream.erb new file mode 100644 index 000000000..88cd716d1 --- /dev/null +++ b/app/views/boards/columns/update.turbo_stream.erb @@ -0,0 +1 @@ +<%= turbo_stream.replace(dom_id(@column), partial: "boards/show/column", method: :morph, locals: { column: @column }) %> diff --git a/app/views/boards/edit.html.erb b/app/views/boards/edit.html.erb new file mode 100644 index 000000000..206bc5ed5 --- /dev/null +++ b/app/views/boards/edit.html.erb @@ -0,0 +1,38 @@ +<% @page_title = "Board Settings" %> + +<% content_for :header do %> +
+ <%= link_to @board, class: "btn borderless txt-medium", data: { controller: "hotkey", action: "keydown.esc@document->hotkey#click" } do %> + + ← + <%= @board.name %> + + <% end %> +
+ +

<%= @page_title %>

+<% end %> + +
+
+ <%= form_with model: @board, class: "display-contents", data: { + controller: "form boards-form", + boards_form_self_removal_prompt_message_value: "Are you sure you want to remove yourself from this board? You won’t be able to get back in unless someone invites you.", + action: "turbo:submit-start->boards-form#submitWithWarning" } do |form| %> + <%= render "boards/edit/name", form: form %> + <%= render "boards/edit/users", board: @board, selected_users: @selected_users, unselected_users: @unselected_users, form: form %> + + + + <%= link_to "Cancel and go back", @board, data: { form_target: "cancel", turbo_frame: "_top" }, hidden: true %> + <% end %> +
+ +
+ <%= render "boards/edit/auto_close", board: @board %> + <%= render "boards/edit/publication", board: @board %> + <%= render "boards/edit/delete", board: @board %> +
+
diff --git a/app/views/collections/edit/_auto_close.html.erb b/app/views/boards/edit/_auto_close.html.erb similarity index 66% rename from app/views/collections/edit/_auto_close.html.erb rename to app/views/boards/edit/_auto_close.html.erb index e7e135d8d..d903ddacd 100644 --- a/app/views/collections/edit/_auto_close.html.erb +++ b/app/views/boards/edit/_auto_close.html.erb @@ -1,7 +1,7 @@ -<%= turbo_frame_tag @collection, :entropy do %> +<%= turbo_frame_tag @board, :entropy do %>

Auto close

Fizzy doesn’t let stale cards stick around forever. Cards automatically close as “Not now” if no one updates, comments, or moves a card for…

- <%= render "entropy/auto_close", model: collection, url: collection_entropy_path(collection) %> + <%= render "entropy/auto_close", model: board, url: board_entropy_path(board) %>
<% end %> diff --git a/app/views/collections/edit/_delete.html.erb b/app/views/boards/edit/_delete.html.erb similarity index 68% rename from app/views/collections/edit/_delete.html.erb rename to app/views/boards/edit/_delete.html.erb index 627bfd1bd..7da3ee6c8 100644 --- a/app/views/collections/edit/_delete.html.erb +++ b/app/views/boards/edit/_delete.html.erb @@ -1,4 +1,4 @@ -<%= form_with model: collection, class: "txt-align-center margin-block-start-auto", method: :delete do |form| %> +<%= form_with model: board, class: "txt-align-center margin-block-start-auto", method: :delete do |form| %> <%= form.button class: "btn txt-negative borderless txt-small", data: { turbo_confirm: "Are you sure you want to permanently delete this board?" } do %> <%= icon_tag "trash" %> Delete this board diff --git a/app/views/collections/edit/_knob.html.erb b/app/views/boards/edit/_knob.html.erb similarity index 100% rename from app/views/collections/edit/_knob.html.erb rename to app/views/boards/edit/_knob.html.erb diff --git a/app/views/collections/edit/_name.html.erb b/app/views/boards/edit/_name.html.erb similarity index 71% rename from app/views/collections/edit/_name.html.erb rename to app/views/boards/edit/_name.html.erb index 1ff825380..e238a838e 100644 --- a/app/views/collections/edit/_name.html.erb +++ b/app/views/boards/edit/_name.html.erb @@ -1,6 +1,6 @@
diff --git a/app/views/collections/edit/_publication.html.erb b/app/views/boards/edit/_publication.html.erb similarity index 75% rename from app/views/collections/edit/_publication.html.erb rename to app/views/boards/edit/_publication.html.erb index 0673bd043..68902e19e 100644 --- a/app/views/collections/edit/_publication.html.erb +++ b/app/views/boards/edit/_publication.html.erb @@ -1,15 +1,15 @@ -<%= turbo_frame_tag @collection, :publication do %> +<%= turbo_frame_tag @board, :publication do %>

Public link

Turn on the Public link to share this board with anyone in the world. They won’t need to log in and they won’t be able to see anything else in Fizzy.
- <% if collection.published? %> + <% if board.published? %>
<%= icon_tag "lock" %>
- <%= text_field_tag :publication_url, published_collection_url(collection), readonly: true, class: "full-width input fill-white" %> + <%= text_field_tag :publication_url, published_board_url(board), readonly: true, class: "full-width input fill-white" %>
- <%= button_to_copy_to_clipboard(published_collection_url(collection)) do %> + <%= button_to_copy_to_clipboard(published_board_url(board)) do %> <%= icon_tag "copy-paste" %> Copy public link <% end %> @@ -29,9 +29,9 @@
Add an optional description to the public page
- <%= form_with model: collection, class: "txt-align-start", data: { controller: "form", turbo_frame: "_top" } do |form| %> + <%= form_with model: board, class: "txt-align-start", data: { controller: "form", turbo_frame: "_top" } do |form| %> <%= form.rich_textarea :public_description, class: "rich-text-content txt-small", - placeholder: "Add a public note about this collection…", + placeholder: "Add a public note about this board…", data: { action: "keydown.ctrl+enter->form#submit:prevent keydown.meta+enter->form#submit:prevent keydown.esc->form#cancel:stop" } %> <%= form.button "Save changes", type: :submit, class: "btn txt-small" %> <% end %> @@ -42,7 +42,7 @@
<%= icon_tag "lock" %>
    - <%= access_toggles_for selected_users, selected: true %> - <%= access_toggles_for unselected_users, selected: false %> + <%= access_toggles_for selected_users, selected: true, disabled: !Current.user.can_administer_board?(board) %> + <%= access_toggles_for unselected_users, selected: false, disabled: !Current.user.can_administer_board?(board) %>
<% end %> diff --git a/app/views/boards/entropies/update.turbo_stream.erb b/app/views/boards/entropies/update.turbo_stream.erb new file mode 100644 index 000000000..ad6fc204a --- /dev/null +++ b/app/views/boards/entropies/update.turbo_stream.erb @@ -0,0 +1,2 @@ +<%= turbo_stream.replace([ @board, :entropy ], partial: "boards/edit/auto_close", locals:{ board: @board }) %> +<%= turbo_stream_flash(notice: "Saved") %> diff --git a/app/views/boards/involvements/update.html.erb b/app/views/boards/involvements/update.html.erb new file mode 100644 index 000000000..9ebd0cdf7 --- /dev/null +++ b/app/views/boards/involvements/update.html.erb @@ -0,0 +1 @@ +<%= access_involvement_advance_button(@board, Current.user, show_watchers: params[:show_watchers] == "true", icon_only: params[:icon_only] == "true") %> diff --git a/app/views/collections/new.html.erb b/app/views/boards/new.html.erb similarity index 85% rename from app/views/collections/new.html.erb rename to app/views/boards/new.html.erb index 05ffb3b8c..57c809b17 100644 --- a/app/views/collections/new.html.erb +++ b/app/views/boards/new.html.erb @@ -1,7 +1,7 @@ <% @page_title = "Create a new board" %>
- <%= form_with model: @collection, class: "flex flex-column gap", data: { controller: "form" } do |form| %> + <%= form_with model: @board, class: "flex flex-column gap", data: { controller: "form" } do |form| %>

<%= @page_title %>

<%= form.text_field :name, required: true, class: "input full-width", autofocus: true, autocomplete: "off",placeholder: "Name it…", data: { action: "keydown.esc@document->form#cancel" } %> diff --git a/app/views/boards/publications/create.turbo_stream.erb b/app/views/boards/publications/create.turbo_stream.erb new file mode 100644 index 000000000..01e60d4c4 --- /dev/null +++ b/app/views/boards/publications/create.turbo_stream.erb @@ -0,0 +1,2 @@ +<%= turbo_stream.replace([ @board, :publication ], partial: "boards/edit/publication", locals:{ board: @board }) %> +<%= turbo_stream_flash(notice: "Saved") %> diff --git a/app/views/boards/publications/destroy.turbo_stream.erb b/app/views/boards/publications/destroy.turbo_stream.erb new file mode 100644 index 000000000..01e60d4c4 --- /dev/null +++ b/app/views/boards/publications/destroy.turbo_stream.erb @@ -0,0 +1,2 @@ +<%= turbo_stream.replace([ @board, :publication ], partial: "boards/edit/publication", locals:{ board: @board }) %> +<%= turbo_stream_flash(notice: "Saved") %> diff --git a/app/views/boards/show.html.erb b/app/views/boards/show.html.erb new file mode 100644 index 000000000..bd3266ac3 --- /dev/null +++ b/app/views/boards/show.html.erb @@ -0,0 +1,30 @@ +<% @page_title = @board.name %> +<% turbo_exempts_page_from_cache %> + +<%= turbo_stream_from @board %> + +<% content_for :header do %> +
+ <%= link_to_webhooks(@board) if Current.user.admin? %> +
+ +

+ <%= @board.name %> +

+ +
+ <%= link_to_edit_board @board %> +
+<% end %> + +<%= render "filters/settings", filter_url: board_path(@board), user_filtering: @user_filtering, no_filtering_url: board_path(@board) do |form| %> + <%= hidden_field_tag "board_ids[]", @board.id %> +<% end %> + +<%= turbo_frame_tag :cards_container do %> + <% if @filter.used?(ignore_boards: true) %> + <%= render "boards/show/filtered_cards", page: @page %> + <% else %> + <%= render "boards/show/columns", page: @page, board: @board %> + <% end %> +<% end %> diff --git a/app/views/collections/show/_closed.html.erb b/app/views/boards/show/_closed.html.erb similarity index 56% rename from app/views/collections/show/_closed.html.erb rename to app/views/boards/show/_closed.html.erb index 383bba6db..0b1d8c863 100644 --- a/app/views/collections/show/_closed.html.erb +++ b/app/views/boards/show/_closed.html.erb @@ -6,9 +6,9 @@ data-drag-and-drop-url="<%= columns_card_drops_closure_path("__id__") %>" > - <%= render "collections/show/expander", title: "Done", count: collection.cards.closed.count, column_id: "closed-cards" do %> - <%= render "collections/show/menu/expand", column_path: collection_columns_closed_path(collection) %> + <%= render "boards/show/expander", title: "Done", count: board.cards.closed.count, column_id: "closed-cards" do %> + <%= render "boards/show/menu/expand", column_path: board_columns_closed_path(board) %> <% end %> - <%= column_frame_tag :closed_column, src: collection_columns_closed_path(collection) %> + <%= column_frame_tag :closed_column, src: board_columns_closed_path(board) %> diff --git a/app/views/collections/show/_column.html.erb b/app/views/boards/show/_column.html.erb similarity index 58% rename from app/views/collections/show/_column.html.erb rename to app/views/boards/show/_column.html.erb index 3a6084b0c..7630ce3fe 100644 --- a/app/views/collections/show/_column.html.erb +++ b/app/views/boards/show/_column.html.erb @@ -7,14 +7,14 @@ data-action="turbo:before-morph-attribute->collapsible-columns#preventToggle turbo:before-stream-render@document->collapsible-columns#restoreState" data-drag-and-drop-url="<%= columns_card_drops_column_path("__id__", column_id: column.id) %>" > - <%= render "collections/show/expander", title: column.name, count: column.cards.active.count, column_id: dom_id(column) do %> - <%= render "collections/show/menu/column", column: column %> + <%= render "boards/show/expander", title: column.name, count: column.cards.active.count, column_id: dom_id(column) do %> + <%= render "boards/show/menu/column", column: column %> <% end %> - <%= link_to collection_column_path(column.collection, column), class: "cards__expander-button btn btn--circle txt-x-small borderless", data: { turbo_frame: "_top" } do %> + <%= link_to board_column_path(column.board, column), class: "cards__expander-button btn btn--circle txt-x-small borderless", data: { turbo_frame: "_top" } do %> <%= icon_tag "expand", class: "translucent" %> Expand column <% end %> - <%= column_frame_tag dom_id(column, :cards), src: collection_column_path(column.collection, column) %> + <%= column_frame_tag dom_id(column, :cards), src: board_column_path(column.board, column) %> diff --git a/app/views/boards/show/_columns.html.erb b/app/views/boards/show/_columns.html.erb new file mode 100644 index 000000000..a2a406aff --- /dev/null +++ b/app/views/boards/show/_columns.html.erb @@ -0,0 +1,26 @@ +<%= tag.div data: { + controller: "drag-and-drop drag-and-strum", + drag_and_drop_dragged_item_class: "drag-and-drop__dragged-item", + drag_and_drop_hover_container_class: "drag-and-drop__hover-container", + action: " + dragstart->drag-and-drop#dragStart + dragover->drag-and-drop#dragOver + dragenter->drag-and-strum#dragEnter + drop->drag-and-drop#drop + dragend->drag-and-drop#dragEnd" } do %> +
+
+ <%= render "boards/show/not_now", board: board %> +
+ + <%= render "boards/show/stream", board: board, page: page %> + +
+ <%= render partial: "boards/show/column", collection: board.columns.sorted, cached: ->(column){ [ column, column.leftmost?, column.rightmost? ] } %> + <%= render "boards/show/closed", board: board %> + + <%= render "boards/show/menu/columns", board: board %> +
+
+<% end %> + diff --git a/app/views/collections/show/_expander.html.erb b/app/views/boards/show/_expander.html.erb similarity index 100% rename from app/views/collections/show/_expander.html.erb rename to app/views/boards/show/_expander.html.erb diff --git a/app/views/collections/show/_filtered_cards.html.erb b/app/views/boards/show/_filtered_cards.html.erb similarity index 100% rename from app/views/collections/show/_filtered_cards.html.erb rename to app/views/boards/show/_filtered_cards.html.erb diff --git a/app/views/collections/show/_not_now.html.erb b/app/views/boards/show/_not_now.html.erb similarity index 56% rename from app/views/collections/show/_not_now.html.erb rename to app/views/boards/show/_not_now.html.erb index c99b9b3af..cdb40fe79 100644 --- a/app/views/collections/show/_not_now.html.erb +++ b/app/views/boards/show/_not_now.html.erb @@ -6,9 +6,9 @@ data-drag-and-drop-url="<%= columns_card_drops_not_now_path("__id__") %>" > - <%= render "collections/show/expander", title: "Not Now", count: collection.cards.postponed.count, column_id: "not-now" do %> - <%= render "collections/show/menu/expand", column_path: collection_columns_not_now_path(collection) %> + <%= render "boards/show/expander", title: "Not Now", count: board.cards.postponed.count, column_id: "not-now" do %> + <%= render "boards/show/menu/expand", column_path: board_columns_not_now_path(board) %> <% end %> - <%= column_frame_tag :not_now_column, src: collection_columns_not_now_path(collection) %> + <%= column_frame_tag :not_now_column, src: board_columns_not_now_path(board) %> diff --git a/app/views/collections/show/_stream.html.erb b/app/views/boards/show/_stream.html.erb similarity index 65% rename from app/views/collections/show/_stream.html.erb rename to app/views/boards/show/_stream.html.erb index a1985a3f2..f8b9cd81f 100644 --- a/app/views/collections/show/_stream.html.erb +++ b/app/views/boards/show/_stream.html.erb @@ -4,17 +4,17 @@ data-drag-and-drop-url="<%= columns_card_drops_stream_path("__id__") %>">

Maybe?

- <%= link_to collection_columns_stream_path(collection), class: "cards__expander-button btn btn--circle txt-x-small borderless", data: { turbo_frame: "_top" } do %> + <%= link_to board_columns_stream_path(board), class: "cards__expander-button btn btn--circle txt-x-small borderless", data: { turbo_frame: "_top" } do %> <%= icon_tag "expand", class: "translucent" %> Expand column <% end %>
- <%= render "columns/show/add_card_button", collection: collection %> + <%= render "columns/show/add_card_button", board: board %> <% if page.used? %> <%= with_automatic_pagination "the-stream", @page do %> - <%= render "collections/columns/list", cards: page.records, draggable: true %> + <%= render "boards/columns/list", cards: page.records, draggable: true %> <% end %> <% end %> diff --git a/app/views/collections/show/menu/_column.html.erb b/app/views/boards/show/menu/_column.html.erb similarity index 92% rename from app/views/collections/show/menu/_column.html.erb rename to app/views/boards/show/menu/_column.html.erb index 25c6085a4..52637cce4 100644 --- a/app/views/collections/show/menu/_column.html.erb +++ b/app/views/boards/show/menu/_column.html.erb @@ -33,7 +33,7 @@
diff --git a/app/views/collections/show/menu/_column_form.html.erb b/app/views/boards/show/menu/_column_form.html.erb similarity index 83% rename from app/views/collections/show/menu/_column_form.html.erb rename to app/views/boards/show/menu/_column_form.html.erb index 7b7ee4c44..b42549d3c 100644 --- a/app/views/collections/show/menu/_column_form.html.erb +++ b/app/views/boards/show/menu/_column_form.html.erb @@ -1,4 +1,4 @@ -<%= form_with model: [collection, column], data: { controller: "form", action: "turbo:submit-end->dialog#close turbo:submit-end->form#reset" } do |form| %> +<%= form_with model: [board, column], data: { controller: "form", action: "turbo:submit-end->dialog#close turbo:submit-end->form#reset" } do |form| %> <%= form.text_field :name, class: "input", placeholder: "Name this column", value: column.name, required: true, autocomplete: "off", pattern: ".*\\S.*", title: "Column name cannot be blank", data: { action: "focus->form#select" } %> diff --git a/app/views/collections/show/menu/_columns.html.erb b/app/views/boards/show/menu/_columns.html.erb similarity index 81% rename from app/views/collections/show/menu/_columns.html.erb rename to app/views/boards/show/menu/_columns.html.erb index a02b23742..6d0ab0c90 100644 --- a/app/views/collections/show/menu/_columns.html.erb +++ b/app/views/boards/show/menu/_columns.html.erb @@ -3,6 +3,6 @@ <%= icon_tag "add", class: "translucent" %> - <%= render "collections/show/menu/column_form", collection: collection, column: Column.new, label: "Add column" %> + <%= render "boards/show/menu/column_form", board: board, column: Column.new, label: "Add column" %>
diff --git a/app/views/collections/show/menu/_expand.html.erb b/app/views/boards/show/menu/_expand.html.erb similarity index 100% rename from app/views/collections/show/menu/_expand.html.erb rename to app/views/boards/show/menu/_expand.html.erb diff --git a/app/views/cards/_broadcasts.html.erb b/app/views/cards/_broadcasts.html.erb index e3a285f05..87c21e05d 100644 --- a/app/views/cards/_broadcasts.html.erb +++ b/app/views/cards/_broadcasts.html.erb @@ -1,7 +1,7 @@ -<% if filter.collections.any? %> - <% filter.collections.each do |collection| %> - <%= turbo_stream_from collection %> +<% if filter.boards.any? %> + <% filter.boards.each do |board| %> + <%= turbo_stream_from board %> <% end %> <% else %> - <%= turbo_stream_from :all_collections %> + <%= turbo_stream_from :all_boards %> <% end %> diff --git a/app/views/cards/_card.json.jbuilder b/app/views/cards/_card.json.jbuilder index 8bb61330c..1fa339328 100644 --- a/app/views/cards/_card.json.jbuilder +++ b/app/views/cards/_card.json.jbuilder @@ -8,8 +8,8 @@ json.cache! [ card, card.column&.color ] do json.url card_url(card) - json.collection do - json.partial! "collections/collection", locals: { collection: card.collection } + json.board do + json.partial! "boards/board", locals: { board: card.board } end json.column do diff --git a/app/views/cards/_container.html.erb b/app/views/cards/_container.html.erb index 935bd05ec..821211be9 100644 --- a/app/views/cards/_container.html.erb +++ b/app/views/cards/_container.html.erb @@ -8,7 +8,7 @@
<%= card_article_tag card, class: "card" do %>
- <%= render "cards/display/perma/collection", card: card %> + <%= render "cards/display/perma/board", card: card %> <%= render "cards/display/perma/tags", card: card %>
diff --git a/app/views/cards/_messages.html.erb b/app/views/cards/_messages.html.erb index 144be94cc..c92c94f7c 100644 --- a/app/views/cards/_messages.html.erb +++ b/app/views/cards/_messages.html.erb @@ -6,8 +6,10 @@ <%= render "cards/comments/watchers", card: card %> <% end %> -
-
- <%= button_to_delete_card(@card) %> -
+ <% if Current.user.can_administer_card?(card) %> +
+
+ <%= button_to_delete_card(card) %> +
+ <% end %> <% end %> diff --git a/app/views/cards/collections/edit.html.erb b/app/views/cards/boards/edit.html.erb similarity index 77% rename from app/views/cards/collections/edit.html.erb rename to app/views/cards/boards/edit.html.erb index 9a9ef4130..265dc0a9e 100644 --- a/app/views/cards/collections/edit.html.erb +++ b/app/views/cards/boards/edit.html.erb @@ -1,4 +1,4 @@ -<%= turbo_frame_tag "collection_picker" do %> +<%= turbo_frame_tag "board_picker" do %> <%= tag.div class: "max-width full-width", data: { action: "turbo:before-cache@document->dialog#close dialog:show@document->navigable-list#reset keydown->navigable-list#navigate filter:changed->navigable-list#reset", controller: "filter navigable-list", @@ -11,12 +11,12 @@ type: "search", autocorrect: "off", autocomplete: "off", data: { "1p-ignore": "true", filter_target: "input", action: "input->filter#filter" } %>