# 機能設計書 65-アバウト表示

## 概要

本ドキュメントは、InvenTreeモバイルアプリにおけるアバウト表示機能の設計を記述するものである。アプリのバージョン情報、サーバー接続情報、クレジット、外部リンク等を表示する画面の仕様を定義する。

### 本機能の処理概要

本機能は、InvenTreeアプリおよび接続中のサーバーに関する詳細情報を表示する画面を提供する。サーバー詳細（接続状態、バージョン、インスタンス名）、アプリ詳細（パッケージ名、バージョン）、リリースノート、クレジット、ドキュメントへのリンク、翻訳協力、バグ報告などの情報とリンクを集約して表示する。

**業務上の目的・背景**：IT管理者やサポート担当者が、ユーザーの環境情報を確認する際にアプリ・サーバーのバージョン情報が必要となる。また、開発への貢献（翻訳、バグ報告）やドキュメント参照のための導線を提供することで、ユーザーコミュニティとの連携を促進する。

**機能の利用シーン**：
- サポート問い合わせ時に環境情報を確認したい場合
- サーバーバージョンとアプリバージョンの互換性を確認したい場合
- 最新のリリースノートを確認したい場合
- アプリの翻訳に協力したい場合
- バグを発見して報告したい場合

**主要な処理内容**：
1. サーバー接続状態および詳細情報（URL、ユーザー名、バージョン、インスタンス名）の表示
2. アプリ情報（パッケージ名、バージョン、ビルド番号）の表示
3. リリースノート画面への遷移
4. クレジット画面への遷移
5. 外部リンク（ドキュメント、翻訳サイト、バグ報告）の起動

**関連システム・外部連携**：
- InvenTreeサーバー：接続情報の取得
- 外部ブラウザ：ドキュメント、Crowdin（翻訳）、GitHub Issues（バグ報告）へのリンク起動

**権限による制御**：本機能に特別な権限制御はなく、すべてのユーザーが利用可能である。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 6 | 設定画面 | 遷移元画面 | アバウトメニュー押下時に本画面へ遷移 |
| 17 | アバウト画面 | 主画面 | サーバー情報、アプリバージョン、リンクの表示 |
| 18 | リリースノート画面 | 遷移先画面 | リリースノートメニュー押下時に遷移 |
| 19 | クレジット画面 | 遷移先画面 | クレジットメニュー押下時に遷移 |

## 機能種別

情報表示 / 外部リンク起動

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| info | PackageInfo | Yes | アプリパッケージ情報（コンストラクタで受け取り） | null不可 |

### 入力データソース

- PackageInfo：アプリのパッケージ情報（起動時に取得）
- InvenTreeAPI：サーバー接続情報（APIシングルトンから取得）
- アセットファイル：リリースノート（assets/release_notes.md）、クレジット（assets/credits.md）

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| serverAddress | String | 接続中のサーバーURL |
| username | String | ログイン中のユーザー名 |
| serverVersion | String | サーバーバージョン |
| serverInstance | String | サーバーインスタンス名 |
| packageName | String | アプリパッケージ名 |
| appVersion | String | アプリバージョン |
| buildNumber | String | ビルド番号 |

### 出力先

- 画面表示：ListTileによる各種情報の表示
- 外部ブラウザ：url_launcherによる外部リンク起動

## 処理フロー

### 処理シーケンス

```
1. 画面表示（build）
   └─ サーバー情報セクション構築
      └─ InvenTreeAPI()から接続情報を取得
   └─ アプリ情報セクション構築
      └─ PackageInfoから情報を取得
   └─ 外部リンクセクション構築
2. ユーザー操作
   └─ リリースノートタップ: _releaseNotes()でMarkdown画面遷移
   └─ クレジットタップ: _credits()でMarkdown画面遷移
   └─ ドキュメントタップ: _openDocs()で外部ブラウザ起動
   └─ 翻訳タップ: _translate()でCrowdinを外部ブラウザで起動
   └─ バグ報告タップ: _reportBug()でGitHub Issuesを外部ブラウザで起動
```

### フローチャート

