From aa4bc445aace2e29f02c28922d33ee64c9e480bc Mon Sep 17 00:00:00 2001 From: Graham Steffaniak <42989099+gtsteffaniak@users.noreply.github.com> Date: Wed, 6 Sep 2023 16:07:35 -0500 Subject: [PATCH 1/9] Update README.md --- README.md | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 1b0a8af6..1765214f 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,13 @@ -## Filebrowser +

+ License: MIT +

+

+ +

+

Filebrowser - A modern file manager for the web

+

+ +

> **NOTE** Intended for docker use only @@ -44,15 +53,12 @@ will only recieve security updates. These changes are mentioned above. Once this is fully complete, the only updates to th ## Look - -This is how desktop search looks in 0.2.0 -![darkmode-capture1](https://github.com/gtsteffaniak/filebrowser/assets/42989099/35cdeb3b-ab79-4b04-8001-8f51f6ea06bb) - -![darkmode2](https://github.com/gtsteffaniak/filebrowser/assets/42989099/8d426356-26cf-407b-b078-bf58f198e799) - -However [mobile search](https://github.com/gtsteffaniak/filebrowser/assets/42989099/37e8f03b-4f5a-4689-aa6c-5cd858a858e9) still appears very similar to filebrowser/filebrowsers original implementation. - -[Mobile web also looks similar](https://github.com/gtsteffaniak/filebrowser/assets/42989099/b04d3c1f-154b-45ba-927c-2112926ad3a9) +

+ + + + +

