テーブルにボタンを追加&ボタンクリックした行の情報を表示

お世話になっております。

テーブルにボタンを用意し、

商品番号のルックアップ項目を入力し、

商品番号から反映されたJANコードが入力されたタイミングで、

ボタンが作成されます。

ボタンをクリックすると、JANコードの在庫アプリのデータをモーダルウィンドウに表示します。

・ルックアップ項目のクリアをクリックすると、前のボタンが残ってしまう

→常にボタンは一つだけ表示されるようにしたい

・一行目のJANと違うJANの行を追加してもポップアップのJANは一行目の在庫情報が表示されてしまう

→ボタンをクリックすると、クリックした行のJANの商品情報を確認できるようにしたい

コードは下記のとおりです。

kintone.events.on(['app.record.create.change.jan', 'app.record.edit.change.jan'], (event) => {

    //ボタンを置きたいフィールドの情報を取ってくる

    const sp = document.getElementsByClassName("field-5525974");

    // 入力欄非表示

    const hide = document.getElementsByClassName("value-5525974");

    let record = event.record

    let jans = []

    var zaikoBtncols= $("[id^='zaikoBtn']");

    for (var i in record['order_items'].value) {

        var jan = record.order_items.value[i].value.jan.value;

        jans.push([jan])

        var zaikoBtnID = "zaikoBtn" + jan;

        // janが入力されている場合

        if (jan !== undefined) {

            //ボタンがない場合

            if (document.getElementById(zaikoBtnID) === null) {

                hide[i].style.display = "none";

                //ボタンを作る

                const btn = document.createElement("button");

                btn.textContent = "開く";

                sp[i].appendChild(btn);

                btn.setAttribute("id", zaikoBtnID);

            }

        }

    }

    //在庫アプリのID

    var appID = 398;

    var query = 'code = "' + jan + '"order by deliStore asc';

    var body = {

        'app': appID,

        'query': query

    };

    kintone.api(kintone.api.url('/k/v1/records', true), 'GET', body, function (resp) {

        // success

        var CD102 = "-";

        var CD103 = "-";

        var CD104 = "-";

        for (let j = 0; j < resp.records.length; j++) {

            var deliStore = resp.records[j].deliStore.value;

            var zaiko = resp.records[j].zaiko.value;

            if (deliStore == "102") {

                CD102 = zaiko;

            } else if (deliStore == "103") {

                CD103 = zaiko;

            } else if (deliStore == "104") {

                CD104 = zaiko;

            }

        }

        //モーダルの内容

        //ダイアログを表示する関数を作成

        var showDialog = function () {

            $('.dialog_content').dialogModal({

                topOffset: 0,

                top: '10%',

                type: '',

                onOkBut: function () { },

                onCancelBut: function () { },

                onLoad: function (el, current) { },

                onClose: function () { },

                onChange: function (el, current) { }

            });

        };

        //ダイアログと表示内容を用意

        var createDialogContent = function () {

            var dialog_1 =

                $('<div id="dialog_content_1" class="dialog_content" style="display:none;">' +

                    '<div class="dialogModal_header">JAN:' + jan + '</div>' +

                    '<div class="dialogModal_content">' +

                    '<table border="1px">' +

                    '<tr><td>店舗</td><td>在庫数</td></tr>' +

                    '<tr><td>102 XX</td><td>' + CD102 + '</td></tr>' +

                    '<tr><td>103 XX</td><td>' + CD103 + '</td></tr>' +

                    '<tr><td>104 XX</td><td>' + CD104 + '</td></tr></table></br>' +

                    '</div>' +

                    '<div class="dialogModal_footer">' +

                    '<button class="btn btn-default" data-dialogmodal-but="cancel" type="button">Cancel</button>' +

                    '</div>' +

                    '</div>');

            $("#" + zaikoBtnID).append(dialog_1);

        };

        createDialogContent();

        var zaikoBtn = $("#" + zaikoBtnID);

        //マウスをボタンに当てるときのボタン色を指定

        zaikoBtn.hover(function () {

            $(this).css({ 'color': '#ececec', 'background': '#3498db' });

        }, function () {

            $(this).css({ 'color': '', 'background': '' });

        });

        //ボタンをクリックしたときの動作

        zaikoBtn.on('click', showDialog);

        return event;

    }, function (error) {

        // error

        console.log(error);

    });

});