```mermaid
flowchart TD
    A[アバウト画面表示] --> B{接続状態確認}
    B -->|接続中| C[サーバー情報表示]
    B -->|未接続| D[未接続メッセージ表示]
    C --> E[アプリ情報表示]
    D --> E
    E --> F[外部リンク表示]
    F --> G{ユーザー操作}
    G -->|リリースノート| H[Markdown画面遷移]
    G -->|クレジット| I[Markdown画面遷移]
    G -->|ドキュメント| J[外部ブラウザ起動]
    G -->|翻訳| K[Crowdin起動]
    G -->|バグ報告| L[GitHub Issues起動]
    G -->|戻る| M[画面終了]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-65-01 | 接続状態表示 | 接続中は詳細情報を表示、未接続は未接続メッセージを表示 | サーバー情報セクション |
| BR-65-02 | 接続アイコン | 接続中は緑チェックアイコン、未接続は赤Xアイコン | アドレス表示タイル |
| BR-65-03 | プラグインサポート表示 | サーバーがプラグインをサポートしている場合に表示 | 接続中 |
| BR-65-04 | 外部リンクマーカー | 外部リンクにはLinkIcon(external: true)を表示 | 外部リンクタイル |

### 計算ロジック

該当なし

## データベース操作仕様

本機能ではデータベース操作は発生しない。すべての情報はInvenTreeAPIシングルトンおよびPackageInfoから取得する。

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | URL起動エラー | 外部ブラウザ起動失敗 | canLaunchUrlチェック後に起動、失敗時は無視 |
| - | アセット読み込みエラー | release_notes.md/credits.md読み込み失敗 | 例外がスローされる（稀なケース） |

### リトライ仕様

リトライは実装されていない。外部リンク起動はcanLaunchUrlで事前チェックを行う。

## トランザクション仕様

本機能ではトランザクションは発生しない。

## パフォーマンス要件

- 画面表示：200ms以内
- 外部リンク起動：ブラウザ依存
- アセット読み込み：100ms以内

## セキュリティ考慮事項

- サーバーURLやユーザー名は画面上に表示されるが、トークン等の機密情報は表示しない
- 外部リンクはHTTPS経由のみ

## 備考

- ドキュメントURLは定数として定義（DOCS_URL = "https://docs.inventree.org/app"）
- バグ報告はGitHub Issuesに直接遷移する
- 翻訳はCrowdinプロジェクトに遷移する

---

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

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

### 推奨読解順序

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

表示に使用するデータソースを理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | api.dart | `lib/api.dart` | InvenTreeAPIクラスのサーバー情報プロパティ |

**読解のコツ**:
- **279行目**: `username`ゲッターでユーザー名を取得
- **286-288行目**: `serverInstance`, `serverVersion`, `apiVersion`ゲッターでサーバー情報を取得
- **206-214行目**: `baseUrl`ゲッターでサーバーURLを取得

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

アバウト画面ウィジェットの構造を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | about.dart | `lib/settings/about.dart` | InvenTreeAboutWidgetクラス |

**主要処理フロー**:
1. **14行目**: `DOCS_URL`定数でドキュメントURLを定義
2. **16-18行目**: StatelessWidgetとして定義、PackageInfoをコンストラクタで受け取る
3. **74-250行目**: `build`メソッドで画面を構築

#### Step 3: サーバー情報表示を理解する

サーバー情報セクションの構築を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | about.dart | `lib/settings/about.dart` | buildメソッドのサーバー情報部分 |

**主要処理フロー**:
- **77-84行目**: サーバー詳細セクションヘッダー
- **86行目**: `InvenTreeAPI().isConnected()`で接続状態を確認
- **87-143行目**: 接続中の場合のサーバー情報表示
- **144-155行目**: 未接続の場合のメッセージ表示

#### Step 4: 外部リンク処理を理解する

外部リンクの起動処理を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | about.dart | `lib/settings/about.dart` | 各種リンク起動メソッド |

**主要処理フロー**:
- **21-29行目**: `_releaseNotes`メソッドでリリースノート画面へ遷移
- **31-38行目**: `_credits`メソッドでクレジット画面へ遷移
- **40-46行目**: `_openDocs`メソッドでドキュメントを外部ブラウザで開く
- **48-59行目**: `_reportBug`メソッドでGitHub Issuesを開く
- **61-71行目**: `_translate`メソッドでCrowdinを開く

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

```
InvenTreeAboutWidget
    │
    ├─ build()
    │      │
    │      ├─ サーバー情報セクション
    │      │      ├─ InvenTreeAPI().isConnected()
    │      │      ├─ InvenTreeAPI().baseUrl
    │      │      ├─ InvenTreeAPI().username
    │      │      ├─ InvenTreeAPI().serverVersion
    │      │      └─ InvenTreeAPI().serverInstance
    │      │
    │      ├─ アプリ情報セクション
    │      │      ├─ info.packageName
    │      │      └─ info.version / info.buildNumber
    │      │
    │      └─ 外部リンクセクション
    │             ├─ リリースノートタイル
    │             ├─ クレジットタイル
    │             ├─ ドキュメントタイル
    │             ├─ 翻訳タイル
    │             └─ バグ報告タイル
    │
    ├─ _releaseNotes()
    │      └─ rootBundle.loadString("assets/release_notes.md")
    │             └─ Navigator.push(ReleaseNotesWidget)
    │
    ├─ _credits()
    │      └─ rootBundle.loadString("assets/credits.md")
    │             └─ Navigator.push(CreditsWidget)
    │
    ├─ _openDocs()
    │      └─ launchUrl(DOCS_URL)
    │
    ├─ _reportBug()
    │      └─ launchUrl(GitHub Issues URL)
    │
    └─ _translate()
           └─ launchUrl(Crowdin URL)
```

### データフロー図

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

PackageInfo ─────────────────▶┌─────────────────────┐
                              │ InvenTreeAboutWidget │
InvenTreeAPI() ──────────────▶│ - build()           │──────▶ ListTile表示
(サーバー情報)                 │                     │
                              └──────────┬──────────┘
                                         │
                                         ▼
                              ┌─────────────────────┐
リリースノートタップ ─────────▶│ _releaseNotes()     │
                              │ - loadString()      │──────▶ ReleaseNotesWidget
                              └─────────────────────┘
                              ┌─────────────────────┐
外部リンクタップ ────────────▶│ launchUrl()         │──────▶ 外部ブラウザ
                              └─────────────────────┘
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| about.dart | `lib/settings/about.dart` | ソース | アバウト画面のUI・ロジック |
| release.dart | `lib/settings/release.dart` | ソース | リリースノート・クレジット表示画面 |
| api.dart | `lib/api.dart` | ソース | サーバー接続情報の提供 |
| l10.dart | `lib/l10.dart` | ソース | 多言語テキスト取得ヘルパー |
| app_colors.dart | `lib/app_colors.dart` | ソース | アプリ共通カラー定義 |
| link_icon.dart | `lib/widget/link_icon.dart` | ソース | 外部リンクアイコンウィジェット |
| release_notes.md | `assets/release_notes.md` | アセット | リリースノートMarkdown |
| credits.md | `assets/credits.md` | アセット | クレジットMarkdown |
