APIで取得したデータをモーダルウィンドウに表示&テーブルにボタン作成

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

 

テーブルにボタンを作り、

クリックすると、

クリックした行のJANコードを条件とした、

他のアプリである在庫マスタの在庫数のデータを参照したモーダルウィンドウを表示したいです。

下記のコードの場合、以下エラーがあり、

理想通り動かすことができません。

原因やアドバイスをいただければ幸いです。

【エラー】

①APIでGETする前にダイアログ表示の内容のコードに進んでしまい、

CD102~CD170の値がundefinedでエラー

②追加した行にボタン作成&その行の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
    for (var i in record['order_items'].value) {
        var jan = record.order_items.value[i].value.jan.value;
        var zaikoBtnID = "zaikoBtn" + jan;
        //ボタンがない場合
        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
        for (let j = 0; j < resp.records.length; j++) {
            var deliStore = resp.records[j].deliStore.value;
            var zaiko = resp.records[j].zaiko.value;
            var CD102 = "-";
            var CD103 = "-";
            var CD104 = "-";
            var CD107 = "-";
            var CD108 = "-";
            var CD109 = "-";
            var CD110 = "-";
            var CD112 = "-";
            var CD116 = "-";
            var CD118 = "-";
            var CD120 = "-";
            var CD127 = "-";
            var CD132 = "-";
            var CD134 = "-";
            var CD136 = "-";
            var CD137 = "-";
            var CD138 = "-";
            var CD140 = "-";
            var CD143 = "-";
            var CD145 = "-";
            var CD146 = "-";
            var CD147 = "-";
            var CD163 = "-";
            var CD165 = "-";
            var CD170 = "-";
            if (deliStore == "102") {
                CD102 = zaiko;
            } else if (deliStore == "103") {
                CD103 = zaiko;
            } else if (deliStore == "104") {
                CD104 = zaiko;
            } else if (deliStore == "107") {
                CD107 = zaiko;
            } else if (deliStore == "108") {
                CD108 = zaiko;
            } else if (deliStore == "109") {
                CD109 = zaiko;
            } else if (deliStore == "110") {
                CD110 = zaiko;
            } else if (deliStore == "112") {
                CD112 = zaiko;
            } else if (deliStore == "116") {
                CD116 = zaiko;
            } else if (deliStore == "118") {
                CD118 = zaiko;
            } else if (deliStore == "120") {
                CD120 = zaiko;
            } else if (deliStore == "127") {
                CD127 = zaiko;
            } else if (deliStore == "132") {
                CD132 = zaiko;
            } else if (deliStore == "134") {
                CD134 = zaiko;
            } else if (deliStore == "136") {
                CD136 = zaiko;
            } else if (deliStore == "137") {
                CD137 = zaiko;
            } else if (deliStore == "138") {
                CD138 = zaiko;
            } else if (deliStore == "140") {
                CD140 = zaiko;
            } else if (deliStore == "143") {
                CD143 = zaiko;
            } else if (deliStore == "145") {
                CD145 = zaiko;
            } else if (deliStore == "146") {
                CD146 = zaiko;
            } else if (deliStore == "147") {
                CD147 = zaiko;
            } else if (deliStore == "163") {
                CD163 = zaiko;
            } else if (deliStore == "165") {
                CD165 = zaiko;
            } else if (deliStore == "170") {
                CD170 = zaiko;
            }
        }
    }, function (error) {
        // error
        console.log(error);
    });

    //モーダルの内容
    //ダイアログを表示する関数を作成
    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>' +
                '<tr><td>107 XX</td><td>' + CD107 + '</td></tr>' +
                '<tr><td>108 XX</td><td>' + CD108 + '</td></tr>' +
                '<tr><td>109 XX</td><td>' + CD109 + '</td></tr>' +
                '<tr><td>110 XX</td><td>' + CD110 + '</td></tr>' +
                '<tr><td>112 XX</td><td>' + CD112 + '</td></tr>' +
                '<tr><td>116 XX</td><td>' + CD116 + '</td></tr>' +
                '<tr><td>118 XX</td><td>' + CD118 + '</td></tr>' +
                '<tr><td>120 XX</td><td>' + CD120 + '</td></tr>' +
                '<tr><td>127 XX</td><td>' + CD127 + '</td></tr>' +
                '<tr><td>132 XX</td><td>' + CD132 + '</td></tr>' +
                '<tr><td>134 XX</td><td>' + CD134 + '</td></tr>' +
                '<tr><td>136 XX</td><td>' + CD136 + '</td></tr>' +
                '<tr><td>137 XX</td><td>' + CD137 + '</td></tr>' +
                '<tr><td>138 XX</td><td>' + CD138 + '</td></tr>' +
                '<tr><td>140 XX</td><td>' + CD140 + '</td></tr>' +
                '<tr><td>143 XX</td><td>' + CD143 + '</td></tr>' +
                '<tr><td>145 XX</td><td>' + CD145 + '</td></tr>' +
                '<tr><td>146 XX</td><td>' + CD146 + '</td></tr>' +
                '<tr><td>147 XX</td><td>' + CD147 + '</td></tr>' +
                '<tr><td>163 XX</td><td>' + CD163 + '</td></tr>' +
                '<tr><td>165 XX</td><td>' + CD165 + '××</td></tr>' +
                '<tr><td>170 XX</td><td>' + CD170 + '</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;
});


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

関石さん

こんにちは。

 

①GET API処理は非同期ですので、API処理が終わる前に次のモーダル処理に移っています。

API処理をsync/awaitを使って同期処理にすることで解決します。

あるいは、ボタン作成処理をAPI処理成功後のfunctionの中に入れ込む方法もあります。

 

②テーブル行追加時はchangeイベントで取れますので

changeイベント内で追加された行に対してボタンを設置すれば可能と思います。

→追加した行に作成するというより、全行のボタンを作り直す方が簡単かもしれません。

「いいね!」 1

koichiさま

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

①後者のやり方で理想通りの動きをすることができました。

②作り直すということで試してみました。

作成したボタンを一度消して、新たにボタンを作成する流れを想定しておりましたが、

消す処理がうまくいかず、実装することができませんでした。

ご回答いただきありがとうございました。

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

 

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