From 2ee87fbdd7ebdbda6b90eb77d0ec56c33b54018b Mon Sep 17 00:00:00 2001 From: Priec Date: Sun, 21 Jun 2026 20:38:28 +0200 Subject: [PATCH] category creation fixed now --- assets/i18n/en/main.ftl | 2 ++ assets/i18n/sk/main.ftl | 2 ++ assets/views/admin/catalog/category_form.html | 24 ++++++++--------- assets/views/admin/catalog/product_form.html | 9 ++----- src/controllers/admin_categories.rs | 26 ++++++++++++++++--- 5 files changed, 39 insertions(+), 24 deletions(-) diff --git a/assets/i18n/en/main.ftl b/assets/i18n/en/main.ftl index 9d4b070..a9f42cf 100644 --- a/assets/i18n/en/main.ftl +++ b/assets/i18n/en/main.ftl @@ -217,6 +217,8 @@ image = Image slug = URL slug slug-auto = generated automatically position = Position +position-auto = added to the end +position-hint = Sort order in the menu (lowest first). Leave blank to add it last. parent-category = Parent category no-parent = — None (top level) — quantity = Quantity diff --git a/assets/i18n/sk/main.ftl b/assets/i18n/sk/main.ftl index 164ecdf..20500c8 100644 --- a/assets/i18n/sk/main.ftl +++ b/assets/i18n/sk/main.ftl @@ -217,6 +217,8 @@ image = Obrázok slug = URL adresa slug-auto = vygeneruje sa automaticky position = Poradie +position-auto = pridá sa na koniec +position-hint = Poradie v menu (najnižšie ako prvé). Nechajte prázdne a pridá sa na koniec. parent-category = Nadradená kategória no-parent = — Žiadna (najvyššia úroveň) — quantity = Množstvo diff --git a/assets/views/admin/catalog/category_form.html b/assets/views/admin/catalog/category_form.html index abcfe45..c7804c0 100644 --- a/assets/views/admin/catalog/category_form.html +++ b/assets/views/admin/catalog/category_form.html @@ -18,9 +18,9 @@ {{ ui::csrf_field() }} {% if category %} - {% set v_name = category.name %}{% set v_slug = category.slug %}{% set v_pos = category.position %}{% set v_desc = category.description | default(value="") %}{% set v_pub = category.published %} + {% set v_name = category.name %}{% set v_pos = category.position %}{% set v_desc = category.description | default(value="") %}{% set v_pub = category.published %} {% else %} - {% set v_name = "" %}{% set v_slug = "" %}{% set v_pos = 0 %}{% set v_desc = "" %}{% set v_pub = false %} + {% set v_name = "" %}{% set v_pos = "" %}{% set v_desc = "" %}{% set v_pub = false %} {% endif %}
@@ -28,17 +28,6 @@ {{ ui::input(name="name", id="name", required=true, value=v_name) }}
-
-
- - {{ ui::input(name="slug", id="slug", value=v_slug, placeholder=t(key='slug-auto', lang=lang | default(value='sk'))) }} -
-
- - {{ ui::input(name="position", id="position", type="number", value=v_pos) }} -
-
-
@@ -68,6 +57,15 @@ {{ ui::file_input(name="image", id="image", accept="image/*") }}
+
+ + {{ ui::input(name="position", id="position", type="number", value=v_pos, placeholder=t(key='position-auto', lang=lang | default(value='sk'))) }} +

{{ t(key="position-hint", lang=lang | default(value='sk')) }}

+
+ {{ ui::checkbox(name="published", id="published", label=t(key="published", lang=lang | default(value='sk')), checked=v_pub) }}
diff --git a/assets/views/admin/catalog/product_form.html b/assets/views/admin/catalog/product_form.html index e4da665..d48dacd 100644 --- a/assets/views/admin/catalog/product_form.html +++ b/assets/views/admin/catalog/product_form.html @@ -18,9 +18,9 @@ {{ ui::csrf_field() }} {% if product %} - {% set v_name = product.name %}{% set v_price = product.price %}{% set v_currency = product.currency %}{% set v_stock = product.stock %}{% set v_sku = product.sku | default(value="") %}{% set v_slug = product.slug %}{% set v_desc = product.description | default(value="") %}{% set v_pub = product.published %} + {% set v_name = product.name %}{% set v_price = product.price %}{% set v_currency = product.currency %}{% set v_stock = product.stock %}{% set v_sku = product.sku | default(value="") %}{% set v_desc = product.description | default(value="") %}{% set v_pub = product.published %} {% else %} - {% set v_name = "" %}{% set v_price = "" %}{% set v_currency = "EUR" %}{% set v_stock = 0 %}{% set v_sku = "" %}{% set v_slug = "" %}{% set v_desc = "" %}{% set v_pub = false %} + {% set v_name = "" %}{% set v_price = "" %}{% set v_currency = "EUR" %}{% set v_stock = 0 %}{% set v_sku = "" %}{% set v_desc = "" %}{% set v_pub = false %} {% endif %}
@@ -64,11 +64,6 @@
-
- - {{ ui::input(name="slug", id="slug", value=v_slug, placeholder=t(key='slug-auto', lang=lang | default(value='sk'))) }} -
-
{{ ui::textarea(name="description", id="description", rows="5", value=v_desc) }} diff --git a/src/controllers/admin_categories.rs b/src/controllers/admin_categories.rs index 8d11121..d2b5286 100644 --- a/src/controllers/admin_categories.rs +++ b/src/controllers/admin_categories.rs @@ -49,10 +49,6 @@ async fn parse_category_fields( .text("name") .ok_or_else(|| Error::BadRequest("category name is required".to_string()))?; let description = form.text("description"); - let position = form - .text("position") - .and_then(|s| s.parse::().ok()) - .unwrap_or(0); let published = form.checked("published"); // Resolve the chosen parent, rejecting cycles: a category may not be its @@ -81,6 +77,28 @@ async fn parse_category_fields( None => None, }; + // Position is optional: an explicit value sorts the category among its + // siblings, but a blank field appends it to the end of its parent's group + // (one past the current max), so new categories land last instead of first. + let position = match form.text("position").and_then(|s| s.parse::().ok()) { + Some(explicit) => explicit, + None => { + let mut query = categories::Entity::find(); + query = match parent_id { + Some(pid) => query.filter(categories::Column::ParentId.eq(pid)), + None => query.filter(categories::Column::ParentId.is_null()), + }; + query + .all(&ctx.db) + .await? + .iter() + .filter(|c| Some(c.id) != current_id) + .map(|c| c.position) + .max() + .map_or(0, |max| max + 1) + } + }; + let desired = form .text("slug") .map(|s| slugify(&s))