# 通知設計書 45-WINDOW_DONT_SHOW_AGAIN

## 概要

本ドキュメントは、lua-language-serverにおける「再度表示しない」ボタン通知（WINDOW_DONT_SHOW_AGAIN）の設計仕様を定義する。この通知は、各種ダイアログで使用される汎用的な「再度表示しない」ボタンのラベルテキストを提供する。

### 本通知の処理概要

この通知は、繰り返し表示されるダイアログに対して、ユーザーが以降の表示を抑止するためのアクションボタンを提供する。複数のダイアログで共通して使用される汎用的なボタンラベルである。

**業務上の目的・背景**：ユーザーが既に理解している情報や、意図的に無視したい通知に対して、繰り返しの表示を停止できるようにする。これにより、不要な通知による作業中断を防ぎ、開発効率を向上させる。ユーザーの選択を尊重し、押し付けがましくないUXを実現する。

**通知の送信タイミング**：以下のダイアログで使用される：
1. ワークスペース診断設定案内（WINDOW_SETTING_WS_DIAGNOSTIC）
2. サードパーティライブラリ確認（WINDOW_ASK_APPLY_LIBRARY）
その他、ユーザーに選択肢を提示するダイアログ全般で使用可能。

**通知の受信者**：VSCode等のIDEを使用してLuaプロジェクトを編集している開発者全般。

**通知内容の概要**：「Don't show again」（日本語：「再度表示しない」）というボタンラベルテキスト。

**期待されるアクション**：ユーザーがこのボタンをクリックすると、対応するフラグが設定され、同じダイアログが再度表示されなくなる。フラグの保存方法（メモリ内/設定ファイル）は使用箇所により異なる。

## 通知種別

LSPメッセージリクエスト（`window/showMessageRequest`）のアクションボタンラベル

## 送信仕様

### 基本情報

| 項目 | 内容 |
|-----|------|
| 送信方式 | 非同期 |
| 優先度 | 使用するダイアログに依存 |
| リトライ | なし |

### 送信先決定ロジック

親となるダイアログの送信先決定ロジックに従う。

## 通知テンプレート

### ボタンラベルの場合

| 項目 | 内容 |
|-----|------|
| 用途 | 再表示抑止ボタン |
| 親メッセージ | 各種ダイアログ通知 |
| 形式 | テキスト |

### 本文テンプレート

```
英語: Don't show again
日本語: 再度表示しない
中国語(簡体): 不再显示
中国語(繁体): 不再顯示
```

### 添付ファイル

なし

## テンプレート変数

