improve form and add taggle
This commit is contained in:
+43
-5
@@ -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
@@ -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
@@ -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)]
|
||||
|
||||
Reference in New Issue
Block a user