kintone cssを適用する方法

## 動機

kintoneアプリを作成していて、画面の項目にcssを適用したいときがある。
個人的にjavascriptとcssを合わせて比較的シンプルに適用する方法ではないかと思うので備忘のため記録に残す。

### 注意

kintoneの仕様が変わったら使えなくなる可能性がある。

## 画面イメージ

２つのテキストボックスにスタイルを適用する例で示す。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1742664/ba957362-b03b-d775-40e7-a6573cc7ac95.png)

## その１ テキストボックスにスタイルを適用

デベロッパーツールでHTMLの入力項目を確認すると`class="input-text-cybozu"`とある。
`input-text-cybozu`目掛けてスタイルを適用すれば良さそう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1742664/060f599a-b394-2a5c-8ca5-b9204e842e00.png)

**やってみる**

背景を黄色にしてみる。

```css
.input-text-cybozu {
  background-color: yellow !important; // !importantを付けないと上書きできない
}
```

ファイルに保存して、アプリに登録する。

> 登録手順

１． JavaScript / CSSでカスタマイズを開く

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1742664/9b8e9b6f-2523-5e9c-e0c6-2da434db1dbd.png)

２． PC用のCSSファイルの「アップロードして追加」で作成したCSSファイルを登録する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1742664/ce3fcaa8-f73c-a145-59b1-01c3e5ccca5e.png)

３． 保存 & アプリの更新

４． 確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1742664/36b9216e-0efe-9456-57dd-24d6e03c971c.png)

## その２ 特定の項目にスタイルを適用

デベロッパーツールでHTMLの入力項目を確認する。
なにやらテキストボックスの要素に項目を一意に特定できそうな番号がある。
この番号目掛けてスタイルを適用すれば良さそう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1742664/937d18da-c3bb-2cdc-197f-d139fd8d777c.png)

**やってみる**

```css
#31_5519913-:1d-text {
  background-color: yellow !important; // !importantを付けないと上書きできない
}
```

CSSの登録手順は、その１と同様のため、割愛

１． 確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1742664/c3880323-0af4-4f39-d514-1622a295f15d.png)

変わらず。。。

id属性が数値から始まる場合、属性セレクターで書く必要がある模様。

```css
[id="31_5519913-:1d-text"] {
  background-color: yellow !important; // !importantを付けないと上書きできない
}
```

２． 再確認

[id="31_5519913-:1d-text"] {
  background-color: yellow !important; // !importantを付けないと上書きできない
}

できた！

## その３ javascriptと絡めてCSSを伝わりやすい定義で作る！

その２でkintoneでは１つの要素を特定する時、一意の番号が払い出されていることがわかった。

確認すると、同じ番号は、４箇所（`field-xxxx`, `label-xxxx`, `value-xxxx`, `31_xxxx:1d-text`）登場している。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1742664/937d18da-c3bb-2cdc-197f-d139fd8d777c.png)

kintoneは`cybozu.data.page.FORM_DATA.schema.table.fieldList`で画面項目の一覧が取得できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1742664/835cc70b-e85d-1b48-4e8d-402441a22db4.png)

上記を踏まえて、javascriptとcssでスタイルを適用する。

> javascript

追加、更新、詳細画面を表示した時のイベントを定義する。

```javascript
(() => {
  "use strict";
  kintone.events.on(
    [
      "app.record.detail.show",
      "app.record.create.show",
      "app.record.edit.show",
    ],
    (event) => {
      const fieldArray = Object.values(
        cybozu.data.page.FORM_DATA.schema.table.fieldList
      ).map((field) => ({ [field.var]: field.id }));
      const fields = Object.assign({}, ...fieldArray.map((field) => field));
      const nameId = fields["名前"];
      const element = document.getElementsByClassName(`field-${nameId}`);
      element[0].classList.add("required");

      return event;
    }
  );
})();
```

> css

```css
.required {
  background-color: pink;
}
.required input {
  background-color: yellow !important;
}
```

１．CSSの登録手順は、その１と同様のため割愛
　 javascriptの登録手順はCSSと同様。

２． 確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1742664/a6615d27-20ba-bdd0-1d07-c0b4c3954fc4.png)

できた。

htmlを確認すると、`field-5519913`に`rquired`が設定されている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1742664/0e88cad3-1a36-0732-e940-3d16022ddfc8.png)

javascriptのコーディングが入るが、CSSで意味のわかるclass属性で定義ができるので、個人的にわかりやすくなったかな。

## javascript lessでできるようにするには．．．

プラグインにすればいいのだろうか？？

まだ知識が浅くてよくわからない。