## Performance From 668bbdd481b8ef86bfed53781d46e5f4acfd3467 Mon Sep 17 00:00:00 2001 From: Graham Steffaniak Date: Sat, 9 Sep 2023 16:20:02 -0500 Subject: [PATCH 2/9] removed ace theme due to issue --- backend/http/static.go | 3 +- frontend/package-lock.json | 291 ++++++++++-------- frontend/package.json | 6 +- .../img/icons/android-chrome-192x192.png | 1 + .../img/icons/android-chrome-256x256.png | 1 + frontend/public/img/icons/favicon-16x16.png | 1 + frontend/public/img/icons/favicon-256x256.png | Bin 0 -> 15614 bytes frontend/public/img/icons/favicon-32x32.png | Bin 47441 -> 0 bytes frontend/public/img/icons/favicon.ico | Bin 194366 -> 67646 bytes frontend/public/img/icons/mstile-150x150.png | Bin 47441 -> 0 bytes frontend/public/img/icons/mstile-256x256.png | 1 + frontend/public/index.html | 10 +- frontend/src/views/bars/EditorBar.vue | 21 -- frontend/src/views/files/Editor.vue | 24 +- frontend/vue.config.js | 8 +- 15 files changed, 193 insertions(+), 174 deletions(-) create mode 120000 frontend/public/img/icons/android-chrome-192x192.png create mode 120000 frontend/public/img/icons/android-chrome-256x256.png create mode 120000 frontend/public/img/icons/favicon-16x16.png create mode 100644 frontend/public/img/icons/favicon-256x256.png delete mode 100644 frontend/public/img/icons/favicon-32x32.png delete mode 100644 frontend/public/img/icons/mstile-150x150.png create mode 120000 frontend/public/img/icons/mstile-256x256.png diff --git a/backend/http/static.go b/backend/http/static.go index b0e1685e..db475bc4 100644 --- a/backend/http/static.go +++ b/backend/http/static.go @@ -98,6 +98,7 @@ func handleWithStaticData(w http.ResponseWriter, _ *http.Request, d *data, fSys } func getStaticHandlers(store *storage.Storage, server *settings.Server, assetsFs fs.FS) (index, static http.Handler) { + log.Print("requesting", store, assetsFs) index = handle(func(w http.ResponseWriter, r *http.Request, d *data) (int, error) { if r.Method != http.MethodGet { return http.StatusNotFound, nil @@ -139,7 +140,7 @@ func getStaticHandlers(store *storage.Storage, server *settings.Server, assetsFs } w.Header().Set("Content-Encoding", "gzip") - w.Header().Set("Content-Type", "application/javascript; charset=utf-8") + w.Header().Set("Content-Type", "application/javascript; charset=utf-8") // Set the correct MIME type for JavaScript files if _, err := w.Write(fileContents); err != nil { return http.StatusInternalServerError, err diff --git a/frontend/package-lock.json b/frontend/package-lock.json index e5deadfb..d54ba7b2 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -8,7 +8,7 @@ "name": "filebrowser-frontend", "version": "2.0.0", "dependencies": { - "ace-builds": "^1.4.7", + "ace-builds": "^1.24.2", "clipboard": "^2.0.4", "css-vars-ponyfill": "^2.4.3", "file-loader": "^6.2.0", @@ -53,12 +53,12 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.10.tgz", - "integrity": "sha512-/KKIMG4UEL35WmI9OlvMhurwtytjvXoFcGNrOvyG9zIzA8YmPjVtIZUf7b05+TPO7G7/GEmLHDaoCgACHl9hhA==", + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", "dev": true, "dependencies": { - "@babel/highlight": "^7.22.10", + "@babel/highlight": "^7.22.13", "chalk": "^2.4.2" }, "engines": { @@ -137,13 +137,13 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.10.tgz", - "integrity": "sha512-JMSwHD4J7SLod0idLq5PKgI+6g/hLD/iuWBq08ZX49xE14VpVEojJ5rHWptpirV2j020MvypRLAXAO50igCJ5Q==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", + "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", "dev": true, "dependencies": { "@babel/compat-data": "^7.22.9", - "@babel/helper-validator-option": "^7.22.5", + "@babel/helper-validator-option": "^7.22.15", "browserslist": "^4.21.9", "lru-cache": "^5.1.1", "semver": "^6.3.1" @@ -153,27 +153,27 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", - "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.15.tgz", + "integrity": "sha512-4E/F9IIEi8WR94324mbDUMo074YTheJmd7eZF5vITTeYchqAi6sYXRLHUVsmkdmY4QjfKTcB2jB7dVP3NaBElQ==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz", - "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", + "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.10.tgz", - "integrity": "sha512-78aUtVcT7MUscr0K5mIEnkwxPE0MaxkR5RxRwuHaQ+JuU5AmTPhY+do2mdzVTnIJJpyBglql2pehuBIWHug+WQ==", + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.13.tgz", + "integrity": "sha512-C/BaXcnnvBCmHTpz/VGZ8jgtE2aYlW4hxDhseJAWZb7gqGM/qtCK6iZUb0TyKFf7BOUsBH7Q7fkRsDRhg1XklQ==", "dev": true, "dependencies": { "@babel/helper-validator-identifier": "^7.22.5", @@ -247,9 +247,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.10.tgz", - "integrity": "sha512-lNbdGsQb9ekfsnjFGhEiF4hfFqGgfOP3H3d27re3n+CGhNuTSUEQdfWk556sTLNTloczcdM5TYF2LhzmDQKyvQ==", + "version": "7.22.16", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.16.tgz", + "integrity": "sha512-+gPfKv8UWeKKeJTUxe59+OobVcrYHETCsORl61EmSkmgymguYk/X5bp7GuUIXaFsc6y++v8ZxPsLSSuujqDphA==", "bin": { "parser": "bin/babel-parser.js" }, @@ -387,9 +387,9 @@ } }, "node_modules/@polka/url": { - "version": "1.0.0-next.21", - "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.21.tgz", - "integrity": "sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==", + "version": "1.0.0-next.23", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.23.tgz", + "integrity": "sha512-C16M+IYz0rgRhWZdCmK+h58JMv8vijAA61gmz2rspCSwKwzBebpdcsiUmwrtJRdphuY30i6BSLEOP8ppbNLyLg==", "dev": true }, "node_modules/@sideway/address": { @@ -466,18 +466,18 @@ } }, "node_modules/@types/connect": { - "version": "3.4.35", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", - "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "version": "3.4.36", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.36.tgz", + "integrity": "sha512-P63Zd/JUGq+PdrM1lv0Wv5SBYeA2+CORvbrXbngriYY0jzLUWfQMQQxOhjONEz/wlHOAxOdY7CY65rgQdTjq2w==", "dev": true, "dependencies": { "@types/node": "*" } }, "node_modules/@types/connect-history-api-fallback": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz", - "integrity": "sha512-4x5FkPpLipqwthjPsF7ZRbOv3uoLUFkTA9G9v583qi4pACvq0uTELrB8OLUzPWUI4IJIyvM85vzkV1nyiI2Lig==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.1.tgz", + "integrity": "sha512-iaQslNbARe8fctL5Lk+DsmgWOM83lM+7FzP0eQUJs1jd3kBE8NWqBTIT2S8SqQOJjxvt2eyIjpOuYeRXq2AdMw==", "dev": true, "dependencies": { "@types/express-serve-static-core": "*", @@ -520,9 +520,9 @@ } }, "node_modules/@types/express-serve-static-core": { - "version": "4.17.35", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.35.tgz", - "integrity": "sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg==", + "version": "4.17.36", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.36.tgz", + "integrity": "sha512-zbivROJ0ZqLAtMzgzIUC4oNqDG9iF0lSsAqpOD9kbs5xcIM3dTiyuHvBc7R8MtWBp3AAWGaovJa+wzWPjLYW7Q==", "dev": true, "dependencies": { "@types/node": "*", @@ -570,9 +570,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.5.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.0.tgz", - "integrity": "sha512-Mgq7eCtoTjT89FqNoTzzXg2XvCi5VMhRV6+I2aYanc6kQCBImeNaAYRs/DyoVqk1YEUJK5gN9VO7HRIdz4Wo3Q==" + "version": "20.6.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.6.0.tgz", + "integrity": "sha512-najjVq5KN2vsH2U/xyh2opaSEz6cZMR2SetLIlxlj08nOcmPOemJmUK2o4kUzfLqfrWE0PIrNeE16XhYDd3nqg==" }, "node_modules/@types/normalize-package-data": { "version": "2.4.1", @@ -587,9 +587,9 @@ "dev": true }, "node_modules/@types/qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", + "version": "6.9.8", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.8.tgz", + "integrity": "sha512-u95svzDlTysU5xecFNTgfFG5RUWu1A9P0VzgpcIiGZA9iraHOdSzcxMxQ55DyeRaGCSxQi7LxXDI4rzq/MYfdg==", "dev": true }, "node_modules/@types/range-parser": { @@ -923,9 +923,9 @@ }, "node_modules/@vue/vue-loader-v15": { "name": "vue-loader", - "version": "15.10.1", - "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-15.10.1.tgz", - "integrity": "sha512-SaPHK1A01VrNthlix6h1hq4uJu7S/z0kdLUb6klubo738NeQoLbS6V9/d8Pv19tU0XdQKju3D1HSKuI8wJ5wMA==", + "version": "15.10.2", + "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-15.10.2.tgz", + "integrity": "sha512-ndeSe/8KQc/nlA7TJ+OBhv2qalmj1s+uBs7yHDRFaAXscFTApBzY9F1jES3bautmgWjDlDct0fw8rPuySDLwxw==", "dev": true, "dependencies": { "@vue/component-compiler-utils": "^3.1.0", @@ -942,6 +942,9 @@ "cache-loader": { "optional": true }, + "prettier": { + "optional": true + }, "vue-template-compiler": { "optional": true } @@ -1114,9 +1117,9 @@ } }, "node_modules/ace-builds": { - "version": "1.24.1", - "resolved": "https://registry.npmjs.org/ace-builds/-/ace-builds-1.24.1.tgz", - "integrity": "sha512-TLcxMxiTRX5Eq9bBVSd/bTJlanCBULiv/IULLohJDDaCAfcpZKJBVSd4OWfN/j2c2jCLc+jhpNWGELiJZw3wPw==" + "version": "1.24.2", + "resolved": "https://registry.npmjs.org/ace-builds/-/ace-builds-1.24.2.tgz", + "integrity": "sha512-zjvJiEw05BADxPMq5gN/Vgc9FgyiiDHpdy676Af1nJk8DF4ipgf0cNmV3wy8JHeQ6vezypEZV6pHQu9avO+WtQ==" }, "node_modules/acorn": { "version": "8.10.0", @@ -1621,9 +1624,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001521", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001521.tgz", - "integrity": "sha512-fnx1grfpEOvDGH+V17eccmNjucGUnCbP6KL+l5KqBIerp26WK/+RQ7CIDE37KGJjaPyqWXXlFUyKiWmvdNNKmQ==", + "version": "1.0.30001532", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001532.tgz", + "integrity": "sha512-FbDFnNat3nMnrROzqrsg314zhqN5LGQ1kyyMk2opcrwGbVGpHRhgCWtAgD5YJUqNAiQ+dklreil/c3Qf1dfCTw==", "funding": [ { "type": "opencollective", @@ -1839,6 +1842,18 @@ "node": ">=6" } }, + "node_modules/clone-deep/node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -2629,9 +2644,9 @@ "dev": true }, "node_modules/dns-packet": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.0.tgz", - "integrity": "sha512-rza3UH1LwdHh9qyPXp8lkwpjSNk/AMD3dPytUoRoqnypDUhY0xvbdmVhWOfxO68frEfV9BU8V12Ez7ZsHGZpCQ==", + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", + "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", "dev": true, "dependencies": { "@leichtgewicht/ip-codec": "^2.0.1" @@ -2751,9 +2766,9 @@ "dev": true }, "node_modules/electron-to-chromium": { - "version": "1.4.495", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.495.tgz", - "integrity": "sha512-mwknuemBZnoOCths4GtpU/SDuVMp3uQHKa2UNJT9/aVD6WVRjGpXOxRGX7lm6ILIenTdGXPSTCTDaWos5tEU8Q==" + "version": "1.4.513", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.513.tgz", + "integrity": "sha512-cOB0xcInjm+E5qIssHeXJ29BaUyWpMyFKT5RB3bsLENDheCja0wMkHJyiPl0NBE/VzDI7JDuNEQWhe6RitEUcw==" }, "node_modules/emoji-regex": { "version": "8.0.0", @@ -3253,16 +3268,16 @@ } }, "node_modules/fraction.js": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", - "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.6.tgz", + "integrity": "sha512-n2aZ9tNfYDwaHhvFTkhFErqOMIb8uyzSQ+vGJBjZyanAKZVbGUQ1sngfk9FdkBw7G26O7AgNjLcecLffD1c7eg==", "dev": true, "engines": { "node": "*" }, "funding": { "type": "patreon", - "url": "https://www.patreon.com/infusion" + "url": "https://github.com/sponsors/rawify" } }, "node_modules/fresh": { @@ -3302,9 +3317,9 @@ "dev": true }, "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, "hasInstallScript": true, "optional": true, @@ -3932,13 +3947,10 @@ } }, "node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", "dev": true, - "dependencies": { - "isobject": "^3.0.1" - }, "engines": { "node": ">=0.10.0" } @@ -4031,9 +4043,9 @@ } }, "node_modules/joi": { - "version": "17.9.2", - "resolved": "https://registry.npmjs.org/joi/-/joi-17.9.2.tgz", - "integrity": "sha512-Itk/r+V4Dx0V3c7RLFdRh12IOjySm2/WGPMubBT92cQvRfYZhPM2W0hZlctjj72iES8jsRCwp7S/cRmWBnJ4nw==", + "version": "17.10.1", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.10.1.tgz", + "integrity": "sha512-vIiDxQKmRidUVp8KngT8MZSOcmRVm2zV7jbMjNYWuHcJWI0bUck3nRTGQjhpPlQenIQIBC5Vp9AhcnHbWQqafw==", "dev": true, "dependencies": { "@hapi/hoek": "^9.0.0", @@ -4201,12 +4213,36 @@ "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==" }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "dev": true + }, "node_modules/lodash.defaultsdeep": { "version": "4.6.1", "resolved": "https://registry.npmjs.org/lodash.defaultsdeep/-/lodash.defaultsdeep-4.6.1.tgz", "integrity": "sha512-3j8wdDzYuWO3lM3Reg03MuQR957t287Rpcxp1njpEa8oDrikb+FwGdW3n+FELh/A6qib6yPit0j/pv9G/yeAqA==", "dev": true }, + "node_modules/lodash.escape": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-4.0.1.tgz", + "integrity": "sha512-nXEOnb/jK9g0DYMr1/Xvq6l5xMD7GDG55+GSYIYmS0G4tBk/hURD4JR9WCavs04t33WmJx9kCyp9vJ+mr4BOUw==", + "dev": true + }, + "node_modules/lodash.flatten": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", + "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==", + "dev": true + }, + "node_modules/lodash.invokemap": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.invokemap/-/lodash.invokemap-4.6.0.tgz", + "integrity": "sha512-CfkycNtMqgUlfjfdh2BhKO/ZXrP8ePOX5lEU/g0R3ItJcnuxWDwokMGKx1hWcfOikmyOVx6X9IwWnDGlgKl61w==", + "dev": true + }, "node_modules/lodash.mapvalues": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/lodash.mapvalues/-/lodash.mapvalues-4.6.0.tgz", @@ -4219,6 +4255,12 @@ "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", "dev": true }, + "node_modules/lodash.pullall": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.pullall/-/lodash.pullall-4.2.0.tgz", + "integrity": "sha512-VhqxBKH0ZxPpLhiu68YD1KnHmbhQJQctcipvmFnqIBDYzcIHzf3Zpu0tpeOKtR4x76p9yohc506eGdOjTmyIBg==", + "dev": true + }, "node_modules/lodash.throttle": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", @@ -4230,6 +4272,12 @@ "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", "dev": true }, + "node_modules/lodash.uniqby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz", + "integrity": "sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww==", + "dev": true + }, "node_modules/log-symbols": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", @@ -4397,9 +4445,9 @@ } }, "node_modules/material-icons": { - "version": "1.13.9", - "resolved": "https://registry.npmjs.org/material-icons/-/material-icons-1.13.9.tgz", - "integrity": "sha512-dwuf2C8LR07FcrjRDx0vWnDEcHiDuamXOmtAck8bdONUv5Fi6wR/ubQwPfG1NbcqgPg+y0fHN8Unj5DO+5fV4w==" + "version": "1.13.11", + "resolved": "https://registry.npmjs.org/material-icons/-/material-icons-1.13.11.tgz", + "integrity": "sha512-kp2oAdaqo/Zp6hpTZW01rOgDPWmxBUszSdDzkRm1idCjjNvdUMnqu8qu58cll6CObo+o0cydOiPLdoSugLm+mQ==" }, "node_modules/mdn-data": { "version": "2.0.14", @@ -4696,9 +4744,9 @@ } }, "node_modules/node-fetch": { - "version": "2.6.12", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.12.tgz", - "integrity": "sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", "dev": true, "dependencies": { "whatwg-url": "^5.0.0" @@ -5181,9 +5229,9 @@ } }, "node_modules/postcss": { - "version": "8.4.28", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.28.tgz", - "integrity": "sha512-Z7V5j0cq8oEKyejIKfpD8b4eBy9cwW2JWPk0+fB1HOAMsfHbnAXLLS+PfVWlzMSLQaWttKDt607I0XHmpE67Vw==", + "version": "8.4.29", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.29.tgz", + "integrity": "sha512-cbI+jaqIeu/VGqXEarWkRCCffhjgXc0qjBtXpqJhTBohMUjUQnbBr0xqX3vEKudc4iviTewcJo5ajcec5+wdJw==", "funding": [ { "type": "opencollective", @@ -6497,14 +6545,14 @@ "dev": true }, "node_modules/sirv": { - "version": "1.0.19", - "resolved": "https://registry.npmjs.org/sirv/-/sirv-1.0.19.tgz", - "integrity": "sha512-JuLThK3TnZG1TAKDwNIqNq6QA2afLOCcm+iE8D1Kj3GA40pSPsxQjjJl0J8X3tsR7T+CP1GavpzLwYkgVLWrZQ==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.3.tgz", + "integrity": "sha512-O9jm9BsID1P+0HOi81VpXPoDxYP374pkOLzACAoyUQ/3OUVndNpsz6wMnY2z+yOxzbllCKZrM+9QrWsv4THnyA==", "dev": true, "dependencies": { "@polka/url": "^1.0.0-next.20", "mrmime": "^1.0.0", - "totalist": "^1.0.0" + "totalist": "^3.0.0" }, "engines": { "node": ">= 10" @@ -6783,9 +6831,9 @@ } }, "node_modules/terser": { - "version": "5.19.2", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.19.2.tgz", - "integrity": "sha512-qC5+dmecKJA4cpYxRa5aVkKehYsQKc+AHeKl0Oe62aYjBL8ZA33tTljktDHJSaxxMnbI5ZYw+o/S2DxxLu8OfA==", + "version": "5.19.4", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.19.4.tgz", + "integrity": "sha512-6p1DjHeuluwxDXcuT9VR8p64klWJKo1ILiy19s6C9+0Bh2+NWTX6nD9EPppiER4ICkHDVB1RkVpin/YW2nQn/g==", "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.8.2", @@ -7034,9 +7082,9 @@ } }, "node_modules/totalist": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/totalist/-/totalist-1.1.0.tgz", - "integrity": "sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", + "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", "dev": true, "engines": { "node": ">=6" @@ -7049,9 +7097,9 @@ "dev": true }, "node_modules/tslib": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", - "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", "dev": true }, "node_modules/type-fest": { @@ -7401,20 +7449,27 @@ } }, "node_modules/webpack-bundle-analyzer": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.9.0.tgz", - "integrity": "sha512-+bXGmO1LyiNx0i9enBu3H8mv42sj/BJWhZNFwjz92tVnBa9J3JMGo2an2IXlEleoDOPn/Hofl5hr/xCpObUDtw==", + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.9.1.tgz", + "integrity": "sha512-jnd6EoYrf9yMxCyYDPj8eutJvtjQNp8PHmni/e/ulydHBWhT5J3menXt3HEkScsu9YqMAcG4CfFjs3rj5pVU1w==", "dev": true, "dependencies": { "@discoveryjs/json-ext": "0.5.7", "acorn": "^8.0.4", "acorn-walk": "^8.0.0", - "chalk": "^4.1.0", "commander": "^7.2.0", + "escape-string-regexp": "^4.0.0", "gzip-size": "^6.0.0", - "lodash": "^4.17.20", + "is-plain-object": "^5.0.0", + "lodash.debounce": "^4.0.8", + "lodash.escape": "^4.0.1", + "lodash.flatten": "^4.4.0", + "lodash.invokemap": "^4.6.0", + "lodash.pullall": "^4.2.0", + "lodash.uniqby": "^4.7.0", "opener": "^1.5.2", - "sirv": "^1.0.7", + "picocolors": "^1.0.0", + "sirv": "^2.0.3", "ws": "^7.3.1" }, "bin": { @@ -7424,22 +7479,6 @@ "node": ">= 10.13.0" } }, - "node_modules/webpack-bundle-analyzer/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, "node_modules/webpack-bundle-analyzer/node_modules/commander": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", @@ -7449,6 +7488,18 @@ "node": ">= 10" } }, + "node_modules/webpack-bundle-analyzer/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/webpack-chain": { "version": "6.5.1", "resolved": "https://registry.npmjs.org/webpack-chain/-/webpack-chain-6.5.1.tgz", @@ -7545,9 +7596,9 @@ } }, "node_modules/webpack-dev-server/node_modules/ws": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", - "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", + "version": "8.14.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.14.1.tgz", + "integrity": "sha512-4OOseMUq8AzRBI/7SLMUwO+FEDnguetSk7KMb1sHwvF2w2Wv5Hoj0nlifx8vtGsftE/jWHojPy8sMMzYLJ2G/A==", "dev": true, "engines": { "node": ">=10.0.0" @@ -7661,9 +7712,9 @@ } }, "node_modules/whatwg-fetch": { - "version": "3.6.17", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.17.tgz", - "integrity": "sha512-c4ghIvG6th0eudYwKZY5keb81wtFz9/WeAHAoy8+r18kcWlitUIrmGFQ2rWEl4UCKUilD3zCLHOIPheHx5ypRQ==" + "version": "3.6.18", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.18.tgz", + "integrity": "sha512-ltN7j66EneWn5TFDO4L9inYC1D+Czsxlrw2SalgjMmEMkLfA5SIZxEFdE6QtHFiiM6Q7WL32c7AkI3w6yxM84Q==" }, "node_modules/whatwg-url": { "version": "5.0.0", diff --git a/frontend/package.json b/frontend/package.json index ce75e1ca..00c529e1 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -9,16 +9,16 @@ "watch": "vue-cli-service build --watch" }, "dependencies": { - "ace-builds": "^1.4.7", + "ace-builds": "^1.24.2", "clipboard": "^2.0.4", - "normalize.css": "^8.0.1", - "file-loader": "^6.2.0", "css-vars-ponyfill": "^2.4.3", + "file-loader": "^6.2.0", "js-base64": "^2.5.1", "lodash.clonedeep": "^4.5.0", "lodash.throttle": "^4.1.1", "material-icons": "^1.10.5", "moment": "^2.29.4", + "normalize.css": "^8.0.1", "noty": "^3.2.0-beta", "pretty-bytes": "^6.0.0", "qrcode.vue": "^1.7.0", diff --git a/frontend/public/img/icons/android-chrome-192x192.png b/frontend/public/img/icons/android-chrome-192x192.png new file mode 120000 index 00000000..f2ee31b9 --- /dev/null +++ b/frontend/public/img/icons/android-chrome-192x192.png @@ -0,0 +1 @@ +favicon-256x256.png \ No newline at end of file diff --git a/frontend/public/img/icons/android-chrome-256x256.png b/frontend/public/img/icons/android-chrome-256x256.png new file mode 120000 index 00000000..f2ee31b9 --- /dev/null +++ b/frontend/public/img/icons/android-chrome-256x256.png @@ -0,0 +1 @@ +favicon-256x256.png \ No newline at end of file diff --git a/frontend/public/img/icons/favicon-16x16.png b/frontend/public/img/icons/favicon-16x16.png new file mode 120000 index 00000000..f2ee31b9 --- /dev/null +++ b/frontend/public/img/icons/favicon-16x16.png @@ -0,0 +1 @@ +favicon-256x256.png \ No newline at end of file diff --git a/frontend/public/img/icons/favicon-256x256.png b/frontend/public/img/icons/favicon-256x256.png new file mode 100644 index 0000000000000000000000000000000000000000..50b30a60f90d54ae4afe92ce536637127eeda45c GIT binary patch literal 15614 zcmeHtc|4Tw_xBiN?4n4vK?vEiZxf=DB^0tolY|-Bvro3PSVG9!Mo|=nv465=mwg%Q z*w?X*eV&_{KHu-}dH#4_&p*#!&Fgi$FV}L;xz2fC=bZc8cch`d4n56T8W0FXfAxx% z5eNi!1FkcW6F|@0C9+Q-5S^N%rl#RlO--nw8}go`GaLlE5}9C1WoG<~HQnN64D3D` z#rx0^irBNTYY?%GC|mw>WEzoDOeTwsZy!5dssqb;+|>Gq<_Xug!t+~|(6?_tKcg&L z6QuOOm{!V<%F7TAW?F*UQk9G8Ko5iz`ED@eFu?L8Z8$j=4R{h$HH1_t@4`T@zsiog zu4}c-&boq{4GH+QWkJ~c16jXMz3L4Fr_M3ldI<>H$&`&-D?u~yP=N9$p4RSwm_C#b zeD{w%RYUW=RucAv?drpDPSdLoUvsV`4AeFhKoOL%t6?=K9YC4BlxrJc#EEXhrHK9; zjVur{!*`mCaVg4SR1ZaJdpoo#zL{jiZiVRAk6!EwmsL!Ce&>SCv(M)#A!}NSsq6#? zr9=NI?f2xywXAdJE+L}N zx~`i^I>4yxbhw3}bav!VLP8Z|$7$5Wte9%U&nz=}ltMGO7{7_vKHGkTdPtMfIwAax z#^%0eX;PiZ>WrdYvdyRbh?k2LSsDaS!Hh2*4JNcQlX1{2n6owX%JWdO({>T%izSj_ zt^Gf*-@?YcFk=>dG0Hh%Rw>zUlNWvZ{j(6e(_0_Vk2DwRUC!U_fDF5D)$AE20r=fYWmbOsgP3M}=>J*goD-4uLPW{=@mZlN>c&oBr z%}0QT8q5hj!5+-Gc)F$I`MH57Ohpefnf9qq@?h!P*Ari?T_VF)F%+)#a=&lZroAgu z@DIxq_e*CQQGLt<7skI9YptGxpHl?@=pTp+cbyKly*sYY2_E-MtjMoqe7kCe+Pn zgymamupE13*mWA;Q1M2|q~6mtz&5%Jrha{x&DSgJg6_%Ui=rDD-w8#Jd6vU}MlD{^ z{>9%Icy}SgA!jhBlp*(u`+6YKsoK&L_P<$`NTl#cg%I zX~P=yZS~AJyskfu@b0r8SU$VPD*8-_V;*uij+||~CX+m4w$Q(@eOc{Qdxm&`4tejX zPP%VUewmE6P#X%hG%>8w^S8>1N{ZyrgUUu58>HRcQF^WHCFSBVMo_r{9RmaRPFq+y z$TmaSf1fdE<}>?h*BiR(of^x?5?I^#?{Ls4^Mlo^UF6!;bY?Z13S{zQl>0C!gz^TI z`&`IX$=&NE?RB<73hA*`?WZVuoMy||&v^Eq8?H2|l!?`+UCD<-%Cf1- zK?h@8+s~m8>Nk8BwHT$eFEAH@Zq~>{?DmUg zZH^A(S%HlcgOQamD#>7Bd!;1md(l#otgK-lZ0C~Bq=Y2coi>xb6(L)*=TE;-yZbd- z;biu>$1wNu7?TRw%!Dycahus+wUPx{ZGm(0VH=4K;y0u|L81Iu2&H#MrxALcKb}bh zGDIB#aTqJ?*7VUi$L#s!mX`PS1wod=Co++`PdJ`z*2dK`*vUT(*5aFsUA!{#{ycL; zynzVs7yc!|G^mxpW{lc-VNrHbMPW+e59g^9p2myBdkJ%ymga1j%*mLiIbYg3rxW`K z%Z`O(U9k7o;BJgNGM7W_F5|LljSJ4N3p)vW#>>R-#mhG}HDxt%H%T>tryeyqCE!Ie zOqY!gKfe8Bm;2KwIg{^(c}{`m)cYo`1bGvYo|p4FdT*wU6OEicW`AP*#AD)^!;s^A zGkxB&=UUH+p4=RXp2i2P53c{X`XKDV=?7HZ;<=lj;(Ek-%;z~b73UM?BYKdZ81Hvn ztiP}2h<$LOv;V`xOOwfhSG$a44CAuRKcjE1f4?VB|1P=H?4q~}nG44f-4~r_AK@SB zdYgWWbPc}i$?M7g@@eU9+DBEZGNZjDuWW`a`%g8!zdFsc3T=>xYRg4J`G?7-4)d9Hki>v%Ve>d@1i>jI@gjD@=g!sbma8TSIYJb_W9;` z{@C>7cuQX+ICL+h^|VEIZ;xD8(eJGSt_L&sguV{h_DMaJY_gAcHQD@Vu_dx~eGj~M zdrzE-E5bE`FG4#a@m;G<_H%2g-QiheR9=)~)DY*&i%w1!rL6nc*OU76i}WqCuVpW^ znan_E&~18c`Id{8+u|Hnh_c_7{FZE`MJ0ir?%phAJ?PESl(OtnQ}n3aeW|zXx@Tro zA>4=D?y6C~{u>_aE%@P;oy5cn)1p4{d1ZGYXe|2+Uv1`t0 zq8ayPD*)>--LO8ijE{G$X|Y?rSGnQ6!M4Y<7Sz6WxAk5cT{ZYI`8D!Ea#?Z~a37T# zoiu$DB!_;U(ThHv-CsJCiJ7&456e0f(+cnVx~GZJbciSl{}fsm_Jz^!6oNyX0T~73 z*WkaUJskc0$ti6)ZPavM@U_j|x$qOAzvm;!s6wmFWK3{q-1|b;{_PUDH-P3Wu6Bjb2F} zQ+jjvXKUmwmTZG^$*Vy|ZSU>ldIa4Cd9Db&7yPh%?citRgo*o!-~Em^9SdmWdX33o?b1CMr146dcy|mWwu)8izz8PEz75sjZLc-Z< zro!^F_^*b>Nn*}vb{FBh@eHwPAGNv_d)(*eKOIa+;V@Kz!{{4T=bhQ z3(VAhSm!mFET}HB<6T2@icOl($_&|46;)g(vz{E=n+6q?0?NABk z3lD4-%Y85t$PeYepTVQxr{OlQToWz#JzMgfg19VSSAGvj9x8az9N8S!jLciL`c`Q9 zuKa7cAH23H{N~2Z54j_G>E*i`VY+o$vhlJnWz(E$`sBXI*cAI?5;v0+85bnS=ll=FR|RqP69tF%7hjx3xsS9jMD-zuYA*X3o2~$@2;!|eA+`S zGY*Zq1wYJO&aC?oE2}PVZ1yJgZpqwnXv?5i^4sNHAC6ofnTfVu zEqC4Ko3xu0DAuKS$#aPa^gcK+EVJ;df#aL?OjYtOdOu%M2<*Yne{v%0YqNH+sq)}o z({5-DO({m|mGnGH@!lIqOI6NaW*t88M~(#iJorsD&nUuuR^{_y&2;pxesP<<6`7Sw z^aM9%VcM(8Cl$Y~Yk*^!k9(S3Z{U=!sH!~3(d{?2vpu6Kp(UY)PuTy2bLi1sNTedH z?d5(6vJ7e$#pV9fr#muRF@Woxa%qNbRM&W;SJbK`4l?m~W_0Qs+%sOPsUD~-(atpw z=F8cnRD}hUsV6BboS%52SYSg&ck7}mS8$&)C{vIe7BVB#G5aEoat`DS=^(9boQ zx1USM45hHLqR;?#A|Ra5%#KKGGw!=Q#%Gpmx1t?hXR63LITzSB=iC0`z+wP0T#Z^sXz} zBVEMr+(p{K#eG~{kLZ9@e3XEu3*6%l)W^jc;jZMP%6B|N31}a6OYlLDr+7H2@|o!w zLN$?YaHyQPq_`xX8VwW*RdKs}PsvD2o3tGGPnGY!hli_@goL-Zx45^AIMU5QLP}9l zQ9@E$LRwl3m?7r=2;p(ZM-1W4PbBh(juzbA-p$d~!x4#q9?`vHhxGJN<>NbI^zV-- zC)~&JKb#Qmq-_BklsFoZkP?@a_?I@YROP5w$swJw?XkS${T zK4*AaRpVCXUTl4L>dSK~E6TPIVkjHC6|S4sCmC+3QC~j|wUnj^Ik74o|Kw>Tj*;G4 zJLz>KY9RT70vCVgjT_IOo);BCd?PDDbo{WA@8z)QOZTeaY*%!Cx8>G0w_~N&j$bc- zebJ?T#XG$n|0p0`eZDr~WO=$Kq=hoP-%yX_j7m|en&TBccK zr&pBfvobd2hXupbDMBqHn#g4w5-FYXMcfmEMrqX@TGEHcZw4r#4r!mD4^vXE0MOT` z3?05m=^%02oV61Bx-%pHf;%gt-nxj|3s@mVt!3fX_(cG?N!MYGdV(Im7eaEyc^FIF zwaME?%hN(9qlJMvPi0G~!4$XopxCUE*%`u?%i(2?tZnuY?M!PjDbtnZ)Kn14iyDHy zx}}Pog2U$+E8o%OS*!n2uDA|O3{GnPVc@M94AUp$mH)@Oy=?6Zd@ejg1YZA~dSprf z{D`vFas*Q<1Ez3;K+s)_50}?GCxd9^2|q;*)^iw7-Ulc+^;KfT$iSWekGQQL*rzE? zk2prgY1#GNa1CC-R=rk6F)YvyOEO;kFv8knSI_9AZ864)`tS}{aR)ZuYAda0QS=H-dkeBt<1CG!AT3@Z=H@z=#J_QAKsTW zebv(!P~v{c6xv}#Ce`=5uFM5YaaN$CDaPXaau2*NH}J!aXRc?!vNTW7XN#v>C?I#4 z?^`vBVO-Z|i`meMT?`mnlp&cETN6@&3@pZW|7N3D>BbLuoh;A&ohFPLY8lw}a!M&5 z;K8!^I$prV4@m`Hgs5)QLK2?xcf@dYiz0k!X!(30+n2@4bWvug>(k&Q<*-_+BN8&G4PJQ<%u2#P zvJxxonY1iW*BoH9r&i}^lor*^Tf9GyPjt80-L)=33zC83AWzU&gUhc2_!Eb`r$^T% z+St50*lzbkH3|S=%L`6Q$xCeqm{)gG7=;fnhBY_8=0J)TvZkubQm*j9G9AEnc@E#j zj|jY!#=feWU~5K?27TFNhITLk`i!}(aDogxNAWvsc>kGPd{5t@e(7a2FZc(bl|lL0 zeG16M8&Io8ddzC9bjkdh;B93VR4*{rs}2T1m}U!LIWZP)b$V0#JUav8END(LFb2Q~ zrrSddOfe`PBZ!^8zst1NW0wBd(<@G@M&a z4Nh7=Pqh3gUiqyhZE@dbp{D1GA!*M_z+~V67AE(AcXCfasP|xDjpcID(c7=AH}l?$ zx>-=T0VId_JiRF(8@DodV>pte+&7SuYSz;i&|iy<^7MmY?ZD}4zi*WULSex@5yL+{ z)o+OV^iaj+|5`fPC;^>bTj}QlR1$!i*FP0ObbrRMZg)Z z2g71uJ-ptyR_}y?XX22zGOs`=YhbDMe5o86*qkDV9 zRwj3P>!^1pp-du%E{$K%xFTufl&&U@P6(D61mGd4SMVg%FdCM?D=%q(3yrPF5QW=j zaytqMz%uOtP)NO@WrD_B&uofGDYmmRckkj6vIraEh1rUL?GPf@MgSjVL6Jj;u9GPH zc44m*{~fNg90x+h0Vm-q^zceB%!v{hg{yB>7Wf=+Sd?9q2P`0L*Jccae^h4>+zVIQ ztoEaw@JNqgp1kshs@M@cquy8d6M!EPgifC=Vrt-pWzK+m!iGOnHaFqR*Cl)z>;a2< z0%Vo&)7=!1>js&nF)3w>0#iTbN7X9IHq8O=r2%XCVb_Xy2}0dK&1)cBdv>KgYQDVE zIZlQk8|GvEZw{vV{|T6yoo%S4wX9});2;iB=&fAXAT+kmGl|~tUeF% z9VcRXtP14|x^ztowzm%Y|)N~q)W% zvh)vz8qJ+qdhSSMCa9|y*xu%3nL}57!3xSC10z(lkI~4RVhkPXqIsyLz3HUw@kTP!!1kkwi1q-E=3;q*o-$e6L|)jix$PrSBKZz=RCd+j z4z4O~T`#=dSsdHuJb9X!dqT~|8V`{P7y=H5lXwDAyT;!@i`LGodvmNH5Q>G;D*$H? zUol-)!)XSpivWq`36k|2A1J+#SxEe@NE&MZ@9`XJ4D1wF4d6Tr zEMblCf%kjF3|H)=!bWXh)4QOZkypb@wZ+0%!7ZE!Nl+N-UHhU)^e`^#MEd6{9cH(K zO}Q7xYGj&yTOCqtg{jN!@fPMa9c@b`rPegD0nOrtc=3Te>!BU z`kjq_P?v`I!BY(MSf2YC)vJ>!&0Bs5VSfGwqtWsh-3n`Y;`ta9?Fe6y5W)`b`IosL zGl;Pm+x}LtWLzBottzc~SF;h0`MgKODMdXYZMeTG@qh27tgn3RxhQHbbI9bzUOb;p zvOF6_edUeS-m($%C?3U)pA7~3+W%!minjBswd#Q-Dw{vr({P)&ZJ6AC08yQ!USV3! z{?bp2+l%@7I|o0?Z#4E42+y1&KDH<^`)mLOOU=<;U!A`DgF>|EESK6xB&O+*#eh9 z*|sMV$`>n<_AU)-Q{@`Vr8__*)@ z7I0~KM6y5>W&Po357OCRx1lexGC1bhNbnBnY>rY!aShsVA9l%a1R#p3XwZmfrQ9SP z`=erG*T#4%3wCBwv7s6WW~c;^rXGo>NLjT1Yay4Q4#2t1q05S--8hJfTSH27r$c%w z)~YqoyiwLqUH^~szGAyzwIULM_b=2jU1^7hSq7!*@e)yRR`Bamy3P3-WkT_tY^AbE z2)b~64M993(8%g7gNiCn|HZ?c7462G6>1SgH%O5MxbG~{zJF%u^KRROBT9aRh;Ew@ z7XhJBLwrn_$&GAQoB2p&R47AeGYteC{DB4y z^57>PK@Boqwy!3>yeG?o*YnBs3 z3zL6&Y}|9F00DGQ{}lrAR}+6R@%ME6^%H+R=Ks&wfuiHZ2LVNL0%6oSRswig^7*JT zz68|8M>nk+aP4z0OOB3?D5Glz=#RF)DC*BW>2ofijpUVNdcnco23M+6aA1`fcpiD9 z@Du;b*2_Y1j;?HJiJzJ~#1t_7uB9)ey-6zDqRr-NY~S7QD(+Rb84}zz1aL z#KomIuk4Rxv`+>c`b<|Va+SIceAv4kaY&cp_lN_HOXE`d_Uhl#~SX&f16s^eZ9TuGxvzY*>l zyj*e|kmSKQm4?jf3cP6?RGt|p7&X0LyI-`+iu$PA1j*#=5cEsH9G9qS{wqq3B zhm%f2m6&#hVRY0CER7CLYwd2D^38S*H{4}Ute%m9sVKLW1~A-#_-4jROpmD&yBmLg zX$8Fm`g87d8>!Y9O1bqM@gTY!e{_3~Ryyjq9>kOs4_21{ z;v7w=6HBY|6VgPCGmiF7+l(AMUEVj123`;yRjQ(B7R}ZTEpTt-y*4)5xys^rqQ`eBDwX z>5>b?&sUrq(>BS~hgi$Eh4iByJCN#mf-kCj z8 zwC8|+aL{a+#)w8YTaUCo8p!9W6h)GXq!bJ%&G2*TjvSS%Z!|~xHszIg+%%1|iq?bX z+XtUh&Ugl}wHXkLz1L%^N34_w*UD`Ayi^N)9}C`1FIwmAb5NdaGA)+LKTLj}`H8gE zYFd*$-U#wB0S(0NaG~F5LRq0+vXuXr_2Hi{fjCcn+|p#A62HZV-Az>76F@%54r=$L zTAo4@Z5Uh~h-ys$FY!YoJqvGqektLQ|}&`~K;@i~&Y z|Hq@7eiQsv!(K=$`5XKb?H1zLdl^ADE!;3Gb$7T(_3lQR&xf_jgVXteDt=F>)2+p^ zyVilLcOF+gP*FX$;Tczy1NZLTy%lD0XCyU45oJE?Ex72!}-ORMzt zfg1(9eL@O*ACQRbs?~=2ym69Kfn@``UB$b!W-rffa7E3memJ7%cCb=B{y{>GnpFmP|4vjCOIP=#3a5x35_B zUCN2wRG~fBDS)WlYHslA3rZQ4i6+;wke}`J~1dRyv6Q?TI%$`-++ysMhZ;7 zUzXVGVR^qkN2CV3X4_nYFS^M?SnA$JB`XVS=H;vV%_X?}+C=gsT~_#W2<1?EHp>Tj zB|#}FRiexHMdIYJyXR|WtVgsF{xhBa{?CcW@C+2SiLa_s#rWZ7IKXjA*jQXl|)Rj?|yJWWhBa+j20v$Gd zqt~ZCA%FP*Jf4AYX^MZR(iA~@!xP8%)f>4YWJDgv!L&-YJ?oA!0-r? zFb&N8Mf-@*Sn}g zMrr4rd*v=RJJqo~*a~}QCO3OK-@}lsc8hZL+1=3(>w7clE0e0nAQ^K-0dZSp8&hnR zV#;-R2N|siYkWbzWT6hfKffV2^Eh{?rLbym?Ac0pKyFOmk@v7IpjpHy4r*5&CKTB( z)hrEo68ehN4hM>m?RmeNqPQPKxo zR`l8BU2f&?XT?;0RZ7@52e_hqyn)k>%tPR7s|jaDwe|S9!olwG9hciHQyf7O3fN6y z35BIG`wER?*qpd&yHaQ|xV*$Mn7+i}7lgM-_p2aOR+MQ|ZO+2m1+Yzdy>%oD%>$pv z?S^Bbi6}k~yr23z_*V%KroTu4Jiz~(5(td;_xd<{t}&Pb1#HmO%lcY*8n%!B7vsQ6 AJ^%m! literal 0 HcmV?d00001 diff --git a/frontend/public/img/icons/favicon-32x32.png b/frontend/public/img/icons/favicon-32x32.png deleted file mode 100644 index bb33be2b36d7ae55b38fc469c6fe6d175b269676..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 47441 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 diff --git a/frontend/public/img/icons/favicon.ico b/frontend/public/img/icons/favicon.ico index d78d8bdbea8ea41467f343d5da8003731e983838..7f7a9eca49812b9c37c2d55234c76f136bfb0ee4 100644 GIT binary patch literal 67646 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 diff --git a/frontend/public/img/icons/mstile-150x150.png b/frontend/public/img/icons/mstile-150x150.png deleted file mode 100644 index bb33be2b36d7ae55b38fc469c6fe6d175b269676..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 47441 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 diff --git a/frontend/public/img/icons/mstile-256x256.png b/frontend/public/img/icons/mstile-256x256.png new file mode 120000 index 00000000..f2ee31b9 --- /dev/null +++ b/frontend/public/img/icons/mstile-256x256.png @@ -0,0 +1 @@ +favicon-256x256.png \ No newline at end of file diff --git a/frontend/public/index.html b/frontend/public/index.html index d6986bf1..00bd9650 100644 --- a/frontend/public/index.html +++ b/frontend/public/index.html @@ -11,8 +11,7 @@ [{[ if .Name -]}][{[ .Name ]}][{[ else ]}]File Browser[{[ end ]}] - - + @@ -38,12 +37,7 @@ "short_name": window.FileBrowser.Name || 'File Browser', "icons": [ { - "src": fullStaticURL + "/img/icons/android-chrome-192x192.png", - "sizes": "192x192", - "type": "image/png" - }, - { - "src": fullStaticURL + "/img/icons/android-chrome-512x512.png", + "src": fullStaticURL + "/img/icons/android-chrome-256x256.png", "sizes": "512x512", "type": "image/png" } diff --git a/frontend/src/views/bars/EditorBar.vue b/frontend/src/views/bars/EditorBar.vue index 8977c1f3..96b3d5a0 100644 --- a/frontend/src/views/bars/EditorBar.vue +++ b/frontend/src/views/bars/EditorBar.vue @@ -25,14 +25,9 @@ + \ No newline at end of file diff --git a/frontend/vue.config.js b/frontend/vue.config.js index 6f0be70c..4f6ecd6b 100644 --- a/frontend/vue.config.js +++ b/frontend/vue.config.js @@ -5,11 +5,17 @@ module.exports = { publicPath: "[{[ .StaticURL ]}]", parallel: true, configureWebpack: { + resolve: { + alias: { + // Add Ace Editor alias for importing it in your Vue components + ace: "ace-builds/src-min-noconflict", + }, + extensions: ["*", ".js", ".vue", ".json"], + }, plugins: [ new CompressionPlugin({ include: /\.js$/, deleteOriginalAssets: true, - threshold: 10240, // Only compress files larger than 10KB minRatio: 0.8, }), ], From 57214542d4a550d11fc83d55e697508e38fdd963 Mon Sep 17 00:00:00 2001 From: Graham Steffaniak Date: Sat, 9 Sep 2023 16:59:43 -0500 Subject: [PATCH 3/9] updated help document --- README.md | 48 +++++++++-------- backend/http/static.go | 1 - configuration.md | 114 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 141 insertions(+), 22 deletions(-) create mode 100644 configuration.md diff --git a/README.md b/README.md index 1765214f..6caf927f 100644 --- a/README.md +++ b/README.md @@ -72,23 +72,23 @@ system should fully index within the first 5 minutes, potentially within the fir For example, a low end 11th gen i5 with SSD indexes 86K files within 1 second: ``` -2023/08/01 00:08:29 Using config file: /.filebrowser.json -2023/08/01 00:08:29 Indexing files... -2023/08/01 00:08:29 Listening on [::]:8080 -2023/08/01 00:08:30 Successfully indexed files. -2023/08/01 00:08:30 Files found : 85310 -2023/08/01 00:08:30 Directories found : 1711 -2023/08/01 00:08:30 Indexing scheduler will run every 5 minutes +2023/09/09 21:38:50 Initializing with config file: filebrowser.yaml +2023/09/09 21:38:50 Indexing files... +2023/09/09 21:38:50 Listening on [::]:8080 +2023/09/09 21:38:51 Successfully indexed files. +2023/09/09 21:38:51 Files found : 123452 +2023/09/09 21:38:51 Directories found : 1768 +2023/09/09 21:38:51 Indexing scheduler will run every 5 minutes ``` ## Install Using docker: -1. docker run: +1. docker run (no persistent db): ``` -docker run -it -v /path/to/folder:/srv -p 8080:8080 gtstef/filebrowser +docker run -it -v /path/to/folder:/srv -p 80:8080 gtstef/filebrowser ``` 1. docker-compose: @@ -100,12 +100,13 @@ version: '3.7' services: filebrowser: volumes: - - '/path/to/folder:/srv' - #- './database/:/database/' - - './config.json:/.filebrowser.json' + - '/path/to/folder:/srv' # required (for now not configurable) + - './database:/database' # optional if you want db to persist - configure a path under "database" dir in config file. + - './filebrowser.yaml:/filebrowser.yaml' # required ports: - - '8080:8080' + - '80:8080' image: gtstef/filebrowser + restart: always ``` - with network share @@ -115,23 +116,28 @@ version: '3.7' services: filebrowser: volumes: - - 'nas:/srv' - #- './database/:/database/' - #- './config.json:/.filebrowser.json' + - 'storage:/srv' # required (for now not configurable) + - './database:/database' # optional if you want db to persist - configure a path under "database" dir in config file. + - './filebrowser.yaml:/filebrowser.yaml' # required ports: - - '8080:80' + - '80:8080' image: gtstef/filebrowser + restart: always volumes: - nas: + storage: driver_opts: type: cifs - o: "username=myusername,password=mypassword,rw" - device: "//fileshare/" + o: "username=admin,password=password,rw" # enter valid info here + device: "//192.168.1.100/share/" # enter valid hinfo here + ``` ## Configuration -All configuration is now done via a single configuration file: `filebrowser.yaml`, here is an example [configuration file](./backend/filebrowser.yaml). +All configuration is now done via a single configuration file: `filebrowser.yaml`, here is an example minimal [configuration file](./backend/filebrowser.yaml). + +View the [Configuration Help Page](./configuration.md) for available configuration options and other help. + ### background The original project filebrowser/filebrowser used multiple different ways to configure the server. diff --git a/backend/http/static.go b/backend/http/static.go index db475bc4..aef7bd0d 100644 --- a/backend/http/static.go +++ b/backend/http/static.go @@ -98,7 +98,6 @@ func handleWithStaticData(w http.ResponseWriter, _ *http.Request, d *data, fSys } func getStaticHandlers(store *storage.Storage, server *settings.Server, assetsFs fs.FS) (index, static http.Handler) { - log.Print("requesting", store, assetsFs) index = handle(func(w http.ResponseWriter, r *http.Request, d *data) (int, error) { if r.Method != http.MethodGet { return http.StatusNotFound, nil diff --git a/configuration.md b/configuration.md new file mode 100644 index 00000000..df13d0ee --- /dev/null +++ b/configuration.md @@ -0,0 +1,114 @@ +# Configuration Help + +This document covers the available configuration options, their defaults, and how they affect the functionality of filebrowser. + +## All possible configurations + +Here is an expanded config file which includes all possible configurations: + +``` +server: + indexingInterval: 5 + numImageProcessors: 4 + socket: "" + tlsKey: "" + tlsCert: "" + enableThumbnails: false + resizePreview: true + typeDetectionByHeader: true + port: 8080 + baseURL: "/" + address: "" + log: "stdout" + database: "/database/database.db" + root: "/srv" +auth: + recaptcha: + host: "" + key: "" + secret: "" + header: "" + method: json + command: "" + signup: false + shell: "" +frontend: + name: "" + disableExternal: false + disableUsedPercentage: true + files: "" + theme: "" + color: "" +userDefaults: + scope: "" + locale: "" + viewMode: "" + singleClick: true + sorting: + by: "" + asc: true + permissions: + admin: true + execute: true + create: true + rename: true + modify: true + delete: true + share: true + download: true + commands: [] + hideDotfiles: false + dateFormat: false +``` + +Here are the defaults if nothing is set: + +``` +Signup: true +AdminUsername: admin +AdminPassword: admin +Server: + EnableThumbnails: true + EnableExec: false + IndexingInterval: 5 + Port: 8080 + NumImageProcessors: 4 + BaseURL: "" + Database: database.db + Log: stdout + Root: /srv +Auth: + Method: password + Recaptcha: + Host: "" +UserDefaults: + Scope: "." + LockPassword: false + HideDotfiles: true + Permissions: + Create: true + Rename: true + Modify: true + Delete: true + Share: true + Download: true +``` + +## About each configuration + +### Server configuration settings + + - `indexingInterval`: This is the time in minutes the system waits before checking for filesystem changes. (used in search only) + - `numImageProcessors`: + socket: "" + tlsKey: "" + tlsCert: "" + enableThumbnails: false + resizePreview: true + typeDetectionByHeader: true + port: 8080 + baseURL: "/" + address: "" + log: "stdout" + - `database`: This is the database file path + filename that will be created if it does not already exist. If it exists, it will use the existing file. + - `root`: "/srv" \ No newline at end of file From 1d9993b3234865212fe3b734178fe168bbb3c223 Mon Sep 17 00:00:00 2001 From: Graham Steffaniak <42989099+gtsteffaniak@users.noreply.github.com> Date: Sat, 9 Sep 2023 17:01:09 -0500 Subject: [PATCH 4/9] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 6caf927f..f795d379 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ License: MIT

