Compare commits

...

19 Commits

Author SHA1 Message Date
Henrique Dias
c18afcddc4 chore(release): 2.44.2 2025-10-22 10:39:43 +02:00
Henrique Dias
57db25d08a fix(http): remove auth query parameter 2025-10-22 10:38:30 +02:00
dependabot[bot]
b8f64a1c1b build(deps-dev): bump vite from 6.3.6 to 6.4.1 in /frontend
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 6.3.6 to 6.4.1.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/create-vite@6.4.1/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-version: 6.4.1
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-22 08:54:36 +02:00
Henrique Dias
de35dee1c5 chore(release): 2.44.1 2025-10-17 17:41:27 +02:00
MSomnium Studios
dd883985bb fix(auth): prevent integer overflow in logout timer using safeTimeout (#5470) 2025-10-17 17:38:57 +02:00
rocksload
97b8911ba8 refactor: use slices.Contains to simplify code (#5483) 2025-10-17 16:45:47 +02:00
Ryan
a397e7305d fix: editor discard prompt doesn't save nor discard
Co-authored-by: Ryan Miller <ryan.miller@infinitetactics.com>
2025-10-17 16:45:36 +02:00
Ryan
d0039afbb7 fix: wrong url on settings branding link 2025-10-03 10:42:24 +02:00
Henrique Dias
878cdfbc52 chore(release): 2.44.0 2025-09-25 17:20:12 +02:00
transifex-integration[bot]
1165f00bd4 feat: Updates for project File Browser (#5457)
Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com>
2025-09-25 17:19:21 +02:00
Henrique Dias
949ddffef2 fix: some formatting issues with i18n files 2025-09-25 17:13:30 +02:00
Henrique Dias
c4725428e0 fix: computation of file path 2025-09-25 17:09:16 +02:00
MSomnium Studios
d29ad356d1 feat: Improved path display in the new file and directory modal (#5451) 2025-09-25 16:57:30 +02:00
MSomnium Studios
692ca5eaf0 fix(upload): throttle upload speed calculation to 100ms to avoid Infinity MB/s (#5456)
Co-authored-by: Henrique Dias <mail@hacdias.com>
2025-09-25 16:54:28 +02:00
Adam
b9787c78f3 feat: allow setting ace editor theme (#3826)
Co-authored-by: Henrique Dias <mail@hacdias.com>
2025-09-25 16:47:00 +02:00
transifex-integration[bot]
dec7a02737 feat: Translate frontend/src/i18n/en.json in no
100% translated source file: 'frontend/src/i18n/en.json'
on 'no'.
2025-09-25 16:46:45 +02:00
transifex-integration[bot]
0eade717ce feat: Updates for project File Browser (#5450)
Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com>
2025-09-19 21:32:15 +02:00
MSomnium Studios
e6c674b3c6 fix: show login when session token expires 2025-09-19 15:09:26 +02:00
transifex-integration[bot]
4ff247e134 feat: Updates for project File Browser (#5446)
Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com>
2025-09-18 13:10:27 +02:00
57 changed files with 822 additions and 387 deletions

View File

@@ -2,6 +2,52 @@
All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
### [2.44.2](https://github.com/filebrowser/filebrowser/compare/v2.44.1...v2.44.2) (2025-10-22)
### Bug Fixes
* **http:** remove auth query parameter ([57db25d](https://github.com/filebrowser/filebrowser/commit/57db25d08a1ef2cd0b41f34e312b7b7c35c7ed38))
### Build
* **deps-dev:** bump vite from 6.3.6 to 6.4.1 in /frontend ([b8f64a1](https://github.com/filebrowser/filebrowser/commit/b8f64a1c1bc235df784d7f52abd3a9e84c6db6ce))
### [2.44.1](https://github.com/filebrowser/filebrowser/compare/v2.44.0...v2.44.1) (2025-10-17)
### Bug Fixes
* **auth:** prevent integer overflow in logout timer using safeTimeout ([#5470](https://github.com/filebrowser/filebrowser/issues/5470)) ([dd88398](https://github.com/filebrowser/filebrowser/commit/dd883985bb484af9dfea2677a40d56999fdc72f3))
* editor discard prompt doesn't save nor discard ([a397e73](https://github.com/filebrowser/filebrowser/commit/a397e7305d1572baf67823413f97a29eea38f0cc))
* wrong url on settings branding link ([d0039af](https://github.com/filebrowser/filebrowser/commit/d0039afbb76a9364c1e6ac9715ccc3c239dc8cb6))
### Refactorings
* use slices.Contains to simplify code ([#5483](https://github.com/filebrowser/filebrowser/issues/5483)) ([97b8911](https://github.com/filebrowser/filebrowser/commit/97b8911ba8a65456091cbec0202f6b5209fcf363))
## [2.44.0](https://github.com/filebrowser/filebrowser/compare/v2.43.0...v2.44.0) (2025-09-25)
### Features
* allow setting ace editor theme ([#3826](https://github.com/filebrowser/filebrowser/issues/3826)) ([b9787c7](https://github.com/filebrowser/filebrowser/commit/b9787c78f3889171f94db19e7655dce68c64b6fb))
* Improved path display in the new file and directory modal ([#5451](https://github.com/filebrowser/filebrowser/issues/5451)) ([d29ad35](https://github.com/filebrowser/filebrowser/commit/d29ad356d1067c87b2821debab91286549f512a0))
* Translate frontend/src/i18n/en.json in no ([dec7a02](https://github.com/filebrowser/filebrowser/commit/dec7a027378fbc6948d203199c44a640a141bcad))
* Updates for project File Browser ([#5446](https://github.com/filebrowser/filebrowser/issues/5446)) ([4ff247e](https://github.com/filebrowser/filebrowser/commit/4ff247e134e4d61668ee656a258ed67f71414e18))
* Updates for project File Browser ([#5450](https://github.com/filebrowser/filebrowser/issues/5450)) ([0eade71](https://github.com/filebrowser/filebrowser/commit/0eade717ce9d04bf48051922f11d983edbc7c2d0))
* Updates for project File Browser ([#5457](https://github.com/filebrowser/filebrowser/issues/5457)) ([1165f00](https://github.com/filebrowser/filebrowser/commit/1165f00bd4dcb0dcfbc084f54f51902ba4b4a714))
### Bug Fixes
* computation of file path ([c472542](https://github.com/filebrowser/filebrowser/commit/c4725428e07da72b855009e2c13c6ed91d32e0b7))
* show login when session token expires ([e6c674b](https://github.com/filebrowser/filebrowser/commit/e6c674b3c616831942c4d4aacab0907d58003e23))
* some formatting issues with i18n files ([949ddff](https://github.com/filebrowser/filebrowser/commit/949ddffef20e38169902c5fd74dca4815dcecf11))
* **upload:** throttle upload speed calculation to 100ms to avoid Infinity MB/s ([#5456](https://github.com/filebrowser/filebrowser/issues/5456)) ([692ca5e](https://github.com/filebrowser/filebrowser/commit/692ca5eaf01e4dcf346ba03f82c5dbd50cce246b))
## [2.43.0](https://github.com/filebrowser/filebrowser/compare/v2.42.5...v2.43.0) (2025-09-13)

View File

@@ -8,6 +8,7 @@ import (
"net/http"
"os"
"os/exec"
"slices"
"strings"
fbErrors "github.com/filebrowser/filebrowser/v2/errors"
@@ -266,13 +267,7 @@ var validHookFields = []string{
// IsValid checks if the provided field is on the valid fields list
func (hf *hookFields) IsValid(field string) bool {
for _, val := range validHookFields {
if field == val {
return true
}
}
return false
return slices.Contains(validHookFields, field)
}
// GetString returns the string value or provided default

View File

@@ -221,6 +221,7 @@ func printSettings(ser *settings.Server, set *settings.Settings, auther auth.Aut
fmt.Fprintf(w, "\tFile Creation Mode:\t%O\n", set.FileMode)
fmt.Fprintf(w, "\tDirectory Creation Mode:\t%O\n", set.DirMode)
fmt.Fprintf(w, "\tCommands:\t%s\n", strings.Join(set.Defaults.Commands, " "))
fmt.Fprintf(w, "\tAce editor syntax highlighting theme:\t%s\n", set.Defaults.AceEditorTheme)
fmt.Fprintf(w, "\tSorting:\n")
fmt.Fprintf(w, "\t\tBy:\t%s\n", set.Defaults.Sorting.By)
fmt.Fprintf(w, "\t\tAsc:\t%t\n", set.Defaults.Sorting.Asc)

View File

@@ -424,9 +424,10 @@ func quickSetup(flags *pflag.FlagSet, d pythonData) error {
MinimumPasswordLength: settings.DefaultMinimumPasswordLength,
UserHomeBasePath: settings.DefaultUsersHomeBasePath,
Defaults: settings.UserDefaults{
Scope: ".",
Locale: "en",
SingleClick: false,
Scope: ".",
Locale: "en",
SingleClick: false,
AceEditorTheme: getStringParam(flags, "defaults.aceEditorTheme"),
Perm: users.Permissions{
Admin: false,
Execute: true,

View File

@@ -79,6 +79,7 @@ func addUserFlags(flags *pflag.FlagSet) {
flags.Bool("singleClick", false, "use single clicks only")
flags.Bool("dateFormat", false, "use date format (true for absolute time, false for relative)")
flags.Bool("hideDotfiles", false, "hide dotfiles")
flags.String("aceEditorTheme", "", "ace editor's syntax highlighting theme for users")
}
func getViewMode(flags *pflag.FlagSet) (users.ViewMode, error) {
@@ -110,6 +111,8 @@ func getUserDefaults(flags *pflag.FlagSet, defaults *settings.UserDefaults, all
defaults.ViewMode, err = getViewMode(flags)
case "singleClick":
defaults.SingleClick, err = getBool(flags, flag.Name)
case "aceEditorTheme":
defaults.AceEditorTheme, err = getString(flags, flag.Name)
case "perm.admin":
defaults.Perm.Admin, err = getBool(flags, flag.Name)
case "perm.execute":

View File

@@ -71,7 +71,7 @@
"postcss": "^8.5.6",
"prettier": "^3.6.2",
"terser": "^5.43.1",
"vite": "^6.3.6",
"vite": "^6.4.1",
"vite-plugin-compression2": "^1.0.0",
"vue-tsc": "^2.2.0"
},

445
frontend/pnpm-lock.yaml generated
View File

@@ -101,7 +101,7 @@ importers:
devDependencies:
'@intlify/unplugin-vue-i18n':
specifier: ^6.0.8
version: 6.0.8(@vue/compiler-dom@3.5.17)(eslint@9.31.0)(rollup@4.50.1)(typescript@5.6.3)(vue-i18n@11.1.10(vue@3.5.17(typescript@5.6.3)))(vue@3.5.17(typescript@5.6.3))
version: 6.0.8(@vue/compiler-dom@3.5.17)(eslint@9.31.0)(rollup@4.52.5)(typescript@5.6.3)(vue-i18n@11.1.10(vue@3.5.17(typescript@5.6.3)))(vue@3.5.17(typescript@5.6.3))
'@playwright/test':
specifier: ^1.54.1
version: 1.54.1
@@ -119,10 +119,10 @@ importers:
version: 8.37.0(@typescript-eslint/parser@8.37.0(eslint@9.31.0)(typescript@5.6.3))(eslint@9.31.0)(typescript@5.6.3)
'@vitejs/plugin-legacy':
specifier: ^6.0.0
version: 6.0.0(terser@5.43.1)(vite@6.3.6(@types/node@22.10.10)(terser@5.43.1)(yaml@2.7.0))
version: 6.0.0(terser@5.43.1)(vite@6.4.1(@types/node@22.10.10)(terser@5.43.1)(yaml@2.7.0))
'@vitejs/plugin-vue':
specifier: ^5.0.4
version: 5.2.1(vite@6.3.6(@types/node@22.10.10)(terser@5.43.1)(yaml@2.7.0))(vue@3.5.17(typescript@5.6.3))
version: 5.2.1(vite@6.4.1(@types/node@22.10.10)(terser@5.43.1)(yaml@2.7.0))(vue@3.5.17(typescript@5.6.3))
'@vue/eslint-config-prettier':
specifier: ^10.2.0
version: 10.2.0(eslint@9.31.0)(prettier@3.6.2)
@@ -163,11 +163,11 @@ importers:
specifier: ^5.43.1
version: 5.43.1
vite:
specifier: ^6.3.6
version: 6.3.6(@types/node@22.10.10)(terser@5.43.1)(yaml@2.7.0)
specifier: ^6.4.1
version: 6.4.1(@types/node@22.10.10)(terser@5.43.1)(yaml@2.7.0)
vite-plugin-compression2:
specifier: ^1.0.0
version: 1.3.3(rollup@4.50.1)(vite@6.3.6(@types/node@22.10.10)(terser@5.43.1)(yaml@2.7.0))
version: 1.3.3(rollup@4.52.5)(vite@6.4.1(@types/node@22.10.10)(terser@5.43.1)(yaml@2.7.0))
vue-tsc:
specifier: ^2.2.0
version: 2.2.0(typescript@5.6.3)
@@ -737,158 +737,158 @@ packages:
resolution: {integrity: sha512-UJnjoFsmxfKUdNYdWgOB0mWUypuLvAfQPH1+pyvRJs6euowbFkFC6P13w1l8mJyi3vxYMxc9kld5jZEGRQs6bw==}
engines: {node: '>=18'}
'@esbuild/aix-ppc64@0.25.9':
resolution: {integrity: sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA==}
'@esbuild/aix-ppc64@0.25.11':
resolution: {integrity: sha512-Xt1dOL13m8u0WE8iplx9Ibbm+hFAO0GsU2P34UNoDGvZYkY8ifSiy6Zuc1lYxfG7svWE2fzqCUmFp5HCn51gJg==}
engines: {node: '>=18'}
cpu: [ppc64]
os: [aix]
'@esbuild/android-arm64@0.25.9':
resolution: {integrity: sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg==}
'@esbuild/android-arm64@0.25.11':
resolution: {integrity: sha512-9slpyFBc4FPPz48+f6jyiXOx/Y4v34TUeDDXJpZqAWQn/08lKGeD8aDp9TMn9jDz2CiEuHwfhRmGBvpnd/PWIQ==}
engines: {node: '>=18'}
cpu: [arm64]
os: [android]
'@esbuild/android-arm@0.25.9':
resolution: {integrity: sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ==}
'@esbuild/android-arm@0.25.11':
resolution: {integrity: sha512-uoa7dU+Dt3HYsethkJ1k6Z9YdcHjTrSb5NUy66ZfZaSV8hEYGD5ZHbEMXnqLFlbBflLsl89Zke7CAdDJ4JI+Gg==}
engines: {node: '>=18'}
cpu: [arm]
os: [android]
'@esbuild/android-x64@0.25.9':
resolution: {integrity: sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw==}
'@esbuild/android-x64@0.25.11':
resolution: {integrity: sha512-Sgiab4xBjPU1QoPEIqS3Xx+R2lezu0LKIEcYe6pftr56PqPygbB7+szVnzoShbx64MUupqoE0KyRlN7gezbl8g==}
engines: {node: '>=18'}
cpu: [x64]
os: [android]
'@esbuild/darwin-arm64@0.25.9':
resolution: {integrity: sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg==}
'@esbuild/darwin-arm64@0.25.11':
resolution: {integrity: sha512-VekY0PBCukppoQrycFxUqkCojnTQhdec0vevUL/EDOCnXd9LKWqD/bHwMPzigIJXPhC59Vd1WFIL57SKs2mg4w==}
engines: {node: '>=18'}
cpu: [arm64]
os: [darwin]
'@esbuild/darwin-x64@0.25.9':
resolution: {integrity: sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ==}
'@esbuild/darwin-x64@0.25.11':
resolution: {integrity: sha512-+hfp3yfBalNEpTGp9loYgbknjR695HkqtY3d3/JjSRUyPg/xd6q+mQqIb5qdywnDxRZykIHs3axEqU6l1+oWEQ==}
engines: {node: '>=18'}
cpu: [x64]
os: [darwin]
'@esbuild/freebsd-arm64@0.25.9':
resolution: {integrity: sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q==}
'@esbuild/freebsd-arm64@0.25.11':
resolution: {integrity: sha512-CmKjrnayyTJF2eVuO//uSjl/K3KsMIeYeyN7FyDBjsR3lnSJHaXlVoAK8DZa7lXWChbuOk7NjAc7ygAwrnPBhA==}
engines: {node: '>=18'}
cpu: [arm64]
os: [freebsd]
'@esbuild/freebsd-x64@0.25.9':
resolution: {integrity: sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg==}
'@esbuild/freebsd-x64@0.25.11':
resolution: {integrity: sha512-Dyq+5oscTJvMaYPvW3x3FLpi2+gSZTCE/1ffdwuM6G1ARang/mb3jvjxs0mw6n3Lsw84ocfo9CrNMqc5lTfGOw==}
engines: {node: '>=18'}
cpu: [x64]
os: [freebsd]
'@esbuild/linux-arm64@0.25.9':
resolution: {integrity: sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw==}
'@esbuild/linux-arm64@0.25.11':
resolution: {integrity: sha512-Qr8AzcplUhGvdyUF08A1kHU3Vr2O88xxP0Tm8GcdVOUm25XYcMPp2YqSVHbLuXzYQMf9Bh/iKx7YPqECs6ffLA==}
engines: {node: '>=18'}
cpu: [arm64]
os: [linux]
'@esbuild/linux-arm@0.25.9':
resolution: {integrity: sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw==}
'@esbuild/linux-arm@0.25.11':
resolution: {integrity: sha512-TBMv6B4kCfrGJ8cUPo7vd6NECZH/8hPpBHHlYI3qzoYFvWu2AdTvZNuU/7hsbKWqu/COU7NIK12dHAAqBLLXgw==}
engines: {node: '>=18'}
cpu: [arm]
os: [linux]
'@esbuild/linux-ia32@0.25.9':
resolution: {integrity: sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A==}
'@esbuild/linux-ia32@0.25.11':
resolution: {integrity: sha512-TmnJg8BMGPehs5JKrCLqyWTVAvielc615jbkOirATQvWWB1NMXY77oLMzsUjRLa0+ngecEmDGqt5jiDC6bfvOw==}
engines: {node: '>=18'}
cpu: [ia32]
os: [linux]
'@esbuild/linux-loong64@0.25.9':
resolution: {integrity: sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ==}
'@esbuild/linux-loong64@0.25.11':
resolution: {integrity: sha512-DIGXL2+gvDaXlaq8xruNXUJdT5tF+SBbJQKbWy/0J7OhU8gOHOzKmGIlfTTl6nHaCOoipxQbuJi7O++ldrxgMw==}
engines: {node: '>=18'}
cpu: [loong64]
os: [linux]
'@esbuild/linux-mips64el@0.25.9':
resolution: {integrity: sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA==}
'@esbuild/linux-mips64el@0.25.11':
resolution: {integrity: sha512-Osx1nALUJu4pU43o9OyjSCXokFkFbyzjXb6VhGIJZQ5JZi8ylCQ9/LFagolPsHtgw6himDSyb5ETSfmp4rpiKQ==}
engines: {node: '>=18'}
cpu: [mips64el]
os: [linux]
'@esbuild/linux-ppc64@0.25.9':
resolution: {integrity: sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w==}
'@esbuild/linux-ppc64@0.25.11':
resolution: {integrity: sha512-nbLFgsQQEsBa8XSgSTSlrnBSrpoWh7ioFDUmwo158gIm5NNP+17IYmNWzaIzWmgCxq56vfr34xGkOcZ7jX6CPw==}
engines: {node: '>=18'}
cpu: [ppc64]
os: [linux]
'@esbuild/linux-riscv64@0.25.9':
resolution: {integrity: sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg==}
'@esbuild/linux-riscv64@0.25.11':
resolution: {integrity: sha512-HfyAmqZi9uBAbgKYP1yGuI7tSREXwIb438q0nqvlpxAOs3XnZ8RsisRfmVsgV486NdjD7Mw2UrFSw51lzUk1ww==}
engines: {node: '>=18'}
cpu: [riscv64]
os: [linux]
'@esbuild/linux-s390x@0.25.9':
resolution: {integrity: sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA==}
'@esbuild/linux-s390x@0.25.11':
resolution: {integrity: sha512-HjLqVgSSYnVXRisyfmzsH6mXqyvj0SA7pG5g+9W7ESgwA70AXYNpfKBqh1KbTxmQVaYxpzA/SvlB9oclGPbApw==}
engines: {node: '>=18'}
cpu: [s390x]
os: [linux]
'@esbuild/linux-x64@0.25.9':
resolution: {integrity: sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg==}
'@esbuild/linux-x64@0.25.11':
resolution: {integrity: sha512-HSFAT4+WYjIhrHxKBwGmOOSpphjYkcswF449j6EjsjbinTZbp8PJtjsVK1XFJStdzXdy/jaddAep2FGY+wyFAQ==}
engines: {node: '>=18'}
cpu: [x64]
os: [linux]
'@esbuild/netbsd-arm64@0.25.9':
resolution: {integrity: sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q==}
'@esbuild/netbsd-arm64@0.25.11':
resolution: {integrity: sha512-hr9Oxj1Fa4r04dNpWr3P8QKVVsjQhqrMSUzZzf+LZcYjZNqhA3IAfPQdEh1FLVUJSiu6sgAwp3OmwBfbFgG2Xg==}
engines: {node: '>=18'}
cpu: [arm64]
os: [netbsd]
'@esbuild/netbsd-x64@0.25.9':
resolution: {integrity: sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g==}
'@esbuild/netbsd-x64@0.25.11':
resolution: {integrity: sha512-u7tKA+qbzBydyj0vgpu+5h5AeudxOAGncb8N6C9Kh1N4n7wU1Xw1JDApsRjpShRpXRQlJLb9wY28ELpwdPcZ7A==}
engines: {node: '>=18'}
cpu: [x64]
os: [netbsd]
'@esbuild/openbsd-arm64@0.25.9':
resolution: {integrity: sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ==}
'@esbuild/openbsd-arm64@0.25.11':
resolution: {integrity: sha512-Qq6YHhayieor3DxFOoYM1q0q1uMFYb7cSpLD2qzDSvK1NAvqFi8Xgivv0cFC6J+hWVw2teCYltyy9/m/14ryHg==}
engines: {node: '>=18'}
cpu: [arm64]
os: [openbsd]
'@esbuild/openbsd-x64@0.25.9':
resolution: {integrity: sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA==}
'@esbuild/openbsd-x64@0.25.11':
resolution: {integrity: sha512-CN+7c++kkbrckTOz5hrehxWN7uIhFFlmS/hqziSFVWpAzpWrQoAG4chH+nN3Be+Kzv/uuo7zhX716x3Sn2Jduw==}
engines: {node: '>=18'}
cpu: [x64]
os: [openbsd]
'@esbuild/openharmony-arm64@0.25.9':
resolution: {integrity: sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg==}
'@esbuild/openharmony-arm64@0.25.11':
resolution: {integrity: sha512-rOREuNIQgaiR+9QuNkbkxubbp8MSO9rONmwP5nKncnWJ9v5jQ4JxFnLu4zDSRPf3x4u+2VN4pM4RdyIzDty/wQ==}
engines: {node: '>=18'}
cpu: [arm64]
os: [openharmony]
'@esbuild/sunos-x64@0.25.9':
resolution: {integrity: sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw==}
'@esbuild/sunos-x64@0.25.11':
resolution: {integrity: sha512-nq2xdYaWxyg9DcIyXkZhcYulC6pQ2FuCgem3LI92IwMgIZ69KHeY8T4Y88pcwoLIjbed8n36CyKoYRDygNSGhA==}
engines: {node: '>=18'}
cpu: [x64]
os: [sunos]
'@esbuild/win32-arm64@0.25.9':
resolution: {integrity: sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ==}
'@esbuild/win32-arm64@0.25.11':
resolution: {integrity: sha512-3XxECOWJq1qMZ3MN8srCJ/QfoLpL+VaxD/WfNRm1O3B4+AZ/BnLVgFbUV3eiRYDMXetciH16dwPbbHqwe1uU0Q==}
engines: {node: '>=18'}
cpu: [arm64]
os: [win32]
'@esbuild/win32-ia32@0.25.9':
resolution: {integrity: sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww==}
'@esbuild/win32-ia32@0.25.11':
resolution: {integrity: sha512-3ukss6gb9XZ8TlRyJlgLn17ecsK4NSQTmdIXRASVsiS2sQ6zPPZklNJT5GR5tE/MUarymmy8kCEf5xPCNCqVOA==}
engines: {node: '>=18'}
cpu: [ia32]
os: [win32]
'@esbuild/win32-x64@0.25.9':
resolution: {integrity: sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ==}
'@esbuild/win32-x64@0.25.11':
resolution: {integrity: sha512-D7Hpz6A2L4hzsRpPaCYkQnGOotdUpDzSGRIv9I+1ITdHROSFUWW95ZPZWQmGka1Fg7W3zFJowyn9WGwMJ0+KPA==}
engines: {node: '>=18'}
cpu: [x64]
os: [win32]
@@ -1088,108 +1088,113 @@ packages:
rollup:
optional: true
'@rollup/rollup-android-arm-eabi@4.50.1':
resolution: {integrity: sha512-HJXwzoZN4eYTdD8bVV22DN8gsPCAj3V20NHKOs8ezfXanGpmVPR7kalUHd+Y31IJp9stdB87VKPFbsGY3H/2ag==}
'@rollup/rollup-android-arm-eabi@4.52.5':
resolution: {integrity: sha512-8c1vW4ocv3UOMp9K+gToY5zL2XiiVw3k7f1ksf4yO1FlDFQ1C2u72iACFnSOceJFsWskc2WZNqeRhFRPzv+wtQ==}
cpu: [arm]
os: [android]
'@rollup/rollup-android-arm64@4.50.1':
resolution: {integrity: sha512-PZlsJVcjHfcH53mOImyt3bc97Ep3FJDXRpk9sMdGX0qgLmY0EIWxCag6EigerGhLVuL8lDVYNnSo8qnTElO4xw==}
'@rollup/rollup-android-arm64@4.52.5':
resolution: {integrity: sha512-mQGfsIEFcu21mvqkEKKu2dYmtuSZOBMmAl5CFlPGLY94Vlcm+zWApK7F/eocsNzp8tKmbeBP8yXyAbx0XHsFNA==}
cpu: [arm64]
os: [android]
'@rollup/rollup-darwin-arm64@4.50.1':
resolution: {integrity: sha512-xc6i2AuWh++oGi4ylOFPmzJOEeAa2lJeGUGb4MudOtgfyyjr4UPNK+eEWTPLvmPJIY/pgw6ssFIox23SyrkkJw==}
'@rollup/rollup-darwin-arm64@4.52.5':
resolution: {integrity: sha512-takF3CR71mCAGA+v794QUZ0b6ZSrgJkArC+gUiG6LB6TQty9T0Mqh3m2ImRBOxS2IeYBo4lKWIieSvnEk2OQWA==}
cpu: [arm64]
os: [darwin]
'@rollup/rollup-darwin-x64@4.50.1':
resolution: {integrity: sha512-2ofU89lEpDYhdLAbRdeyz/kX3Y2lpYc6ShRnDjY35bZhd2ipuDMDi6ZTQ9NIag94K28nFMofdnKeHR7BT0CATw==}
'@rollup/rollup-darwin-x64@4.52.5':
resolution: {integrity: sha512-W901Pla8Ya95WpxDn//VF9K9u2JbocwV/v75TE0YIHNTbhqUTv9w4VuQ9MaWlNOkkEfFwkdNhXgcLqPSmHy0fA==}
cpu: [x64]
os: [darwin]
'@rollup/rollup-freebsd-arm64@4.50.1':
resolution: {integrity: sha512-wOsE6H2u6PxsHY/BeFHA4VGQN3KUJFZp7QJBmDYI983fgxq5Th8FDkVuERb2l9vDMs1D5XhOrhBrnqcEY6l8ZA==}
'@rollup/rollup-freebsd-arm64@4.52.5':
resolution: {integrity: sha512-QofO7i7JycsYOWxe0GFqhLmF6l1TqBswJMvICnRUjqCx8b47MTo46W8AoeQwiokAx3zVryVnxtBMcGcnX12LvA==}
cpu: [arm64]
os: [freebsd]
'@rollup/rollup-freebsd-x64@4.50.1':
resolution: {integrity: sha512-A/xeqaHTlKbQggxCqispFAcNjycpUEHP52mwMQZUNqDUJFFYtPHCXS1VAG29uMlDzIVr+i00tSFWFLivMcoIBQ==}
'@rollup/rollup-freebsd-x64@4.52.5':
resolution: {integrity: sha512-jr21b/99ew8ujZubPo9skbrItHEIE50WdV86cdSoRkKtmWa+DDr6fu2c/xyRT0F/WazZpam6kk7IHBerSL7LDQ==}
cpu: [x64]
os: [freebsd]
'@rollup/rollup-linux-arm-gnueabihf@4.50.1':
resolution: {integrity: sha512-54v4okehwl5TaSIkpp97rAHGp7t3ghinRd/vyC1iXqXMfjYUTm7TfYmCzXDoHUPTTf36L8pr0E7YsD3CfB3ZDg==}
'@rollup/rollup-linux-arm-gnueabihf@4.52.5':
resolution: {integrity: sha512-PsNAbcyv9CcecAUagQefwX8fQn9LQ4nZkpDboBOttmyffnInRy8R8dSg6hxxl2Re5QhHBf6FYIDhIj5v982ATQ==}
cpu: [arm]
os: [linux]
'@rollup/rollup-linux-arm-musleabihf@4.50.1':
resolution: {integrity: sha512-p/LaFyajPN/0PUHjv8TNyxLiA7RwmDoVY3flXHPSzqrGcIp/c2FjwPPP5++u87DGHtw+5kSH5bCJz0mvXngYxw==}
'@rollup/rollup-linux-arm-musleabihf@4.52.5':
resolution: {integrity: sha512-Fw4tysRutyQc/wwkmcyoqFtJhh0u31K+Q6jYjeicsGJJ7bbEq8LwPWV/w0cnzOqR2m694/Af6hpFayLJZkG2VQ==}
cpu: [arm]
os: [linux]
'@rollup/rollup-linux-arm64-gnu@4.50.1':
resolution: {integrity: sha512-2AbMhFFkTo6Ptna1zO7kAXXDLi7H9fGTbVaIq2AAYO7yzcAsuTNWPHhb2aTA6GPiP+JXh85Y8CiS54iZoj4opw==}
'@rollup/rollup-linux-arm64-gnu@4.52.5':
resolution: {integrity: sha512-a+3wVnAYdQClOTlyapKmyI6BLPAFYs0JM8HRpgYZQO02rMR09ZcV9LbQB+NL6sljzG38869YqThrRnfPMCDtZg==}
cpu: [arm64]
os: [linux]
'@rollup/rollup-linux-arm64-musl@4.50.1':
resolution: {integrity: sha512-Cgef+5aZwuvesQNw9eX7g19FfKX5/pQRIyhoXLCiBOrWopjo7ycfB292TX9MDcDijiuIJlx1IzJz3IoCPfqs9w==}
'@rollup/rollup-linux-arm64-musl@4.52.5':
resolution: {integrity: sha512-AvttBOMwO9Pcuuf7m9PkC1PUIKsfaAJ4AYhy944qeTJgQOqJYJ9oVl2nYgY7Rk0mkbsuOpCAYSs6wLYB2Xiw0Q==}
cpu: [arm64]
os: [linux]
'@rollup/rollup-linux-loongarch64-gnu@4.50.1':
resolution: {integrity: sha512-RPhTwWMzpYYrHrJAS7CmpdtHNKtt2Ueo+BlLBjfZEhYBhK00OsEqM08/7f+eohiF6poe0YRDDd8nAvwtE/Y62Q==}
'@rollup/rollup-linux-loong64-gnu@4.52.5':
resolution: {integrity: sha512-DkDk8pmXQV2wVrF6oq5tONK6UHLz/XcEVow4JTTerdeV1uqPeHxwcg7aFsfnSm9L+OO8WJsWotKM2JJPMWrQtA==}
cpu: [loong64]
os: [linux]
'@rollup/rollup-linux-ppc64-gnu@4.50.1':
resolution: {integrity: sha512-eSGMVQw9iekut62O7eBdbiccRguuDgiPMsw++BVUg+1K7WjZXHOg/YOT9SWMzPZA+w98G+Fa1VqJgHZOHHnY0Q==}
'@rollup/rollup-linux-ppc64-gnu@4.52.5':
resolution: {integrity: sha512-W/b9ZN/U9+hPQVvlGwjzi+Wy4xdoH2I8EjaCkMvzpI7wJUs8sWJ03Rq96jRnHkSrcHTpQe8h5Tg3ZzUPGauvAw==}
cpu: [ppc64]
os: [linux]
'@rollup/rollup-linux-riscv64-gnu@4.50.1':
resolution: {integrity: sha512-S208ojx8a4ciIPrLgazF6AgdcNJzQE4+S9rsmOmDJkusvctii+ZvEuIC4v/xFqzbuP8yDjn73oBlNDgF6YGSXQ==}
'@rollup/rollup-linux-riscv64-gnu@4.52.5':
resolution: {integrity: sha512-sjQLr9BW7R/ZiXnQiWPkErNfLMkkWIoCz7YMn27HldKsADEKa5WYdobaa1hmN6slu9oWQbB6/jFpJ+P2IkVrmw==}
cpu: [riscv64]
os: [linux]
'@rollup/rollup-linux-riscv64-musl@4.50.1':
resolution: {integrity: sha512-3Ag8Ls1ggqkGUvSZWYcdgFwriy2lWo+0QlYgEFra/5JGtAd6C5Hw59oojx1DeqcA2Wds2ayRgvJ4qxVTzCHgzg==}
'@rollup/rollup-linux-riscv64-musl@4.52.5':
resolution: {integrity: sha512-hq3jU/kGyjXWTvAh2awn8oHroCbrPm8JqM7RUpKjalIRWWXE01CQOf/tUNWNHjmbMHg/hmNCwc/Pz3k1T/j/Lg==}
cpu: [riscv64]
os: [linux]
'@rollup/rollup-linux-s390x-gnu@4.50.1':
resolution: {integrity: sha512-t9YrKfaxCYe7l7ldFERE1BRg/4TATxIg+YieHQ966jwvo7ddHJxPj9cNFWLAzhkVsbBvNA4qTbPVNsZKBO4NSg==}
'@rollup/rollup-linux-s390x-gnu@4.52.5':
resolution: {integrity: sha512-gn8kHOrku8D4NGHMK1Y7NA7INQTRdVOntt1OCYypZPRt6skGbddska44K8iocdpxHTMMNui5oH4elPH4QOLrFQ==}
cpu: [s390x]
os: [linux]
'@rollup/rollup-linux-x64-gnu@4.50.1':
resolution: {integrity: sha512-MCgtFB2+SVNuQmmjHf+wfI4CMxy3Tk8XjA5Z//A0AKD7QXUYFMQcns91K6dEHBvZPCnhJSyDWLApk40Iq/H3tA==}
'@rollup/rollup-linux-x64-gnu@4.52.5':
resolution: {integrity: sha512-hXGLYpdhiNElzN770+H2nlx+jRog8TyynpTVzdlc6bndktjKWyZyiCsuDAlpd+j+W+WNqfcyAWz9HxxIGfZm1Q==}
cpu: [x64]
os: [linux]
'@rollup/rollup-linux-x64-musl@4.50.1':
resolution: {integrity: sha512-nEvqG+0jeRmqaUMuwzlfMKwcIVffy/9KGbAGyoa26iu6eSngAYQ512bMXuqqPrlTyfqdlB9FVINs93j534UJrg==}
'@rollup/rollup-linux-x64-musl@4.52.5':
resolution: {integrity: sha512-arCGIcuNKjBoKAXD+y7XomR9gY6Mw7HnFBv5Rw7wQRvwYLR7gBAgV7Mb2QTyjXfTveBNFAtPt46/36vV9STLNg==}
cpu: [x64]
os: [linux]
'@rollup/rollup-openharmony-arm64@4.50.1':
resolution: {integrity: sha512-RDsLm+phmT3MJd9SNxA9MNuEAO/J2fhW8GXk62G/B4G7sLVumNFbRwDL6v5NrESb48k+QMqdGbHgEtfU0LCpbA==}
'@rollup/rollup-openharmony-arm64@4.52.5':
resolution: {integrity: sha512-QoFqB6+/9Rly/RiPjaomPLmR/13cgkIGfA40LHly9zcH1S0bN2HVFYk3a1eAyHQyjs3ZJYlXvIGtcCs5tko9Cw==}
cpu: [arm64]
os: [openharmony]
'@rollup/rollup-win32-arm64-msvc@4.50.1':
resolution: {integrity: sha512-hpZB/TImk2FlAFAIsoElM3tLzq57uxnGYwplg6WDyAxbYczSi8O2eQ+H2Lx74504rwKtZ3N2g4bCUkiamzS6TQ==}
'@rollup/rollup-win32-arm64-msvc@4.52.5':
resolution: {integrity: sha512-w0cDWVR6MlTstla1cIfOGyl8+qb93FlAVutcor14Gf5Md5ap5ySfQ7R9S/NjNaMLSFdUnKGEasmVnu3lCMqB7w==}
cpu: [arm64]
os: [win32]
'@rollup/rollup-win32-ia32-msvc@4.50.1':
resolution: {integrity: sha512-SXjv8JlbzKM0fTJidX4eVsH+Wmnp0/WcD8gJxIZyR6Gay5Qcsmdbi9zVtnbkGPG8v2vMR1AD06lGWy5FLMcG7A==}
'@rollup/rollup-win32-ia32-msvc@4.52.5':
resolution: {integrity: sha512-Aufdpzp7DpOTULJCuvzqcItSGDH73pF3ko/f+ckJhxQyHtp67rHw3HMNxoIdDMUITJESNE6a8uh4Lo4SLouOUg==}
cpu: [ia32]
os: [win32]
'@rollup/rollup-win32-x64-msvc@4.50.1':
resolution: {integrity: sha512-StxAO/8ts62KZVRAm4JZYq9+NqNsV7RvimNK+YM7ry//zebEH6meuugqW/P5OFUCjyQgui+9fUxT6d5NShvMvA==}
'@rollup/rollup-win32-x64-gnu@4.52.5':
resolution: {integrity: sha512-UGBUGPFp1vkj6p8wCRraqNhqwX/4kNQPS57BCFc8wYh0g94iVIW33wJtQAx3G7vrjjNtRaxiMUylM0ktp/TRSQ==}
cpu: [x64]
os: [win32]
'@rollup/rollup-win32-x64-msvc@4.52.5':
resolution: {integrity: sha512-TAcgQh2sSkykPRWLrdyy2AiceMckNf5loITqXxFI5VuQjS5tSuw3WlwdN8qv8vzjLAUTvYaH/mVjSFpbkFbpTg==}
cpu: [x64]
os: [win32]
@@ -1723,8 +1728,8 @@ packages:
resolution: {integrity: sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==}
engines: {node: '>=0.12'}
esbuild@0.25.9:
resolution: {integrity: sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g==}
esbuild@0.25.11:
resolution: {integrity: sha512-KohQwyzrKTQmhXDW1PjCv3Tyspn9n5GcY2RTDqeORIdIJY8yKIF7sTSopFmn/wpMPW4rdPXI0UE5LJLuq3bx0Q==}
engines: {node: '>=18'}
hasBin: true
@@ -2426,8 +2431,8 @@ packages:
resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==}
engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
rollup@4.50.1:
resolution: {integrity: sha512-78E9voJHwnXQMiQdiqswVLZwJIzdBKJ1GdI5Zx6XwoFKUIk09/sSrr+05QFzvYb8q6Y9pPV45zzDuYa3907TZA==}
rollup@4.52.5:
resolution: {integrity: sha512-3GuObel8h7Kqdjt0gxkEzaifHTqLVW56Y/bjN7PSQtkKr0w3V/QYSdt6QWYtd7A1xUtYQigtdUfgj1RvWVtorw==}
engines: {node: '>=18.0.0', npm: '>=8.0.0'}
hasBin: true
@@ -2684,8 +2689,8 @@ packages:
peerDependencies:
vite: ^2.0.0||^3.0.0||^4.0.0||^5.0.0 ||^6.0.0
vite@6.3.6:
resolution: {integrity: sha512-0msEVHJEScQbhkbVTb/4iHZdJ6SXp/AvxL2sjwYQFfBqleHtnCqv1J3sa9zbWz/6kW1m9Tfzn92vW+kZ1WV6QA==}
vite@6.4.1:
resolution: {integrity: sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==}
engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0}
hasBin: true
peerDependencies:
@@ -3609,82 +3614,82 @@ snapshots:
'@csstools/css-tokenizer@3.0.3': {}
'@esbuild/aix-ppc64@0.25.9':
'@esbuild/aix-ppc64@0.25.11':
optional: true
'@esbuild/android-arm64@0.25.9':
'@esbuild/android-arm64@0.25.11':
optional: true
'@esbuild/android-arm@0.25.9':
'@esbuild/android-arm@0.25.11':
optional: true
'@esbuild/android-x64@0.25.9':
'@esbuild/android-x64@0.25.11':
optional: true
'@esbuild/darwin-arm64@0.25.9':
'@esbuild/darwin-arm64@0.25.11':
optional: true
'@esbuild/darwin-x64@0.25.9':
'@esbuild/darwin-x64@0.25.11':
optional: true
'@esbuild/freebsd-arm64@0.25.9':
'@esbuild/freebsd-arm64@0.25.11':
optional: true
'@esbuild/freebsd-x64@0.25.9':
'@esbuild/freebsd-x64@0.25.11':
optional: true
'@esbuild/linux-arm64@0.25.9':
'@esbuild/linux-arm64@0.25.11':
optional: true
'@esbuild/linux-arm@0.25.9':
'@esbuild/linux-arm@0.25.11':
optional: true
'@esbuild/linux-ia32@0.25.9':
'@esbuild/linux-ia32@0.25.11':
optional: true
'@esbuild/linux-loong64@0.25.9':
'@esbuild/linux-loong64@0.25.11':
optional: true
'@esbuild/linux-mips64el@0.25.9':
'@esbuild/linux-mips64el@0.25.11':
optional: true
'@esbuild/linux-ppc64@0.25.9':
'@esbuild/linux-ppc64@0.25.11':
optional: true
'@esbuild/linux-riscv64@0.25.9':
'@esbuild/linux-riscv64@0.25.11':
optional: true
'@esbuild/linux-s390x@0.25.9':
'@esbuild/linux-s390x@0.25.11':
optional: true
'@esbuild/linux-x64@0.25.9':
'@esbuild/linux-x64@0.25.11':
optional: true
'@esbuild/netbsd-arm64@0.25.9':
'@esbuild/netbsd-arm64@0.25.11':
optional: true
'@esbuild/netbsd-x64@0.25.9':
'@esbuild/netbsd-x64@0.25.11':
optional: true
'@esbuild/openbsd-arm64@0.25.9':
'@esbuild/openbsd-arm64@0.25.11':
optional: true
'@esbuild/openbsd-x64@0.25.9':
'@esbuild/openbsd-x64@0.25.11':
optional: true
'@esbuild/openharmony-arm64@0.25.9':
'@esbuild/openharmony-arm64@0.25.11':
optional: true
'@esbuild/sunos-x64@0.25.9':
'@esbuild/sunos-x64@0.25.11':
optional: true
'@esbuild/win32-arm64@0.25.9':
'@esbuild/win32-arm64@0.25.11':
optional: true
'@esbuild/win32-ia32@0.25.9':
'@esbuild/win32-ia32@0.25.11':
optional: true
'@esbuild/win32-x64@0.25.9':
'@esbuild/win32-x64@0.25.11':
optional: true
'@eslint-community/eslint-utils@4.4.1(eslint@9.31.0)':
@@ -3784,13 +3789,13 @@ snapshots:
'@intlify/shared@11.1.7': {}
'@intlify/unplugin-vue-i18n@6.0.8(@vue/compiler-dom@3.5.17)(eslint@9.31.0)(rollup@4.50.1)(typescript@5.6.3)(vue-i18n@11.1.10(vue@3.5.17(typescript@5.6.3)))(vue@3.5.17(typescript@5.6.3))':
'@intlify/unplugin-vue-i18n@6.0.8(@vue/compiler-dom@3.5.17)(eslint@9.31.0)(rollup@4.52.5)(typescript@5.6.3)(vue-i18n@11.1.10(vue@3.5.17(typescript@5.6.3)))(vue@3.5.17(typescript@5.6.3))':
dependencies:
'@eslint-community/eslint-utils': 4.4.1(eslint@9.31.0)
'@intlify/bundle-utils': 10.0.1(vue-i18n@11.1.10(vue@3.5.17(typescript@5.6.3)))
'@intlify/shared': 11.1.7
'@intlify/vue-i18n-extensions': 8.0.0(@intlify/shared@11.1.7)(@vue/compiler-dom@3.5.17)(vue-i18n@11.1.10(vue@3.5.17(typescript@5.6.3)))(vue@3.5.17(typescript@5.6.3))
'@rollup/pluginutils': 5.1.4(rollup@4.50.1)
'@rollup/pluginutils': 5.1.4(rollup@4.52.5)
'@typescript-eslint/scope-manager': 8.21.0
'@typescript-eslint/typescript-estree': 8.21.0(typescript@5.6.3)
debug: 4.4.0
@@ -3866,83 +3871,86 @@ snapshots:
dependencies:
playwright: 1.54.1
'@rollup/pluginutils@5.1.3(rollup@4.50.1)':
'@rollup/pluginutils@5.1.3(rollup@4.52.5)':
dependencies:
'@types/estree': 1.0.6
estree-walker: 2.0.2
picomatch: 4.0.3
optionalDependencies:
rollup: 4.50.1
rollup: 4.52.5
'@rollup/pluginutils@5.1.4(rollup@4.50.1)':
'@rollup/pluginutils@5.1.4(rollup@4.52.5)':
dependencies:
'@types/estree': 1.0.7
estree-walker: 2.0.2
picomatch: 4.0.3
optionalDependencies:
rollup: 4.50.1
rollup: 4.52.5
'@rollup/rollup-android-arm-eabi@4.50.1':
'@rollup/rollup-android-arm-eabi@4.52.5':
optional: true
'@rollup/rollup-android-arm64@4.50.1':
'@rollup/rollup-android-arm64@4.52.5':
optional: true
'@rollup/rollup-darwin-arm64@4.50.1':
'@rollup/rollup-darwin-arm64@4.52.5':
optional: true
'@rollup/rollup-darwin-x64@4.50.1':
'@rollup/rollup-darwin-x64@4.52.5':
optional: true
'@rollup/rollup-freebsd-arm64@4.50.1':
'@rollup/rollup-freebsd-arm64@4.52.5':
optional: true
'@rollup/rollup-freebsd-x64@4.50.1':
'@rollup/rollup-freebsd-x64@4.52.5':
optional: true
'@rollup/rollup-linux-arm-gnueabihf@4.50.1':
'@rollup/rollup-linux-arm-gnueabihf@4.52.5':
optional: true
'@rollup/rollup-linux-arm-musleabihf@4.50.1':
'@rollup/rollup-linux-arm-musleabihf@4.52.5':
optional: true
'@rollup/rollup-linux-arm64-gnu@4.50.1':
'@rollup/rollup-linux-arm64-gnu@4.52.5':
optional: true
'@rollup/rollup-linux-arm64-musl@4.50.1':
'@rollup/rollup-linux-arm64-musl@4.52.5':
optional: true
'@rollup/rollup-linux-loongarch64-gnu@4.50.1':
'@rollup/rollup-linux-loong64-gnu@4.52.5':
optional: true
'@rollup/rollup-linux-ppc64-gnu@4.50.1':
'@rollup/rollup-linux-ppc64-gnu@4.52.5':
optional: true
'@rollup/rollup-linux-riscv64-gnu@4.50.1':
'@rollup/rollup-linux-riscv64-gnu@4.52.5':
optional: true
'@rollup/rollup-linux-riscv64-musl@4.50.1':
'@rollup/rollup-linux-riscv64-musl@4.52.5':
optional: true
'@rollup/rollup-linux-s390x-gnu@4.50.1':
'@rollup/rollup-linux-s390x-gnu@4.52.5':
optional: true
'@rollup/rollup-linux-x64-gnu@4.50.1':
'@rollup/rollup-linux-x64-gnu@4.52.5':
optional: true
'@rollup/rollup-linux-x64-musl@4.50.1':
'@rollup/rollup-linux-x64-musl@4.52.5':
optional: true
'@rollup/rollup-openharmony-arm64@4.50.1':
'@rollup/rollup-openharmony-arm64@4.52.5':
optional: true
'@rollup/rollup-win32-arm64-msvc@4.50.1':
'@rollup/rollup-win32-arm64-msvc@4.52.5':
optional: true
'@rollup/rollup-win32-ia32-msvc@4.50.1':
'@rollup/rollup-win32-ia32-msvc@4.52.5':
optional: true
'@rollup/rollup-win32-x64-msvc@4.50.1':
'@rollup/rollup-win32-x64-gnu@4.52.5':
optional: true
'@rollup/rollup-win32-x64-msvc@4.52.5':
optional: true
'@tsconfig/node22@22.0.2': {}
@@ -4115,7 +4123,7 @@ snapshots:
global: 4.4.0
is-function: 1.0.2
'@vitejs/plugin-legacy@6.0.0(terser@5.43.1)(vite@6.3.6(@types/node@22.10.10)(terser@5.43.1)(yaml@2.7.0))':
'@vitejs/plugin-legacy@6.0.0(terser@5.43.1)(vite@6.4.1(@types/node@22.10.10)(terser@5.43.1)(yaml@2.7.0))':
dependencies:
'@babel/core': 7.26.0
'@babel/preset-env': 7.26.0(@babel/core@7.26.0)
@@ -4126,13 +4134,13 @@ snapshots:
regenerator-runtime: 0.14.1
systemjs: 6.15.1
terser: 5.43.1
vite: 6.3.6(@types/node@22.10.10)(terser@5.43.1)(yaml@2.7.0)
vite: 6.4.1(@types/node@22.10.10)(terser@5.43.1)(yaml@2.7.0)
transitivePeerDependencies:
- supports-color
'@vitejs/plugin-vue@5.2.1(vite@6.3.6(@types/node@22.10.10)(terser@5.43.1)(yaml@2.7.0))(vue@3.5.17(typescript@5.6.3))':
'@vitejs/plugin-vue@5.2.1(vite@6.4.1(@types/node@22.10.10)(terser@5.43.1)(yaml@2.7.0))(vue@3.5.17(typescript@5.6.3))':
dependencies:
vite: 6.3.6(@types/node@22.10.10)(terser@5.43.1)(yaml@2.7.0)
vite: 6.4.1(@types/node@22.10.10)(terser@5.43.1)(yaml@2.7.0)
vue: 3.5.17(typescript@5.6.3)
'@volar/language-core@2.4.11':
@@ -4548,34 +4556,34 @@ snapshots:
d: 1.0.2
ext: 1.7.0
esbuild@0.25.9:
esbuild@0.25.11:
optionalDependencies:
'@esbuild/aix-ppc64': 0.25.9
'@esbuild/android-arm': 0.25.9
'@esbuild/android-arm64': 0.25.9
'@esbuild/android-x64': 0.25.9
'@esbuild/darwin-arm64': 0.25.9
'@esbuild/darwin-x64': 0.25.9
'@esbuild/freebsd-arm64': 0.25.9
'@esbuild/freebsd-x64': 0.25.9
'@esbuild/linux-arm': 0.25.9
'@esbuild/linux-arm64': 0.25.9
'@esbuild/linux-ia32': 0.25.9
'@esbuild/linux-loong64': 0.25.9
'@esbuild/linux-mips64el': 0.25.9
'@esbuild/linux-ppc64': 0.25.9
'@esbuild/linux-riscv64': 0.25.9
'@esbuild/linux-s390x': 0.25.9
'@esbuild/linux-x64': 0.25.9
'@esbuild/netbsd-arm64': 0.25.9
'@esbuild/netbsd-x64': 0.25.9
'@esbuild/openbsd-arm64': 0.25.9
'@esbuild/openbsd-x64': 0.25.9
'@esbuild/openharmony-arm64': 0.25.9
'@esbuild/sunos-x64': 0.25.9
'@esbuild/win32-arm64': 0.25.9
'@esbuild/win32-ia32': 0.25.9
'@esbuild/win32-x64': 0.25.9
'@esbuild/aix-ppc64': 0.25.11
'@esbuild/android-arm': 0.25.11
'@esbuild/android-arm64': 0.25.11
'@esbuild/android-x64': 0.25.11
'@esbuild/darwin-arm64': 0.25.11
'@esbuild/darwin-x64': 0.25.11
'@esbuild/freebsd-arm64': 0.25.11
'@esbuild/freebsd-x64': 0.25.11
'@esbuild/linux-arm': 0.25.11
'@esbuild/linux-arm64': 0.25.11
'@esbuild/linux-ia32': 0.25.11
'@esbuild/linux-loong64': 0.25.11
'@esbuild/linux-mips64el': 0.25.11
'@esbuild/linux-ppc64': 0.25.11
'@esbuild/linux-riscv64': 0.25.11
'@esbuild/linux-s390x': 0.25.11
'@esbuild/linux-x64': 0.25.11
'@esbuild/netbsd-arm64': 0.25.11
'@esbuild/netbsd-x64': 0.25.11
'@esbuild/openbsd-arm64': 0.25.11
'@esbuild/openbsd-x64': 0.25.11
'@esbuild/openharmony-arm64': 0.25.11
'@esbuild/sunos-x64': 0.25.11
'@esbuild/win32-arm64': 0.25.11
'@esbuild/win32-ia32': 0.25.11
'@esbuild/win32-x64': 0.25.11
escalade@3.2.0: {}
@@ -5266,31 +5274,32 @@ snapshots:
reusify@1.0.4: {}
rollup@4.50.1:
rollup@4.52.5:
dependencies:
'@types/estree': 1.0.8
optionalDependencies:
'@rollup/rollup-android-arm-eabi': 4.50.1
'@rollup/rollup-android-arm64': 4.50.1
'@rollup/rollup-darwin-arm64': 4.50.1
'@rollup/rollup-darwin-x64': 4.50.1
'@rollup/rollup-freebsd-arm64': 4.50.1
'@rollup/rollup-freebsd-x64': 4.50.1
'@rollup/rollup-linux-arm-gnueabihf': 4.50.1
'@rollup/rollup-linux-arm-musleabihf': 4.50.1
'@rollup/rollup-linux-arm64-gnu': 4.50.1
'@rollup/rollup-linux-arm64-musl': 4.50.1
'@rollup/rollup-linux-loongarch64-gnu': 4.50.1
'@rollup/rollup-linux-ppc64-gnu': 4.50.1
'@rollup/rollup-linux-riscv64-gnu': 4.50.1
'@rollup/rollup-linux-riscv64-musl': 4.50.1
'@rollup/rollup-linux-s390x-gnu': 4.50.1
'@rollup/rollup-linux-x64-gnu': 4.50.1
'@rollup/rollup-linux-x64-musl': 4.50.1
'@rollup/rollup-openharmony-arm64': 4.50.1
'@rollup/rollup-win32-arm64-msvc': 4.50.1
'@rollup/rollup-win32-ia32-msvc': 4.50.1
'@rollup/rollup-win32-x64-msvc': 4.50.1
'@rollup/rollup-android-arm-eabi': 4.52.5
'@rollup/rollup-android-arm64': 4.52.5
'@rollup/rollup-darwin-arm64': 4.52.5
'@rollup/rollup-darwin-x64': 4.52.5
'@rollup/rollup-freebsd-arm64': 4.52.5
'@rollup/rollup-freebsd-x64': 4.52.5
'@rollup/rollup-linux-arm-gnueabihf': 4.52.5
'@rollup/rollup-linux-arm-musleabihf': 4.52.5
'@rollup/rollup-linux-arm64-gnu': 4.52.5
'@rollup/rollup-linux-arm64-musl': 4.52.5
'@rollup/rollup-linux-loong64-gnu': 4.52.5
'@rollup/rollup-linux-ppc64-gnu': 4.52.5
'@rollup/rollup-linux-riscv64-gnu': 4.52.5
'@rollup/rollup-linux-riscv64-musl': 4.52.5
'@rollup/rollup-linux-s390x-gnu': 4.52.5
'@rollup/rollup-linux-x64-gnu': 4.52.5
'@rollup/rollup-linux-x64-musl': 4.52.5
'@rollup/rollup-openharmony-arm64': 4.52.5
'@rollup/rollup-win32-arm64-msvc': 4.52.5
'@rollup/rollup-win32-ia32-msvc': 4.52.5
'@rollup/rollup-win32-x64-gnu': 4.52.5
'@rollup/rollup-win32-x64-msvc': 4.52.5
fsevents: 2.3.3
rrweb-cssom@0.8.0: {}
@@ -5527,21 +5536,21 @@ snapshots:
dependencies:
global: 4.4.0
vite-plugin-compression2@1.3.3(rollup@4.50.1)(vite@6.3.6(@types/node@22.10.10)(terser@5.43.1)(yaml@2.7.0)):
vite-plugin-compression2@1.3.3(rollup@4.52.5)(vite@6.4.1(@types/node@22.10.10)(terser@5.43.1)(yaml@2.7.0)):
dependencies:
'@rollup/pluginutils': 5.1.3(rollup@4.50.1)
'@rollup/pluginutils': 5.1.3(rollup@4.52.5)
tar-mini: 0.2.0
vite: 6.3.6(@types/node@22.10.10)(terser@5.43.1)(yaml@2.7.0)
vite: 6.4.1(@types/node@22.10.10)(terser@5.43.1)(yaml@2.7.0)
transitivePeerDependencies:
- rollup
vite@6.3.6(@types/node@22.10.10)(terser@5.43.1)(yaml@2.7.0):
vite@6.4.1(@types/node@22.10.10)(terser@5.43.1)(yaml@2.7.0):
dependencies:
esbuild: 0.25.9
esbuild: 0.25.11
fdir: 6.5.0(picomatch@4.0.3)
picomatch: 4.0.3
postcss: 8.5.6
rollup: 4.50.1
rollup: 4.52.5
tinyglobby: 0.2.15
optionalDependencies:
'@types/node': 22.10.10

View File

@@ -91,3 +91,21 @@ export function createURL(endpoint: string, searchParams = {}): string {
return url.toString();
}
export function setSafeTimeout(callback: () => void, delay: number): number {
const MAX_DELAY = 86_400_000;
let remaining = delay;
function scheduleNext(): number {
if (remaining <= MAX_DELAY) {
return window.setTimeout(callback, remaining);
} else {
return window.setTimeout(() => {
remaining -= MAX_DELAY;
scheduleNext();
}, MAX_DELAY);
}
}
return scheduleNext();
}

View File

@@ -0,0 +1,86 @@
<template>
<div>
<div class="path-container" ref="container">
<template v-for="(item, index) in path" :key="index">
/
<span class="path-item">
<span
v-if="isDir === true || index < path.length - 1"
class="material-icons"
>folder
</span>
<span v-else class="material-icons">insert_drive_file</span>
{{ item }}
</span>
</template>
</div>
</div>
</template>
<script setup lang="ts">
import { ref, computed, watch, nextTick, defineProps } from "vue";
import { useRoute } from "vue-router";
import { useFileStore } from "@/stores/file";
import url from "@/utils/url";
const fileStore = useFileStore();
const route = useRoute();
const props = defineProps({
name: {
type: String,
required: true,
},
isDir: {
type: Boolean,
default: false,
},
});
const container = ref<HTMLElement | null>(null);
const path = computed(() => {
let basePath = fileStore.isFiles ? route.path : url.removeLastDir(route.path);
if (!basePath.endsWith("/")) {
basePath += "/";
}
basePath += props.name;
return basePath.split("/").filter(Boolean).splice(1);
});
watch(path, () => {
nextTick(() => {
const lastItem = container.value?.lastElementChild;
lastItem?.scrollIntoView({ behavior: "auto", inline: "end" });
});
});
</script>
<style scoped>
.path-container {
display: flex;
align-items: center;
margin: 0.2em 0;
gap: 0.25em;
overflow-x: auto;
max-width: 100%;
scrollbar-width: none;
opacity: 0.5;
}
.path-container::-webkit-scrollbar {
display: none;
}
.path-item {
display: flex;
align-items: center;
margin: 0.2em 0;
gap: 0.25em;
white-space: nowrap;
}
.path-item > span {
font-size: 0.9em;
}
</style>

View File

@@ -17,7 +17,7 @@
</button>
<button
class="button button--flat button--blue"
@click="saveAndClose"
@click="currentPrompt.saveAction"
:aria-label="$t('buttons.saveChanges')"
:title="$t('buttons.saveChanges')"
tabindex="1"
@@ -39,8 +39,8 @@
</template>
<script>
import { mapState, mapActions } from "pinia";
import { useLayoutStore } from "@/stores/layout";
import { mapActions, mapState } from "pinia";
export default {
name: "discardEditorChanges",
@@ -49,12 +49,6 @@ export default {
},
methods: {
...mapActions(useLayoutStore, ["closeHovers"]),
saveAndClose() {
if (this.currentPrompt?.saveAction) {
this.currentPrompt.saveAction();
}
this.closeHovers();
},
},
};
</script>

View File

@@ -14,6 +14,7 @@
v-model.trim="name"
tabindex="1"
/>
<CreateFilePath :name="name" :is-dir="true" />
</div>
<div class="card-action">
@@ -48,6 +49,7 @@ import { files as api } from "@/api";
import url from "@/utils/url";
import { useRoute, useRouter } from "vue-router";
import { useI18n } from "vue-i18n";
import CreateFilePath from "@/components/prompts/CreateFilePath.vue";
const $showError = inject<IToastError>("$showError")!;

View File

@@ -13,6 +13,7 @@
@keyup.enter="submit"
v-model.trim="name"
/>
<CreateFilePath :name="name" />
</div>
<div class="card-action">
@@ -42,6 +43,7 @@ import { useI18n } from "vue-i18n";
import { useRoute, useRouter } from "vue-router";
import { useFileStore } from "@/stores/file";
import { useLayoutStore } from "@/stores/layout";
import CreateFilePath from "@/components/prompts/CreateFilePath.vue";
import { files as api } from "@/api";
import url from "@/utils/url";

View File

@@ -14,7 +14,7 @@
}}
</h2>
<div class="upload-info">
<div class="upload-speed">{{ speedMbytes }}/s</div>
<div class="upload-speed">{{ speedText }}/s</div>
<div class="upload-eta">{{ formattedETA }} remaining</div>
<div class="upload-percentage">{{ sentPercent }}% Completed</div>
<div class="upload-fraction">
@@ -88,6 +88,7 @@ const uploadStore = useUploadStore();
const { sentBytes, totalBytes } = storeToRefs(uploadStore);
const byteToMbyte = partial({ exponent: 2 });
const byteToKbyte = partial({ exponent: 1 });
const sentPercent = computed(() =>
((uploadStore.sentBytes / uploadStore.totalBytes) * 100).toFixed(2)
@@ -95,11 +96,33 @@ const sentPercent = computed(() =>
const sentMbytes = computed(() => byteToMbyte(uploadStore.sentBytes));
const totalMbytes = computed(() => byteToMbyte(uploadStore.totalBytes));
const speedMbytes = computed(() => byteToMbyte(speed.value));
const speedText = computed(() => {
const bytes = speed.value;
if (bytes < 1024 * 1024) {
const kb = parseFloat(byteToKbyte(bytes));
return `${kb.toFixed(2)} KB`;
} else {
const mb = parseFloat(byteToMbyte(bytes));
return `${mb.toFixed(2)} MB`;
}
});
let lastSpeedUpdate: number = 0;
let recentSpeeds: number[] = [];
let lastThrottleTime = 0;
const throttledCalculateSpeed = (sentBytes: number, oldSentBytes: number) => {
const now = Date.now();
if (now - lastThrottleTime < 100) {
return;
}
lastThrottleTime = now;
calculateSpeed(sentBytes, oldSentBytes);
};
const calculateSpeed = (sentBytes: number, oldSentBytes: number) => {
// Reset the state when the uploads batch is complete
if (sentBytes === 0) {
@@ -149,7 +172,7 @@ const calculateEta = () => {
eta.value = remainingSize / speedBytesPerSecond;
};
watch(sentBytes, calculateSpeed);
watch(sentBytes, throttledCalculateSpeed);
watch(totalBytes, (totalBytes, oldTotalBytes) => {
if (oldTotalBytes !== 0) {

View File

@@ -0,0 +1,24 @@
<template>
<select name="selectAceEditorTheme" v-on:change="change" :value="aceEditorTheme">
<option v-for="theme in themes" :value="theme.theme" :key="theme.theme">
{{ theme.name }}
</option>
</select>
</template>
<script setup lang="ts">
import { type SelectHTMLAttributes } from "vue";
import { themes } from "ace-builds/src-noconflict/ext-themelist";
defineProps<{
aceEditorTheme: string;
}>();
const emit = defineEmits<{
(e: "update:aceEditorTheme", val: string | null): void;
}>();
const change = (event: Event) => {
emit("update:aceEditorTheme", (event.target as SelectHTMLAttributes)?.value);
};
</script>

View File

@@ -45,6 +45,15 @@
animation: 0.2s opac forwards;
}
#login .logout-message {
background: var(--icon-orange);
color: #fff;
padding: 0.5em;
text-align: center;
animation: 0.2s opac forwards;
text-transform: none;
}
@keyframes opac {
0% {
opacity: 0;

View File

@@ -42,7 +42,8 @@
"update": "تحديث",
"upload": "رفع",
"openFile": "فتح الملف",
"discardChanges": "إلغاء التغييرات"
"discardChanges": "إلغاء التغييرات",
"saveChanges": "Save changes"
},
"download": {
"downloadFile": "تحميل الملف",
@@ -100,7 +101,10 @@
"submit": "تسجيل دخول",
"username": "إسم المستخدم",
"usernameTaken": "إسم المستخدم غير متاح",
"wrongCredentials": "بيانات دخول خاطئة"
"wrongCredentials": "بيانات دخول خاطئة",
"logout_reasons": {
"inactivity": "You have been logged out due to inactivity."
}
},
"permanent": "دائم",
"prompts": {
@@ -154,6 +158,7 @@
"video": "فيديوهات"
},
"settings": {
"aceEditorTheme": "Ace editor theme",
"admin": "إدارة",
"administrator": "مدير",
"allowCommands": "تنفيذ اﻷوامر",

View File

@@ -42,7 +42,8 @@
"update": "Actualitzar",
"upload": "Pujar",
"openFile": "Obrir fitxer",
"discardChanges": "Descartar"
"discardChanges": "Descartar",
"saveChanges": "Save changes"
},
"download": {
"downloadFile": "Descarregar fitxer",
@@ -100,7 +101,10 @@
"submit": "Iniciar sessió",
"username": "Usuari",
"usernameTaken": "Nom d'usuari no disponible",
"wrongCredentials": "Usuari i/o contrasenya incorrectes"
"wrongCredentials": "Usuari i/o contrasenya incorrectes",
"logout_reasons": {
"inactivity": "You have been logged out due to inactivity."
}
},
"permanent": "Permanent",
"prompts": {
@@ -154,6 +158,7 @@
"video": "Vídeo"
},
"settings": {
"aceEditorTheme": "Ace editor theme",
"admin": "Admin",
"administrator": "Administrador",
"allowCommands": "Executar comandes",

View File

@@ -42,7 +42,8 @@
"update": "Aktualizovat",
"upload": "Nahrát",
"openFile": "Otevřít soubor",
"discardChanges": "Zrušit změny"
"discardChanges": "Zrušit změny",
"saveChanges": "Save changes"
},
"download": {
"downloadFile": "Stáhnout soubor",
@@ -100,7 +101,10 @@
"submit": "Přihlásit se",
"username": "Uživatelské jméno",
"usernameTaken": "Uživatelské jméno již existuje",
"wrongCredentials": "Nesprávné přihlašovací údaje"
"wrongCredentials": "Nesprávné přihlašovací údaje",
"logout_reasons": {
"inactivity": "You have been logged out due to inactivity."
}
},
"permanent": "Trvalý",
"prompts": {
@@ -154,6 +158,7 @@
"video": "Video"
},
"settings": {
"aceEditorTheme": "Ace editor theme",
"admin": "Admin",
"administrator": "Administrátor",
"allowCommands": "Povolit příkazy",

View File

@@ -42,7 +42,8 @@
"update": "Update",
"upload": "Upload",
"openFile": "Datei öffnen",
"discardChanges": "Verwerfen"
"discardChanges": "Verwerfen",
"saveChanges": "Save changes"
},
"download": {
"downloadFile": "Download Datei",
@@ -100,7 +101,10 @@
"submit": "Login",
"username": "Benutzername",
"usernameTaken": "Benutzername ist bereits vergeben",
"wrongCredentials": "Falsche Zugangsdaten"
"wrongCredentials": "Falsche Zugangsdaten",
"logout_reasons": {
"inactivity": "You have been logged out due to inactivity."
}
},
"permanent": "Permanent",
"prompts": {
@@ -154,6 +158,7 @@
"video": "Video"
},
"settings": {
"aceEditorTheme": "Ace editor theme",
"admin": "Admin",
"administrator": "Administrator",
"allowCommands": "Befehle ausführen",

View File

@@ -42,7 +42,8 @@
"update": "Ενημέρωση",
"upload": "Μεταφόρτωση",
"openFile": "Άνοιγμα αρχείου",
"discardChanges": "Discard"
"discardChanges": "Discard",
"saveChanges": "Save changes"
},
"download": {
"downloadFile": "Λήψη αρχείου",
@@ -100,7 +101,10 @@
"submit": "Είσοδος",
"username": "Όνομα χρήστη",
"usernameTaken": "Το όνομα χρήστη χρησιμοποιείται ήδη",
"wrongCredentials": "Λάθος όνομα ή/και κωδικός πρόσβασης"
"wrongCredentials": "Λάθος όνομα ή/και κωδικός πρόσβασης",
"logout_reasons": {
"inactivity": "You have been logged out due to inactivity."
}
},
"permanent": "Μόνιμο",
"prompts": {
@@ -154,6 +158,7 @@
"video": "Βίντεο"
},
"settings": {
"aceEditorTheme": "Ace editor theme",
"admin": "Διαχειριστής",
"administrator": "Διαχειριστής",
"allowCommands": "Εκτέλεση εντολών",

View File

@@ -42,8 +42,8 @@
"update": "Update",
"upload": "Upload",
"openFile": "Open file",
"discardChanges": "Discard",
"saveChanges": "Save changes"
"discardChanges": "Discard",
"saveChanges": "Save changes"
},
"download": {
"downloadFile": "Download File",
@@ -101,7 +101,10 @@
"submit": "Login",
"username": "Username",
"usernameTaken": "Username already taken",
"wrongCredentials": "Wrong credentials"
"wrongCredentials": "Wrong credentials",
"logout_reasons": {
"inactivity": "You have been logged out due to inactivity."
}
},
"permanent": "Permanent",
"prompts": {
@@ -155,6 +158,7 @@
"video": "Video"
},
"settings": {
"aceEditorTheme": "Ace editor theme",
"admin": "Admin",
"administrator": "Administrator",
"allowCommands": "Execute commands",

View File

@@ -42,7 +42,8 @@
"update": "Actualizar",
"upload": "Subir",
"openFile": "Abrir archivo",
"discardChanges": "Discard"
"discardChanges": "Discard",
"saveChanges": "Guardar cambios"
},
"download": {
"downloadFile": "Descargar fichero",
@@ -100,7 +101,10 @@
"submit": "Iniciar sesión",
"username": "Usuario",
"usernameTaken": "Nombre usuario no disponible",
"wrongCredentials": "Usuario y/o contraseña incorrectos"
"wrongCredentials": "Usuario y/o contraseña incorrectos",
"logout_reasons": {
"inactivity": "You have been logged out due to inactivity."
}
},
"permanent": "Permanente",
"prompts": {
@@ -154,6 +158,7 @@
"video": "Vídeo"
},
"settings": {
"aceEditorTheme": "Ace editor theme",
"admin": "Admin",
"administrator": "Administrador",
"allowCommands": "Ejecutar comandos",

View File

@@ -42,7 +42,8 @@
"update": "به روز سانی",
"upload": "آپلود",
"openFile": "باز کردن فایل",
"discardChanges": "لغو کردن"
"discardChanges": "لغو کردن",
"saveChanges": "Save changes"
},
"download": {
"downloadFile": "دانلود فایل",
@@ -100,7 +101,10 @@
"submit": "ورود",
"username": "نام کاربری",
"usernameTaken": "نام کاربری تکراری",
"wrongCredentials": "خطا در اعتبارسنجی"
"wrongCredentials": "خطا در اعتبارسنجی",
"logout_reasons": {
"inactivity": "You have been logged out due to inactivity."
}
},
"permanent": "دائمی",
"prompts": {
@@ -154,6 +158,7 @@
"video": "ویدئو "
},
"settings": {
"aceEditorTheme": "Ace editor theme",
"admin": "Admin",
"administrator": "Administrator",
"allowCommands": "اجرای دستورات",

View File

@@ -42,7 +42,8 @@
"update": "Mettre à jour",
"upload": "Importer",
"openFile": "Ouvrir le fichier",
"discardChanges": "Annuler"
"discardChanges": "Annuler",
"saveChanges": "Save changes"
},
"download": {
"downloadFile": "Télécharger le fichier",
@@ -100,7 +101,10 @@
"submit": "Se connecter",
"username": "Utilisateur·ice",
"usernameTaken": "Le nom d'utilisateur·ice est déjà pris",
"wrongCredentials": "Identifiants incorrects !"
"wrongCredentials": "Identifiants incorrects !",
"logout_reasons": {
"inactivity": "You have been logged out due to inactivity."
}
},
"permanent": "Permanent",
"prompts": {
@@ -154,6 +158,7 @@
"video": "Vidéo"
},
"settings": {
"aceEditorTheme": "Ace editor theme",
"admin": "Admin",
"administrator": "Administrateur·ice",
"allowCommands": "Exécuter des commandes",

View File

@@ -42,7 +42,8 @@
"update": "עדכון",
"upload": "העלאה",
"openFile": "פתח קובץ",
"discardChanges": "זריקת השינויים"
"discardChanges": "זריקת השינויים",
"saveChanges": "Save changes"
},
"download": {
"downloadFile": "הורד קובץ",
@@ -100,7 +101,10 @@
"submit": "התחברות",
"username": "שם משתמש",
"usernameTaken": "שם המשתמש כבר קיים",
"wrongCredentials": "פרטי התחברות שגויים"
"wrongCredentials": "פרטי התחברות שגויים",
"logout_reasons": {
"inactivity": "You have been logged out due to inactivity."
}
},
"permanent": "קבוע",
"prompts": {
@@ -154,6 +158,7 @@
"video": "וידאו"
},
"settings": {
"aceEditorTheme": "Ace editor theme",
"admin": "מנהל",
"administrator": "מנהל ראשי",
"allowCommands": "הפעלת פקודות",

View File

@@ -42,7 +42,8 @@
"update": "Frissítés",
"upload": "Feltöltés",
"openFile": "Fájl megnyitása",
"discardChanges": "Discard"
"discardChanges": "Discard",
"saveChanges": "Save changes"
},
"download": {
"downloadFile": "Fájl letöltése",
@@ -100,7 +101,10 @@
"submit": "Belépés",
"username": "Felhasználói név",
"usernameTaken": "A felhasználói név már foglalt",
"wrongCredentials": "Hibás hitelesítő adatok"
"wrongCredentials": "Hibás hitelesítő adatok",
"logout_reasons": {
"inactivity": "You have been logged out due to inactivity."
}
},
"permanent": "Állandó",
"prompts": {
@@ -154,6 +158,7 @@
"video": "Videó"
},
"settings": {
"aceEditorTheme": "Ace editor theme",
"admin": "Admin",
"administrator": "Adminisztrátor",
"allowCommands": "Parancsok futtatása",

View File

@@ -42,7 +42,8 @@
"update": "Vista",
"upload": "Hlaða upp",
"openFile": "Open file",
"discardChanges": "Discard"
"discardChanges": "Discard",
"saveChanges": "Save changes"
},
"download": {
"downloadFile": "Sækja skjal",
@@ -100,7 +101,10 @@
"submit": "Innskráning",
"username": "Notendanafn",
"usernameTaken": "Þetta norendanafn er þegar í notkun",
"wrongCredentials": "Rangar notendaupplýsingar"
"wrongCredentials": "Rangar notendaupplýsingar",
"logout_reasons": {
"inactivity": "You have been logged out due to inactivity."
}
},
"permanent": "Varanlegt",
"prompts": {
@@ -154,6 +158,7 @@
"video": "Myndbönd"
},
"settings": {
"aceEditorTheme": "Ace editor theme",
"admin": "Stjórnandi",
"administrator": "Stjórnandi",
"allowCommands": "Senda skipanir",

View File

@@ -42,7 +42,8 @@
"update": "Aggiorna",
"upload": "Carica",
"openFile": "Apri file",
"discardChanges": "Ignora"
"discardChanges": "Ignora",
"saveChanges": "Save changes"
},
"download": {
"downloadFile": "Scarica file",
@@ -100,7 +101,10 @@
"submit": "Entra",
"username": "Nome utente",
"usernameTaken": "Username già usato",
"wrongCredentials": "Credenziali errate"
"wrongCredentials": "Credenziali errate",
"logout_reasons": {
"inactivity": "You have been logged out due to inactivity."
}
},
"permanent": "Permanente",
"prompts": {
@@ -154,6 +158,7 @@
"video": "Video"
},
"settings": {
"aceEditorTheme": "Ace editor theme",
"admin": "Admin",
"administrator": "Amministratore",
"allowCommands": "Esegui comandi",

View File

@@ -42,7 +42,8 @@
"update": "更新",
"upload": "アップロード",
"openFile": "ファイルを開く",
"discardChanges": "Discard"
"discardChanges": "Discard",
"saveChanges": "Save changes"
},
"download": {
"downloadFile": "ファイルのダウンロード",
@@ -100,7 +101,10 @@
"submit": "ログイン",
"username": "ユーザー名",
"usernameTaken": "ユーザー名はすでに取得されています",
"wrongCredentials": "ユーザー名またはパスワードが間違っています"
"wrongCredentials": "ユーザー名またはパスワードが間違っています",
"logout_reasons": {
"inactivity": "You have been logged out due to inactivity."
}
},
"permanent": "永久",
"prompts": {
@@ -154,6 +158,7 @@
"video": "動画"
},
"settings": {
"aceEditorTheme": "Ace editor theme",
"admin": "管理者",
"administrator": "管理者",
"allowCommands": "コマンドの実行",

View File

@@ -3,17 +3,17 @@
"cancel": "취소",
"clear": "지우기",
"close": "닫기",
"continue": "Continue",
"continue": "계속",
"copy": "복사",
"copyFile": "파일 복사",
"copyToClipboard": "클립보드 복사",
"copyDownloadLinkToClipboard": "Copy download link to clipboard",
"copyDownloadLinkToClipboard": "다운로드 링크 복사",
"create": "생성",
"delete": "삭제",
"download": "다운로드",
"file": "File",
"folder": "Folder",
"fullScreen": "Toggle full screen",
"file": "파일",
"folder": "폴더",
"fullScreen": "전체 화면 전환",
"hideDotfiles": "숨김파일(dotfile)을 표시 안함",
"info": "정보",
"more": "더보기",
@@ -24,7 +24,7 @@
"ok": "확인",
"permalink": "링크 얻기",
"previous": "이전",
"preview": "Preview",
"preview": "미리보기",
"publish": "게시",
"rename": "이름 바꾸기",
"replace": "대체",
@@ -36,13 +36,14 @@
"selectMultiple": "다중 선택",
"share": "공유",
"shell": "쉘 전환",
"submit": "Submit",
"submit": "제출",
"switchView": "보기 전환",
"toggleSidebar": "사이드바 전환",
"update": "업데이트",
"upload": "업로드",
"openFile": "Open file",
"discardChanges": "Discard"
"openFile": "파일 열기",
"discardChanges": "변경 사항 취소",
"saveChanges": "변경사항 저장"
},
"download": {
"downloadFile": "파일 다운로드",
@@ -50,13 +51,13 @@
"downloadSelected": "선택 항목 다운로드"
},
"upload": {
"abortUpload": "Are you sure you wish to abort?"
"abortUpload": "업로드를 중단하시겠습니까?"
},
"errors": {
"forbidden": "접근 권한이 없습니다.",
"internal": "오류가 발생하였습니다.",
"notFound": "해당 경로를 찾을 수 없습니다.",
"connection": "The server can't be reached."
"connection": "서버에 연결할 수 없습니다."
},
"files": {
"body": "본문",
@@ -74,7 +75,7 @@
"sortByLastModified": "수정시간순 정렬",
"sortByName": "이름순",
"sortBySize": "크기순",
"noPreview": "Preview is not available for this file."
"noPreview": "미리 보기가 지원되지 않는 파일 유형입니다."
},
"help": {
"click": "파일이나 디렉토리를 선택해주세요.",
@@ -100,7 +101,10 @@
"submit": "로그인",
"username": "사용자 이름",
"usernameTaken": "사용자 이름이 존재합니다",
"wrongCredentials": "사용자 이름 또는 비밀번호를 확인하십시오"
"wrongCredentials": "사용자 이름 또는 비밀번호를 확인하십시오",
"logout_reasons": {
"inactivity": "You have been logged out due to inactivity."
}
},
"permanent": "영구",
"prompts": {
@@ -109,8 +113,8 @@
"currentlyNavigating": "현재 위치:",
"deleteMessageMultiple": "{count} 개의 파일을 삭제하시겠습니까?",
"deleteMessageSingle": "파일 혹은 디렉토리를 삭제하시겠습니까?",
"deleteMessageShare": "Are you sure you wish to delete this share({path})?",
"deleteUser": "Are you sure you want to delete this user?",
"deleteMessageShare": "이 공유({path})를 삭제하시겠습니까?",
"deleteUser": "이 계정을 삭제하시겠습니까?",
"deleteTitle": "파일 삭제",
"displayName": "게시 이름:",
"download": "파일 다운로드",
@@ -137,11 +141,11 @@
"show": "보기",
"size": "크기",
"upload": "업로드",
"uploadFiles": "Uploading {files} files...",
"uploadFiles": "{files}개의 파일 업로드 중...",
"uploadMessage": "업로드 옵션을 선택하세요.",
"optionalPassword": "Optional password",
"resolution": "Resolution",
"discardEditorChanges": "Are you sure you wish to discard the changes you've made?"
"optionalPassword": "비밀번호 (선택)",
"resolution": "해상도",
"discardEditorChanges": "변경 사항을 취소하시겠습니까?"
},
"search": {
"images": "이미지",
@@ -154,6 +158,7 @@
"video": "비디오"
},
"settings": {
"aceEditorTheme": "Ace editor theme",
"admin": "관리자",
"administrator": "관리자",
"allowCommands": "명령 실행",
@@ -170,14 +175,14 @@
"commandRunnerHelp": "이벤트에 해당하는 명령을 설정하세요. 줄당 1개의 명령을 적으세요. 환경 변수{0} 와 {1}이 사용가능하며, {0} 은 {1}에 상대 경로 입니다. 자세한 사항은 {2} 를 참조하세요.",
"commandsUpdated": "명령 수정됨!",
"createUserDir": "Auto create user home dir while adding new user",
"minimumPasswordLength": "Minimum password length",
"tusUploads": "Chunked Uploads",
"tusUploadsHelp": "File Browser supports chunked file uploads, allowing for the creation of efficient, reliable, resumable and chunked file uploads even on unreliable networks.",
"tusUploadsChunkSize": "Indicates to maximum size of a request (direct uploads will be used for smaller uploads). You may input a plain integer denoting byte size input or a string like 10MB, 1GB etc.",
"tusUploadsRetryCount": "Number of retries to perform if a chunk fails to upload.",
"userHomeBasePath": "Base path for user home directories",
"userScopeGenerationPlaceholder": "The scope will be auto generated",
"createUserHomeDirectory": "Create user home directory",
"minimumPasswordLength": "최소 비밀번호 길이",
"tusUploads": "분할 업로드",
"tusUploadsHelp": "File Browser는 불안정한 네트워크에서도 효율적이고 신뢰성 있는 분할 업로드를 지원합니다.",
"tusUploadsChunkSize": "업로드 요청의 최대 크기 (예: 10MB, 1GB)",
"tusUploadsRetryCount": "업로드 실패 시 재시도 횟수",
"userHomeBasePath": "사용자 홈 폴더 기본 경로",
"userScopeGenerationPlaceholder": "범위는 자동으로 생성됩니다.",
"createUserHomeDirectory": "사용자 홈 폴더 생성",
"customStylesheet": "커스텀 스타일시트",
"defaultUserDescription": "아래 사항은 신규 사용자들에 대한 기본 설정입니다.",
"disableExternalLinks": "외부 링크 감추기",
@@ -217,14 +222,14 @@
"rules": "룰",
"rulesHelp": "사용자별로 규칙을 허용/방지를 지정할 수 있습니다. 방지된 파일은 보이지 않고 사용자들은 접근할 수 없습니다. 사용자의 접근 허용 범위와 관련해 정규표현식(regex)과 경로를 지원합니다.\n",
"scope": "범위",
"setDateFormat": "Set exact date format",
"setDateFormat": "날짜 형식 설정",
"settingsUpdated": "설정 수정됨!",
"shareDuration": "공유 기간",
"shareManagement": "공유 내역 관리",
"shareDeleted": "Share deleted!",
"shareDeleted": "공유 삭제됨!",
"singleClick": "한번 클릭으로 파일과 폴더를 열도록 합니다.",
"themes": {
"default": "System default",
"default": "시스템 기본값",
"dark": "다크테마",
"light": "라이트테마",
"title": "테마"

View File

@@ -42,7 +42,8 @@
"update": "Updaten",
"upload": "Uploaden",
"openFile": "Open file",
"discardChanges": "Discard"
"discardChanges": "Discard",
"saveChanges": "Save changes"
},
"download": {
"downloadFile": "Bestand downloaden",
@@ -100,7 +101,10 @@
"submit": "Log in",
"username": "Gebruikersnaam",
"usernameTaken": "Gebruikersnaam reeds in gebruik",
"wrongCredentials": "Verkeerde inloggegevens"
"wrongCredentials": "Verkeerde inloggegevens",
"logout_reasons": {
"inactivity": "You have been logged out due to inactivity."
}
},
"permanent": "Permanent",
"prompts": {
@@ -154,6 +158,7 @@
"video": "Video"
},
"settings": {
"aceEditorTheme": "Ace editor theme",
"admin": "Admin",
"administrator": "Administrator",
"allowCommands": "Commando's uitvoeren",

View File

@@ -42,7 +42,8 @@
"update": "Opptater",
"upload": "Last opp",
"openFile": "Open file",
"discardChanges": "Slett"
"discardChanges": "Slett",
"saveChanges": "Lagre Endringane "
},
"download": {
"downloadFile": "Nedlast filen",
@@ -100,7 +101,10 @@
"submit": "Logg inn",
"username": "Brukernavn",
"usernameTaken": "Brukernavn er allerede i bruk",
"wrongCredentials": "Feil legitimasjon"
"wrongCredentials": "Feil legitimasjon",
"logout_reasons": {
"inactivity": "Du har blitt logget ut på grunn av inaktivitet"
}
},
"permanent": "Permanent",
"prompts": {
@@ -154,6 +158,7 @@
"video": "Video"
},
"settings": {
"aceEditorTheme": "Ace editor theme",
"admin": "Admin",
"administrator": "Administrator",
"allowCommands": "Utfør kommandoer",

View File

@@ -42,7 +42,8 @@
"update": "Aktualizuj",
"upload": "Wyślij",
"openFile": "Otwórz plik",
"discardChanges": "Odrzuć"
"discardChanges": "Odrzuć",
"saveChanges": "Zapisz zmiany"
},
"download": {
"downloadFile": "Pobierz plik",
@@ -100,7 +101,10 @@
"submit": "Zaloguj",
"username": "Nazwa użytkownika",
"usernameTaken": "Ta nazwa użytkownika jest zajęta",
"wrongCredentials": "Błędne dane logowania"
"wrongCredentials": "Błędne dane logowania",
"logout_reasons": {
"inactivity": "Wylogowano z powodu braku aktywności."
}
},
"permanent": "Permanentny",
"prompts": {
@@ -154,6 +158,7 @@
"video": "Wideo"
},
"settings": {
"aceEditorTheme": "Ace editor theme",
"admin": "Admin",
"administrator": "Administrator",
"allowCommands": "Wykonaj polecenie",

View File

@@ -42,7 +42,8 @@
"update": "Atualizar",
"upload": "Enviar",
"openFile": "Abrir",
"discardChanges": "Discard"
"discardChanges": "Discard",
"saveChanges": "Save changes"
},
"download": {
"downloadFile": "Baixar arquivo",
@@ -100,7 +101,10 @@
"submit": "Login",
"username": "Nome do usuário",
"usernameTaken": "Nome de usuário já existe",
"wrongCredentials": "Ops! Dados incorretos."
"wrongCredentials": "Ops! Dados incorretos.",
"logout_reasons": {
"inactivity": "You have been logged out due to inactivity."
}
},
"permanent": "Permanente",
"prompts": {
@@ -154,6 +158,7 @@
"video": "Vídeos"
},
"settings": {
"aceEditorTheme": "Ace editor theme",
"admin": "Admin",
"administrator": "Administrador",
"allowCommands": "Executar comandos",

View File

@@ -42,7 +42,8 @@
"update": "Atualizar",
"upload": "Enviar",
"openFile": "Open file",
"discardChanges": "Discard"
"discardChanges": "Discard",
"saveChanges": "Save changes"
},
"download": {
"downloadFile": "Descarregar ficheiro",
@@ -100,7 +101,10 @@
"submit": "Entrar na conta",
"username": "Nome de utilizador",
"usernameTaken": "O nome de utilizador já está registado",
"wrongCredentials": "Dados errados"
"wrongCredentials": "Dados errados",
"logout_reasons": {
"inactivity": "You have been logged out due to inactivity."
}
},
"permanent": "Permanente",
"prompts": {
@@ -154,6 +158,7 @@
"video": "Vídeos"
},
"settings": {
"aceEditorTheme": "Ace editor theme",
"admin": "Admin",
"administrator": "Administrador",
"allowCommands": "Executar comandos",

View File

@@ -42,7 +42,8 @@
"update": "Actualizează",
"upload": "Încarcă",
"openFile": "Open file",
"discardChanges": "Discard"
"discardChanges": "Discard",
"saveChanges": "Save changes"
},
"download": {
"downloadFile": "Descarcă fișier",
@@ -100,7 +101,10 @@
"submit": "Autentificare",
"username": "Utilizator",
"usernameTaken": "Utilizatorul există",
"wrongCredentials": "Informații greșite"
"wrongCredentials": "Informații greșite",
"logout_reasons": {
"inactivity": "You have been logged out due to inactivity."
}
},
"permanent": "Permanent",
"prompts": {
@@ -154,6 +158,7 @@
"video": "Video"
},
"settings": {
"aceEditorTheme": "Ace editor theme",
"admin": "Admin",
"administrator": "Administrator",
"allowCommands": "Execută comenzi",

View File

@@ -42,7 +42,8 @@
"update": "Обновить",
"upload": "Загрузить",
"openFile": "Открыть файл",
"discardChanges": "Отказаться"
"discardChanges": "Отказаться",
"saveChanges": "Save changes"
},
"download": {
"downloadFile": "Скачать файл",
@@ -100,7 +101,10 @@
"submit": "Войти",
"username": "Имя пользователя",
"usernameTaken": "Данное имя пользователя уже занято",
"wrongCredentials": "Неверные данные"
"wrongCredentials": "Неверные данные",
"logout_reasons": {
"inactivity": "You have been logged out due to inactivity."
}
},
"permanent": "Постоянный",
"prompts": {
@@ -154,6 +158,7 @@
"video": "Видео"
},
"settings": {
"aceEditorTheme": "Ace editor theme",
"admin": "Админ",
"administrator": "Администратор",
"allowCommands": "Запуск команд",

View File

@@ -42,7 +42,8 @@
"update": "Aktualizovať",
"upload": "Nahrať",
"openFile": "Otvoriť súbor",
"discardChanges": "Zahodiť"
"discardChanges": "Zahodiť",
"saveChanges": "Save changes"
},
"download": {
"downloadFile": "Stiahnuť súbor",
@@ -100,7 +101,10 @@
"submit": "Prihlásiť",
"username": "Používateľské meno",
"usernameTaken": "Meno je už obsadené",
"wrongCredentials": "Nesprávne prihlasovacie údaje"
"wrongCredentials": "Nesprávne prihlasovacie údaje",
"logout_reasons": {
"inactivity": "You have been logged out due to inactivity."
}
},
"permanent": "Trvalé",
"prompts": {
@@ -154,6 +158,7 @@
"video": "Video"
},
"settings": {
"aceEditorTheme": "Ace editor theme",
"admin": "Admin",
"administrator": "Administrátor",
"allowCommands": "Vykonávať príkazy",

View File

@@ -42,7 +42,8 @@
"update": "Uppdatera",
"upload": "Ladda upp",
"openFile": "Open file",
"discardChanges": "Discard"
"discardChanges": "Discard",
"saveChanges": "Save changes"
},
"download": {
"downloadFile": "Ladda ner fil",
@@ -100,7 +101,10 @@
"submit": "Logga in",
"username": "Användarnamn",
"usernameTaken": "Användarnamn upptaget",
"wrongCredentials": "Fel inloggning"
"wrongCredentials": "Fel inloggning",
"logout_reasons": {
"inactivity": "You have been logged out due to inactivity."
}
},
"permanent": "Permanent",
"prompts": {
@@ -154,6 +158,7 @@
"video": "Video"
},
"settings": {
"aceEditorTheme": "Ace editor theme",
"admin": "Admin",
"administrator": "Administratör",
"allowCommands": "Exekvera kommandon",

View File

@@ -42,7 +42,8 @@
"update": "Güncelle",
"upload": "Yükle",
"openFile": "Dosyayı aç",
"discardChanges": "Discard"
"discardChanges": "Discard",
"saveChanges": "Save changes"
},
"download": {
"downloadFile": "Dosyayı indir",
@@ -100,7 +101,10 @@
"submit": "Giriş",
"username": "Kullanıcı adı",
"usernameTaken": "Kullanıcı adı mevcut",
"wrongCredentials": "Yanlış hesap bilgileri"
"wrongCredentials": "Yanlış hesap bilgileri",
"logout_reasons": {
"inactivity": "You have been logged out due to inactivity."
}
},
"permanent": "Kalıcı",
"prompts": {
@@ -154,6 +158,7 @@
"video": "Video"
},
"settings": {
"aceEditorTheme": "Ace editor theme",
"admin": "Yönetim",
"administrator": "Yönetici",
"allowCommands": "Komutları çalıştır",

View File

@@ -42,7 +42,8 @@
"update": "Оновити",
"upload": "Вивантажити",
"openFile": "Відкрити файл",
"discardChanges": "Скасувати"
"discardChanges": "Скасувати",
"saveChanges": "Save changes"
},
"download": {
"downloadFile": "Завантажити файл",
@@ -100,7 +101,10 @@
"submit": "Увійти",
"username": "Ім'я користувача",
"usernameTaken": "Ім'я користувача вже використовується",
"wrongCredentials": "Неправильне ім'я користувача або пароль"
"wrongCredentials": "Неправильне ім'я користувача або пароль",
"logout_reasons": {
"inactivity": "You have been logged out due to inactivity."
}
},
"permanent": "Постійний",
"prompts": {
@@ -154,6 +158,7 @@
"video": "Відео"
},
"settings": {
"aceEditorTheme": "Ace editor theme",
"admin": "Адмін",
"administrator": "Адміністратор",
"allowCommands": "Запуск команд",

View File

@@ -42,7 +42,8 @@
"update": "Cập nhật",
"upload": "Tải lên",
"openFile": "Mở tệp",
"discardChanges": "Hủy bỏ thay đổi"
"discardChanges": "Hủy bỏ thay đổi",
"saveChanges": "Save changes"
},
"download": {
"downloadFile": "Tải xuống tệp tin",
@@ -100,7 +101,10 @@
"submit": "Đăng nhập",
"username": "Tên người dùng",
"usernameTaken": "Tên người dùng đã tồn tại",
"wrongCredentials": "Thông tin đăng nhập không đúng"
"wrongCredentials": "Thông tin đăng nhập không đúng",
"logout_reasons": {
"inactivity": "You have been logged out due to inactivity."
}
},
"permanent": "Vĩnh viễn",
"prompts": {
@@ -154,6 +158,7 @@
"video": "Video"
},
"settings": {
"aceEditorTheme": "Ace editor theme",
"admin": "Quản trị viên",
"administrator": "Người quản trị",
"allowCommands": "Thực thi lệnh",

View File

@@ -42,7 +42,8 @@
"update": "更新",
"upload": "上传",
"openFile": "打开文件",
"discardChanges": "放弃更改"
"discardChanges": "放弃更改",
"saveChanges": "Save changes"
},
"download": {
"downloadFile": "下载文件",
@@ -100,7 +101,10 @@
"submit": "登录",
"username": "用户名",
"usernameTaken": "用户名已经被使用",
"wrongCredentials": "用户名或密码错误"
"wrongCredentials": "用户名或密码错误",
"logout_reasons": {
"inactivity": "You have been logged out due to inactivity."
}
},
"permanent": "永久",
"prompts": {
@@ -154,6 +158,7 @@
"video": "视频"
},
"settings": {
"aceEditorTheme": "Ace editor theme",
"admin": "管理员",
"administrator": "管理员",
"allowCommands": "执行命令Shell 命令)",

View File

@@ -42,7 +42,8 @@
"update": "更新",
"upload": "上傳",
"openFile": "開啟檔案",
"discardChanges": "放棄變更"
"discardChanges": "放棄變更",
"saveChanges": "Save changes"
},
"download": {
"downloadFile": "下載檔案",
@@ -100,7 +101,10 @@
"submit": "登入",
"username": "帳號",
"usernameTaken": "用戶名已存在",
"wrongCredentials": "帳號或密碼錯誤"
"wrongCredentials": "帳號或密碼錯誤",
"logout_reasons": {
"inactivity": "You have been logged out due to inactivity."
}
},
"permanent": "永久",
"prompts": {
@@ -154,6 +158,7 @@
"video": "影片"
},
"settings": {
"aceEditorTheme": "Ace editor theme",
"admin": "管理員",
"administrator": "管理員",
"allowCommands": "執行命令",

View File

@@ -7,9 +7,11 @@ export const useAuthStore = defineStore("auth", {
state: (): {
user: IUser | null;
jwt: string;
logoutTimer: number | null;
} => ({
user: null,
jwt: "",
logoutTimer: null,
}),
getters: {
// user and jwt getter removed, no longer needed
@@ -37,5 +39,8 @@ export const useAuthStore = defineStore("auth", {
clearUser() {
this.$reset();
},
setLogoutTimer(logoutTimer: number | null) {
this.logoutTimer = logoutTimer;
},
},
});

View File

@@ -21,6 +21,7 @@ interface SettingsDefaults {
commands: any[];
hideDotfiles: boolean;
dateFormat: boolean;
aceEditorTheme: string;
}
interface SettingsBranding {

View File

@@ -13,6 +13,7 @@ interface IUser {
dateFormat: boolean;
viewMode: ViewModeType;
sorting?: Sorting;
aceEditorTheme: string;
}
type ViewModeType = "list" | "mosaic" | "mosaic gallery";

View File

@@ -4,6 +4,7 @@ import type { JwtPayload } from "jwt-decode";
import { jwtDecode } from "jwt-decode";
import { baseURL, noAuth } from "./constants";
import { StatusError } from "@/api/utils";
import { setSafeTimeout } from "@/api/utils";
export function parseToken(token: string) {
// falsy or malformed jwt will throw InvalidTokenError
@@ -16,6 +17,18 @@ export function parseToken(token: string) {
const authStore = useAuthStore();
authStore.jwt = token;
authStore.setUser(data.user);
if (authStore.logoutTimer) {
clearTimeout(authStore.logoutTimer);
}
const expiresAt = new Date(data.exp! * 1000);
const timeout = expiresAt.getTime() - Date.now();
authStore.setLogoutTimer(
setSafeTimeout(() => {
logout("inactivity");
}, timeout)
);
}
export async function validateLogin() {
@@ -92,7 +105,7 @@ export async function signup(username: string, password: string) {
}
}
export function logout() {
export function logout(reason?: string) {
document.cookie = "auth=; Max-Age=0; Path=/; SameSite=Strict;";
const authStore = useAuthStore();
@@ -102,6 +115,15 @@ export function logout() {
if (noAuth) {
window.location.reload();
} else {
router.push({ path: "/login" });
if (typeof reason === "string" && reason.trim() !== "") {
router.push({
path: "/login",
query: { "logout-reason": reason },
});
} else {
router.push({
path: "/login",
});
}
}
}

View File

@@ -1,4 +1,6 @@
import { theme } from "./constants";
import "ace-builds";
import { themesByName } from "ace-builds/src-noconflict/ext-themelist";
export const getTheme = (): UserTheme => {
return (document.documentElement.className as UserTheme) || theme;
@@ -32,3 +34,17 @@ export const getMediaPreference = (): UserTheme => {
return "light";
}
};
export const getEditorTheme = (themeName: string) => {
if (!themeName.startsWith("ace/theme/")) {
themeName = `ace/theme/${themeName}`;
}
const themeKey = themeName.replace("ace/theme/", "");
if (themesByName[themeKey] !== undefined) {
return themeName;
} else if (getTheme() === "dark") {
return "ace/theme/twilight";
} else {
return "ace/theme/chrome";
}
};

View File

@@ -3,6 +3,9 @@
<form @submit="submit">
<img :src="logoURL" alt="File Browser" />
<h1>{{ name }}</h1>
<p v-if="reason != null" class="logout-message">
{{ t(`login.logout_reasons.${reason}`) }}
</p>
<div v-if="error !== ''" class="wrong">{{ error }}</div>
<input
@@ -70,6 +73,8 @@ const toggleMode = () => (createMode.value = !createMode.value);
const $showError = inject<IToastError>("$showError")!;
const reason = route.query["logout-reason"] ?? null;
const submit = async (event: Event) => {
event.preventDefault();
event.stopPropagation();

View File

@@ -69,7 +69,7 @@ import HeaderBar from "@/components/header/HeaderBar.vue";
import { useAuthStore } from "@/stores/auth";
import { useFileStore } from "@/stores/file";
import { useLayoutStore } from "@/stores/layout";
import { getTheme } from "@/utils/theme";
import { getEditorTheme } from "@/utils/theme";
import { marked } from "marked";
import { inject, onBeforeUnmount, onMounted, ref, watchEffect } from "vue";
import { useI18n } from "vue-i18n";
@@ -122,7 +122,7 @@ onMounted(() => {
value: fileContent,
showPrintMargin: false,
readOnly: fileStore.req?.type === "textImmutable",
theme: "ace/theme/chrome",
theme: getEditorTheme(authStore.user?.aceEditorTheme ?? ""),
mode: modelist.getModeForPath(fileStore.req!.name).mode,
wrap: true,
enableBasicAutocompletion: true,
@@ -130,10 +130,6 @@ onMounted(() => {
enableSnippets: true,
});
if (getTheme() === "dark") {
editor.value!.setTheme("ace/theme/twilight");
}
editor.value.setFontSize(fontSize.value);
editor.value.focus();
});
@@ -219,6 +215,25 @@ const decreaseFontSize = () => {
};
const close = () => {
if (!editor.value?.session.getUndoManager().isClean()) {
layoutStore.showHover({
prompt: "discardEditorChanges",
confirm: (event: Event) => {
event.preventDefault();
finishClose();
},
saveAction: async () => {
await save();
finishClose();
},
});
return;
}
finishClose();
};
const finishClose = () => {
fileStore.updateRequest(null);
const uri = url.removeLastDir(route.path) + "/";
router.push({ path: uri });
};

View File

@@ -65,7 +65,7 @@
<a
class="link"
target="_blank"
href="https://filebrowser.org/configuration.html#command-runner"
href="https://filebrowser.org/configuration.html#custom-branding"
>{{ t("settings.documentation") }}</a
>
</i18n-t>

View File

@@ -24,6 +24,13 @@
class="input input--block"
v-model:locale="locale"
></languages>
<h3>{{ t("settings.aceEditorTheme") }}</h3>
<AceEditorTheme
class="input input--block"
v-model:aceEditorTheme="aceEditorTheme"
id="aceTheme"
></AceEditorTheme>
</div>
<div class="card-action">
@@ -81,6 +88,7 @@
import { useAuthStore } from "@/stores/auth";
import { useLayoutStore } from "@/stores/layout";
import { users as api } from "@/api";
import AceEditorTheme from "@/components/settings/AceEditorTheme.vue";
import Languages from "@/components/settings/Languages.vue";
import { computed, inject, onMounted, ref } from "vue";
import { useI18n } from "vue-i18n";
@@ -98,6 +106,7 @@ const hideDotfiles = ref<boolean>(false);
const singleClick = ref<boolean>(false);
const dateFormat = ref<boolean>(false);
const locale = ref<string>("");
const aceEditorTheme = ref<string>("");
const passwordClass = computed(() => {
const baseClass = "input input--block";
@@ -113,13 +122,14 @@ const passwordClass = computed(() => {
return `${baseClass} input--red`;
});
onMounted(() => {
onMounted(async () => {
layoutStore.loading = true;
if (authStore.user === null) return false;
locale.value = authStore.user.locale;
hideDotfiles.value = authStore.user.hideDotfiles;
singleClick.value = authStore.user.singleClick;
dateFormat.value = authStore.user.dateFormat;
aceEditorTheme.value = authStore.user.aceEditorTheme;
layoutStore.loading = false;
return true;
});
@@ -163,6 +173,7 @@ const updateSettings = async (event: Event) => {
hideDotfiles: hideDotfiles.value,
singleClick: singleClick.value,
dateFormat: dateFormat.value,
aceEditorTheme: aceEditorTheme.value,
};
await api.update(data, [
@@ -170,6 +181,7 @@ const updateSettings = async (event: Event) => {
"hideDotfiles",
"singleClick",
"dateFormat",
"aceEditorTheme",
]);
authStore.updateUser(data);
$showSuccess(t("settings.settingsUpdated"));

View File

@@ -21,16 +21,17 @@ const (
)
type userInfo struct {
ID uint `json:"id"`
Locale string `json:"locale"`
ViewMode users.ViewMode `json:"viewMode"`
SingleClick bool `json:"singleClick"`
Perm users.Permissions `json:"perm"`
Commands []string `json:"commands"`
LockPassword bool `json:"lockPassword"`
HideDotfiles bool `json:"hideDotfiles"`
DateFormat bool `json:"dateFormat"`
Username string `json:"username"`
ID uint `json:"id"`
Locale string `json:"locale"`
ViewMode users.ViewMode `json:"viewMode"`
SingleClick bool `json:"singleClick"`
Perm users.Permissions `json:"perm"`
Commands []string `json:"commands"`
LockPassword bool `json:"lockPassword"`
HideDotfiles bool `json:"hideDotfiles"`
DateFormat bool `json:"dateFormat"`
Username string `json:"username"`
AceEditorTheme string `json:"aceEditorTheme"`
}
type authToken struct {
@@ -50,11 +51,6 @@ func (e extractor) ExtractToken(r *http.Request) (string, error) {
return token, nil
}
auth := r.URL.Query().Get("auth")
if auth != "" && strings.Count(auth, ".") == 2 {
return auth, nil
}
if r.Method == http.MethodGet {
cookie, _ := r.Cookie("auth")
if cookie != nil && strings.Count(cookie.Value, ".") == 2 {
@@ -190,16 +186,17 @@ func renewHandler(tokenExpireTime time.Duration) handleFunc {
func printToken(w http.ResponseWriter, _ *http.Request, d *data, user *users.User, tokenExpirationTime time.Duration) (int, error) {
claims := &authToken{
User: userInfo{
ID: user.ID,
Locale: user.Locale,
ViewMode: user.ViewMode,
SingleClick: user.SingleClick,
Perm: user.Perm,
LockPassword: user.LockPassword,
Commands: user.Commands,
HideDotfiles: user.HideDotfiles,
DateFormat: user.DateFormat,
Username: user.Username,
ID: user.ID,
Locale: user.Locale,
ViewMode: user.ViewMode,
SingleClick: user.SingleClick,
Perm: user.Perm,
LockPassword: user.LockPassword,
Commands: user.Commands,
HideDotfiles: user.HideDotfiles,
DateFormat: user.DateFormat,
Username: user.Username,
AceEditorTheme: user.AceEditorTheme,
},
RegisteredClaims: jwt.RegisteredClaims{
IssuedAt: jwt.NewNumericDate(time.Now()),

View File

@@ -8,15 +8,16 @@ import (
// UserDefaults is a type that holds the default values
// for some fields on User.
type UserDefaults struct {
Scope string `json:"scope"`
Locale string `json:"locale"`
ViewMode users.ViewMode `json:"viewMode"`
SingleClick bool `json:"singleClick"`
Sorting files.Sorting `json:"sorting"`
Perm users.Permissions `json:"perm"`
Commands []string `json:"commands"`
HideDotfiles bool `json:"hideDotfiles"`
DateFormat bool `json:"dateFormat"`
Scope string `json:"scope"`
Locale string `json:"locale"`
ViewMode users.ViewMode `json:"viewMode"`
SingleClick bool `json:"singleClick"`
Sorting files.Sorting `json:"sorting"`
Perm users.Permissions `json:"perm"`
Commands []string `json:"commands"`
HideDotfiles bool `json:"hideDotfiles"`
DateFormat bool `json:"dateFormat"`
AceEditorTheme string `json:"aceEditorTheme"`
}
// Apply applies the default options to a user.
@@ -30,4 +31,5 @@ func (d *UserDefaults) Apply(u *users.User) {
u.Commands = d.Commands
u.HideDotfiles = d.HideDotfiles
u.DateFormat = d.DateFormat
u.AceEditorTheme = d.AceEditorTheme
}

View File

@@ -3,5 +3,6 @@
"@commitlint/cli": "^15.0.0",
"@commitlint/config-conventional": "^15.0.0",
"standard-version": "^9.3.2"
}
},
"packageManager": "yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e"
}

View File

@@ -20,21 +20,22 @@ const (
// User describes a user.
type User struct {
ID uint `storm:"id,increment" json:"id"`
Username string `storm:"unique" json:"username"`
Password string `json:"password"`
Scope string `json:"scope"`
Locale string `json:"locale"`
LockPassword bool `json:"lockPassword"`
ViewMode ViewMode `json:"viewMode"`
SingleClick bool `json:"singleClick"`
Perm Permissions `json:"perm"`
Commands []string `json:"commands"`
Sorting files.Sorting `json:"sorting"`
Fs afero.Fs `json:"-" yaml:"-"`
Rules []rules.Rule `json:"rules"`
HideDotfiles bool `json:"hideDotfiles"`
DateFormat bool `json:"dateFormat"`
ID uint `storm:"id,increment" json:"id"`
Username string `storm:"unique" json:"username"`
Password string `json:"password"`
Scope string `json:"scope"`
Locale string `json:"locale"`
LockPassword bool `json:"lockPassword"`
ViewMode ViewMode `json:"viewMode"`
SingleClick bool `json:"singleClick"`
Perm Permissions `json:"perm"`
Commands []string `json:"commands"`
Sorting files.Sorting `json:"sorting"`
Fs afero.Fs `json:"-" yaml:"-"`
Rules []rules.Rule `json:"rules"`
HideDotfiles bool `json:"hideDotfiles"`
DateFormat bool `json:"dateFormat"`
AceEditorTheme string `json:"aceEditorTheme"`
}
// GetRules implements rules.Provider.