1
0
mirror of https://github.com/pcvolkmer/osc-variant.git synced 2025-04-20 20:26:50 +00:00

feat: allow script code changes in profile form_fields segments

This commit is contained in:
Paul-Christian Volkmer 2024-05-23 14:02:23 +02:00
parent 4b2ede0d80
commit 3ed38ca817
5 changed files with 182 additions and 10 deletions

View File

@ -198,11 +198,14 @@ In ihr sind die durchzuführenden Änderungen definiert. Eine Profildatei hat di
``` ```
forms: forms:
- name: "ExampleForm" - name: "ExampleForm"
form_field: form_fields:
- name: "formularfeld" - name: "formularfeld"
hide: true hide: true
- name: "otherformfield" - name: "otherformfield"
default_value: "T" default_value: "T"
scripts_code: |
// Beispielcode
console.log(getFieldValue('ref_first_mtb'));
form_references: form_references:
- name: "ref_first_mtb" - name: "ref_first_mtb"
referenced_data_form: "Formularverweis.Variante" referenced_data_form: "Formularverweis.Variante"
@ -222,8 +225,8 @@ Hierzu wird die Anwendung angewiesen im Formular "ExampleForm" den Formularverwe
* den Verweis auf das Formular "Formularverweis.Variante" zu setzen * den Verweis auf das Formular "Formularverweis.Variante" zu setzen
* die Anzeige im Auswahlmenü auf "Referenziertes Formular vom: {Datum}" zu setzen * die Anzeige im Auswahlmenü auf "Referenziertes Formular vom: {Datum}" zu setzen
* die Anzeige unterhalb des Auswahlmenüs auf "Datum im referenzierten Formular: {Datum}" zu setzen * die Anzeige unterhalb des Auswahlmenüs auf "Datum im referenzierten Formular: {Datum}" zu setzen
* den Code zur Ausführung "nach Aktualisierung" für das Formularfeld auf die angegebene, mehrzeilige Zeichenkette * den Code zur Ausführung "nach Aktualisierung" für Formularfelder werden auf die angegebene, mehrzeilige Zeichenkette
anzupassen anzupassen. Dies kann in `form_fields`, als auch `form_references` geschehen.
und dabei die vorhandenen Angaben für den Formularverweis zu ersetzen. und dabei die vorhandenen Angaben für den Formularverweis zu ersetzen.

View File

@ -696,6 +696,7 @@ mod tests {
use std::str::FromStr; use std::str::FromStr;
use crate::model::onkostar_editor::OnkostarEditor; use crate::model::onkostar_editor::OnkostarEditor;
use crate::model::Script;
use crate::profile::Profile; use crate::profile::Profile;
#[test] #[test]
@ -822,4 +823,76 @@ mod tests {
_ => panic!("Test failed: MenuCategory not found!"), _ => panic!("Test failed: MenuCategory not found!"),
} }
} }
#[test]
fn should_change_dataform_entry_scripts_code_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
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[2].scripts,
None
);
onkostar_editor.apply_profile(&profile);
assert_eq!(
onkostar_editor.editor.data_form[0].entries.entry[2].scripts,
Some(Script {
code: "// Example code
console.log(42);".into(),
valid: true
})
);
}
#[test]
fn should_change_dataform_entry_scripts_code_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
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[2].scripts,
None
);
onkostar_editor.apply_profile(&profile);
assert_eq!(
onkostar_editor.editor.data_form[0].entries.entry[2].scripts,
Some(Script {
code: "// Example code
console.log(42);".into(),
valid: true
})
);
}
} }

View File