- +

Filebrowser - A modern file manager for the web

From 85329243b15a937c5fc787aa087fc4973c56d7ff Mon Sep 17 00:00:00 2001 From: Graham Steffaniak <42989099+gtsteffaniak@users.noreply.github.com> Date: Sat, 9 Sep 2023 18:58:47 -0500 Subject: [PATCH 5/9] Update configuration.md --- configuration.md | 130 ++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 116 insertions(+), 14 deletions(-) diff --git a/configuration.md b/configuration.md index df13d0ee..dc5b5762 100644 --- a/configuration.md +++ b/configuration.md @@ -96,19 +96,121 @@ UserDefaults: ## About each configuration +# Configuration Settings Documentation + +## About each configuration + +- `Signup`: This boolean value indicates whether user signup is enabled. + +- `AdminUsername`: This is the username of the admin user. + +- `AdminPassword`: This is the password of the admin user. + ### Server configuration settings - - `indexingInterval`: This is the time in minutes the system waits before checking for filesystem changes. (used in search only) - - `numImageProcessors`: - socket: "" - tlsKey: "" - tlsCert: "" - enableThumbnails: false - resizePreview: true - typeDetectionByHeader: true - port: 8080 - baseURL: "/" - address: "" - log: "stdout" - - `database`: This is the database file path + filename that will be created if it does not already exist. If it exists, it will use the existing file. - - `root`: "/srv" \ No newline at end of file +- `indexingInterval`: This is the time in minutes the system waits before checking for filesystem changes (used in search only). + +- `numImageProcessors`: This is the number of image processors available. + +- `socket`: This is the socket configuration. + +- `tlsKey`: This is the TLS key configuration. + +- `tlsCert`: This is the TLS certificate configuration. + +- `enableThumbnails`: This boolean value determines whether thumbnails are enabled. + +- `resizePreview`: This boolean value determines whether preview resizing is enabled. + +- `typeDetectionByHeader`: This boolean value determines whether type detection is based on headers. + +- `port`: This is the port number on which the server is running. + +- `baseURL`: This is the base URL for the server. + +- `address`: This is the server address configuration. + +- `log`: This specifies the log destination (e.g., "stdout" for standard output). + +- `database`: This is the database file path + filename that will be created if it does not already exist. If it exists, it will use the existing file. + +- `root`: This is the root directory path. + +### Auth configuration settings + +- `recaptcha`: + + - `host`: This is the host for reCAPTCHA. + + - `key`: This is the reCAPTCHA key. + + - `secret`: This is the reCAPTCHA secret. + +- `header`: This is the authentication header. + +- `method`: This is the authentication method used (e.g., "json"). Possible values: + - password - username and password + - hook - hook authentication + - proxy - proxy authentication + - oath - oath authentication + +- `command`: This is the authentication command. + +- `signup`: This boolean value indicates whether user signup is enabled. + +- `shell`: This is the shell configuration. + +### Frontend configuration settings + +- `name`: This is the name of the frontend. + +- `disableExternal`: This boolean value determines whether external access is disabled. + +- `disableUsedPercentage`: This boolean value determines whether used percentage is disabled. + +- `files`: This is the files configuration. + +- `theme`: This is the theme configuration. + +- `color`: This is the color configuration. + +### UserDefaults configuration settings + +- `scope`: This is a scope of the permissions, "." or "./" means all directories, "./downloads" would mean only the downloads folder. + +- `locale`: This is the locale configuration. + +- `viewMode`: This is the view mode configuration. + +- `singleClick`: This boolean value determines whether single-click is enabled. + +- `sorting`: + + - `by`: This is the sorting method used (e.g., "asc"). + + - `asc`: This boolean value determines the sorting order. + +- `permissions`: + + - `admin`: This boolean value determines whether admin permissions are granted. + + - `execute`: This boolean value determines whether execute permissions are granted. + + - `create`: This boolean value determines whether create permissions are granted. + + - `rename`: This boolean value determines whether rename permissions are granted. + + - `modify`: This boolean value determines whether modify permissions are granted. + + - `delete`: This boolean value determines whether delete permissions are granted. + + - `share`: This boolean value determines whether share permissions are granted. + + - `download`: This boolean value determines whether download permissions are granted. + +- `commands`: This is a list of commands. + +- `hideDotfiles`: This boolean value determines whether dotfiles are hidden. + +- `dateFormat`: This boolean value determines whether date formatting is enabled. + From 8453cb54e8e31994b1f5d146861ed84f8351201b Mon Sep 17 00:00:00 2001 From: Graham Steffaniak <42989099+gtsteffaniak@users.noreply.github.com> Date: Sat, 9 Sep 2023 19:01:36 -0500 Subject: [PATCH 6/9] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f795d379..16f49766 100644 --- a/README.md +++ b/README.md @@ -69,7 +69,7 @@ should scale based on the number of directories. Also , the approx. time to fully index will vary widely based on performance. A sufficiently performant system should fully index within the first 5 minutes, potentially within the first few seconds. -For example, a low end 11th gen i5 with SSD indexes 86K files within 1 second: +For example, a low end 11th gen i5 with SSD indexes 128K files within 1 second: ``` 2023/09/09 21:38:50 Initializing with config file: filebrowser.yaml From 356c1f58889090859ebc437739faba47c3efe096 Mon Sep 17 00:00:00 2001 From: Graham Steffaniak <42989099+gtsteffaniak@users.noreply.github.com> Date: Sun, 10 Sep 2023 09:08:21 -0500 Subject: [PATCH 7/9] Update readme (#22) --- README.md | 11 ++++++++++- roadmap.md | 29 +++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 1 deletion(-) create mode 100644 roadmap.md diff --git a/README.md b/README.md index 16f49766..610ab4c8 100644 --- a/README.md +++ b/README.md @@ -138,8 +138,17 @@ All configuration is now done via a single configuration file: `filebrowser.yaml View the [Configuration Help Page](./configuration.md) for available configuration options and other help. -### background +### background & help The original project filebrowser/filebrowser used multiple different ways to configure the server. This was confusing and difficult to work with from a user and from a developer's perspective. So I completely redesigned the program to use one single human-readable config file. + +I understand many coming from the original fork may notice differences which make using this improved version more difficult. If you notice issues that you believe should be fixed, please open an issue here and it will very likely be addressed with a PR within a few weeks. + +This version of filebrowser is going through a configuration overhaul as mentioned above. Certain features related to rules and commands may not work as they do on the original filebrowser. The purpose of this is to create a more consistent experience where configuration is done via files rather than running commands, so that it's very clear what the current state of the configuration is. When running commands its not clear what the configuration is. + +## Roadmap + +see [Roadmap Page](./roadmap.md) + diff --git a/roadmap.md b/roadmap.md new file mode 100644 index 00000000..cf358b07 --- /dev/null +++ b/roadmap.md @@ -0,0 +1,29 @@ +# Planned Roadmap + +Next release (0.2.1): + + - Improve browsing directory performance by utilizing the index. + - Add editor themes back that were removed because of issues. + - Add "running config" which is editable in filebrowser settings to add rules, users, settings which would normally be done via commands. + - baseurl issue https://github.com/filebrowser/filebrowser/pull/2579 + - https://github.com/filebrowser/filebrowser/issues/2526 + - https://github.com/filebrowser/filebrowser/issues/2698 + - https://github.com/filebrowser/filebrowser/pull/2667 + - https://github.com/filebrowser/filebrowser/issues/2632 + - https://github.com/filebrowser/filebrowser/issues/2619 + - https://github.com/filebrowser/filebrowser/issues/2618 + - https://github.com/filebrowser/filebrowser/issues/2607 + + +Future releases (within 6 months): + + - Allow multiple volumes to show up in the same filebrowser container. https://github.com/filebrowser/filebrowser/issues/2514 + - enable/disable indexing for certain mounts + - Add tools to sidebar + - duplicate file detector. + - bulk rename https://github.com/filebrowser/filebrowser/issues/2473 + - Add Job status to the sidebar - indexin status. + - Use vite instead of webpack + - upgrade to vue3 + - support minio/s3 https://github.com/filebrowser/filebrowser/issues/2544 + - https://github.com/filebrowser/filebrowser/issues/2537 From 3ae1f5b9d0590102ff109c3e8bf61718ad0c90c7 Mon Sep 17 00:00:00 2001 From: Graham Steffaniak <42989099+gtsteffaniak@users.noreply.github.com> Date: Sun, 10 Sep 2023 09:35:30 -0500 Subject: [PATCH 8/9] Updated readme and roadmap (#30) * Create roadmap.md * Update README.md * updated readme --- README.md | 30 +++++++---------------------- backend/benchmark_results.txt | 32 +++++++++++++++---------------- backend/settings/settings_test.go | 6 ++---- backend/storage/bolt/config.go | 2 +- 4 files changed, 26 insertions(+), 44 deletions(-) diff --git a/README.md b/README.md index 610ab4c8..c317a247 100644 --- a/README.md +++ b/README.md @@ -18,23 +18,11 @@ Starting with v0.2.0, *ALL* configuration is done via `filebrowser.yaml` configu This fork makes the following significant changes to filebrowser for origin: 1. [x] Improves search to use index instead of filesystem. - - [x] Lightning fast - - [x] Realtime results as you type - - [x] Works with file type filter - - [x] better desktop search view - 1. [x] Preview enhancements - - Preview default view is constrained to files subwindow, - which can be toggled to fullscreen. - 1. [x] Improved and simplified GUI - - Moved all action buttons to file action bar except for switch-view - - Simplified navbar to 3 main actions: settings,search, and switch-view - - New search view on desktop - 1. [x] Updated version and dependencies - - [x] Uses latest npm and node version - - [x] Removes deprecated npm packages - - [x] Updates golang dependencies - - [x] Remove all unnecessary packages, replaces with generic functions. - 1. [x] **IMPORTANT** Moved all configurations to `filebrowser.yaml`. no more flags or binary operations to db + - Lightning fast, realtime results as you type + - Works with more type filters + 1. [x] Improved and simplified GUI navbar and sidebar menu. + 1. [x] Updated version and dependencies. + 1. [x] **IMPORTANT** Moved all configurations to `filebrowser.yaml`. ## About @@ -48,10 +36,6 @@ work better in terms of asthetics and performance. Improved search, simplified ui (without removing features) and more secure and up-to-date build are just a few examples. -There are a few more changes needed to get it to a stable status where it -will only recieve security updates. These changes are mentioned above. -Once this is fully complete, the only updates to th - ## Look

