improve form and add taggle

This commit is contained in:
2019-12-30 00:23:46 +01:00
parent 01d740e55c
commit 23931b1620
12 changed files with 402 additions and 135 deletions
+43 -5
View File
@@ -18,6 +18,8 @@ pub struct RenderedField<'a> {
pub step: &'static str,
pub min: String,
pub max: String,
pub all_tags_json: String,
pub tags_json: String,
pub options: Option<&'a Vec<String>>,
pub value: Cow<'a, str>,
pub checked: bool,
@@ -33,7 +35,7 @@ impl<'a> RenderedField<'a> {
let mut rendered = RenderedField::default();
rendered.key = key.as_str().into();
rendered.label = if field.label.is_empty() {
rendered.key.clone()
titlecase::titlecase(&key.replace('_', " ")).into()
} else {
field.label.as_str().into()
};
@@ -105,20 +107,56 @@ impl<'a> RenderedField<'a> {
FieldKind::Enum { options, default } => {
rendered.kind = "select";
rendered.options = Some(options);
if let Some(Value::String(s)) = value {
rendered.value = Cow::Borrowed(&s.as_str());
}
}
FieldKind::FreeEnum { enum_group } => {
rendered.kind = "free_select";
let group = enum_group.as_ref().unwrap_or(key);
rendered.options = Some(index.free_enums.get(group).unwrap_or(&EMPTY_VEC))
let options = index.free_enums.get(group).unwrap_or(&EMPTY_VEC);
rendered.options = Some(options);
if let Some(Value::String(s)) = value {
rendered.value = Cow::Borrowed(&s.as_str());
}
}
FieldKind::Tags { options } => {
rendered.kind = "select";
rendered.kind = "tags";
rendered.options = Some(options);
if value.is_some() {
rendered.value = serde_json::from_value::<Vec<String>>(value.unwrap().clone())
.unwrap().join(" ").into();
}
if let Some(Value::Array(items)) = value {
rendered.tags_json = serde_json::to_string(items).unwrap();
} else {
rendered.tags_json = "[]".into();
};
rendered.all_tags_json = serde_json::to_string(options).unwrap();
}
FieldKind::FreeTags { tag_group } => {
rendered.kind = "free_select";
rendered.kind = "free_tags";
let group = tag_group.as_ref().unwrap_or(key);
rendered.options = Some(index.free_tags.get(group).unwrap_or(&EMPTY_VEC))
let options = index.free_tags.get(group).unwrap_or(&EMPTY_VEC);
if value.is_some() {
rendered.value = serde_json::from_value::<Vec<String>>(value.unwrap().clone())
.unwrap().join(" ").into();
}
if let Some(Value::Array(items)) = value {
rendered.tags_json = serde_json::to_string(items).unwrap();
} else {
rendered.tags_json = "[]".into();
};
rendered.options = Some(options);
rendered.tags_json = serde_json::to_string(options).unwrap();
}
}
+1 -1
View File
@@ -25,7 +25,7 @@ pub struct Indexes {
}
/// Struct loaded from the repositroy config file
#[derive(Serialize,Deserialize,Debug)]
#[derive(Deserialize,Debug)]
struct RepositoryConfig {
pub model : Model,
}
+4 -3
View File
@@ -1,15 +1,16 @@
use std::collections::HashMap;
use indexmap::map::IndexMap;
/// A data card's model.
/// Cards of one model can be sorted, searched and filtered by their fields.
#[derive(Serialize, Deserialize, Debug)]
#[derive(Deserialize, Debug)]
pub struct Model {
/// Fields defined by this model
pub fields: HashMap<String, Field>,
pub fields: IndexMap<String, Field>,
}
/// One field of a model
#[derive(Serialize, Deserialize, Debug)]
#[derive(Deserialize, Debug)]
pub struct Field {
/// Field label shown in the user interface
#[serde(default)]