0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

家計簿アプリにカテゴリの追加・編集・削除機能を実装した【改修記録⑥】

0
Posted at

はじめに

月別切り替え・円グラフ・予算設定・固定費自動追加・CSVエクスポートに続き、今回はカテゴリの追加・編集・削除機能を実装しました。

【シンプル家計簿】https://kakeibo-khaki.vercel.app/

これまでカテゴリは「食費・交通費・光熱費・娯楽・医療・給与・その他」の7つ固定でしたが、自分の好みでカスタマイズできるようになりました。


追加した機能

カテゴリ設定画面(category.html)

category_20260511.png

  • カテゴリの追加・編集・削除が可能
  • デフォルト7カテゴリは「デフォルト」バッジ付きで表示
  • 重複名のチェックあり
  • 削除時に確認ダイアログを表示
  • データはkakeibo_catsキーでlocalStorageに保存

index.htmlの変更点

  • カテゴリセレクトをlocalStorageから動的に生成
  • 予算パネルのカテゴリ別設定も動的に生成
  • 🏷️カテゴリ設定へのリンクを追加

実装の概要

1. データ構造

// kakeibo_catsの構造
cats = [
  { id: 123, name: '食費',   isDefault: true },
  { id: 456, name: '交通費', isDefault: true },
  { id: 789, name: '美容',   isDefault: false }, // 追加したカテゴリ
]

isDefaultフラグで「デフォルト」バッジの表示を制御しています。

2. 初期化処理

const DEFAULT_CATS = ['食費','交通費','光熱費','娯楽','医療','給与','その他'];

let cats = JSON.parse(localStorage.getItem('kakeibo_cats') || 'null');
if(!cats){
  // 初回アクセス時はデフォルトカテゴリを生成して保存
  cats = DEFAULT_CATS.map(name => ({
    id: Date.now() + Math.random(),
    name,
    isDefault: true
  }));
  saveCats();
}

nullチェックをすることで、初回アクセス時だけデフォルトカテゴリを生成します。2回目以降はlocalStorageから読み込みます。

3. 編集機能のUI切り替え

function startEdit(id){
  const item = document.querySelector(`.cat-item[data-id="${id}"]`);
  // 表示要素を隠してinputを表示
  item.querySelector('.cat-name').style.display = 'none';
  item.querySelector('.edit-input').style.display = 'block';
  item.querySelector('.edit-input').focus();
  // ボタンを切り替え
  item.querySelector('.btn-edit').style.display = 'none';
  item.querySelector('.btn-save').style.display = 'inline-block';
  item.querySelector('.btn-cancel').style.display = 'inline-block';
  item.querySelector('.btn-del').style.display = 'none';
}

編集ボタンを押すとテキストがinputに切り替わり、保存・キャンセルボタンが表示されます。displayの切り替えだけで実現しています。

4. index.htmlのカテゴリを動的生成

変更前(固定):

<select id="inp-cat">
  <option value="食費">食費</option>
  <option value="交通費">交通費</option>
  <!-- 固定で書いていた -->
</select>

変更後(動的):

<select id="inp-cat"></select> <!-- 空のまま -->
// カテゴリをlocalStorageから読み込んで動的に生成
function renderCatSelect(){
  const sel = document.getElementById('inp-cat');
  sel.innerHTML = getCatNames()
    .map(name => `<option value="${name}">${name}</option>`)
    .join('');
}

// 起動時に呼び出す
renderCatSelect();

まとめ

変更箇所 内容
category.html カテゴリ設定専用画面を新規作成
index.html カテゴリセレクトを動的生成に変更
index.html 予算パネルのカテゴリ別設定も動的生成に変更
index.html カテゴリ設定へのリンクを追加

次回はダークモード対応の実装を予定しています。


★開発したアプリ
【シンプル家計簿】https://kakeibo-khaki.vercel.app/

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?