# 画面設計書 9-日別アクティビティ画面

## 概要

本ドキュメントは、Fizzyアプリケーションの日別アクティビティ画面（`app/views/events/days/index.html.erb`）の設計仕様を記述したものです。

### 本画面の処理概要

日別アクティビティ画面は、特定の日のイベント詳細を表示するための画面です。主にアクティビティ一覧画面からの無限スクロールで読み込まれるページネーション用の画面として機能し、過去の日付のアクティビティを追加で表示します。

**業務上の目的・背景**：アクティビティ一覧画面で表示しきれない過去のイベントを、日単位で追加読み込みするための機能を提供します。無限スクロールの実装により、ユーザーはシームレスに過去のアクティビティを遡ることができます。Turbo Framesを使用した部分更新により、ページ全体を再読み込みすることなく新しいコンテンツが追加されます。

**画面へのアクセス方法**：通常、アクティビティ一覧画面（`/events`）からの無限スクロールでアクセスされます。URLパラメータに日付を指定することで直接アクセスすることも可能です（`/events/days?day=YYYY-MM-DD`）。

**主要な操作・処理内容**：
1. 指定された日付のイベントを時系列で表示する
2. 「前の日」へのページネーションリンクを表示する
3. 各イベントをクリックして詳細（カード詳細画面など）に遷移する

**画面遷移**：
- 遷移元：アクティビティ一覧画面（無限スクロール）、URL直接アクセス
- 遷移先：カード詳細画面、次の日の日別アクティビティ画面

**権限による表示制御**：
- 認証済みユーザーのみアクセス可能
- ユーザーが参加しているボードのアクティビティのみ表示される
- フィルター設定が適用される（アクティビティ一覧画面と共通）

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 63 | 日別イベント表示 | 主機能 | 特定の日のイベント詳細を表示 |

## 画面種別

一覧（日別タイムライン・ページネーション）

## URL/ルーティング

| 項目 | 値 |
|------|-----|
| URL | `/events/days` |
| HTTPメソッド | GET |
| コントローラー | `Events::DaysController` |
| アクション | `index` |
| レイアウト | application（デフォルト） |

## 入出力項目

### 入力項目（クエリパラメータ）

| No | 項目名 | 物理名 | データ型 | 必須 | 説明 | 備考 |
|----|--------|--------|---------|------|------|------|
| 1 | 日付 | day | string | 任意 | 表示する日付 | YYYY-MM-DD形式、省略時は当日 |
| 2 | フィルターID | filter_id | integer | 任意 | 保存済みフィルターのID | - |
| 3 | ボードID | board_ids[] | array | 任意 | 表示するボードのID | 複数指定可 |

### 出力項目

なし（画面表示のみ）

## 表示項目

| No | 項目名 | 表示条件 | データソース | 備考 |
|----|--------|----------|-------------|------|
| 1 | 日次タイムライン | 常時 | @day_timeline | 指定日のイベント一覧 |
| 2 | ページネーションリンク | 過去データ存在時 | @day_timeline, @filter | Turbo Frame対応 |

## イベント仕様

### 1-ページネーションリンク読み込み

**トリガー**: 親画面（アクティビティ一覧）のスクロールでIntersection Observerが発火

**処理フロー**:
1. Turbo Frameリクエストが`/events/days`に送信される
2. `Events::DaysController#index`が呼び出される
3. `DayTimelinesScoped`により`@day_timeline`が設定される
4. レスポンスがTurbo Frameとして返却される
5. 親ページのDOMに日別タイムラインが追加される

**レスポンス**:
- Turbo Frame形式でレスポンス（部分更新）
- または通常のHTML（直接アクセス時）

### 2-イベント項目クリック

**トリガー**: イベント項目のクリック

**処理**: 対象のカード詳細画面またはコメント詳細画面に遷移

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

なし（参照のみ）

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

| 操作（イベント） | 対象テーブル | 操作種別 | 概要 |
|----------------|-------------|---------|------|
| 画面表示 | events | SELECT | 指定日のイベント取得 |
| 画面表示 | boards | SELECT | ユーザーが参加しているボード取得 |
| 画面表示 | filters | SELECT | ユーザーのフィルター設定取得 |

## メッセージ仕様

| No | メッセージ種別 | メッセージ内容 | 表示条件 |
|----|--------------|---------------|---------|
| 1 | 情報 | （空の日の表示） | イベントがない日 |

## 例外処理

| 例外パターン | 対応内容 | 備考 |
|------------|---------|------|
| 無効な日付パラメータ | HTTP 404 Not Found | ArgumentErrorをrescue |
| フィルターが見つからない | ActiveRecord::RecordNotFoundエラー | filter_idが無効な場合 |

