Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
7f8b920
chore(deps): update actions/upload-pages-artifact action to v5 (#5913)
renovate[bot] Apr 18, 2026
da6b7ac
chore(deps): update all non-major dependencies (#5912)
renovate[bot] Apr 18, 2026
41b801d
fix: correct environment variable in compose.yaml (#5910)
savef Apr 18, 2026
9f4288b
docs: Update documentation links in Global.vue (#5905)
ShortTimeNoSee Apr 18, 2026
7bd27f5
chore: sync translations (#5901)
transifex-integration[bot] Apr 18, 2026
74917c8
chore(deps): update all non-major dependencies (#5915)
renovate[bot] Apr 28, 2026
a1a7ac4
chore: update translations (#5918)
transifex-integration[bot] Apr 28, 2026
4edf425
chore(i18n): add a translation for disk usage (#5916)
hreczkosiej Apr 28, 2026
d236f1c
chore(deps): update dependency marked to v18 (#5897)
renovate[bot] Apr 28, 2026
e2bdf6f
chore: update translations
transifex-integration[bot] May 5, 2026
1f22fe6
chore(deps): update all non-major dependencies (#5926)
renovate[bot] May 5, 2026
f4e1485
fix: Fix conflict modal and add a resume transfert option (#5884)
geourjoa May 5, 2026
ca5e249
chore(release): 2.63.3
hacdias May 5, 2026
cd935d0
merge upstream/master into oadp-dev
oadp-maintainers May 5, 2026
9597227
UPSTREAM: <carry> Add disableUserProfile branding option
mpryc Oct 18, 2025
cb85f48
UPSTREAM: <carry> Add defaultLoginUser branding option
mpryc Oct 18, 2025
8e66838
UPSTREAM: <carry> Disable delete and rename from Help
mpryc Oct 19, 2025
cbeee38
UPSTREAM: <carry> Containerfile to be used with UBI
mpryc Nov 12, 2025
1ca3dd4
UPSTREAM: <carry> Add OWNERS file
mpryc Feb 5, 2026
c54a98c
UPSTREAM: <carry> Fix broken rebase of branding options
mpryc Feb 9, 2026
e5e87f2
UPSTREAM: <carry>: fix github actions
mpryc Apr 14, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/docs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ jobs:
- name: Build site
run: task docs
- name: Upload static files as artifact
uses: actions/upload-pages-artifact@v4
uses: actions/upload-pages-artifact@v5
with:
path: www/public
- name: Deploy to GitHub Pages
Expand Down
8 changes: 8 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,14 @@

All notable changes to this project will be documented in this file. See [commit-and-tag-version](https://github.com/absolute-version/commit-and-tag-version) for commit guidelines.

## [2.63.3](https://github.com/filebrowser/filebrowser/compare/v2.63.2...v2.63.3) (2026-05-05)


### Bug Fixes

* correct environment variable in compose.yaml ([#5910](https://github.com/filebrowser/filebrowser/issues/5910)) ([41b801d](https://github.com/filebrowser/filebrowser/commit/41b801d30c736c8ca863e2be6aece7d99e92129e))
* Fix conflict modal and add a resume transfert option ([#5884](https://github.com/filebrowser/filebrowser/issues/5884)) ([f4e1485](https://github.com/filebrowser/filebrowser/commit/f4e148523e0dc9242081831b53544396f995c611))

## [2.63.2](https://github.com/filebrowser/filebrowser/compare/v2.63.1...v2.63.2) (2026-04-11)


Expand Down
2 changes: 1 addition & 1 deletion compose.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ services:
volumes:
- filebrowser:/flux/vault
environment:
- REDIS_CACHE_URL=redis://default:filebrowser@redis:6379 # Use rediss:// for ssl
- FB_REDIS_CACHE_URL=redis://default:filebrowser@redis:6379 # Use rediss:// for ssl

redis:
container_name: redis
Expand Down
4 changes: 2 additions & 2 deletions frontend/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@
"js-base64": "^3.7.7",
"jwt-decode": "^4.0.0",
"lodash-es": "^4.17.21",
"marked": "^17.0.0",
"marked": "^18.0.0",
"marked-katex-extension": "^5.1.6",
"material-icons": "^1.13.14",
"normalize.css": "^8.0.1",
Expand Down Expand Up @@ -74,5 +74,5 @@
"vitest": "^4.1.0",
"vue-tsc": "^3.1.3"
},
"packageManager": "pnpm@10.33.0+sha512.10568bb4a6afb58c9eb3630da90cc9516417abebd3fabbe6739f0ae795728da1491e9db5a544c76ad8eb7570f5c4bb3d6c637b2cb41bfdcdb47fa823c8649319"
"packageManager": "pnpm@10.33.3+sha512.a19744364a7e248b92657a4ca5973f9354d21caf982579674b1c539f32c7420c47138ad8b1254df07aba9bc782d9b3029e3db34d5dbff974326eb74dac8ff489"
}
1,149 changes: 623 additions & 526 deletions frontend/pnpm-lock.yaml

Large diffs are not rendered by default.

6 changes: 6 additions & 0 deletions frontend/src/api/files.ts
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,12 @@ export async function fetch(url: string, signal?: AbortSignal) {
return data;
}

export async function fetchAll(url: string): Promise<RecursiveEntry[]> {
url = removePrefix(url);
const res = await fetchURL(`/api/resources/recursive${url}`, {});
return (await res.json()) as RecursiveEntry[];
}

async function resourceAction(url: string, method: ApiMethod, content?: any) {
url = removePrefix(url);

Expand Down
2 changes: 1 addition & 1 deletion frontend/src/components/Sidebar.vue
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
<div v-show="active" @click="closeHovers" class="overlay"></div>
<nav :class="{ active }">
<template v-if="isLoggedIn">
<button v-if="!disableUserProfile" @click="toAccountSettings" class="action">

Check warning on line 5 in frontend/src/components/Sidebar.vue

View workflow job for this annotation

GitHub Actions / Lint Frontend

Replace `·v-if="!disableUserProfile"·@click="toAccountSettings"·class="action"` with `⏎········v-if="!disableUserProfile"⏎········@click="toAccountSettings"⏎········class="action"⏎······`
<i class="material-icons">person</i>
<span>{{ user.username }}</span>
</button>
Expand Down Expand Up @@ -92,7 +92,7 @@
>
<progress-bar :val="usage.usedPercentage" size="small"></progress-bar>
<br />
{{ usage.used }} of {{ usage.total }} used
{{ $t("sidebar.diskUsed", { used: usage.used, total: usage.total }) }}
</div>

<p class="credits">
Expand Down
3 changes: 1 addition & 2 deletions frontend/src/components/files/ListingItem.vue
Original file line number Diff line number Diff line change
Expand Up @@ -191,7 +191,6 @@ const drop = async (event: Event) => {
return;
}
const path = el.__vue__.url;
const baseItems = (await api.fetch(path)).items;

const action = (overwrite?: boolean, rename?: boolean) => {
const action =
Expand All @@ -205,7 +204,7 @@ const drop = async (event: Event) => {
.catch($showError);
};

const conflict = upload.checkConflict(items, baseItems);
const conflict = await upload.checkConflict(items, path);

if (conflict.length > 0) {
layoutStore.showHover({
Expand Down
3 changes: 1 addition & 2 deletions frontend/src/components/prompts/Copy.vue
Original file line number Diff line number Diff line change
Expand Up @@ -122,8 +122,7 @@ export default {
});
};

const dstItems = (await api.fetch(this.dest)).items;
const conflict = upload.checkConflict(items, dstItems);
const conflict = upload.checkConflict(items, this.dest);

if (conflict.length > 0) {
this.showHover({
Expand Down
3 changes: 1 addition & 2 deletions frontend/src/components/prompts/Move.vue
Original file line number Diff line number Diff line change
Expand Up @@ -122,8 +122,7 @@ export default {
});
};

const dstItems = (await api.fetch(this.dest)).items;
const conflict = upload.checkConflict(items, dstItems);
const conflict = upload.checkConflict(items, this.dest);

if (conflict.length > 0) {
this.showHover({
Expand Down
59 changes: 59 additions & 0 deletions frontend/src/components/prompts/ResolveConflict.vue
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,16 @@
<i class="material-icons">undo</i>
{{ $t("buttons.skipAll") }}
</button>
<button @click="(e) => resume(e)">
<i class="material-icons">replay</i>
{{ $t("buttons.resumeTransfer") }}
<span class="info-tooltip" @click.stop="() => {}">
<i class="material-icons info-icon">info_outline</i>
<span class="info-tooltip-text">
{{ $t("buttons.resumeTransferTooltip") }}
</span>
</span>
</button>
<button @click="personalized = true">
<i class="material-icons">checklist</i>
{{ $t("buttons.singleDecision") }}
Expand Down Expand Up @@ -194,6 +204,17 @@ const humanTime = (modified: string | number | undefined) => {
return dayjs(modified).format("L LT");
};

const resume = (event: Event) => {
conflict.value.forEach((item) => {
if (item.isSmallerOnServer) {
item.checked = ["origin"];
} else {
item.checked = ["dest"];
}
});
currentPrompt?.confirm(event, conflict.value);
};

const resolve = (event: Event, result: Array<"origin" | "dest">) => {
for (const item of conflict.value) {
item.checked = result;
Expand Down Expand Up @@ -304,4 +325,42 @@ const toogleCheckAll = (e: Event) => {
.result-buttons > button:hover {
border: solid 1px var(--icon-blue);
}

.info-tooltip {
position: relative;
display: inline-flex;
align-items: center;
}

.info-icon {
font-size: 1rem;
color: var(--icon-blue);
cursor: help;
}

.info-tooltip-text {
visibility: hidden;
opacity: 0;
position: absolute;
bottom: 100%;
left: 50%;
transform: translateX(-50%);
background-color: var(--surfacePrimary, #333);
color: var(--textPrimary, #fff);
font-size: 0.75rem;
line-height: 1.3;
padding: 0.5rem 0.75rem;
border-radius: 0.25rem;
width: 220px;
text-align: center;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2);
transition: opacity 200ms ease-in-out;
z-index: 10;
pointer-events: none;
}

.info-tooltip:hover .info-tooltip-text {
visibility: visible;
opacity: 1;
}
</style>
7 changes: 3 additions & 4 deletions frontend/src/components/prompts/Upload.vue
Original file line number Diff line number Diff line change
Expand Up @@ -35,19 +35,17 @@
<script setup lang="ts">
import { useI18n } from "vue-i18n";
import { useRoute } from "vue-router";
import { useFileStore } from "@/stores/file";
import { useLayoutStore } from "@/stores/layout";

import * as upload from "@/utils/upload";

const { t } = useI18n();
const route = useRoute();

const fileStore = useFileStore();
const layoutStore = useLayoutStore();

// TODO: this is a copy of the same function in FileListing.vue
const uploadInput = (event: Event) => {
const uploadInput = async (event: Event) => {
const files = (event.currentTarget as HTMLInputElement)?.files;
if (files === null) return;

Expand All @@ -67,7 +65,8 @@ const uploadInput = (event: Event) => {
}

const path = route.path.endsWith("/") ? route.path : route.path + "/";
const conflict = upload.checkConflict(uploadFiles, fileStore.req!.items);

const conflict = await upload.checkConflict(uploadFiles, path);

if (conflict.length > 0) {
layoutStore.showHover({
Expand Down
1 change: 1 addition & 0 deletions frontend/src/i18n/de.json
Original file line number Diff line number Diff line change
Expand Up @@ -281,6 +281,7 @@
"currentPassword": "Dein aktuelles Passwort"
},
"sidebar": {
"diskUsed": "{used} of {total} used",
"help": "Hilfe",
"hugoNew": "Hugo Neu",
"login": "Anmelden",
Expand Down
3 changes: 3 additions & 0 deletions frontend/src/i18n/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,8 @@
"rename": "Rename",
"replace": "Replace",
"reportIssue": "Report Issue",
"resumeTransfer": "Resume previous transfert",
"resumeTransferTooltip": "Skip all conflicting files, except the ones that are smaller on the server as we suppose that their transfert has been interrupted.",
"save": "Save",
"schedule": "Schedule",
"search": "Search",
Expand Down Expand Up @@ -282,6 +284,7 @@
"currentPassword": "Your Current Password"
},
"sidebar": {
"diskUsed": "{used} of {total} used",
"help": "Help",
"hugoNew": "Hugo New",
"login": "Login",
Expand Down
5 changes: 4 additions & 1 deletion frontend/src/i18n/fr.json
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,8 @@
"rename": "Renommer",
"replace": "Remplacer",
"reportIssue": "Signaler un problème",
"resumeTransfer": "Reprendre un transfert précedement interrompu",
"resumeTransferTooltip": "Ignorer tous les fichiers en conflit, sauf ceux qui sont plus petits sur le serveur, car nous supposons que leur transfert a été interrompu.",
"save": "Enregistrer",
"schedule": "Planifier",
"search": "Rechercher",
Expand Down Expand Up @@ -119,7 +121,7 @@
"signup": "S'inscrire",
"submit": "Se connecter",
"username": "Utilisateur",
"usernameTaken": "Le nom d'utilisateur·ice est déjà pris",
"usernameTaken": "Le nom d'utilisateur est déjà pris",
"wrongCredentials": "Identifiants incorrects !",
"passwordTooShort": "Le mot de passe doit contenir au moins {min} caractères",
"logout_reasons": {
Expand Down Expand Up @@ -281,6 +283,7 @@
"currentPassword": "Mot de Passe Actuel"
},
"sidebar": {
"diskUsed": "{used} of {total} used",
"help": "Aide",
"hugoNew": "Nouveau Hugo",
"login": "Login",
Expand Down
1 change: 1 addition & 0 deletions frontend/src/i18n/hr.json
Original file line number Diff line number Diff line change
Expand Up @@ -281,6 +281,7 @@
"currentPassword": "Vaša trenutna lozinka"
},
"sidebar": {
"diskUsed": "{used} of {total} used",
"help": "Pomoć",
"hugoNew": "Hugo New",
"login": "Prijava",
Expand Down
3 changes: 2 additions & 1 deletion frontend/src/i18n/ko.json
Original file line number Diff line number Diff line change
Expand Up @@ -245,7 +245,7 @@
"execute": "명령 실행",
"modify": "파일 편집",
"rename": "파일 및 디렉터리의 이름 변경 또는 이동",
"share": "Share files (require download permission)"
"share": "파일 공유 (다운로드 권한 필요)"
},
"permissions": "권한",
"permissionsHelp": "사용자를 관리자로 설정하거나 개별적으로 권한을 지정할 수 있습니다. \"관리자\"를 선택하면 다른 모든 옵션이 자동으로 선택됩니다. 사용자 관리는 관리자의 권한입니다.\n",
Expand Down Expand Up @@ -281,6 +281,7 @@
"currentPassword": "현재 비밀번호"
},
"sidebar": {
"diskUsed": "{used} of {total} used",
"help": "도움말",
"hugoNew": "Hugo New",
"login": "로그인",
Expand Down
1 change: 1 addition & 0 deletions frontend/src/i18n/lv.json
Original file line number Diff line number Diff line change
Expand Up @@ -281,6 +281,7 @@
"currentPassword": "Your Current Password"
},
"sidebar": {
"diskUsed": "{used} of {total} used",
"help": "Palīdzība",
"hugoNew": "Hugo Jauns",
"login": "Pieteikties",
Expand Down
1 change: 1 addition & 0 deletions frontend/src/i18n/nl.json
Original file line number Diff line number Diff line change
Expand Up @@ -281,6 +281,7 @@
"currentPassword": "Uw huidige wachtwoord"
},
"sidebar": {
"diskUsed": "{used} van {total} gebruikt",
"help": "Hulp",
"hugoNew": "Hugo Nieuw",
"login": "Inloggen",
Expand Down
1 change: 1 addition & 0 deletions frontend/src/i18n/pl.json
Original file line number Diff line number Diff line change
Expand Up @@ -281,6 +281,7 @@
"currentPassword": "Twoje aktualne hasło"
},
"sidebar": {
"diskUsed": "Wykorzystano {used} z {total}",
"help": "Pomoc",
"hugoNew": "Nowy Hugo",
"login": "Zaloguj",
Expand Down
1 change: 1 addition & 0 deletions frontend/src/i18n/pt-pt.json
Original file line number Diff line number Diff line change
Expand Up @@ -281,6 +281,7 @@
"currentPassword": "A Sua Palavra-passe Actual"
},
"sidebar": {
"diskUsed": "{used} of {total} used",
"help": "Ajuda",
"hugoNew": "Hugo New",
"login": "Iniciar sessão",
Expand Down
1 change: 1 addition & 0 deletions frontend/src/i18n/pt.json
Original file line number Diff line number Diff line change
Expand Up @@ -281,6 +281,7 @@
"currentPassword": "Your Current Password"
},
"sidebar": {
"diskUsed": "{used} of {total} used",
"help": "Ajuda",
"hugoNew": "Hugo New",
"login": "Entrar",
Expand Down
1 change: 1 addition & 0 deletions frontend/src/i18n/ru.json
Original file line number Diff line number Diff line change
Expand Up @@ -281,6 +281,7 @@
"currentPassword": "Your Current Password"
},
"sidebar": {
"diskUsed": "{used} of {total} used",
"help": "Помощь",
"hugoNew": "Hugo New",
"login": "Войти",
Expand Down
1 change: 1 addition & 0 deletions frontend/src/i18n/zh-cn.json
Original file line number Diff line number Diff line change
Expand Up @@ -281,6 +281,7 @@
"currentPassword": "您当前的密码"
},
"sidebar": {
"diskUsed": "{used} of {total} used",
"help": "帮助",
"hugoNew": "Hugo 新建",
"login": "登录",
Expand Down
13 changes: 11 additions & 2 deletions frontend/src/types/file.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -71,10 +71,19 @@ interface ConflictingResource {
name: string;
origin: ConflictingItem;
dest: ConflictingItem;
checked: Array<"origin" | "dest">;
checked: Array<"origin" | "dest", "origin-resume">;
isSmallerOnServer?: boolean;
}

interface CsvData {
headers: string[];
rows: string[][];
}

interface RecursiveEntry {
path: string;
name: string;
size: number;
modified: string;
isDir: boolean;
}
1 change: 1 addition & 0 deletions frontend/src/types/upload.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ interface UploadEntry {
size: number;
isDir: boolean;
fullPath?: string;
to?: string;
file?: File;
overwrite?: boolean;
}
Expand Down
Loading
Loading