Compare commits

..

27 Commits

Author SHA1 Message Date
Oleg Lobanov
0e3b35b30e chore(release): 2.28.0 2024-04-01 16:22:00 +02:00
dependabot[bot]
05bfae264a build(deps): bump google.golang.org/protobuf from 1.31.0 to 1.33.0 (#3045)
Bumps google.golang.org/protobuf from 1.31.0 to 1.33.0.

---
updated-dependencies:
- dependency-name: google.golang.org/protobuf
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-03-17 21:58:00 +01:00
niubility000
4c233c3db3 feat: enable preview in shared folder (#3055) 2024-03-17 21:53:33 +01:00
dependabot[bot]
7797a4ef18 build(deps): bump google.golang.org/protobuf in /tools (#3044)
Bumps google.golang.org/protobuf from 1.28.0 to 1.33.0.

---
updated-dependencies:
- dependency-name: google.golang.org/protobuf
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-03-14 11:36:17 +01:00
niubility000
d70650689c feat: auto hiding header bar in preview to enlarge the preview window (#3024) 2024-03-07 11:25:01 +01:00
niubility000
8dddc8a450 chore: show the current used filebrowser.db in cmd window (#3028) 2024-03-07 11:16:41 +01:00
niubility000
cdf8def330 fix: stay in the same position after renaming or deleting (#3039) 2024-03-07 11:14:40 +01:00
niubility000
e167c3e1ef feat: freezing the list in the backgroud while previewing a file (#3004) 2024-02-22 19:42:36 +01:00
ねらひかだ
fe5ca74aa1 fix: fix lint warnings (#2976) 2024-02-09 11:05:35 +01:00
ねらひかだ
dfad87386f chore: update github action versions (#2977) 2024-02-09 11:05:09 +01:00
Shlomo
6d7ba65faf fix: shell direction (#2980) 2024-02-09 11:04:02 +01:00
Feriman
d5487ba6fa chore: add noindex (#2981) 2024-02-09 11:03:06 +01:00
zoui
34a08170c8 fix: editor discard prompt (#2990) 2024-02-09 11:01:41 +01:00
Shlomo
d49c3dfacf feat: select multiple files with ctrl even with singleClick option (#2953) 2024-01-30 10:49:35 +01:00
Shlomo
2cfee2183c fix: dashboard buttons position in rtl layout (#2949) 2024-01-30 10:48:32 +01:00
Shlomo
fb1a09c7c1 feat: prompt to confirm discard editor changes (#2948)
* chore: update he.json

* feat: prompt to confirm discard editor changes

---------

Co-authored-by: Oleg Lobanov <oleg@lobanov.me>
2024-01-30 10:48:03 +01:00
Shlomo
b19710efca feat: focus editor when opened (#2946) 2024-01-30 10:44:20 +01:00
Shlomo
ff9502ff34 fix: keyboard shortcut to confirm prompts (#2932) 2024-01-30 10:44:00 +01:00
Shlomo
62f0dfb302 chore: update he.json (#2933) 2024-01-30 10:37:47 +01:00
Quentin McGaw
81cd8fc6d3 fix(healthcheck): use address configured if not empty (#2938) 2024-01-30 10:37:17 +01:00
Shlomo
70c826133b feat: close editor when click escape key (#2947) 2024-01-30 10:29:37 +01:00
Shlomo
2f6c473977 chore: update pull request template (#2950) 2024-01-30 10:23:41 +01:00
dependabot[bot]
bf36cc00f1 build(deps-dev): bump vite from 4.4.12 to 4.5.2 in /frontend (#2951)
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 4.4.12 to 4.5.2.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/v4.5.2/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v4.5.2/packages/vite)

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

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-01-30 10:22:48 +01:00
Shlomo
883383a571 fix: moment locale (#2952) 2024-01-30 10:16:32 +01:00
ねらひかだ
0a05f8c01f chore(i18n): improvement of Japanese translation (#2962) 2024-01-30 10:15:27 +01:00
ねらひかだ
a4b089a6db feat: allow to configure if home directory is automatically created from cli (#2963) 2024-01-30 10:14:50 +01:00
ねらひかだ
5c5ab6b875 fix: files and directories are created with the correct permissions (#2966) 2024-01-30 10:12:38 +01:00
41 changed files with 541 additions and 258 deletions

View File

@@ -4,12 +4,11 @@ Please explain the changes you made here.
If the feature changes current behaviour, explain why your solution is better.
-->
:rotating_light: Before submitting your PR, please read [community](https://github.com/filebrowser/community), and indicate which issues (in any of the repos) are either fixed or closed by this PR. See [GitHub Help: Closing issues using keywords](https://help.github.com/articles/closing-issues-via-commit-messages/).
:rotating_light: Before submitting your PR, please indicate which issues are either fixed or closed by this PR. See [GitHub Help: Closing issues using keywords](https://help.github.com/articles/closing-issues-via-commit-messages/).
- [ ] DO make sure you are requesting to **pull a topic/feature/bugfix branch** (right side). Don't request your master!
- [ ] DO make sure you are making a pull request against the **master branch** (left side). Also you should start *your branch* off *our master*.
- [ ] DO make sure that File Browser can be successfully built. See [builds](https://github.com/filebrowser/community/blob/master/builds.md) and [development](https://github.com/filebrowser/community/blob/master/development.md).
- [ ] DO make sure that related issues are opened in other repositories. I.e., the frontend, caddy plugins or the web page need to be updated accordingly.
- [ ] AVOID breaking the continuous integration build.
**Further comments**

View File

@@ -13,26 +13,26 @@ jobs:
lint-frontend:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '18'
- run: make lint-frontend
lint-backend:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/setup-go@v2
- uses: actions/checkout@v4
- uses: actions/setup-go@v5
with:
go-version: 1.21.0
- run: make lint-backend
lint-commits:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v4
with:
fetch-depth: 0
- uses: actions/setup-node@v2
- uses: actions/setup-node@v4
with:
node-version: '18'
- run: make lint-commits
@@ -46,16 +46,16 @@ jobs:
test-frontend:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '18'
- run: make test-frontend
test-backend:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/setup-go@v2
- uses: actions/checkout@v4
- uses: actions/setup-go@v5
with:
go-version: 1.21.0
- run: make test-backend
@@ -71,13 +71,13 @@ jobs:
needs: [lint, test]
if: startsWith(github.event.ref, 'refs/tags/v')
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v4
with:
fetch-depth: 0
- uses: actions/setup-go@v2
- uses: actions/setup-go@v5
with:
go-version: 1.21.0
- uses: actions/setup-node@v2
- uses: actions/setup-node@v4
with:
node-version: '18'
- name: Set up QEMU

View File

@@ -2,6 +2,40 @@
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.28.0](https://github.com/filebrowser/filebrowser/compare/v2.27.0...v2.28.0) (2024-04-01)
### Features
* allow to configure if home directory is automatically created from cli ([#2963](https://github.com/filebrowser/filebrowser/issues/2963)) ([a4b089a](https://github.com/filebrowser/filebrowser/commit/a4b089a6dbf9821ecede428cd7d13e69c8b85231))
* auto hiding header bar in preview to enlarge the preview window ([#3024](https://github.com/filebrowser/filebrowser/issues/3024)) ([d706506](https://github.com/filebrowser/filebrowser/commit/d70650689c34ce9f631fda6a453fd521faef22fa))
* close editor when click escape key ([#2947](https://github.com/filebrowser/filebrowser/issues/2947)) ([70c8261](https://github.com/filebrowser/filebrowser/commit/70c826133b8578b8712e6db8f762a15a076cd9a9))
* enable preview in shared folder ([#3055](https://github.com/filebrowser/filebrowser/issues/3055)) ([4c233c3](https://github.com/filebrowser/filebrowser/commit/4c233c3db39ea5a00d6e602ec0ecbddecb590877))
* focus editor when opened ([#2946](https://github.com/filebrowser/filebrowser/issues/2946)) ([b19710e](https://github.com/filebrowser/filebrowser/commit/b19710efca6daa7af56dc211d0051d500d2eea22))
* freezing the list in the backgroud while previewing a file ([#3004](https://github.com/filebrowser/filebrowser/issues/3004)) ([e167c3e](https://github.com/filebrowser/filebrowser/commit/e167c3e1efed8b16be45d994a8d443fda1d8cf49))
* prompt to confirm discard editor changes ([#2948](https://github.com/filebrowser/filebrowser/issues/2948)) ([fb1a09c](https://github.com/filebrowser/filebrowser/commit/fb1a09c7c172b913c12b30975ca545e505df0c05))
* select multiple files with ctrl even with singleClick option ([#2953](https://github.com/filebrowser/filebrowser/issues/2953)) ([d49c3df](https://github.com/filebrowser/filebrowser/commit/d49c3dfacfc0ff07e620b3ad2700e64927b06235))
### Bug Fixes
* dashboard buttons position in rtl layout ([#2949](https://github.com/filebrowser/filebrowser/issues/2949)) ([2cfee21](https://github.com/filebrowser/filebrowser/commit/2cfee2183c98d0cb67fc4e9788644ed4278e25bc))
* editor discard prompt ([#2990](https://github.com/filebrowser/filebrowser/issues/2990)) ([34a0817](https://github.com/filebrowser/filebrowser/commit/34a08170c894321d49bb843e259a0e59e2245998))
* files and directories are created with the correct permissions ([#2966](https://github.com/filebrowser/filebrowser/issues/2966)) ([5c5ab6b](https://github.com/filebrowser/filebrowser/commit/5c5ab6b8750a5168f0ae2a26bd5de41e0b6d9637))
* fix lint warnings ([#2976](https://github.com/filebrowser/filebrowser/issues/2976)) ([fe5ca74](https://github.com/filebrowser/filebrowser/commit/fe5ca74aa1e4257e5cb36f1de58daa0c3548319f))
* **healthcheck:** use address configured if not empty ([#2938](https://github.com/filebrowser/filebrowser/issues/2938)) ([81cd8fc](https://github.com/filebrowser/filebrowser/commit/81cd8fc6d307b00af278beefcdbad4158a128fea))
* keyboard shortcut to confirm prompts ([#2932](https://github.com/filebrowser/filebrowser/issues/2932)) ([ff9502f](https://github.com/filebrowser/filebrowser/commit/ff9502ff34790c46f31d175911cd51c9b62804fb))
* moment locale ([#2952](https://github.com/filebrowser/filebrowser/issues/2952)) ([883383a](https://github.com/filebrowser/filebrowser/commit/883383a5715d82883c51138dfb547805dfad2a3c))
* shell direction ([#2980](https://github.com/filebrowser/filebrowser/issues/2980)) ([6d7ba65](https://github.com/filebrowser/filebrowser/commit/6d7ba65faf576ee4ed095f3d0c41775b21e498de))
* stay in the same position after renaming or deleting ([#3039](https://github.com/filebrowser/filebrowser/issues/3039)) ([cdf8def](https://github.com/filebrowser/filebrowser/commit/cdf8def3304315bef261da7f52f8599d90b1f0f0))
### Build
* **deps-dev:** bump vite from 4.4.12 to 4.5.2 in /frontend ([#2951](https://github.com/filebrowser/filebrowser/issues/2951)) ([bf36cc0](https://github.com/filebrowser/filebrowser/commit/bf36cc00f1369dd10a422f230ccabcbeefae1517))
* **deps:** bump google.golang.org/protobuf from 1.31.0 to 1.33.0 ([#3045](https://github.com/filebrowser/filebrowser/issues/3045)) ([05bfae2](https://github.com/filebrowser/filebrowser/commit/05bfae264a7a477d1b7db582f06f4efb24d26ec9))
* **deps:** bump google.golang.org/protobuf in /tools ([#3044](https://github.com/filebrowser/filebrowser/issues/3044)) ([7797a4e](https://github.com/filebrowser/filebrowser/commit/7797a4ef18038a877df31bd34f2ebf70d18823f8))
## [2.27.0](https://github.com/filebrowser/filebrowser/compare/v2.26.0...v2.27.0) (2024-01-02)

View File

@@ -31,6 +31,7 @@ func addConfigFlags(flags *pflag.FlagSet) {
addServerFlags(flags)
addUserFlags(flags)
flags.BoolP("signup", "s", false, "allow users to signup")
flags.Bool("create-user-dir", false, "generate user's home directory automatically")
flags.String("shell", "", "shell command to which other commands should be appended")
flags.String("auth.method", string(auth.MethodJSONAuth), "authentication type")

View File

@@ -29,11 +29,12 @@ override the options.`,
authMethod, auther := getAuthentication(flags)
s := &settings.Settings{
Key: generateKey(),
Signup: mustGetBool(flags, "signup"),
Shell: convertCmdStrToCmdArray(mustGetString(flags, "shell")),
AuthMethod: authMethod,
Defaults: defaults,
Key: generateKey(),
Signup: mustGetBool(flags, "signup"),
CreateUserDir: mustGetBool(flags, "create-user-dir"),
Shell: convertCmdStrToCmdArray(mustGetString(flags, "shell")),
AuthMethod: authMethod,
Defaults: defaults,
Branding: settings.Branding{
Name: mustGetString(flags, "branding.name"),
DisableExternal: mustGetBool(flags, "branding.disableExternal"),

View File

@@ -49,6 +49,8 @@ you want to change. Other options will remain unchanged.`,
hasAuth = true
case "shell":
set.Shell = convertCmdStrToCmdArray(mustGetString(flags, flag.Name))
case "create-user-dir":
set.CreateUserDir = mustGetBool(flags, flag.Name)
case "branding.name":
set.Branding.Name = mustGetString(flags, flag.Name)
case "branding.color":

View File

@@ -87,16 +87,23 @@ func python(fn pythonFunc, cfg pythonConfig) cobraFunc {
data := pythonData{hadDB: true}
path := getParam(cmd.Flags(), "database")
absPath, err := filepath.Abs(path)
if err != nil {
panic(err)
}
exists, err := dbExists(path)
if err != nil {
panic(err)
} else if exists && cfg.noDB {
log.Fatal(path + " already exists")
log.Fatal(absPath + " already exists")
} else if !exists && !cfg.noDB && !cfg.allowNoDB {
log.Fatal(path + " does not exist. Please run 'filebrowser config init' first.")
log.Fatal(absPath + " does not exist. Please run 'filebrowser config init' first.")
} else if !exists && !cfg.noDB {
log.Println("Warning: filebrowser.db can't be found. Initialing in " + strings.TrimSuffix(absPath, "filebrowser.db"))
}
log.Println("Using database: " + absPath)
data.hadDB = exists
db, err := storm.Open(path)
checkErr(err)

View File

@@ -24,7 +24,7 @@ import (
"github.com/filebrowser/filebrowser/v2/rules"
)
const PermFile = 0664
const PermFile = 0644
const PermDir = 0755
// FileInfo describes a file.

View File

@@ -7,6 +7,8 @@ import (
"path/filepath"
"github.com/spf13/afero"
"github.com/filebrowser/filebrowser/v2/files"
)
// MoveFile moves file from src to dst.
@@ -40,13 +42,13 @@ func CopyFile(fs afero.Fs, source, dest string) error {
// Makes the directory needed to create the dst
// file.
err = fs.MkdirAll(filepath.Dir(dest), 0666) //nolint:gomnd
err = fs.MkdirAll(filepath.Dir(dest), files.PermDir)
if err != nil {
return err
}
// Create the destination file.
dst, err := fs.OpenFile(dest, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0775) //nolint:gomnd
dst, err := fs.OpenFile(dest, os.O_RDWR|os.O_CREATE|os.O_TRUNC, files.PermFile)
if err != nil {
return err
}

View File

@@ -46,7 +46,7 @@
"postcss": "^8.4.31",
"prettier": "^3.0.1",
"terser": "^5.19.2",
"vite": "^4.4.12",
"vite": "^4.5.2",
"vite-plugin-compression2": "^0.10.3",
"vite-plugin-rewrite-all": "^1.0.1"
}
@@ -5663,9 +5663,9 @@
"dev": true
},
"node_modules/vite": {
"version": "4.4.12",
"resolved": "https://registry.npmjs.org/vite/-/vite-4.4.12.tgz",
"integrity": "sha512-KtPlUbWfxzGVul8Nut8Gw2Qe8sBzWY+8QVc5SL8iRFnpnrcoCaNlzO40c1R6hPmcdTwIPEDkq0Y9+27a5tVbdQ==",
"version": "4.5.2",
"resolved": "https://registry.npmjs.org/vite/-/vite-4.5.2.tgz",
"integrity": "sha512-tBCZBNSBbHQkaGyhGCDUGqeo2ph8Fstyp6FMSvTtsXeZSPpSMGlviAOav2hxVTqFcx8Hj/twtWKsMJXNY0xI8w==",
"dev": true,
"dependencies": {
"esbuild": "^0.18.10",

View File

@@ -52,7 +52,7 @@
"postcss": "^8.4.31",
"prettier": "^3.0.1",
"terser": "^5.19.2",
"vite": "^4.4.12",
"vite": "^4.5.2",
"vite-plugin-compression2": "^0.10.3",
"vite-plugin-rewrite-all": "^1.0.1"
},

View File

@@ -16,6 +16,8 @@
[{[ if .Name -]}][{[ .Name ]}][{[ else ]}]File Browser[{[ end ]}]
</title>
<meta name="robots" content="noindex,nofollow">
<link
rel="icon"
type="image/png"

View File

@@ -2,7 +2,7 @@
<div
class="shell"
:class="{ ['shell--hidden']: !showShell }"
:style="{ height: `${this.shellHeight}em` }"
:style="{ height: `${this.shellHeight}em`, direction: 'ltr' }"
>
<div
@pointerdown="startDrag()"

View File

@@ -38,7 +38,7 @@
import { enableThumbs } from "@/utils/constants";
import { mapMutations, mapGetters, mapState } from "vuex";
import { filesize } from "@/utils";
import moment from "moment";
import moment from "moment/min/moment-with-locales";
import { files as api } from "@/api";
import * as upload from "@/utils/upload";
@@ -191,7 +191,12 @@ export default {
action(overwrite, rename);
},
itemClick: function (event) {
if (this.singleClick && !this.$store.state.multiple) this.open();
if (
!(event.ctrlKey || event.metaKey) &&
this.singleClick &&
!this.$store.state.multiple
)
this.open();
else this.click(event);
},
click: function (event) {

View File

@@ -12,7 +12,7 @@
<div
class="card-action"
style="display: flex; align-items: center; justify-content: space-between;"
style="display: flex; align-items: center; justify-content: space-between"
>
<template v-if="user.perm.create">
<button
@@ -20,7 +20,7 @@
@click="$refs.fileList.createDir()"
:aria-label="$t('sidebar.newFolder')"
:title="$t('sidebar.newFolder')"
style="justify-self: left;"
style="justify-self: left"
>
<span>{{ $t("sidebar.newFolder") }}</span>
</button>

View File

@@ -45,6 +45,7 @@ export default {
submit: async function () {
buttons.loading("delete");
window.sessionStorage.setItem("modified", "true");
try {
if (!this.isListing) {
await api.remove(this.$route.path);

View File

@@ -0,0 +1,45 @@
<template>
<div class="card floating">
<div class="card-content">
<p>
{{ $t("prompts.discardEditorChanges") }}
</p>
</div>
<div class="card-action">
<button
@click="$store.commit('closeHovers')"
class="button button--flat button--grey"
:aria-label="$t('buttons.cancel')"
:title="$t('buttons.cancel')"
>
{{ $t("buttons.cancel") }}
</button>
<button
@click="submit"
class="button button--flat button--red"
:aria-label="$t('buttons.discardChanges')"
:title="$t('buttons.discardChanges')"
>
{{ $t("buttons.discardChanges") }}
</button>
</div>
</div>
</template>
<script>
import { mapMutations } from "vuex";
import url from "@/utils/url";
export default {
name: "discardEditorChanges",
methods: {
...mapMutations(["closeHovers"]),
submit: async function () {
this.$store.commit("updateRequest", {});
let uri = url.removeLastDir(this.$route.path) + "/";
this.$router.push({ path: uri });
},
},
};
</script>

View File

@@ -89,7 +89,7 @@
<script>
import { mapState, mapGetters } from "vuex";
import { filesize } from "@/utils";
import moment from "moment";
import moment from "moment/min/moment-with-locales";
import { files as api } from "@/api";
export default {
@@ -133,14 +133,13 @@ export default {
: this.req.items[this.selected[0]].isDir)
);
},
resolution: function() {
resolution: function () {
if (this.selectedCount === 1) {
const selectedItem = this.req.items[this.selected[0]];
if (selectedItem && selectedItem.type === 'image') {
if (selectedItem && selectedItem.type === "image") {
return selectedItem.resolution;
}
}
else if (this.req && this.req.type === 'image') {
} else if (this.req && this.req.type === "image") {
return this.req.resolution;
}
return null;

View File

@@ -11,7 +11,7 @@
<div
class="card-action"
style="display: flex; align-items: center; justify-content: space-between;"
style="display: flex; align-items: center; justify-content: space-between"
>
<template v-if="user.perm.create">
<button
@@ -19,7 +19,7 @@
@click="$refs.fileList.createDir()"
:aria-label="$t('sidebar.newFolder')"
:title="$t('sidebar.newFolder')"
style="justify-self: left;"
style="justify-self: left"
>
<span>{{ $t("sidebar.newFolder") }}</span>
</button>

View File

@@ -27,6 +27,7 @@ import Share from "./Share.vue";
import Upload from "./Upload.vue";
import ShareDelete from "./ShareDelete.vue";
import Sidebar from "../Sidebar.vue";
import DiscardEditorChanges from "./DiscardEditorChanges.vue";
import { mapGetters, mapState } from "vuex";
import buttons from "@/utils/buttons";
@@ -47,7 +48,8 @@ export default {
ReplaceRename,
Upload,
ShareDelete,
Sidebar
Sidebar,
DiscardEditorChanges,
},
data: function () {
return {
@@ -62,17 +64,16 @@ export default {
window.addEventListener("keydown", (event) => {
if (this.currentPrompt == null) return;
let prompt = this.$refs.currentComponent;
const promptName = this.currentPrompt.prompt;
const prompt = this.$refs[promptName];
// Esc!
if (event.keyCode === 27) {
if (event.code === "Escape") {
event.stopImmediatePropagation();
this.$store.commit("closeHovers");
}
// Enter
if (event.keyCode == 13) {
switch (this.currentPrompt.prompt) {
if (event.code === "Enter") {
switch (promptName) {
case "delete":
prompt.submit();
break;

View File

@@ -88,6 +88,7 @@ export default {
newLink =
url.removeLastDir(oldLink) + "/" + encodeURIComponent(this.name);
window.sessionStorage.setItem("modified", "true");
try {
await api.move([{ from: oldLink, to: newLink }]);
if (!this.isListing) {

View File

@@ -128,7 +128,7 @@
<script>
import { mapState, mapGetters } from "vuex";
import { share as api, pub as pub_api } from "@/api";
import moment from "moment";
import moment from "moment/min/moment-with-locales";
import Clipboard from "clipboard";
export default {

View File

@@ -220,6 +220,10 @@ body.rtl .card .card-title>*:first-child {
text-align: right;
}
body.rtl .card .card-action {
text-align: left;
}
.card .card-content.full {
padding-bottom: 0;
overflow: auto;

View File

@@ -2,10 +2,6 @@
nav {
width: 10em
}
/* Mobile Only fix div hidden by bottom navigation bar of mobile browser when using height: 100vh */
#previewer .preview {
height: calc(100% - 4em) !important;
}
}
@media (max-width: 1024px) {

View File

@@ -152,8 +152,7 @@ main .spinner .bounce2 {
/* PREVIEWER */
#previewer {
background-color: rgba(0, 0, 0, 0.9);
padding-top: 4em;
background-color: rgba(0, 0, 0, 0.99);
position: fixed;
top: 0;
left: 0;
@@ -166,15 +165,25 @@ main .spinner .bounce2 {
#previewer header {
background: none;
color: #fff;
border-bottom: 0px;
box-shadow: 0px 0px 0px;
z-index: 19999;
}
#previewer header > .action i {
color: #fff;
text-shadow: 1px 1px 1px #000000;
}
#previewer header > title {
white-space: nowrap;
text-shadow: 1px 1px 1px #000000;
}
@media (min-width: 738px) {
#previewer header #dropdown .action i {
color: #fff;
text-shadow: 1px 1px 1px #000000;
}
}
@@ -188,7 +197,7 @@ main .spinner .bounce2 {
#previewer .preview {
text-align: center;
height: calc(100vh - 4em);
height: 100%;
}
#previewer .preview pre {
@@ -203,6 +212,12 @@ main .spinner .bounce2 {
margin: 0;
}
#previewer .preview audio {
width: 95%;
height: 88%;
}
#previewer .preview video {
height: 100%;
}
@@ -247,7 +262,7 @@ main .spinner .bounce2 {
#previewer > button {
margin: 0;
position: fixed;
top: calc(50% + 1.85em);
top: 50%;
transform: translateY(-50%);
background-color: rgba(80, 80, 80, 0.5);
color: white;

View File

@@ -38,7 +38,8 @@
"update": "Update",
"upload": "Upload",
"openFile": "Open file",
"continue": "Continue"
"continue": "Continue",
"discardChanges": "Discard"
},
"download": {
"downloadFile": "Download File",
@@ -162,7 +163,8 @@
"uploadFiles": "Uploading {files} files...",
"uploadMessage": "Select an option to upload.",
"optionalPassword": "Optional password",
"resolution": "Resolution"
"resolution": "Resolution",
"discardEditorChanges": "Are you sure you wish to discard the changes you've made?"
},
"search": {
"images": "Images",

View File

@@ -5,8 +5,9 @@
"copy": "העתקה",
"copyFile": "העתק קובץ",
"copyToClipboard": "העתק ללוח",
"create": "יצירה",
"delete": "מחיקה",
"copyDownloadLinkToClipboard": "העתק קישור הורדה ללוח",
"create": "צור",
"delete": "מחק",
"download": "הורדה",
"file": "קובץ",
"folder": "תיקייה",
@@ -18,7 +19,7 @@
"new": "חדש",
"next": "הבא",
"ok": "אישור",
"permalink": "צור קישור קבוע",
"permalink": "יצירת קישור קבוע",
"previous": "הקודם",
"publish": "פרסום",
"rename": "שינוי שם",
@@ -36,13 +37,18 @@
"toggleSidebar": "פתיחת/סגירת סרגל צד",
"update": "עדכון",
"upload": "העלאה",
"openFile": "פתח קובץ"
"openFile": "פתח קובץ",
"continue": "המשך",
"discardChanges": "זריקת השינויים"
},
"download": {
"downloadFile": "הורד קובץ",
"downloadFolder": "הורד תיקייה",
"downloadSelected": "הורד קבצים שנבחרו"
},
"upload": {
"abortUpload": "האם אתה בטוח שברצונך להפסיק את ההעלאה?"
},
"errors": {
"forbidden": "אין לך הרשאות גישה",
"internal": "משהו השתבש",
@@ -66,7 +72,7 @@
"sortByLastModified": "מיין לפי השינוי האחרון",
"sortByName": "מיין לפי שם",
"sortBySize": "מיין לפי גודל",
"noPreview": "תצוגה מקדימה לא זמינה לקובץ זה"
"noPreview": "לא זמינה תצוגה מקדימה לקובץ זה"
},
"help": {
"click": "בחר קובץ או תיקייה",
@@ -155,7 +161,8 @@
"upload": "העלאה",
"uploadFiles": "מעלה {files} קבצים...",
"uploadMessage": "בחר אפשרות העלאה.",
"optionalPassword": "סיסמא אופציונלית"
"optionalPassword": "סיסמא אופציונלית",
"discardEditorChanges": "האם אתה בטוח שברצונך לבטל את השינויים שביצעת?"
},
"search": {
"images": "תמונות",
@@ -190,6 +197,7 @@
"customStylesheet": "עיצוב מותאם אישית (Stylesheet)",
"defaultUserDescription": "הגדרות ברירת המחדל למשתמשים חדשים",
"disableExternalLinks": "השבת קישורים חיצוניים (למעט תיעוד)",
"disableUsedDiskPercentage": "אל תציג גרף שימוש בדיסק",
"documentation": "תיעוד",
"examples": "דוגמאות",
"executeOnShell": "בצע במסוף",
@@ -218,7 +226,7 @@
"share": "שיתוף קבצים"
},
"permissions": "הרשאות",
"permissionsHelp": "אתה יכול להגדיר את המשתמש להיות מנהל מערכת או לבחור את ההרשאות בנפרד. אם תבחר \"מנהל מערכת\", כל ההרשאות ייבחרו אוטומטית. ניהול המשתמשים נשאר הרשאה של מנהל מערכת.\n",
"permissionsHelp": "אתה יכול להגדיר את המשתמש להיות מנהל מערכת או לבחור את ההרשאות בנפרד. אם תבחר \"מנהל מערכת\", כל ההרשאות יינתנו אוטומטית. ניהול המשתמשים נשאר הרשאה של מנהל מערכת.\n",
"profileSettings": "הגדרות פרופיל",
"ruleExample1": "מנע גישה לקבצים נסתרים (כל קובץ/תיקייה שמתחיל בנקודה, לדוגמא .git)",
"ruleExample2": "חסימת גישה לקובץ בשם Caddyfile בהיקף הראשי.",

View File

@@ -3,76 +3,87 @@
"cancel": "キャンセル",
"close": "閉じる",
"copy": "コピー",
"copyFile": "ファイルコピー",
"copyToClipboard": "クリップボードにコピー",
"copyFile": "ファイルコピー",
"copyToClipboard": "共有リンクをコピー",
"copyDownloadLinkToClipboard": "ダウンロードリンクをコピー",
"create": "作成",
"delete": "削除",
"download": "ダウンロード",
"hideDotfiles": "",
"file": "ファイル",
"folder": "フォルダー",
"hideDotfiles": "ドットで始まるファイルを表示しない",
"info": "情報",
"more": "More",
"more": "さらに",
"move": "移動",
"moveFile": "ファイル移動",
"moveFile": "ファイル移動",
"new": "新規",
"next": "次",
"next": "次",
"ok": "OK",
"permalink": "固定リンク",
"previous": "前",
"publish": "発表",
"rename": "名前変更",
"replace": "置き換える",
"permalink": "パーマリンクを取得",
"previous": "前",
"publish": "公開",
"rename": "名前変更",
"replace": "置換する",
"reportIssue": "問題を報告",
"save": "保存",
"schedule": "スケジュール",
"search": "検索",
"select": "選択",
"selectMultiple": "複数選択",
"share": "シェア",
"shell": "Toggle shell",
"switchView": "表示を切り替わる",
"toggleSidebar": "サイドバーを表示する",
"share": "共有",
"shell": "シェルの切り替え",
"submit": "送信",
"switchView": "表示の切り替え",
"toggleSidebar": "サイドバーの切り替え",
"update": "更新",
"upload": "アップロード"
"upload": "アップロード",
"openFile": "ファイルを開く",
"continue": "続行"
},
"download": {
"downloadFile": "Download File",
"downloadFolder": "Download Folder",
"downloadSelected": ""
"downloadFile": "ファイルのダウンロード",
"downloadFolder": "フォルダーのダウンロード",
"downloadSelected": "選択した項目のダウンロード"
},
"upload": {
"abortUpload": "アップロードをキャンセルしますか?"
},
"errors": {
"forbidden": "You don't have permissions to access this.",
"forbidden": "これにアクセスする権限がありません。",
"internal": "内部エラーが発生しました。",
"notFound": "リソースが見つからなりませんでした。"
"notFound": "リソースが見つかりませんでした。",
"connection": "サーバーに接続できませんでした。"
},
"files": {
"body": "本文",
"clear": "クリアー",
"clear": "消去",
"closePreview": "プレビューを閉じる",
"files": "ファイル",
"folders": "フォルダ",
"folders": "フォルダ",
"home": "ホーム",
"lastModified": "最終変更",
"loading": "ローディング...",
"lonely": "ここには何もない...",
"lastModified": "更新日時",
"loading": "読み込み中…",
"lonely": "ここには何もないようです…",
"metadata": "メタデータ",
"multipleSelectionEnabled": "複数選択有効",
"multipleSelectionEnabled": "複数選択有効になっています",
"name": "名前",
"size": "サイズ",
"sortByLastModified": "最終変更日付によるソート",
"sortByName": "名前によるソート",
"sortBySize": "サイズによるソート"
"sortByLastModified": "更新日時で並べ替え",
"sortByName": "名前で並べ替え",
"sortBySize": "サイズで並べ替え",
"noPreview": "プレビューはこのファイルでは利用できません"
},
"help": {
"click": "ファイルやディレクトリを選択",
"click": "ファイルやフォルダーを選択",
"ctrl": {
"click": "複数のファイルやディレクトリを選択",
"f": "検索を有効にする",
"s": "ファイルを保存またはカレントディレクトリをダウンロード"
"click": "複数のファイルやフォルダーを選択",
"f": "検索画面を開く",
"s": "現在のフォルダーにあるファイルを保存またはダウンロード"
},
"del": "選択した項目を削除",
"doubleClick": "ファイルやディレクトリをオープン",
"esc": "選択をクリアーまたはプロンプトを閉じる",
"f1": "このヘルプを表示",
"doubleClick": "ファイルやフォルダーを開く",
"esc": "選択を解除/ダイアログを閉じる",
"f1": "ヘルプを表示",
"f2": "ファイルの名前を変更",
"help": "ヘルプ"
},
@@ -81,180 +92,193 @@
"hu": "Magyar",
"ar": "العربية",
"de": "Deutsch",
"el": "Ελληνικά",
"en": "English",
"es": "Español",
"fr": "Français",
"is": "",
"is": "Icelandic",
"it": "Italiano",
"ja": "日本語",
"ko": "한국어",
"nlBE": "",
"nlBE": "Dutch (Belgium)",
"pl": "Polski",
"pt": "Português",
"ptBR": "Português (Brasil)",
"ro": "",
"ro": "Romanian",
"ru": "Русский",
"sk": "Slovenčina",
"svSE": "",
"tr" : "Türkçe",
"svSE": "Swedish (Sweden)",
"tr": "Türkçe",
"ua": "Українська",
"zhCN": "中文 (简体)",
"zhTW": "中文 (繁體)"
},
"login": {
"createAnAccount": "Create an account",
"loginInstead": "Already have an account",
"createAnAccount": "アカウントを作成",
"loginInstead": "ログインする",
"password": "パスワード",
"passwordConfirm": "Password Confirmation",
"passwordsDontMatch": "Passwords don't match",
"signup": "Signup",
"passwordConfirm": "パスワード(確認用)",
"passwordsDontMatch": "パスワードが一致しません",
"signup": "アカウント作成",
"submit": "ログイン",
"username": "ユーザ名",
"usernameTaken": "Username already taken",
"wrongCredentials": "ユーザ名またはパスワードが間違っています"
"username": "ユーザ名",
"usernameTaken": "ユーザー名はすでに取得されています",
"wrongCredentials": "ユーザ名またはパスワードが間違っています"
},
"permanent": "永久",
"prompts": {
"copy": "コピー",
"copyMessage": "コピーの目標ディレクトリを選択してください:",
"copyMessage": "ファイルをコピーする場所を選択してください:",
"currentlyNavigating": "現在閲覧しているディレクトリ:",
"deleteMessageMultiple": "{count} のファイルを本当に削除してよろしいですか",
"deleteMessageSingle": "このファイル/フォルダを本当に削除してよろしいですか",
"deleteTitle": "ファイルを削除",
"displayName": "名前:",
"download": "ファイルをダウンロード",
"downloadMessage": "圧縮形式を選択してください。",
"error": "あるエラーが発生しました。",
"deleteMessageMultiple": "{count} のファイルを削除してよろしいですか",
"deleteMessageSingle": "このファイルフォルダを削除してよろしいですか",
"deleteMessageShare": "共有中のファイル({path})を削除してもよろしいですか?",
"deleteTitle": "ファイルの削除",
"displayName": "表示名:",
"download": "ファイルのダウンロード",
"downloadMessage": "ダウンロードする際の圧縮形式を選んでください:",
"error": "エラーが発生しました",
"fileInfo": "ファイル情報",
"filesSelected": "{count} のファイルは選択されました。",
"lastModified": "最終変更",
"filesSelected": "{count} のファイル/フォルダーが選択されています",
"lastModified": "更新日時",
"move": "移動",
"moveMessage": "移動の目標ディレクトリを選択してください:",
"newArchetype": "ある元型に基づいて新しいポストを作成します。ファイルは コンテンツフォルダに作成されます。",
"newDir": "新しいディレクトリを作成",
"newDirMessage": "新しいディレクトリの名前を入力してください",
"newFile": "新しいファイルを作成",
"newFileMessage": "新しいファイルの名前を入力してください",
"numberDirs": "ディレクトリ数",
"numberFiles": "ファイル数",
"rename": "名前変更",
"renameMessage": "名前を変更しようファイルは:",
"replace": "置き換え",
"replaceMessage": "アップロードするファイルの中でかち合う名前が一つあります。 既存のファイルを置き換えりませんか。\n",
"moveMessage": "ファイル/フォルダーの新しいハウスを選択してください:",
"newArchetype": "archetype に基づいて新しい投稿を作成します。ファイルは content フォルダに作成されます。",
"newDir": "新規フォルダー",
"newDirMessage": "フォルダーの名前を入力してください",
"newFile": "新ファイル",
"newFileMessage": "ファイルの名前を入力してください",
"numberDirs": "ディレクトリ数",
"numberFiles": "ファイル数",
"rename": "名前変更",
"renameMessage": "変更後のファイルの名前を入力してください",
"replace": "ファイルの置き換え",
"replaceMessage": "アップロードしようとしているファイルと既存のファイルの名前が重複しています。既存のものを置き換えずにアップロードを続けるか、既存のものを置き換えますか?\n",
"schedule": "スケジュール",
"scheduleMessage": "このポストの発表日付をスケジュールしてください。",
"scheduleMessage": "この投稿の公開予定日時を選んでください。",
"show": "表示",
"size": "サイズ",
"upload": "",
"uploadMessage": ""
"upload": "アップロード",
"uploadFiles": "{files} 個のファイルをアップロードしています…",
"uploadMessage": "アップロードするオプションを選択してください。",
"optionalPassword": "パスワード(オプション)"
},
"search": {
"images": "画像",
"music": "音楽",
"pdf": "PDF",
"pressToSearch": "Press enter to search...",
"search": "検索...",
"typeToSearch": "Type to search...",
"types": "種類",
"video": "ビデオ"
"pressToSearch": "エンターを押して検索します",
"search": "検索",
"typeToSearch": "検索の種類",
"types": "ファイルの種類",
"video": "動画"
},
"settings": {
"admin": "管理者",
"administrator": "管理者",
"allowCommands": "コマンドの実行",
"allowEdit": "ファイルやディレクトリの編集、名前変更削除",
"allowNew": "ファイルとディレクトリの作成",
"allowPublish": "ポストとぺーじの発表",
"allowSignup": "Allow users to signup",
"avoidChanges": "(変更を避けるために空白にしてください)",
"branding": "Branding",
"brandingDirectoryPath": "Branding directory path",
"brandingHelp": "You can customize how your File Browser instance looks and feels by changing its name, replacing the logo, adding custom styles and even disable external links to GitHub.\nFor more information about custom branding, please check out the {0}.",
"changePassword": "パスワード変更",
"commandRunner": "Command runner",
"commandRunnerHelp": "Here you can set commands that are executed in the named events. You must write one per line. The environment variables {0} and {1} will be available, being {0} relative to {1}. For more information about this feature and the available environment variables, please read the {2}.",
"commandsUpdated": "コマンド更新されました!",
"createUserDir": "Auto create user home dir while adding new user",
"customStylesheet": "カスタムスタイルシ ート",
"defaultUserDescription": "This are the default settings for new users.",
"disableExternalLinks": "Disable external links (except documentation)",
"disableUsedDiskPercentage": "Disable used disk percentage graph",
"documentation": "documentation",
"allowEdit": "ファイルやフォルダーの編集、名前変更削除",
"allowNew": "ファイルやフォルダーの新規作成",
"allowPublish": "新しい投稿やページの公開",
"allowSignup": "ユーザーの新規登録を許可",
"avoidChanges": "変更しない場合は空白のままにしてください",
"branding": "ブランディング",
"brandingDirectoryPath": "ブランディングのディレクトリへのパス",
"brandingHelp": "インスタンスの名前の変更、ロゴの変更、カスタムスタイルの追加、GitHub への外部リンクの無効化など、File Browser の見た目や使い勝手をカスタマイズすることができます。\nカスタムブランディングの詳細については、{0}をご覧ください。",
"changePassword": "パスワード変更",
"commandRunner": "コマンドランナー",
"commandRunnerHelp": "ここでは、指定したイベントの際に実行されるコマンドを設定することができます。1行に1つずつ書く必要があります。環境変数として {0} {1} が使用可能で、{0} は {1} に関連した変数として扱われます。この機能と使用可能な環境変数の詳細については、{2}をお読みください。",
"commandsUpdated": "コマンド更新ました!",
"createUserDir": "新規ユーザー追加時にユーザーのホームディレクトリを自動生成する",
"tusUploads": "チャンクされたファイルアップロード",
"tusUploadsHelp": "File Browser はチャンクされたファイルアップロードをサポートしており、信頼性の低いネットワーク上でも、効率的で信頼性の高い、再開可能なチャンクされたファイルアップロードを作成することができます。",
"tusUploadsChunkSize": "1チャンクあたりのリクエストの最大サイズ。バイト数を示す整数か、10MB、1GBなどの文字列を入力できます。",
"tusUploadsRetryCount": "チャンクのアップロードに失敗した場合の再試行回数。",
"userHomeBasePath": "ユーザーのホームディレクトリのベースパス",
"userScopeGenerationPlaceholder": "スコープは自動生成されます",
"createUserHomeDirectory": "ユーザーのホームディレクトリを作成する",
"customStylesheet": "カスタムスタイルシート",
"defaultUserDescription": "これらは新規ユーザーのデフォルト設定です。",
"disableExternalLinks": "外部リンクを無効にする(ドキュメントへのリンクを除く)",
"disableUsedDiskPercentage": "ディスク使用率のグラフを無効にする",
"documentation": "ドキュメント",
"examples": "例",
"executeOnShell": "Execute on shell",
"executeOnShellDescription": "By default, File Browser executes the commands by calling their binaries directly. If you want to run them on a shell instead (such as Bash or PowerShell), you can define it here with the required arguments and flags. If set, the command you execute will be appended as an argument. This apply to both user commands and event hooks.",
"globalRules": "This is a global set of allow and disallow rules. They apply to every user. You can define specific rules on each user's settings to override this ones.",
"executeOnShell": "シェルで実行する",
"executeOnShellDescription": "デフォルトでは、File Browser はバイナリを直接呼び出してコマンドを実行します。代わりにシェル(Bash PowerShell など)で実行したい場合は、必要な引数やフラグをここで指定します。値が指定されている場合、実行するコマンドが引数として追加されます。これは、ユーザーコマンドとイベントフックの両方に適用されます。",
"globalRules": "これはグローバルな許可と不許可のルールセットです。これはすべてのユーザーに適用されます。ユーザーごとに特定のルールを設定することで、これらのルールを上書きすることができます。",
"globalSettings": "グローバル設定",
"hideDotfiles": "",
"insertPath": "Insert the path",
"insertRegex": "Insert regex expression",
"instanceName": "Instance name",
"hideDotfiles": "ドットで始まるファイルを表示しない",
"insertPath": "パスを入力してください",
"insertRegex": "正規表現を入力してください",
"instanceName": "インスタンス名",
"language": "言語",
"lockPassword": "新しいパスワードを変更に禁止",
"lockPassword": "ユーザーがパスワードを変更できないようにする",
"newPassword": "新しいパスワード",
"newPasswordConfirm": "新しいパスワードを確認します",
"newUser": "新しいユーザー",
"newPasswordConfirm": "新しいパスワード(再入力)",
"newUser": "新ユーザー作成",
"password": "パスワード",
"passwordUpdated": "パスワード更新されました!",
"path": "",
"passwordUpdated": "パスワード更新ました!",
"path": "パス",
"perm": {
"create": "Create files and directories",
"delete": "Delete files and directories",
"download": "Download",
"execute": "Execute commands",
"modify": "Edit files",
"rename": "Rename or move files and directories",
"share": "Share files"
"create": "ファイルやフォルダーの作成",
"delete": "ファイルやフォルダーの削除",
"download": "ダウンロード",
"execute": "コマンドの実行",
"modify": "ファイルの編集",
"rename": "ファイルやフォルダーの編集・移動",
"share": "ファイルの共有"
},
"permissions": "権限",
"permissionsHelp": "あなたはユーザーを管理者に設定し、または権限を個々に設定しできます。\"管理者\"を選択する場合、その他のすべての選択肢は自動的に設定されます。ユーザー管理は管理者権限として保留されました。",
"profileSettings": "プロファイル設定",
"ruleExample1": "各フォルダに名前はドットで始まるファイル(例えば、.git.gitignoreへのアクセスを制限します。",
"ruleExample2": "範囲のルートパスに名前は Caddyfile のファイルへのアクセスを制限します。",
"rules": "規則",
"rulesHelp": "ここに、あなたはこのユーザーの許可または拒否規則を設定できます。ブロックされたファイルはリストに表示されません、それではアクセスも制限されます。正規表現(regex)のサポートと範囲に相対パスが提供されています。",
"scope": "範囲",
"settingsUpdated": "設定は更新されました!",
"shareDuration": "",
"shareManagement": "",
"singleClick": "",
"permissionsHelp": "ユーザーを管理者に設定するか、その他の権限を個別に選択することができます。管理者を選択すると、他のオプションはすべて自動的にチェックされます。ユーザー管理するには管理者権限が必要です。\n",
"profileSettings": "プロフィール設定",
"ruleExample1": ".git.gitignore のようなドットから始まるファイルへのアクセスを禁止します。\n",
"ruleExample2": "スコープのルートにある Caddyfile という名前のファイルへのアクセスを禁止します。",
"rules": "ルール",
"rulesHelp": "ここでは、特定のユーザーに対して許可と不許可のルールを設定することができます。ブロックされたファイルはリストに表示されず、ユーザはアクセスできなくなります。正規表現とユーザースコープからの相対パスをサポートしています。\n",
"scope": "スコープ",
"setDateFormat": "正確な日時表記を使用する",
"settingsUpdated": "設定を更新しました!",
"shareDuration": "共有期間",
"shareManagement": "共有の管理",
"shareDeleted": "ファイルの共有を削除しました!",
"singleClick": "ダブルクリックの代わりにクリックでファイルやフォルダーを開く",
"themes": {
"dark": "",
"light": "",
"title": ""
"dark": "ダーク",
"light": "ライト",
"title": "テーマ"
},
"user": "ユーザー",
"userCommands": "ユーザーのコマンド",
"userCommandsHelp": "空白区切りの有効のコマンドのリストを指定してください。例:",
"userCreated": "ユーザー作成されました!",
"userDefaults": "User default settings",
"userDeleted": "ユーザー削除されました!",
"userCommands": "コマンド",
"userCommandsHelp": "このユーザーが使用可能なコマンドをスペースで区切ったリスト。例:\n",
"userCreated": "ユーザー作成ました!",
"userDefaults": "ユーザーのデフォルト設定",
"userDeleted": "ユーザー削除ました!",
"userManagement": "ユーザー管理",
"userUpdated": "ユーザー更新されました!",
"userUpdated": "ユーザー更新ました!",
"username": "ユーザー名",
"users": "ユーザー"
},
"sidebar": {
"help": "ヘルプ",
"hugoNew": "Hugo New",
"login": "Login",
"login": "ログイン",
"logout": "ログアウト",
"myFiles": "私のファイル",
"newFile": "新しいファイルを作成",
"newFolder": "新しいフォルダを作成",
"myFiles": "マイファイル",
"newFile": "新ファイル",
"newFolder": "新フォルダ",
"preview": "プレビュー",
"settings": "設定",
"signup": "Signup",
"signup": "サインアップ",
"siteSettings": "サイト設定"
},
"success": {
"linkCopied": "リンクコピーされました!"
"linkCopied": "リンクコピーました!"
},
"time": {
"days": "日",
"hours": "時間",
"minutes": "分",
"seconds": "秒",
"unit": "時間単位"
"unit": "時間単位"
}
}

View File

@@ -1,5 +1,5 @@
import * as i18n from "@/i18n";
import moment from "moment";
import moment from "moment/min/moment-with-locales";
const mutations = {
closeHovers: (state) => {

View File

@@ -3,10 +3,10 @@
<header-bar v-if="error || req.type == null" showMenu showLogo />
<breadcrumbs base="/files" />
<listing />
<errors v-if="error" :errorCode="error.status" />
<component v-else-if="currentView" :is="currentView"></component>
<div v-else>
<div v-else-if="currentView !== null">
<h2 class="message delayed">
<div class="spinner">
<div class="bounce1"></div>
@@ -52,12 +52,8 @@ export default {
computed: {
...mapState(["req", "reload", "loading"]),
currentView() {
if (this.req.type == undefined) {
if (this.req.type == undefined || this.req.isDir) {
return null;
}
if (this.req.isDir) {
return "listing";
} else if (
this.req.type === "text" ||
this.req.type === "textImmutable"
@@ -72,7 +68,26 @@ export default {
this.fetchData();
},
watch: {
$route: "fetchData",
$route: function (to, from) {
if (from.path.endsWith("/")) {
if (to.path.endsWith("/")) {
window.sessionStorage.setItem("listFrozen", "false");
this.fetchData();
return;
} else {
window.sessionStorage.setItem("listFrozen", "true");
this.fetchData();
return;
}
} else if (to.path.endsWith("/")) {
this.$store.commit("updateRequest", {});
this.fetchData();
return;
} else {
this.fetchData();
return;
}
},
reload: function (value) {
if (value === true) {
this.fetchData();
@@ -101,7 +116,9 @@ export default {
this.$store.commit("closeHovers");
// Set loading to true and reset the error.
this.setLoading(true);
if (window.sessionStorage.getItem("listFrozen") !=="true" && window.sessionStorage.getItem("modified") !=="true"){
this.setLoading(true);
}
this.error = null;
let url = this.$route.path;

View File

@@ -29,7 +29,7 @@
<breadcrumbs :base="'/share/' + hash" />
<div v-if="loading">
<h2 class="message delayed">
<h2 class="message delayed" style="padding-top: 3em !important;">
<div class="spinner">
<div class="bounce1"></div>
<div class="bounce2"></div>
@@ -73,28 +73,34 @@
</div>
<div v-else>
<div class="share">
<div class="share__box share__box__info">
<div class="share__box__header">
<div class="share__box share__box__info"
style="
position: -webkit-sticky;
position: sticky;
top:-20.6em;
z-index:999;"
>
<div class="share__box__header" style="height:3em">
{{
req.isDir
? $t("download.downloadFolder")
: $t("download.downloadFile")
}}
</div>
<div class="share__box__element share__box__center share__box__icon">
<div v-if="!this.req.isDir" class="share__box__element share__box__center share__box__icon">
<i class="material-icons">{{ icon }}</i>
</div>
<div class="share__box__element">
<div class="share__box__element" style="height:3em">
<strong>{{ $t("prompts.displayName") }}</strong> {{ req.name }}
</div>
<div class="share__box__element" :title="modTime">
<div v-if="!this.req.isDir" class="share__box__element" :title="modTime">
<strong>{{ $t("prompts.lastModified") }}:</strong> {{ humanTime }}
</div>
<div class="share__box__element">
<div class="share__box__element" style="height:3em">
<strong>{{ $t("prompts.size") }}:</strong> {{ humanSize }}
</div>
<div class="share__box__element share__box__center">
<a target="_blank" :href="link" class="button button--flat">
<a target="_blank" :href="link" class="button button--flat" style="height:4em">
<div>
<i class="material-icons">file_download</i
>{{ $t("buttons.download") }}
@@ -111,12 +117,73 @@
>{{ $t("buttons.openFile") }}
</div>
</a>
<qrcode-vue v-if="this.req.isDir" :value="fullLink" size="100" level="M"></qrcode-vue>
</div>
<div class="share__box__element share__box__center">
<div v-if="!this.req.isDir" class="share__box__element share__box__center">
<qrcode-vue :value="link" size="200" level="M"></qrcode-vue>
</div>
<div v-if="this.req.isDir" class="share__box__element share__box__header" style="height:3em">
{{ $t("sidebar.preview") }}
</div>
<div
v-if="this.req.isDir"
class="share__box__element share__box__center share__box__icon"
style="padding:0em !important;height:12em !important;"
>
<a
target="_blank"
:href="raw"
class="button button--flat"
v-if= "!this.$store.state.multiple &&
selectedCount === 1 &&
req.items[this.selected[0]].type === 'image'"
style="height: 12em; padding:0; margin:0;"
>
<img
style="height: 12em;"
:src="raw"
>
</a>
<div
v-else-if= "
!this.$store.state.multiple &&
selectedCount === 1 &&
req.items[this.selected[0]].type === 'audio'"
style="height: 12em; paddingTop:1em; margin:0;"
>
<button @click="play" v-if="!this.tag" style="fontSize:6em !important; border:0px;outline:none; background: white;" class="material-icons">play_circle_filled</button>
<button @click="play" v-if="this.tag" style="fontSize:6em !important; border:0px;outline:none; background: white;" class="material-icons">pause_circle_filled</button>
<audio id="myaudio"
:src="raw"
controls="controls"
:autoplay="tag"
>
</audio>
</div>
<video
v-else-if= "
!this.$store.state.multiple &&
selectedCount === 1 &&
req.items[this.selected[0]].type === 'video'"
style="height: 12em; padding:0; margin:0;"
:src="raw"
controls="controls"
>
Sorry, your browser doesn't support embedded videos, but don't worry,
you can <a :href="raw">download it</a>
and watch it with your favorite video player!
</video>
<i
v-else-if= "
!this.$store.state.multiple &&
selectedCount === 1 &&
req.items[this.selected[0]].isDir"
class="material-icons">folder
</i>
<i v-else class="material-icons">call_to_action</i>
</div>
</div>
<div
<div id="shareList"
v-if="req.isDir && req.items.length > 0"
class="share__box share__box__items"
>
@@ -183,7 +250,7 @@
import { mapState, mapMutations, mapGetters } from "vuex";
import { pub as api } from "@/api";
import { filesize } from "@/utils";
import moment from "moment";
import moment from "moment/min/moment-with-locales";
import HeaderBar from "@/components/header/HeaderBar.vue";
import Action from "@/components/header/Action.vue";
@@ -211,6 +278,7 @@ export default {
hash: null,
token: null,
clip: null,
tag: false,
}),
watch: {
$route: function () {
@@ -248,6 +316,9 @@ export default {
link: function () {
return api.getDownloadURL(this.req);
},
raw: function () {
return this.req.items[this.selected[0]].url.replace(/share/, 'api/public/dl')+'?token='+this.token;
},
inlineLink: function () {
return api.getDownloadURL(this.req, true);
},
@@ -270,6 +341,16 @@ export default {
base64: function (name) {
return window.btoa(unescape(encodeURIComponent(name)));
},
play() {
var audio = document.getElementById('myaudio');
if(this.tag){
audio.pause();
this.tag = false;
} else {
audio.play();
this.tag = true;
}
},
fetchData: async function () {
// Reset view information.
this.$store.commit("setReload", false);
@@ -358,3 +439,17 @@ export default {
},
};
</script>
<style scoped>
#listing.list{
height: auto;
}
#shareList{
overflow-y: scroll;
}
@media (min-width: 930px) {
#shareList{
height: calc(100vh - 9.8em);
overflow-y: auto;
}
}
</style>

View File

@@ -1,5 +1,9 @@
<template>
<div id="editor-container">
<div
id="editor-container"
@touchmove.prevent.stop
@wheel.prevent.stop
>
<header-bar>
<action icon="close" :label="$t('buttons.close')" @action="close()" />
<title>{{ req.name }}</title>
@@ -103,13 +107,15 @@ export default {
if (theme == "dark") {
this.editor.setTheme("ace/theme/twilight");
}
this.editor.focus();
},
methods: {
back() {
let uri = url.removeLastDir(this.$route.path) + "/";
this.$router.push({ path: uri });
},
keyEvent(event) {
if (event.code === "Escape") {
this.close();
}
if (!event.ctrlKey && !event.metaKey) {
return;
}
@@ -127,6 +133,7 @@ export default {
try {
await api.put(this.$route.path, this.editor.getValue());
this.editor.session.getUndoManager().markClean();
buttons.success(button);
} catch (e) {
buttons.done(button);
@@ -134,6 +141,11 @@ export default {
}
},
close() {
if (!this.editor.session.getUndoManager().isClean()) {
this.$store.commit("showHover", "discardEditorChanges");
return;
}
this.$store.commit("updateRequest", {});
let uri = url.removeLastDir(this.$route.path) + "/";

View File

@@ -383,17 +383,23 @@ export default {
},
watch: {
req: function () {
// Reset the show value
this.showLimit = 50;
if (window.sessionStorage.getItem("listFrozen") !=="true" && window.sessionStorage.getItem("modified") !=="true"){
// Reset the show value
this.showLimit = 50;
// Ensures that the listing is displayed
Vue.nextTick(() => {
// How much every listing item affects the window height
this.setItemWeight();
// Ensures that the listing is displayed
Vue.nextTick(() => {
// How much every listing item affects the window height
this.setItemWeight();
// Fill and fit the window with listing items
this.fillWindow(true);
});
// Fill and fit the window with listing items
this.fillWindow(true);
});
}
if (this.req.isDir) {
window.sessionStorage.setItem("listFrozen", "false");
window.sessionStorage.setItem("modified", "false");
}
},
},
mounted: function () {

View File

@@ -1,10 +1,12 @@
<template>
<div
id="previewer"
@touchmove.prevent.stop
@wheel.prevent.stop
@mousemove="toggleNavigation"
@touchstart="toggleNavigation"
>
<header-bar>
<header-bar v-if="showNav">
<action icon="close" :label="$t('buttons.close')" @action="close()" />
<title>{{ name }}</title>
<action

View File

@@ -63,7 +63,7 @@
<script>
import { share as api, users } from "@/api";
import { mapState, mapMutations } from "vuex";
import moment from "moment";
import moment from "moment/min/moment-with-locales";
import Clipboard from "clipboard";
import Errors from "@/views/Errors.vue";

2
go.mod
View File

@@ -61,7 +61,7 @@ require (
github.com/yusufpapurcu/wmi v1.2.2 // indirect
golang.org/x/net v0.17.0 // indirect
golang.org/x/sys v0.15.0 // indirect
google.golang.org/protobuf v1.31.0 // indirect
google.golang.org/protobuf v1.33.0 // indirect
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect
gopkg.in/ini.v1 v1.67.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect

4
go.sum
View File

@@ -595,8 +595,8 @@ google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGj
google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8=
google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI=
google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=

View File

@@ -1,3 +1,5 @@
#!/bin/sh
PORT=${FB_PORT:-$(jq .port /.filebrowser.json)}
curl -f http://localhost:$PORT/health || exit 1
ADDRESS=${FB_ADDRESS:-$(jq .address /.filebrowser.json)}
ADDRESS=${ADDRESS:-localhost}
curl -f http://$ADDRESS:$PORT/health || exit 1

View File

@@ -98,7 +98,7 @@ func resourcePostHandler(fileCache FileCache) handleFunc {
// Directories creation on POST.
if strings.HasSuffix(r.URL.Path, "/") {
err := d.user.Fs.MkdirAll(r.URL.Path, 0775) //nolint:gomnd
err := d.user.Fs.MkdirAll(r.URL.Path, files.PermDir)
return errToStatus(err), err
}
@@ -256,12 +256,12 @@ func addVersionSuffix(source string, fs afero.Fs) string {
func writeFile(fs afero.Fs, dst string, in io.Reader) (os.FileInfo, error) {
dir, _ := path.Split(dst)
err := fs.MkdirAll(dir, 0775) //nolint:gomnd
err := fs.MkdirAll(dir, files.PermDir)
if err != nil {
return nil, err
}
file, err := fs.OpenFile(dst, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0775) //nolint:gomnd
file, err := fs.OpenFile(dst, os.O_RDWR|os.O_CREATE|os.O_TRUNC, files.PermFile)
if err != nil {
return nil, err
}

View File

@@ -173,7 +173,7 @@ require (
golang.org/x/sync v0.3.0 // indirect
golang.org/x/sys v0.10.0 // indirect
golang.org/x/text v0.9.0 // indirect
google.golang.org/protobuf v1.28.0 // indirect
google.golang.org/protobuf v1.33.0 // indirect
gopkg.in/ini.v1 v1.67.0 // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect

View File

@@ -934,8 +934,8 @@ google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGj
google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw=
google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI=
google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=