ローコードツールで作るLIFF管理画面

# ToolJet とは

ToolJetとは、オープンソースで開発されているローコードツールです。
ノーコードでも十分な Web アプリが作れるほど機能が充実しており、REST APIとの接続や任意の JavaScript が書けるなど表現力も高いため個人的に非常に注目しているツールとなっています。

この記事では、この ToolJet を使ってハンズオン風に LIFFサーバーAPIを使ったLIFF管理画面を作成していきます。

# 始める前に

## LINEログインチャネルの作成

以下のリンクを参考に LINE ログインチャネルを作成します。

https://developers.line.biz/ja/docs/line-login/getting-started/#step-1-create-channel

## ToolJet を使えるようにする

ToolJet を使うためには

- ToolJet Cloud を利用する
- セルフホストする
- ローカルで Docker で動かす

の3通りの手段があります。
まずは ToolJet Cloud で試すのがオススメですが、自由な環境で試したい場合には以下のリンクを参考に Docker の環境を作るのが良いと思います。

https://docs.tooljet.com/docs/setup/try-tooljet

# 1. アクセストークンを取得する

ここから、ToolJet を使ってWebアプリを順に構築していきます。

## 1.1. アプリを作る

ログインしたらまずは「Create new application」ボタンをクリックしてアプリを作成します。
今回はまっさらな状態からアプリを作成しますが、「Choose from template」を選ぶとサンプルから継いでアプリを作ることが出来ます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314315/cc2d9d54-6230-88e9-c254-091566b1a410.png)

## 1.2. ドラッグ & ドロップでコンポーネントを配置する

右側のペインにあるコンポーネント一覧から必要なものを選び、ドラッグ & ドロップで配置していきます。
コンポーネントを選択すると右側のペインはコンポーネントの設定になり、コンポーネント名から各種振る舞い、デザインなどを変更することが出来ます。

![localhost_3000_apps_1dc1f646-4481-4207-aa05-890f02112626.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314315/c36b7482-9df5-0883-c76e-b9f0149e8385.png)

## 1.3. クエリを書く

まずはLINEログインチャネルのアクセストークンを取得したいので、以下のAPIを実行する処理を作成していきます。
https://developers.line.biz/ja/reference/messaging-api/#issue-shortlived-channel-access-token

`Queries` → `REST API` を選択し、以下の通り値を設定していきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314315/f3da2bc0-f284-ed18-0049-cef2438bfe2f.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314315/79769f2c-f1d7-686f-f9c2-8e301bd5ed64.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314315/6103e2c7-bd82-d563-e86a-4f23fcdde148.png)

設定中に登場する `{{}}` は JavaScript のコードを挿入する際の記法です。ここでは 1.2. で配置したコンポーネントに設定されている値を使うように設定しています。
コンポーネントから値を取得するためには `Inspector` 機能を使うと便利です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314315/7397d433-f242-2654-3a81-99ed679c1253.png)

## 1.4. ボタンにクエリの実行処理を紐づけます

作成したクエリを実行するために、以下のように設定してボタンにイベントを紐づけます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314315/22e797cb-aa88-05b5-aec1-92e499641722.png)

## 1.5. 動作確認をする

ToolJet は開発画面でそのまま動作確認が出来るのが興味深いところ。
チャネルID とチャネルシークレットを入力して「アクセストークン発行」ボタンをクリックするとAPIの実行が確認できると思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314315/5e013e84-b722-2a3f-a795-5509df70c61d.png)


実行結果は `Inspector` で確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314315/43bc4666-73d0-8b9a-76aa-3e2d44ae3034.png)

今回は開発画面上から動作を確認しましたが、画面右上の `Preview` ボタンをクリックすることでも動作確認をすることが出来ます。

## 1.6. アクセストークンの発行に成功した際の処理を作成する

このクエリで取得したアクセストークンは他のAPIを実行する際に利用するため、別途変数に保存しておきます。
1.3. で作成したクエリの `Advanced` のタブを開き、以下の通り設定します。

ここでは、クエリ成功イベントで `Set variable` アクションを実行するよう設定しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314315/56d6d8a3-8750-a802-29a2-a412a9095454.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314315/7ab772d1-3bd6-2bc1-bdda-0fdb8f68fbdf.png)

# 2. LIFFアプリをチャネルに追加する

## 2.1. リクエストボディの入力画面を作成する

Modal コンポーネントを使って入力画面を作っていきます。
ユーザーフレンドリーになるように入力項目はもっとリッチにしたいところですが、今回はリクエストボディのJSONを直接入力する仕様とします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314315/0777ba58-2950-a3d6-0b6d-df66a9eb15d5.png)

