# 画面設計書 12-ボード設定画面

## 概要

本ドキュメントは、Fizzyアプリケーションにおける「ボード設定画面」の設計書です。ボードの名前、アクセス権限、自動延期設定、公開設定、削除などのボード管理機能を提供する画面仕様を定義します。

### 本画面の処理概要

本画面では、既存のボードに対する各種設定を変更できます。ボード管理者（admin）またはボード作成者のみが設定変更を行うことができ、一般メンバーは設定内容を閲覧のみ可能です。

**業務上の目的・背景**：プロジェクトの進行に応じてボードの設定を柔軟に変更する必要があります。メンバーの追加・削除、ボードの公開設定、自動クローズのタイミング調整など、運用上の様々な要件に対応するための管理画面です。ボード作成者や管理者がチームの体制変更に対応できるようにします。

**画面へのアクセス方法**：ボード詳細画面のヘッダーにある設定アイコン（歯車）をクリックしてアクセスします。URLは `/boards/:id/edit` です。

**主要な操作・処理内容**：
1. ボード名の編集
2. ボードへのアクセス権限設定（全員アクセス/個別指定）
3. ユーザーごとのアクセス権のオン・オフ切り替え
4. 自動クローズ（Auto close）期間の設定
5. 公開リンクの有効化・無効化と公開説明文の編集
6. ボードの削除

**画面遷移**：
- 遷移元：ボード詳細画面、カード一覧画面（フィルター適用時）
- 遷移先：保存成功時は同画面にリダイレクト（notice表示）、削除時はホーム画面、キャンセル時はボード詳細画面

**権限による表示制御**：
- 管理者（admin）またはボード作成者：全項目の編集が可能
- 一般メンバー：閲覧のみ（入力フィールドはreadonly、ボタンはdisabled）
- 削除セクションは管理者権限保持者のみ表示

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 9 | ボード編集 | 主機能 | ボードの名前・アクセス権限・自動延期設定を編集 |
| 10 | ボード削除 | 補助機能 | ボードとその関連データを削除 |
| 11 | ボード公開設定 | 補助機能 | ボードを外部に公開/非公開に設定 |

## 画面種別

編集画面（設定フォーム）

## URL/ルーティング

| HTTP Method | URL | Controller#Action |
|-------------|-----|-------------------|
| GET | /boards/:id/edit | boards#edit |
| PATCH/PUT | /boards/:id | boards#update |
| DELETE | /boards/:id | boards#destroy |
| POST | /boards/:id/publication | boards/publications#create |
| DELETE | /boards/:id/publication | boards/publications#destroy |
| PATCH | /boards/:id/entropy | boards/entropies#update |

## 入出力項目

| 項目名 | 項目ID | 入力/出力 | データ型 | 必須 | 最大長 | 説明 |
|--------|--------|-----------|----------|------|--------|------|
| ボード名 | name | 入力 | String | 必須 | - | ボードの名前 |
| 全員アクセス | all_access | 入力 | Boolean | - | - | trueで全員アクセス可能 |
| ユーザーID配列 | user_ids[] | 入力 | Array | - | - | アクセス権を付与するユーザーID |
| 自動延期期間 | auto_postpone_period | 入力 | Integer | - | - | 秒単位での自動延期期間 |
| 公開説明文 | public_description | 入力 | Rich Text | - | - | 公開ボードの説明文 |

## 表示項目

| 項目名 | 表示形式 | 説明 |
|--------|----------|------|
| ページタイトル | H1見出し | 「Board Settings」、権限がない場合は補足メッセージ表示 |
| 戻るリンク | リンク | ボード詳細画面への戻りリンク |
| ボード名入力 | テキストフィールド | 現在のボード名が表示、編集可能 |
| 全員アクセススイッチ | トグルスイッチ | Everyone用のアクセス権切り替え |
| ユーザーフィルター | 検索フィールド | ユーザー一覧のフィルタリング |
| 全選択/全解除ボタン | ボタン | ユーザー選択の一括操作 |
| ユーザー一覧 | チェックボックスリスト | 各ユーザーへのアクセス権設定 |
| 保存ボタン | ボタン | 「Save changes」 |
| Auto close設定 | 期間選択UI | 自動クローズまでの期間設定 |
| 公開リンク設定 | トグルスイッチ + URL表示 | 公開設定のオン・オフと公開URL |
| 公開説明文 | リッチテキストエディタ | 公開ページの説明文編集 |
| 削除ボタン | ボタン（ダイアログ付き） | ボード削除の確認ダイアログ起動 |

## イベント仕様

### 1-ボード名・ユーザー設定保存（Save changes押下）

**トリガー**: 「Save changes」ボタンクリック

**事前条件**:
- Current.userがボード管理権限を持つこと（can_administer_board?がtrue）

**処理内容**:
1. board_paramsによるパラメータ取得（name, all_access, auto_postpone_period, public_description）
2. Board#updateによるボード情報更新
3. user_idsパラメータがある場合、Access.reviseによるアクセス権更新
4. 自分自身を削除しようとした場合は警告表示

