diff --git a/frontend/src/components/Search.vue b/frontend/src/components/Search.vue
index cc4cc33f..751cf1c1 100644
--- a/frontend/src/components/Search.vue
+++ b/frontend/src/components/Search.vue
@@ -203,4 +203,3 @@ export default {
},
};
-@/stores/file@/stores/layout
diff --git a/frontend/src/components/Shell.vue b/frontend/src/components/Shell.vue
index 84b3c125..68f771e1 100644
--- a/frontend/src/components/Shell.vue
+++ b/frontend/src/components/Shell.vue
@@ -129,4 +129,3 @@ export default {
},
};
-@/stores/file@/stores/layout
diff --git a/frontend/src/components/Sidebar.vue b/frontend/src/components/Sidebar.vue
index 8bb3b5bf..b223cfc4 100644
--- a/frontend/src/components/Sidebar.vue
+++ b/frontend/src/components/Sidebar.vue
@@ -134,6 +134,7 @@ export default {
components: {
ProgressBar,
},
+ inject: ["$showError"],
computed: {
...mapState(useAuthStore, ["user", "isLoggedIn"]),
...mapState(useLayoutStore, ["show"]),
@@ -177,7 +178,7 @@ export default {
methods: {
...mapActions(useLayoutStore, ["closeHovers", "showHover"]),
toRoot() {
- this.$router.push({ path: "/files/" });
+ this.$router.push({ path: "/files" });
this.closeHovers();
},
toSettings() {
@@ -191,4 +192,3 @@ export default {
},
};
-@/stores/auth@/stores/layout
diff --git a/frontend/src/components/files/ListingItem.vue b/frontend/src/components/files/ListingItem.vue
index 11e4ab27..6e3dfc18 100644
--- a/frontend/src/components/files/ListingItem.vue
+++ b/frontend/src/components/files/ListingItem.vue
@@ -257,4 +257,3 @@ export default {
},
};
-@/stores/auth@/stores/file@/stores/layout
diff --git a/frontend/src/components/header/Action.vue b/frontend/src/components/header/Action.vue
index b74f31f7..4d152516 100644
--- a/frontend/src/components/header/Action.vue
+++ b/frontend/src/components/header/Action.vue
@@ -27,4 +27,3 @@ export default {
-@/stores/layout
diff --git a/frontend/src/components/header/HeaderBar.vue b/frontend/src/components/header/HeaderBar.vue
index 55b3d115..210080b3 100644
--- a/frontend/src/components/header/HeaderBar.vue
+++ b/frontend/src/components/header/HeaderBar.vue
@@ -56,4 +56,3 @@ export default {
-@/stores/layout
diff --git a/frontend/src/components/prompts/Copy.vue b/frontend/src/components/prompts/Copy.vue
index b668ace0..b8119618 100644
--- a/frontend/src/components/prompts/Copy.vue
+++ b/frontend/src/components/prompts/Copy.vue
@@ -123,4 +123,3 @@ export default {
},
};
-@/stores/file@/stores/layout
diff --git a/frontend/src/components/prompts/Delete.vue b/frontend/src/components/prompts/Delete.vue
index f5967c76..886591fd 100644
--- a/frontend/src/components/prompts/Delete.vue
+++ b/frontend/src/components/prompts/Delete.vue
@@ -38,6 +38,7 @@ import { useLayoutStore } from "@/stores/layout";
export default {
name: "delete",
+ inject: ["$showError"],
computed: {
...mapState(useFileStore, [
"isListing",
@@ -86,4 +87,3 @@ export default {
},
};
-@/stores/file@/stores/layout
diff --git a/frontend/src/components/prompts/Download.vue b/frontend/src/components/prompts/Download.vue
index d374bebf..a1fc2fd6 100644
--- a/frontend/src/components/prompts/Download.vue
+++ b/frontend/src/components/prompts/Download.vue
@@ -42,4 +42,3 @@ export default {
computed: mapState(useLayoutStore, ["showConfirm"]),
};
-@/stores/layout
diff --git a/frontend/src/components/prompts/FileList.vue b/frontend/src/components/prompts/FileList.vue
index 8383def0..ebf3ab71 100644
--- a/frontend/src/components/prompts/FileList.vue
+++ b/frontend/src/components/prompts/FileList.vue
@@ -140,4 +140,3 @@ export default {
},
};
-@/stores/auth@/stores/file
diff --git a/frontend/src/components/prompts/Help.vue b/frontend/src/components/prompts/Help.vue
index 5fa0e32e..10075959 100644
--- a/frontend/src/components/prompts/Help.vue
+++ b/frontend/src/components/prompts/Help.vue
@@ -43,4 +43,3 @@ export default {
},
};
-@/stores/layout
diff --git a/frontend/src/components/prompts/Info.vue b/frontend/src/components/prompts/Info.vue
index 0fee9746..6925b11a 100644
--- a/frontend/src/components/prompts/Info.vue
+++ b/frontend/src/components/prompts/Info.vue
@@ -157,4 +157,3 @@ export default {
},
};
-@/stores/file@/stores/layout
diff --git a/frontend/src/components/prompts/Move.vue b/frontend/src/components/prompts/Move.vue
index 477b7a59..bc563df4 100644
--- a/frontend/src/components/prompts/Move.vue
+++ b/frontend/src/components/prompts/Move.vue
@@ -105,4 +105,3 @@ export default {
},
};
-@/stores/file@/stores/layout
diff --git a/frontend/src/components/prompts/NewDir.vue b/frontend/src/components/prompts/NewDir.vue
index 7bbb5a7d..0e172ca7 100644
--- a/frontend/src/components/prompts/NewDir.vue
+++ b/frontend/src/components/prompts/NewDir.vue
@@ -51,6 +51,7 @@ export default {
name: "",
};
},
+ inject: ["$showError"],
computed: {
...mapState(useFileStore, ["isFiles", "isListing"]),
},
@@ -72,7 +73,7 @@ export default {
try {
await api.post(uri);
- this.$router.push({ path: uri });
+ this.$router.push({ path: `${uri}` });
} catch (e) {
this.$showError(e);
}
@@ -82,4 +83,3 @@ export default {
},
};
-@/stores/file@/stores/layout
diff --git a/frontend/src/components/prompts/NewFile.vue b/frontend/src/components/prompts/NewFile.vue
index 06049bff..fcd67822 100644
--- a/frontend/src/components/prompts/NewFile.vue
+++ b/frontend/src/components/prompts/NewFile.vue
@@ -51,6 +51,7 @@ export default {
name: "",
};
},
+ inject: ["$showError"],
computed: {
...mapState(useFileStore, ["isFiles", "isListing"]),
},
@@ -82,4 +83,3 @@ export default {
},
};
-@/stores/file@/stores/layout
diff --git a/frontend/src/components/prompts/Prompts.vue b/frontend/src/components/prompts/Prompts.vue
index f9e94966..88e2e921 100644
--- a/frontend/src/components/prompts/Prompts.vue
+++ b/frontend/src/components/prompts/Prompts.vue
@@ -115,4 +115,3 @@ export default {
},
};
-@/stores/layout
diff --git a/frontend/src/components/prompts/Rename.vue b/frontend/src/components/prompts/Rename.vue
index 334a6493..140ce35f 100644
--- a/frontend/src/components/prompts/Rename.vue
+++ b/frontend/src/components/prompts/Rename.vue
@@ -113,4 +113,3 @@ export default {
},
};
-@/stores/file@/stores/layout
diff --git a/frontend/src/components/prompts/Replace.vue b/frontend/src/components/prompts/Replace.vue
index d3e9391b..a08d3aec 100644
--- a/frontend/src/components/prompts/Replace.vue
+++ b/frontend/src/components/prompts/Replace.vue
@@ -51,4 +51,3 @@ export default {
},
};
-@/stores/layout
diff --git a/frontend/src/components/prompts/ReplaceRename.vue b/frontend/src/components/prompts/ReplaceRename.vue
index 8913d9c2..509386b5 100644
--- a/frontend/src/components/prompts/ReplaceRename.vue
+++ b/frontend/src/components/prompts/ReplaceRename.vue
@@ -51,4 +51,3 @@ export default {
},
};
-@/stores/layout
diff --git a/frontend/src/components/prompts/Share.vue b/frontend/src/components/prompts/Share.vue
index 8ce28388..aa5df675 100644
--- a/frontend/src/components/prompts/Share.vue
+++ b/frontend/src/components/prompts/Share.vue
@@ -257,4 +257,3 @@ export default {
},
};
-@/stores/file@/stores/layout
diff --git a/frontend/src/components/prompts/ShareDelete.vue b/frontend/src/components/prompts/ShareDelete.vue
index ed158d3e..f6fe1152 100644
--- a/frontend/src/components/prompts/ShareDelete.vue
+++ b/frontend/src/components/prompts/ShareDelete.vue
@@ -41,4 +41,3 @@ export default {
},
};
-@/stores/layout
diff --git a/frontend/src/components/prompts/UploadFiles.vue b/frontend/src/components/prompts/UploadFiles.vue
index 49a9fb25..c1e3fb8a 100644
--- a/frontend/src/components/prompts/UploadFiles.vue
+++ b/frontend/src/components/prompts/UploadFiles.vue
@@ -62,4 +62,3 @@ export default {
},
};
-@/stores/upload
diff --git a/frontend/src/main.js b/frontend/src/main.js
index f570746b..06cf9840 100644
--- a/frontend/src/main.js
+++ b/frontend/src/main.js
@@ -1,5 +1,7 @@
import "whatwg-fetch";
import cssVars from "css-vars-ponyfill";
+import Noty from "noty";
+import { disableExternal } from "@/utils/constants";
import { createApp } from "vue";
import VueLazyload from "vue-lazyload";
import createPinia from "@/stores";
@@ -33,4 +35,53 @@ app.directive("focus", {
},
});
+const notyDefault = {
+ type: "info",
+ layout: "bottomRight",
+ timeout: 1000,
+ progressBar: true,
+};
+
+app.provide("$noty", (opts) => {
+ new Noty(Object.assign({}, notyDefault, opts)).show();
+});
+
+app.provide("$showSuccess", (message) => {
+ new Noty(
+ Object.assign({}, notyDefault, {
+ text: message,
+ type: "success",
+ })
+ ).show();
+});
+
+app.provide("$showError", (error, displayReport = true) => {
+ let btns = [
+ Noty.button(i18n.global.t("buttons.close"), "", function () {
+ n.close();
+ }),
+ ];
+
+ if (!disableExternal && displayReport) {
+ btns.unshift(
+ Noty.button(i18n.global.t("buttons.reportIssue"), "", function () {
+ window.open(
+ "https://github.com/filebrowser/filebrowser/issues/new/choose"
+ );
+ })
+ );
+ }
+
+ let n = new Noty(
+ Object.assign({}, notyDefault, {
+ text: error.message || error,
+ type: "error",
+ timeout: null,
+ buttons: btns,
+ })
+ );
+
+ n.show();
+});
+
router.isReady().then(() => app.mount("#app"));
diff --git a/frontend/src/router/index.js b/frontend/src/router/index.js
index 972d1a48..e9cc03da 100644
--- a/frontend/src/router/index.js
+++ b/frontend/src/router/index.js
@@ -142,15 +142,9 @@ const routes = [
showHeader: true,
},
},
- // {
- // path: "/files",
- // redirect: {
- // path: "/files/",
- // },
- // },
{
path: "/:catchAll(.*)*",
- redirect: (to) => `/files${to.params.catchAll}`,
+ redirect: (to) => `/files/${[...to.params.catchAll].join("/")}`,
},
];
diff --git a/frontend/src/stores/file.js b/frontend/src/stores/file.js
index 74826889..b70a1126 100644
--- a/frontend/src/stores/file.js
+++ b/frontend/src/stores/file.js
@@ -1,7 +1,6 @@
import { defineStore } from "pinia";
import { useRouterStore } from "./router";
-// import { useAuthPreferencesStore } from "./auth-preferences";
-// import { useAuthEmailStore } from "./auth-email";
+import { useLayoutStore } from "./layout";
export const useFileStore = defineStore("file", {
// convert to a function
@@ -13,17 +12,17 @@ export const useFileStore = defineStore("file", {
multiple: false,
}),
getters: {
- // user and jwt getter removed, no longer needed
selectedCount: (state) => state.selected.length,
route: () => {
const routerStore = useRouterStore();
return routerStore.router.currentRoute;
},
- isFiles(state) {
- return !state.loading && this.route.name === "Files";
+ isFiles: (state) => {
+ const layoutStore = useLayoutStore();
+ return !layoutStore.loading && state.route._value.name === "Files";
},
- isListing(state) {
- return this.isFiles && state.req.isDir;
+ isListing: (state) => {
+ return state.isFiles && state.req.isDir;
},
},
actions: {
diff --git a/frontend/src/views/Files.vue b/frontend/src/views/Files.vue
index 189bb6b0..f503142a 100644
--- a/frontend/src/views/Files.vue
+++ b/frontend/src/views/Files.vue
@@ -123,7 +123,7 @@ export default {
if (
clean(res.path) !==
- clean(`/${this.$route.params.path}`).replace(/,/g, "/")
+ clean(`/${[...this.$route.params.path].join("/")}`)
) {
throw new Error("Data Mismatch!");
}
@@ -146,4 +146,3 @@ export default {
},
};
-@/stores/file@/stores/layout
diff --git a/frontend/src/views/Layout.vue b/frontend/src/views/Layout.vue
index 76e40d7a..1e3c2569 100644
--- a/frontend/src/views/Layout.vue
+++ b/frontend/src/views/Layout.vue
@@ -52,4 +52,3 @@ export default {
},
};
-@/stores/auth@/stores/layout@/stores/file
diff --git a/frontend/src/views/Settings.vue b/frontend/src/views/Settings.vue
index 37b6aa51..c1644346 100644
--- a/frontend/src/views/Settings.vue
+++ b/frontend/src/views/Settings.vue
@@ -66,4 +66,3 @@ export default {
},
};
-@/stores/auth@/stores/file
diff --git a/frontend/src/views/Share.vue b/frontend/src/views/Share.vue
index d3ab0d34..8c97f151 100644
--- a/frontend/src/views/Share.vue
+++ b/frontend/src/views/Share.vue
@@ -360,4 +360,3 @@ export default {
},
};
-@/stores/file@/stores/layout
diff --git a/frontend/src/views/files/Editor.vue b/frontend/src/views/files/Editor.vue
index 80d0bb79..1a8e04a0 100644
--- a/frontend/src/views/files/Editor.vue
+++ b/frontend/src/views/files/Editor.vue
@@ -146,4 +146,3 @@ export default {
},
};
-@/stores/auth@/stores/file
diff --git a/frontend/src/views/files/Listing.vue b/frontend/src/views/files/Listing.vue
index 10f94aad..c268def6 100644
--- a/frontend/src/views/files/Listing.vue
+++ b/frontend/src/views/files/Listing.vue
@@ -905,4 +905,3 @@ export default {
},
};
-@/stores/auth@/stores/clipboard@/stores/file@/stores/layout
diff --git a/frontend/src/views/files/Preview.vue b/frontend/src/views/files/Preview.vue
index a5f494a6..b097bda0 100644
--- a/frontend/src/views/files/Preview.vue
+++ b/frontend/src/views/files/Preview.vue
@@ -360,4 +360,3 @@ export default {
},
};
-@/stores/auth@/stores/file@/stores/layout
diff --git a/frontend/src/views/settings/Global.vue b/frontend/src/views/settings/Global.vue
index f5f491ce..eb006c39 100644
--- a/frontend/src/views/settings/Global.vue
+++ b/frontend/src/views/settings/Global.vue
@@ -368,4 +368,3 @@ export default {
},
};
-@/stores/auth@/stores/file
diff --git a/frontend/src/views/settings/Profile.vue b/frontend/src/views/settings/Profile.vue
index 502ab41f..256fbeb5 100644
--- a/frontend/src/views/settings/Profile.vue
+++ b/frontend/src/views/settings/Profile.vue
@@ -168,4 +168,3 @@ export default {
},
};
-@/stores/auth@/stores/file
diff --git a/frontend/src/views/settings/Shares.vue b/frontend/src/views/settings/Shares.vue
index 53a2943f..1f149e79 100644
--- a/frontend/src/views/settings/Shares.vue
+++ b/frontend/src/views/settings/Shares.vue
@@ -143,4 +143,3 @@ export default {
},
};
-@/stores/auth@/stores/file
diff --git a/frontend/src/views/settings/User.vue b/frontend/src/views/settings/User.vue
index f4aa3d1d..d8fe8a2e 100644
--- a/frontend/src/views/settings/User.vue
+++ b/frontend/src/views/settings/User.vue
@@ -173,4 +173,3 @@ export default {
},
};
-@/stores/auth@/stores/file@/stores/layout
diff --git a/frontend/src/views/settings/Users.vue b/frontend/src/views/settings/Users.vue
index ccab7883..a60494f0 100644
--- a/frontend/src/views/settings/Users.vue
+++ b/frontend/src/views/settings/Users.vue
@@ -74,4 +74,3 @@ export default {
},
};
-@/stores/file