(第3回)Electronでクロスプラットフォーム開発しよう(製造編②)

(第3回)Electronでクロスプラットフォーム開発しよう(製造編②)

目次

はじめに
jKanban
かんばんを表示する
タスクを追加する
開発者ツールを表示する
次回予告

はじめに

前回は、アプリケーションの起動までを行いました。
今回からは、簡単なかんばんアプリを作成しながらElectronの機能を紹介します。

かんばんアプリの完成イメージ

jKanban

今回はかんばんアプリの画面を簡単に作成するため、JavaScriptのかんばんアプリのライブラリ「jKanban」を使用します。
jKanban:https://github.com/riktar/jkanban

jKanbanを使用するには、githubから取得したjsとcssをプロジェクトに含めます。
index.htmlでは下記のようにjkanban.min.cssjkanban.min.jsを指定します。
※デザイン用にbootstrapのcssも追加しています。

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <title>itport-electron</title>
    <!-- https://electronjs.org/docs/tutorial/security#csp-meta-tag -->
    <meta http-equiv="Content-Security-Policy" content="script-src 'self' 'unsafe-inline';" />
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
<!-- jKanbanを追加 -->
    <link rel="stylesheet" href="./dist/jkanban.min.css">
    <script src="./dist/jkanban.min.js"></script>
  </head>
  <body>
    <h1>Hello World!</h1>
    このアプリケーションは以下を使用しています。
    <ul>
        <li>node  <script>document.write(process.versions.node)</script></li>
        <li>chrome  <script>document.write(process.versions.chrome)</script></li>
        <li>Electron  <script>document.write(process.versions.electron)</script></li>
    </ul>
  </body>
</html>

かんばんを表示する

jKanbanを使ってかんばんを表示するために、bodyタグ内を以下のように変更します。

<body>
    <div style="margin:10px;">
        <div id="kanban"></div><!-- ここにかんばんを表示します -->
    </div>

<script>
<!-- ここにかんばんを表示するプログラムを記載します -->
</script>
</body>

HTMLとしては以上で、script内にjKanbanを使ったプログラムを記載していきます。
かんばん自体はID属性「kanban」に対して表示を行うようにします。

jKanbanの使い方は簡単です。
以下の書き方でjKanbanを初期化します。

var kanban = new jKanban(options)

今回は最低限のオプションのみ使用します。その他のオプションについてはgithubのページを参照してください。
今回はサンプルとして以下のような内容を指定します。

    <script>
        var boards = [
            {
                "id": "board-1",
                "title": "未対応",
                "class": "bg-danger",
            },
            {
                "id": "board-2",
                "title": "処理中",
                "class": "bg-primary",
            },
            {
                "id": "board-3",
                "title": "処理済み",
                "class": "bg-success",
            },
            {
                "id": "board-4",
                "title": "完了",
                "class": "bg-info",
            },
        ];
        var kanban = new jKanban({
            element: "#kanban",     //ボード表示対象の要素
            gutter: '5px',         //ボード同士の間隔
            widthBoard: '250px',    //ボードのサイズ
            boards: boards,         //初期データ
        });
    </script>

ボードのサイズやボード間の間隔と初期表示時のデータを指定します。
初期データとして「未対応」「処理中」「処理済み」「完了」の4つのボードをデータ無しで指定しており、classにはbootstrapのcssでかんばんの色を設定しています。
ここまでの内容で、一度画面を見てみます。

意図したとおり 「未対応」「処理中」「処理済み」「完了」 の4つのボードが色分けされて表示されました。
このままでは、タスクの追加が出来ないので、次にタスクが追加できるように修正します。

タスクを追加する

タスクの追加が出来るように、ボタンの表示とボタン選択時の動作を追加します。
タスク追加ボタンは、jKanbanにオプション「itemAddOptions」が用意されているので、オプションを使用して表示します。
タスク追加ボタンをクリックした際のイベントは「buttonClick」にて指定します。

        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                                       // 表示位置
            },
            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;
                    }
                    kanban.addElement(boardId, { "title": title}); //入力された文字列をタスクとして登録
                    formItem.parentNode.removeChild(formItem); //入力フォーム削除
                }) 
            },
        });

今回は、追加ボタンを選択すると、テキストボックスと追加・キャンセルのボタンを表示するようにしました。
実際の画面を見てみましょう。

意図したとおり、ボードのタイトルに「+」ボタンが表示され、ボタンを押すことでボードにテキストボックスと追加・キャンセルボタンが表示されることが確認できます。
また、ドラッグ&ドロップにより、タスクを別のボードへ移動できます。

開発者ツールを表示する

ElectronはChromium(Googleが開発しているオープンソースのWebブラウザ)が使用されているので、GoogleChromeなどのブラウザと同様に、開発者ツールを表示できます。
HTMLやJavaScriptを記載していると、開発者ツールでコンソールを表示したり、CSSの確認をしたくなることがあります。
main.jsで「openDevTools()」を呼ぶことで、アプリ起動時点で開発者ツールが表示できます。main.jsに追加した場合は以下になります。

//main.js
const { app, BrowserWindow } = require('electron')

function createWindow () {
  // ブラウザウィンドウを作成
  let win = new BrowserWindow({
    width: 800,
    height: 600,
    webPreferences: {
      nodeIntegration: true
    }
  })

  // ウィンドウに読み込む画面を指定
    win.loadFile('index.html')
    win.webContents.openDevTools();// 開発者ツールを開く
}
app.whenReady().then(createWindow)

1文追加したことで、chromeで見る開発者ツールとほとんど同じ画面が、アプリケーションのウィンドウとは別に表示されます。

次回予告

今回はかんばんアプリの画面を作成しました。
現状では起動するたびにタスクがクリアされた状態となるので、次回からは追加したタスクの保存と保存データの表示を行います。