# 画面設計書 31-PageHistoryCounts画面

## 概要

本ドキュメントは、Wikipedia iOSアプリにおけるPageHistoryCounts画面の設計仕様を定義するものです。

### 本画面の処理概要

PageHistoryCounts画面は、Wikipedia記事の編集履歴に関する統計情報を表示するヘッダービューコンポーネントです。記事の総編集数、初回編集年、編集推移のスパークライングラフ、およびユーザータイプ別の編集数を視覚的に表示します。

**業務上の目的・背景**：
記事の編集履歴を閲覧する際に、ユーザーが記事の編集活動の全体像を素早く把握できるようにすることが目的です。総編集数、編集の時系列推移、ログインユーザー/匿名ユーザー/ボット/マイナー編集の内訳を一目で確認できることで、記事の信頼性や活発度を判断する材料を提供します。

**画面へのアクセス方法**：
PageHistory画面（記事の編集履歴画面）のヘッダー部分として自動的に表示されます。Article画面のメニューから「Revision history」を選択することでPageHistory画面に遷移し、その際にこのコンポーネントが表示されます。

**主要な操作・処理内容**：
1. 記事タイトルの表示
2. 総編集数と初回編集年の表示
3. 編集推移のスパークライングラフの表示
4. ユーザータイプ別（ログイン/匿名/ボット/マイナー）編集数の表示

**画面遷移**：
- 遷移元：PageHistory画面（親コンポーネント）
- 遷移先：なし（表示専用のヘッダーコンポーネント）

**権限による表示制御**：
特に権限による表示制御はありません。すべてのユーザーが同じ情報を閲覧できます。

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 24 | 編集履歴 | 補助機能 | ページ履歴のカウント表示 |

## 画面種別

詳細（統計情報表示）

## URL/ルーティング

本画面は独立した画面ではなく、PageHistoryViewControllerのヘッダービューとして組み込まれるため、独自のURLやルーティングは持ちません。

## 入出力項目

| 項目名 | 入力/出力 | データ型 | 説明 |
|--------|----------|---------|------|
| pageTitle | 入力 | String | 記事タイトル |
| locale | 入力 | Locale | ロケール情報 |
| totalEditCount | 入力 | Int? | 総編集数 |
| firstEditDate | 入力 | Date | 初回編集日 |
| timeseriesOfEditsCounts | 入力 | [NSNumber] | 時系列編集数配列 |
| editCountsGroupedByType | 入力 | EditCountsGroupedByType? | タイプ別編集数 |

## 表示項目

| 項目名 | データ型 | 説明 |
|--------|---------|------|
| titleLabel | UILabel | "REVISION HISTORY"タイトル |
| pageTitleLabel | UILabel | 記事タイトル |
| countsLabel | UILabel | 編集数と初回編集年（例："123 edits since 2005"） |
| sparklineView | WMFSparklineView | 編集推移グラフ |
| filterCountsContainerView | UIView | ユーザータイプ別編集数コンテナ |

## イベント仕様

### 1-編集数データ設定

`set(totalEditCount:firstEditDate:)` メソッドが呼ばれると、総編集数と初回編集年を組み合わせたローカライズされた文字列を生成してcountsLabelに表示します。

### 2-時系列データ設定

`timeseriesOfEditsCounts`プロパティが設定されると、スパークライングラフの表示/非表示をアニメーション付きで切り替え、グラフにデータを反映します。

### 3-タイプ別編集数設定

`editCountsGroupedByType`プロパティが設定されると、フィルターカウントビューコントローラーにデータを渡し、ログインユーザー/匿名ユーザー/ボット/マイナー編集の各カウントを表示します。

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

本画面はデータベースを更新しません（読み取り専用）。

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

| 操作（イベント） | 対象テーブル | 操作種別 | 概要 |
|----------------|-------------|---------|------|
| なし | - | - | 本画面はAPI経由で取得したデータの表示のみ |

## メッセージ仕様

| メッセージID | 種別 | メッセージ内容 | 表示条件 |
|-------------|------|--------------|---------|
| page-history-revision-history-title | タイトル | "Revision history" | 常時表示 |
| page-history-stats-text | 統計情報 | "{{PLURAL:%1$d\|%1$d edit\|%1$d edits}} since %2$@" | 編集数データ取得後 |
| page-history-graph-accessibility-label | アクセシビリティ | "Graph of edits over time" | スパークライン表示時 |

