kintoneでcanvas上のクリックをした位置に点を描画する

仕事で必要になったので勉強したソースコードのメモ。

(() => {
  "use strict";

  let kigou = "四角";

  kintone.events.on(
    ["app.record.create.show", "app.record.edit.show"],
    function (event) {
      const canvas = document.createElement("canvas");
      canvas.width = 100;
      canvas.height = 100;

      const record = event.record;
      // 座標
      let x = record.X.value;
      let y = record.Y.value;
      // canvasサイズ
      let w = canvas.width;
      let h = canvas.height;

      // 2次元の描画を行うメソッド
      const ctx = canvas.getContext("2d");
      const initCanvas = () => {
        // 背景塗る
        ctx.fillStyle = "#ccc";
        // fillRect(x座標, y座標, 幅, 高さ)
        ctx.fillRect(0, 0, w, h);

        // メモリ線を引く
        ctx.beginPath();
        ctx.moveTo(50, 0);
        ctx.lineTo(50, 100);
        ctx.closePath();
        ctx.stroke();
        ctx.beginPath();
        ctx.moveTo(0, 50);
        ctx.lineTo(100, 50);
        ctx.closePath();
        ctx.stroke();

        // 初期値(マイナス)のときは描画しない
        if (x >= 0 && y >= 0) {
          if (kigou === "四角") {
            // クリックされた位置に描画処理
            ctx.fillStyle = "#000";
            // fillRect(x座標, y座標, 幅, 高さ)
            ctx.fillRect(x, y, 10, 10);
          } else {
            ctx.beginPath();
            // 円の中心座標: クリック位置
            // 半径: 50
            // 開始角度: 0度 (0 * Math.PI / 180)
            // 終了角度: 360度 (360 * Math.PI / 180)
            // 方向: true=反時計回りの円、false=時計回りの円
            ctx.arc(x, y, 5, (0 * Math.PI) / 180, (360 * Math.PI) / 180, false);
            ctx.fillStyle = "#000";
            ctx.fill();
            ctx.closePath();
            ctx.stroke();
          }
        }
      };
      initCanvas();

      let onClick = (e) => {
        let rect = e.target.getBoundingClientRect();
        // e.clientX(Y)がwindow左上からのクリックされた座標
        // rect.left(top)がwindow左上からのcanvasの座標
        x = e.clientX - rect.left;
        y = e.clientY - rect.top;

        const rec = kintone.app.record.get();
        // フィールドに座標を格納
        rec.record.X.value = x;
        rec.record.Y.value = y;

        kintone.app.record.set(rec);

        draw();
      };

      const draw = () => {
        initCanvas();
      };

      canvas.addEventListener("click", onClick, false);

      // キャンバス上に十字を追加
      const div = document.createElement("div");
      div.setAttribute("class", "cross");
      canvas.appendChild(div);

      // スペース上にキャンバスを追加
      const space = kintone.app.record.getSpaceElement("graph");
      space.appendChild(canvas);
      return event;
    }
  );

  kintone.events.on(
    ["app.record.create.change.記号", "app.record.edit.change.記号"],
    function (event) {
      kigou = event.changes.field.value;
    }
  );
})();

実行結果

以下のサイトがとても参考になりました。
【javascript,HTML5】canvas上のクリックをした位置に点を描画する方法 | web関連 | 勉強ブログ「二色人日記。」