【フォームブリッジ】ドロップダウンの値によって特定のフィールドを必須にするカスタマイズ

いつもお世話になっております。

フォームブリッジにて、ドロップダウンがある特定の値(例「種類」の値「退職届」)の場合、社員番号フィールド(文字列)を、必須にするためのカスタマイズを行っております。

当方Javascript初心者ですが、掲示板の情報などいろいろ調べたり、引用したりして以下のコードを作成しました。しかし、あと一歩のところでつまずきました。何故か「種類」の値「退職届」が選択されている場合、社員番号フィールドに文字が入っているとエラーになります。(やりたいことの逆)

lengthを使ったり、trueとfalseを入れ替えてみたりと、色々試したのですが、全く改善せず、困り果てて投稿しました。お手数ですが、わかる方おられれば教えていただけると助かります。宜しくお願い致します。

※ちなみにkintone本体では、問題なく実装できております。

(function() {

    'use strict';

    fb.addValidators = function(state) {
        return {
            empty_validation: {
                getMessage: function(fieldCode, params) {
                    return '退職届の社員番号は必須です';
                },
                validate: function(value, params) {
                    value = (value == null) ? "" : value;
                  if (state.record.種類.value.indexOf("退職届") == -1 && state.record.社員番号.value !== null) {
                        return true;
                    } else {
                        return false;
                    }
                }
            }
        }
    };

    fb.events.form.created.push(function(state) {
        state.fields.filter(function(field) {
            return field.code === '社員番号';
        })[0].validations.push({
            params: [],
            rule: 'empty_validation'
        });
                
        return state;
    });

})();

t.cooさん

こんにちは。

 

if(state.record.種類.value.indexOf("退職届") ==-1&& state.record.社員番号.value !==null) {

記載の条件判定ですと

『種類に「退職届」を含まない かつ 社員番号の入力あり』の場合はOKで、それ以外はエラーとなります。

そのため、種類に「退職届」を含む場合は必ずエラーになってしまいます。

 

以下に合致する条件に変更してみてください。

『種類に「退職届」を含まない』 または 『種類に「退職届」を含む かつ 社員番号の入力あり』

 

また、以下コードは削除しても問題ないかと思います。

value = (value == null) ? "" : value;

koichi さん

ありがとうございます。

『種類に「退職届」を含まない』 または 『種類に「退職届」を含む かつ 社員番号の入力あり』ですので、以下の記述にしてみましたが、全く反応しなくなりました。試しに「state.record.種類.value.indexOf(“退職届”) !== -1」を「== -1」としたところ、反応しましたが、どの部分が間違っていますでしょうか?

if (state.record.種類.value.indexOf("退職届") == -1 || state.record.種類.value.indexOf("退職届") !== -1 && state.record.社員番号.value !== null) {

後半の&&括りを( ) で括ると変化ありますか?

if (state.record.種類.value.indexOf("退職届") == -1 || (state.record.種類.value.indexOf("退職届") !== -1 && state.record.社員番号.value !== null)) {

koichi さん

ありがとうございます。( ) は前半、後半区切ったりといろいろ試したのですが、ダメでした。「!== -1」を「== -1」に変更すると意図しない動きではありますがエラーが出ますので、この部分の記述自体は合っている気がします。

気になる内容として、「値が入っていないとそもそも validattion が動かないみたいです。空エラーはできないっぽいですね。」という投稿がありました。根本的に何か他の方法を変えないとダメなんですかね…。
https://developer.cybozu.io/hc/ja/community/posts/360056488232–%E3%83%95%E3%82%A9%E3%83%BC%E3%83%A0%E3%83%96%E3%83%AA%E3%83%83%E3%82%B8-custom-vallidation-%E3%81%AE%E8%A8%AD%E5%AE%9A%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6

if (state.record.種類.value.indexOf("退職届") == -1 || (state.record.種類.value.indexOf("退職届") !== -1 && state.record.社員番号.value !== null))

改めて拝見すると、以下は「nullでない場合」のため空文字ですとtrueになります。

state.record.社員番号.value !== null

空文字をエラーにするために以下に変更します。

if (state.record.種類.value.indexOf("退職届") == -1 || (state.record.種類.value.indexOf("退職届") !== -1 && state.record.社員番号.value)) {

 

しかし、ご記載の通り、空のまま進むとエラーチェックが走らないので、意図する動きにはならないと思います。

根本的に変えてみます。

種類の選択変更があった際に「退職届」でなければバリデーションなし

「退職届」であれば「required」のバリデーションを当てます。

 

※種類ドロップダウンを選択しても変化ないと思いますが、確認or回答ボタンを押した際にエラーが表示されます。

fb.events.fields.種類.changed = [function(state) {

  if (state.record.種類.value.indexOf('退職届') == -1) {
        state.fields.filter(function(field) {
            return field.code === '社員番号';
        })[0].validations = [];
    } else {
        state.fields.filter(function(field) {
            return field.code === '社員番号';
        })[0].validations.push({
            rule: 'required'
        });
    }

    return state;

}];

koichi さん

なんか色々変更しているうちに、アルゴリズムが乱れていたようで…。
コードまでいただきありがとうございます。
上記コードで問題なく動作いたしました。本当にありがとうございました。心より感謝いたします。m(_ _)m

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