diff --git a/vue3/package.json b/vue3/package.json index 7e604625c..6957ef63e 100644 --- a/vue3/package.json +++ b/vue3/package.json @@ -10,6 +10,7 @@ }, "dependencies": { "@types/luxon": "^3.7.1", + "@types/sortablejs": "^1.15.8", "@vueform/multiselect": "^2.6.11", "@vueuse/core": "^13.6.0", "@vueuse/router": "^13.6.0", @@ -22,7 +23,6 @@ "vue-router": "^4.5.0", "vue-simple-calendar": "7.1.0", "vuedraggable": "^4.1.0", - "@types/sortablejs": "^1.15.8", "vuetify": "^3.9.3" }, "devDependencies": { @@ -32,20 +32,21 @@ "@types/node": "^24.0.8", "@vitejs/plugin-vue": "^6.0.0", "@vue/tsconfig": "^0.7.0", + "esbuild-register": "^3.6.0", "jsdom": "^26.1.0", "typescript": "^5.8.3", "vite": "6.3.5", "vite-plugin-pwa": "^1.0.2", - "workbox-core": "^7.3.0", - "workbox-build": "^7.3.0", - "workbox-window": "^7.3.0", + "vite-plugin-vuetify": "^2.1.1", + "vue-tsc": "^2.2.8", "workbox-background-sync": "^7.3.0", + "workbox-build": "^7.3.0", + "workbox-core": "^7.3.0", "workbox-expiration": "^7.3.0", "workbox-navigation-preload": "^7.3.0", "workbox-precaching": "^7.3.0", "workbox-routing": "^7.3.0", "workbox-strategies": "^7.3.0", - "vite-plugin-vuetify": "^2.1.1", - "vue-tsc": "^2.2.8" + "workbox-window": "^7.3.0" } } diff --git a/vue3/src/locales/ar.json b/vue3/src/locales/ar.json index c9fc79368..e35d65137 100644 --- a/vue3/src/locales/ar.json +++ b/vue3/src/locales/ar.json @@ -152,6 +152,7 @@ "Log_Recipe_Cooking": "", "Make_Header": "", "Make_Ingredient": "", + "ManageSubscription": "", "Manage_Books": "", "Meal_Plan": "", "Meal_Plan_Days": "", diff --git a/vue3/src/locales/bg.json b/vue3/src/locales/bg.json index d07db17c0..c6d0adfab 100644 --- a/vue3/src/locales/bg.json +++ b/vue3/src/locales/bg.json @@ -147,6 +147,7 @@ "Log_Recipe_Cooking": "Дневник на Рецепта за готвене", "Make_Header": "Направете заглавие", "Make_Ingredient": "Направете съставка", + "ManageSubscription": "", "Manage_Books": "Управление на Книги", "Meal_Plan": "План на хранене", "Meal_Plan_Days": "Бъдещи планове за хранене", diff --git a/vue3/src/locales/ca.json b/vue3/src/locales/ca.json index f42259115..d8d1ea20f 100644 --- a/vue3/src/locales/ca.json +++ b/vue3/src/locales/ca.json @@ -202,6 +202,7 @@ "Logo": "Logotip", "Make_Header": "Establiu capçalera", "Make_Ingredient": "Establiu ingredient", + "ManageSubscription": "", "Manage_Books": "Gestioneu els llibres", "Manage_Emails": "Administrar correus", "Meal_Plan": "Pla d'àpats", diff --git a/vue3/src/locales/cs.json b/vue3/src/locales/cs.json index 4bf012964..633616a8f 100644 --- a/vue3/src/locales/cs.json +++ b/vue3/src/locales/cs.json @@ -200,6 +200,7 @@ "Logo": "Logo", "Make_Header": "Použij jako nadpis", "Make_Ingredient": "Použij jako ingredienci", + "ManageSubscription": "", "Manage_Books": "Spravovat kuchařky", "Manage_Emails": "Spravovat emaily", "Meal_Plan": "Jídelníček", diff --git a/vue3/src/locales/da.json b/vue3/src/locales/da.json index cbb58bfd7..e451b51d5 100644 --- a/vue3/src/locales/da.json +++ b/vue3/src/locales/da.json @@ -202,6 +202,7 @@ "Logo": "Logo", "Make_Header": "Opret rubrik", "Make_Ingredient": "Opret ingredient", + "ManageSubscription": "", "Manage_Books": "Administrer bøger", "Manage_Emails": "Håndter Emails", "Meal_Plan": "Madplan", diff --git a/vue3/src/locales/de.json b/vue3/src/locales/de.json index 3de82e150..39676d41c 100644 --- a/vue3/src/locales/de.json +++ b/vue3/src/locales/de.json @@ -3,8 +3,6 @@ "AIImportSubtitle": "Verwende AI um Fotos von Rezepten zu importieren.", "API": "API", "APIKey": "API Schlüssel", - "Summary": "Zusammenfassung", - "Structured": "Strukturiert", "API_Browser": "API Browser", "API_Documentation": "API Dokumentation", "AccessTokenHelp": "Zugriffsschlüssel für die REST Schnittstelle.", @@ -285,7 +283,7 @@ "Logout": "Ausloggen", "Make_Header": "In Überschrift wandeln", "Make_Ingredient": "In Zutat umwandeln", - "ManageSubscription": "Tarfi verwalten", + "ManageSubscription": "Tarif verwalten", "Manage_Books": "Bücher verwalten", "Manage_Emails": "E-Mails verwalten", "MealPlanHelp": "Ein Speiseplan ist ein Eintrag im Kalender zur Planung von Mahlzeiten. Er muss entweder ein Rezept oder einen Titel erhalten und kann mit der Einkaufsliste verknüpft werden. ", @@ -304,11 +302,11 @@ "Miscellaneous": "Sonstige", "MissingConversion": "Fehlende Umrechnung", "MissingProperties": "Fehlende Eigenschaften", + "Model": "Modell", "ModelSelectResultsHelp": "Für mehr Ergebnisse suchen", "Monday": "Montag", "Month": "Monat", "More": "Mehr", - "Model": "Modell", "Move": "Verschieben", "MoveCategory": "Verschieben nach: ", "MoveToStep": "Verschieben in Schritt", @@ -515,10 +513,12 @@ "Storage": "Externer Speicher", "StorageHelp": "Externe Speicherorte an denen Rezepte als Dateien (Foto/PDF) abgelegt und mit Tandor syncronisiert werden können.", "StoragePasswordTokenHelp": "Das hinterlegte Passwort/Token kann nicht angezeigt werden. Es wird nur aktualisiert wenn etwas neues in das Feld eingegeben wird. ", + "Structured": "Strukturiert", "SubstituteOnHand": "Du hast eine Alternative vorrätig.", "Substitutes": "Alternativen", "Success": "Erfolgreich", "SuccessClipboard": "Einkaufsliste wurde in die Zwischenablage kopiert", + "Summary": "Zusammenfassung", "Sunday": "Sonntag", "Supermarket": "Supermarkt", "SupermarketCategoriesOnly": "Nur Supermarktkategorien", diff --git a/vue3/src/locales/el.json b/vue3/src/locales/el.json index 37631bc44..350518de4 100644 --- a/vue3/src/locales/el.json +++ b/vue3/src/locales/el.json @@ -202,6 +202,7 @@ "Logo": "Λογότυπο", "Make_Header": "Δημιουργία κεφαλίδας", "Make_Ingredient": "Δημιουργία υλικού", + "ManageSubscription": "", "Manage_Books": "Διαχείριση βιβλίων", "Manage_Emails": "Διαχείριση email", "Meal_Plan": "Πρόγραμμα γευμάτων", diff --git a/vue3/src/locales/en.json b/vue3/src/locales/en.json index 6e97be614..4e438902f 100644 --- a/vue3/src/locales/en.json +++ b/vue3/src/locales/en.json @@ -293,8 +293,6 @@ "Meal_Type_Required": "Meal type is required", "Meal_Types": "Meal types", "Merge": "Merge", - "Summary": "Summary", - "Structured": "Structured", "MergeAutomateHelp": "Create an automation that replaces future objects of this type with the selected object.", "Merge_Keyword": "Merge Keyword", "Message": "Message", @@ -302,11 +300,11 @@ "Miscellaneous": "Miscellaneous", "MissingConversion": "Missing Conversion", "MissingProperties": "Missing Properties", + "Model": "Model", "ModelSelectResultsHelp": "Search for more results", "Monday": "Monday", "Month": "Month", "More": "More", - "Model": "Model", "Move": "Move", "MoveCategory": "Move To: ", "MoveToStep": "Move to Step", @@ -513,10 +511,12 @@ "Storage": "External Storage", "StorageHelp": "External storage locations where recipe files (image/pdf) can be stored and synced with Tandoor.", "StoragePasswordTokenHelp": "The stored password/token will never be displayed. It is only changed if something new is entered into the field. ", + "Structured": "Structured", "SubstituteOnHand": "You have a substitute on hand.", "Substitutes": "Substitutes", "Success": "Success", "SuccessClipboard": "Shopping list copied to clipboard", + "Summary": "Summary", "Sunday": "Sunday", "Supermarket": "Supermarket", "SupermarketCategoriesOnly": "Supermarket Categories Only", diff --git a/vue3/src/locales/fi.json b/vue3/src/locales/fi.json index ab0a10c7d..8e50b203c 100644 --- a/vue3/src/locales/fi.json +++ b/vue3/src/locales/fi.json @@ -196,6 +196,7 @@ "Logo": "Logo", "Make_Header": "Valmista Otsikko", "Make_Ingredient": "Valmista Ainesosa", + "ManageSubscription": "", "Manage_Books": "Hallinnoi kirjoja", "Manage_Emails": "Hallinnoi sähköposteja", "Meal_Plan": "Ateriasuunnitelma", diff --git a/vue3/src/locales/he.json b/vue3/src/locales/he.json index 9c4f2fdaa..37d22fbc6 100644 --- a/vue3/src/locales/he.json +++ b/vue3/src/locales/he.json @@ -202,6 +202,7 @@ "Logo": "לוגו", "Make_Header": "הפוך לכותרת", "Make_Ingredient": "הפוך למרכיב", + "ManageSubscription": "", "Manage_Books": "נהל ספרים", "Manage_Emails": "נהל כתובות דואר אלקטרוני", "Meal_Plan": "תוכנית ארוחה", diff --git a/vue3/src/locales/hr.json b/vue3/src/locales/hr.json index 404705ddb..e300900b4 100644 --- a/vue3/src/locales/hr.json +++ b/vue3/src/locales/hr.json @@ -202,6 +202,7 @@ "Logo": "Logotip", "Make_Header": "Napravi zaglavlje", "Make_Ingredient": "Napravi sastojak", + "ManageSubscription": "", "Manage_Books": "Upravljaj knjigama", "Manage_Emails": "Upravljanje e-poštom", "Meal_Plan": "Plan obroka", diff --git a/vue3/src/locales/hu.json b/vue3/src/locales/hu.json index 3a9531eec..c6b2346ec 100644 --- a/vue3/src/locales/hu.json +++ b/vue3/src/locales/hu.json @@ -183,6 +183,7 @@ "Log_Recipe_Cooking": "Főzés naplózása", "Make_Header": "Átalakítás címsorra", "Make_Ingredient": "Összetevő létrehozása", + "ManageSubscription": "", "Manage_Books": "Könyvek kezelése", "Manage_Emails": "Levelezés kezelése", "Meal_Plan": "Menüterv", diff --git a/vue3/src/locales/hy.json b/vue3/src/locales/hy.json index 5dbc57594..92d9f1557 100644 --- a/vue3/src/locales/hy.json +++ b/vue3/src/locales/hy.json @@ -71,6 +71,7 @@ "Load_More": "", "Log_Cooking": "Գրանցել եփելը", "Log_Recipe_Cooking": "Գրանցել բաղադրատոմսի օգտագործում", + "ManageSubscription": "", "Manage_Books": "Կարգավորել Գրքերը", "Meal_Plan": "Ճաշացուցակ", "Merge": "Միացնել", diff --git a/vue3/src/locales/id.json b/vue3/src/locales/id.json index 44c6c4652..2ea45bcf6 100644 --- a/vue3/src/locales/id.json +++ b/vue3/src/locales/id.json @@ -168,6 +168,7 @@ "Log_Recipe_Cooking": "Log Resep Memasak", "Make_Header": "Buat Header", "Make_Ingredient": "Buat bahan", + "ManageSubscription": "", "Manage_Books": "Kelola Buku", "Manage_Emails": "", "Meal_Plan": "rencana makan", diff --git a/vue3/src/locales/is.json b/vue3/src/locales/is.json index cdeaf100b..ed22201bb 100644 --- a/vue3/src/locales/is.json +++ b/vue3/src/locales/is.json @@ -201,6 +201,7 @@ "Logo": "", "Make_Header": "", "Make_Ingredient": "", + "ManageSubscription": "", "Manage_Books": "", "Manage_Emails": "", "Meal_Plan": "", diff --git a/vue3/src/locales/lt.json b/vue3/src/locales/lt.json index 347c73592..0035e37a3 100644 --- a/vue3/src/locales/lt.json +++ b/vue3/src/locales/lt.json @@ -185,6 +185,7 @@ "Log_Recipe_Cooking": "Užregistruoti recepto pagaminimą", "Make_Header": "Padaryti antraštę", "Make_Ingredient": "Padaryti ingredientą", + "ManageSubscription": "", "Manage_Books": "Tvarkyti knygas", "Manage_Emails": "", "Meal_Plan": "Maisto planas", diff --git a/vue3/src/locales/lv.json b/vue3/src/locales/lv.json index b79b2f5b6..7c057c93c 100644 --- a/vue3/src/locales/lv.json +++ b/vue3/src/locales/lv.json @@ -202,6 +202,7 @@ "Logo": "", "Make_Header": "", "Make_Ingredient": "", + "ManageSubscription": "", "Manage_Books": "", "Manage_Emails": "", "Meal_Plan": "", diff --git a/vue3/src/locales/nb_NO.json b/vue3/src/locales/nb_NO.json index f051bdf76..09b09217c 100644 --- a/vue3/src/locales/nb_NO.json +++ b/vue3/src/locales/nb_NO.json @@ -192,6 +192,7 @@ "Log_Recipe_Cooking": "Logg oppskriftsbruk", "Make_Header": "Bruk som overskrift", "Make_Ingredient": "Bruk som ingrediens", + "ManageSubscription": "", "Manage_Books": "Administrer bøker", "Manage_Emails": "Administrer e-poster", "Meal_Plan": "Måltidsplan", diff --git a/vue3/src/locales/pl.json b/vue3/src/locales/pl.json index b61067c52..8af031444 100644 --- a/vue3/src/locales/pl.json +++ b/vue3/src/locales/pl.json @@ -228,6 +228,7 @@ "Logo": "Logo", "Make_Header": "Utwórz nagłówek", "Make_Ingredient": "Utwórz składnik", + "ManageSubscription": "", "Manage_Books": "Zarządzaj książkami", "Manage_Emails": "Zarządzaj e-mailami", "Meal_Plan": "Plan posiłków", diff --git a/vue3/src/locales/pt.json b/vue3/src/locales/pt.json index 542f01dff..b37524024 100644 --- a/vue3/src/locales/pt.json +++ b/vue3/src/locales/pt.json @@ -159,6 +159,7 @@ "Log_Recipe_Cooking": "Registrar Receitas de Culinária", "Make_Header": "Tornar cabeçalho", "Make_Ingredient": "Fazer ingrediente", + "ManageSubscription": "", "Manage_Books": "Gerenciar Livros", "Meal_Plan": "Plano de Refeição", "Meal_Plan_Days": "Planos de alimentação futuros", diff --git a/vue3/src/locales/ro.json b/vue3/src/locales/ro.json index e795a498d..6047f05f4 100644 --- a/vue3/src/locales/ro.json +++ b/vue3/src/locales/ro.json @@ -177,6 +177,7 @@ "Log_Recipe_Cooking": "Jurnalul rețetelor de pregătire", "Make_Header": "Creare antet", "Make_Ingredient": "Create ingredient", + "ManageSubscription": "", "Manage_Books": "Gestionarea cărților", "Manage_Emails": "Gestionarea e-mailurilor", "Meal_Plan": "Plan de alimentare", diff --git a/vue3/src/locales/sv.json b/vue3/src/locales/sv.json index 2bd58c7c3..8d14f9a43 100644 --- a/vue3/src/locales/sv.json +++ b/vue3/src/locales/sv.json @@ -239,6 +239,7 @@ "Logo": "Logga", "Make_Header": "Skapa rubrik", "Make_Ingredient": "Skapa ingrediens", + "ManageSubscription": "", "Manage_Books": "Hantera böcker", "Manage_Emails": "Hantera mejladresser", "Meal_Plan": "Måltidsplanering", diff --git a/vue3/src/locales/tr.json b/vue3/src/locales/tr.json index b5e55bbd1..10f6e7bf0 100644 --- a/vue3/src/locales/tr.json +++ b/vue3/src/locales/tr.json @@ -202,6 +202,7 @@ "Logo": "Logo", "Make_Header": "Başlık Oluştur", "Make_Ingredient": "Malzeme Oluştur", + "ManageSubscription": "", "Manage_Books": "Kitapları Yönet", "Manage_Emails": "E-postaları Yönet", "Meal_Plan": "Yemek Planı", diff --git a/vue3/src/locales/uk.json b/vue3/src/locales/uk.json index aed7ce147..afe342a82 100644 --- a/vue3/src/locales/uk.json +++ b/vue3/src/locales/uk.json @@ -176,6 +176,7 @@ "Log_Recipe_Cooking": "Журнал приготування", "Make_Header": "Створити Заголовок", "Make_Ingredient": "Створити Інгрідієнт", + "ManageSubscription": "", "Manage_Books": "Управління Книжкою", "Meal_Plan": "План Харчування", "Meal_Plan_Days": "Майбутній план харчування", diff --git a/vue3/src/locales/zh_Hans.json b/vue3/src/locales/zh_Hans.json index 4c13a4dac..6d95955d7 100644 --- a/vue3/src/locales/zh_Hans.json +++ b/vue3/src/locales/zh_Hans.json @@ -202,6 +202,7 @@ "Logo": "徽标", "Make_Header": "显示注意事项", "Make_Ingredient": "制作食材", + "ManageSubscription": "", "Manage_Books": "烹饪手册管理", "Manage_Emails": "管理电子邮件", "Meal_Plan": "用餐计划", diff --git a/vue3/src/types/Plugins.ts b/vue3/src/types/Plugins.ts index bf508efe2..e437850b4 100644 --- a/vue3/src/types/Plugins.ts +++ b/vue3/src/types/Plugins.ts @@ -12,11 +12,17 @@ export type TandoorPlugin = { bottomNavigation: any[], userNavigation: any[], + buildInputs?: string[], + databasePageComponent?: Component, disabled?: boolean } +export type PluginModule = { + plugin: TandoorPlugin +} + const pluginModules = import.meta.glob('@/plugins/*/plugin.ts', { eager: true }) export let TANDOOR_PLUGINS = [] as TandoorPlugin[] Object.values(pluginModules).forEach(module => { diff --git a/vue3/vite.config.ts b/vue3/vite.config.ts index e5e4ebc7e..5b36fc007 100644 --- a/vue3/vite.config.ts +++ b/vue3/vite.config.ts @@ -1,12 +1,20 @@ -import {fileURLToPath, URL} from 'node:url' +import {fileURLToPath, pathToFileURL, URL} from 'node:url' + +import {readdirSync} from "fs" +import {resolve, join} from "path" +import 'esbuild-register/dist/node' import {defineConfig} from 'vite' import vue from '@vitejs/plugin-vue' import vuetify, {transformAssetUrls} from 'vite-plugin-vuetify' import {VitePWA} from "vite-plugin-pwa"; +import {PluginModule} from "./src/types/Plugins"; +import {readFileSync} from "node:fs"; // https://vitejs.dev/config/ -export default defineConfig(({command, mode, isSsrBuild, isPreview}) => { +export default defineConfig(async ({command, mode, isSsrBuild, isPreview}) => { + const buildInputs = await collectBuildInputs() + return { base: mode == 'development' ? '/static/vue3/' : './', plugins: [ @@ -40,7 +48,7 @@ export default defineConfig(({command, mode, isSsrBuild, isPreview}) => { // overwrite default .html entry input: [ 'src/apps/tandoor/main.ts', - ], + ].concat(buildInputs), }, }, server: { @@ -49,3 +57,33 @@ export default defineConfig(({command, mode, isSsrBuild, isPreview}) => { } } }) + +/** + * function to load plugin configs and find additional build inputs + */ +async function collectBuildInputs() { + const pluginsDir = resolve(__dirname, "src/plugins") + const buildInputs: string[] = [] + + for (const dir of readdirSync(pluginsDir, {withFileTypes: true})) { + if (!dir.isDirectory() && !dir.isSymbolicLink()) continue + + const pluginPath = join(pluginsDir, dir.name, "plugin.ts") + try { + const code = readFileSync(pluginPath, "utf-8") + // Regex to capture buildInputs: [ ... ] + const match = code.match(/buildInputs\s*:\s*(\[[^\]]*\])/s) + if (match) { + const arr = [eval][0](match[1]) as string[] + buildInputs.push(...arr) + } + } catch (err) { + console.warn(`Failed to parse plugin at ${pluginPath}:`, err) + } + } + + console.log('Tandoor Plugin build inputs: ', buildInputs) + return buildInputs +} + + diff --git a/vue3/yarn.lock b/vue3/yarn.lock index c60f71d22..3a0b33e27 100644 --- a/vue3/yarn.lock +++ b/vue3/yarn.lock @@ -1904,6 +1904,13 @@ es-to-primitive@^1.3.0: is-date-object "^1.0.5" is-symbol "^1.0.4" +esbuild-register@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/esbuild-register/-/esbuild-register-3.6.0.tgz#cf270cfa677baebbc0010ac024b823cbf723a36d" + integrity sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg== + dependencies: + debug "^4.3.4" + esbuild@^0.25.0: version "0.25.5" resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.25.5.tgz#71075054993fdfae76c66586f9b9c1f8d7edd430"