新規投稿
フォローする

アプリ環境によって、フィールド項目エラーが正しく表示されたり、されなかったりする件について

アプリの環境次第で、レコード登録/編集画面において、項目に対してのエラー表示処理が正しく動く時とそうでない時があります。

現時点での調査結果としては、JS同士の衝突であると推測しております。

同じイベントに対しての処理を持ったJSが2つあります。

 

 [1つ目のJSについて]

イベント:"app.record.create.submit", "app.record.edit.submit"

項目の入力チェックを行い、不正入力の場合、error内容を格納し、eventをreturn。

 

[2つ目のJSについて]

//修正前イベント
var beforeEditEvent = [
"app.record.edit.show",
"app.record.index.edit.show"
];

//修正内容の保存実行前イベント
var afterEditEvent = [
"app.record.edit.submit",
"app.record.index.edit.submit"
];

//step.1
  kintone.events.on(beforeEditEvent, function(e) {
var beforeEvent = e;

//step.2
return kintone.events.on(afterEditEvent, function(e) {
var afterEvent = e;
var ankenIdVal = afterEvent.record.案件番号.value;
var chkList = [
{ "fcode": "案件開始日" , "e1" : beforeEvent , "e2" : afterEvent },
{ "fcode": "案件終了日" , "e1" : afterEvent , "e2" : beforeEvent }
];

for (var i=0 ; i<chkList.length ; i++){
var fcode = chkList[i].fcode;
var day1val = chkList[i].e1.record[fcode].value;
var day2val = chkList[i].e2.record[fcode].value;

var day1 = new Date(day1val);
var day2 = new Date(day2val);

if (day1 < day2) {
var option = " and 請求年月 >= \"" + day1val + "\" and 請求年月 < \"" + day2val + "\"";

return getPaymentRecords(ankenIdVal , option).then(paymentRecords => {
try {
//請求レコード毎にループ loop for each payment record
Object.keys(paymentRecords).forEach(key => {
//請求情報に労働時間が入力されていないか確認
chkWork(paymentRecords[key], e);
});
} catch (error){
e.error = "[" + fcode + "]を確認してください";
e.record[fcode].error = "請求済のレコードが存在する為,この期間は設定できません";
return e;
}
});
}
}
});

 

※2つ目のコードについて補足

ある項目の修正前後の内容を確認するために、上記のような入れ子構造となっております。

 

2つ目のJSにおけるstep.2を全てコメントアウトした場合、問題なく動作することを確認済みです。またアプリをコピーし、新規アプリを生成した際は、問題なく動作しております。 

 

複数のJSで、同じeventを扱う際の注意事項や、kintoneの仕様はありますでしょうか?同現象を経験された方がいましたら情報を共有頂けますと幸いです。

0

8件のコメント

Avatar
rex0220

shigeyoshi tsujiuchi さん

step.2の「return kintone.events.on」 は、beforeEditEvent 内で、イベント処理登録となります。

他の JavaScript カスタマイズで、 edit.submit が登録されている場合、イベント処理登録順に、実行されると思います。

実行順序が想定している順番になっているか確認してみてください。

 

step.2 で 「return」する意味が分かりませんが、kintone.events.on は、Promise オブジェクトを返しませんので、イベント処理登録後に即完了します。

なにか勘違いされているような気がします。

「eventをreturn」とありますが、もしかすると 「return beforeEvent」 でしょうか?

その辺の処理が省略されていますが、何を返しているのかエラー処理で一番肝心なところです。

出来るだけコードは省略しないで記載してください。

0
Avatar
shigeyoshi tsujiuchi

コメント頂きありがとうございます。

ソースコードを省略していた部分について、更新しました。

afterEventをreturnしております。

お手数おかけしますが、再度確認をお願いします。

 

また、下記の文章が理解できていないのですが、「イベント処理登録」とは何をさしておりますでしょうか?

知識不足で申し訳ございません。

""step.2の「return kintone.events.on」 は、beforeEditEvent 内で、イベント処理登録となります。""

0
Avatar
rex0220

もとの「アプリの環境次第」の原因は、アロー関数かもしれません。

IE は、アロー関数未サポートですので、エラーになります。

 

分かりにくくてすみません。「イベント処理登録」は、kintone.events.on を指しています。

 //step.1 は、JavaScript 読み込み時に指定され、//step.2 は、"app.record.edit.show"等のイベント処理内で指定されています。

//step.2 は、"app.record.edit.show"が実行されてはじめて、イベント処理として登録されます。

他の JavaScript で  "app.record.edit.submit" の処理が指定されていると、そちらの方が先に実行されます。

 

 

0
Avatar
shigeyoshi tsujiuchi

返信頂きありがとうございます。

IEは使用しておりません。全ユーザーChromeを使用しております。

 

「イベント処理登録」について丁寧にご説明頂きありがとうございます。理解できました。

その順序で実行されることは確認済みです。

1つ目のJSで正しくエラーをセットできていますが、2つ目のJSにてなぜかそのエラー内容が上書きされていまい、エラーが発生しない状況です。

その際の入力データは、step2.内のIF文に該当しない内容です。1つ目のJSで検知したエラー内容を表示させたいのですが、どのようにすれば良いでしょうか?

0
Avatar
rex0220

とりあえず、Promise 対応していない部分を変更しましょう。

現在のコードだと、step1 の return で、「e」を返しませんので、 以前のエラーも返さないと思います。

 

 

変更前

//step.1
kintone.events.on(beforeEditEvent, function(e) {
var beforeEvent = e;

//step.2
return kintone.events.on(afterEditEvent, function(e) {
...
});
});

 

変更後

//step.1
kintone.events.on(beforeEditEvent, function(e) {
var beforeEvent = e;

//step.2
kintone.events.on(afterEditEvent, function(e) {
...
});
return e;
});
rex0220により編集されました
0
Avatar
shigeyoshi tsujiuchi
step.2に関してもreturn 「e」を追加することで、無事に動きました! 助けて頂き本当にありがとうございます。


//step.1
kintone.events.on(beforeEditEvent, function(e) {
var beforeEvent = e;

//step.2
kintone.events.on(afterEditEvent, function(e) {
...
return e;
});
return e;
});
0
Avatar
shigeyoshi tsujiuchi

アプリをコピーすると、そもそも従来のコードで問題なく動作しておりますが、

それはkintoneさん側のバグか何かでしょうか?

0
Avatar
rex0220

「アプリをコピー」すると動作するというのが不思議なところです。

元コードだと「return e;」していないので、動かないと思われます。

なぜ、動作するようになるのか別の要因がありそうです。

0
ログインしてコメントを残してください。