
目次
はじめに
NeDB
NeDBの基本的な使い方
DBへの保存
保存データの表示
次回予告
はじめに
前回は、jKanbanを使用してかんばんアプリの画面を作成しました。
今回は、タスクの保存と保存データの表示を行います。
NeDB
今回はタスクを保存して、次回起動時に保存したタスクが表示されるようにしたいので、NeDBを使用します。
NeDBはJavaScriptで動作する組み込み用のデータベースで、別途DB用ライブラリが不要でJavaScriptを実行できる環境であれば動作します。
NeDB:https://github.com/louischatriot/nedb
※NeDBは2015年からメンテナンスが行われていませんので注意してください。
まずは、 NeDBを使用するためにnpm installで必要なパッケージをインストールします。
npm install nedb
パッケージのインストールが完了したら、実際にDBを利用できるようにします。
NeDBではインメモリとDBファイルの2パターンの利用方法があります。
今回は、ツールを再起動してもデータを保持する必要があるので、ファイル形式でDBを用意します。
下記のコードをメイン画面(index.html)に追加することで、実行ファイルと同階層にdataフォルダを作成し、kanban.nedbというファイルが自動で作成されます。
const db = new Datastore({ filename: 'kanban.nedb', autoload: true })
NeDBの基本的な使い方
NeDBのAPIはMongoDBのAPIのサブセットなので、MongoDBと同じ使い方ができます。
追加
db.insert(doc)
db.insert(doc, (error, newDoc) => {})
ドキュメントを追加する場合は、insertを使います。
doc 追加するドキュメント。オブジェクトを指定します
newDoc DB登録後のドキュメントでアルファベット16文字からなる_idフィールドが追加されています
更新
db.update(query, doc, option, (error, numOfDocs) =>{});
ドキュメントを更新する場合は、updateを使います。
query 更新対象のドキュメントを指定 正規表現によって部分一致なども可能
例 IDを指定して検索する場合はvar query = {_id:”xxxxxxxxxxxxxxxx”} のようにします
doc 更新するドキュメント insertと同様にオブジェクトを指定する
option 複数ドキュメントの更新、一致するものがない場合に更新などで利用 今回は使用しません
numOfDocs 更新したドキュメント件数が返ってきます
削除
db.remove(query, options, (error, numOfDocs) => {})
ドキュメントを更新する場合は、removeを使います。
query 削除対象のドキュメントを指定
options 複数削除で利用
numOfDocs 更新したドキュメント件数が返ってきます
query 削除対象のドキュメントを指定
options 複数削除で利用
numOfDocs 更新したドキュメント件数が返ってきます
検索
db.find(query, (error, docs){})
db.findOne(query, (error, doc){})
ドキュメントを検索する場合は、findまたはfindOneを使います。
find クエリに一致するドキュメントを返す
query 検索対象ドキュメントを指定 正規表現によって部分一致なども可能
例 IDを指定して検索する場合はvar query = {_id:”xxxxxxxxxxxxxxxx”} のようにします
findOne クエリに一致したドキュメントのうち、1つを返す
DBへの保存
NeDBが使えるようになったので、kanban操作時にデータをNeDBへ保存するようにします。
まず、jKanbanから保存用のオブジェクトを取得する関数を用意します。
// kanbanからdb登録用オブジェクトを生成する
function getBoardItem(boardid) {
var target = kanban.getBoardElements(boardid);// kanbanから指定したボードIDのエレメントを取得
var items = Array.from(target).map(x => ({ title: x.textContent }));// 取得したエレメントをオブジェクトに変換
// DB登録用オブジェクトを作成
var board = {
boardid: boardid,
item: items
}
return board;
}
次に、取得したオブジェクトをDBに保存するメソッドを用意します。
function saveBoard() {
for (var i = 1; i <= 4; i++) {//ボード数分のループ
var boardid = `board-${i}`;
var query = { 'boardid': boardid };
var board = getBoardItem(boardid);// DB登録用オブジェクトをkanbanから取得
var options = { upsert: true };// queryの対象が存在しなければ更新ではなく追加
db.update(query, board, options, function (err, numOfDocs) {
console.log(board, numOfDocs);
});
}
}
先ほど紹介したdb.updateを使ってkanbanオブジェクトをDBに登録します。
optionでupsertを使用しているので、追加・更新を1文で行うことができています。
次に、kanban操作時にデータを保存したいので、kanbanの各イベント処理で上記のsaveBoardを呼び出します。
var kanban = new jKanban({
element: "#kanban", //ボード表示対象の要素
gutter: '5px', //ボード同士の間隔
widthBoard: '250px', //ボードのサイズ
boards: boards, //初期データ
dragBoards: false, //ボードのドラッグ
itemAddOptions: { //タスク追加用のボタンを表示
enabled: true, // 追加ボタン表示
content: '+', // ボタンテキスト
class: 'kanban-title-button btn btn-light btn-sm', // ボタンに設定するclass
footer: false // 表示位置
},
click: function (el) {
},
buttonClick: function (el, boardId) {
// 入力フォームを作成してボードに追加
const formItem = document.createElement('form');
formItem.innerHTML = '<input type="text" class="form-control" placeholder="課題を入力...">'
formItem.innerHTML += '<button type="submit" class="btn btn-primary btn-sm">追加</button>'
formItem.innerHTML += '<button type="button" class="btn btn-secondary btn-sm">キャンセル</button>';
kanban.addForm(boardId, formItem);
//キャンセルボタン
formItem.elements[2].addEventListener("click", (e) => {
formItem.parentNode.removeChild(formItem); //入力フォーム削除
});
//タスク追加処理
formItem.addEventListener('submit', (e) => {
e.preventDefault();
var title = e.target[0].value;
// 0文字の場合登録しない
if (title.length == 0) {
return;
}
var elem = kanban.addElement(boardId, { "title": title }); //入力された文字列をタスクとして登録
formItem.parentNode.removeChild(formItem); //入力フォーム削除
saveBoard();
})
},
dropEl: function (el, target, souce, sibling) {
saveBoard();
}
});
前回はbuttonClickイベントのみ使用しましたが、タスクを別のボードに移動させた際もDBを更新したいので、dropElイベントを追加して、そちらでもsaveBoard()を呼び出します。
ここまでの処理で、かんばんへのタスク追加、ボード移動の内容がDBに反映されるようになりました。kanban.nedbファイルを開くと、オブジェクトがテキストとして保存されているのが確認できます。

保存データの表示
ここまでで保存はできましたが、ツールを起動するたびにかんばんが初期状態に戻ってしまうので、画面起動時に保存されたデータを画面へ反映するようにします。
function loadDB() {
db.find({ boardid: /^board/ }, function (err, docs) {
docs.forEach((doc) => {
doc.item.forEach((item) => {
kanban.addElement(doc.boardid, item); //入力された文字列をタスクとして登録
});
});
});
}
DBに保存されたデータから、”boardid”が”board”で始まるデータを取得し、取得したデータをかんばんへ追加するメソッドを用意します。
このメソッドをjKanbanの初期化後に呼び出すことで、起動するたびに前回操作していた内容が表示されることが、確認できます。
次回予告
今回は、タスクの保存と保存データの表示を作成しました。
かんばんアプリとして最低限の機能はできましたが、不要なメニューが表示されていたり、ウィンドウサイズが適していないので、次回はそのあたりの対応を進めてみたいと思います。
