feat(roles): add admin store roles page, permission i18n, and menu integration
Some checks failed
CI / ruff (push) Successful in 9s
CI / validate (push) Has been cancelled
CI / dependency-scanning (push) Has been cancelled
CI / docs (push) Has been cancelled
CI / deploy (push) Has been cancelled
CI / pytest (push) Has started running

- Add admin store roles page with merchant→store cascading for superadmin
  and store-only selection for platform admin
- Add permission catalog API with translated labels/descriptions (en/fr/de/lb)
- Add permission translations to all 15 module locale files (60 files total)
- Add info icon tooltips for permission descriptions in role editor
- Add store roles menu item and admin menu item in module definition
- Fix store-selector.js URL construction bug when apiEndpoint has query params
- Add admin store roles API (CRUD + platform scoping)
- Add integration tests for admin store roles and permission catalog

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-02-26 23:31:27 +01:00
parent 2b55e7458b
commit f95db7c0b1
83 changed files with 3491 additions and 513 deletions

View File

@@ -1,42 +1,48 @@
{
"title": "Warenkorb",
"description": "Warenkorbverwaltung für Kunden",
"cart": {
"title": "Ihr Warenkorb",
"empty": "Ihr Warenkorb ist leer",
"empty_subtitle": "Fügen Sie Artikel hinzu, um einzukaufen",
"continue_shopping": "Weiter einkaufen",
"proceed_to_checkout": "Zur Kasse"
},
"item": {
"product": "Produkt",
"quantity": "Menge",
"price": "Preis",
"total": "Gesamt",
"remove": "Entfernen",
"update": "Aktualisieren"
},
"summary": {
"title": "Bestellübersicht",
"subtotal": "Zwischensumme",
"shipping": "Versand",
"estimated_shipping": "Wird an der Kasse berechnet",
"tax": "MwSt.",
"total": "Gesamtsumme"
},
"validation": {
"invalid_quantity": "Ungültige Menge",
"min_quantity": "Mindestmenge ist {min}",
"max_quantity": "Höchstmenge ist {max}",
"insufficient_inventory": "Nur {available} verfügbar"
},
"messages": {
"item_added": "Artikel zum Warenkorb hinzugefügt",
"item_updated": "Warenkorb aktualisiert",
"item_removed": "Artikel aus dem Warenkorb entfernt",
"cart_cleared": "Warenkorb geleert",
"product_not_available": "Produkt nicht verfügbar",
"error_adding": "Fehler beim Hinzufügen zum Warenkorb",
"error_updating": "Fehler beim Aktualisieren des Warenkorbs"
}
"title": "Warenkorb",
"description": "Warenkorbverwaltung für Kunden",
"cart": {
"title": "Ihr Warenkorb",
"empty": "Ihr Warenkorb ist leer",
"empty_subtitle": "Fügen Sie Artikel hinzu, um einzukaufen",
"continue_shopping": "Weiter einkaufen",
"proceed_to_checkout": "Zur Kasse"
},
"item": {
"product": "Produkt",
"quantity": "Menge",
"price": "Preis",
"total": "Gesamt",
"remove": "Entfernen",
"update": "Aktualisieren"
},
"summary": {
"title": "Bestellübersicht",
"subtotal": "Zwischensumme",
"shipping": "Versand",
"estimated_shipping": "Wird an der Kasse berechnet",
"tax": "MwSt.",
"total": "Gesamtsumme"
},
"validation": {
"invalid_quantity": "Ungültige Menge",
"min_quantity": "Mindestmenge ist {min}",
"max_quantity": "Höchstmenge ist {max}",
"insufficient_inventory": "Nur {available} verfügbar"
},
"messages": {
"item_added": "Artikel zum Warenkorb hinzugefügt",
"item_updated": "Warenkorb aktualisiert",
"item_removed": "Artikel aus dem Warenkorb entfernt",
"cart_cleared": "Warenkorb geleert",
"product_not_available": "Produkt nicht verfügbar",
"error_adding": "Fehler beim Hinzufügen zum Warenkorb",
"error_updating": "Fehler beim Aktualisieren des Warenkorbs"
},
"permissions": {
"view": "Warenkörbe anzeigen",
"view_desc": "Warenkörbe der Kunden anzeigen",
"manage": "Warenkörbe verwalten",
"manage_desc": "Warenkörbe der Kunden bearbeiten und verwalten"
}
}

View File

