@@ -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