parent
4e97f7a19a
commit
8b87fd0079
@ -0,0 +1,64 @@ |
|||||||
|
{% extends "_layout" %} |
||||||
|
|
||||||
|
{% block title -%} |
||||||
|
Index |
||||||
|
{%- endblock %} |
||||||
|
|
||||||
|
{% block nav -%} |
||||||
|
<a href="/">Home</a> |
||||||
|
{%- endblock %} |
||||||
|
|
||||||
|
{% block content -%} |
||||||
|
|
||||||
|
<h1>Welcome to tera on actix</h1> |
||||||
|
|
||||||
|
<a href="/model/object/create">New model</a> |
||||||
|
|
||||||
|
<h2>Defined models:</h2> |
||||||
|
|
||||||
|
<ul> |
||||||
|
{% for model in models %} |
||||||
|
<li> |
||||||
|
<b>{{model.name}}</b><br> |
||||||
|
|
||||||
|
{# |
||||||
|
|
||||||
|
{% if !model.properties.is_empty() %} |
||||||
|
Properties: |
||||||
|
<ul> |
||||||
|
{% for prop in model.properties %} |
||||||
|
<li>{{prop.name}}, {{prop.data_type}}, def: {{prop.default}}, opt: {{prop.optional}}, mult: {{prop.multiple}}</li> |
||||||
|
{% endfor %} |
||||||
|
</ul> |
||||||
|
{% endif %} |
||||||
|
|
||||||
|
<a href="/model/property/create/{{model.id}}">New property</a> |
||||||
|
|
||||||
|
{% if !model.relations.is_empty() %} |
||||||
|
Relations: |
||||||
|
<ul> |
||||||
|
{% for rel in model.relations %} |
||||||
|
<li> |
||||||
|
{{rel.name}} -> {{rel.related_name}} |
||||||
|
|
||||||
|
{% if !rel.properties.is_empty() %} |
||||||
|
Properties: |
||||||
|
<ul> |
||||||
|
{% for prop in rel.properties %} |
||||||
|
<li>{{prop.name}}, {{prop.data_type}}, def: {{prop.default}}, opt: {{prop.optional}}, mult: {{prop.multiple}}</li> |
||||||
|
{% endfor %} |
||||||
|
</ul> |
||||||
|
{% endif %} |
||||||
|
</li> |
||||||
|
{% endfor %} |
||||||
|
</ul> |
||||||
|
{% endif %} |
||||||
|
|
||||||
|
<a href="/model/relation/create/{{model.id}}">New relation</a> |
||||||
|
|
||||||
|
#} |
||||||
|
</li> |
||||||
|
{% endfor %} |
||||||
|
</ul> |
||||||
|
|
||||||
|
{%- endblock %} |
@ -0,0 +1,30 @@ |
|||||||
|
{% extends "_layout" %} |
||||||
|
|
||||||
|
{% block title -%} |
||||||
|
Define object |
||||||
|
{%- endblock %} |
||||||
|
|
||||||
|
{% block nav -%} |
||||||
|
<a href="/">Home</a> |
||||||
|
{%- endblock %} |
||||||
|
|
||||||
|
{% block content -%} |
||||||
|
|
||||||
|
<h1>Define new object model</h1> |
||||||
|
|
||||||
|
<form action="/model/object/create" method="POST"> |
||||||
|
<label for="parent">Parent:</label> |
||||||
|
<select name="parent" id="parent"> |
||||||
|
<option value="">No parent</option> |
||||||
|
{%- for model in all_models %} |
||||||
|
<option value="{{model.id}}">{{model.name}}</option> |
||||||
|
{%- endfor %} |
||||||
|
</select><br> |
||||||
|
|
||||||
|
<label for="name">Name:</label> |
||||||
|
<input type="text" id="name" name="name"><br> |
||||||
|
|
||||||
|
<input type="submit" value="Save"> |
||||||
|
</form> |
||||||
|
|
||||||
|
{%- endblock %} |
@ -0,0 +1,42 @@ |
|||||||
|
{% extends "_layout" %} |
||||||
|
|
||||||
|
{% block title -%} |
||||||
|
Define property |
||||||
|
{%- endblock %} |
||||||
|
|
||||||
|
{% block nav -%} |
||||||
|
<a href="/">Home</a> |
||||||
|
{%- endblock %} |
||||||
|
|
||||||
|
{% block content -%} |
||||||
|
|
||||||
|
<h1>Add new property to model "{{model.name}}"</h1> |
||||||
|
|
||||||
|
<form action="/model/property/create" method="POST"> |
||||||
|
<input type="hidden" name="object" value="{{object}}"> |
||||||
|
|
||||||
|
<label for="name">Name:</label> |
||||||
|
<input type="text" id="name" name="name"><br> |
||||||
|
|
||||||
|
<label for="optional">Optional:</label> |
||||||
|
<input type="checkbox" name="optional" id="optional"> |
||||||
|
<br> |
||||||
|
|
||||||
|
<label for="multiple">Multiple:</label> |
||||||
|
<input type="checkbox" name="multiple" id="multiple"><br> |
||||||
|
|
||||||
|
<label for="data_type">Type:</label> |
||||||
|
<select name="data_type" id="data_type"> |
||||||
|
<option value="String" selected>String</option> |
||||||
|
<option value="Integer">Integer</option> |
||||||
|
<option value="Decimal">Decimal</option> |
||||||
|
<option value="Boolean">Boolean</option> |
||||||
|
</select><br> |
||||||
|
|
||||||
|
<label for="default">Default:</label> |
||||||
|
<input type="text" id="default" name="default"><br> |
||||||
|
|
||||||
|
<input type="submit" value="Save"> |
||||||
|
</form> |
||||||
|
|
||||||
|
{%- endblock %} |
@ -0,0 +1,68 @@ |
|||||||
|
use actix_web::{web, HttpRequest, Responder}; |
||||||
|
use crate::TERA; |
||||||
|
use crate::tera_ext::TeraExt; |
||||||
|
use yopa::Storage; |
||||||
|
use serde::Serialize; |
||||||
|
use yopa::model::{PropertyModel, RelationModel}; |
||||||
|
|
||||||
|
#[derive(Serialize, Debug)] |
||||||
|
struct ObjectModelDisplay<'a> { |
||||||
|
id : yopa::ID, |
||||||
|
name : &'a str, |
||||||
|
properties: Vec<&'a PropertyModel>, |
||||||
|
relations: Vec<RelationModelDisplay<'a>>, |
||||||
|
} |
||||||
|
|
||||||
|
#[derive(Serialize, Debug)] |
||||||
|
struct RelationModelDisplay<'a> { |
||||||
|
model : &'a RelationModel, |
||||||
|
related_name : &'a str, |
||||||
|
properties: Vec<&'a PropertyModel>, |
||||||
|
} |
||||||
|
|
||||||
|
#[get("/")] |
||||||
|
pub(crate) async fn index(req: HttpRequest, store : crate::YopaStoreWrapper) -> actix_web::Result<impl Responder> { |
||||||
|
|
||||||
|
let rg = store.read().await; |
||||||
|
|
||||||
|
let models_iter = rg.get_object_models(); |
||||||
|
|
||||||
|
// object and relation props
|
||||||
|
let mut model_props = rg.get_grouped_prop_models(); |
||||||
|
|
||||||
|
let mut model_relations = rg.get_grouped_relation_models(); |
||||||
|
|
||||||
|
let mut models = vec![]; |
||||||
|
for om in models_iter { |
||||||
|
let mut oprops = model_props.remove(&om.id).unwrap_or_default(); |
||||||
|
let mut relations = model_relations.remove(&om.id).unwrap_or_default(); |
||||||
|
|
||||||
|
let rel_displays = relations.into_iter().map(|rm| { |
||||||
|
let mut rprops = model_props.remove(&rm.id).unwrap_or_default(); |
||||||
|
rprops.sort_by_key(|m| &m.name); |
||||||
|
|
||||||
|
RelationModelDisplay { |
||||||
|
model: rm, |
||||||
|
related_name: rg.get_model_name(rm.related), |
||||||
|
properties: rprops |
||||||
|
} |
||||||
|
|
||||||
|
}).collect::<Vec<_>>(); |
||||||
|
|
||||||
|
oprops.sort_by_key(|m| &m.name); |
||||||
|
|
||||||
|
models.push(ObjectModelDisplay { |
||||||
|
id: om.id, |
||||||
|
name: &om.name, |
||||||
|
properties: oprops, |
||||||
|
relations: rel_displays, |
||||||
|
}) |
||||||
|
} |
||||||
|
|
||||||
|
models.sort_by_key(|m| m.name); |
||||||
|
|
||||||
|
let mut ctx = tera::Context::new(); |
||||||
|
ctx.insert("models", &models); |
||||||
|
|
||||||
|
TERA.build_response("index", &ctx) |
||||||
|
} |
Loading…
Reference in new issue