diff --git a/frontend/src/api/themes.js b/frontend/src/api/themes.js
index cfd433594..0917afb31 100644
--- a/frontend/src/api/themes.js
+++ b/frontend/src/api/themes.js
@@ -6,10 +6,10 @@ const prefix = baseURL + "themes";
const settingsURLs = {
allThemes: `${baseURL}themes`,
- specificTheme: themeName => `${prefix}/${themeName}`,
+ specificTheme: id => `${prefix}/${id}`,
createTheme: `${prefix}/create`,
- updateTheme: themeName => `${prefix}/${themeName}`,
- deleteTheme: themeName => `${prefix}/${themeName}`,
+ updateTheme: id => `${prefix}/${id}`,
+ deleteTheme: id => `${prefix}/${id}`,
};
export const themeAPI = {
@@ -32,22 +32,18 @@ export const themeAPI = {
);
},
- update(themeName, colors) {
- const body = {
- name: themeName,
- colors: colors,
- };
+ update(data) {
return apiReq.put(
- settingsURLs.updateTheme(themeName),
- body,
+ settingsURLs.updateTheme(data.id),
+ data,
() => i18n.t("settings.theme.error-updating-theme"),
() => i18n.t("settings.theme.theme-updated")
);
},
- delete(themeName) {
+ delete(id) {
return apiReq.delete(
- settingsURLs.deleteTheme(themeName),
+ settingsURLs.deleteTheme(id),
null,
() => i18n.t("settings.theme.error-deleting-theme"),
() => i18n.t("settings.theme.theme-deleted")
diff --git a/frontend/src/components/FormHelpers/ColorPickerDialog.vue b/frontend/src/components/FormHelpers/ColorPickerDialog.vue
index 3c0fc13be..13ba003ec 100644
--- a/frontend/src/components/FormHelpers/ColorPickerDialog.vue
+++ b/frontend/src/components/FormHelpers/ColorPickerDialog.vue
@@ -3,7 +3,7 @@
{{ buttonText }}
-
+
@@ -17,15 +17,7 @@
-
-
-
-
- {{ color }}
-
-
-
-
+
diff --git a/frontend/src/components/UI/Buttons/TheUploadBtn.vue b/frontend/src/components/UI/Buttons/TheUploadBtn.vue
index 6b2180d90..8b009daba 100644
--- a/frontend/src/components/UI/Buttons/TheUploadBtn.vue
+++ b/frontend/src/components/UI/Buttons/TheUploadBtn.vue
@@ -2,7 +2,7 @@
-
+
{{ icon }}
{{ text ? text : defaultText }}
@@ -15,6 +15,9 @@ const UPLOAD_EVENT = "uploaded";
import { api } from "@/api";
export default {
props: {
+ small: {
+ default: false,
+ },
post: {
type: Boolean,
default: true,
@@ -27,7 +30,7 @@ export default {
default: true,
},
},
- data: () => ({
+ data: () => ({
file: null,
isSelecting: false,
}),
diff --git a/frontend/src/components/UI/Dialogs/BaseDialog.vue b/frontend/src/components/UI/Dialogs/BaseDialog.vue
index 3e5d6ab19..e4a80296e 100644
--- a/frontend/src/components/UI/Dialogs/BaseDialog.vue
+++ b/frontend/src/components/UI/Dialogs/BaseDialog.vue
@@ -18,6 +18,10 @@
{{ $t("general.cancel") }}
+
+
+ {{ $t("general.delete") }}
+
{{ submitText }}
@@ -87,6 +91,10 @@ export default {
close() {
this.dialog = false;
},
+ deleteEvent() {
+ this.$emit("delete");
+ this.submitted = true;
+ },
},
};
diff --git a/frontend/src/components/UI/StatCard.vue b/frontend/src/components/UI/StatCard.vue
index 2c580a342..50b1fc9e7 100644
--- a/frontend/src/components/UI/StatCard.vue
+++ b/frontend/src/components/UI/StatCard.vue
@@ -23,7 +23,7 @@ w
-
+
diff --git a/frontend/src/components/UI/TheSidebar.vue b/frontend/src/components/UI/TheSidebar.vue
index 80ec11221..bf9543f7e 100644
--- a/frontend/src/components/UI/TheSidebar.vue
+++ b/frontend/src/components/UI/TheSidebar.vue
@@ -133,11 +133,6 @@ export default {
to: "/admin/profile",
title: this.$t("settings.profile"),
},
- {
- icon: "mdi-format-color-fill",
- to: "/admin/themes",
- title: this.$t("general.themes"),
- },
{
icon: "mdi-food",
to: "/admin/meal-planner",
diff --git a/frontend/src/pages/Admin/Profile/ThemeCard.vue b/frontend/src/pages/Admin/Profile/ThemeCard.vue
new file mode 100644
index 000000000..8496fe4d8
--- /dev/null
+++ b/frontend/src/pages/Admin/Profile/ThemeCard.vue
@@ -0,0 +1,215 @@
+
+
+
+
+
+
+
+
+ {{ selectedTheme.name }}
+
+
+
+
+
+
+
+ mdi-desktop-tower-monitor
+
+ {{ $t("settings.theme.default-to-system") }}
+
+
+
+
+ mdi-white-balance-sunny
+
+ {{ $t("settings.theme.light") }}
+
+
+
+
+ mdi-weather-night
+
+ {{ $t("settings.theme.dark") }}
+
+
+
+
+
+
+
+
+
+
+ mdi-format-color-fill
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ mdi-square-edit-outline
+
+
+
+
+
+
+
+
+
+ mdi-plus {{ $t("general.create") }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/frontend/src/pages/Admin/Profile/UserCard.vue b/frontend/src/pages/Admin/Profile/UserCard.vue
index d20e833a7..190c0fd65 100644
--- a/frontend/src/pages/Admin/Profile/UserCard.vue
+++ b/frontend/src/pages/Admin/Profile/UserCard.vue
@@ -1,120 +1,105 @@
-
-
-
-
-
-
-
-
- {{ initials }}
-
-
-
-
-
-
+
+
+
+
+
+ {{ initials }}
+
+
+
+
+
+
-
- {{ $t("group.group") }}: {{ user.group }}
-
-
-
-
-
+
+ {{ $t("group.group") }}: {{ user.group }}
+
+
+
+
+
+
+
+ mdi-lock
+ Change Password
+
+
-
-
-
-
-
- mdi-lock
- Change Password
-
-
-
-
-
-
-
-
-
-
-
-
-
- mdi-content-save
- {{ $t("general.update") }}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ mdi-content-save
+ {{ $t("general.update") }}
+
+
+
+
diff --git a/frontend/src/pages/Admin/Theme/NewThemeDialog.vue b/frontend/src/pages/Admin/Theme/NewThemeDialog.vue
deleted file mode 100644
index f704bada5..000000000
--- a/frontend/src/pages/Admin/Theme/NewThemeDialog.vue
+++ /dev/null
@@ -1,89 +0,0 @@
-
-
-
- {{ $t("settings.add-a-new-theme") }}
-
-
-
-
-
- mdi-format-color-fill
-
-
-
- {{ $t("settings.add-a-new-theme") }}
-
-
-
-
-
-
-
-
-
-
-
-
- {{ $t("general.cancel") }}
-
-
- {{ $t("general.create") }}
-
-
-
-
-
-
-
-
-
-
-
diff --git a/frontend/src/pages/Admin/Theme/ThemeCard.vue b/frontend/src/pages/Admin/Theme/ThemeCard.vue
deleted file mode 100644
index e0d67e285..000000000
--- a/frontend/src/pages/Admin/Theme/ThemeCard.vue
+++ /dev/null
@@ -1,88 +0,0 @@
-
-
-
-
-
-
- {{ theme.name }}
- {{ current ? $t("general.current-parenthesis") : "" }}
-
-
-
-
-
-
-
-
-
-
-
- {{ $t("general.delete") }}
-
-
-
- {{ $t("general.apply") }}
-
-
-
-
-
-
-
-
diff --git a/frontend/src/pages/Admin/Theme/index.vue b/frontend/src/pages/Admin/Theme/index.vue
deleted file mode 100644
index 4c30adf7d..000000000
--- a/frontend/src/pages/Admin/Theme/index.vue
+++ /dev/null
@@ -1,155 +0,0 @@
-
-
-
- {{ $t("settings.theme.theme-settings") }}
-
-
-
- {{ $t("settings.theme.dark-mode") }}
-
- {{
- $t(
- "settings.theme.choose-how-mealie-looks-to-you-set-your-theme-preference-to-follow-your-system-settings-or-choose-to-use-the-light-or-dark-theme"
- )
- }}
-
-
-
-
-
- mdi-desktop-tower-monitor
-
- {{ $t("settings.theme.default-to-system") }}
-
-
-
-
- mdi-white-balance-sunny
-
- {{ $t("settings.theme.light") }}
-
-
-
-
- mdi-weather-night
-
- {{ $t("settings.theme.dark") }}
-
-
-
-
-
-
-
- {{ $t("settings.theme.theme") }}
-
- {{
- $t(
- "settings.theme.select-a-theme-from-the-dropdown-or-create-a-new-theme-note-that-the-default-theme-will-be-served-to-all-users-who-have-not-set-a-theme-preference"
- )
- }}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- mdi-content-save
- {{ $t("general.save") }}
-
-
-
-
-
-
-
-
diff --git a/frontend/src/routes/admin.js b/frontend/src/routes/admin.js
index 0df6e76ae..77335364c 100644
--- a/frontend/src/routes/admin.js
+++ b/frontend/src/routes/admin.js
@@ -1,5 +1,4 @@
import Admin from "@/pages/Admin";
-import Theme from "@/pages/Admin/Theme";
import MealPlanner from "@/pages/Admin/MealPlanner";
import Migration from "@/pages/Admin/Migration";
import Profile from "@/pages/Admin/Profile";
@@ -30,13 +29,6 @@ export const adminRoutes = {
title: "settings.profile",
},
},
- {
- path: "themes",
- component: Theme,
- meta: {
- title: "general.themes",
- },
- },
{
path: "meal-planner",
component: MealPlanner,
diff --git a/mealie/db/database.py b/mealie/db/database.py
index 0881d29bd..3ecd61dbc 100644
--- a/mealie/db/database.py
+++ b/mealie/db/database.py
@@ -93,7 +93,7 @@ class _Settings(BaseDocument):
class _Themes(BaseDocument):
def __init__(self) -> None:
- self.primary_key = "name"
+ self.primary_key = "id"
self.sql_model = SiteThemeModel
self.schema = SiteTheme
diff --git a/mealie/db/models/theme.py b/mealie/db/models/theme.py
index 17cb7a229..e56c4fbe7 100644
--- a/mealie/db/models/theme.py
+++ b/mealie/db/models/theme.py
@@ -1,23 +1,21 @@
import sqlalchemy as sa
import sqlalchemy.orm as orm
-from mealie.db.models.model_base import SqlAlchemyBase
+from mealie.db.models.model_base import BaseMixins, SqlAlchemyBase
+from sqlalchemy.sql.sqltypes import Integer
-class SiteThemeModel(SqlAlchemyBase):
+class SiteThemeModel(SqlAlchemyBase, BaseMixins):
__tablename__ = "site_theme"
- name = sa.Column(sa.String, primary_key=True)
+ id = sa.Column(Integer, primary_key=True)
+ name = sa.Column(sa.String, nullable=False)
colors = orm.relationship("ThemeColorsModel", uselist=False, cascade="all, delete")
- def __init__(self, name: str, colors: dict, session=None) -> None:
+ def __init__(self, name: str, colors: dict, *arg, **kwargs) -> None:
self.name = name
self.colors = ThemeColorsModel(**colors)
- def update(self, session=None, name: str = None, colors: dict = None) -> dict:
- self.colors.update(**colors)
- return self
-
-class ThemeColorsModel(SqlAlchemyBase):
+class ThemeColorsModel(SqlAlchemyBase, BaseMixins):
__tablename__ = "theme_colors"
id = sa.Column(sa.Integer, primary_key=True)
parent_id = sa.Column(sa.String, sa.ForeignKey("site_theme.name"))
@@ -28,21 +26,3 @@ class ThemeColorsModel(SqlAlchemyBase):
info = sa.Column(sa.String)
warning = sa.Column(sa.String)
error = sa.Column(sa.String)
-
- def update(
- self,
- primary: str = None,
- accent: str = None,
- secondary: str = None,
- success: str = None,
- info: str = None,
- warning: str = None,
- error: str = None,
- ) -> None:
- self.primary = primary
- self.accent = accent
- self.secondary = secondary
- self.success = success
- self.info = info
- self.warning = warning
- self.error = error
diff --git a/mealie/routes/theme_routes.py b/mealie/routes/theme_routes.py
index 9f25c8eae..6bbe5ef0c 100644
--- a/mealie/routes/theme_routes.py
+++ b/mealie/routes/theme_routes.py
@@ -1,4 +1,4 @@
-from fastapi import APIRouter, Depends, status, HTTPException
+from fastapi import APIRouter, Depends, HTTPException, status
from mealie.db.database import db
from mealie.db.db_setup import generate_session
from mealie.routes.deps import get_current_user
@@ -21,27 +21,27 @@ def create_theme(data: SiteTheme, session: Session = Depends(generate_session),
db.themes.create(session, data.dict())
-@router.get("/themes/{theme_name}")
-def get_single_theme(theme_name: str, session: Session = Depends(generate_session)):
+@router.get("/themes/{id}")
+def get_single_theme(id: int, session: Session = Depends(generate_session)):
""" Returns a named theme """
- return db.themes.get(session, theme_name)
+ return db.themes.get(session, id)
-@router.put("/themes/{theme_name}", status_code=status.HTTP_200_OK)
+@router.put("/themes/{id}", status_code=status.HTTP_200_OK)
def update_theme(
- theme_name: str,
+ id: int,
data: SiteTheme,
session: Session = Depends(generate_session),
current_user=Depends(get_current_user),
):
""" Update a theme database entry """
- db.themes.update(session, theme_name, data.dict())
+ db.themes.update(session, id, data.dict())
-@router.delete("/themes/{theme_name}", status_code=status.HTTP_200_OK)
-def delete_theme(theme_name: str, session: Session = Depends(generate_session), current_user=Depends(get_current_user)):
+@router.delete("/themes/{id}", status_code=status.HTTP_200_OK)
+def delete_theme(id: int, session: Session = Depends(generate_session), current_user=Depends(get_current_user)):
""" Deletes theme from the database """
try:
- db.themes.delete(session, theme_name)
+ db.themes.delete(session, id)
except Exception:
raise HTTPException(status.HTTP_400_BAD_REQUEST)
diff --git a/mealie/schema/theme.py b/mealie/schema/theme.py
index 32b25282e..62f48c2c0 100644
--- a/mealie/schema/theme.py
+++ b/mealie/schema/theme.py
@@ -1,3 +1,5 @@
+from typing import Optional
+
from pydantic import BaseModel
@@ -5,7 +7,7 @@ class Colors(BaseModel):
primary: str = "#E58325"
accent: str = "#00457A"
secondary: str = "#973542"
- success: str = "#4CAF50"
+ success: str = "#43A047"
info: str = "#4990BA"
warning: str = "#FF4081"
error: str = "#EF5350"
@@ -15,6 +17,7 @@ class Colors(BaseModel):
class SiteTheme(BaseModel):
+ id: Optional[int]
name: str = "default"
colors: Colors = Colors()