From 3a301e73ed0b096e052af3a23e8847b07927b844 Mon Sep 17 00:00:00 2001 From: Weblate Date: Thu, 8 May 2025 23:00:39 +0000 Subject: [PATCH 001/356] Translated using Weblate (Czech) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 100.0% (330 of 330 strings) Co-authored-by: Adam Havránek Translate-URL: https://translate.sysadminsmedia.com/projects/homebox/frontend/cs/ Translation: Homebox/Frontend --- frontend/locales/cs-CZ.json | 2 ++ 1 file changed, 2 insertions(+) diff --git a/frontend/locales/cs-CZ.json b/frontend/locales/cs-CZ.json index b7edf762..b18d0cc9 100644 --- a/frontend/locales/cs-CZ.json +++ b/frontend/locales/cs-CZ.json @@ -261,6 +261,8 @@ "it": "Italština", "ja-JP": "Japonština", "ko-KR": "Korejština", + "lb-LU": "Lucemburština (Lucembursko)", + "lt-LT": "Litevština (Litva)", "nb-NO": "Norština (Bokmål)", "nl": "Holandština", "pl": "Polština", From e4cc79e4debad56135bda2ce960f17784ee9b98e Mon Sep 17 00:00:00 2001 From: Weblate Date: Fri, 9 May 2025 22:00:39 +0000 Subject: [PATCH 002/356] Translated using Weblate (Czech) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 100.0% (330 of 330 strings) Co-authored-by: Martin Joneš Translate-URL: https://translate.sysadminsmedia.com/projects/homebox/frontend/cs/ Translation: Homebox/Frontend --- frontend/locales/cs-CZ.json | 152 ++++++++++++++++++------------------ 1 file changed, 76 insertions(+), 76 deletions(-) diff --git a/frontend/locales/cs-CZ.json b/frontend/locales/cs-CZ.json index b18d0cc9..9d4218ca 100644 --- a/frontend/locales/cs-CZ.json +++ b/frontend/locales/cs-CZ.json @@ -3,8 +3,8 @@ "app": { "import_dialog": { "change_warning": "Změnilo se chování importů s existujícími import_refs. Pokud je v souboru CSV přítomen import_ref, bude \n položka aktualizována hodnotami ze souboru CSV.", - "description": "Importujte CSV soubor obashující vaše položky, štítky a lokace. Pro dodatečné informace o formátu použijte \ndokumentaci.", - "title": "Importovat CSV Soubor" + "description": "Importujte CSV soubor obsahující vaše položky, štítky a lokace. Pro dodatečné informace o formátu použijte dokumentaci.", + "title": "Importovat CSV soubor" }, "outdated": { "current_version": "Aktuální verze", @@ -24,17 +24,17 @@ "date_time": { "ago": "Před {0}", "days": "dny", - "hour": "Hodina", - "hours": "Hodinami", + "hour": "hodina", + "hours": "hodinami", "in": "za {0}", - "just-now": "Právě teď", - "last-month": "Minulý měsíc", - "last-week": "Minulý týden", - "last-year": "Minulý rok", + "just-now": "právě teď", + "last-month": "minulý měsíc", + "last-week": "minulý týden", + "last-year": "minulý rok", "minute": "minuta", "minutes": "minutami", "months": "měsíci", - "next-month": "Přiští měsíc", + "next-month": "příští měsíc", "next-week": "příští týden", "next-year": "příští rok", "second": "sekunda", @@ -46,25 +46,25 @@ "yesterday": "včera" }, "label_maker": { - "browser_print": "Tisk z prohlížeče", + "browser_print": "Tisknout z prohlížeče", "confirm_description": "Opravdu chcete tento štítek vytisknout?", "download": "Stáhnout štítek", "print": "Vytisknout štítek", "server_print": "Tisk na serveru", - "titles": "Popisky" + "titles": "Štítky" }, "page_qr_code": { - "page_url": "URL Stránky", + "page_url": "URL stránky", "qr_tooltip": "Zobrazit QR kód" }, "password_score": { - "password_strength": "Síla Hesla" + "password_strength": "Síla hesla" } }, "item": { "create_modal": { - "item_description": "Popis Položky", - "item_name": "Jméno Položky", + "item_description": "Popis položky", + "item_name": "Jméno položky", "item_photo": "Fotografie položky 📷", "item_quantity": "Množství položek", "title": "Vytvořit položku", @@ -87,8 +87,8 @@ }, "label": { "create_modal": { - "label_description": "Popis Štítku", - "label_name": "Název Štítku", + "label_description": "Popis štítku", + "label_name": "Název štítku", "title": "Vytvořit štítek" }, "selector": { @@ -98,17 +98,17 @@ "location": { "create_modal": { "location_description": "Popis lokace", - "location_name": "Název Lokace", - "title": "Vytvořit Lokaci" + "location_name": "Název lokace", + "title": "Vytvořit lokaci" }, "selector": { - "no_location_found": "Nenalezena lokace", - "parent_location": "Nadřazená Lokace", + "no_location_found": "Lokace nebyla nalezena", + "parent_location": "Nadřazená lokace", "search_location": "Hledat lokace", "select_location": "Vybrat lokaci" }, "tree": { - "no_locations": "Nejsou dostupné žádné lokace. Přidejte nové lokace\npomocí talčítka `<`span class=\"link-primary\"`>`Vytvořit`<`/span`>` na navigační liště." + "no_locations": "Nejsou dostupné žádné lokace. Přidejte nové lokace\npomocí tlačítka `<`span class=\"link-primary\"`>`Vytvořit`<`/span`>` na navigační liště." } }, "quick_menu": { @@ -123,7 +123,7 @@ "cancel": "Zrušit", "confirm": "Potvrdit", "create": "Vytvořit", - "create_and_add": "Vytvořit a Přidat Další", + "create_and_add": "Vytvořit a přidat další", "created": "Vytvořeno", "delete": "Smazat", "details": "Detaily", @@ -135,20 +135,20 @@ "api_link": "''API''", "version_link": "' Verze: { version } Sestavení: { build } ''" }, - "github": "GitHub Projekt", + "github": "GitHub projekt", "insured": "Pojištěné", "items": "Položky", "join_discord": "Připojte se na Discord", - "labels": "Popisky", + "labels": "Štítky", "locations": "Lokality", "maintenance": "Údržba", "name": "Jméno", "navigate": "Navigovat", "password": "Heslo", "quantity": "Množství", - "read_docs": "Přečtěte si Dokumentaci", + "read_docs": "Přečtěte si dokumentaci", "save": "Uložit", - "search": "Vyhledávat", + "search": "Hledat", "sign_out": "Odhlásit se", "submit": "Potvrdit", "update": "Aktualizovat", @@ -161,13 +161,13 @@ "quick_statistics": "Rychlé informace", "recently_added": "Nedávno přidané", "storage_locations": "Úložné lokace", - "total_items": "Celkových Položek", + "total_items": "Celkových položek", "total_labels": "Celkových štítků", "total_locations": "Celkových lokací", "total_value": "Celková hodnota" }, "index": { - "disabled_registration": "Registrace je Zakázána", + "disabled_registration": "Registrace je zakázána", "dont_join_group": "Nechcete se přidat do skupiny?", "joining_group": "Přidáváte se do existující skupiny!", "login": "Přihlásit se", @@ -182,71 +182,71 @@ "add": "Přidat", "advanced": "Pokročilé", "archived": "Archivované", - "asset_id": "ID Položky", + "asset_id": "ID položky", "attachment": "Příloha", "attachments": "Přílohy", "changes_persisted_immediately": "Změny v přílohách budou uloženy okamžitě", - "created_at": "Vytvořeno v", - "custom_fields": "Vlastní Data", + "created_at": "Vytvořeno", + "custom_fields": "Vlastní pole", "description": "Popis", "details": "Detaily", "drag_and_drop": "Přetáhněte sem soubory nebo klikněte pro výběr", - "edit_details": "Upravit Detaily", - "field_selector": "Výběr Pole", - "field_value": "Hodnota Pole", + "edit_details": "Upravit detaily", + "field_selector": "Výběr pole", + "field_value": "Hodnota pole", "first": "První", - "include_archive": "Zahrnout i archivované Položky", + "include_archive": "Zahrnout i archivované položky", "insured": "Pojištěné", "last": "Poslední", "lifetime_warranty": "Doživotní záruka", - "location": "Lokalita", + "location": "Lokace", "manual": "Návod", "manuals": "Návody", "manufacturer": "Výrobce", - "model_number": "Číslo Modelu", + "model_number": "Číslo modelu", "name": "Název", - "negate_labels": "Prohodit Vybrané Štítky", - "next_page": "Další Stránka", - "no_results": "Nebyly nalezeny žádné Položky", + "negate_labels": "Prohodit vybrané štítky", + "next_page": "Další stránka", + "no_results": "Nebyly nalezeny žádné položky", "notes": "Poznámky", "only_with_photo": "Pouze položky s fotografií", "only_without_photo": "Pouze položky bez fotografie", "options": "Možnosti", - "order_by": "Seřadit Podle", + "order_by": "Seřadit podle", "pages": "Stránka { page } z { totalPages }", - "parent_item": "Nadřazená Položka", + "parent_item": "Nadřazená položka", "photo": "Fotka", "photos": "Fotky", "prev_page": "Předešlá strana", - "purchase_date": "Datum Nákupu", - "purchase_details": "Detaily Nákupu", + "purchase_date": "Datum nákupu", + "purchase_details": "Detaily nákupu", "purchase_price": "Nákupní cena", - "purchased_from": "Koupeno Od", + "purchased_from": "Prodejce", "quantity": "Množství", - "query_id": "Dotaz na ID číslo majetku:{ id }", + "query_id": "Dotazování na ID majetku: { id }", "receipt": "Účtenka", "receipts": "Účtenky", - "reset_search": "Obnovit Vyhledávání", - "results": "{ total } Výsledků", + "reset_search": "Obnovit vyhledávání", + "results": "{ total } výsledků", "serial_number": "Sériové číslo", - "show_advanced_view_options": "Zobrazit Pokročilé Možnosti Zobrazení", + "show_advanced_view_options": "Zobrazit pokročilé možnosti zobrazení", "sold_at": "Prodáno", - "sold_details": "Detaily Prodeje", - "sold_price": "Cena Prodeje", - "sold_to": "Prodáno Komu", + "sold_details": "Detaily prodeje", + "sold_price": "Cena prodeje", + "sold_to": "Prodáno komu", "tip_1": "Filtry umístění a štítků používají operaci „OR“. Pokud je vybráno více než jeden, bude pro shodu\n vyžadován pouze jeden z nich.", "tip_2": "Vyhledávání s předponou '#'' se dotazuje na ID datového zdroje (například '#000-001')", "tip_3": "Filtry polí používají operaci „NEBO“. Pokud je vybráno více než jedno, bude pro shodu vyžadováno\n pouze jedno.", - "tips": "Návrhy", - "tips_sub": "Vyhledat Návrhy", + "tips": "Nápověda", + "tips_sub": "Nápověda vyhledávání", "updated_at": "Aktualizováno", "warranty": "Záruka", - "warranty_details": "Detaily Záruky", - "warranty_expires": "Expirace Záruky" + "warranty_details": "Detaily záruky", + "warranty_expires": "Expirace záruky" }, "labels": { - "no_results": "Žádné Štítky nebyly nalezeny", - "update_label": "Aktualizovat Štítek" + "no_results": "Žádné štítky nebyly nalezeny", + "update_label": "Aktualizovat štítek" }, "languages": { "ca": "Katalánština", @@ -285,17 +285,17 @@ "languages.sk-SK": "Slovenština", "languages.sq-AL": "Albánština", "locations": { - "child_locations": "Podřazené Lokace", + "child_locations": "Podřazené lokace", "collapse_tree": "Zabalit strom", "expand_tree": "Rozbalit strom", "no_results": "Žádné lokace nebyly nalezeny", - "update_location": "Aktualizovat Lokaci" + "update_location": "Aktualizovat lokaci" }, "maintenance": { "filter": { "both": "Obojí", "completed": "Hotové", - "scheduled": "Plánovaný" + "scheduled": "Plánované" }, "list": { "complete": "Hotovo", @@ -303,17 +303,17 @@ "delete": "Smazat", "duplicate": "Duplikovat", "edit": "Upravit", - "new": "Nové" + "new": "Nová" }, "modal": { - "completed_date": "Datum Dokončení", + "completed_date": "Datum dokončení", "cost": "Náklady", "delete_confirmation": "Jste si jistí že chcete tento záznam smazat?", "edit_action": "Aktualizovat", - "edit_title": "Upravit Záznam", - "entry_name": "Název Záznamu", + "edit_title": "Upravit záznam", + "entry_name": "Název záznamu", "new_action": "Vytvořit", - "new_title": "Nový Záznam", + "new_title": "Nový záznam", "notes": "Poznámky", "scheduled_date": "Plánované datum" }, @@ -340,25 +340,25 @@ }, "profile": { "active": "Aktivní", - "change_password": "Změnit Heslo", - "currency_format": "Měnový Formát", - "current_password": "Aktuální Heslo", - "delete_account": "Smazat Účet", - "delete_account_sub": "Smaže se Váš účet a všechny s ním spojená data. Z této akce se nelze navrátit.", + "change_password": "Změnit heslo", + "currency_format": "Měnový formát", + "current_password": "Aktuální heslo", + "delete_account": "Smazat účet", + "delete_account_sub": "Smaže se Váš účet a všechny s ním spojená data. Tuto akci nelze vrátit!", "display_header": "{ currentValue, select, true {Hide Header} false {Show Header} other {Not Hit}}", "enabled": "Povoleno", "example": "Příklad", "gen_invite": "Vytvořit odkaz pozvánky", - "group_settings": "Nastavení Skupiny", + "group_settings": "Nastavení skupiny", "group_settings_sub": "Nastavení sdílené skupiny. Je možné, že bude nutné obnovit prohlížeč, aby se některá nastavení použila.", "inactive": "Neaktivní", "language": "Jazyk", - "new_password": "Nové Heslo", - "no_notifiers": "Nejsou nakonfigurovány žádné oznamovače", + "new_password": "Nové heslo", + "no_notifiers": "Nejsou nakonfigurováni žádní oznamovatelé", "no_override": "Žádné přepsání", "notifier_modal": "{ type, select, true {Edit} false {Create} other {Other}} Oznamovatel", "notifiers": "Oznamovatelé", - "notifiers_sub": "Dostávejte oznámení o nadcházejících připomenutích údržby", + "notifiers_sub": "Dostávejte oznámení o nadcházejících údržbách", "override_locale": "Přepsat datum a jazyk měny", "test": "Zkouška", "theme_settings": "Nastavení motivu", From 0bb859238b590bd3c622acefb101d1f2977e760e Mon Sep 17 00:00:00 2001 From: Weblate Date: Sun, 11 May 2025 09:50:49 +0000 Subject: [PATCH 003/356] Translated using Weblate (Slovenian) Currently translated at 87.2% (288 of 330 strings) Translated using Weblate (Slovenian) Currently translated at 87.2% (288 of 330 strings) Co-authored-by: Murk Co-authored-by: MyMemory Translate-URL: https://translate.sysadminsmedia.com/projects/homebox/frontend/sl/ Translation: Homebox/Frontend --- frontend/locales/sl.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/frontend/locales/sl.json b/frontend/locales/sl.json index 786c92e6..8e7525e4 100644 --- a/frontend/locales/sl.json +++ b/frontend/locales/sl.json @@ -9,7 +9,7 @@ "outdated": { "current_version": "Trenutna različica", "dismiss": "Opusti", - "latest_version": "Najnovejša različica:", + "latest_version": "Najnovejša različica", "new_version_available": "Nova različica je na voljo", "new_version_available_link": "Kliknite tukaj za ogled opomb ob izdaji" } @@ -45,6 +45,9 @@ "years": "leta", "yesterday": "včeraj" }, + "label_maker": { + "browser_print": "Tiskanje iz brskalnika" + }, "page_qr_code": { "page_url": "URL strani" }, From 469a7df448a4b70c5976d282dd91445114899c2e Mon Sep 17 00:00:00 2001 From: Weblate Date: Sun, 11 May 2025 14:00:39 +0000 Subject: [PATCH 004/356] Translated using Weblate (Slovenian) Currently translated at 100.0% (330 of 330 strings) Translated using Weblate (Slovenian) Currently translated at 100.0% (330 of 330 strings) Co-authored-by: Murk Co-authored-by: MyMemory Translate-URL: https://translate.sysadminsmedia.com/projects/homebox/frontend/sl/ Translation: Homebox/Frontend --- frontend/locales/sl.json | 106 ++++++++++++++++++++++++++++----------- 1 file changed, 77 insertions(+), 29 deletions(-) diff --git a/frontend/locales/sl.json b/frontend/locales/sl.json index 8e7525e4..1a1dfbf6 100644 --- a/frontend/locales/sl.json +++ b/frontend/locales/sl.json @@ -46,10 +46,16 @@ "yesterday": "včeraj" }, "label_maker": { - "browser_print": "Tiskanje iz brskalnika" + "browser_print": "Tiskanje iz brskalnika", + "confirm_description": "Ali ste prepričani, da želite natisniti to etiketo?", + "download": "Prenesi etiketo", + "print": "Natisni etiketo", + "server_print": "Natisni na strežniku", + "titles": "Etikete" }, "page_qr_code": { - "page_url": "URL strani" + "page_url": "URL strani", + "qr_tooltip": "Prikaži kodo QR" }, "password_score": { "password_strength": "Moč gesla" @@ -59,7 +65,10 @@ "create_modal": { "item_description": "opis predmeta", "item_name": "ime predmeta", - "title": "Ustvari predmet" + "item_photo": "fotografija predmeta 📷", + "item_quantity": "količina", + "title": "Ustvari predmet", + "upload_photos": "Naloži fotografije" }, "view": { "selectable": { @@ -69,8 +78,10 @@ "table": "Tabela" }, "table": { + "headers": "Stolpci", "page": "Stran", - "rows_per_page": "vrstic na stran" + "rows_per_page": "vrstic na stran", + "table_settings": "Nastavitve tabele" } } }, @@ -79,6 +90,9 @@ "label_description": "Opis nalepke", "label_name": "Ime nalepke", "title": "Ustvari oznako" + }, + "selector": { + "select_labels": "Izberi oznake" } }, "location": { @@ -88,19 +102,25 @@ "title": "Ustvari lokacijo" }, "selector": { - "parent_location": "Glavna lokacija" + "no_location_found": "Nobena lokacija ni bila najdena", + "parent_location": "Glavna lokacija", + "search_location": "Iskanje po lokacijah", + "select_location": "Izberite lokacijo" }, "tree": { "no_locations": "Ni razpoložljivih lokacij. Dodaj novo lokacije preko \n `<`span class=\"link-primary\"`>`Ustvari`<`/span`>` gumba v navigacijski vrstici." } }, "quick_menu": { + "no_results": "Ni resultatov.", "shortcut_hint": "S številskimi tipkami hitro izberite dejanje." } }, "global": { "add": "Dodaj", + "archived": "Arhivirano", "build": "Gradnja: { build }", + "cancel": "Prekliči", "confirm": "Potrdi", "create": "Ustvari", "create_and_add": "Ustvari in dodaj še enega", @@ -111,7 +131,12 @@ "edit": "Uredi", "email": "E-pošta", "follow_dev": "Sledi razvijjalcu", + "footer": { + "api_link": "''API''", + "version_link": "' Verzija: { version } Gradnja: { build } ''" + }, "github": "GitHub projekt", + "insured": "Zavarovano", "items": "Predmeti", "join_discord": "Pridruži se na Discord", "labels": "Oznake", @@ -120,6 +145,7 @@ "name": "Naziv", "navigate": "Krmari", "password": "Geslo", + "quantity": "Količina", "read_docs": "Preberite dokumentacijo", "save": "Shrani", "search": "Iskanje", @@ -223,34 +249,45 @@ "update_label": "Posodobitev oznake" }, "languages": { - "ca": "Katalonščina", - "de": "Nemščina", - "en": "Angleščina", - "es": "Španščina", - "fr": "Francoščina", - "hu": "Madžarščina", - "it": "Italijanščina", - "ja-JP": "Japonščina", - "nl": "Nizozemščina", - "pl": "Polščina", - "pt-BR": "Portugalščina (brazilska)", - "pt-PT": "Portugalščina (Portugalska)", - "ru": "Ruščina", - "sl": "Slovenščina", - "sv": "Švedščina", - "tr": "Turkščina", - "uk-UA": "Ukrajinščina", - "zh-CN": "Kitajščina (splošna)", - "zh-HK": "Kitajščina (Hong Kong)", - "zh-MO": "Kitajščina (Macau)", - "zh-TW": "Kitajsščina (tradicionalna)" + "ca": "katalonščina", + "cs-CZ": "češčina", + "de": "nemščina", + "en": "angleščina", + "es": "španščina", + "fi-FI": "finščina", + "fr": "francoščina", + "hu": "madžarščina", + "id-ID": "indonezijščina", + "it": "italijanščina", + "ja-JP": "japonščina", + "ko-KR": "korejščina", + "lb-LU": "luksemburščina (Luksemburg)", + "lt-LT": "litovščina (Litva)", + "nb-NO": "norveški bokmål", + "nl": "nizozemščina", + "pl": "polščina", + "pt-BR": "portugalščina (Brazilija)", + "pt-PT": "portugalščina (Portugalska)", + "ru": "ruščina", + "sl": "slovenščina", + "sq-AL": "albanščina", + "sv": "švedščina", + "ta-IN": "tamilščina", + "th-TH": "tajščina", + "tr": "turščina", + "uk-UA": "ukrajinščina", + "zh-CN": "kitajščina (poenostavljena)", + "zh-HK": "kitajščina (Hongkong)", + "zh-MO": "kitajščina (Makav)", + "zh-TW": "kitajščina (tradicionalna)" }, - "languages.da-DK": "Danščina", - "languages.ro-RO": "Romunščina", - "languages.sk-SK": "Slovaščina", + "languages.da-DK": "danščina", + "languages.ro-RO": "romunščina", + "languages.sk-SK": "slovaščina", "locations": { "child_locations": "Podrejene lokacije", "collapse_tree": "Strni drevo", + "expand_tree": "Razširi drevo", "no_results": "Ni najdenih lokacij", "update_location": "Posodobi lokacijo" }, @@ -297,6 +334,7 @@ "locations": "Lokacije", "maintenance": "Vzdrževanje", "profile": "Profil", + "scanner": "Optični bralnik", "search": "Iskanje", "tools": "Orodja" }, @@ -317,9 +355,11 @@ "language": "Jezik", "new_password": "Novo geslo", "no_notifiers": "Ni nastavljenih sporočanj", + "no_override": "Brez spremembe", "notifier_modal": "{ type, select, true {Edit} false {Create} other {Other}} Obveščevalec", "notifiers": "Obveščevalci", "notifiers_sub": "Prejemajte obvestila za prihajajoče opomnike o vzdrževanju", + "override_locale": "Spremeni jezik datuma in valute", "test": "Preizkus", "theme_settings": "Nastavitve teme", "theme_settings_sub": "Nastavitve teme so shranjene v lokalni shrambi vašega brskalnika. Temo lahko kadar koli spremenite. Če\n imate težave z nastavitvijo teme, poskusite osvežiti brskalnik.", @@ -329,6 +369,14 @@ "user_profile": "Profil uporabnika", "user_profile_sub": "Povabite uporabnike in upravljajte svoj račun." }, + "scanner": { + "error": "Med optičnim branjem je prišlo do napake", + "invalid_url": "Neveljaven URL naslov v črtni kodi", + "no_sources": "Ni kamer / video virov", + "select_video_source": "Izberi kamero / video vir", + "title": "Optični bralnik", + "unsupported": "API za pretok medijev ni na voljo brez HTTPS" + }, "tools": { "actions": "Dejanja inventarja", "actions_set": { From e4a45ddb59f8a323c566d59976cdb127b73c2ae9 Mon Sep 17 00:00:00 2001 From: greg1904 <67950803+greg1904@users.noreply.github.com> Date: Sun, 11 May 2025 21:46:53 +0200 Subject: [PATCH 005/356] Feat subitem create button (#691) Co-authored-by: greg1904 --- backend/internal/data/repo/repo_items.go | 4 ++ frontend/components/Item/CreateModal.vue | 77 ++++++++++++++++++++++-- frontend/locales/de.json | 4 +- frontend/locales/en.json | 2 + frontend/pages/item/[id]/index.vue | 20 +++++- 5 files changed, 100 insertions(+), 7 deletions(-) diff --git a/backend/internal/data/repo/repo_items.go b/backend/internal/data/repo/repo_items.go index dd11b356..571eb916 100644 --- a/backend/internal/data/repo/repo_items.go +++ b/backend/internal/data/repo/repo_items.go @@ -579,6 +579,10 @@ func (e *ItemsRepository) Create(ctx context.Context, gid uuid.UUID, data ItemCr SetLocationID(data.LocationID). SetAssetID(int(data.AssetID)) + if data.ParentID != uuid.Nil { + q.SetParentID(data.ParentID) + } + if len(data.LabelIDs) > 0 { q.AddLabelIDs(data.LabelIDs...) } diff --git a/frontend/components/Item/CreateModal.vue b/frontend/components/Item/CreateModal.vue index 191e3919..136ee082 100644 --- a/frontend/components/Item/CreateModal.vue +++ b/frontend/components/Item/CreateModal.vue @@ -2,6 +2,15 @@
+ labelStore.labels); const route = useRoute(); + const router = useRouter(); + + const parent = ref(); + const { query, results } = useItemSearch(api, { immediate: false }); + const subItemCreateParam = useRouteQuery("subItemCreate", "n"); + const subItemCreate = ref(); const labelId = computed(() => { if (route.fullPath.includes("/label/")) { @@ -175,12 +191,20 @@ return null; }); + const itemId = computed(() => { + if (route.fullPath.includes("/item/")) { + return route.params.id; + } + return null; + }); + const nameInput = ref(null); const loading = ref(false); const focused = ref(false); const form = reactive({ location: locations.value && locations.value.length > 0 ? locations.value[0] : ({} as LocationOut), + parentId: null, name: "", quantity: 1, description: "", @@ -189,6 +213,18 @@ photos: [] as PhotoPreview[], }); + watch( + parent, + newParent => { + if (newParent && newParent.id && subItemCreate.value) { + form.parentId = newParent.id; + } else { + form.parentId = null; + } + }, + { immediate: true } + ); + const { shift } = useMagicKeys(); function deleteImage(index: number) { @@ -223,10 +259,43 @@ watch( () => activeDialog.value, - active => { + async active => { if (active === "create-item") { - if (locationId.value) { - const found = locations.value.find(l => l.id === locationId.value); + // needed since URL will be cleared in the next step => ParentId Selection should stay though + subItemCreate.value = subItemCreateParam.value === "y"; + let parentItemLocationId = null; + + if (subItemCreate.value && itemId.value) { + const itemIdRead = typeof itemId.value === "string" ? (itemId.value as string) : itemId.value[0]; + const { data, error } = await api.items.get(itemIdRead); + if (error || !data) { + toast.error("Failed to load parent item - please select manually"); + console.error("Parent item fetch error:", error); + } + + if (data) { + parent.value = data; + } + + if (data.location) { + const { location } = data; + parentItemLocationId = location.id; + } + + // clear URL Parameter (subItemCreate) since intention was communicated and received + const currentQuery = { ...route.query }; + delete currentQuery.subItemCreate; + await router.push({ query: currentQuery }); + } else { + // since Input is hidden in this case, make sure no accidental parent information is sent out + parent.value = {}; + form.parentId = null; + } + + const locId = locationId.value ? locationId.value : parentItemLocationId; + + if (locId) { + const found = locations.value.find(l => l.id === locId); if (found) { form.location = found; } @@ -254,7 +323,7 @@ if (shift.value) close = false; const out: ItemCreate = { - parentId: null, + parentId: form.parentId, name: form.name, quantity: form.quantity, description: form.description, diff --git a/frontend/locales/de.json b/frontend/locales/de.json index 2c9d5a51..63131d72 100644 --- a/frontend/locales/de.json +++ b/frontend/locales/de.json @@ -67,6 +67,7 @@ "item_name": "Gegenstandsname", "item_photo": "Artikel Bild", "item_quantity": "Artikel Menge", + "parent_item" :"Übergeordneter Gegenstand", "title": "Gegenstand erstellen", "upload_photos": "Upload Bilder" }, @@ -125,6 +126,7 @@ "create": "Erstellen", "create_and_add": "Erstellen und weiteren hinzufügen", "created": "Erstellt", + "create_subitem": "Sub-Gegenstand erstellen", "delete": "Löschen", "details": "Details", "duplicate": "Duplizieren", @@ -214,7 +216,7 @@ "options": "Optionen", "order_by": "Sortieren nach", "pages": "Seite { page } von { totalPages }", - "parent_item": "Übergeordnetes Element", + "parent_item": "Übergeordneter Gegenstand", "photo": "Foto", "photos": "Fotos", "prev_page": "Vorherige Seite", diff --git a/frontend/locales/en.json b/frontend/locales/en.json index 96271fd9..f07fc0e8 100644 --- a/frontend/locales/en.json +++ b/frontend/locales/en.json @@ -67,6 +67,7 @@ "item_name": "Item Name", "item_photo": "Item Photo 📷", "item_quantity": "Item Quantity", + "parent_item" :"Parent Item", "title": "Create Item", "upload_photos": "Upload Photos" }, @@ -125,6 +126,7 @@ "create": "Create", "create_and_add": "Create and Add Another", "created": "Created", + "create_subitem": "Create Subitem", "delete": "Delete", "details": "Details", "duplicate": "Duplicate", diff --git a/frontend/pages/item/[id]/index.vue b/frontend/pages/item/[id]/index.vue index 1fd38b09..0a9bad31 100644 --- a/frontend/pages/item/[id]/index.vue +++ b/frontend/pages/item/[id]/index.vue @@ -32,6 +32,7 @@ }); const route = useRoute(); + const router = useRouter(); const api = useUserApi(); const itemId = computed(() => route.params.id as string); @@ -509,6 +510,17 @@ toast.success("Item deleted"); navigateTo("/home"); } + + async function createSubitem() { + // setting URL Parameter that is read and immidiately removed in the Item-CreateModal + await router.push({ + query: { + subItemCreate: "y", + }, + }); + + openDialog("create-item"); + }