Compare commits

..
7 Commits
Author SHA1 Message Date
Graham Steffaniak 8e66cbf2c3 updated wokflow 2024-05-04 20:50:01 -05:00
d5332e8c66 Configupdate (#90)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: Graham Steffaniak <graham.steffaniak@autodesk.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-12-06 15:03:26 -06:00
Graham Steffaniak 3a06ad7330 Merge branch 'main' into v0.2.2 2023-12-02 11:03:44 -05:00
Graham Steffaniak 1897471c3b updated view 2023-12-02 10:02:43 -06:00
Graham Steffaniak f7a4789945 Merge branch 'v0.2.2' of github.com:gtsteffaniak/filebrowser into v0.2.2 2023-12-02 09:57:04 -06:00
Graham Steffaniak 0999ac6319 remove show limit 2023-12-02 09:56:39 -06:00
792986337f initial dev to v0.2.2 (#85)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: Graham Steffaniak <graham.steffaniak@autodesk.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-12-01 17:38:23 -06:00
24 changed files with 120 additions and 143 deletions

No files matched your search

+7 -10
View File
@@ -2,18 +2,15 @@
All notable changes to this project will be documented in this file. For commit guidelines, please refer to [Standard Version](https://github.com/conventional-changelog/standard-version).
## v0.2.3
- Feature: token expiration time now configurable
- FIX: Hidden files are still directly accessible. (https://github.com/filebrowser/filebrowser/issues/2698)
- FIX: search/user context bug
## v0.2.2
- CHG: **Speed:** (0m57s) - Decreased by 78% compared to the previous release.
- CHG: **Memory Usage:** (41MB) - Reduced by 45% compared to the previous release.
- Feature: Now utilizes the index for file browser listings!
- FIX: Editor issues fixed on save and themes.
- **Major Indexing Changes:**
- **Speed:** (0m57s) - Decreased by 78% compared to the previous release.
- **Memory Usage:** (41MB) - Reduced by 45% compared to the previous release.
- Now utilizes the index for file browser listings!
- **[Work in Progress]** Hidden files are still directly accessible.
- **[Work in Progress]** Editor issues fixed on save and themes.
- **[Work in Progress]** `running-config.yaml` gets updated when settings change, ensuring that running settings are up to date.
## v0.2.1
+2 -4
View File
@@ -119,10 +119,8 @@ func (si *Index) InsertFiles(path string) {
buffer := bytes.Buffer{}
for _, f := range si.GetQuickList() {
if !f.IsDir {
buffer.WriteString(f.Name + ";")
si.UpdateCount("files")
}
buffer.WriteString(f.Name + ";")
si.UpdateCount("files")
}
// Use GetMetadataInfo and SetFileMetadata for safer read and write operations
subDirectory.Files = buffer.String()
+10 -7
View File
@@ -16,15 +16,16 @@ var (
)
func (si *Index) Search(search string, scope string, sourceSession string) ([]string, map[string]map[string]bool) {
// Remove slashes
scope = strings.TrimLeft(scope, "/")
scope = strings.TrimRight(scope, "/")
if scope == "" {
scope = "/"
}
runningHash := generateRandomHash(4)
sessionInProgress.Store(sourceSession, runningHash) // Store the value in the sync.Map
searchOptions := ParseSearch(search)
fileListTypes := make(map[string]map[string]bool)
matching := []string{}
count := 0
for _, searchTerm := range searchOptions.Terms {
if searchTerm == "" {
continue
@@ -45,6 +46,7 @@ func (si *Index) Search(search string, scope string, sourceSession string) ([]st
if pathName == "" {
continue // path not matched
}
fileTypes := map[string]bool{}
matches, fileType := containsSearchTerm(dirName, searchTerm, *searchOptions, isDir, fileTypes)
if matches {
@@ -72,6 +74,7 @@ func (si *Index) Search(search string, scope string, sourceSession string) ([]st
if !matches {
continue
}
fileListTypes[fullName] = fileType
matching = append(matching, fullName)
count++
@@ -88,11 +91,11 @@ func (si *Index) Search(search string, scope string, sourceSession string) ([]st
}
func scopedPathNameFilter(pathName string, scope string, isDir bool) string {
pathName = strings.TrimLeft(pathName, "/")
pathName = strings.TrimRight(pathName, "/")
if strings.HasPrefix(pathName, scope) || scope == "" {
scope = strings.TrimPrefix(scope, "/")
pathName = strings.TrimPrefix(pathName, "/")
pathName = strings.TrimSuffix(pathName, "/")
if strings.HasPrefix(pathName, scope) {
pathName = strings.TrimPrefix(pathName, scope)
pathName = strings.TrimLeft(pathName, "/")
if isDir {
pathName = pathName + "/"
}
+7 -20
View File
@@ -163,38 +163,25 @@ func TestSearchIndexes(t *testing.T) {
}
func Test_scopedPathNameFilter(t *testing.T) {
type args struct {
pathName string
scope string
}
tests := []struct {
name string
args struct {
pathName string
scope string
isDir bool // Assuming isDir should be included in args
}
args args
want string
}{
{
name: "scope test",
args: struct {
pathName string
scope string
isDir bool
}{
pathName: "/",
scope: "/",
isDir: false,
},
want: "", // Update this with the expected result
},
// TODO: Add test cases.
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if got := scopedPathNameFilter(tt.args.pathName, tt.args.scope, tt.args.isDir); got != tt.want {
if got := scopedPathNameFilter(tt.args.pathName, tt.args.scope, false); got != tt.want {
t.Errorf("scopedPathNameFilter() = %v, want %v", got, tt.want)
}
})
}
}
func Test_isDoc(t *testing.T) {
type args struct {
extension string
+3 -3
View File
@@ -19,9 +19,9 @@ require (
github.com/spf13/pflag v1.0.5
github.com/stretchr/testify v1.8.4
github.com/tomasen/realip v0.0.0-20180522021738-f0c99a92ddce
golang.org/x/crypto v0.17.0
golang.org/x/crypto v0.14.0
golang.org/x/image v0.12.0
golang.org/x/text v0.14.0
golang.org/x/text v0.13.0
)
require (
@@ -49,7 +49,7 @@ require (
github.com/yusufpapurcu/wmi v1.2.3 // indirect
go.etcd.io/bbolt v1.3.4 // indirect
golang.org/x/net v0.17.0 // indirect
golang.org/x/sys v0.15.0 // indirect
golang.org/x/sys v0.13.0 // indirect
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
+5 -6
View File
@@ -280,8 +280,8 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh
golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
golang.org/x/crypto v0.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k=
golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4=
golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc=
golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
@@ -426,8 +426,8 @@ golang.org/x/sys v0.0.0-20220928140112-f11e5e49a4ec/go.mod h1:oPkhp1MJrh7nUepCBc
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc=
golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE=
golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
@@ -440,9 +440,8 @@ golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k=
golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
+5 -7
View File
@@ -2,7 +2,6 @@ package http
import (
"encoding/json"
"fmt"
"log"
"net/http"
"os"
@@ -17,6 +16,10 @@ import (
"github.com/gtsteffaniak/filebrowser/users"
)
const (
TokenExpirationTime = time.Hour * 2
)
type authToken struct {
User users.User `json:"user"`
jwt.RegisteredClaims
@@ -155,16 +158,11 @@ var renewHandler = withUser(func(w http.ResponseWriter, r *http.Request, d *data
})
func printToken(w http.ResponseWriter, _ *http.Request, d *data, user *users.User) (int, error) {
duration, err := time.ParseDuration(settings.Config.Auth.TokenExpirationTime)
if err != nil {
fmt.Println("Error parsing duration:", err)
duration = time.Hour * 2
}
claims := &authToken{
User: *user,
RegisteredClaims: jwt.RegisteredClaims{
IssuedAt: jwt.NewNumericDate(time.Now()),
ExpiresAt: jwt.NewNumericDate(time.Now().Add(duration)),
ExpiresAt: jwt.NewNumericDate(time.Now().Add(TokenExpirationTime)),
Issuer: "File Browser",
},
}
+4
View File
@@ -7,6 +7,7 @@ import (
"github.com/tomasen/realip"
"github.com/gtsteffaniak/filebrowser/rules"
"github.com/gtsteffaniak/filebrowser/runner"
"github.com/gtsteffaniak/filebrowser/settings"
"github.com/gtsteffaniak/filebrowser/storage"
@@ -26,6 +27,9 @@ type data struct {
// Check implements rules.Checker.
func (d *data) Check(path string) bool {
if d.user.HideDotfiles && rules.MatchHidden(path) {
return false
}
allow := true
for _, rule := range d.settings.Rules {
+1
View File
@@ -16,6 +16,7 @@ var searchHandler = withUser(func(w http.ResponseWriter, r *http.Request, d *dat
userScope := r.Header.Get("UserScope")
index := files.GetIndex(settings.Config.Server.Root)
combinedScope := strings.TrimPrefix(userScope+r.URL.Path, ".")
combinedScope = strings.TrimPrefix(combinedScope, "/")
results, fileTypes := index.Search(query, combinedScope, sessionId)
for _, path := range results {
responseObj := map[string]interface{}{
+4 -5
View File
@@ -60,11 +60,10 @@ func setDefaults() Settings {
Root: "/srv",
},
Auth: Auth{
TokenExpirationTime: "2h",
AdminUsername: "admin",
AdminPassword: "admin",
Method: "password",
Signup: false,
AdminUsername: "admin",
AdminPassword: "admin",
Method: "password",
Signup: false,
Recaptcha: Recaptcha{
Host: "",
},
+9 -10
View File
@@ -17,16 +17,15 @@ type Settings struct {
}
type Auth struct {
TokenExpirationTime string `json:"tokenExpirationTime"`
Recaptcha Recaptcha `json:"recaptcha"`
Header string `json:"header"`
Method string `json:"method"`
Command string `json:"command"`
Signup bool `json:"signup"`
Shell string `json:"shell"`
AdminUsername string `json:"adminUsername"`
AdminPassword string `json:"adminPassword"`
Key []byte `json:"key"`
Recaptcha Recaptcha `json:"recaptcha"`
Header string `json:"header"`
Method string `json:"method"`
Command string `json:"command"`
Signup bool `json:"signup"`
Shell string `json:"shell"`
AdminUsername string `json:"adminUsername"`
AdminPassword string `json:"adminPassword"`
Key []byte `json:"key"`
}
type Recaptcha struct {
+1 -1
View File
@@ -2,7 +2,7 @@ package version
var (
// Version is the current File Browser version.
Version = "(0.2.3)"
Version = "(0.2.2)"
// CommitSHA is the commmit sha.
CommitSHA = "(unknown)"
)
-1
View File
@@ -31,7 +31,6 @@ auth:
host: ""
key: ""
secret: ""
tokenExpirationTime: 2h
header: ""
method: json
command: ""
+10 -10
View File
@@ -1045,9 +1045,9 @@
},
"node_modules/@vue/vue-loader-v15": {
"name": "vue-loader",
"version": "15.11.1",
"resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-15.11.1.tgz",
"integrity": "sha512-0iw4VchYLePqJfJu9s62ACWUXeSqM30SQqlIftbYWM3C+jpPcEHKSPUZBLjSF9au4HTHQ/naF6OGnO3Q/qGR3Q==",
"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",
@@ -5341,9 +5341,9 @@
}
},
"node_modules/nanoid": {
"version": "3.3.7",
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz",
"integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==",
"version": "3.3.6",
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz",
"integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==",
"funding": [
{
"type": "github",
@@ -5896,9 +5896,9 @@
}
},
"node_modules/postcss": {
"version": "8.4.32",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.32.tgz",
"integrity": "sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw==",
"version": "8.4.29",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.29.tgz",
"integrity": "sha512-cbI+jaqIeu/VGqXEarWkRCCffhjgXc0qjBtXpqJhTBohMUjUQnbBr0xqX3vEKudc4iviTewcJo5ajcec5+wdJw==",
"funding": [
{
"type": "opencollective",
@@ -5914,7 +5914,7 @@
}
],
"dependencies": {
"nanoid": "^3.3.7",
"nanoid": "^3.3.6",
"picocolors": "^1.0.0",
"source-map-js": "^1.0.2"
},
+5
View File
@@ -43,6 +43,11 @@
"eslint-plugin-vue": "^9.17.0",
"vue-template-compiler": "^2.6.10"
},
"postcss": {
"plugins": {
"autoprefixer": {}
}
},
"browserslist": [
"> 1%",
"last 2 versions",
+10 -11
View File
@@ -30,7 +30,7 @@
<div v-if="isMobile && active" id="result" :class="{ hidden: !active }" ref="result">
<div id="result-list">
<div class="button" style="width: 100%">
Search Context: {{ getContext }}
Search Context: {{ this.searchContext }}
</div>
<ul v-show="results.length > 0">
<li
@@ -91,7 +91,7 @@
</div>
</div>
<div v-show="!isMobile && active" id="result-desktop" ref="result">
<div class="searchContext">Search Context: {{ getContext }}</div>
<div class="searchContext">Search Context: {{ this.searchContext }}</div>
<div id="result-list">
<template>
<p v-show="isEmpty && isRunning" id="renew">
@@ -535,6 +535,7 @@ export default {
name: "search",
data: function () {
return {
searchContext: "./",
largerThan: "",
smallerThan: "",
noneMessage: "Start typing 3 or more characters to begin searching.",
@@ -631,16 +632,10 @@ export default {
searchHelp() {
return this.showHelp;
},
getContext() {
let path = this.$route.path
path = path.slice(1);
path = "./" + path.substring(path.indexOf("/") + 1);
path = path.replace(/\/+$/, "") + "/";
return path
},
},
mounted() {
window.addEventListener("resize", this.handleResize);
this.searchContext = this.getContext(this.$route.path)
this.handleResize(); // Call this once to set the initial width
},
methods: {
@@ -652,15 +647,19 @@ export default {
await this.$nextTick();
setTimeout(() => this.$router.push(url), 0);
},
getContext(url) {
url = url.slice(1);
let path = "./" + url.substring(url.indexOf("/") + 1);
return path.replace(/\/+$/, "") + "/";
},
basePath(str,isDir) {
let parts = str.replace(/(\/$|^\/)/, "").split("/");
if (parts.length <= 1) {
if (parts.length <= 2) {
if (isDir) {
return "/"
}
return "";
}
console.log("basePath",parts)
parts.pop();
parts = parts.join("/") + "/";
if (isDir) {
+8 -10
View File
@@ -42,7 +42,7 @@
<languages
class="input input--block"
id="locale"
v-model:locale="user.locale"
:locale.sync="user.locale"
></languages>
</p>
@@ -55,13 +55,13 @@
{{ $t("settings.lockPassword") }}
</p>
<permissions :perm="user.perm" />
<commands v-if="isExecEnabled" v-model:commands="user.commands" />
<permissions :perm.sync="user.perm" />
<commands v-if="isExecEnabled" :commands.sync="user.commands" />
<div v-if="!isDefault">
<h3>{{ $t("settings.rules") }}</h3>
<p class="small">{{ $t("settings.rulesHelp") }}</p>
<rules v-model:rules="user.rules" />
<rules :rules.sync="user.rules" />
</div>
</div>
</template>
@@ -75,7 +75,7 @@ import { enableExec } from "@/utils/constants";
export default {
name: "user",
data() {
data: () => {
return {
createUserDirData: false,
originalUserScope: "/",
@@ -104,17 +104,15 @@ export default {
displayHomeDirectoryCheckbox() {
return this.isNew && this.createUserDir;
},
isExecEnabled() {
return enableExec; // Removed arrow function
},
isExecEnabled: () => enableExec,
},
watch: {
"user.perm.admin": function () {
if (!this.user.perm.admin) return;
this.user.lockPassword = false;
},
createUserDirData(newVal) {
this.user.scope = newVal ? "" : this.originalUserScope;
createUserDirData() {
this.user.scope = this.createUserDirData ? "" : this.originalUserScope;
},
},
};
+1
View File
@@ -264,6 +264,7 @@
/* Button group button */
.dark-mode .button-group button {
background: var(--background);
color: white;
}
-3
View File
@@ -260,9 +260,6 @@ export default {
const files = [];
this.req.items.forEach((item) => {
if (this.user.hideDotfiles && item.name.startsWith(".")) {
return;
}
if (item.isDir) {
dirs.push(item);
} else {
+4 -11
View File
@@ -29,7 +29,7 @@
<h3>{{ $t("settings.rules") }}</h3>
<p class="small">{{ $t("settings.globalRules") }}</p>
<rules :rules="settings.rules" @update:rules="updateRules" />
<rules :rules.sync="settings.rules" />
<div v-if="isExecEnabled">
<h3>{{ $t("settings.executeOnShell") }}</h3>
@@ -116,8 +116,7 @@
<user-form
:isNew="false"
:isDefault="true"
:user="settings.defaults"
@update:user="updateUser"
:user.sync="settings.defaults"
/>
</div>
@@ -150,8 +149,8 @@
</i18n>
<div
v-for="(command, index) in settings.commands"
:key="index"
v-for="command in settings.commands"
:key="command.name"
class="collapsible"
>
<input :id="command.name" type="checkbox" />
@@ -232,12 +231,6 @@ export default {
},
methods: {
...mapMutations(["setLoading"]),
updateRules(updatedRules) {
this.settings.rules = updatedRules;
},
updateUser(updatedUser) {
this.settings.defaults = updatedUser;
},
capitalize(name, where = "_") {
if (where === "caps") where = /(?=[A-Z])/;
let splitted = name.split(where);
+5 -13
View File
@@ -26,15 +26,13 @@
<h3>Listing View Style</h3>
<ViewMode
class="input input--block"
:viewMode="viewMode"
@update:viewMode="updateViewMode"
:viewMode.sync="viewMode"
></ViewMode>
<h3>{{ $t("settings.language") }}</h3>
<Languages
<languages
class="input input--block"
:locale="locale"
@update:locale="updateLocale"
></Languages>
:locale.sync="locale"
></languages>
</div>
<div class="card-action">
@@ -95,7 +93,7 @@ export default {
ViewMode,
Languages,
},
data() {
data: function () {
return {
password: "",
passwordConf: "",
@@ -186,12 +184,6 @@ export default {
this.$showError(e);
}
},
updateViewMode(updatedMode) {
this.viewMode = updatedMode;
},
updateLocale(updatedLocale) {
this.locale = updatedLocale;
},
},
};
</script>
+5 -7
View File
@@ -10,12 +10,10 @@
<div class="card-content">
<user-form
:user="user"
:createUserDir="createUserDir"
:user.sync="user"
:createUserDir.sync="createUserDir"
:isDefault="false"
:isNew="isNew"
@update:user="updatedUser => user = updatedUser"
@update:createUserDir="updatedDir => createUserDir = updatedDir"
/>
</div>
@@ -75,7 +73,7 @@ export default {
UserForm,
Errors,
},
data() {
data: () => {
return {
error: null,
originalUser: null,
@@ -93,7 +91,7 @@ export default {
},
...mapState(["loading"]),
showDeletePrompt() {
return this.showDelete;
return this.showDelete
},
},
watch: {
@@ -131,7 +129,7 @@ export default {
}
},
deletePrompt() {
this.showDelete = true;
this.showDelete = true
},
async deleteUser(event) {
event.preventDefault();
+14 -4
View File
@@ -1,10 +1,19 @@
# Planned Roadmap
Next version :
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
- Feature: config gets updated when settings change, ensuring that running settings are up to date.
- Feature: Move / Create Action Dialogs https://github.com/filebrowser/filebrowser/pull/2667
- Feature: playable shared video https://github.com/filebrowser/filebrowser/issues/2537
Future releases (within 6 months):
@@ -17,3 +26,4 @@ Future releases (within 6 months):
- 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
View File
Whitespace-only changes.