| 変数名 | 説明 | データ取得元 | 必須 |
|--------|------|-------------|-----|
| なし | ボタンラベルは固定テキスト | locale/*/script.lua | N/A |

## 送信トリガー・条件

### トリガー一覧

| トリガー種別 | トリガーイベント | 送信条件 | 説明 |
|------------|----------------|---------|------|
| ダイアログ表示 | askForDisable | dontAskedForDisable = false | 診断設定案内ダイアログ |
| ダイアログ表示 | check3rd | checkThirdParty = 'Ask' | サードパーティライブラリ確認 |

### 送信抑止条件

| 条件 | 説明 |
|-----|------|
| 親ダイアログに依存 | 親ダイアログの抑止条件に従う |

## 処理フロー

### 送信フロー（診断設定案内の場合）

```mermaid
flowchart TD
    A[askForDisable呼び出し] --> B[ダイアログ表示]
    B --> C{ユーザー選択}
    C -->|WINDOW_DONT_SHOW_AGAIN| D[dontAskedForDisable = true]
    C -->|他のアクション| E[該当アクション実行]
    D --> F[終了]
    E --> F
```

### 送信フロー（サードパーティライブラリの場合）

```mermaid
flowchart TD
    A[check3rd呼び出し] --> B[ダイアログ表示]
    B --> C{ユーザー選択}
    C -->|dontShowAgain| D[client.setConfig: checkThirdParty = 'Disable']
    C -->|他のアクション| E[該当アクション実行]
    D --> F[終了]
    E --> F
```

## データベース参照・更新仕様

### 参照テーブル一覧

本通知はデータベースを使用しない。

| テーブル名 | 用途 | 備考 |
|-----------|------|------|
| N/A | N/A | データベース不使用 |

### 更新テーブル・変数一覧

| 変数/設定 | 操作 | 使用箇所 |
|-----------|------|----------|
| m.dontAskedForDisable | SET true | diagnostic.lua |
| Lua.workspace.checkThirdParty | SET 'Disable' | library.lua |

## エラー処理

### エラーケース一覧

| エラー種別 | 発生条件 | 対処方法 |
|----------|---------|---------|
| 設定保存失敗 | client.setConfigが失敗した場合 | ログ記録、処理継続 |

### リトライ仕様

| 項目 | 内容 |
|-----|------|
| リトライ回数 | 0（リトライなし） |
| リトライ間隔 | N/A |
| リトライ対象エラー | N/A |

## 配信設定

### レート制限

| 項目 | 内容 |
|-----|------|
| 制限 | なし（親ダイアログに依存） |

### 配信時間帯

制限なし

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

- 固定テキストのみであり、機密情報は含まれない
- ユーザーの明示的な選択により抑止フラグが設定される
- 設定変更はローカル環境のみに影響

## 備考

- 診断設定案内（diagnostic.lua）ではメモリ内フラグ（m.dontAskedForDisable）で管理
- サードパーティライブラリ確認（library.lua）では設定ファイル（checkThirdParty = 'Disable'）で管理
- 使用箇所によって永続化方法が異なる点に注意

---

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

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

### 推奨読解順序

#### Step 1: 使用箇所1 - 診断設定案内

診断プロバイダーでの使用を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | diagnostic.lua | `script/provider/diagnostic.lua` | 478行目：アクションボタンとしての使用 |
| 1-2 | diagnostic.lua | `script/provider/diagnostic.lua` | 491-492行目：クリック時の処理 |

**主要処理フロー**:
1. **478行目**: `title = lang.script.WINDOW_DONT_SHOW_AGAIN` - ボタンラベル設定
2. **491行目**: `item.title == lang.script.WINDOW_DONT_SHOW_AGAIN` - 選択判定
3. **492行目**: `m.dontAskedForDisable = true` - フラグ設定

#### Step 2: 使用箇所2 - サードパーティライブラリ確認

ライブラリモジュールでの使用を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | library.lua | `script/library.lua` | 492行目：変数への代入 |
| 2-2 | library.lua | `script/library.lua` | 495行目：ダイアログのアクションとして使用 |
| 2-3 | library.lua | `script/library.lua` | 506-514行目：クリック時の処理 |

**主要処理フロー**:
- **492行目**: `local dontShowAgain = lang.script.WINDOW_DONT_SHOW_AGAIN`
- **506-514行目**: 選択時に`checkThirdParty = 'Disable'`を設定

#### Step 3: 言語リソースを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | script.lua | `locale/en-us/script.lua` | 558-559行目：英語メッセージ |
| 3-2 | script.lua | `locale/ja-jp/script.lua` | 558-559行目：日本語メッセージ |

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

```
[使用箇所1: diagnostic.lua]
askForDisable (diagnostic.lua:467)
    |
    +-- proto.awaitRequest('window/showMessageRequest')
    |       |
    |       +-- actions: [{title: WINDOW_DONT_SHOW_AGAIN}, ...]
    |
    +-- [選択処理]
            |
            +-- item.title == WINDOW_DONT_SHOW_AGAIN
                    |
                    +-- m.dontAskedForDisable = true

[使用箇所2: library.lua]
check3rd / check3rdByWords
    |
    +-- client.awaitRequestMessage
    |       |
    |       +-- titles: [..., dontShowAgain, ...]
    |
    +-- [選択処理]
            |
            +-- result == dontShowAgain
                    |
                    +-- client.setConfig('checkThirdParty', 'Disable')
```

### データフロー図

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

ダイアログ表示要求  ───▶  proto.awaitRequest     ───▶  ボタン表示
                                |                      [WINDOW_DONT_SHOW_AGAIN]
                                ▼
                          [ユーザークリック]
                                |
                ┌───────────────┴───────────────┐
                ▼                               ▼
        [diagnostic.lua]                [library.lua]
        dontAskedForDisable = true      checkThirdParty = 'Disable'
        (メモリ内フラグ)                 (設定ファイル)
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| diagnostic.lua | `script/provider/diagnostic.lua` | ソース | 診断設定案内での使用 |
| library.lua | `script/library.lua` | ソース | サードパーティライブラリ確認での使用 |
| client.lua | `script/client.lua` | ソース | ダイアログ表示・設定変更 |
| script.lua | `locale/en-us/script.lua` | 言語リソース | 英語メッセージ定義 |
| script.lua | `locale/ja-jp/script.lua` | 言語リソース | 日本語メッセージ定義 |