## 備考

- 本画面は主にTurbo Framesを使用したページネーション用の画面として機能する
- `day_timeline_pagination_frame_tag`ヘルパーによりTurbo Frame用のタグが生成される
- `day_timeline_pagination_link`ヘルパーにより次のページネーションリンクが生成される
- `fresh_when @day_timeline`によるHTTPキャッシュが実装されている（ETag）
- `DayTimelinesScoped`と`FilterScoped`を継承しており、アクティビティ一覧画面と同じ仕組みでデータを取得する
- 直接アクセスした場合は、この画面単体でも動作する

---

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

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

### 推奨読解順序

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

まず、タイムライン表示に関わるデータモデルの構造を理解することが重要です。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | event.rb | `app/models/event.rb` | Eventモデルの構造、関連、scope |
| 1-2 | filter.rb | `app/models/filter.rb` | フィルターの構造 |

**読解のコツ**: この画面はアクティビティ一覧画面（No.8）と同じデータモデルを使用しています。

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

処理の起点となるコントローラーを特定します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | days_controller.rb | `app/controllers/events/days_controller.rb` | indexアクション、DayTimelinesScopedのinclude |
| 2-2 | day_timelines_scoped.rb | `app/controllers/concerns/day_timelines_scoped.rb` | タイムライン取得ロジック |
| 2-3 | filter_scoped.rb | `app/controllers/concerns/filter_scoped.rb` | フィルター設定ロジック |

**主要処理フロー**:
1. **2行目（days_controller.rb）**: `DayTimelinesScoped`をinclude
2. **4-6行目（days_controller.rb）**: `index`アクション - fresh_whenでキャッシュ制御
3. **11-13行目（day_timelines_scoped.rb）**: `set_day_timeline` - タイムライン取得

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

画面表示のテンプレートを確認します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | index.html.erb | `app/views/events/days/index.html.erb` | Turbo Frameタグ、ページネーション |
| 3-2 | _day.html.erb | `app/views/events/_day.html.erb` | 日ごとのイベント表示（共通） |

**主要処理フロー**:
- **1行目**: `day_timeline_pagination_frame_tag` - Turbo Frame生成
- **2行目**: `events/_day`パーシャルのrender
- **3行目**: `day_timeline_pagination_link` - 次のページネーションリンク

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

```
Events::DaysController#index
    │
    ├─ [before_action] set_filter (FilterScoped)
    │      └─ Current.user.filters.from_params or find
    │
    ├─ [before_action] set_user_filtering (FilterScoped)
    │      └─ User::Filtering.new(Current.user, @filter)
    │
    ├─ [before_action] set_day_timeline (DayTimelinesScoped)
    │      └─ Current.user.timeline_for(day, filter: @filter)
    │
    └─ fresh_when @day_timeline
           │
           └─ [ETag一致] 304 Not Modified
           │
           └─ [ETag不一致] render index
                  │
                  └─ events/days/index.html.erb
                         │
                         ├─ day_timeline_pagination_frame_tag
                         │
                         ├─ events/_day
                         │
                         └─ day_timeline_pagination_link
```

### データフロー図

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

day (param) ─────────▶ Events::DaysController#index
filter_id (param) ───▶        │
board_ids (param) ───▶        │
                              │
                              ├──▶ set_filter
                              │        │
                              │        └─▶ Filter取得/生成
                              │
                              ├──▶ set_day_timeline
                              │        │
                              │        └─▶ Timeline取得（指定日のEvents）
                              │
                              └──▶ fresh_when（キャッシュ制御）
                                       │
                                       └─▶ Turbo Frame（日別タイムライン）
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| days_controller.rb | `app/controllers/events/days_controller.rb` | コントローラー | 日別アクティビティの制御 |
| index.html.erb | `app/views/events/days/index.html.erb` | ビュー | 日別アクティビティ画面テンプレート |
| _day.html.erb | `app/views/events/_day.html.erb` | パーシャル | 日ごとのイベント表示（共通） |
| event.rb | `app/models/event.rb` | モデル | イベント管理 |
| filter.rb | `app/models/filter.rb` | モデル | フィルター管理 |
| day_timelines_scoped.rb | `app/controllers/concerns/day_timelines_scoped.rb` | Concern | タイムライン取得 |
| filter_scoped.rb | `app/controllers/concerns/filter_scoped.rb` | Concern | フィルター設定 |
| day_timeline_helper.rb | `app/helpers/day_timeline_helper.rb` | ヘルパー | Turbo Frame・ページネーションヘルパー |
| routes.rb | `config/routes.rb` | 設定 | ルーティング定義 |
