mobile changeイベントで、validの判定

changeイベントで、時刻のフィールド4つの最小値を、別のフィールドに表示するカスタマイズを入れたいです。

モバイルのコントロールは、時、分のそれぞれにchangeイベントが発火し、時間だけ入力した場合、eventの入力値は、undifinedになって、他のフィールドの値を変えて、return eventを行うと、画面では入力値がクリアされてしまいます。

時間だけ、または分だけ入力した状態だと、画面では「時刻の形式が不正です」のメッセージがでているので、isValidの判定後、changeイベントが発生していると思いますが、changeイベント内で、時間だけ、または分だけの入力値か、isValidの判定を取得する方法はありますか?

ソース内の、

//ToDo    時:分ともクリアされた場合もundefinedになるが、その場合は、先のロジックを通したい

以下で、エラー値の場合は、returnするようにしたいです。
宜しくお願い致します。

(() => {
  'use strict';
  // 制御に利用するフィールドコード
  const leaveTimeFieldCode = '出発時刻1';
  const leaveTimeFieldCode2 = '出発時刻2';
  const leaveTimeFieldCode3 = '出発時刻3';
  const leaveTimeFieldCode4 = '出発時刻4';
  const returnTimeFieldCode = '帰社時刻1';
  const returnTimeFieldCode2 = '帰社時刻2';
  const returnTimeFieldCode3 = '帰社時刻3';
  const returnTimeFieldCode4 = '帰社時刻4';

  kintone.events.on([
    `mobile.app.record.create.change.${leaveTimeFieldCode}`,
    `mobile.app.record.create.change.${leaveTimeFieldCode2}`,
    `mobile.app.record.create.change.${leaveTimeFieldCode3}`,
    `mobile.app.record.create.change.${leaveTimeFieldCode4}`,
    `mobile.app.record.edit.change.${leaveTimeFieldCode}`,
    `mobile.app.record.edit.change.${leaveTimeFieldCode2}`,
    `mobile.app.record.edit.change.${leaveTimeFieldCode3}`,
    `mobile.app.record.edit.change.${leaveTimeFieldCode4}`
  ], (event) => {
    const record = event.record;

//changeイベントで、入力値がundefinedの場合は、return
//時間だけ、分だけ入力した時、値がクリアされるため
const eventType = event.type; // mobile.app.record.create(edit).change.フィールド名
const fieldIndex = eventType.lastIndexOf('.');
const eventField = eventType.substring(fieldIndex + 1); // changeイベントで変更された項目
const eventFieldValue = record[eventField].value;

//ToDo  時:分ともクリアされた場合もundefinedになるが、その場合は、先のロジックを通したい
if (eventFieldValue == undefined) return;

// 「出発時刻」最小値
const leaveTimeValues = [];
const leaveTimeVal1 = record[leaveTimeFieldCode].value;

if (leaveTimeVal1 !== undefined && leaveTimeVal1 !== "") {
  leaveTimeValues.push(leaveTimeVal1);
}
const leaveTimeVal2 = record[leaveTimeFieldCode2].value;
if (leaveTimeVal2 !== undefined && leaveTimeVal2 !== "") {
  leaveTimeValues.push(leaveTimeVal2);
}
const leaveTimeVal3 = record[leaveTimeFieldCode3].value;
if (leaveTimeVal3 !== undefined && leaveTimeVal3 !== "") {
  leaveTimeValues.push(leaveTimeVal3);
}
const leaveTimeVal4 = record[leaveTimeFieldCode4].value;
if (leaveTimeVal4 !== undefined && leaveTimeVal4 !== "") {
  leaveTimeValues.push(leaveTimeVal4);
}

if (leaveTimeValues.length == 0) {
  record.出発時刻最小.value = "";
} else {
  // 入力値
  const inputLeaveTime = record.出発時刻最小.value; 
  const minValue = leaveTimeValues.sort()[0];

  if (!inputLeaveTime) {
    //出発時刻未入力 ← 明細の最小値
    record.出発時刻最小.value = minValue;
  } else if (minValue < inputLeaveTime) {
    //明細の最小値 < 出発時刻 の場合、明細の最小値
    record.出発時刻最小.value = minValue;
  }
}

return event;
});
})();

