プロセス管理のアクションボタンを押した人を次のステータスの作業者にする方法

何を実現したいのか

ステータスが「登録済」となったレコードの変更申請をスタートするようなプロセス管理を実装したいと考えております。 レコードを登録した人と変更申請を開始する人は異なる場合があるので、ボタンを押した人が次のステータス「変更申請中」となったレコードの作業者になるようにしたいです。

発生した問題

app.record.detail.process.proceed イベントで、レコードを編集した人を特定の管理用ユーザーフィールド「作業者設定用」に保存しておき、「変更申請中」ステータスでの作業者を、その管理用ユーザーフィールド「作業者設定用」で指定されたユーザーにするのはどうかと思ったのですが、ボタンを押した時点ではまだステータスは変わっていないので思ったような動作にならず、ボタンを押す前の時点の「作業者設定用」フィールドのユーザーが作業者になってしまうということになってしまいました。

実行したコード

kintone.events.on(['app.record.detail.process.proceed'], function(event) {
  var record = event.record;
  var user = kintone.getLoginUser();
  var currentStatus = event.status.value;

  if (currentStatus === '登録済') {
    record.作業者設定用.value = [{ code: user.code, name: user.name }];
  }

  return event;
});

このJSを登録した状態で、プロセス管理で「登録済」の次のステータスとして用意した「変更申請中」ステータスの作業者を「作業者設定用」フィールドとしました。
ただし上述のとおり期待するような結果にはなりませんでした。

どのように設定すればボタンを押したユーザーを次のステータスの作業者にできるでしょうか。

自己解決しましたが、推奨される方法とは思えませんので、もしも同じようなことでお困りの方がいらっしゃったら参考にしていただけるよう、概要だけ共有させていただきます。

「作業者設定用」フィールドに現在のユーザーを設定してから API でステータス遷移させる処理を実行させるカスタムボタンを用意するのが簡単な方法かと思いますが、標準のプロセス管理のアクションボタンも表示された状態でなければステータス遷移アクションが実行できないため、ユーザーにとって非常に分かり辛いことになってしまいます。

そこで、標準のプロセス管理ボタンの機能を乗っ取るような仕掛けにしました。

プロセス管理のアクションラベルをクリックした時に、次のステータスと作業者とキャンセルボタンと実行ボタンが DOM に追加される為、MutationObserver で対象のアクションラベルを監視し、そのラベルの実行ボタンが出現したら DOM をクローンして元のボタンは削除し、クローンしたボタンにイベントリスナーを追加して やりたい処理を実行させるようにしました。
(単純に onclick を追加してもオリジナルボタンの機能も実行されてしまうため)

強引な方法のオンパレードですので、カスタムボタンもレコードの下部に表示させ、うまく機能しなくなった場合には備えるようにしました。

2 Likes

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