Fessの管理画面には、検索結果一覧からドキュメントを直接編集できる機能があります。今回、この編集画面のバリデーションメッセージの改善と、カスタムフィールドの編集対応を行いました。
背景
管理画面の検索結果編集画面(Admin Search List)では、ドキュメントのフィールドを編集する際にバリデーションが実行されます。しかし、いくつかの問題がありました。
- バリデーションエラーのメッセージに
doc.プレフィックスが表示され、ユーザーにとってわかりにくい表示になっていた - 配列フィールドのバリデーションで、配列用ではなく必須チェック用のエラーメッセージが誤って使われていた
- 標準フィールド以外のカスタムフィールドが編集画面に表示されず、編集できなかった
バリデーションメッセージの修正
validateFields() メソッドでのエラーメッセージ生成を修正しました。従来は .map(s -> "doc." + s) でフィールド名にプレフィックスを付与した後、そのプレフィックス付きの名前をエラーメッセージの表示テキストとしても使っていました。
修正後は、"doc." プレフィックスはプロパティキー(JSPのバインディング用)にのみ使用し、表示テキストにはフィールド名そのものを使うようにしています。これにより、「doc.url is required.」ではなく「url is required.」と表示されるようになります。
// 修正前
.map(s -> "doc." + s)
.forEach(s -> messages.addErrorsPropertyRequired(s, s));
// 修正後
.forEach(s -> messages.addErrorsPropertyRequired("doc." + s, s));
配列フィールド用バリデーションメッセージの追加
配列フィールドのバリデーションでは、errors.property_required が誤って使用されていたため、専用の errors.property_type_array メッセージキーを新設しました。17言語すべてに翻訳を追加しています。
# 英語
errors.property_type_array={0} must be an array.
# 日本語
errors.property_type_array={0}は配列でなければなりません。
FessMessages クラスにも addErrorsPropertyTypeArray() メソッドを追加し、validateFields() メソッドから呼び出すようにしています。
カスタムフィールドの編集対応
編集画面では、URLやタイトルなどの標準フィールドはハードコードされた入力フォームで表示されますが、ユーザーが追加したカスタムフィールドは表示されていませんでした。
今回、registerExtraFields() メソッドを追加し、ドキュメントに含まれるフィールドのうち標準フィールド(STANDARD_EDIT_FIELDS)に含まれないものを動的に検出して編集画面に表示するようにしました。
フィールドの型は FessConfig の設定に基づいて自動判定されます。
- 配列フィールド → テキストエリア
- 日付フィールド → テキスト入力(日付フォーマットのバリデーション付き)
- 数値フィールド(integer、long、float、double) → 数値入力
- その他 → テキスト入力
また、_id、_version、_seq_no、_primary_term などの内部メタデータフィールドは、セキュリティの観点から編集画面に表示されないよう除外しています。
カスタムフィールドの候補は、ドキュメントに含まれるキーだけでなく、FessConfig で定義されたフィールド定義からも取得されます。これにより、新規作成時やドキュメントにまだ値が設定されていないフィールドも編集画面に表示されます。
テストの追加
AdminSearchlistActionTest として27件のユニットテストを追加し、以下をカバーしています。
- フォームの初期化とフィールドの割り当て
validateFields()の正常系・異常系(必須、float、long、日付)- バリデーションメッセージのプロパティキー形式
STANDARD_EDIT_FIELDS定数の内容registerExtraFields()のカスタムフィールド検出、型判定、ソート順、null処理- 予約フィールドの除外
まとめ
この改善により、管理画面の検索結果編集画面がより使いやすくなりました。バリデーションメッセージがわかりやすくなり、カスタムフィールドも直接編集できるようになっています。詳細は PR #3102 を参照してください。