時刻フィールドの時間か分のみに入力した状態だと内部的な値はundefinedになり、return event;すると入力がクリアされてしまうとは…はじめて知りました…!

changeイベント内で時間か分だけの入力値を取得する方法は思いつかなかったのですが、「出発時刻1」〜「出発時刻4」のうち未入力を除く最小値を「出発時刻最小」にセットしたいということであれば、もっと単純化して以下のロジックに変更するのはいかがでしょうか。

  1. 「出発時刻1」〜「出発時刻4」のうち最小値を算出する
  2. 算出した最小値と「出発時刻最小」が一致しない場合のみ書き換える

以下、補足説明とサンプルコードも載せておきます。

1. 「出発時刻1」〜「出発時刻4」のうち最小値を算出する
changeイベントを発生させたフィールドは考慮せず、イベント発火時に一律で最小値を算出します。このタイミングでは、変更されたフィールドの値がundefinedであってもreturn;せずに実行することが要となります。

// 出発時刻1〜出発時刻4のいずれかに変更があれば、
// 変更の内容にかかわらず有効な時刻を昇順に並べ替える
// filter()ではundefined, null, ''等の偽値を除外し、sort()で並び替える
const leaveTimes = [
    event.record[leaveTimeFieldCode].value,
    event.record[leaveTimeFieldCode2].value,
    event.record[leaveTimeFieldCode3].value,
    event.record[leaveTimeFieldCode4].value
].filter((v) => v).sort();

// 最小出発時刻を算出する
const minLeaveTime = leaveTimes.length ? leaveTimes[0] : undefined;

2. 算出した最小値と「出発時刻最小」が一致しない場合のみ書き換える
手順1で算出したminLeaveTimeと「出発時刻最小」の値が一致しない場合のみreturn event;し、一致する場合はreturn;してイベントオブジェクトを返しません。

// 出発時刻最小を取得する
const inputLeaveTime = event.record['出発時刻最小'].value;
// 最小出発時刻と出発時刻最小が一致する場合は
// イベントオブジェクトを返さない
// 一致しない場合は出発時刻最小をセットしてイベントオブジェクトを返す
if (minLeaveTime === inputLeaveTime) {
    return;
} else {
    event.record['出発時刻最小'].value = minLeaveTime;
    return event;
}

追記
おそらくモバイル版でフィールドの値を変更したときにリアルタイムで出発時刻最小を反映されたいという意図でのカスタマイズと思いますが、レコード保存時に所定のフィールドに最小値が保存されていればよいということであれば、標準機能の計算式でも実現できそうです。
各フィールド総当りの力技な計算式ですが、計算フィールドに入力すると動作するので一応紹介まで。

IF(AND(出発時刻1!="", OR(出発時刻1<出発時刻2, 出発時刻2="") , OR(出発時刻1<出発時刻3, 出発時刻3=""),  OR(出発時刻1<出発時刻4, 出発時刻4="")), 出発時刻1,
IF(AND(出発時刻2!="", OR(出発時刻2<出発時刻1, 出発時刻1="") , OR(出発時刻2<出発時刻3, 出発時刻3=""),  OR(出発時刻2<出発時刻4, 出発時刻4="")), 出発時刻2,
IF(AND(出発時刻3!="", OR(出発時刻3<出発時刻1, 出発時刻1="") , OR(出発時刻3<出発時刻2, 出発時刻2=""),  OR(出発時刻3<出発時刻4, 出発時刻4="")), 出発時刻3,
IF(AND(出発時刻4!="", OR(出発時刻4<出発時刻1, 出発時刻1="") , OR(出発時刻4<出発時刻2, 出発時刻2=""),  OR(出発時刻4<出発時刻3, 出発時刻3="")), 出発時刻4, ""))))
「いいね!」 1