@@ -60,9 +44,9 @@ Once this is fully complete, the only updates to th

-## Performance +## Search Performance -Search Performance - 100x faster search. However, this will be at expense of RAM. if you have < 1 million +100x faster search. However, this will be at expense of RAM. if you have < 1 million files and folders in the given scope, the RAM usage should be less than 200MB total. RAM requirements should scale based on the number of directories. diff --git a/backend/benchmark_results.txt b/backend/benchmark_results.txt index 655b1f9c..962ad6ff 100644 --- a/backend/benchmark_results.txt +++ b/backend/benchmark_results.txt @@ -5,38 +5,38 @@ ? github.com/gtsteffaniak/filebrowser/auth [no test files] ? github.com/gtsteffaniak/filebrowser/cmd [no test files] PASS -ok github.com/gtsteffaniak/filebrowser/diskcache 0.004s +ok github.com/gtsteffaniak/filebrowser/diskcache 0.003s ? github.com/gtsteffaniak/filebrowser/errors [no test files] ? github.com/gtsteffaniak/filebrowser/files [no test files] PASS -ok github.com/gtsteffaniak/filebrowser/fileutils 0.004s -2023/09/02 19:15:20 h: 401 -2023/09/02 19:15:20 h: 401 -2023/09/02 19:15:20 h: 401 -2023/09/02 19:15:20 h: 401 -2023/09/02 19:15:20 h: 401 -2023/09/02 19:15:20 h: 401 +ok github.com/gtsteffaniak/filebrowser/fileutils 0.003s +2023/09/10 09:17:55 h: 401 +2023/09/10 09:17:55 h: 401 +2023/09/10 09:17:55 h: 401 +2023/09/10 09:17:56 h: 401 +2023/09/10 09:17:56 h: 401 +2023/09/10 09:17:56 h: 401 PASS -ok github.com/gtsteffaniak/filebrowser/http 0.094s +ok github.com/gtsteffaniak/filebrowser/http 0.082s PASS -ok github.com/gtsteffaniak/filebrowser/img 0.122s +ok github.com/gtsteffaniak/filebrowser/img 0.118s PASS ok github.com/gtsteffaniak/filebrowser/rules 0.002s PASS -ok github.com/gtsteffaniak/filebrowser/runner 0.004s +ok github.com/gtsteffaniak/filebrowser/runner 0.003s goos: linux goarch: amd64 pkg: github.com/gtsteffaniak/filebrowser/search cpu: 11th Gen Intel(R) Core(TM) i5-11320H @ 3.20GHz -BenchmarkSearchAllIndexes-8 10 5176084 ns/op 2743632 B/op 42785 allocs/op -BenchmarkFillIndex-8 10 3263308 ns/op 18485 B/op 453 allocs/op +BenchmarkSearchAllIndexes-8 10 5311144 ns/op 2934075 B/op 44569 allocs/op +BenchmarkFillIndex-8 10 3142607 ns/op 18473 B/op 452 allocs/op PASS -ok github.com/gtsteffaniak/filebrowser/search 0.109s +ok github.com/gtsteffaniak/filebrowser/search 0.110s PASS -ok github.com/gtsteffaniak/filebrowser/settings 0.004s +ok github.com/gtsteffaniak/filebrowser/settings 0.005s ? github.com/gtsteffaniak/filebrowser/share [no test files] ? github.com/gtsteffaniak/filebrowser/storage [no test files] ? github.com/gtsteffaniak/filebrowser/storage/bolt [no test files] PASS -ok github.com/gtsteffaniak/filebrowser/users 0.004s +ok github.com/gtsteffaniak/filebrowser/users 0.003s ? github.com/gtsteffaniak/filebrowser/version [no test files] diff --git a/backend/settings/settings_test.go b/backend/settings/settings_test.go index 7eefacd7..e2c192ee 100644 --- a/backend/settings/settings_test.go +++ b/backend/settings/settings_test.go @@ -9,8 +9,7 @@ import ( ) func TestConfigLoadChanged(t *testing.T) { - configYml = "./testingConfig.yaml" - yamlData := loadConfigFile() + yamlData := loadConfigFile("./testingConfig.yaml") // Marshal the YAML data to a more human-readable format newConfig := setDefaults() GlobalConfiguration := setDefaults() @@ -26,8 +25,7 @@ func TestConfigLoadChanged(t *testing.T) { } func TestConfigLoadSpecificValues(t *testing.T) { - configYml = "./testingConfig.yaml" - yamlData := loadConfigFile() + yamlData := loadConfigFile("./testingConfig.yaml") // Marshal the YAML data to a more human-readable format newConfig := setDefaults() GlobalConfiguration := setDefaults() diff --git a/backend/storage/bolt/config.go b/backend/storage/bolt/config.go index cb4914c6..b9f293da 100644 --- a/backend/storage/bolt/config.go +++ b/backend/storage/bolt/config.go @@ -20,7 +20,7 @@ func (s settingsBackend) Save(set *settings.Settings) error { func (s settingsBackend) GetServer() (*settings.Server, error) { server := &settings.Server{ - Port: 8080, + Port: 8080, NumImageProcessors: 1, } return server, get(s.db, "server", server) From 1285c020d5f9a5c1e5d245183f71425c8f9bac5f Mon Sep 17 00:00:00 2001 From: Graham Steffaniak <42989099+gtsteffaniak@users.noreply.github.com> Date: Fri, 15 Sep 2023 17:14:18 -0500 Subject: [PATCH 9/9] Add workflows (#31) Co-authored-by: Graham Steffaniak --- .dockerignore | 2 +- .github/workflows/main.yaml | 121 +++++++------------- .github/workflows/{stale.yml => stale.yaml} | 4 +- Dockerfile | 1 + README.md | 4 +- backend/go.mod | 2 +- frontend/package.json | 5 +- 7 files changed, 51 insertions(+), 88 deletions(-) rename .github/workflows/{stale.yml => stale.yaml} (88%) diff --git a/.dockerignore b/.dockerignore index 41108087..4a013aa4 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,4 +1,4 @@ -backend/database.db +backend/**.db backend/vendor/** frontend/dist/** frontend/node_modules/** \ No newline at end of file diff --git a/.github/workflows/main.yaml b/.github/workflows/main.yaml index 42ae7c60..80ea3969 100644 --- a/.github/workflows/main.yaml +++ b/.github/workflows/main.yaml @@ -3,98 +3,57 @@ name: main on: push: branches: - - 'master' - tags: - - 'v*' + - 'main' + - 'v\d+.\d+.\d+' pull_request: - + branches: + - 'main' + - 'v\d+.\d+.\d+' jobs: -# linters - lint-frontend: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - uses: actions/setup-node@v2 - with: - node-version: '16' - - run: make lint-frontend - lint-backend: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - uses: actions/setup-go@v2 - with: - go-version: 1.20.1 - - run: make lint-backend - lint-commits: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - with: - fetch-depth: 0 - - uses: actions/setup-node@v2 - with: - node-version: '16' - - run: make lint-commits - lint: - runs-on: ubuntu-latest - needs: [lint-frontend, lint-backend, lint-commits] - steps: - - run: echo "done" - -# tests - test-frontend: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - uses: actions/setup-node@v2 - with: - node-version: '16' - - run: make test-frontend - test-backend: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - uses: actions/setup-go@v2 - with: - go-version: 1.20.1 - - run: make test-backend test: runs-on: ubuntu-latest - needs: [test-frontend, test-backend] steps: - - run: echo "done" - -# release - release: + - uses: actions/checkout@v3 + - uses: actions/setup-go@v4 + with: + go-version: 1.21.1 + - run: cd backend && go test -race -v ./... + lint: runs-on: ubuntu-latest - needs: [lint, test] - if: startsWith(github.event.ref, 'refs/tags/v') steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 + - uses: actions/setup-go@v4 with: - fetch-depth: 0 - - uses: actions/setup-go@v2 - with: - go-version: 1.20.1 - - uses: actions/setup-node@v2 - with: - node-version: '16' + go-version: 1.21.1 + - run: cd backend && go fmt ./... + push_to_registry: + needs: [lint, test] + name: Push Docker image to Docker Hub + runs-on: ubuntu-latest + if: contains(github.ref, 'main') || startsWith(github.ref,'v0.') + steps: + - name: Check out the repo + uses: actions/checkout@v4 - name: Set up QEMU - uses: docker/setup-qemu-action@v1 + uses: docker/setup-qemu-action@v3 - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v1 - - name: Build frontend - run: make build-frontend - - name: Login to Docker Hub - uses: docker/login-action@v1 + uses: docker/setup-buildx-action@v3 + - name: Log in to Docker Hub + uses: docker/login-action@f4ef78c080cd8ba55a85445d5b36e214a81df20a with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} - - name: Run GoReleaser - uses: goreleaser/goreleaser-action@v2 + - name: Extract metadata (tags, labels) for Docker + id: meta + uses: docker/metadata-action@9ec57ed1fcdbf14dcef7dfbe97b2010124a938b7 with: - version: latest - args: release --rm-dist - env: - GITHUB_TOKEN: ${{ secrets.GH_PAT }} + images: gtstef/filebrowser + - name: Build and push + uses: docker/build-push-action@v5 + with: + context: . + platforms: linux/amd64,linux/arm64,linux/arm/v7 + file: ./Dockerfile + push: true + tags: ${{ contains(github.ref, 'main') && 'latest' || steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} \ No newline at end of file diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yaml similarity index 88% rename from .github/workflows/stale.yml rename to .github/workflows/stale.yaml index 60c6ae5e..c7b8f58f 100644 --- a/.github/workflows/stale.yml +++ b/.github/workflows/stale.yaml @@ -16,9 +16,9 @@ jobs: stale-pr-message: 'This PR is stale because it has been open 30 days with no activity. Remove stale label or comment or this will be closed in 5 days.' close-pr-message: 'This PR was closed because it has been stalled for 5 days with no activity.' stale-issue-message: 'This issue is stale because it has been open 30 days with no activity. Remove stale label or comment or this will be closed in 5 days.' - close-issue-message: 'This issue was closed because it has been stalled for 5 days with no activity.' + close-issue-message: 'This issue was closed because it has been stalled for 30 days with no activity.' days-before-stale: 30 - days-before-close: 5 + days-before-close: 30 exempt-issue-labels: 'feature ☘,enhancement ⚙,bug 🐞' exempt-pr-labels: 'need-help,wip' operations-per-run: 100 \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index 070266d6..5df9a358 100644 --- a/Dockerfile +++ b/Dockerfile @@ -8,6 +8,7 @@ RUN npm run build FROM golang:1.21-alpine as base WORKDIR /app COPY ./backend ./ +RUN go get -u golang.org/x/net RUN go build -ldflags="-w -s" -o filebrowser . FROM alpine:latest diff --git a/README.md b/README.md index c317a247..d872efd2 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ -

- License: MIT +

+ License: Apache-2.0

diff --git a/backend/go.mod b/backend/go.mod index 107622c5..83bc14f3 100644 --- a/backend/go.mod +++ b/backend/go.mod @@ -1,6 +1,6 @@ module github.com/gtsteffaniak/filebrowser -go 1.21.0 +go 1.21 require ( github.com/asdine/storm/v3 v3.2.1 diff --git a/frontend/package.json b/frontend/package.json index 00c529e1..87f6487c 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -6,7 +6,10 @@ "serve": "vue-cli-service serve", "build": "vue-cli-service build", "fix": "npx vue-cli-service lint", - "watch": "vue-cli-service build --watch" + "watch": "vue-cli-service build --watch", + "lint": "eslint --ext .vue,.js src/", + "lint:fix": "eslint --ext .vue,.js --fix src/", + "format": "prettier --write ." }, "dependencies": { "ace-builds": "^1.24.2",