<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>