@@ -30,6 +30,12 @@
"max_quantity": "Maximum quantity is {max}",
"insufficient_inventory": "Only {available} available"
},
"permissions": {
"view": "View Carts",
"view_desc": "View customer shopping carts",
"manage": "Manage Carts",
"manage_desc": "Modify and manage customer carts"
},
"messages": {
"item_added": "Item added to cart",
"item_updated": "Cart updated",

View File

@@ -1,42 +1,48 @@
{
"title": "Panier",
"description": "Gestion du panier pour les clients",
"cart": {
"title": "Votre panier",
"empty": "Votre panier est vide",
"empty_subtitle": "Ajoutez des articles pour commencer vos achats",
"continue_shopping": "Continuer mes achats",
"proceed_to_checkout": "Passer à la caisse"
},
"item": {
"product": "Produit",
"quantity": "Quantité",
"price": "Prix",
"total": "Total",
"remove": "Supprimer",
"update": "Mettre à jour"
},
"summary": {
"title": "Récapitulatif de commande",
"subtotal": "Sous-total",
"shipping": "Livraison",
"estimated_shipping": "Calculé à la caisse",
"tax": "TVA",
"total": "Total"
},
"validation": {
"invalid_quantity": "Quantité invalide",
"min_quantity": "Quantité minimum: {min}",
"max_quantity": "Quantité maximum: {max}",
"insufficient_inventory": "Seulement {available} disponible(s)"
},
"messages": {
"item_added": "Article ajouté au panier",
"item_updated": "Panier mis à jour",
"item_removed": "Article supprimé du panier",
"cart_cleared": "Panier vidé",
"product_not_available": "Produit non disponible",
"error_adding": "Erreur lors de l'ajout au panier",
"error_updating": "Erreur lors de la mise à jour du panier"
}
"title": "Panier",
"description": "Gestion du panier pour les clients",
"cart": {
"title": "Votre panier",
"empty": "Votre panier est vide",
"empty_subtitle": "Ajoutez des articles pour commencer vos achats",
"continue_shopping": "Continuer mes achats",
"proceed_to_checkout": "Passer à la caisse"
},
"item": {
"product": "Produit",
"quantity": "Quantité",
"price": "Prix",
"total": "Total",
"remove": "Supprimer",
"update": "Mettre à jour"
},
"summary": {
"title": "Récapitulatif de commande",
"subtotal": "Sous-total",
"shipping": "Livraison",
"estimated_shipping": "Calculé à la caisse",
"tax": "TVA",
"total": "Total"
},
"validation": {
"invalid_quantity": "Quantité invalide",
"min_quantity": "Quantité minimum: {min}",
"max_quantity": "Quantité maximum: {max}",
"insufficient_inventory": "Seulement {available} disponible(s)"
},
"messages": {
"item_added": "Article ajouté au panier",
"item_updated": "Panier mis à jour",
"item_removed": "Article supprimé du panier",
"cart_cleared": "Panier vidé",
"product_not_available": "Produit non disponible",
"error_adding": "Erreur lors de l'ajout au panier",
"error_updating": "Erreur lors de la mise à jour du panier"
},
"permissions": {
"view": "Voir les paniers",
"view_desc": "Voir les paniers des clients",
"manage": "Gérer les paniers",
"manage_desc": "Modifier et gérer les paniers des clients"
}
}

View File

@@ -1,42 +1,48 @@
{
"title": "Akafskuerf",
"description": "Kuerfverwaltung fir Clienten",
"cart": {
"title": "Äre Kuerf",
"empty": "Äre Kuerf ass eidel",
"empty_subtitle": "Setzt Artikelen derbäi fir anzekafen",
"continue_shopping": "Weider akafen",
"proceed_to_checkout": "Zur Keess"
},
"item": {
"product": "Produkt",
"quantity": "Unzuel",
"price": "Präis",
"total": "Gesamt",
"remove": "Ewechhuelen",
"update": "Aktualiséieren"
},
"summary": {
"title": "Bestelliwwersiicht",
"subtotal": "Zwëschesumm",
"shipping": "Liwwerung",
"estimated_shipping": "Gëtt bei der Keess berechent",
"tax": "MwSt.",
"total": "Gesamtsumm"
},
"validation": {
"invalid_quantity": "Ongëlteg Unzuel",
"min_quantity": "Mindestunzuel ass {min}",
"max_quantity": "Héichstunzuel ass {max}",
"insufficient_inventory": "Nëmmen {available} verfügbar"
},
"messages": {
"item_added": "Artikel an de Kuerf gesat",
"item_updated": "Kuerf aktualiséiert",
"item_removed": "Artikel aus dem Kuerf ewechgeholl",
"cart_cleared": "Kuerf eidel gemaach",
"product_not_available": "Produkt net verfügbar",
"error_adding": "Feeler beim Derbäisetzen an de Kuerf",
"error_updating": "Feeler beim Aktualiséiere vum Kuerf"
}
"title": "Akafskuerf",
"description": "Kuerfverwaltung fir Clienten",
"cart": {
"title": "Äre Kuerf",
"empty": "Äre Kuerf ass eidel",
"empty_subtitle": "Setzt Artikelen derbäi fir anzekafen",
"continue_shopping": "Weider akafen",
"proceed_to_checkout": "Zur Keess"
},
"item": {
"product": "Produkt",
"quantity": "Unzuel",
"price": "Präis",
"total": "Gesamt",
"remove": "Ewechhuelen",
"update": "Aktualiséieren"
},
"summary": {
"title": "Bestelliwwersiicht",
"subtotal": "Zwëschesumm",
"shipping": "Liwwerung",
"estimated_shipping": "Gëtt bei der Keess berechent",
"tax": "MwSt.",
"total": "Gesamtsumm"
},
"validation": {
"invalid_quantity": "Ongëlteg Unzuel",
"min_quantity": "Mindestunzuel ass {min}",
"max_quantity": "Héichstunzuel ass {max}",
"insufficient_inventory": "Nëmmen {available} verfügbar"
},
"messages": {
"item_added": "Artikel an de Kuerf gesat",
"item_updated": "Kuerf aktualiséiert",
"item_removed": "Artikel aus dem Kuerf ewechgeholl",
"cart_cleared": "Kuerf eidel gemaach",
"product_not_available": "Produkt net verfügbar",
"error_adding": "Feeler beim Derbäisetzen an de Kuerf",
"error_updating": "Feeler beim Aktualiséiere vum Kuerf"
},
"permissions": {
"view": "Kuerf kucken",
"view_desc": "Clientekuerf kucken",
"manage": "Kuerf verwalten",
"manage_desc": "Clientekuerf änneren a verwalten"
}
}