リクエスト詳細
✨ 既存アプリの改善
対応完了
対象アプリ: 旅のしおり自動生成メーカー TravelNote
しおりに「旅のメモ帳」セクションを追加(フリーテキストの自由記述欄)
## 1. 目的
旅行幹事が「集合場所の案内」「ホテルチェックイン手順」「現地の注意事項」など、タイムラインや持ち物リストに収まらない自由なメモを書き込めるセクションを追加する。現状のしおりは構造化されたデータ(タイムライン・持ち物・費用)に限られており、幹事から参加者への一言メッセージや旅のルールなどを伝える手段がない。印刷・PDF・共有URLにも反映することでしおりとしての完成度を高める。
## 2. 具体的な仕様
### 2-1. データ構造
- `itineraries` テーブルの `schedule_json` または別カラムで管理するか検討するが、既存スキーマへの影響を最小化するため、`itineraries` テーブルに `memo_json TEXT NULL` カラムを追加するのが最もシンプル。
- `memo_json` の内容: `[{"title": "集合場所", "body": "東京駅八重洲口..."}, ...]` の配列(最大5件、タイトル最大30文字、本文最大400文字)。
- schema.sql の後方互換ALTER文(既存パターンと同様に `information_schema` で存在チェックしてから ADD COLUMN)で追加。既存行は NULL のまま → 表示時は空として扱う。
### 2-2. しおり生成時の初期値
- `generate_itinerary()` 相当の処理で `memo_json = []`(空配列)として保存。自動提案は行わない(ユーザーが自由に書くため)。
### 2-3. 表示(view.php)
- 日程タイムラインと持ち物チェックリストの間に「📝 旅のメモ」セクションを追加。
- `memo_json` が空配列 or NULL の場合、閲覧者(読み取り専用)にはセクション自体を非表示にする。
- 編集モード(`$can_edit = true`)では空でも「+ メモを追加」ボタンを表示。
- 各メモはカード状に並べ(タイトル太字 + 本文)、印刷・PDF にも自然に出力されるよう `.memo-card` クラスで `print.css` に対応。
### 2-4. 編集(JS側)
- 編集モード中、各メモカードにタイトル/本文のインライン編集(`contenteditable` または `<input>`/`<textarea>`)を有効化。
- 「+ メモを追加」ボタンで空のカードを追加(最大5件超えたらボタンを非活性)。
- 各カードに🗑削除ボタンを表示。
- 「保存する」ボタン押下時、既存の `schedule` / `packing` と同様に `memo` を JSON stringify して `action=update` へ POST する。
### 2-5. サーバー側(lib.php / index.php)
- `sanitize_memo(array $data): array` 関数を追加。各要素の `title`・`body` を `mb_substr` でトリム・文字数制限、件数を最大5件にクランプ。
- `update_itinerary()` を拡張して `memo_json` も UPDATE できるようにする(`memo` キーが POST に含まれる場合のみ更新)。
- `find_itinerary_by_hash()` の返却値に `memo` キーを追加(`json_decode` した配列)。
### 2-6. コピー機能との整合
- `copy_itinerary()` でコピー時に `memo_json` もそのままコピーする(コピー後に自分で編集できる)。
### 2-7. PDF・印刷
- `.memo-section` は `.no-print` を付けず印刷対象に含める。`print.css` で改ページを考慮し `page-break-inside: avoid` を各 `.memo-card` に付与。
### 2-8. UIスケッチ(編集モード時)
```
📝 旅のメモ
┌─────────────────────────────────────┐
│ [集合場所 ] 🗑 │
│ 東京駅八重洲口 南口 8:30集合 │
└─────────────────────────────────────┘
┌─────────────────────────────────────┐
│ [注意事項 ] 🗑 │
│ 現金を多めに準備してください │
└─────────────────────────────────────┘
+ メモを追加(5件まで)
```
## 3. 既存機能との整合(壊さない点)
- `schedule_json` / `packing_json` には一切変更しない。
- `memo_json` カラムは NULL 許容で既存行はそのまま動作する。
- 共有URL(読み取り専用)は `memo_json` が空なら表示しないため、既存のしおりに余分なセクションは出ない。
- `action=update` へのリクエストは `memo` キーがない場合は更新しないため、JS を変更しない旧クライアントからの保存も後方互換を保つ。
- PDF生成(pdf_export.php)はHTMLを印刷CSSでレンダリングしているため、`.memo-card` が正しくマークアップされていれば追加対応不要。
旅行幹事が「集合場所の案内」「ホテルチェックイン手順」「現地の注意事項」など、タイムラインや持ち物リストに収まらない自由なメモを書き込めるセクションを追加する。現状のしおりは構造化されたデータ(タイムライン・持ち物・費用)に限られており、幹事から参加者への一言メッセージや旅のルールなどを伝える手段がない。印刷・PDF・共有URLにも反映することでしおりとしての完成度を高める。
## 2. 具体的な仕様
### 2-1. データ構造
- `itineraries` テーブルの `schedule_json` または別カラムで管理するか検討するが、既存スキーマへの影響を最小化するため、`itineraries` テーブルに `memo_json TEXT NULL` カラムを追加するのが最もシンプル。
- `memo_json` の内容: `[{"title": "集合場所", "body": "東京駅八重洲口..."}, ...]` の配列(最大5件、タイトル最大30文字、本文最大400文字)。
- schema.sql の後方互換ALTER文(既存パターンと同様に `information_schema` で存在チェックしてから ADD COLUMN)で追加。既存行は NULL のまま → 表示時は空として扱う。
### 2-2. しおり生成時の初期値
- `generate_itinerary()` 相当の処理で `memo_json = []`(空配列)として保存。自動提案は行わない(ユーザーが自由に書くため)。
### 2-3. 表示(view.php)
- 日程タイムラインと持ち物チェックリストの間に「📝 旅のメモ」セクションを追加。
- `memo_json` が空配列 or NULL の場合、閲覧者(読み取り専用)にはセクション自体を非表示にする。
- 編集モード(`$can_edit = true`)では空でも「+ メモを追加」ボタンを表示。
- 各メモはカード状に並べ(タイトル太字 + 本文)、印刷・PDF にも自然に出力されるよう `.memo-card` クラスで `print.css` に対応。
### 2-4. 編集(JS側)
- 編集モード中、各メモカードにタイトル/本文のインライン編集(`contenteditable` または `<input>`/`<textarea>`)を有効化。
- 「+ メモを追加」ボタンで空のカードを追加(最大5件超えたらボタンを非活性)。
- 各カードに🗑削除ボタンを表示。
- 「保存する」ボタン押下時、既存の `schedule` / `packing` と同様に `memo` を JSON stringify して `action=update` へ POST する。
### 2-5. サーバー側(lib.php / index.php)
- `sanitize_memo(array $data): array` 関数を追加。各要素の `title`・`body` を `mb_substr` でトリム・文字数制限、件数を最大5件にクランプ。
- `update_itinerary()` を拡張して `memo_json` も UPDATE できるようにする(`memo` キーが POST に含まれる場合のみ更新)。
- `find_itinerary_by_hash()` の返却値に `memo` キーを追加(`json_decode` した配列)。
### 2-6. コピー機能との整合
- `copy_itinerary()` でコピー時に `memo_json` もそのままコピーする(コピー後に自分で編集できる)。
### 2-7. PDF・印刷
- `.memo-section` は `.no-print` を付けず印刷対象に含める。`print.css` で改ページを考慮し `page-break-inside: avoid` を各 `.memo-card` に付与。
### 2-8. UIスケッチ(編集モード時)
```
📝 旅のメモ
┌─────────────────────────────────────┐
│ [集合場所 ] 🗑 │
│ 東京駅八重洲口 南口 8:30集合 │
└─────────────────────────────────────┘
┌─────────────────────────────────────┐
│ [注意事項 ] 🗑 │
│ 現金を多めに準備してください │
└─────────────────────────────────────┘
+ メモを追加(5件まで)
```
## 3. 既存機能との整合(壊さない点)
- `schedule_json` / `packing_json` には一切変更しない。
- `memo_json` カラムは NULL 許容で既存行はそのまま動作する。
- 共有URL(読み取り専用)は `memo_json` が空なら表示しないため、既存のしおりに余分なセクションは出ない。
- `action=update` へのリクエストは `memo` キーがない場合は更新しないため、JS を変更しない旧クライアントからの保存も後方互換を保つ。
- PDF生成(pdf_export.php)はHTMLを印刷CSSでレンダリングしているため、`.memo-card` が正しくマークアップされていれば追加対応不要。
💬 返信 (3)
🛠 開発を開始しました (機能追加 (travelnote))
ご要望ありがとうございます。AI 開発ワーカーが実装を開始します。
通常 5〜30 分で Pull Request を作成し、レビュー後にリリースされます。
ご要望ありがとうございます。AI 開発ワーカーが実装を開始します。
通常 5〜30 分で Pull Request を作成し、レビュー後にリリースされます。
📝 開発が完了しました
ご要望いただいた内容の実装が完了し、最終チェック段階に入りました。
レビュー (自動) → リリース、の流れで進みます。
もう少々お待ちください。
ご要望いただいた内容の実装が完了し、最終チェック段階に入りました。
レビュー (自動) → リリース、の流れで進みます。
もう少々お待ちください。
✅ リリース完了のお知らせ
ご要望いただいた「旅のしおり自動生成メーカー TravelNote」を実装し、リリースいたしました。
【ご利用方法】
ダッシュボード: https://www.aiapps.jp/?action=dashboard
アプリ詳細: https://www.aiapps.jp/apps/show.php?slug=travelnote
デモ環境は 1 時間以内に自動構築されます:
https://www.aiapps.jp/demo/travelnote/
ご利用ありがとうございます!
ご要望いただいた「旅のしおり自動生成メーカー TravelNote」を実装し、リリースいたしました。
【ご利用方法】
ダッシュボード: https://www.aiapps.jp/?action=dashboard
アプリ詳細: https://www.aiapps.jp/apps/show.php?slug=travelnote
デモ環境は 1 時間以内に自動構築されます:
https://www.aiapps.jp/demo/travelnote/
ご利用ありがとうございます!
Echo
Iris