修正のアドバイスをご教授いただければ幸いです。

以上、よろしくお願いします。

気になった部分として、

①ボタンが残ることについては、削除するremoveChildが必要です。また途中でルックアップを変更した時も以前の機能を持ったボタンが残り続けることになるので、そちらの対応(削除または上書き)も必要かと思います。

②1行目の在庫情報が表示されることについては、おそらく最終行のものでしょうか?ループ内で宣言したjanがループを終えた後のクエリやダイアログで使用されているので、最終インデックスの結果のみが残るのではないかと思います。

ループ内でクリックからダイアログを表示する処理を記述する必要があります。またその場合はvar宣言だと同じ結果になると思いますので、ブロックスコープであるletで宣言するか、forEachでループ処理をするか、click後の処理を即時関数で記載する等が必要になります。
またはボタンのidやnameを参照してクエリやダイアログを作成するように記述すれば、ループ外でも問題ありません。

動作検証はしておりませんが以下のような形で良いと思います(showイベントでも動作するようにしてありますが、テーブルの行数が多い場合は描画完了を待つ処理が必要です)。

  kintone.events.on([
    'app.record.create.change.jan', 'app.record.edit.change.jan'
  ], (event) => {
    const sp = document.getElementsByClassName("field-5525974");
    const hide = document.getElementsByClassName("value-5525974");
    let record = event.record

    record['order_items'].value.forEach((row, index) => {
      let jan = row.value['jan'].value;
      let buttonId = 'zaikoBtn' + jan;
      let removeButton = document.getElementById(buttonId);

      if (removeButton) sp[index].removeChild(removeButton);

      if (jan) {
        let btn = document.createElement('button');

        btn.id = buttonId;
        btn.className = 'jan-button';
        btn.textContent = '開く';
        btn.onclick = () => {
          showJan(jan);
        };
        sp[index].appendChild(btn);
        hide[index].style.display = 'none';
      }
    });

    $('.jan-button').hover(() => {
      $(this).css({
        color: '#ECECEC',
        background: '#3498DB'
      });
    });

    return event;
  });

  function showJan(jan) {
    let getRecords = {
      app: 398,
      query: 'code = \"' + jan + '\" order by deliStore asc'
    };

    kintone.api(kintone.api.url('/k/v1/records', true), 'GET', getRecords, (resp) => {
      let CDs = {
        CD102: '-',
        CD103: '-',
        CD104: '-'
      };

      resp.records.forEach((record) => {
        let deliStore = record['deliStore'].value, zaiko = record['zaiko'].value;

      if (CDs[deliStore]) CDs[deliStore] = zaiko;
      });

    let headerSpace = kintone.app.record.getHeaderMenuSpaceElement();

    headerSpace.innerHTML = '<div id="dialog_content_1" class="dialog_content" style="display:none;">' +
      '<div class="dialogModal_header">JAN:' + jan + '</div>' +
      '<div class="dialogModal_content">' +
        '<table border="1px">' +
          '<tr><td>店舗</td><td>在庫数</td></tr>' +
          '<tr><td>102 XX</td><td>' + CDs.CD102 + '</td></tr>' +
          '<tr><td>103 XX</td><td>' + CDs.CD103 + '</td></tr>' +
          '<tr><td>104 XX</td><td>' + CDs.CD104 + '</td></tr>' +
        '</table></br>' +
      '</div>' +
      '<div class="dialogModal_footer">' +
        '<button class="btn btn-default" data-dialogmodal-but="cancel" type="button">Cancel</button>' +
      '</div>' +
    '</div>';

    $('.dialog_content').dialogModal({
      topOffset: 0,
      top: '10%',
    });
    }, (error) => {
      console.error(error);
    });
  };

 

「いいね!」 1

mls-hashimoto さま

ご教授いただきありがとうございました。

①についてはremove箇所を

        let removeBtnID = sp[index].lastElementChild.id;
        let removeButton = document.getElementById(removeBtnID);
        if (removeButton) sp[index].removeChild(removeButton);

に書き換えさせていただき、ボタンを消すことができました。

②についても、書き方から大変お勉強になりました。

ありがとうございました。

以上、よろしくお願いいたします。

このトピックはベストアンサーに選ばれた返信から 3 日が経過したので自動的にクローズされました。新たに返信することはできません。