ノーコードツールのbubbleで共通ロジックを実現する方法

## この記事は何か

ノーコードツールのbubbleで開発をしていて、「ロジックを共通化したい」ような気持ちになることがあるのではないでしょうか。
この記事ではロジックを共通化するための手段を１つ紹介できればと思います

## ロジックを共通化したいケースの具体例

![スクリーンショット 2023-12-19 18.19.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23308/88b3241b-f41c-a3ee-a377-f89155ccc6e0.png)

今回は求人を作成する場面で考えます。求人を作成しようとしている時下記の要件が考えられます。
- 全て入力できていなかったらバリデーションエラーを表示する
- 全て入力できていたら掲載開始ボタンを活性化する

これらの要件は「全て入力できているかどうかを判断する」ロジックが共通しています。
素直にbubbleで用件を実現しようとすると下記のような条件式をエラー文言・ボタンにそれぞれ実装しなければなりません。
このような場合に、どうロジック共通化を実現するのかを紹介していきます。

## 実現方法

### プラグイン「Toolbox」のインストール

![スクリーンショット 2023-12-19 19.12.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23308/2d850348-f7bb-d58c-9e52-7e9de4709a32.png)

まずはプラグイン「Toolbox」をインストールします。
このプラグインの説明は他のサイトに譲ります。今回はこのプラグインでjavascriptでの処理結果をbubbleのアクションへ渡すために利用しました。

### reusable elementで共通ロジックを作成

reusable elementで「InputCompleteCheckLogic」という名前でエレメントを作成しました。

#### Custom statesを設定

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23308/aafe7be1-055e-4fca-c495-88ce9bd48405.png" width="50%"/>

エレメントには全てCustom statesを設定することができます。
reusable elementのルートエレメント（言葉が適切か怪しいですが）に設定したCustom statesは、このエレメントを使っている側で参照することができます。

#### エレメントのプロパティを設定


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23308/73379d9c-5176-5cdf-cef3-e86c5152022e.png" width="50%"/>

このエレメントを使う時に指定できるプロパティを設定します。
今回は入力項目の数だけプロパティを設定しました。

#### JavascripttoBubble を配置

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23308/4f8892a6-a64d-1fd7-a29a-45216e2b07e6.png" width="50%"/>

このエレメントを配置すると、そのページが開かれている時「bubble_fn_{指定した名前}」で関数が呼べるようになります。
この関数を呼ぶとイベントをトリガーし、bubbleで設定したロジックを実行できるようになっています。

今回は入力項目が全て入力されているかどうか、を判断したいので value type を「yes / no」にしました。

#### Expression を配置

![スクリーンショット 2023-12-19 19.15.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23308/71d3fb88-3ff2-38cb-1a1f-5f177682a26d.png)

このエレメントを配置するとjavascriptのコードを実行でき、返り値をbubbleで扱うことができるようになります。
今回は「入力項目が全て入力されているかどうかの判断結果をJavascripttoBubbleへ渡す」ために利用しました。

#### JavascripttoBubbleのイベントをトリガーにCustom statesを更新

![スクリーンショット 2023-12-19 19.16.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23308/f4dc348e-b2fc-d272-9d50-e36524c6019d.png)

JavascripttoBubbleのイベントをトリガーにCustom statesを更新するように設定しました。

### 共通ロジックを利用

#### 利用画面に共通ロジックを配置

![スクリーンショット 2023-12-19 19.17.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23308/8068a805-a5af-34b1-71fb-d843413b9381.png)


作成した共通ロジックを画面の任意の場所に配置します。
あらかじめインプット要素を設定しているので、プロパティにそれぞれの値を与えてあげるようにします。

#### あとはロジックのCustom statesを参照するだけ

| バリデーションエラーテキスト | 掲載ボタン |
| --- | --- |
| ![スクリーンショット 2023-12-19 19.17.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23308/0d6faeaa-77c5-167d-0849-ee5ad369873c.png) | ![スクリーンショット 2023-12-19 19.18.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23308/2a6c7888-b556-0216-8e52-6da9ea83cd41.png) |

実際の動作
![名称未設定.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23308/fd93d4e5-ec9d-24da-bb06-b32975397e74.gif)



以上で必要な準備が全て完了しました。

今回はバリデーションエラーテキストと、ボタン側でこの共通ロジックのCustom states を参照するだけで用件を実現できることができるようになりました。

ノーコード開発で何かしらの助けになれば幸いです。