From 218e6aff15aa9a3a2f10baf07a4b9548ae7e447f Mon Sep 17 00:00:00 2001 From: Paul-Christian Volkmer Date: Thu, 23 May 2024 15:04:19 +0200 Subject: [PATCH] feat: add profile option 'remove_filter' to remove filter for form entries --- README.md | 6 +- src/model/data_form.rs | 142 ++++++++++++++++++++++++++++++++++++- src/model/mod.rs | 23 +++--- src/model/unterformular.rs | 106 ++++++++++++++++++++++++++- src/profile.rs | 8 +++ tests/test.osc | 10 +++ 6 files changed, 281 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index f84ce7f..25f8c33 100644 --- a/README.md +++ b/README.md @@ -203,6 +203,7 @@ forms: hide: true - name: "otherformfield" default_value: "T" + remove_filter: true scripts_code: | // Beispielcode console.log(getFieldValue('ref_first_mtb')); @@ -238,11 +239,12 @@ wird. Dadurch wird das Formularfeld nie angezeigt. Ein zuvor bestehender Filter wird ersetzt. Weiterhin wird die Eigenschaft "Speichern" des Formularfelds auf "Immer speichern" gesetzt um sicherzustellen, dass -zuvor -enthaltene Daten weiterhin gespeichert bleiben und werden, auch wenn das Formularfeld nicht sichtbar ist. +zuvor enthaltene Daten weiterhin gespeichert bleiben und werden, auch wenn das Formularfeld nicht sichtbar ist. Der Standardwert des Feldes `otherformfield` ist nun auf `T` gesetzt. Zum Löschen eines Standardwerts ist `""` anzugeben. +Das Formularfeld wird dabei nun immer angezeigt, auch wenn zuvor ein (Anzeige)-Filter gesetzt war. +Dieser wird mir `remove_filter: true` entfernt. **Achtung!** Diese Anwendung überprüft keine Scripts und verwendet angegebene Scripts als "valid" im resultierenden OSC-File. diff --git a/src/model/data_form.rs b/src/model/data_form.rs index f994340..fe6bf7c 100644 --- a/src/model/data_form.rs +++ b/src/model/data_form.rs @@ -662,6 +662,10 @@ impl FormEntry for Entry { }); self.speichern = "0".into() } + + fn remove_filter(&mut self) { + self.filter = None; + } } impl Sortable for Entry { @@ -696,7 +700,7 @@ mod tests { use std::str::FromStr; use crate::model::onkostar_editor::OnkostarEditor; - use crate::model::Script; + use crate::model::{Filter, RefEntries, Script}; use crate::profile::Profile; #[test] @@ -895,4 +899,140 @@ mod tests { }) ); } + + #[test] + fn should_remove_dataform_entry_filter_with_form_fields() { + let onkostar_editor = OnkostarEditor::from_str(include_str!("../../tests/test.osc")); + + assert!(onkostar_editor.is_ok()); + let mut onkostar_editor = onkostar_editor.unwrap(); + + let profile = "forms: + - name: 'Hauptformular' + form_fields: + - name: Auswahl + remove_filter: true + scripts_code: |- + // Example code + console.log(42); + "; + + let profile = Profile::from_str(profile); + assert!(profile.is_ok()); + let profile = profile.unwrap(); + + assert_eq!( + onkostar_editor.editor.data_form[0].entries.entry[0].filter, + None + ); + + assert_eq!( + onkostar_editor.editor.data_form[0].entries.entry[1].filter, + None + ); + + assert_eq!( + onkostar_editor.editor.data_form[0].entries.entry[2].filter, + Some(Filter { + condition: "getGlobalSetting('mehrere_mtb_in_mtbepisode') = 'true'".into(), + valid: true, + ref_entries: Some(RefEntries { ref_entry: None }) + }) + ); + + assert_eq!( + onkostar_editor.editor.data_form[0].entries.entry[3].filter, + None + ); + + onkostar_editor.apply_profile(&profile); + + assert_eq!( + onkostar_editor.editor.data_form[0].entries.entry[0].filter, + None + ); + + assert_eq!( + onkostar_editor.editor.data_form[0].entries.entry[1].filter, + None + ); + + assert_eq!( + onkostar_editor.editor.data_form[0].entries.entry[2].filter, + None + ); + + assert_eq!( + onkostar_editor.editor.data_form[0].entries.entry[3].filter, + None + ); + } + + #[test] + fn should_remove_dataform_entry_filter_with_form_references() { + let onkostar_editor = OnkostarEditor::from_str(include_str!("../../tests/test.osc")); + + assert!(onkostar_editor.is_ok()); + let mut onkostar_editor = onkostar_editor.unwrap(); + + let profile = "forms: + - name: 'Hauptformular' + form_fields: + - name: Auswahl + remove_filter: true + scripts_code: |- + // Example code + console.log(42); + "; + + let profile = Profile::from_str(profile); + assert!(profile.is_ok()); + let profile = profile.unwrap(); + + assert_eq!( + onkostar_editor.editor.data_form[0].entries.entry[0].filter, + None + ); + + assert_eq!( + onkostar_editor.editor.data_form[0].entries.entry[1].filter, + None + ); + + assert_eq!( + onkostar_editor.editor.data_form[0].entries.entry[2].filter, + Some(Filter { + condition: "getGlobalSetting('mehrere_mtb_in_mtbepisode') = 'true'".into(), + valid: true, + ref_entries: Some(RefEntries { ref_entry: None }) + }) + ); + + assert_eq!( + onkostar_editor.editor.data_form[0].entries.entry[3].filter, + None + ); + + onkostar_editor.apply_profile(&profile); + + assert_eq!( + onkostar_editor.editor.data_form[0].entries.entry[0].filter, + None + ); + + assert_eq!( + onkostar_editor.editor.data_form[0].entries.entry[1].filter, + None + ); + + assert_eq!( + onkostar_editor.editor.data_form[0].entries.entry[2].filter, + None + ); + + assert_eq!( + onkostar_editor.editor.data_form[0].entries.entry[3].filter, + None + ); + } } diff --git a/src/model/mod.rs b/src/model/mod.rs index 84a5308..779456f 100644 --- a/src/model/mod.rs +++ b/src/model/mod.rs @@ -197,7 +197,7 @@ pub struct FeldWert { punkte: String, } -#[derive(Serialize, Deserialize, Debug)] +#[derive(Serialize, Deserialize, Debug, PartialEq)] #[serde(deny_unknown_fields)] pub struct Filter { #[serde(rename = "Condition")] @@ -209,7 +209,7 @@ pub struct Filter { ref_entries: Option, } -#[derive(Serialize, Deserialize, Debug)] +#[derive(Serialize, Deserialize, Debug, PartialEq)] #[serde(deny_unknown_fields)] pub struct RefEntries { #[serde(rename = "RefEntry")] @@ -327,6 +327,9 @@ where if let Some(scripts_code) = &form_reference.escaped_scripts_code() { entry.update_scripts_code(scripts_code.clone()); } + if form_reference.remove_filter { + entry.remove_filter() + } } } @@ -334,16 +337,19 @@ fn apply_profile_to_form_field(entry: &mut E, form_field: &FormField) where E: FormEntry, { - if entry.get_name() == form_field.name && form_field.hide { - entry.hide() - } if entry.get_name() == form_field.name { + if form_field.hide { + entry.hide() + } if let Some(new_default_value) = &form_field.default_value { entry.update_default_value(new_default_value.to_string()) } - } - if let Some(scripts_code) = &form_field.escaped_scripts_code() { - entry.update_scripts_code(scripts_code.clone()); + if let Some(scripts_code) = &form_field.escaped_scripts_code() { + entry.update_scripts_code(scripts_code.clone()); + } + if form_field.remove_filter { + entry.remove_filter() + } } } @@ -391,6 +397,7 @@ pub trait FormEntry { fn update_scripts_code(&mut self, value: String); fn update_default_value(&mut self, value: String); fn hide(&mut self); + fn remove_filter(&mut self); } pub trait FolderContent { diff --git a/src/model/unterformular.rs b/src/model/unterformular.rs index cf3f5cc..058de01 100644 --- a/src/model/unterformular.rs +++ b/src/model/unterformular.rs @@ -657,6 +657,10 @@ impl FormEntry for Entry { }); self.speichern = "0".into() } + + fn remove_filter(&mut self) { + self.filter = None; + } } impl Sortable for Entry { @@ -692,7 +696,7 @@ mod tests { use std::str::FromStr; use crate::model::onkostar_editor::OnkostarEditor; - use crate::model::Script; + use crate::model::{Filter, RefEntries, Script}; use crate::profile::Profile; #[test] @@ -793,7 +797,7 @@ mod tests { } #[test] - fn should_change_dataform_entry_scripts_code_with_form_fields() { + fn should_change_unterformular_entry_scripts_code_with_form_fields() { let onkostar_editor = OnkostarEditor::from_str(include_str!("../../tests/test.osc")); assert!(onkostar_editor.is_ok()); @@ -829,7 +833,7 @@ mod tests { } #[test] - fn should_change_dataform_entry_scripts_code_with_form_references() { + fn should_change_unterformular_entry_scripts_code_with_form_references() { let onkostar_editor = OnkostarEditor::from_str(include_str!("../../tests/test.osc")); assert!(onkostar_editor.is_ok()); @@ -863,4 +867,100 @@ mod tests { }) ); } + + #[test] + fn should_remove_unterformular_entry_filter_with_form_fields() { + let onkostar_editor = OnkostarEditor::from_str(include_str!("../../tests/test.osc")); + + assert!(onkostar_editor.is_ok()); + let mut onkostar_editor = onkostar_editor.unwrap(); + + let profile = "forms: + - name: 'Unterformular' + form_fields: + - name: Termin + remove_filter: true + scripts_code: |- + // Example code + console.log(42); + "; + + let profile = Profile::from_str(profile); + assert!(profile.is_ok()); + let profile = profile.unwrap(); + + assert_eq!( + onkostar_editor.editor.unterformular[0].entries.entry[0].filter, + None + ); + + assert_eq!( + onkostar_editor.editor.unterformular[0].entries.entry[1].filter, + Some(Filter { + condition: "getGlobalSetting('mehrere_mtb_in_mtbepisode') = 'true'".into(), + valid: true, + ref_entries: Some(RefEntries { ref_entry: None }) + }) + ); + + onkostar_editor.apply_profile(&profile); + + assert_eq!( + onkostar_editor.editor.unterformular[0].entries.entry[0].filter, + None + ); + + assert_eq!( + onkostar_editor.editor.unterformular[0].entries.entry[1].filter, + None + ); + } + + #[test] + fn should_remove_unterformular_entry_filter_with_form_references() { + let onkostar_editor = OnkostarEditor::from_str(include_str!("../../tests/test.osc")); + + assert!(onkostar_editor.is_ok()); + let mut onkostar_editor = onkostar_editor.unwrap(); + + let profile = "forms: + - name: 'Unterformular' + form_fields: + - name: Termin + remove_filter: true + scripts_code: |- + // Example code + console.log(42); + "; + + let profile = Profile::from_str(profile); + assert!(profile.is_ok()); + let profile = profile.unwrap(); + + assert_eq!( + onkostar_editor.editor.unterformular[0].entries.entry[0].filter, + None + ); + + assert_eq!( + onkostar_editor.editor.unterformular[0].entries.entry[1].filter, + Some(Filter { + condition: "getGlobalSetting('mehrere_mtb_in_mtbepisode') = 'true'".into(), + valid: true, + ref_entries: Some(RefEntries { ref_entry: None }) + }) + ); + + onkostar_editor.apply_profile(&profile); + + assert_eq!( + onkostar_editor.editor.unterformular[0].entries.entry[0].filter, + None + ); + + assert_eq!( + onkostar_editor.editor.unterformular[0].entries.entry[1].filter, + None + ); + } } diff --git a/src/profile.rs b/src/profile.rs index 0488815..230cdca 100644 --- a/src/profile.rs +++ b/src/profile.rs @@ -79,6 +79,8 @@ pub struct FormReference { pub referenced_data_form: Option, pub anzeige: Option, pub anzeige_auswahl: Option, + #[serde(default)] + pub remove_filter: bool, scripts_code: Option, } @@ -94,6 +96,8 @@ pub struct FormField { #[serde(default)] pub hide: bool, pub default_value: Option, + #[serde(default)] + pub remove_filter: bool, scripts_code: Option, } @@ -154,6 +158,7 @@ mod tests { referenced_data_form: 'OS.Tumorkonferenz.VarianteUKW' anzeige: 'Datum: {Datum}' anzeige_auswahl: 'TK vom {Datum}' + remove_filter: true scripts_code: |- // Example code console.log(42); @@ -177,6 +182,7 @@ mod tests { profile.forms[0].form_references[0].anzeige_auswahl, Some("TK vom {Datum}".to_string()) ); + assert!(profile.forms[0].form_references[0].remove_filter); assert_eq!( profile.forms[0].form_references[0].escaped_scripts_code(), Some("// Example code console.log(42);".to_string()) @@ -262,6 +268,7 @@ mod tests { - name: formularfeld_to_hide hide: true - name: formularfeld_to_mod + remove_filter: true scripts_code: |- // Example code console.log(42); @@ -278,6 +285,7 @@ mod tests { assert!(profile.forms[0].form_fields[1].hide); assert_eq!(profile.forms[0].form_fields[2].name, "formularfeld_to_mod"); assert!(!profile.forms[0].form_fields[2].hide); + assert!(profile.forms[0].form_fields[2].remove_filter); assert_eq!( profile.forms[0].form_fields[2].escaped_scripts_code(), Some("// Example code console.log(42);".to_string()) diff --git a/tests/test.osc b/tests/test.osc index e8da0fc..2cf8665 100644 --- a/tests/test.osc +++ b/tests/test.osc @@ -300,6 +300,11 @@ 0 0 false + + getGlobalSetting('mehrere_mtb_in_mtbepisode') = 'true' + true + + false @@ -545,6 +550,11 @@ 0 0 mandatory + + getGlobalSetting('mehrere_mtb_in_mtbepisode') = 'true' + true + + false