@ -30,7 +30,7 @@ use std::hash::{Hash, Hasher};
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use crate::model::requirements::Requires; use crate::model::requirements::Requires;
use crate::profile::{FormField, FormReference, Profile}; use crate::profile::{FormField, FormReference, Profile, WithScriptsCode};
pub mod data_catalogue; pub mod data_catalogue;
pub mod data_form; pub mod data_form;
@ -40,7 +40,7 @@ pub mod property_catalogue;
pub mod requirements; pub mod requirements;
pub mod unterformular; pub mod unterformular;
#[derive(Serialize, Deserialize, Debug)] #[derive(Serialize, Deserialize, Debug, PartialEq)]
#[serde(deny_unknown_fields)] #[serde(deny_unknown_fields)]
pub struct Script { pub struct Script {
#[serde(rename = "Code")] #[serde(rename = "Code")]
@ -337,12 +337,14 @@ where
if entry.get_name() == form_field.name && form_field.hide { if entry.get_name() == form_field.name && form_field.hide {
entry.hide() entry.hide()
} }
if entry.get_name() == form_field.name { if entry.get_name() == form_field.name {
if let Some(new_default_value) = &form_field.default_value { if let Some(new_default_value) = &form_field.default_value {
entry.update_default_value(new_default_value.to_string()) 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());
}
} }
pub trait FormEntryContainer { pub trait FormEntryContainer {

View File

@ -692,6 +692,7 @@ mod tests {
use std::str::FromStr; use std::str::FromStr;
use crate::model::onkostar_editor::OnkostarEditor; use crate::model::onkostar_editor::OnkostarEditor;
use crate::model::Script;
use crate::profile::Profile; use crate::profile::Profile;
#[test] #[test]
@ -790,4 +791,76 @@ mod tests {
.menu_category .menu_category
.is_none()); .is_none());
} }
#[test]
fn should_change_dataform_entry_scripts_code_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
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[1].scripts,
None
);
onkostar_editor.apply_profile(&profile);
assert_eq!(
onkostar_editor.editor.unterformular[0].entries.entry[1].scripts,
Some(Script {
code: "// Example code
console.log(42);".into(),
valid: true
})
);
}
#[test]
fn should_change_dataform_entry_scripts_code_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
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[1].scripts,
None
);
onkostar_editor.apply_profile(&profile);
assert_eq!(
onkostar_editor.editor.unterformular[0].entries.entry[1].scripts,
Some(Script {
code: "// Example code
console.log(42);".into(),
valid: true
})
);
}
} }

View File

@ -69,6 +69,10 @@ pub struct Form {
pub menu_category: Option<MenuCategory>, pub menu_category: Option<MenuCategory>,
} }
pub trait WithScriptsCode {
fn escaped_scripts_code(&self) -> Option<String>;
}
#[derive(Deserialize)] #[derive(Deserialize)]
pub struct FormReference { pub struct FormReference {
pub name: String, pub name: String,
@ -78,8 +82,8 @@ pub struct FormReference {
scripts_code: Option<String>, scripts_code: Option<String>,
} }
impl FormReference { impl WithScriptsCode for FormReference {
pub fn escaped_scripts_code(&self) -> Option<String> { fn escaped_scripts_code(&self) -> Option<String> {
self.scripts_code.as_ref().map(|code| escape_script(code)) self.scripts_code.as_ref().map(|code| escape_script(code))
} }
} }
@ -90,6 +94,13 @@ pub struct FormField {
#[serde(default)] #[serde(default)]
pub hide: bool, pub hide: bool,
pub default_value: Option<String>, pub default_value: Option<String>,
scripts_code: Option<String>,
}
impl WithScriptsCode for FormField {
fn escaped_scripts_code(&self) -> Option<String> {
self.scripts_code.as_ref().map(|code| escape_script(code))
}
} }
#[derive(Deserialize)] #[derive(Deserialize)]
@ -101,7 +112,7 @@ pub struct MenuCategory {
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
use crate::profile::Profile; use crate::profile::{Profile, WithScriptsCode};
use std::str::FromStr; use std::str::FromStr;
#[test] #[test]
@ -250,17 +261,27 @@ mod tests {
hide: false hide: false
- name: formularfeld_to_hide - name: formularfeld_to_hide
hide: true hide: true
- name: formularfeld_to_mod
scripts_code: |-
// Example code
console.log(42);
"; ";
match Profile::from_str(content) { match Profile::from_str(content) {
Ok(profile) => { Ok(profile) => {
assert_eq!(profile.forms.len(), 1); assert_eq!(profile.forms.len(), 1);
assert_eq!(profile.forms[0].name, "DNPM Therapieplan"); assert_eq!(profile.forms[0].name, "DNPM Therapieplan");
assert_eq!(profile.forms[0].form_fields.len(), 2); assert_eq!(profile.forms[0].form_fields.len(), 3);
assert_eq!(profile.forms[0].form_fields[0].name, "formularfeld_to_keep"); assert_eq!(profile.forms[0].form_fields[0].name, "formularfeld_to_keep");
assert!(!profile.forms[0].form_fields[0].hide); assert!(!profile.forms[0].form_fields[0].hide);
assert_eq!(profile.forms[0].form_fields[1].name, "formularfeld_to_hide"); assert_eq!(profile.forms[0].form_fields[1].name, "formularfeld_to_hide");
assert!(profile.forms[0].form_fields[1].hide); 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_eq!(
profile.forms[0].form_fields[2].escaped_scripts_code(),
Some("// Example code&#10;console.log(42);".to_string())
);
} }
Err(e) => panic!("Cannot deserialize profile: {}", e), Err(e) => panic!("Cannot deserialize profile: {}", e),
} }