**事後処理**:
- 自分がアクセス権を持つ場合：edit_board_pathにリダイレクト（notice: "Saved"）
- 自分がアクセス権を失った場合：root_pathにリダイレクト（notice: "Saved (you were removed from the board)"）

### 2-全員アクセス切り替え

**トリガー**: 「Everyone」横のトグルスイッチ変更

**処理内容**:
- all_accessの値を切り替え（trueで全員アクセス可能）
- 個別ユーザー選択UIの表示/非表示を制御

### 3-公開設定オン

**トリガー**: 公開リンクセクションのトグルスイッチをオンに変更

**処理内容**:
1. POST /boards/:id/publication を実行
2. BoardPublicationレコードを作成
3. 公開用キー（key）を生成

**事後処理**:
- 公開URLとコピーボタン、QRコード生成リンクを表示

### 4-公開設定オフ

**トリガー**: 公開リンクセクションのトグルスイッチをオフに変更

**処理内容**:
1. DELETE /boards/:id/publication を実行
2. BoardPublicationレコードを削除

### 5-ボード削除

**トリガー**: 「Delete this board」ボタン押下後、確認ダイアログで「Delete board」クリック

**事前条件**:
- Current.userがボード管理権限を持つこと

**処理内容**:
1. 確認ダイアログの表示（「Are you sure you want to permanently delete this board and all the cards on it?」）
2. DELETE /boards/:id を実行
3. Boardレコードと関連データ（cards, columns, accesses等）を削除

**事後処理**:
- root_pathにリダイレクト

## データベース更新仕様

### 操作別データベース影響一覧

| 操作（イベント） | 対象テーブル | 操作種別 | 概要 |
|----------------|-------------|---------|------|
| Save changes押下 | boards | UPDATE | ボード名等を更新 |
| Save changes押下 | accesses | INSERT/DELETE | アクセス権の追加・削除 |
| 公開設定オン | board_publications | INSERT | 公開設定レコード作成 |
| 公開設定オフ | board_publications | DELETE | 公開設定レコード削除 |
| Delete board押下 | boards | DELETE | ボードレコード削除 |
| Delete board押下 | cards | DELETE | 関連カード削除 |
| Delete board押下 | columns | DELETE | 関連カラム削除 |
| Delete board押下 | accesses | DELETE | 関連アクセス権削除 |

### テーブル別更新項目詳細

#### boards

| 操作 | 項目（カラム名） | 更新値・取得条件 | 備考 |
|-----|-----------------|-----------------|------|
| UPDATE | name | フォーム入力値 | ボード名 |
| UPDATE | all_access | フォーム入力値（true/false） | 全員アクセスフラグ |
| UPDATE | updated_at | 現在日時 | 更新日時 |

#### accesses

| 操作 | 項目（カラム名） | 更新値・取得条件 | 備考 |
|-----|-----------------|-----------------|------|
| INSERT | board_id | 対象ボードID | 新規アクセス権付与時 |
| INSERT | user_id | 対象ユーザーID | |
| INSERT | account_id | ボードのaccount_id | |
| DELETE | - | user_idがgrantee_idsに含まれない | アクセス権剥奪時 |

#### board_publications

| 操作 | 項目（カラム名） | 更新値・取得条件 | 備考 |
|-----|-----------------|-----------------|------|
| INSERT | board_id | 対象ボードID | 公開設定時 |
| INSERT | key | ランダム生成キー | 公開URL用 |
| INSERT | account_id | ボードのaccount_id | |
| DELETE | - | board_idで特定 | 非公開設定時 |

## メッセージ仕様

| メッセージID | 種別 | メッセージ内容 | 表示条件 |
|-------------|------|---------------|----------|
| M001 | 成功 | Saved | 設定保存成功時 |
| M002 | 成功 | Saved (you were removed from the board) | 自分をボードから削除した場合 |
| M003 | 確認 | Are you sure you want to remove yourself from this board? You won't be able to get back in unless someone invites you. | 自分を削除しようとした場合 |
| M004 | 確認 | Are you sure you want to permanently delete this board and all the cards on it? This can't be undone. | ボード削除確認時 |
| M005 | 情報 | Only admins can change these settings | 非管理者がアクセスした場合 |

## 例外処理

| 例外種別 | 発生条件 | 処理内容 |
|---------|----------|----------|
| 権限エラー | 非管理者が更新/削除を試行 | HTTPステータス403（Forbidden）を返却 |
| レコード不存在 | 存在しないボードIDでアクセス | HTTPステータス404を返却 |
| 認証エラー | 未ログイン状態でアクセス | ログイン画面にリダイレクト |
| アクセス権なし | ボードへのアクセス権がない | HTTPステータス404を返却 |

## 備考

- 設定画面は2つのパネルに分かれています：ユーザー管理パネルとその他設定パネル
- 自分自身をボードから削除する場合は警告ダイアログが表示されます
- 公開設定がオンの場合、公開URLとコピーボタン、説明文編集エリアが表示されます
- Auto close設定は `entropy` リソースで管理されています
- ボード削除は確認ダイアログによる2段階確認が必要です

