入力した日付を元にアラートを表示

お世話になっております。

 

(やりたいこと)

レコード編集画面にてテーブル内に設置してあります、日付フィールド(フィールド名、フィールドコード共に 支払日)に日付が入力されたタイミングで、入力した日付と使用しているPCの日付を比較し、違っていた場合にアラートにて表示をし、OKならそのまま、NOなら再度入力する旨のアラートを表示という状態にしたいと考えております。

 

(現状)

コンソールにエラーは無く、行追加時に支払日に現在の日付が入力される状態です。本来であれば日付は空欄の状態で行追加されます。

追記:日付の表示は レコード登録時の日付を初期値にする にチェックが入っていた為に起きていたようです。

(コード)

模索しており書き方が違うことが分かったのでコードを修正しております。

//支払日チェック

(function() {
  'use strict';
 
  kintone.events.on(
    'app.record.create.change.支払日',
    'app.record.edit.change.支払日',
  function(event) {
    
    var changeRowDate = changes.row.value['支払日'].value;
    var date = NowDate;
  
    if(changeRowDate != date){
  var res = confirm("支払日が本日ではありません。nこのまま保存しますか?");
  if(res === true){
            }
          else{
            
        alert("支払日を再度入力してください");
        
            
          }}

        return event;

  });
})();

 

当方で改善策を模索しておりますが、ご教授していただけますと幸いです。

見た限り、以下5点が気になりました。

 

①イベントを複数登録する場合、配列の形である必要があります。

  kintone.events.on(
    'app.record.create.change.支払日',
    'app.record.edit.change.支払日',
  function(event) {

kintone.events.on([
    'app.record.create.change.支払日',
  'app.record.edit.change.支払日'
], function(event) {

 

②サブテーブル上のフィールドを参照する場合はevent.changes.rowです。

    var changeRowDate = changes.row.value['支払日'].value;

      var changeRowDate = event.changes.row.value['支払日'].value;

 

③dateに代入しようとしているNowDateは宣言されていないようです。どこかで宣言されていますか?違う場合、非推奨ですがmoment.jsでは

    var date = NowDate;

      var date = moment().format('YYYY-MM-DD');

このようになります。

 

④alertは選択肢が「OK」しかないお知らせになるので、今回の場合はconfirm(OKとキャンセルの2択)になるかと思います。

  if(!(window.alert("支払日が本日ではありません。このまま保存しますか?") ) ){

    if(!confirm("支払日が本日ではありません。このまま保存しますか?")) {

 

⑤再度入力させるのであれば、対象のフィールドを空白にする必要があると思います(event.errorでフィールドの書き換えをキャンセルさせることができますが、今回の場合は「既に日付フィールドが変更された後のイベント」のため、event.errorでは空白にできません)。またevent.errorを入れると空白にする書き換えがキャンセルされるので、alert等で良いかと思います。

                event.error = "キャンセルしました。"; 

        event.changes.row.value['支払日'].value = '';
alert('キャンセルしました');

mls-hashimoto

お世話になっております。

 

コードの細かいご指摘ありがとうございます。

当方でも色々としらべており、多少は改善することが出来ましたが、まだまだ勉強不足だと感じました。

 

キャンセルを押した際にアラートが日付を変更するまでに一度

if(!confirm("支払日が本日ではありません。このまま保存しますか?")) {

の表示になってしまい(ループしている?)、二度手間となってしまうので改善していこうと思います。

(ご教授後のコード)

//支払日チェック

(function() {
  'use strict';
 
  kintone.events.on([
    'app.record.create.change.支払日',
    'app.record.edit.change.支払日'
  ], function(event) {
    
   var changeRowDate = event.changes.row.value['支払日'].value;
   var date = moment().format('YYYY-MM-DD');
  
    if(changeRowDate != date){
  if(!confirm("支払日が本日ではありません。このまま保存しますか?")) {
  event.changes.row.value['支払日'].value = '';
        alert('キャンセルしました');
        return event;
             }}

       

  });
})();

 

nekoko さま

2回confirmが出るのは

キャンセルする→空白になる→入力されている状態から空白になったことでchangeイベントが再度発生する→空白と現在日の比較になり、違っているため再度confirm

という流れです(もう一度キャンセルした場合、空白から空白になるためそれ以上のchangeイベントは発生しません)。

空白の場合は処理を終わらせるようにすれば問題ありません。

     var changeRowDate = event.changes.row.value['支払日'].value;

     if (!changeRowDate) return event;

     var date = moment().format('YYYY-MM-DD');

mls-hashimoto

お世話になっております。

 

空白になった場合の動作をきちんと理解しきれておりませんでした。

ご教授して頂いたコードを追加したところ理想の動作をすることが出来ました。

ありがとうございます。

 

(完成コード)

//支払日チェック

(function() {
  'use strict';
 
  kintone.events.on([
    'app.record.create.change.支払日',
    'app.record.edit.change.支払日'
  ], function(event) {
    
   var changeRowDate = event.changes.row.value['支払日'].value;
    if (!changeRowDate) return event;
   var date = moment().format('YYYY-MM-DD');
   
  
    if(changeRowDate != date){
  if(!confirm("支払日が本日ではありません。このまま保存しますか?")) {
  event.changes.row.value['支払日'].value = '';
        alert('キャンセルしました');
        return event;
             }}
  });
})();

 

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