kintone Javascript API について、レコードの削除完了時に実行されるイベントハンドラ(app.record.index.delete.submit.success / app.record.detail.delete.submit.success)がどうしても必要になったので、自分で相応の処理をつくってみました。
公式に公開されていないAPIを参照しているなど、動作保証のない Hacky な実装ですが、基本的なアイディアとしては、
- レコードの削除時、delete.json というAPIが内部的に呼ばれている
- XMLHttpRequest からのリクエストに割り込み、delete.json の呼び出しが成功するのをキャプチャする
というかんじで、レコードの削除後に任意のコードを実行しています。
下記のコードの window.alert の部分に実行したい処理を入れればOKです。
いちおう自分の環境では狙い通りに動作しているのですが、粗い実装ですので、ツッコミなど入れていただければ幸いです。
kintone.events.on(['app.record.index.show'], function(event) {
registerOnDeleteSubmitSuccess(event.records, function(record) {
window.alert('record ' + record.$id.value + ' deleted')
})
return event
})
kintone.events.on(['app.record.detail.show'], function(event) {
registerOnDeleteSubmitSuccess(event.record, function(record) {
window.alert('record ' + record.$id.value + ' deleted')
})
return event
})
let registered = false
function registerOnDeleteSubmitSuccess(recordOrRecords, onDeleteRecord) {
if (registered) return
const open = XMLHttpRequest.prototype.open
XMLHttpRequest.prototype.open = function(method, url) {
this._requestUrl = url
open.apply(this, arguments)
}
const send = XMLHttpRequest.prototype.send
XMLHttpRequest.prototype.send = function(body) {
this.addEventListener('loadend', () => {
if (this._requestUrl.match(/delete\.json/) && JSON.parse(this.response).success) {
const recordId = JSON.parse(body).ids[0]
const record = Array.isArray(recordOrRecords)
? recordOrRecords.find(function(record) {
return record.$id.value === recordId
})
: recordOrRecords
if (recordId === record.$id.value) onDeleteRecord(record)
}
})
send.apply(this, arguments)
}
registered = true
}