---

## コードリーディングガイド

本画面を理解するために参照すべきファイルと、推奨する読み解き順序を以下に示す。

### 推奨読解順序

#### Step 1: データ構造を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | board.rb | `app/models/board.rb` | Publishable, Accessible concernのincludeを確認 |
| 1-2 | access.rb | `app/models/access.rb` | involvementのenum、clean_inaccessible_data_laterを確認 |
| 1-3 | schema.rb | `db/schema.rb` | boards（155-164行目）、accesses（14-26行目）、board_publications（144-152行目）テーブルを確認 |

**読解のコツ**: Board, Access, BoardPublicationの3モデルの関連を把握することが重要です。

#### Step 2: エントリーポイントを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | boards_controller.rb | `app/controllers/boards_controller.rb` | edit/update/destroyアクション、ensure_permission_to_admin_boardを確認 |

**主要処理フロー**:
1. **37-41行目**: `edit`アクション - ユーザーを選択済み/未選択に分類
2. **43-57行目**: `update`アクション - ボード更新とアクセス権更新
3. **59-66行目**: `destroy`アクション - ボード削除
4. **73-77行目**: `ensure_permission_to_admin_board` - 権限チェック

#### Step 3: ビューテンプレートを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | edit.html.erb | `app/views/boards/edit.html.erb` | 全体構造、2パネル構成を確認 |
| 3-2 | _name.html.erb | `app/views/boards/edit/_name.html.erb` | ボード名入力フィールド |
| 3-3 | _users.html.erb | `app/views/boards/edit/_users.html.erb` | ユーザーアクセス権設定UI |
| 3-4 | _auto_close.html.erb | `app/views/boards/edit/_auto_close.html.erb` | 自動クローズ設定 |
| 3-5 | _publication.html.erb | `app/views/boards/edit/_publication.html.erb` | 公開リンク設定 |
| 3-6 | _delete.html.erb | `app/views/boards/edit/_delete.html.erb` | 削除確認ダイアログ |

**主要処理フロー**:
- **10-13行目(edit.html.erb)**: 権限がない場合のメッセージ表示
- **18-30行目(edit.html.erb)**: メインフォーム（name, users）
- **33-37行目(edit.html.erb)**: サブパネル（auto_close, publication, delete）

#### Step 4: 権限チェックを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | role.rb | `app/models/user/role.rb` | can_administer_board?メソッド（25-27行目） |

**主要処理フロー**:
- **25-27行目**: admin権限またはボード作成者の場合にtrueを返す

### プログラム呼び出し階層図

```
ブラウザ（GET /boards/:id/edit）
    │
    ├─ BoardsController#edit
    │      ├─ set_board（before_action）
    │      │      └─ Current.user.boards.find(params[:id])
    │      └─ ユーザー一覧の分類
    │             └─ account.users.active.alphabetically.partition
    │
    └─ app/views/boards/edit.html.erb
           ├─ _name.html.erb
           ├─ _users.html.erb
           ├─ _auto_close.html.erb
           ├─ _publication.html.erb
           └─ _delete.html.erb（管理者のみ）

ブラウザ（PATCH /boards/:id）
    │
    └─ BoardsController#update
           ├─ ensure_permission_to_admin_board（before_action）
           ├─ @board.update!(board_params)
           ├─ @board.accesses.revise（条件付き）
           │      ├─ Access INSERT（grantees）
           │      └─ Access DELETE（revokees）
           └─ redirect_to（条件分岐）
```

### データフロー図

```
[入力]                      [処理]                         [出力]

ボード名 ──────────────▶ BoardsController#update ─────▶ boards テーブル
all_access ────────────▶          │                        │
user_ids[] ────────────▶          │                        ▼
                                  │                   accesses テーブル
                                  │                        │
                                  └───▶ redirect_to ───────┘
                                              │
                                              ▼
                                        設定画面（更新後）
                                        or ホーム画面
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| edit.html.erb | `app/views/boards/edit.html.erb` | テンプレート | 設定画面のメインビュー |
| _name.html.erb | `app/views/boards/edit/_name.html.erb` | パーシャル | ボード名入力 |
| _users.html.erb | `app/views/boards/edit/_users.html.erb` | パーシャル | ユーザーアクセス設定 |
| _auto_close.html.erb | `app/views/boards/edit/_auto_close.html.erb` | パーシャル | 自動クローズ設定 |
| _publication.html.erb | `app/views/boards/edit/_publication.html.erb` | パーシャル | 公開リンク設定 |
| _delete.html.erb | `app/views/boards/edit/_delete.html.erb` | パーシャル | 削除確認ダイアログ |
| boards_controller.rb | `app/controllers/boards_controller.rb` | コントローラー | edit/update/destroyアクション |
| board.rb | `app/models/board.rb` | モデル | ボードモデル |
| access.rb | `app/models/access.rb` | モデル | アクセス権モデル |
| role.rb | `app/models/user/role.rb` | Concern | 権限チェックロジック |
| routes.rb | `config/routes.rb` | 設定 | ルーティング定義 |
