フォームブリッジでファイルの必須、初期化を動的に設定したい

背景・実現したいこと

選択肢が変更したときに、ファイル項目の初期化および必須設定を動的に変更したい 

エラー情報 (開発者ツールのコンソール)

初期的な質問かもしれませんが、よろしくおねがいします

hiroさん

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

エラーが出た際に利用した、カスタマイズのコードのご提示は可能でしょうか?

江田篤史

ご連絡ありがとうございます。

ソースは下記となります。

・項目の初期化

ファイルのValueである配列の初期化を行いましたが、エラーとなりできませんでした。

 function clearValue_for_hidden(state) {

    for (const fieldState1 of state.fields) {

      if ((fieldState1.type === ‘LABEL’) ||

        (fieldState1.type === ‘FILE’) ||

        (fieldState1.type === ‘HR’)

      ) {

      } else if (fieldState1.hide) {

        if ((typeof fieldState1.defaultValue !== “null”) &&

          (typeof fieldState1.defaultValue !== “undefined”)) {

          state.record[fieldState1.code].value = fieldState1.defaultValue;

          console.log(“AT clearValue_for_hidden, set default value:” +

            fieldState1.code +

            " as <" + fieldState1.type + “><” +

            (typeof fieldState1.defaultValue) + “>:"” +

            state.record[fieldState1.code].value + “"”);

        } else {

          switch (fieldState1.type) {

            case ‘SINGLE_LINE_TEXT’:

            case ‘MULTI_LINE_TEXT’:

              state.record[fieldState1.code].value = “-”;

              break;

            case ‘NUMBER’:

            case ‘DATE’:

            case ‘RADIO_BUTTON’:

            case ‘DROP_DOWN’:

              state.record[fieldState1.code].value = “”;

              break;

            case ‘MULTI_SELECT’:

            case ‘SUBTABLE’:

              record[item].value = [];

              break;

            case ‘FILE’: // TODO:もしFILEを消すならBLOB領域の削除など、丁寧な処理が必要。

              break;

            default:

              console.error(“IMPLEMENT ERROR at clearValue_for_hidden : unsupported type=” + fieldState1.type, fieldState1)

          }

          console.log(“AT clearValue_for_hidden, set default value:” +

            fieldState1.code +

            " as <" + fieldState1.type + “>:"” +

            state.record[fieldState1.code].value + “"”);

        }

        fieldState1.required = false;

        for (let i = fieldState1.validations.length - 1; i >= 0; i–) {

          if (fieldState1.validations[i].rule === ‘required’) {

            fieldState1.validations.splice(i, 1);

          }

        }

      } else {

        fieldState1.required = true;

        if (fieldState1.validations.findIndex(c => (c.rule === “required”)) < 0) {

          fieldState1.validations.push({ params: [], rule: “required” });

        }

      }

    }

  }

 

必須設定の動的制御については、下記で行っていますが、fieldState1の対象にファイル項目を含めたところ、エラーとなりました。

 

      if (fieldState1.hide) {

        fieldState1.required = false;

      } else {

        fieldState1.required = condition1;

      }

      if (!fieldState1.required) {

        for (let i = fieldState1.validations.length - 1; i >= 0; i–) {

          if (fieldState1.validations[i].rule === ‘required’) {

            fieldState1.validations.splice(i, 1);

          }

        }

      } else {

        if (fieldState1.validations.findIndex(c => (c.rule === “required”)) < 0) {

          fieldState1.validations.push({ params: [], rule: “required” });

        }

      }

 

以上よろしくおねがいします

hiroさん

お世話になっております。
ご提示ありがとうございます。

エラーの原因が「項目の初期化」か「必須設定の動的制御」のどちらなのか整理がしたいですね。
どちらかのみを有効にして、それぞれどのようなエラーが出るかご確認いただけますか?

 

> ファイルのValueである配列の初期化を行いましたが、エラーとなりできませんでした。

ご提示いただいたコードですと配列の初期化というのは行われていなさそうですが、エラーが出たときは下記のような記述をしていたということでしょうか?

case 'FILE':
state.record[fieldState1.code].value = [];

エラーが出ていた際の記述を教えていただけると、なにかお力になれるかもしれません。

江田篤史

ご連絡ありがとうございます。

現在は、修正して元のソースは有りませんが、初期化はご提示いただきました処理で行っていました。

また、切り分けとして現在は必須の除外だけにしたところ、当初のコンソールエラーが表示されました。

hiroさん

> 初期化はご提示いただきました処理で行っていました。

こちらの記述で、初期化は正常に動作しますか?

 

> 必須の除外だけにしたところ、当初のコンソールエラーが表示されました。

切り分けありがとうございます。

state.fields[添付ファイルのフィールド番号].validations にバリデーションの値が正しくセットされているか、確認してみると良いと思います。(フィールド番号はフォームの左上から数えたフィールドの順番(0始まりの整数)です)
恐らく、選択肢のchangeイベントの最後でstateをreturnしているかと思います。
そちらにブレークポイントを貼って、stateの中身を確認してみると良いと思います。
https://ics.media/entry/190517/

正しいか判断する比較対象としては、必須の切り替えが正しく動作しているフィールドについて見てみると良いかと思います。
state.fields[添付ファイルのフィールド番号].validations と state.fields[必須の切り替えが正しく動作しているフィールドの番号].validations に違いがないか見てみると良いかと思います。

江田篤史

アドバイスありがとうございます。

> 初期化はご提示いただきました処理で行っていました。

こちらの記述で、初期化は正常に動作しますか?

→ 先程確認したところ、無事どうさしました。ありがとうございます。

必須については、一度切り分けを進めたいと思います。

 

 

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