保活支援アプリのUIをNoodlで爆速プロトタイピングしてみた！

2020年アドベントカレンダーが始まりましたね！Noodlのアドベントカレンダーは発足から2年目です！
今年も盛り上げていきましょう🎄

今回は**NoodlでUIを作成してみた事例**をご紹介します。

Noodlって何？という方は[Noodl JP](https://www.tds-g.co.jp/noodl-jp/)のページをご参照ください。
#作ったもの
地図にメモを書き込めるアプリのUIです！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183282/e1b04de5-c69b-d95a-3660-f2d1fe7e1b54.png)

保育活動をしていて、保育施設の場外を確認しながらメモを取りたいなと思ったのが作ろうとしたきっかけです。

【**実装したい機能**】
 　- 地図でメモを書き込む地点を決める
 　- メモ入力
 　- 入力したメモと地点情報を記録&共有

今回は入力したテキストをサーバーに送る機能を実装しました。

#構成
##システム構成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183282/d0e9c6c9-1555-53ab-0858-dd1d048144f6.png)

Noodlの記録ボタンを押すと、メモ入力欄のテキストをサーバーにhttp request（今回はGET）で送信します。

サーバーには手軽にサービス連携のできる[enebular](https://www.enebular.com/ja/)の[Node-RED](https://nodered.jp/)を使用しました。Node-REDもフローベースのビジュアルプログラミングツールなので、非常にプロトタイピングの作業コストを減らすことができます。
（ここの解説はenebularのアドベントカレンダー記事で解説予定です）

Node-REDではNoodlから受け取ったデータを外部のストレージに記録します。（例えば[Firebae Realtime Database](https://firebase.google.com/docs/database?hl=ja)など）

##UI構成
UIは大きく分けて次の3つのパーツで構成されています。
 - 地図表示
 - メモ入力
 - 記録ボタン
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183282/9d7b5264-cf33-f151-fc27-c7a5ff544b4b.png)


#UIの解説
##地図表示
プロトタイプ特化で作りましたので、地図は画像を張り付けた形にしています。もう少し実装するとしたら、Google map APIで動的に表示し、メモを書き込む地点を選べるようにしていけたらと思います。

画像を張り付けるには、「**Imageノード**」を使用します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183282/8cb523a7-b680-12e7-0d4e-d06bbbb0bf3c.png)

Imageノードで使用する画像ファイルは、Noodlエディタ上にドラッグ&ドロップで使用できるようになります。

Imageノードのプロパティを開きImageカテゴリのSourceに、表示させたいファイル名を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183282/3eb0add8-9918-9f04-528f-da2635ea90b4.png)
##メモ入力欄
メモ入力には「**Text Inputノード**」を使用しています。このノードはその名の通り、テキスト入力が行えるノードです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183282/c5429d21-d3d0-4ad2-92f7-4620b9c126cc.png)

Text Inputノードのパラ目0太は次のようにしています。

Text：”メモ：”　（ここは最初から表示させたいテキストを書く）
Text type：Text Area　（Text Inputのサイズ全てにテキスト入力できるようにします）
Font size：25px
Background Color：#FFFFFF　（白）

##記録ボタン
記録ボタンはGroupノードとTextノードで作成しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183282/a2167fa1-58ce-fbfc-ff27-908aac7281b7.png)

Groupノードがボタンの背景色と外枠を表示しています。Textノードはボタンに表示するテキストを書きます。

Groupノードの設定は次のようにしています。工夫している点としては、角の丸みをつけるために**Border Radius**プロパティを設定しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183282/1ea336da-df03-b8fb-644d-58c798e06bd3.png)

Textノードの設定はシンプルで次のようにしています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183282/6c077750-9746-8924-0314-c2949699d007.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183282/70382f57-f7f9-e879-5f2e-bd275531ae2a.png)

##外部に送信
外部連携はhttp requestで行うので、「**RESTノード**」を使用します。RESTノードは何らかのイベントで指定したURLに対してフェッチを行うノードです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183282/c55d286b-f926-fccf-949b-7e2f9948ebb0.png)

RESTノードの設定は次のようにしています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183282/44d726ed-1d8d-770d-aa8d-66a87f7f805c.png)

・Resource：/input　(http requestのアクセス先)
・Method：GET       (http requestのプロトコル)
・Backend type：External　（バックエンドサーバーを外部に建てる設定）
・Endpoint：　　　　（http requestの宛先URL）
　　　　　　　　　　　**注意** : enebularは1時間程度でセッションが切れてリロードしなおしとなるため、EndpointのURlが変わります。
・Send Text：送信すデフォルト値（カスタムで追加したプロパティです）

RESTノードのスクリプトは次のように記述しています。入力されたテキストデータを読み込んで、http requestのparmetorsに追加する形をとっています。

```javascript
define({
	inputs:{
	    sendtxt:'string',
	},
	outputs:{
	},
	request:function(inputs,request) {
	    request.parameters.memo = inputs.sendtxt;
	    console.log(request);
	},
	response:function(outputs,response) {
	}
})

```

これでサーバ側（Node-RED）のデバッグログを見ると、メモしたデータが送信されていることが分かります。

以上で記録ボタンを押すとメモしたデータがhttp　requestで送信できるようになります。あとは細かいレイアウトや色などの調整がありますが、凝ると奥が深いので割愛します。

#まとめ
本職は組み込み系なので、ほとんどwebの事が分からな状態です。それでもNoodlを使用することで、直感的にUIのプロトタイプを作る事ができました🙂

Noodlの良いところは、考えたことを即座に動く形にできることだと思います。まだまだアドベントカレンダーは始まったばかりなので、今後の記事で面白い使い方やAPIなど（地図があると嬉しい）期待ですね！

それでは良きNoodlライフを！

#リンク集
・[Noodl 2.1 ベータ版に参加しよう！](https://noodl-tokyo.connpass.com/event/191012/)
・[Noodl Slack](https://app.slack.com/client/TL354BAP6/CKT5MUBGS)
・[Noodlのユーザコミュニティ　Noodlもくもく会](https://noodl-mokumoku.connpass.com/)