【kintone】ルックアップとkintone UI Component v1 のドロップダウンを連携させる

今回はルックアップとkintone UI Component v1 のドロップダウンを連携させるサンプルです。
ルックアップしてきた値によって、kintone UI Component v1 のドロップダウンの選択肢を変更します。

# 🍄完成系のアプリ

マスタ用のアプリと、実際にドロップダウンを設置するアプリの2種類作ります。

## 🌼マスタアプリ
ドロップダウンのもとになるマスタ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/989eeb34-66c4-878e-1753-7e4de59777ac.png)

レコード詳細はこんな感じ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/6f3c0d24-a2cc-146e-c2dd-a57d4ca31b74.png)

## 🌼ドロップダウンを設置するアプリ
ルックアップで選択した武器に関連する技がドロップダウンの選択肢になります。

![c.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/770b945f-48e1-ce50-878f-c96284b9015e.gif)

# 🍄アプリの準備

## 🌼選択肢マスタアプリの準備

武器を選んだら技が選択できるようにしたいと思います。
アプリの名前は「武器と技」としておきます。

| フィールド種類 | フィールド名 | フィールドコード|備考|
|:-:|:-:|:-:|:-:|
|文字列(1行)   |武器   | 武器  |重複を禁止|
|テーブル | テーブル  | テーブル  ||
|テーブル内　文字列(1行)   | 技  | 技  ||

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/5267c51e-46ee-c381-0b11-b354596b434d.png)


## 🌼ドロップダウンを設置するアプリの準備

ドロップダウンを設置するアプリはこんな感じ。

| フィールド種類 | フィールド名 | フィールドコード|備考|
|:-:|:-:|:-:|:-:|
|ルックアップ |武器選択   | 武器選択  |ルックアップの設定は画像参照|
|文字列(1行)|武器  |武器  ||
|スペース|--|spWaza|ドロップダウンを設置するスペース|
|文字列(1行)   | セリフ  | セリフ  ||

アプリのフォーム
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/2ce1c02f-498e-4cec-bbf8-88df9915f98a.png)

ルックアップの設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/d2812037-5fd7-ba7c-4d9f-ff46e1a2d9e3.png)

# 🍄kintone UI Component v1 の準備
ドロップダウンを設置するアプリの`JavaScript / CSSでカスタマイズ` に
kintone UI Component v1 のCDNを追加しておきます。

CDN : `https://unpkg.com/kintone-ui-component/umd/kuc.min.js`


# 🍄JavaScript

カスタマイズしていきましょう。
前回までの記事も参考にしていただいて、`kintone UI Component v1` を

https://qiita.com/juri_don/items/54a38cb66584aa8d2818


追加・編集画面表示でドロップダウンを設置します。

イベントの前に、ドロップダウンの選択肢になるリストを宣言しておきます。
`kintone REST API` で技を呼び出す（非同期処理）ので、`async` を付けておきます。

```js
// 技のリスト
const listDropdown = [];

// 追加・編集画面表示イベント
kintone.events.on(
  ["app.record.create.show", "app.record.edit.show"],
  async (event) => {// 非同期処理するのでasyncをつけておく
  // ココにコード書く
  }
);
```

## 🌼ドロップダウンの選択肢となる、技のリストを取得しておく

```js
// 技のリストを取得する
const rWaza = await kintone.api(
  kintone.api.url("/k/v1/records", true),
  "GET",
  { app: 319 }
);

// 武器ごとに技のリストを作っておく（ココちょっと難しいかも）
rWaza.records.forEach((r) => {
  listDropdown[r.武器.value] = [];
  r.テーブル.value.forEach((row) => {
    listDropdown[r.武器.value].push({ value: row.value.技.value });
  });
});
```


## 🌼スペースフィールドにドロップダウンを設置

kintone UI Component v1 でドロップダウンを設置します。
itemsを空っぽにしておくことと、idを設定しておくのがポイントです。
また、ドロップダウン変更イベントで文字列(1行)フィールドに選択した値を表示するようにしておきます。
（addEventListenerで書けます～）

```js
// ドロップダウンを置くスペースの要素を取得
const spWaza = kintone.app.record.getSpaceElement("spWaza");

// ドロップダウンをつくる
const drWaza = new Kuc.Dropdown({
  label: "技選択",
  // ルックアップ時にドロップダウン要素を取得しやすいようにid設定しておく
  id: "drWaza",
  // items はからっぽにしておく
  items: [],
  visible: true,
  disabled: false,
});

// スペースフィールドにドロップダウンを置く
spWaza.appendChild(drWaza);

// ドロップダウンを選択したときのイベント
drWaza.addEventListener("change", () => {
  const r = kintone.app.record.get();
  // ドロップダウンで選択した値を文字列(1行)フィールド（フィールドコード：セリフ）にコピー
  r.record.セリフ.value = drWaza.value + " が完全に入ったのに・・・。";
  kintone.app.record.set(r);
});
```

## 🌼ルックアップ取得時の変更イベント

ルックアップフィールドの変更は取ってこれないので、代わりに、ルックアップでセットされる「文字列(1行)」の武器フィールドの変更を検知するようにします。

```js
// ルックアップ取得で文字列(1行)の武器が変更したときのイベント
kintone.events.on(
  ["app.record.create.change.武器", "app.record.edit.change.武器"],
  (event) => {
    //ココにコード書く
  }
);
```


ルックアップ取得時には保存しておいた選択肢リストをドロップダウンの選択肢（`drWaza.items`）にセットします。ルックアップクリア時はドロップダウンの選択肢やセリフをクリアします。

```js
// 技ドロップダウンの要素取得
const drWaza = document.getElementById("drWaza");

// ルックアップクリアの時は技リストとセリフをクリアする。
if (!event.changes.field.value) {
  drWaza.items = [];
  event.record.セリフ.value = "";
} else {
  // ルックアップ取得したらに武器ごとに保存しておいたリストを選択肢にセットする
  drWaza.items = listDropdown[event.changes.field.value];
}
return event;
```

全体的なコードはこちら

https://gist.github.com/juridon/49dfef5825e940185baea041797fd7ae

# 🍄まとめ

`kintone UI Component v1` を使って、マスタアプリからルックアップでドロップダウンの中身を取得して表示することができました。ドロップダウン連携ができるとアプリの幅が拡がりそうです。

※作ったあとで気づいたのですが、ルックアップとドロップダウンではなく、ドロップダウンを2つ作って、連携させたほうが早いですね💦チャレンジしてみてください😋