Merge branch 'master' into add-username-in-sidebar

pull/2821/head
Jonathan Bout 2024-01-30 19:32:56 +01:00 committed by GitHub
commit 1d2d7ce72b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
25 changed files with 315 additions and 192 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. 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 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 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 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. - [ ] AVOID breaking the continuous integration build.
**Further comments** **Further comments**

View File

@ -2,6 +2,29 @@
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. 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.27.0](https://github.com/filebrowser/filebrowser/compare/v2.26.0...v2.27.0) (2024-01-02)
### Features
* allow setting theme via cli ([#2881](https://github.com/filebrowser/filebrowser/issues/2881)) ([748af71](https://github.com/filebrowser/filebrowser/commit/748af7172ce96f0b66c394e88839bd57c194ffc7))
* display image resolutions in file details ([#2830](https://github.com/filebrowser/filebrowser/issues/2830)) ([a09dfa8](https://github.com/filebrowser/filebrowser/commit/a09dfa8d9f190243d811a841de44c4abb4403d87))
* make user session timeout configurable by flags ([#2845](https://github.com/filebrowser/filebrowser/issues/2845)) ([391a078](https://github.com/filebrowser/filebrowser/commit/391a078cd486e618c95a0c5850326076cbc025b6))
### Bug Fixes
* delete message when delete file from preview ([3264cea](https://github.com/filebrowser/filebrowser/commit/3264cea8307dca9ab5463dc81f2a10a817eb3d54))
* fix typo ([#2843](https://github.com/filebrowser/filebrowser/issues/2843)) ([4dbc802](https://github.com/filebrowser/filebrowser/commit/4dbc802972c930f5f42fc27507fac35c28c42afd))
* set correct port in docker healthcheck ([#2812](https://github.com/filebrowser/filebrowser/issues/2812)) ([d59ad59](https://github.com/filebrowser/filebrowser/commit/d59ad594b8649f57f61453b0dfbc350c57b690a2))
* typo in build error [#2903](https://github.com/filebrowser/filebrowser/issues/2903) ([#2904](https://github.com/filebrowser/filebrowser/issues/2904)) ([c4e955a](https://github.com/filebrowser/filebrowser/commit/c4e955acf4a1a8f8e8e94f697ffc838515e69a60))
### Build
* **deps-dev:** bump vite from 4.4.9 to 4.4.12 in /frontend ([#2862](https://github.com/filebrowser/filebrowser/issues/2862)) ([fc2ee37](https://github.com/filebrowser/filebrowser/commit/fc2ee373536584d024f7def62f350bdbb712d927))
* **deps:** bump golang.org/x/crypto from 0.14.0 to 0.17.0 ([#2890](https://github.com/filebrowser/filebrowser/issues/2890)) ([821fba4](https://github.com/filebrowser/filebrowser/commit/821fba41a25ba99d47641f01b10ac51960157888))
## [2.26.0](https://github.com/filebrowser/filebrowser/compare/v2.25.0...v2.26.0) (2023-11-02) ## [2.26.0](https://github.com/filebrowser/filebrowser/compare/v2.25.0...v2.26.0) (2023-11-02)

View File

@ -31,6 +31,7 @@ func addConfigFlags(flags *pflag.FlagSet) {
addServerFlags(flags) addServerFlags(flags)
addUserFlags(flags) addUserFlags(flags)
flags.BoolP("signup", "s", false, "allow users to signup") 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("shell", "", "shell command to which other commands should be appended")
flags.String("auth.method", string(auth.MethodJSONAuth), "authentication type") flags.String("auth.method", string(auth.MethodJSONAuth), "authentication type")

View File

@ -31,6 +31,7 @@ override the options.`,
s := &settings.Settings{ s := &settings.Settings{
Key: generateKey(), Key: generateKey(),
Signup: mustGetBool(flags, "signup"), Signup: mustGetBool(flags, "signup"),
CreateUserDir: mustGetBool(flags, "create-user-dir"),
Shell: convertCmdStrToCmdArray(mustGetString(flags, "shell")), Shell: convertCmdStrToCmdArray(mustGetString(flags, "shell")),
AuthMethod: authMethod, AuthMethod: authMethod,
Defaults: defaults, Defaults: defaults,

View File

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

View File

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

View File

@ -7,6 +7,8 @@ import (
"path/filepath" "path/filepath"
"github.com/spf13/afero" "github.com/spf13/afero"
"github.com/filebrowser/filebrowser/v2/files"
) )
// MoveFile moves file from src to dst. // 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 // Makes the directory needed to create the dst
// file. // file.
err = fs.MkdirAll(filepath.Dir(dest), 0666) //nolint:gomnd err = fs.MkdirAll(filepath.Dir(dest), files.PermDir)
if err != nil { if err != nil {
return err return err
} }
// Create the destination file. // 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 { if err != nil {
return err return err
} }

View File

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

View File

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

View File

@ -38,7 +38,7 @@
import { enableThumbs } from "@/utils/constants"; import { enableThumbs } from "@/utils/constants";
import { mapMutations, mapGetters, mapState } from "vuex"; import { mapMutations, mapGetters, mapState } from "vuex";
import { filesize } from "@/utils"; import { filesize } from "@/utils";
import moment from "moment"; import moment from "moment/min/moment-with-locales";
import { files as api } from "@/api"; import { files as api } from "@/api";
import * as upload from "@/utils/upload"; import * as upload from "@/utils/upload";
@ -191,7 +191,7 @@ export default {
action(overwrite, rename); action(overwrite, rename);
}, },
itemClick: function (event) { 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); else this.click(event);
}, },
click: function (event) { click: function (event) {

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> <script>
import { mapState, mapGetters } from "vuex"; import { mapState, mapGetters } from "vuex";
import { filesize } from "@/utils"; import { filesize } from "@/utils";
import moment from "moment"; import moment from "moment/min/moment-with-locales";
import { files as api } from "@/api"; import { files as api } from "@/api";
export default { export default {

View File

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

View File

@ -128,7 +128,7 @@
<script> <script>
import { mapState, mapGetters } from "vuex"; import { mapState, mapGetters } from "vuex";
import { share as api, pub as pub_api } from "@/api"; 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"; import Clipboard from "clipboard";
export default { export default {

View File

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

View File

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

View File

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

View File

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

View File

@ -37,7 +37,7 @@
"toggleSidebar": "切换侧边栏", "toggleSidebar": "切换侧边栏",
"update": "更新", "update": "更新",
"upload": "上传", "upload": "上传",
"openFile": "打开文件" "openFile": "打开文件",
"continue": "继续" "continue": "继续"
}, },
"download": { "download": {
@ -161,7 +161,7 @@
"upload": "上传", "upload": "上传",
"uploadFiles": "正在上传 {files} ...", "uploadFiles": "正在上传 {files} ...",
"uploadMessage": "选择上传选项。", "uploadMessage": "选择上传选项。",
"optionalPassword": "密码(选填,不填即无密码)" "optionalPassword": "密码(选填,不填即无密码)",
"resolution": "分辨率" "resolution": "分辨率"
}, },
"search": { "search": {

View File

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

View File

@ -183,7 +183,7 @@
import { mapState, mapMutations, mapGetters } from "vuex"; import { mapState, mapMutations, mapGetters } from "vuex";
import { pub as api } from "@/api"; import { pub as api } from "@/api";
import { filesize } from "@/utils"; import { filesize } from "@/utils";
import moment from "moment"; import moment from "moment/min/moment-with-locales";
import HeaderBar from "@/components/header/HeaderBar.vue"; import HeaderBar from "@/components/header/HeaderBar.vue";
import Action from "@/components/header/Action.vue"; import Action from "@/components/header/Action.vue";

View File

@ -103,13 +103,15 @@ export default {
if (theme == "dark") { if (theme == "dark") {
this.editor.setTheme("ace/theme/twilight"); this.editor.setTheme("ace/theme/twilight");
} }
this.editor.focus();
}, },
methods: { methods: {
back() {
let uri = url.removeLastDir(this.$route.path) + "/";
this.$router.push({ path: uri });
},
keyEvent(event) { keyEvent(event) {
if (event.code === "Escape") {
this.close();
}
if (!event.ctrlKey && !event.metaKey) { if (!event.ctrlKey && !event.metaKey) {
return; return;
} }
@ -134,6 +136,13 @@ export default {
} }
}, },
close() { close() {
const originalContent = this.req.content;
const currentContent = this.editor.getValue();
if (originalContent !== currentContent) {
this.$store.commit("showHover", "discardEditorChanges");
return;
}
this.$store.commit("updateRequest", {}); this.$store.commit("updateRequest", {});
let uri = url.removeLastDir(this.$route.path) + "/"; let uri = url.removeLastDir(this.$route.path) + "/";

View File

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

View File

@ -1,3 +1,5 @@
#!/bin/sh #!/bin/sh
PORT=${FB_PORT:-$(jq .port /.filebrowser.json)} 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. // Directories creation on POST.
if strings.HasSuffix(r.URL.Path, "/") { 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 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) { func writeFile(fs afero.Fs, dst string, in io.Reader) (os.FileInfo, error) {
dir, _ := path.Split(dst) dir, _ := path.Split(dst)
err := fs.MkdirAll(dir, 0775) //nolint:gomnd err := fs.MkdirAll(dir, files.PermDir)
if err != nil { if err != nil {
return nil, err 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 { if err != nil {
return nil, err return nil, err
} }