<pre style='margin:0'>
Zhenfu Shi (i0ntempest) pushed a commit to branch master
in repository macports-ports.
</pre>
<p><a href="https://github.com/macports/macports-ports/commit/e0351e0a12bed4529367be893e6cf1ac33e5ca1b">https://github.com/macports/macports-ports/commit/e0351e0a12bed4529367be893e6cf1ac33e5ca1b</a></p>
<pre style="white-space: pre; background: #F8F8F8">The following commit(s) were added to refs/heads/master by this push:
<span style='display:block; white-space:pre;color:#404040;'> new e0351e0a12b filebrowser: backport more bug fix patches
</span>e0351e0a12b is described below
<span style='display:block; white-space:pre;color:#808000;'>commit e0351e0a12bed4529367be893e6cf1ac33e5ca1b
</span>Author: i0ntempest <i0ntempest@i0ntempest.com>
AuthorDate: Sat Jan 25 02:24:53 2025 +0800
<span style='display:block; white-space:pre;color:#404040;'> filebrowser: backport more bug fix patches
</span>---
net/filebrowser/Portfile | 9 +-
net/filebrowser/files/patch-3676.diff | 47 +++++
...h-d1c84a84123c77dede05c023b3697a432b56122c.diff | 199 +++++++++++++++++++++
3 files changed, 251 insertions(+), 4 deletions(-)
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/net/filebrowser/Portfile b/net/filebrowser/Portfile
</span><span style='display:block; white-space:pre;color:#808080;'>index 25085b44d9a..bdb9e44b2f6 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/net/filebrowser/Portfile
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/net/filebrowser/Portfile
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -6,7 +6,7 @@ PortGroup golang 1.0
</span> go.setup github.com/filebrowser/filebrowser 2.31.2 v
set git-commit 129a4fd
# This line is for displaying commit in CLI only
<span style='display:block; white-space:pre;background:#ffe0e0;'>-revision 2
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+revision 3
</span> categories net sysutils
maintainers {i0ntempest @i0ntempest} openmaintainer
license Apache-2
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -24,9 +24,10 @@ checksums ${distname}${extract.suffix} \
</span> sha256 affa66dfd9de8af359a6f242410d1327ca8acf498dead6b3066f6a766b97679a \
size 3828081
<span style='display:block; white-space:pre;background:#ffe0e0;'>-# Command runner fix
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-# https://github.com/filebrowser/filebrowser/pull/3676
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-patchfiles-append patch-3676.diff
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# Command runner fixes: https://github.com/filebrowser/filebrowser/pull/3676
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# Pop up prompt fixes: https://github.com/filebrowser/filebrowser/commit/d1c84a84123c77dede05c023b3697a432b56122c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+patchfiles-append patch-3676.diff \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ patch-d1c84a84123c77dede05c023b3697a432b56122c.diff
</span> patch.args -p1
go.vendors gopkg.in/yaml.v3 \
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/net/filebrowser/files/patch-3676.diff b/net/filebrowser/files/patch-3676.diff
</span><span style='display:block; white-space:pre;color:#808080;'>index 02d835a419b..9ec18c47c80 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/net/filebrowser/files/patch-3676.diff
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/net/filebrowser/files/patch-3676.diff
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1,3 +1,16 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/cmd/utils.go b/cmd/utils.go
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 78f48d1307..a8ab19361a 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- a/cmd/utils.go
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/cmd/utils.go
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -194,7 +194,7 @@ func convertCmdStrToCmdArray(cmd string) []string {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ var cmdArray []string
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ trimmedCmdStr := strings.TrimSpace(cmd)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if trimmedCmdStr != "" {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- cmdArray = strings.Split(trimmedCmdStr, " ")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ cmdArray = strings.Split(trimmedCmdStr, ",")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return cmdArray
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span> diff --git a/http/tus_handlers.go b/http/tus_handlers.go
index 7a3254ae72..773b3d0d88 100644
--- a/http/tus_handlers.go
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -30,6 +43,40 @@ index 7a3254ae72..773b3d0d88 100644
</span> return http.StatusNoContent, nil
})
}
<span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/runner/parser.go b/runner/parser.go
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 6fd64a4b64..8161a6e543 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- a/runner/parser.go
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/runner/parser.go
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -8,7 +8,7 @@ import (
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ // ParseCommand parses the command taking in account if the current
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ // instance uses a shell to run the commands or just calls the binary
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-// directyly.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++// directly.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ func ParseCommand(s *settings.Settings, raw string) ([]string, error) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ var command []string
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -26,7 +26,19 @@ func ParseCommand(s *settings.Settings, raw string) ([]string, error) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ command = append(command, cmd)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ command = append(command, args...)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- command = append(s.Shell, raw) //nolint:gocritic
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ cmd, args, err := SplitCommandAndArgs(s.Shell[0])
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if err != nil {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return nil, err
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ _, err = exec.LookPath(cmd)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if err != nil {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return nil, err
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ command = append(command, cmd)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ command = append(command, args...)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ command = append(command, raw)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return command, nil
</span> diff --git a/runner/runner.go b/runner/runner.go
index 2dbafa5cd1..829e591020 100644
--- a/runner/runner.go
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/net/filebrowser/files/patch-d1c84a84123c77dede05c023b3697a432b56122c.diff b/net/filebrowser/files/patch-d1c84a84123c77dede05c023b3697a432b56122c.diff
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 00000000000..e274c83d2f6
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/net/filebrowser/files/patch-d1c84a84123c77dede05c023b3697a432b56122c.diff
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,199 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/frontend/src/api/files.ts b/frontend/src/api/files.ts
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index a36de03f78..928f528298 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- a/frontend/src/api/files.ts
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/frontend/src/api/files.ts
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1,7 +1,8 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-import { createURL, fetchURL, removePrefix } from "./utils";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-import { baseURL } from "@/utils/constants";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ import { useAuthStore } from "@/stores/auth";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++import { useLayoutStore } from "@/stores/layout";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++import { baseURL } from "@/utils/constants";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ import { upload as postTus, useTus } from "./tus";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++import { createURL, fetchURL, removePrefix } from "./utils";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ export async function fetch(url: string) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ url = removePrefix(url);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -156,6 +157,7 @@ function moveCopy(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ overwrite = false,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ rename = false
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ const layoutStore = useLayoutStore();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ const promises = [];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ for (const item of items) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -166,7 +168,7 @@ function moveCopy(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }&destination=${to}&override=${overwrite}&rename=${rename}`;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ promises.push(resourceAction(url, "PATCH"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ layoutStore.closeHovers();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return Promise.all(promises);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/frontend/src/components/Sidebar.vue b/frontend/src/components/Sidebar.vue
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index d88d2d2f9d..543818ad70 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- a/frontend/src/components/Sidebar.vue
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/frontend/src/components/Sidebar.vue
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -101,7 +101,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ href="https://github.com/filebrowser/filebrowser"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ >File Browser</a
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ >
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- <span> {{ ' ' }} {{ version }}</span>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ <span> {{ " " }} {{ version }}</span>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ </span>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ <span>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ <a @click="help">{{ $t("sidebar.help") }}</a>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/frontend/src/components/prompts/Prompts.vue b/frontend/src/components/prompts/Prompts.vue
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 4ecde79428..71e4e753df 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- a/frontend/src/components/prompts/Prompts.vue
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/frontend/src/components/prompts/Prompts.vue
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -3,7 +3,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ </template>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ <script setup lang="ts">
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-import { ref, watch } from "vue";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++import { watch } from "vue";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ import { ModalsContainer, useModal } from "vue-final-modal";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ import { storeToRefs } from "pinia";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ import { useLayoutStore } from "@/stores/layout";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -30,8 +30,6 @@ const layoutStore = useLayoutStore();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ const { currentPromptName } = storeToRefs(layoutStore);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-const closeModal = ref<() => Promise<string>>();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ const components = new Map<string, any>([
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ["info", Info],
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ["help", Help],
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -52,11 +50,6 @@ const components = new Map<string, any>([
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ watch(currentPromptName, (newValue) => {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- if (closeModal.value) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- closeModal.value();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- closeModal.value = undefined;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ const modal = components.get(newValue!);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (!modal) return;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -67,7 +60,7 @@ watch(currentPromptName, (newValue) => {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ },
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ });
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- closeModal.value = close;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ layoutStore.setCloseOnPrompt(close, newValue!);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ open();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ });
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/frontend/src/components/prompts/Upload.vue b/frontend/src/components/prompts/Upload.vue
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index bb8ec40ea4..538e84b5d1 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- a/frontend/src/components/prompts/Upload.vue
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/frontend/src/components/prompts/Upload.vue
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -48,8 +48,6 @@ const layoutStore = useLayoutStore();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ // TODO: this is a copy of the same function in FileListing.vue
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ const uploadInput = (event: Event) => {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- layoutStore.closeHovers();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ let files = (event.currentTarget as HTMLInputElement)?.files;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (files === null) return;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/frontend/src/stores/layout.ts b/frontend/src/stores/layout.ts
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 1911643a19..faf8bca721 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- a/frontend/src/stores/layout.ts
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/frontend/src/stores/layout.ts
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -29,6 +29,12 @@ export const useLayoutStore = defineStore("layout", {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ toggleShell() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ this.showShell = !this.showShell;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ },
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ setCloseOnPrompt(closeFunction: () => Promise<string>, onPrompt: string) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ const prompt = this.prompts.find((prompt) => prompt.prompt === onPrompt);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (prompt) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ prompt.close = closeFunction;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ },
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ showHover(value: PopupProps | string) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (typeof value !== "object") {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ this.prompts.push({
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -36,6 +42,7 @@ export const useLayoutStore = defineStore("layout", {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ confirm: null,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ action: undefined,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ props: null,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ close: null,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ });
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -45,6 +52,7 @@ export const useLayoutStore = defineStore("layout", {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ confirm: value?.confirm,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ action: value?.action,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ props: value?.props,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ close: value?.close,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ });
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ },
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ showError() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -53,6 +61,7 @@ export const useLayoutStore = defineStore("layout", {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ confirm: null,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ action: undefined,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ props: null,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ close: null,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ });
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ },
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ showSuccess() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -61,10 +70,11 @@ export const useLayoutStore = defineStore("layout", {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ confirm: null,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ action: undefined,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ props: null,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ close: null,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ });
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ },
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ closeHovers() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- this.prompts.pop();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ this.prompts.shift()?.close?.();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ },
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ // easily reset state using `$reset`
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ clearLayout() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/frontend/src/types/layout.d.ts b/frontend/src/types/layout.d.ts
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index fa05a48496..b625cc070d 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- a/frontend/src/types/layout.d.ts
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/frontend/src/types/layout.d.ts
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -3,6 +3,7 @@ interface PopupProps {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ confirm?: any;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ action?: PopupAction;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ props?: any;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ close?: (() => Promise<string>) | null;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ type PopupAction = (e: Event) => void;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/frontend/src/utils/upload.ts b/frontend/src/utils/upload.ts
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index e7ce8becbe..cdd974e83c 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- a/frontend/src/utils/upload.ts
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/frontend/src/utils/upload.ts
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1,3 +1,4 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++import { useLayoutStore } from "@/stores/layout";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ import { useUploadStore } from "@/stores/upload";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ import url from "@/utils/url";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -126,6 +127,9 @@ export function handleFiles(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ overwrite = false
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ const uploadStore = useUploadStore();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ const layoutStore = useLayoutStore();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ layoutStore.closeHovers();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ for (const file of files) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ const id = uploadStore.id;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/frontend/src/views/files/FileListing.vue b/frontend/src/views/files/FileListing.vue
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 72171f4e06..ec75aec5aa 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- a/frontend/src/views/files/FileListing.vue
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/frontend/src/views/files/FileListing.vue
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -753,8 +753,6 @@ const drop = async (event: DragEvent) => {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ };
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ const uploadInput = (event: Event) => {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- layoutStore.closeHovers();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ let files = (event.currentTarget as HTMLInputElement)?.files;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (files === null) return;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span></pre><pre style='margin:0'>
</pre>