field-select
Обёртка field вокруг родного select. Больше десяти вариантов — и select включает комбобокс с фильтром из select.js; отправляет форма всё равно родной select.
Три варианта: обычный select
Поместите это внутрь <section rst-box><form rst-form>.
<div rst-field >
<label rst-field-label for ="sel_few" >Роль</label >
<select rst-input id ="sel_few" name ="sel_few" >
<option value ="admin" selected >Администратор</option >
<option value ="editor" >Редактор</option >
<option value ="member" >Участник</option >
</select >
</div >
Поместите это внутрь <section rst-box><form rst-form>.
{{ template "field-select" dict
"ID" "sel_few"
"Name" "sel_few"
"Label" "Роль"
"Options" (list
(dict "Label" "Администратор" "Selected" true "Value" "admin" )
(dict "Label" "Редактор" "Value" "editor" )
(dict "Label" "Участник" "Value" "member" ))}}
Двенадцать вариантов: комбобокс с фильтром
Поместите это внутрь <section rst-box><form rst-form>.
<div rst-field >
<label rst-field-label for ="sel_many" >Город</label >
<select rst-input id ="sel_many" name ="sel_many" data-rst-select data-rst-select-filter ="Введите текст для фильтра" data-rst-select-results ="Результатов: {n}" data-rst-select-result-one ="1 результат" data-rst-select-no-matches ="Совпадений нет" aria-describedby ="sel_many-help" >
<option value ="dublin" selected >Дублин</option >
<option value ="lisbon" >Лиссабон</option >
<option value ="madrid" >Мадрид</option >
<option value ="berlin" >Берлин</option >
<option value ="rome" >Рим</option >
<option value ="athens" >Афины</option >
<option value ="helsinki" >Хельсинки</option >
<option value ="reykjavík" >Рейкьявик</option >
<option value ="warsaw" >Варшава</option >
<option value ="zagreb" >Загреб</option >
<option value ="tallinn" >Таллин</option >
<option value ="valletta" >Валлетта</option >
</select >
<p rst-field-help id ="sel_many-help" >Начните вводить, чтобы отфильтровать.</p >
</div >
Поместите это внутрь <section rst-box><form rst-form>.
{{ template "field-select" dict
"ID" "sel_many"
"Name" "sel_many"
"Label" "Город"
"Options" (list
(dict "Label" "Дублин" "Selected" true "Value" "dublin" )
(dict "Label" "Лиссабон" "Value" "lisbon" )
(dict "Label" "Мадрид" "Value" "madrid" )
(dict "Label" "Берлин" "Value" "berlin" )
(dict "Label" "Рим" "Value" "rome" )
(dict "Label" "Афины" "Value" "athens" )
(dict "Label" "Хельсинки" "Value" "helsinki" )
(dict "Label" "Рейкьявик" "Value" "reykjavík" )
(dict "Label" "Варшава" "Value" "warsaw" )
(dict "Label" "Загреб" "Value" "zagreb" )
(dict "Label" "Таллин" "Value" "tallinn" )
(dict "Label" "Валлетта" "Value" "valletta" ))
"Help" "Начните вводить, чтобы отфильтровать." }}
Больше десяти вариантов — и партиал включает select.js. Меньше десяти — нет: поиск по горстке пунктов это мебель, а не помощь.
Двенадцать вариантов, Plain: от улучшения отказались
Поместите это внутрь <section rst-box><form rst-form>.
<div rst-field >
<label rst-field-label for ="sel_plain" >Город</label >
<select rst-input id ="sel_plain" name ="sel_plain" >
<option value ="dublin" selected >Дублин</option >
<option value ="lisbon" >Лиссабон</option >
<option value ="madrid" >Мадрид</option >
<option value ="berlin" >Берлин</option >
<option value ="rome" >Рим</option >
<option value ="athens" >Афины</option >
<option value ="helsinki" >Хельсинки</option >
<option value ="reykjavík" >Рейкьявик</option >
<option value ="warsaw" >Варшава</option >
<option value ="zagreb" >Загреб</option >
<option value ="tallinn" >Таллин</option >
<option value ="valletta" >Валлетта</option >
</select >
</div >
Поместите это внутрь <section rst-box><form rst-form>.
{{ template "field-select" dict
"ID" "sel_plain"
"Name" "sel_plain"
"Label" "Город"
"Options" (list
(dict "Label" "Дублин" "Selected" true "Value" "dublin" )
(dict "Label" "Лиссабон" "Value" "lisbon" )
(dict "Label" "Мадрид" "Value" "madrid" )
(dict "Label" "Берлин" "Value" "berlin" )
(dict "Label" "Рим" "Value" "rome" )
(dict "Label" "Афины" "Value" "athens" )
(dict "Label" "Хельсинки" "Value" "helsinki" )
(dict "Label" "Рейкьявик" "Value" "reykjavík" )
(dict "Label" "Варшава" "Value" "warsaw" )
(dict "Label" "Загреб" "Value" "zagreb" )
(dict "Label" "Таллин" "Value" "tallinn" )
(dict "Label" "Валлетта" "Value" "valletta" ))
"Plain" true }}
Обязательное, с ошибкой
Поместите это внутрь <section rst-box><form rst-form>.
<div rst-field >
<label rst-field-label for ="sel_error" >Роль</label >
<select rst-input id ="sel_error" name ="sel_error" required aria-invalid ="true" aria-describedby ="sel_error-error" >
<option value ="admin" selected >Администратор</option >
<option value ="editor" >Редактор</option >
<option value ="member" >Участник</option >
</select >
<p rst-field-error id ="sel_error-error" role ="alert" >Выберите роль для этого человека.</p >
</div >
Поместите это внутрь <section rst-box><form rst-form>.
{{ template "field-select" dict
"ID" "sel_error"
"Name" "sel_error"
"Label" "Роль"
"Options" (list
(dict "Label" "Администратор" "Selected" true "Value" "admin" )
(dict "Label" "Редактор" "Value" "editor" )
(dict "Label" "Участник" "Value" "member" ))
"Required" true
"Error" "Выберите роль для этого человека." }}
Написан вручную, с optgroup
Поместите это внутрь <section rst-box><form rst-form>.
<div rst-field >
<label rst-field-label for ="sel_grouped" >Регион</label >
<select rst-input id ="sel_grouped" name ="sel_grouped" data-rst-select data-rst-select-filter ="Введите текст для фильтра" data-rst-select-results ="Результатов: {n}" data-rst-select-result-one ="1 результат" data-rst-select-no-matches ="Совпадений нет" >
<optgroup label ="Европа" >
<option value ="dublin" selected >Дублин</option >
<option value ="lisbon" >Лиссабон</option >
<option value ="warsaw" >Варшава</option >
</optgroup >
<optgroup label ="Америка" >
<option value ="montreal" >Монреаль</option >
<option value ="lima" >Лима</option >
<option value ="austin" >Остин</option >
</optgroup >
<optgroup label ="Азия" >
<option value ="osaka" >Осака</option >
<option value ="hanoi" >Ханой</option >
<option value ="dhaka" >Дакка</option >
</optgroup >
<optgroup label ="Африка" >
<option value ="accra" >Аккра</option >
<option value ="nairobi" >Найроби</option >
<option value ="tunis" >Тунис</option >
</optgroup >
</select >
</div >
Options здесь — плоский список, поэтому сгруппированные варианты пишет разметкой само приложение. select.js отрисовывает группы, а не выбрасывает их; написанный вручную select может и вовсе отказаться от улучшения через data-rst-select="false".