diff --git a/crates/bds-core/src/engine/meta.rs b/crates/bds-core/src/engine/meta.rs index ec685c2..ad722e6 100644 --- a/crates/bds-core/src/engine/meta.rs +++ b/crates/bds-core/src/engine/meta.rs @@ -174,6 +174,7 @@ pub fn add_category(data_dir: &Path, category: &str) -> EngineResult<()> { meta.insert( category.to_string(), CategorySettings { + title: None, render_in_lists: true, show_title: true, post_template_slug: None, @@ -318,6 +319,7 @@ mod tests { meta.insert( "article".to_string(), CategorySettings { + title: None, render_in_lists: true, show_title: true, post_template_slug: None, @@ -330,6 +332,33 @@ mod tests { assert!(read["article"].render_in_lists); } + #[test] + fn category_meta_json_preserves_bds2_title() { + let dir = setup(); + let mut meta = HashMap::new(); + meta.insert( + "news".to_string(), + CategorySettings { + title: Some("News Archive".to_string()), + render_in_lists: false, + show_title: true, + post_template_slug: Some("article".to_string()), + list_template_slug: Some("listing".to_string()), + }, + ); + + write_category_meta_json(dir.path(), &meta).unwrap(); + + let content = std::fs::read_to_string(dir.path().join("meta/category-meta.json")).unwrap(); + let json: serde_json::Value = serde_json::from_str(&content).unwrap(); + assert_eq!(json["news"]["title"], "News Archive"); + assert_eq!(json["news"]["renderInLists"], false); + assert_eq!(json["news"]["showTitle"], true); + + let read = read_category_meta_json(dir.path()).unwrap(); + assert_eq!(read["news"].title.as_deref(), Some("News Archive")); + } + // ── publishing.json ───────────────────────────────────────────── #[test] @@ -407,6 +436,7 @@ mod tests { meta.insert( "article".to_string(), CategorySettings { + title: None, render_in_lists: true, show_title: true, post_template_slug: None, diff --git a/crates/bds-core/src/engine/preview.rs b/crates/bds-core/src/engine/preview.rs index 7e4355f..1ed5ebb 100644 --- a/crates/bds-core/src/engine/preview.rs +++ b/crates/bds-core/src/engine/preview.rs @@ -1530,6 +1530,7 @@ mod tests { ( "hidden".to_string(), crate::model::CategorySettings { + title: None, render_in_lists: false, show_title: true, post_template_slug: None, @@ -1539,6 +1540,7 @@ mod tests { ( "featured".to_string(), crate::model::CategorySettings { + title: None, render_in_lists: true, show_title: false, post_template_slug: None, diff --git a/crates/bds-core/src/model/metadata.rs b/crates/bds-core/src/model/metadata.rs index 20dd525..da41dbc 100644 --- a/crates/bds-core/src/model/metadata.rs +++ b/crates/bds-core/src/model/metadata.rs @@ -97,6 +97,8 @@ impl ProjectMetadata { #[derive(Debug, Clone, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct CategorySettings { + #[serde(skip_serializing_if = "Option::is_none")] + pub title: Option, #[serde(default = "default_true")] pub render_in_lists: bool, #[serde(default = "default_true")] @@ -167,12 +169,14 @@ mod tests { #[test] fn category_settings_camel_case() { let settings = CategorySettings { + title: Some("Article".into()), render_in_lists: false, show_title: true, post_template_slug: Some("article-tpl".into()), list_template_slug: None, }; let json = serde_json::to_string(&settings).unwrap(); + assert!(json.contains("title")); assert!(json.contains("renderInLists")); assert!(json.contains("showTitle")); assert!(json.contains("postTemplateSlug")); diff --git a/crates/bds-core/tests/m4_generation_engine.rs b/crates/bds-core/tests/m4_generation_engine.rs index 93caa40..5aaf011 100644 --- a/crates/bds-core/tests/m4_generation_engine.rs +++ b/crates/bds-core/tests/m4_generation_engine.rs @@ -619,6 +619,7 @@ fn generation_respects_category_list_settings_and_writes_bundled_images() { ( "hidden".to_string(), CategorySettings { + title: None, render_in_lists: false, show_title: true, post_template_slug: None, @@ -628,6 +629,7 @@ fn generation_respects_category_list_settings_and_writes_bundled_images() { ( "featured".to_string(), CategorySettings { + title: None, render_in_lists: true, show_title: false, post_template_slug: None, diff --git a/crates/bds-ui/src/app.rs b/crates/bds-ui/src/app.rs index 89153ba..5e1d54b 100644 --- a/crates/bds-ui/src/app.rs +++ b/crates/bds-ui/src/app.rs @@ -7110,7 +7110,9 @@ impl BdsApp { .map(|name| { let meta = category_meta.get(&name); SettingsCategoryRow { - title: name.clone(), + title: meta + .and_then(|value| value.title.clone()) + .unwrap_or_else(|| name.clone()), render_in_lists: meta.map(|value| value.render_in_lists).unwrap_or(true), show_title: meta.map(|value| value.show_title).unwrap_or(true), post_template_slug: meta @@ -7781,6 +7783,7 @@ impl BdsApp { category_meta.insert( row.name.clone(), bds_core::model::metadata::CategorySettings { + title: Some(row.title.clone()).filter(|title| !title.trim().is_empty()), render_in_lists: row.render_in_lists, show_title: row.show_title, post_template_slug: (!row.post_template_slug.is_empty()) @@ -7822,6 +7825,8 @@ impl BdsApp { ( row.name, bds_core::model::metadata::CategorySettings { + title: Some(row.title.clone()) + .filter(|title| !title.trim().is_empty()), render_in_lists: row.render_in_lists, show_title: row.show_title, post_template_slug: None,