diff --git a/.github/workflows/convenitonal-commits.yml b/.github/workflows/convenitonal-commits.yml
deleted file mode 100644
index eee9576f6642..000000000000
--- a/.github/workflows/convenitonal-commits.yml
+++ /dev/null
@@ -1,23 +0,0 @@
-name: Check PR title
-on:
- pull_request:
- branches:
- - mealie-next
- types:
- - opened
- - reopened
- - edited
- - synchronize
-
-jobs:
- lint:
- runs-on: ubuntu-latest
- steps:
- - uses: aslafy-z/conventional-pr-title-action@master
- with:
- success-state: Title follows the specification.
- failure-state: Title does not follow the specification.
- context-name: conventional-pr-title
- preset: conventional-changelog-angular@latest
- env:
- GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
diff --git a/README.md b/README.md
index 34585313d449..b57b197db768 100644
--- a/README.md
+++ b/README.md
@@ -9,7 +9,9 @@
[](https://github.com/hay-kot/mealie/actions/workflows/test-all.yml)
[](https://github.com/hay-kot/mealie/actions/workflows/dockerbuild.dev.yml)
[](https://github.com/hay-kot/mealie/actions/workflows/test-all.yml)
+
+
diff --git a/frontend/api/class-interfaces/admin-about.ts b/frontend/api/class-interfaces/admin-about.ts
new file mode 100644
index 000000000000..548fd76667f1
--- /dev/null
+++ b/frontend/api/class-interfaces/admin-about.ts
@@ -0,0 +1,37 @@
+import { BaseAPI } from "./_base";
+
+const prefix = "/api";
+
+const routes = {
+ about: `${prefix}/admin/about`,
+ aboutStatistics: `${prefix}/admin/about/statistics`,
+};
+
+export interface AdminAboutInfo {
+ production: boolean;
+ version: string;
+ demoStatus: boolean;
+ apiPort: number;
+ apiDocs: boolean;
+ dbType: string;
+ dbUrl: string;
+ defaultGroup: string;
+}
+
+export interface AdminStatistics {
+ totalRecipes: number;
+ totalUsers: number;
+ totalGroups: number;
+ uncategorizedRecipes: number;
+ untaggedRecipes: number;
+}
+
+export class AdminAboutAPI extends BaseAPI {
+ async about() {
+ return await this.requests.get(routes.about);
+ }
+
+ async statistics() {
+ return await this.requests.get(routes.aboutStatistics);
+ }
+}
diff --git a/frontend/api/class-interfaces/debug.ts b/frontend/api/class-interfaces/debug.ts
deleted file mode 100644
index 3bc0450dfdc3..000000000000
--- a/frontend/api/class-interfaces/debug.ts
+++ /dev/null
@@ -1,51 +0,0 @@
-import { BaseAPI } from "./_base";
-
-export interface AppStatistics {
- totalRecipes: number;
- totalUsers: number;
- totalGroups: number;
- uncategorizedRecipes: number;
- untaggedRecipes: number;
-}
-
-const prefix = "/api";
-
-const routes = {
- debugVersion: `${prefix}/debug/version`,
- debug: `${prefix}/debug`,
- debugStatistics: `${prefix}/debug/statistics`,
- debugLastRecipeJson: `${prefix}/debug/last-recipe-json`,
- debugLog: `${prefix}/debug/log`,
-
- debugLogNum: (num: number) => `${prefix}/debug/log/${num}`,
-};
-
-export class DebugAPI extends BaseAPI {
- /** Returns the current version of mealie
- */
- async getMealieVersion() {
- return await this.requests.get(routes.debugVersion);
- }
-
- /** Returns general information about the application for debugging
- */
- async getDebugInfo() {
- return await this.requests.get(routes.debug);
- }
-
- async getAppStatistics() {
- return await this.requests.get(routes.debugStatistics);
- }
-
- /** Doc Str
- */
- async getLog(num: number) {
- return await this.requests.get(routes.debugLogNum(num));
- }
-
- /** Returns a token to download a file
- */
- async getLogFile() {
- return await this.requests.get(routes.debugLog);
- }
-}
diff --git a/frontend/api/index.ts b/frontend/api/index.ts
index 2af113f2359d..e7c0972f81dd 100644
--- a/frontend/api/index.ts
+++ b/frontend/api/index.ts
@@ -1,7 +1,6 @@
import { RecipeAPI } from "./class-interfaces/recipes";
import { UserApi } from "./class-interfaces/users";
import { GroupAPI } from "./class-interfaces/groups";
-import { DebugAPI } from "./class-interfaces/debug";
import { EventsAPI } from "./class-interfaces/events";
import { BackupAPI } from "./class-interfaces/backups";
import { UploadFile } from "./class-interfaces/upload";
@@ -13,14 +12,30 @@ import { FoodAPI } from "./class-interfaces/recipe-foods";
import { UnitAPI } from "./class-interfaces/recipe-units";
import { CookbookAPI } from "./class-interfaces/cookbooks";
import { WebhooksAPI } from "./class-interfaces/group-webhooks";
+import { AdminAboutAPI } from "./class-interfaces/admin-about";
import { ApiRequestInstance } from "~/types/api";
+class AdminAPI {
+ private static instance: AdminAPI;
+ public about: AdminAboutAPI;
+
+ constructor(requests: ApiRequestInstance) {
+ if (AdminAPI.instance instanceof AdminAPI) {
+ return AdminAPI.instance;
+ }
+
+ this.about = new AdminAboutAPI(requests);
+
+ Object.freeze(this);
+ AdminAPI.instance = this;
+ }
+}
+
class Api {
private static instance: Api;
public recipes: RecipeAPI;
public users: UserApi;
public groups: GroupAPI;
- public debug: DebugAPI;
public events: EventsAPI;
public backups: BackupAPI;
public categories: CategoriesAPI;
@@ -54,7 +69,6 @@ class Api {
this.groupWebhooks = new WebhooksAPI(requests);
// Admin
- this.debug = new DebugAPI(requests);
this.events = new EventsAPI(requests);
this.backups = new BackupAPI(requests);
this.notifications = new NotificationsAPI(requests);
@@ -68,4 +82,4 @@ class Api {
}
}
-export { Api };
+export { Api, AdminAPI };
diff --git a/frontend/components/Layout/AppHeader.vue b/frontend/components/Layout/AppHeader.vue
index 17dbb65b044e..6572756978cb 100644
--- a/frontend/components/Layout/AppHeader.vue
+++ b/frontend/components/Layout/AppHeader.vue
@@ -30,42 +30,16 @@
-->
-
-
-
- {{ $globals.icons.user }}
-
-
-
-
-
-
- {{ item.icon }}
-
-
-
- {{ item.title }}
-
-
-
-
-
-
+
+
+ {{ $globals.icons.logout }}
+ {{ $t("user.logout") }}
+
+
+ {{ $globals.icons.user }}
+ {{ $t("user.login") }}
+
+
@@ -83,46 +57,6 @@ export default defineComponent({
default: true,
},
},
- setup() {
- return {};
- },
- data() {
- return {
- itemSelected: null,
- items: [
- {
- icon: this.$globals.icons.user,
- title: this.$t("user.login"),
- restricted: false,
- nav: "/user/login",
- },
- {
- icon: this.$globals.icons.logout,
- title: this.$t("user.logout"),
- restricted: true,
- logout: true,
- },
- {
- icon: this.$globals.icons.cog,
- title: this.$t("general.settings"),
- nav: "/user/profile",
- restricted: true,
- },
- ],
- };
- },
- computed: {
- filteredItems(): Array {
- if (this.loggedIn) {
- return this.items.filter((x) => x.restricted === true);
- } else {
- return this.items.filter((x) => x.restricted === false);
- }
- },
- loggedIn(): Boolean {
- return this.$auth.loggedIn;
- },
- },
});
\ No newline at end of file
diff --git a/frontend/components/Layout/AppSidebar.vue b/frontend/components/Layout/AppSidebar.vue
index ae3fcbfc6e93..338fd7ed8719 100644
--- a/frontend/components/Layout/AppSidebar.vue
+++ b/frontend/components/Layout/AppSidebar.vue
@@ -102,20 +102,22 @@
-
-
- {{ nav.icon }}
-
- {{ nav.title }}
-
+
+
+
+ {{ nav.icon }}
+
+ {{ nav.title }}
+
+
diff --git a/frontend/composables/use-api.ts b/frontend/composables/use-api.ts
index 8af01e432e7d..25cae9e17aac 100644
--- a/frontend/composables/use-api.ts
+++ b/frontend/composables/use-api.ts
@@ -1,7 +1,7 @@
import { AxiosResponse } from "axios";
import { useContext } from "@nuxtjs/composition-api";
import { NuxtAxiosInstance } from "@nuxtjs/axios";
-import { Api } from "~/api";
+import { AdminAPI, Api } from "~/api";
import { ApiRequestInstance } from "~/types/api";
interface RequestResponse {
@@ -53,6 +53,11 @@ function getRequests(axoisInstance: NuxtAxiosInstance): ApiRequestInstance {
return requests;
}
+export const useAdminApi = function (): AdminAPI {
+ const { $axios } = useContext();
+ const requests = getRequests($axios);
+ return new AdminAPI(requests);
+};
export const useApiSingleton = function (): Api {
const { $axios } = useContext();
diff --git a/frontend/layouts/default.vue b/frontend/layouts/default.vue
index be4969d60165..643dfcc40bc1 100644
--- a/frontend/layouts/default.vue
+++ b/frontend/layouts/default.vue
@@ -8,6 +8,7 @@
:top-link="topLinks"
secondary-header="Cookbooks"
:secondary-links="cookbookLinks || []"
+ :bottom-links="bottomLink"
@input="sidebar = !sidebar"
/>
@@ -57,6 +58,14 @@ export default defineComponent({
data() {
return {
sidebar: null,
+ bottomLink: [
+ {
+ icon: this.$globals.icons.cog,
+ title: this.$t("general.settings"),
+ to: "/user/profile",
+ restricted: true,
+ },
+ ],
topLinks: [
{
icon: this.$globals.icons.calendar,
diff --git a/frontend/pages/admin/about.vue b/frontend/pages/admin/about.vue
index e81fede7c18d..5f00be604e34 100644
--- a/frontend/pages/admin/about.vue
+++ b/frontend/pages/admin/about.vue
@@ -1,16 +1,103 @@
-
+
+
+ {{ $t("about.about-mealie") }}
+
+
+
+
+
+
+ {{ property.icon || $globals.icons.user }}
+
+
+
+ {{ property.name }}
+ {{ property.value }}
+
+
+
+
+
+
diff --git a/frontend/pages/admin/dashboard.vue b/frontend/pages/admin/dashboard.vue
index 5c0a39a30f72..ec02d93b077e 100644
--- a/frontend/pages/admin/dashboard.vue
+++ b/frontend/pages/admin/dashboard.vue
@@ -94,7 +94,7 @@