diff --git a/Cargo.lock b/Cargo.lock index c5af46c..ed17edf 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1233,6 +1233,7 @@ checksum = "4fb1fa934250de4de8aef298d81c729a7d33d8c239daa3a7575e6b92bfc7313b" dependencies = [ "autocfg", "hashbrown", + "serde", ] [[package]] @@ -2732,6 +2733,7 @@ dependencies = [ "clap", "heck", "include_dir", + "indexmap", "itertools", "json_dotpath", "log", diff --git a/yopa-web/Cargo.toml b/yopa-web/Cargo.toml index b477468..31a7030 100644 --- a/yopa-web/Cargo.toml +++ b/yopa-web/Cargo.toml @@ -28,6 +28,7 @@ anyhow = "1.0.38" thiserror = "1.0.24" clap = "2" serde_with = "1.6.4" +indexmap = { version = "1.6.1", features = ["serde-1"] } tokio = { version="0.2.6", features=["full"] } diff --git a/yopa-web/resources/src/components/EditObjectForm.vue b/yopa-web/resources/src/components/EditObjectForm.vue index b1d539f..f8bfc2c 100644 --- a/yopa-web/resources/src/components/EditObjectForm.vue +++ b/yopa-web/resources/src/components/EditObjectForm.vue @@ -14,9 +14,6 @@ export default { let properties = this.schema.prop_models.filter((m) => m.object === model.id); let relations = this.schema.rel_models.filter((m) => m.object === model.id); - properties.sort((a, b) => a.name.localeCompare(b.name)); - relations.sort((a, b) => a.name.localeCompare(b.name)); - let values = {}; properties.forEach((p) => { let existing = object.values[p.id] || []; @@ -38,8 +35,8 @@ export default { } }); - properties = keyBy(properties, 'id'); - relations = keyBy(relations, 'id'); + let propertiesById = keyBy(properties, 'id'); + let relationsById = keyBy(relations, 'id'); let model_names = {}; this.schema.obj_models.forEach((m) => { @@ -49,7 +46,9 @@ export default { return { model, properties, + propertiesById, relations, + relationsById, haveRelations: !isEmpty(relations), model_names, values, @@ -67,7 +66,7 @@ export default { let values = []; forEach(objCopy(this.values), (vv, prop_model_id) => { for (let v of vv) { - if (isEqual(v.value, {"String": ""}) && this.properties[prop_model_id].optional) { + if (isEqual(v.value, {"String": ""}) && this.propertiesById[prop_model_id].optional) { continue; } @@ -148,7 +147,7 @@ export default {
The related object cannot be changed. Create a new relation if needed.
diff --git a/yopa-web/src/main.rs b/yopa-web/src/main.rs index 3d279e9..8a93bed 100644 --- a/yopa-web/src/main.rs +++ b/yopa-web/src/main.rs @@ -4,6 +4,8 @@ extern crate actix_web; extern crate log; #[macro_use] extern crate thiserror; +#[macro_use] +extern crate serde_json; use std::collections::HashMap; use std::ops::Deref; diff --git a/yopa-web/src/routes/models.rs b/yopa-web/src/routes/models.rs index 7340e46..9655a03 100644 --- a/yopa-web/src/routes/models.rs +++ b/yopa-web/src/routes/models.rs @@ -5,6 +5,7 @@ use crate::tera_ext::TeraExt; use crate::TERA; use actix_session::Session; use actix_web::Responder; +use yopa::model::{PropertyModel, RelationModel, ObjectModel}; pub(crate) mod object; pub(crate) mod property; @@ -32,7 +33,7 @@ pub(crate) async fn list( .into_iter() .map(|rm| { let mut rprops = model_props.get(&rm.id).cloned().unwrap_or_default(); - rprops.sort_by_key(|m| &m.name); + rprops.sort_by(PropertyModel::order_refs); RelationModelDisplay { model: rm, @@ -41,7 +42,7 @@ pub(crate) async fn list( } }) .collect::