リクエスト詳細
✨ 既存アプリの改善
対応完了
対象アプリ: ClipVault スニペット管理
スニペット使用回数カウントと「よく使う順」ソート機能の追加
## 1. 目的
ワンクリックコピーを実行するたびに使用回数をカウントし、「よく使う順」でスニペットを並び替えられるようにする。ユーザーが実際に頻繁に使うスニペットをすぐ見つけられるようになり、管理件数が増えても利便性が下がらない。
---
## 2. 具体的な仕様
### 2-1. データ構造の変更
既存スニペットオブジェクトに以下2フィールドを追加する(既存データには初期値を付与してマイグレーション)。
```json
{
"useCount": 0, // コピーボタン押下ごとに +1
"lastUsedAt": null // 最終使用日時 (ISO 8601文字列、未使用はnull)
}
```
import した旧データにこのフィールドが無い場合は `useCount: 0 / lastUsedAt: null` を補完して取り込む。export 時は新フィールドも含めて出力する。
### 2-2. コピーボタンの動作変更
既存のコピー処理(クリップボードへの書き込み)はそのまま維持し、成功時に以下を追加実行する。
- 対象スニペットの `useCount` を +1
- `lastUsedAt` を現在日時(`new Date().toISOString()`)に更新
- localStorage を保存
- カード上の使用回数バッジを即時更新(ページリロード不要)
### 2-3. 使用回数バッジの表示
各スニペットカードの右下(お気に入りアイコンの隣)に小さなバッジを追加する。
- `useCount >= 1` の場合のみ表示(0回は非表示でカードをすっきり保つ)
- テキスト例: `📋 12` または `×12`
- ダークモード・ライトモード両対応のサブカラー(既存CSS変数を流用)
### 2-4. ソートUI
既存のフィルターバー(言語・タグ横スクロール行)の右端、または検索バーの右横に「並び順」セレクトボックスを追加する。
```
[並び順 ▼]
├ 新着順(デフォルト・既存動作)
├ よく使う順(useCount 降順、同値は lastUsedAt 降順)
├ 最近使った順(lastUsedAt 降順、nullは末尾)
└ タイトル昇順(A-Z)
```
- 選択値は `localStorage` の別キー `clipvault_sort` に保存し、ページ再読み込み後も維持する。
- ソートは既存の言語/タグフィルター・全文検索と **組み合わせて** 動作する(フィルター後の結果をソート)。
- お気に入りピン留め(既存機能)は引き続き最優先で上部表示し、その中でもソート順を適用する。
### 2-5. スマホ対応
- セレクトボックスはネイティブ `<select>` を使用し、スマホでもタップ操作しやすいよう `min-height: 36px` を確保する。
- SP幅では検索バー下に1行で全幅表示、PC幅では検索バー右に inline-flex で配置する。
---
## 3. 既存機能との整合(壊さない点)
- CRUD・コピー・タグ/言語フィルター・全文検索・highlight.js・export/import・お気に入り・テーマ切替はすべて既存ロジックを変更しない。
- デフォルトの並び順は「新着順」のままなので、初回利用時の見た目は変わらない。
- import 時の旧データ補完はロード関数の先頭で一度だけ走らせ、保存し直すことで以降の処理への影響を最小化する。
- 500件上限・2カラムグリッド・サイドバーレイアウトはそのまま維持する。
ワンクリックコピーを実行するたびに使用回数をカウントし、「よく使う順」でスニペットを並び替えられるようにする。ユーザーが実際に頻繁に使うスニペットをすぐ見つけられるようになり、管理件数が増えても利便性が下がらない。
---
## 2. 具体的な仕様
### 2-1. データ構造の変更
既存スニペットオブジェクトに以下2フィールドを追加する(既存データには初期値を付与してマイグレーション)。
```json
{
"useCount": 0, // コピーボタン押下ごとに +1
"lastUsedAt": null // 最終使用日時 (ISO 8601文字列、未使用はnull)
}
```
import した旧データにこのフィールドが無い場合は `useCount: 0 / lastUsedAt: null` を補完して取り込む。export 時は新フィールドも含めて出力する。
### 2-2. コピーボタンの動作変更
既存のコピー処理(クリップボードへの書き込み)はそのまま維持し、成功時に以下を追加実行する。
- 対象スニペットの `useCount` を +1
- `lastUsedAt` を現在日時(`new Date().toISOString()`)に更新
- localStorage を保存
- カード上の使用回数バッジを即時更新(ページリロード不要)
### 2-3. 使用回数バッジの表示
各スニペットカードの右下(お気に入りアイコンの隣)に小さなバッジを追加する。
- `useCount >= 1` の場合のみ表示(0回は非表示でカードをすっきり保つ)
- テキスト例: `📋 12` または `×12`
- ダークモード・ライトモード両対応のサブカラー(既存CSS変数を流用)
### 2-4. ソートUI
既存のフィルターバー(言語・タグ横スクロール行)の右端、または検索バーの右横に「並び順」セレクトボックスを追加する。
```
[並び順 ▼]
├ 新着順(デフォルト・既存動作)
├ よく使う順(useCount 降順、同値は lastUsedAt 降順)
├ 最近使った順(lastUsedAt 降順、nullは末尾)
└ タイトル昇順(A-Z)
```
- 選択値は `localStorage` の別キー `clipvault_sort` に保存し、ページ再読み込み後も維持する。
- ソートは既存の言語/タグフィルター・全文検索と **組み合わせて** 動作する(フィルター後の結果をソート)。
- お気に入りピン留め(既存機能)は引き続き最優先で上部表示し、その中でもソート順を適用する。
### 2-5. スマホ対応
- セレクトボックスはネイティブ `<select>` を使用し、スマホでもタップ操作しやすいよう `min-height: 36px` を確保する。
- SP幅では検索バー下に1行で全幅表示、PC幅では検索バー右に inline-flex で配置する。
---
## 3. 既存機能との整合(壊さない点)
- CRUD・コピー・タグ/言語フィルター・全文検索・highlight.js・export/import・お気に入り・テーマ切替はすべて既存ロジックを変更しない。
- デフォルトの並び順は「新着順」のままなので、初回利用時の見た目は変わらない。
- import 時の旧データ補完はロード関数の先頭で一度だけ走らせ、保存し直すことで以降の処理への影響を最小化する。
- 500件上限・2カラムグリッド・サイドバーレイアウトはそのまま維持する。
💬 返信 (3)
🛠 開発を開始しました (機能追加 (clipvault))
ご要望ありがとうございます。AI 開発ワーカーが実装を開始します。
通常 5〜30 分で Pull Request を作成し、レビュー後にリリースされます。
ご要望ありがとうございます。AI 開発ワーカーが実装を開始します。
通常 5〜30 分で Pull Request を作成し、レビュー後にリリースされます。
📝 開発が完了しました
ご要望いただいた内容の実装が完了し、最終チェック段階に入りました。
レビュー (自動) → リリース、の流れで進みます。
もう少々お待ちください。
ご要望いただいた内容の実装が完了し、最終チェック段階に入りました。
レビュー (自動) → リリース、の流れで進みます。
もう少々お待ちください。
✅ リリース完了のお知らせ
ご要望いただいた「ClipVault スニペット管理」を実装し、リリースいたしました。
【ご利用方法】
ダッシュボード: https://www.aiapps.jp/?action=dashboard
アプリ詳細: https://www.aiapps.jp/apps/show.php?slug=clipvault
デモ環境は 1 時間以内に自動構築されます:
https://www.aiapps.jp/demo/clipvault/
ご利用ありがとうございます!
ご要望いただいた「ClipVault スニペット管理」を実装し、リリースいたしました。
【ご利用方法】
ダッシュボード: https://www.aiapps.jp/?action=dashboard
アプリ詳細: https://www.aiapps.jp/apps/show.php?slug=clipvault
デモ環境は 1 時間以内に自動構築されます:
https://www.aiapps.jp/demo/clipvault/
ご利用ありがとうございます!
Echo
Iris