## 2.2. クエリを書く

LIFFサーバーAPI を実行して、LIFFアプリを作成する部分を作成します。
https://developers.line.biz/ja/reference/liff-server/#add-liff-app

基本的には 1.3. と変わらないのですが、

- `Bearer` という固定の文字列と `{{}}` の記法で文字列結合している
- `Raw JSON` でリクエストボディを設定している

の2点が新しい要素になります。
1.3. で書いたように全てのクエリでパラメータがキーバリューの形で書けると良いのですが、LIFFアプリを追加するAPIは入れ子になったJSONを取り扱うので Raw JSON を書いて自分で構築する必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314315/6529386d-cdea-238c-abcb-2a3e326cc794.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314315/3d0c75af-ae6d-efc0-aba1-4776f8cc710b.png)


## 2.3. ボタンにクエリ実行処理を紐づける

前項で作成したクエリを実行できるようにします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314315/002044dc-bbc4-a4d8-33ef-87dd38096352.png)


## 2.4. API の実行に成功したらモーダルを閉じる

これでLIFFアプリを作ることが出来るようになったのですが、このままではクエリが成功してもモーダルが閉じません。
1.6. で書いたように、クエリに成功した際にモーダルを閉じる処理を追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314315/88bc4441-b564-d7e8-0412-4fc84dd8fede.png)

# 3. すべてのLIFFアプリを取得する

## 3.1. リクエスト処理

まずはLIFFアプリを取得するAPIを実行します。
https://developers.line.biz/ja/reference/liff-server/#get-all-liff-apps

ここでは新しいノウハウはないのですが、クエリの実行結果をこの先で利用したいのでこのタイミングで一度クエリを実行しておきましょう。
クエリ設定のペイン右上にある `Preview` ボタンか、クエリ一覧の右端にある再生ボタンをクリックすることでクエリを試しに実行することが出来ます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314315/f7edb392-17a4-2834-1493-30b3d6c3471b.png)

## 3.2. 一覧画面を作成

一覧の表示にはテーブルコンポーネントを使用します。
先ほど実行して得られた結果を `Inspector` でコピーして、テーブルコンポーネントの `Table data` に設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314315/fa6fcce6-50c9-4a45-abca-66cbf9c4cfa9.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314315/70e07133-77a5-9b57-af71-a3db4c89903c.png)

このときにクエリの実行結果があれば、上の画像の通りある程度自動でカラムの表示設定をしてくれます。

## 3.3. 一覧取得APIを実行する

最後に、以下のタイミングで一覧取得APIを実行するよう修正しましょう。

- アクセストークン発行後
- LIFFアプリ追加後

これまでと同様に、 `issue_shortlived_channel_access_token` と `add_liff_app` のクエリ成功時に `Run Query` を追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314315/ad60ae2a-0614-54a5-ad65-b0b95d76aad5.png)


# 4. LIFFアプリをチャネルから削除する

## 4.1. APIの作成

次は削除のAPIを実行します。APIのエンドポイントに変数が含まれることが新しい要素で、今回はテーブルの選択行のLIFFアプリを削除するよう設定しています。
https://developers.line.biz/ja/reference/liff-server/#delete-liff-app

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314315/cb1fe75c-4f86-b77c-8dcb-4a860232ba90.png)

クエリが成功したら一覧を更新することも忘れないようにしておきましょう！

## 4.2. テーブルにボタンを追加

テーブルの各行に削除ボタンを表示し、先ほどのクエリを紐づけます。
コンポーネントごとに様々な設定がありますが、設定内容はいつでも似ているので慣れていくとスムーズになると思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314315/fe8a7d01-fc3e-28f8-aef1-0961ab8832c4.png)


# 5. 【やってみよう】LIFFアプリの設定を更新する

ここまでの知識を駆使すると更新画面を作ることが出来ると思います。ハンズオンの締めに是非挑戦してみて下さい！
（手抜きではありません💦💦💦）


# 6. 【おまけ】より良いUI/UXのために

## 6.1. アクセストークンを発行する前

コンポーネントの設定に `Fx` と書かれている部分には JavaScript のコードを書くことが出来ます。
アクセストークンが無ければモーダルのボタンを表示したくなければ、以下のように書くと良いでしょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314315/bc1b19d0-09fd-b61f-26d3-3e253b4d6f89.png)


## 6.2. 一覧取得中のローディング表示

APIの実行中にはローディングスピナーを表示したいコンポーネントがあると思います。
ToolJet には query の要素に `isLoading` というプロパティを用意しているので、 `Loading State` に以下のような記述をすることで実現することが出来ます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314315/4f847916-7e3e-11d2-4502-22229ff2db30.png)