新規投稿
フォローする

【アイディア】delete.submit.success をむりやり?実装してみる

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
}
3

0件のコメント

サインインしてコメントを残してください。