リクエスト詳細
✨ 既存アプリの改善
対応完了
対象アプリ: ShiftHandover
申し送り一覧のキーワード検索フィルター追加
## 1. 目的
現在の一覧フィルターは日付・シフト・ライン・カテゴリ・優先度・ステータスの選択式のみで、件名や本文の文言からすばやく探す手段がない。交代勤務現場では「あの設備のトラブルを探したい」「昨日の品質異常の記録を確認したい」など、キーワードで検索したいケースが多い。全文キーワード検索フィルターを追加し、検索効率を高める。
## 2. 具体的な仕様
### 2-1. UIの変更(pages/list.php)
- フィルターフォームに `keyword` テキスト入力欄を追加する。
- ラベル: 「キーワード」、プレースホルダー: 「件名・本文を検索」
- 既存フィルター行(`.filters` グリッド)の先頭に配置し、入力欄は `grid-column: span 2` 程度で少し広めに確保する(スマホでは1列になるため問題なし)。
- フォームの `$filters` 配列に `'keyword' => trim($_GET['keyword'] ?? '')` を追加する。
### 2-2. SQLの変更(pages/list.php)
- `$filters['keyword']` が空でない場合、`$where` 配列に以下を追加する:
```php
if ($filters['keyword'] !== '') {
$where[] = '(h.title LIKE ? OR h.body LIKE ? OR h.memo LIKE ?)';
$kw = '%' . str_replace(['%', '_', '\\'], ['\%', '\_', '\\\\'], $filters['keyword']) . '%';
$params[] = $kw;
$params[] = $kw;
$params[] = $kw;
}
```
- `LIKE` 検索はインデックス非効率だが、現場規模(数百〜数千件)では実用上問題ない。
- `array_unshift` でユーザーIDを先頭に追加している既存の順序を壊さないよう、`$where` と `$params` への追加は `array_unshift` より前に行う(現在の実装と同じ位置)。
### 2-3. キーワードの保持
- 絞り込み後、フィルターフォームの `keyword` 入力欄に `value="<?= h($filters['keyword']) ?>"` を設定して検索語を維持する。
- 「解除」リンク(`href="index.php"`)は既存のまま変更不要(keyword も含め全クリア)。
### 2-4. 検索ヒット件数表示
- 一覧ヘッダー部分(`<h2>申し送り一覧</h2>` の下の `.muted`)に `({$count} 件)` を追記して視認性を高める。`$count = count($rows)` で取得。
## 3. 既存機能との整合
- 既存のフィルター(日付・シフト・ライン・カテゴリ・優先度・ステータス)はすべてそのまま動作し、keyword フィルターは AND 条件で重ねられる。
- `build_query()` 関数は `$_GET` をベースに動作するため、keyword パラメータも自動的に引き継がれる。
- 一覧ページ以外(view, edit, dashboard, print)に変更は不要。
- スキーマ変更なし。
現在の一覧フィルターは日付・シフト・ライン・カテゴリ・優先度・ステータスの選択式のみで、件名や本文の文言からすばやく探す手段がない。交代勤務現場では「あの設備のトラブルを探したい」「昨日の品質異常の記録を確認したい」など、キーワードで検索したいケースが多い。全文キーワード検索フィルターを追加し、検索効率を高める。
## 2. 具体的な仕様
### 2-1. UIの変更(pages/list.php)
- フィルターフォームに `keyword` テキスト入力欄を追加する。
- ラベル: 「キーワード」、プレースホルダー: 「件名・本文を検索」
- 既存フィルター行(`.filters` グリッド)の先頭に配置し、入力欄は `grid-column: span 2` 程度で少し広めに確保する(スマホでは1列になるため問題なし)。
- フォームの `$filters` 配列に `'keyword' => trim($_GET['keyword'] ?? '')` を追加する。
### 2-2. SQLの変更(pages/list.php)
- `$filters['keyword']` が空でない場合、`$where` 配列に以下を追加する:
```php
if ($filters['keyword'] !== '') {
$where[] = '(h.title LIKE ? OR h.body LIKE ? OR h.memo LIKE ?)';
$kw = '%' . str_replace(['%', '_', '\\'], ['\%', '\_', '\\\\'], $filters['keyword']) . '%';
$params[] = $kw;
$params[] = $kw;
$params[] = $kw;
}
```
- `LIKE` 検索はインデックス非効率だが、現場規模(数百〜数千件)では実用上問題ない。
- `array_unshift` でユーザーIDを先頭に追加している既存の順序を壊さないよう、`$where` と `$params` への追加は `array_unshift` より前に行う(現在の実装と同じ位置)。
### 2-3. キーワードの保持
- 絞り込み後、フィルターフォームの `keyword` 入力欄に `value="<?= h($filters['keyword']) ?>"` を設定して検索語を維持する。
- 「解除」リンク(`href="index.php"`)は既存のまま変更不要(keyword も含め全クリア)。
### 2-4. 検索ヒット件数表示
- 一覧ヘッダー部分(`<h2>申し送り一覧</h2>` の下の `.muted`)に `({$count} 件)` を追記して視認性を高める。`$count = count($rows)` で取得。
## 3. 既存機能との整合
- 既存のフィルター(日付・シフト・ライン・カテゴリ・優先度・ステータス)はすべてそのまま動作し、keyword フィルターは AND 条件で重ねられる。
- `build_query()` 関数は `$_GET` をベースに動作するため、keyword パラメータも自動的に引き継がれる。
- 一覧ページ以外(view, edit, dashboard, print)に変更は不要。
- スキーマ変更なし。
💬 返信 (3)
🛠 開発を開始しました (機能追加 shift-handover)
ご要望ありがとうございます。AI 開発ワーカーが実装を開始します。
通常 5〜30 分で Pull Request を作成し、レビュー後にリリースされます。
ご要望ありがとうございます。AI 開発ワーカーが実装を開始します。
通常 5〜30 分で Pull Request を作成し、レビュー後にリリースされます。
📝 開発が完了しました
ご要望いただいた内容の実装が完了し、最終チェック段階に入りました。
レビュー (自動) → リリース、の流れで進みます。
もう少々お待ちください。
ご要望いただいた内容の実装が完了し、最終チェック段階に入りました。
レビュー (自動) → リリース、の流れで進みます。
もう少々お待ちください。
✅ リリース完了のお知らせ
ご要望いただいた「ShiftHandover」を実装し、リリースいたしました。
【ご利用方法】
ダッシュボード: https://www.aiapps.jp/?action=dashboard
アプリ詳細: https://www.aiapps.jp/apps/show.php?slug=shift-handover
デモ環境は 1 時間以内に自動構築されます:
https://www.aiapps.jp/demo/shift-handover/
ご利用ありがとうございます!
ご要望いただいた「ShiftHandover」を実装し、リリースいたしました。
【ご利用方法】
ダッシュボード: https://www.aiapps.jp/?action=dashboard
アプリ詳細: https://www.aiapps.jp/apps/show.php?slug=shift-handover
デモ環境は 1 時間以内に自動構築されます:
https://www.aiapps.jp/demo/shift-handover/
ご利用ありがとうございます!
Echo
Iris