Semantic UI ラジオボタンのvalidationエラーメッセージがたくさん表示される問題
2020/02/06
2020/02/12

Semantic UIは、ドキュメント構造がシンプルで、CSSのクラス定義もヒューマンリーダブルな感じで定義できるので、個人的に好きなCSSフレームワークです。 でも日本語情報が少なめ。
たくさんのエラー
Semantic UIのvalidationで、ラジオボタンの必須入力チェックでエラーが発生した場合 エラーがラジオボタンの選択肢の数だけ表示されてしまいました。

ラジオボタンのグループに対して一つのエラーメッセージだけが表示されるようにしたいです。
まずは、元のHTMLです。
<div class="ui container">
<h1>Semantic UI radio validation</h1>
<form class="ui form">
<div class="field">
<div class="inline fields">
<label for="gender">Gender:</label>
<div class="field">
<div class="ui radio checkbox">
<input id="gender-male" type="radio" name="gender" value="1" tabindex="0" class="">
<label for="gender-male">Male</label>
</div>
</div>
<div class="field">
<div class="ui radio checkbox">
<input id="gender-female" type="radio" name="gender" value="2" tabindex="0" class="">
<label for="gender-female">Female</label>
</div>
</div>
</div>
</div>
<button class="ui primary button" type="submit">Submit</button>
</form>
</div>
<script>
$(function(){
$('.ui.form').form({
inline: true,
fields: {
gender: {
rules: [{
type : 'checked',
prompt : 'please select.'
}]
},
},
});
});
</script> |
全体はgistに置いてあります。
エラーメッセージを出す場所は、validation ruleでエラーになったコントロールが含まれる .fieldブロックの末尾となってます。 なので、上記のHTMLの場合、更にひとつ上の .fieldブロックの末尾にメッセージが追加されるようにすれば、ラジオボタンのグループに対して一つのメッセージが表示されます。
そのために、細工します。
<div class="ui container">
<h1>Semantic UI radio validation</h1>
<form class="ui form">
<div class="field">
<div class="inline fields">
<label for="gender">Gender:</label>
<div class="field no-prompt">
<div class="ui radio checkbox">
<input id="gender-male" type="radio" name="gender" value="1" tabindex="0" class="">
<label for="gender-male">Male</label>
</div>
</div>
<div class="field no-prompt">
<div class="ui radio checkbox">
<input id="gender-female" type="radio" name="gender" value="2" tabindex="0" class="">
<label for="gender-female">Female</label>
</div>
</div>
</div>
</div>
<button class="ui primary button" type="submit">Submit</button>
</form>
</div>
<script>
$(function(){
$('.ui.form').form({
inline: true,
fields: {
gender: {
rules: [{
type : 'checked',
prompt : 'please select.'
}]
},
},
selector: {
group: '.field:not(.no-prompt)',
},
});
console.log('selector', $.fn.form.settings.selector);
});
</script> |
全体はgistに置いてあります。

修正ポイントは、二つです。
- .fieldブロック検索時に対象にされたくない.fieldブロックに、no-prompt クラスを追加
- form validation設定のjavascriptで、 selector.group を上書きする。
この修正を調べるのに、Semantic UIのJavaScriptのソースを見たんですが、意外と読み易くて助かりました。 Semantic UIは、利用者の日本語の情報が少ないですが、本家マニュアルとソースを見ればなんとかなりそうなので、使っていきたいです。