pub struct RepeaterField<F = ()>(/* private fields */);Expand description
A repeater: Field::repeater, or a record form’s #[form(repeat)] control (F is the
form).
- Each row posts its item’s fields under its own prefix (
steps.0.minutes), and the repeater’s own key lists the rows in the order they show. A refused row renders its error under its own control, and the rows come back in the order the user left them. - A repeater takes at most
MAX_REPEATER_ROWS(100) rows; a submission listing more is refused. - No rows is the repeater’s blank answer, so a repeater is never required. An edit that does not post the repeater, such as one hidden by a condition, keeps the stored rows; one that posts no rows stores an empty list.
- Adding, removing and moving rows needs JavaScript. Without it the stored rows still edit.
- An action’s input can place a repeater too, with a hand-written
FormInputwhoseparsereads the rows withparse_items. - On the detail page,
RepeaterColumnshows each item’s fields under their labels. The model’s default detail page includes one; its table does not. - Not supported inside an item: an embedded value, another repeater, a relationship, a file field and a condition.
Implementations§
Source§impl<F> RepeaterField<F>
impl<F> RepeaterField<F>
pub fn label(self, label: impl Into<Text>) -> Self
pub fn name(&self) -> &str
Sourcepub fn visible_when(
self,
watched: &impl Watched<F>,
values: impl IntoIterator<Item = impl Into<String>>,
) -> Self
pub fn visible_when( self, watched: &impl Watched<F>, values: impl IntoIterator<Item = impl Into<String>>, ) -> Self
Shows the field only while watched posts one of values: an option’s value, or
true for a checked toggle. A hidden field posts nothing, so an edit keeps its
stored value and a create takes its blank answer; a field with no blank answer
cannot be conditional. A field shows under one condition: a later call replaces an
earlier one, so a field depending on two watched fields sits in a
Section guarded by the other.
let kind = Field::choice(Customer::fields().kind()).options(["person", "company"]);
let vat = Field::text(Customer::fields().vat_number()).visible_when(&kind, ["company"]);
Schema::new((kind, vat));- The browser shows and hides the field as the watched one changes, with no request. A hidden field’s control is disabled, so the browser neither validates nor posts it. Without JavaScript, the fields start as the stored values show them and stay that way.
- The panel reads a submission the same way and drops a hidden field’s posted key, and a file field’s carried upload: an edit keeps the stored value, and a create stores the blank answer. A conditional field therefore needs a blank answer, and mounting refuses one without.
- Mounting also refuses a value the watched field never posts (a choice’s option or
a toggle’s
trueandfalseare checked), and a condition watching a field that another condition hides while the guarded field still shows: place the guarded field inside the block that hides the watched one. A schema also refuses a condition watching a field it does not place, which only a page’s or an action’s schema can do: a resource’s form places every record-form field. - A toggle is followed through its checkbox. An app’s own checkbox
Controlposts the samevaluechecked or not, so a condition cannot follow it. - A multiple choice’s key holds a list, which no condition value spells: mounting refuses a condition watching one.
Source§impl<F> RepeaterField<F>
impl<F> RepeaterField<F>
Sourcepub fn add_label(self, label: impl Into<Text>) -> Self
pub fn add_label(self, label: impl Into<Text>) -> Self
The add button’s label, over “Add item”.
Sourcepub fn min_items(self, count: usize) -> Self
pub fn min_items(self, count: usize) -> Self
Refuse a submission of fewer than count rows, and disable each row’s Remove button while
the list holds no more. A minimum above max_items fails the mount.
Sourcepub fn max_items(self, count: usize) -> Self
pub fn max_items(self, count: usize) -> Self
Refuse a submission of more than count rows, and disable the add button while the list
holds that many. A count above MAX_REPEATER_ROWS, which
every repeater keeps to, fails the mount.