Skip to content

Commit c969535

Browse files
committed
feat: add read-only support to extra fields
1 parent 9527806 commit c969535

1 file changed

Lines changed: 48 additions & 25 deletions

File tree

src/ui/components/extra_fields.rs

Lines changed: 48 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ struct FieldDraft {
2424
label: String,
2525
description: String,
2626
required: bool,
27+
readonly: bool,
2728
allow_multi_values: bool,
2829
options: Vec<String>,
2930
units: Vec<String>,
@@ -46,6 +47,7 @@ impl Default for FieldDraft {
4647
/// assert!(d.label.is_empty());
4748
/// assert!(d.description.is_empty());
4849
/// assert_eq!(d.required, false);
50+
/// assert_eq!(d.readonly, false);
4951
/// assert_eq!(d.allow_multi_values, false);
5052
/// assert!(d.options.is_empty());
5153
/// assert!(d.units.is_empty());
@@ -57,6 +59,7 @@ impl Default for FieldDraft {
5759
label: String::new(),
5860
description: String::new(),
5961
required: false,
62+
readonly: false,
6063
allow_multi_values: false,
6164
options: Vec::new(),
6265
units: Vec::new(),
@@ -249,6 +252,7 @@ pub enum ExtraFieldsMsg {
249252
DraftLabelChanged(String),
250253
DraftDescChanged(String),
251254
DraftRequiredToggled(bool),
255+
DraftReadonlyToggled(bool),
252256
DraftAllowMultiToggled(bool),
253257
DraftOptionChanged {
254258
index: usize,
@@ -355,6 +359,7 @@ pub fn update(
355359
label: f.label.clone(),
356360
description: f.description.clone().unwrap_or_default(),
357361
required: f.required,
362+
readonly: f.readonly,
358363
allow_multi_values: f.allow_multi_values,
359364
options: f.options.clone(),
360365
units: f.units.clone(),
@@ -389,6 +394,12 @@ pub fn update(
389394
}
390395
None
391396
}
397+
ExtraFieldsMsg::DraftReadonlyToggled(val) => {
398+
if let Some(d) = model.modal_draft.as_mut() {
399+
d.readonly = val;
400+
}
401+
None
402+
}
392403
ExtraFieldsMsg::DraftKindChanged(kind) => {
393404
if model.editing_field.is_none()
394405
&& let Some(d) = model.modal_draft.as_mut()
@@ -968,12 +979,14 @@ fn render_checkbox(
968979
msgs: &mut Vec<ExtraFieldsMsg>,
969980
) {
970981
let mut checked = field.value == "on";
971-
if ui.checkbox(&mut checked, "Checked").changed() {
972-
msgs.push(ExtraFieldsMsg::ToggleCheckbox {
973-
index: idx,
974-
checked,
975-
});
976-
}
982+
ui.add_enabled_ui(!field.readonly, |ui| {
983+
if ui.checkbox(&mut checked, "Checked").changed() {
984+
msgs.push(ExtraFieldsMsg::ToggleCheckbox {
985+
index: idx,
986+
checked,
987+
});
988+
}
989+
});
977990
}
978991

979992
/// Renders selectable options for a select/radio field and emits messages when the selection changes.
@@ -1001,30 +1014,34 @@ fn render_options(
10011014
} else {
10021015
field.value_multi.clone()
10031016
};
1004-
for opt in &field.options {
1005-
let mut is_on = chosen.contains(opt);
1006-
if ui.checkbox(&mut is_on, opt).changed() {
1007-
if is_on {
1008-
chosen.push(opt.clone());
1009-
} else {
1010-
chosen.retain(|v| v != opt);
1017+
ui.add_enabled_ui(!field.readonly, |ui| {
1018+
for opt in &field.options {
1019+
let mut is_on = chosen.contains(opt);
1020+
if ui.checkbox(&mut is_on, opt).changed() {
1021+
if is_on {
1022+
chosen.push(opt.clone());
1023+
} else {
1024+
chosen.retain(|v| v != opt);
1025+
}
1026+
msgs.push(ExtraFieldsMsg::UpdateMulti {
1027+
index: idx,
1028+
values: chosen.clone(),
1029+
});
10111030
}
1012-
msgs.push(ExtraFieldsMsg::UpdateMulti {
1013-
index: idx,
1014-
values: chosen.clone(),
1015-
});
10161031
}
1017-
}
1032+
});
10181033
} else {
10191034
let mut current = field.value.clone();
1020-
for opt in &field.options {
1021-
if ui.radio_value(&mut current, opt.clone(), opt).clicked() {
1022-
msgs.push(ExtraFieldsMsg::EditValue {
1023-
index: idx,
1024-
value: opt.clone(),
1025-
});
1035+
ui.add_enabled_ui(!field.readonly, |ui| {
1036+
for opt in &field.options {
1037+
if ui.radio_value(&mut current, opt.clone(), opt).clicked() {
1038+
msgs.push(ExtraFieldsMsg::EditValue {
1039+
index: idx,
1040+
value: opt.clone(),
1041+
});
1042+
}
10261043
}
1027-
}
1044+
});
10281045
}
10291046
}
10301047

@@ -1326,6 +1343,7 @@ fn apply_draft_to_field(draft: &FieldDraft, field: &mut ExtraField) {
13261343
}
13271344
field.description = trimmed_or_none(&draft.description);
13281345
field.required = draft.required;
1346+
field.readonly = draft.readonly;
13291347
field.allow_multi_values = draft.allow_multi_values;
13301348
field.group_id = draft.group_id;
13311349

@@ -1435,6 +1453,11 @@ fn render_field_modal(
14351453
if ui.checkbox(&mut required, "Required").changed() {
14361454
msgs.push(ExtraFieldsMsg::DraftRequiredToggled(required));
14371455
}
1456+
ui.add_space(4.0);
1457+
let mut readonly = draft.readonly;
1458+
if ui.checkbox(&mut readonly, "Read-only").changed() {
1459+
msgs.push(ExtraFieldsMsg::DraftReadonlyToggled(readonly));
1460+
}
14381461

14391462
ui.add_space(8.0);
14401463
match draft.kind {

0 commit comments

Comments
 (0)