add index page with a cards list

This commit is contained in:
2019-12-30 09:02:08 +01:00
parent 8e5185f643
commit ed65215723
8 changed files with 199 additions and 67 deletions
+57 -19
View File
@@ -3,7 +3,7 @@
#[macro_use] extern crate rocket;
#[macro_use] extern crate serde;
use serde_json::json;
use serde_json::{json, Value};
//use rocket::request::FromSegments;
//use rocket::http::uri::Segments;
@@ -21,37 +21,72 @@ use std::collections::HashMap;
use std::env;
use crate::store::form::RenderedField;
#[derive(Serialize)]
struct FormContext<'a> {
fn render_empty_fields<'a>(store : &'a Store) -> Vec<RenderedField<'a>> {
let indexes = &store.index;
store.model.fields.iter().map(|(key, field)| {
RenderedField::from_template_field(key, field, None, indexes)
}).collect()
}
#[derive(Serialize,Debug)]
struct RenderedCard<'a> {
pub fields : Vec<RenderedField<'a>>,
pub id : usize,
}
fn render_card_fields<'a>(store : &'a Store, values : &'a serde_json::Map<String, Value>) -> Vec<RenderedField<'a>> {
let indexes = &store.index;
store.model.fields.iter().map(|(key, field)| {
RenderedField::from_template_field(key, field, values.get(key), indexes)
}).collect()
}
#[derive(Serialize,Debug)]
struct ListContext<'a> {
pub fields : Vec<RenderedField<'a>>,
pub cards : Vec<RenderedCard<'a>>,
}
#[get("/")]
fn index(store : State<RwLock<Store>>) -> Template {
let rg = store.read();
let tags = json!(["foo", "bar"]);
let indexes = &rg.index;
let context = FormContext {
fields: rg.model.fields.iter().map(|(key, field)| {
let value = if key == "tags" {
Some(&tags)
let context = ListContext {
fields: render_empty_fields(&rg),
cards: rg.items.iter().filter_map(|(id, card)| {
if let Value::Object(map) = card {
Some(RenderedCard {
fields: render_card_fields(&rg, map),
id: *id,
})
} else {
None
};
RenderedField::from_template_field(key, field, value, indexes)
}).collect()
}
}).collect(),
};
Template::render("index", context)
}
//#[post("/add", data="<record>")]
//fn add_part(store : State<RwLock<Store>>, record : Form<store::Part>) -> Redirect {
// store.write().add(record.into_inner());
// Redirect::to(uri!(index))
//}
#[derive(Serialize)]
struct AddCardContext<'a> {
pub fields : Vec<RenderedField<'a>>,
}
#[get("/add")]
fn add(store : State<RwLock<Store>>) -> Template {
let rg = store.read();
let context = AddCardContext {
fields: render_empty_fields(&rg)
};
Template::render("add", context)
}
fn main() {
let cwd = env::current_dir().unwrap();
@@ -62,5 +97,8 @@ fn main() {
.attach(Template::fairing())
.manage(RwLock::new(store))
.mount("/", StaticFiles::from(cwd.join("templates/static/")))
.mount("/", routes![index]).launch();
.mount("/", routes![
index,
add,
]).launch();
}
+2
View File
@@ -102,6 +102,8 @@ impl<'a> RenderedField<'a> {
if let Some(Value::String(s)) = value {
rendered.value = Cow::Borrowed(&s.as_str());
} else if let Some(def) = default {
rendered.value = def.to_owned().into();
}
}
FieldKind::FreeEnum { enum_group } => {