## 例外処理

| 例外条件 | 処理内容 |
|---------|---------|
| 編集数データが取得できない場合 | countsLabelを透明状態で表示 |
| 時系列データが空の場合 | スパークライングラフを非表示 |
| タイプ別編集数が取得できない場合 | filterCountsContainerViewを非表示にし、子ViewControllerを削除 |

## 備考

- スパークライングラフは縦のグリッド線を表示
- テーマ（ライト/ダーク）に対応
- アクセシビリティ対応（VoiceOverでグラフの説明を読み上げ）
- Dynamic Typeに対応したフォントサイズ調整

---

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

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

### 推奨読解順序

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

本画面で使用される主要なデータ構造を把握します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | EditCountsGroupedByType | `Wikipedia/Code/` | ユーザータイプ別編集数の辞書型定義 |

**読解のコツ**: EditCountsGroupedByTypeは`customLoggedIn`, `customUnregistered`, `bot`, `minor`をキーとする辞書で、各タイプの編集数を保持します。

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

PageHistoryCountsViewControllerが親コンポーネントから初期化される流れを把握します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | PageHistoryCountsViewController.swift | `Wikipedia/Code/PageHistoryCountsViewController.swift` | init(pageTitle:locale:)で初期化、viewDidLoadでUI構築 |

**主要処理フロー**:
1. **49-53行目**: 初期化時にpageTitleとlocaleを受け取り、nibから読み込み
2. **70-87行目**: viewDidLoadでスパークライン初期化、ラベル設定、フィルターカウントVC追加
3. **26-33行目**: set(totalEditCount:firstEditDate:)で統計テキスト生成

#### Step 3: 子コンポーネントを理解する

フィルターカウント表示を担当するViewControllerを把握します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | PageHistoryFilterCountsViewController.swift | `Wikipedia/Code/PageHistoryFilterCountsViewController.swift` | タイプ別編集数の表示ロジック |

**主要処理フロー**:
- **17-43行目**: editCountsGroupedByTypeプロパティのdidSetでカウント配列を構築
- **28-39行目**: ログイン/匿名/ボット/マイナーの各カウントをCount構造体に変換

#### Step 4: テーマ適用を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | PageHistoryCountsViewController.swift | `Wikipedia/Code/PageHistoryCountsViewController.swift` | apply(theme:)メソッドでテーマ色適用 |

**主要処理フロー**:
- **123-137行目**: 背景色、テキスト色、区切り線色をテーマから取得して適用

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

```
PageHistoryViewController
    │
    └─ PageHistoryCountsViewController (ヘッダーとして追加)
           │
           ├─ set(totalEditCount:firstEditDate:) → countsLabel更新
           │
           ├─ timeseriesOfEditsCounts setter → WMFSparklineView更新
           │
           └─ PageHistoryFilterCountsViewController (子VCとして追加)
                  │
                  └─ editCountsGroupedByType setter → コレクションビュー更新
```

### データフロー図

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

PageHistoryFetcher     ──────▶ PageHistoryViewController   ──────▶
(API応答)                       │
                               ▼
totalEditCount        ──────▶ set(totalEditCount:         ──────▶ countsLabel
firstEditDate                  firstEditDate:)                    "X edits since YYYY"
                               │
timeseriesOfEditsCounts ─────▶ sparklineView.dataValues   ──────▶ スパークライングラフ
                               │
editCountsGroupedByType ─────▶ filterCountsVC.            ──────▶ タイプ別カウント表示
                               editCountsGroupedByType
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| PageHistoryCountsViewController.swift | `Wikipedia/Code/PageHistoryCountsViewController.swift` | ソース | メインのViewController |
| PageHistoryCountsViewController.xib | `Wikipedia/Code/PageHistoryCountsViewController.xib` | XIB | UI定義 |
| PageHistoryFilterCountsViewController.swift | `Wikipedia/Code/PageHistoryFilterCountsViewController.swift` | ソース | タイプ別カウント表示 |
| WMFSparklineView | `WMFComponents/` | コンポーネント | スパークライングラフ |
| PageHistoryViewController.swift | `Wikipedia/Code/PageHistoryViewController.swift` | ソース | 親ViewController |
| Theme.swift | `Wikipedia/Code/Theme.swift` | ソース | テーマ定義 |
