■見積テンプレートアプリ
サブテーブルに商品コード、商品名、単価といった詳細情報をあらかじめ登録しておくアプリ
■見積アプリ
拡張ルックアッププラグインを使って、見積テンプレートアプリから詳細情報を
サブテーブルにコピーする。
起きている問題としては、
サブテーブルの商品コードはルックアップフィールドとなっているが
サブテーブルにデータがコピーされたときに、1行目は取得・クリアボタンがあるが
2行目以降はデータは反映されているが取得・クリアボタンが表示されない。
ただし、行挿入や行削除などのサブテーブルのボタンを押すと
ルックアップフィールドのボタンが全部の行に表示が反映される。
コピーされた時点で表示されるようにJavaScriptで再読み込み処理を
追加したいのですが、どのような操作をすればよろしいでしょうか?
下記のようなコードではうまく出来ませんでした。
エラーは特に起きておらず、何も反映されていないという状態です。
サブテーブルのDOMが変更されましたというログはありますので
ロジック自体は通っていると思います。
function redrawSubTable() {
setTimeout(() => {
const record = kintone.app.record.get().record;
kintone.app.record.set({ record: record });
}, 100); // 安全に遅延実行
}
function observeDOMChangesForSubTable() {
const targetNode = document.querySelector('.subtable-gaia'); // サブテーブルの親要素
if (!targetNode) return;
const observer = new MutationObserver((mutationsList) => {
for (const mutation of mutationsList) {
if (mutation.type === 'childList') {
// 子要素の追加・削除があった場合に再描画処理を実行
console.log('サブテーブルのDOMが変更されました');
redrawSubTable();
}
}
});
observer.observe(targetNode, {
childList: true,
subtree: true
});
}
kintone.events.on('app.record.create.show', function (event) {
observeDOMChangesForSubTable(); // DOM監視だけ追加
return event;
});
7/15追記
標準のルックアップフィールドの場合は、問題なく表示されました。
拡張ルックアップというプラグインの場合のみ発生するので
プラグインの問題のようです・・・。
開発元に問い合わせましたが、修正対応はしてもらえないようです。
引き続きJavaScript側で対応できる方法を模索しております。
fito12
(ふゆき)
3
使ったことはないですが...こんな
Plugin(条件付き無料)なら知っています
Web頁から抜粋
どうしてもルックアップ時に選択したレコード内のサブテーブルをコピーさせたい時はあります。
そこで、ルックアップ時のサブテーブルコピーとそれらの値に関連した計算を行うプラグインを開発しました。
ご参考まで!
ちなみに、
引き続きJavaScript側で対応できる方法を模索しております。
は
にあるとおり
ソースコードが公開されていないプラグインの解析や改造は一般的にライセンス違反になることが多いです。
のでご注意ください
「いいね!」 1
ありがとうございました。
いったん力技ですが自己解決出来たので、ソースを貼り付けておきますね。
行追加するとボタンが復活するのを利用することにして
ルックアップから選択してサブテーブルにコピーする際に、フラグを立てて
サブテーブルにデータが反映されたことを確認した後に
一番最後の行の行追加ボタンを押して、追加された行を削除するという感じにしました。
(function () {
'use strict';
const tableCode = '見積詳細';
let shouldTrigger = false;
kintone.events.on(['app.record.edit.show', 'app.record.create.show'], function (event) {
const intervalId = setInterval(() => {
const lookupButtons = document.querySelectorAll('button.extended-lookup');
if (lookupButtons.length > 0) {
lookupButtons.forEach(button => {
button.addEventListener('click', () => {
console.log('ルックアップ取得ボタンが押されました');
shouldTrigger = true;
});
});
clearInterval(intervalId);
}
}, 300);
const subtableContainers = document.querySelectorAll('.subtable-row-gaia');
let targetTbody = null;
subtableContainers.forEach(container => {
const label = container.querySelector('.subtable-row-label-text-gaia');
if (label && label.textContent.trim() === tableCode) {
const table = container.querySelector('table.subtable-gaia');
if (table && table.tBodies.length > 0) {
targetTbody = table.tBodies[0];
}
}
});
if (!targetTbody) {
console.log('対象のサブテーブル tbody が見つかりません');
return event;
}
const observer = new MutationObserver((mutations) => {
if (!shouldTrigger) return;
for (const mutation of mutations) {
if (mutation.type === 'childList' && mutation.addedNodes.length > 0) {
console.log('サブテーブルに行が追加されました(フラグON)');
setTimeout(() => {
const updatedRecord = kintone.app.record.get();
const table = updatedRecord.record[tableCode].value;
if (table.length > 0) {
const subtableContainers = document.querySelectorAll('.subtable-row-gaia');
let addButtons = [];
subtableContainers.forEach(container => {
const label = container.querySelector('.subtable-row-label-text-gaia');
if (label && label.textContent.trim() === tableCode) {
const buttons = container.querySelectorAll('button');
addButtons = Array.from(buttons);
}
});
if (addButtons.length > 0) {
const lastAddButton = addButtons[addButtons.length - 1];
lastAddButton.click();
setTimeout(() => {
const updatedRecordAgain = kintone.app.record.get();
const tableAgain = updatedRecordAgain.record[tableCode].value;
if (tableAgain.length > 0) {
tableAgain.pop();
kintone.app.record.set(updatedRecordAgain);
}
}, 300);
}
shouldTrigger = false; // フラグをリセット
// observer.disconnect(); ← 削除!
}
}, 500);
}
}
});
observer.observe(targetTbody, { childList: true });
return event;
});
})();
system
(system)
クローズされました:
5
このトピックはベストアンサーに選ばれた返信から 3 日が経過したので自動的にクローズされました。新たに返信することはできません。