diff --git a/.drone.env b/.drone.env
index 1be9ba7a850..c9d23d52795 100644
--- a/.drone.env
+++ b/.drone.env
@@ -1,7 +1,7 @@
# The version of OCIS to use in pipelines that test against OCIS
-OCIS_COMMITID=b148faada6191a0c8a7ff800badec5bc1399c75f
+OCIS_COMMITID=d30670450a3f0e3901276ff88b5bc4560a4ce1cb
OCIS_BRANCH=master
# The test runner source for API tests
-CORE_COMMITID=f16a490116c1b513948a9f3bd8ec0c8146eab545
+CORE_COMMITID=298ebbbe0106cea6c8cb029b83fd359da2f450d1
CORE_BRANCH=master
diff --git a/.drone.star b/.drone.star
index 099cbc258f7..8775d7ca2e9 100644
--- a/.drone.star
+++ b/.drone.star
@@ -460,7 +460,7 @@ config = {
"RUN_ON_OCIS": "true",
"TESTING_DATA_DIR": "/srv/app/testing/data/",
"OCIS_REVA_DATA_ROOT": "/srv/app/tmp/ocis/owncloud/data/",
- "WEB_UI_CONFIG": "/srv/config/drone/ocis-config.json",
+ "WEB_UI_CONFIG": "/srv/config/drone/config-ocis.json",
"EXPECTED_FAILURES_FILE": "%s/tests/acceptance/expected-failures-with-ocis-server-ocis-storage.md" % dir["web"],
},
"runningOnOCIS": True,
@@ -727,10 +727,16 @@ def main(ctx):
return pipelines + deploys + checkStarlark()
def beforePipelines(ctx):
- return yarnlint() + changelog(ctx) + website(ctx) + cacheOcisPipeline(ctx)
+ if "unit-tests-only" in ctx.build.title.lower():
+ return yarnlint() + checkForRecentBuilds(ctx)
+ else:
+ return yarnlint() + checkForRecentBuilds(ctx) + changelog(ctx) + website(ctx) + cacheOcisPipeline(ctx)
def stagePipelines(ctx):
unitTestPipelines = unitTests(ctx)
+ if "unit-tests-only" in ctx.build.title.lower():
+ return unitTestPipelines
+
acceptancePipelines = acceptance(ctx)
if acceptancePipelines == False:
return unitTestPipelines
@@ -780,6 +786,57 @@ def yarnlint():
return pipelines
+def checkForRecentBuilds(ctx):
+ pipelines = []
+
+ result = {
+ "kind": "pipeline",
+ "type": "docker",
+ "name": "stop-recent-builds",
+ "workspace": {
+ "base": dir["base"],
+ "path": config["app"],
+ },
+ "steps": stopRecentBuilds(ctx),
+ "depends_on": [],
+ "trigger": {
+ "ref": [
+ "refs/heads/master",
+ "refs/tags/**",
+ "refs/pull/**",
+ ],
+ },
+ }
+
+ pipelines.append(result)
+
+ return pipelines
+
+def stopRecentBuilds(ctx):
+ repo_slug = ctx.build.source_repo if ctx.build.source_repo else ctx.repo.slug
+
+ return [{
+ "name": "stop-recent-builds",
+ "image": "drone/cli:alpine",
+ "pull": "always",
+ "environment": {
+ "DRONE_SERVER": "https://drone.owncloud.com",
+ "DRONE_TOKEN": {
+ "from_secret": "drone_token",
+ },
+ },
+ "commands": [
+ "drone build ls %s --status running > %s/recentBuilds.txt" % (repo_slug, dir["web"]),
+ "drone build info %s ${DRONE_BUILD_NUMBER} > %s/thisBuildInfo.txt" % (repo_slug, dir["web"]),
+ "cd %s && ./tests/acceptance/cancelBuilds.sh" % dir["web"],
+ ],
+ "when": {
+ "event": [
+ "pull_request",
+ ],
+ },
+ }]
+
def build(ctx):
pipelines = []
@@ -978,6 +1035,7 @@ def unitTests(ctx):
"trigger": {
"ref": [
"refs/heads/master",
+ "refs/tags/**",
"refs/pull/**",
],
},
@@ -986,7 +1044,7 @@ def unitTests(ctx):
def acceptance(ctx):
pipelines = []
- if "acceptance" not in config or "unit-tests-only" in ctx.build.title.lower():
+ if "acceptance" not in config:
return pipelines
if type(config["acceptance"]) == "bool":
@@ -1904,7 +1962,7 @@ def ocisService():
"PROXY_OIDC_INSECURE": "true",
"STORAGE_HOME_DATA_SERVER_URL": "http://ocis:9155/data",
"STORAGE_USERS_DATA_SERVER_URL": "http://ocis:9158/data",
- "WEB_UI_CONFIG": "/srv/config/drone/ocis-config.json",
+ "WEB_UI_CONFIG": "/srv/config/drone/config-ocis.json",
"WEB_ASSET_PATH": "%s/dist" % dir["web"],
"IDP_IDENTIFIER_REGISTRATION_CONF": "/srv/config/drone/identifier-registration.yml",
"ACCOUNTS_DATA_PATH": "/srv/app/tmp/ocis-accounts/",
diff --git a/CHANGELOG.md b/CHANGELOG.md
index c8b202cf294..4fd4db143be 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -3,22 +3,71 @@ Changelog for ownCloud Web [unreleased] (UNRELEASED)
The following sections list the changes in ownCloud web unreleased relevant to
ownCloud admins and users.
-[unreleased]: https://github.com/owncloud/web/compare/v3.4.1...master
+[unreleased]: https://github.com/owncloud/web/compare/v4.0.0...master
Summary
-------
+* Bugfix - Load folder in Media viewer: [#5427](https://github.com/owncloud/web/issues/5427)
+
+Details
+-------
+
+* Bugfix - Load folder in Media viewer: [#5427](https://github.com/owncloud/web/issues/5427)
+
+ We've fixed the loading of a folder in the Media viewer extension. If a user reloads the Media
+ viewer now, it load all the medias both in private and public context.
+
+ https://github.com/owncloud/web/issues/5427
+ https://github.com/owncloud/web/pull/5585
+
+Changelog for ownCloud Web [4.0.0] (2021-08-04)
+=======================================
+The following sections list the changes in ownCloud web 4.0.0 relevant to
+ownCloud admins and users.
+
+[4.0.0]: https://github.com/owncloud/web/compare/v3.4.1...v4.0.0
+
+Summary
+-------
+
+* Bugfix - Left sidebar visibility in public links: [#5602](https://github.com/owncloud/web/pull/5602)
+* Bugfix - Check names also for folders or files that currently are not visible: [#5583](https://github.com/owncloud/web/pull/5583)
* Bugfix - Content Security Policy for OpenID Connect authentication: [#5536](https://github.com/owncloud/web/pull/5536)
* Bugfix - Send authentication on manifests.json: [#5553](https://github.com/owncloud/web/pull/5553)
* Bugfix - Unnecessary quota requests: [#5539](https://github.com/owncloud/web/pull/5539)
+* Bugfix - Use profile picture capability in avatars: [#5178](https://github.com/owncloud/web/pull/5178)
+* Change - Add custom search service: [#5415](https://github.com/owncloud/web/pull/5415)
+* Enhancement - New layout for context menu: [#5160](https://github.com/owncloud/web/issues/5160)
* Enhancement - Dropdown actions in FilesTable: [#5102](https://github.com/owncloud/web/issues/5102)
+* Enhancement - Refactor recipient autocomplete in people panel: [#5554](https://github.com/owncloud/web/pull/5554)
+* Enhancement - Load only opened panels: [#5569](https://github.com/owncloud/web/issues/5569)
* Enhancement - Prevent binding to only loopback IP when running in watch mode: [#5515](https://github.com/owncloud/web/pull/5515)
+* Enhancement - Add filter & search to files app: [#5415](https://github.com/owncloud/web/pull/5415)
+* Enhancement - Define the number of visible share recipients: [#5506](https://github.com/owncloud/web/pull/5506)
* Enhancement - Sidebar sliding panels navigation: [#5549](https://github.com/owncloud/web/pull/5549)
-* Enhancement - Use profile picture capability in avatars: [#5178](https://github.com/owncloud/web/pull/5178)
Details
-------
+* Bugfix - Left sidebar visibility in public links: [#5602](https://github.com/owncloud/web/pull/5602)
+
+ We fixed that the left sidebar was showing the navigation items of an authenticated context
+ when visiting a public link as authenticated user.
+
+ https://github.com/owncloud/web/pull/5602
+
+* Bugfix - Check names also for folders or files that currently are not visible: [#5583](https://github.com/owncloud/web/pull/5583)
+
+ We've changed the way how web checks if a file or folder exists. From now on it also include files
+ from the current folder that actually are not visible.
+
+ This was problematic in situations like the pagination, where a file or folder was not
+ available in the current set of resources and the user tried to create a folder with the same
+ name.
+
+ https://github.com/owncloud/web/pull/5583
+
* Bugfix - Content Security Policy for OpenID Connect authentication: [#5536](https://github.com/owncloud/web/pull/5536)
We added CSP rules for allowing OpenID Connect authentication when running ownCloud Web as app
@@ -38,17 +87,56 @@ Details
https://github.com/owncloud/web/pull/5539
+* Bugfix - Use profile picture capability in avatars: [#5178](https://github.com/owncloud/web/pull/5178)
+
+ Requests for loading avatar profile pictures now only get sent if the backend communicates
+ their availability in the capabilities.
+
+ https://github.com/owncloud/web/pull/5178
+
+* Change - Add custom search service: [#5415](https://github.com/owncloud/web/pull/5415)
+
+ We've added `search` as another core app that can be utilized by other (third-party) frontend
+ extensions to provide filter and search functionality. Please note that you need to add
+ `search` to the `apps` array of your config.json file, otherwise the search bar with its global
+ file search capabilities will disappear.
+
+ https://github.com/owncloud/web/pull/5415
+
+* Enhancement - New layout for context menu: [#5160](https://github.com/owncloud/web/issues/5160)
+
+ The new context menu in the files list received additional menu items and a clear separation
+ into three sections.
+
+ https://github.com/owncloud/web/issues/5160
+ https://github.com/owncloud/web/pull/5576
+
* Enhancement - Dropdown actions in FilesTable: [#5102](https://github.com/owncloud/web/issues/5102)
Users can now access quick actions in a dropdown by clicking on the three-dots button or
right-clicking on rows in the files table.
- We've also bumped the ownCloud Design System to version 8.2.0
+ We've also bumped the ownCloud Design System to version 8.3.0
https://github.com/owncloud/web/issues/5102
https://github.com/owncloud/web/issues/5103
https://github.com/owncloud/web/pull/5551
- https://github.com/owncloud/owncloud-design-system/releases/tag/v8.2.0
+ https://github.com/owncloud/web/pull/5554
+ https://github.com/owncloud/owncloud-design-system/releases/tag/v8.3.0
+
+* Enhancement - Refactor recipient autocomplete in people panel: [#5554](https://github.com/owncloud/web/pull/5554)
+
+ We've refactored the recipient autocomplete in people panel so that selected recipients are
+ displayed directly in the autocomplete instead of the list below it.
+
+ https://github.com/owncloud/web/pull/5554
+
+* Enhancement - Load only opened panels: [#5569](https://github.com/owncloud/web/issues/5569)
+
+ Do not load panels in the Files extension sidebar until they are opened.
+
+ https://github.com/owncloud/web/issues/5569
+ https://github.com/owncloud/web/pull/5573
* Enhancement - Prevent binding to only loopback IP when running in watch mode: [#5515](https://github.com/owncloud/web/pull/5515)
@@ -58,6 +146,21 @@ Details
https://github.com/owncloud/web/pull/5515
+* Enhancement - Add filter & search to files app: [#5415](https://github.com/owncloud/web/pull/5415)
+
+ We've changed the existing searchbar to use the custom search service. It is now able to be used
+ at the same time as a filter (on the frontend) and, if the backend is capable of search, as a search
+ input.
+
+ https://github.com/owncloud/web/pull/5415
+
+* Enhancement - Define the number of visible share recipients: [#5506](https://github.com/owncloud/web/pull/5506)
+
+ We've added a new configuration option `sharingRecipientsPerPage` to define how many
+ recipients should be shown in the share recipients dropdown.
+
+ https://github.com/owncloud/web/pull/5506
+
* Enhancement - Sidebar sliding panels navigation: [#5549](https://github.com/owncloud/web/pull/5549)
The sidebar now uses a ios like concept for navigate through the different actions in the
@@ -66,13 +169,6 @@ Details
https://github.com/owncloud/web/issues/5523
https://github.com/owncloud/web/pull/5549
-* Enhancement - Use profile picture capability in avatars: [#5178](https://github.com/owncloud/web/pull/5178)
-
- Requests for loading avatar profile pictures now only get sent if the backend communicates
- their availability in the capabilities.
-
- https://github.com/owncloud/web/pull/5178
-
Changelog for ownCloud Web [3.4.1] (2021-07-12)
=======================================
The following sections list the changes in ownCloud web 3.4.1 relevant to
diff --git a/changelog/4.0.0_2021-08-04/bugfix-left-sidebar-public-link b/changelog/4.0.0_2021-08-04/bugfix-left-sidebar-public-link
new file mode 100644
index 00000000000..1b29e660d72
--- /dev/null
+++ b/changelog/4.0.0_2021-08-04/bugfix-left-sidebar-public-link
@@ -0,0 +1,5 @@
+Bugfix: Left sidebar visibility in public links
+
+We fixed that the left sidebar was showing the navigation items of an authenticated context when visiting a public link as authenticated user.
+
+https://github.com/owncloud/web/pull/5602
diff --git a/changelog/4.0.0_2021-08-04/bugfix-name-checks-with-pagination b/changelog/4.0.0_2021-08-04/bugfix-name-checks-with-pagination
new file mode 100644
index 00000000000..8c9de41b394
--- /dev/null
+++ b/changelog/4.0.0_2021-08-04/bugfix-name-checks-with-pagination
@@ -0,0 +1,9 @@
+Bugfix: Check names also for folders or files that currently are not visible
+
+We've changed the way how web checks if a file or folder exists.
+From now on it also include files from the current folder that actually are not visible.
+
+This was problematic in situations like the pagination, where a file or folder was not
+available in the current set of resources and the user tried to create a folder with the same name.
+
+https://github.com/owncloud/web/pull/5583
diff --git a/changelog/unreleased/bugfix-oc10-web-oidc-csp b/changelog/4.0.0_2021-08-04/bugfix-oc10-web-oidc-csp
similarity index 100%
rename from changelog/unreleased/bugfix-oc10-web-oidc-csp
rename to changelog/4.0.0_2021-08-04/bugfix-oc10-web-oidc-csp
diff --git a/changelog/unreleased/bugfix-send-cookie-manifests-json b/changelog/4.0.0_2021-08-04/bugfix-send-cookie-manifests-json
similarity index 100%
rename from changelog/unreleased/bugfix-send-cookie-manifests-json
rename to changelog/4.0.0_2021-08-04/bugfix-send-cookie-manifests-json
diff --git a/changelog/unreleased/bugfix-unnecessary-quota-requests b/changelog/4.0.0_2021-08-04/bugfix-unnecessary-quota-requests
similarity index 100%
rename from changelog/unreleased/bugfix-unnecessary-quota-requests
rename to changelog/4.0.0_2021-08-04/bugfix-unnecessary-quota-requests
diff --git a/changelog/unreleased/enhancement-use-profile-picture-capability b/changelog/4.0.0_2021-08-04/bugfix-use-profile-picture-capability
similarity index 76%
rename from changelog/unreleased/enhancement-use-profile-picture-capability
rename to changelog/4.0.0_2021-08-04/bugfix-use-profile-picture-capability
index c125790fad9..3962104a882 100644
--- a/changelog/unreleased/enhancement-use-profile-picture-capability
+++ b/changelog/4.0.0_2021-08-04/bugfix-use-profile-picture-capability
@@ -1,4 +1,4 @@
-Enhancement: Use profile picture capability in avatars
+Bugfix: Use profile picture capability in avatars
Requests for loading avatar profile pictures now only get sent
if the backend communicates their availability in the capabilities.
diff --git a/changelog/4.0.0_2021-08-04/change-add-customer-search-service b/changelog/4.0.0_2021-08-04/change-add-customer-search-service
new file mode 100644
index 00000000000..5f3c70b1e59
--- /dev/null
+++ b/changelog/4.0.0_2021-08-04/change-add-customer-search-service
@@ -0,0 +1,8 @@
+Change: Add custom search service
+
+We've added `search` as another core app that can be utilized by
+other (third-party) frontend extensions to provide
+filter and search functionality.
+Please note that you need to add `search` to the `apps` array of your config.json file, otherwise the search bar with its global file search capabilities will disappear.
+
+https://github.com/owncloud/web/pull/5415
diff --git a/changelog/4.0.0_2021-08-04/enhancement-contextmenu-layout b/changelog/4.0.0_2021-08-04/enhancement-contextmenu-layout
new file mode 100644
index 00000000000..0995fb1b67a
--- /dev/null
+++ b/changelog/4.0.0_2021-08-04/enhancement-contextmenu-layout
@@ -0,0 +1,6 @@
+Enhancement: New layout for context menu
+
+The new context menu in the files list received additional menu items and a clear separation into three sections.
+
+https://github.com/owncloud/web/issues/5160
+https://github.com/owncloud/web/pull/5576
diff --git a/changelog/unreleased/enhancement-filestable-dropdown-actions b/changelog/4.0.0_2021-08-04/enhancement-filestable-dropdown-actions
similarity index 63%
rename from changelog/unreleased/enhancement-filestable-dropdown-actions
rename to changelog/4.0.0_2021-08-04/enhancement-filestable-dropdown-actions
index 88f1185fb3b..9abd24fb721 100644
--- a/changelog/unreleased/enhancement-filestable-dropdown-actions
+++ b/changelog/4.0.0_2021-08-04/enhancement-filestable-dropdown-actions
@@ -1,11 +1,12 @@
Enhancement: Dropdown actions in FilesTable
-Users can now access quick actions in a dropdown by clicking on
+Users can now access quick actions in a dropdown by clicking on
the three-dots button or right-clicking on rows in the files table.
-We've also bumped the ownCloud Design System to version 8.2.0
+We've also bumped the ownCloud Design System to version 8.3.0
-https://github.com/owncloud/owncloud-design-system/releases/tag/v8.2.0
+https://github.com/owncloud/owncloud-design-system/releases/tag/v8.3.0
https://github.com/owncloud/web/issues/5102
https://github.com/owncloud/web/issues/5103
https://github.com/owncloud/web/pull/5551
+https://github.com/owncloud/web/pull/5554
diff --git a/changelog/4.0.0_2021-08-04/enhancement-invite b/changelog/4.0.0_2021-08-04/enhancement-invite
new file mode 100644
index 00000000000..c101083fd42
--- /dev/null
+++ b/changelog/4.0.0_2021-08-04/enhancement-invite
@@ -0,0 +1,5 @@
+Enhancement: Refactor recipient autocomplete in people panel
+
+We've refactored the recipient autocomplete in people panel so that selected recipients are displayed directly in the autocomplete instead of the list below it.
+
+https://github.com/owncloud/web/pull/5554
\ No newline at end of file
diff --git a/changelog/4.0.0_2021-08-04/enhancement-load-only-opened-panels b/changelog/4.0.0_2021-08-04/enhancement-load-only-opened-panels
new file mode 100644
index 00000000000..a76ee6c7fa3
--- /dev/null
+++ b/changelog/4.0.0_2021-08-04/enhancement-load-only-opened-panels
@@ -0,0 +1,6 @@
+Enhancement: load only opened panels
+
+Do not load panels in the Files extension sidebar until they are opened.
+
+https://github.com/owncloud/web/issues/5569
+https://github.com/owncloud/web/pull/5573
\ No newline at end of file
diff --git a/changelog/unreleased/enhancement-prevent-bind-to-loopback-address b/changelog/4.0.0_2021-08-04/enhancement-prevent-bind-to-loopback-address
similarity index 98%
rename from changelog/unreleased/enhancement-prevent-bind-to-loopback-address
rename to changelog/4.0.0_2021-08-04/enhancement-prevent-bind-to-loopback-address
index 0c99f4ec5b3..63843edbbb5 100644
--- a/changelog/unreleased/enhancement-prevent-bind-to-loopback-address
+++ b/changelog/4.0.0_2021-08-04/enhancement-prevent-bind-to-loopback-address
@@ -1,5 +1,5 @@
-Enhancement: Prevent binding to only loopback IP when running in watch mode
-
-This is required when running the acceptance tests on Windows, it allows the selenium docker containers to access the frontend due to the host binding in rollup (when running `yarn serve`). Does not break any existing functionality.
-
-https://github.com/owncloud/web/pull/5515
+Enhancement: Prevent binding to only loopback IP when running in watch mode
+
+This is required when running the acceptance tests on Windows, it allows the selenium docker containers to access the frontend due to the host binding in rollup (when running `yarn serve`). Does not break any existing functionality.
+
+https://github.com/owncloud/web/pull/5515
diff --git a/changelog/4.0.0_2021-08-04/enhancement-search-filter-files b/changelog/4.0.0_2021-08-04/enhancement-search-filter-files
new file mode 100644
index 00000000000..9d6237757f0
--- /dev/null
+++ b/changelog/4.0.0_2021-08-04/enhancement-search-filter-files
@@ -0,0 +1,7 @@
+Enhancement: Add filter & search to files app
+
+We've changed the existing searchbar to use the custom search service.
+It is now able to be used at the same time as a filter (on the frontend) and, if the backend
+is capable of search, as a search input.
+
+https://github.com/owncloud/web/pull/5415
diff --git a/changelog/4.0.0_2021-08-04/enhancement-share-recipients-number b/changelog/4.0.0_2021-08-04/enhancement-share-recipients-number
new file mode 100644
index 00000000000..841155fc5af
--- /dev/null
+++ b/changelog/4.0.0_2021-08-04/enhancement-share-recipients-number
@@ -0,0 +1,6 @@
+Enhancement: Define the number of visible share recipients
+
+We've added a new configuration option `sharingRecipientsPerPage` to
+define how many recipients should be shown in the share recipients dropdown.
+
+https://github.com/owncloud/web/pull/5506
diff --git a/changelog/unreleased/enhancement-sidebar-navigation b/changelog/4.0.0_2021-08-04/enhancement-sidebar-navigation
similarity index 100%
rename from changelog/unreleased/enhancement-sidebar-navigation
rename to changelog/4.0.0_2021-08-04/enhancement-sidebar-navigation
diff --git a/changelog/unreleased/bugfix-load-folder-in-media-viewer b/changelog/unreleased/bugfix-load-folder-in-media-viewer
new file mode 100644
index 00000000000..c707e06b2d5
--- /dev/null
+++ b/changelog/unreleased/bugfix-load-folder-in-media-viewer
@@ -0,0 +1,7 @@
+Bugfix: load folder in Media viewer
+
+We've fixed the loading of a folder in the Media viewer extension.
+If a user reloads the Media viewer now, it load all the medias both in private and public context.
+
+https://github.com/owncloud/web/issues/5427
+https://github.com/owncloud/web/pull/5585
\ No newline at end of file
diff --git a/changelog/unreleased/enhancement-add-multiple-selection-sidebar b/changelog/unreleased/enhancement-add-multiple-selection-sidebar
new file mode 100644
index 00000000000..49b7f609108
--- /dev/null
+++ b/changelog/unreleased/enhancement-add-multiple-selection-sidebar
@@ -0,0 +1,7 @@
+Enhancement: Add multiple selection Sidebar
+
+We've changed the sidebar so if a user selects multiple files or folders
+he sees a detailed view of his selection in the sidebar.
+
+https://github.com/owncloud/web/issues/5164
+https://github.com/owncloud/web/pull/5630
\ No newline at end of file
diff --git a/config/config.json.dist b/config/config.json.dist
index 2d61474173a..c9a4132e62c 100644
--- a/config/config.json.dist
+++ b/config/config.json.dist
@@ -9,6 +9,7 @@
},
"apps" : [
"files",
+ "search",
"media-viewer",
"draw-io"
],
diff --git a/config/config.json.sample-oc10 b/config/config.json.sample-oc10
index 6c88ff354e3..1a7bb458b3e 100644
--- a/config/config.json.sample-oc10
+++ b/config/config.json.sample-oc10
@@ -9,6 +9,7 @@
},
"apps": [
"files",
+ "search",
"media-viewer"
],
"external_apps": [
diff --git a/config/config.json.sample-ocis b/config/config.json.sample-ocis
index cd99a98b227..3abb918e761 100644
--- a/config/config.json.sample-ocis
+++ b/config/config.json.sample-ocis
@@ -9,11 +9,9 @@
"response_type": "code",
"scope": "openid profile email"
},
- "options": {
- "hideSearchBar": true
- },
"apps": [
"files",
+ "search",
"media-viewer"
],
"external_apps": [
diff --git a/dev/docker/oc10.config.php b/dev/docker/oc10.config.php
new file mode 100644
index 00000000000..5edf59fc444
--- /dev/null
+++ b/dev/docker/oc10.config.php
@@ -0,0 +1,6 @@
+ 'http://host.docker.internal:8080/index.php/apps/web',
+ 'web.rewriteLinks' => true,
+];
+
diff --git a/dev/docker/oc10.entrypoint.sh b/dev/docker/oc10.entrypoint.sh
new file mode 100755
index 00000000000..469a88574b3
--- /dev/null
+++ b/dev/docker/oc10.entrypoint.sh
@@ -0,0 +1,35 @@
+#!/usr/bin/env bash
+set -eo pipefail
+[[ "${DEBUG}" == "true" ]] && set -x
+
+for FILE in $(find /etc/entrypoint.d -iname \*.sh | sort)
+do
+ source ${FILE}
+done
+
+/usr/bin/owncloud server &
+
+until curl --output /dev/null --head --fail --silent --insecure "http://localhost:8080"; do
+ echo "waiting for 'oc10'"
+ sleep 1
+done
+
+if [ ! -d /mnt/data/apps/testing ]
+then
+ git clone https://github.com/owncloud/testing.git /mnt/data/apps/testing
+ occ app:enable oauth2
+ occ app:enable testing
+ occ oauth2:add-client \
+ web \
+ M8W5mo3wQV3VHWYsaYpWhkr8dwa949i4GljCkedHhl7GWqmHMkxSeJgK2PcS0jt5 \
+ sqvPYXK94tMsEEVOYORxg8Ufesi2kC4WpJJSYb0Kj1DSAYl6u2XvJZjc3VcitjDv \
+ http://host.docker.internal:8080/index.php/apps/web/oidc-callback.html
+fi
+
+if [ -d /var/www/owncloud/apps/web/ ]
+then
+ rm -rf /var/www/owncloud/apps/web/
+ occ app:enable web
+fi
+
+tail -f /mnt/data/files/owncloud.log
diff --git a/dev/docker/oc10.web.config.json b/dev/docker/oc10.web.config.json
new file mode 100644
index 00000000000..f2782dc632a
--- /dev/null
+++ b/dev/docker/oc10.web.config.json
@@ -0,0 +1,35 @@
+{
+ "server" : "http://host.docker.internal:8080",
+ "auth": {
+ "clientId": "M8W5mo3wQV3VHWYsaYpWhkr8dwa949i4GljCkedHhl7GWqmHMkxSeJgK2PcS0jt5",
+ "url": "http://host.docker.internal:8080/index.php/apps/oauth2/api/v1/token",
+ "authUrl": "http://host.docker.internal:8080/index.php/apps/oauth2/authorize"
+ },
+ "apps": [
+ "files",
+ "media-viewer",
+ "search"
+ ],
+ "applications" : [
+ {
+ "title": {
+ "en": "Classic Design",
+ "de": "Dateien",
+ "fr": "Fichiers",
+ "zh_CN": "文件"
+ },
+ "icon": "switch_ui",
+ "url": "http://host.docker.internal:8080/index.php/apps/files"
+ },
+ {
+ "icon": "application",
+ "menu": "user",
+ "target": "_self",
+ "title": {
+ "de": "Einstellungen",
+ "en": "Settings"
+ },
+ "url": "http://host.docker.internal:8080/index.php/settings/personal"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/dev/docker/ocis.web.config.json b/dev/docker/ocis.web.config.json
new file mode 100644
index 00000000000..61d2e261b6c
--- /dev/null
+++ b/dev/docker/ocis.web.config.json
@@ -0,0 +1,39 @@
+{
+ "server": "https://host.docker.internal:9200",
+ "theme": "https://host.docker.internal:9200/themes/owncloud/theme.json",
+ "version": "0.1.0",
+ "openIdConnect": {
+ "metadata_url": "https://host.docker.internal:9200/.well-known/openid-configuration",
+ "authority": "https://host.docker.internal:9200",
+ "client_id": "web",
+ "response_type": "code",
+ "scope": "openid profile email"
+ },
+ "options": {
+ "hideSearchBar": true
+ },
+ "apps": [
+ "files",
+ "media-viewer",
+ "search"
+ ],
+ "external_apps": [
+ {
+ "id": "settings",
+ "path": "https://host.docker.internal:9200/settings.js"
+ },
+ {
+ "id": "accounts",
+ "path": "https://host.docker.internal:9200/accounts.js"
+ },
+ {
+ "id": "draw-io",
+ "path": "web-app-draw-io",
+ "config": {
+ "url": "https://embed.diagrams.net",
+ "autosave": false,
+ "theme": "minimal"
+ }
+ }
+ ]
+}
\ No newline at end of file
diff --git a/dev/docker/selenium.Dockerfile b/dev/docker/selenium.Dockerfile
new file mode 100644
index 00000000000..1a62d712f0d
--- /dev/null
+++ b/dev/docker/selenium.Dockerfile
@@ -0,0 +1,10 @@
+# for m1 use SELENIUM_IMAGE=seleniarm/standalone-chromium:4.0.0-beta-1-20210215 docker-compose run selenium
+#ARG SELENIUM_IMAGE=selenium/standalone-chrome-debug
+ARG SELENIUM_IMAGE
+FROM ${SELENIUM_IMAGE}
+
+RUN sudo apt -qqy update \
+ && sudo apt -qqy --no-install-recommends install \
+ fonts-indic \
+ && sudo rm -rf /var/lib/apt/lists/* \
+ && sudo apt -qyy clean
\ No newline at end of file
diff --git a/dev/docker/vnc.Dockerfile b/dev/docker/vnc.Dockerfile
new file mode 100644
index 00000000000..6e9c1fee185
--- /dev/null
+++ b/dev/docker/vnc.Dockerfile
@@ -0,0 +1,12 @@
+FROM python:3
+
+WORKDIR /novnc
+RUN pip install numpy
+RUN git clone --branch v1.2.0 https://github.com/novnc/noVNC.git .
+RUN git clone https://github.com/novnc/websockify ./utils/websockify
+RUN sed -i 's/$(hostname):${PORT}\/vnc.html?host=$(hostname)&port=${PORT}/host.docker.internal:${PORT}/g' ./utils/launch.sh
+RUN cp vnc.html index.html
+
+CMD utils/launch.sh --vnc selenium:5900
+
+
diff --git a/docker-compose.yml b/docker-compose.yml
new file mode 100644
index 00000000000..30c909a415f
--- /dev/null
+++ b/docker-compose.yml
@@ -0,0 +1,73 @@
+services:
+ ocis:
+ image: ${OCIS_IMAGE:-owncloud/ocis:latest}
+ container_name: web_ocis
+ ports:
+ - 9200:9200
+ environment:
+ OCIS_URL: ${OCIS_URL:-https://host.docker.internal:9200}
+ STORAGE_HOME_DRIVER: ${STORAGE_HOME_DRIVER:-ocis}
+ STORAGE_USERS_DRIVER: ${STORAGE_USERS_DRIVER:-ocis}
+ PROXY_OIDC_INSECURE: "${PROXY_OIDC_INSECURE:-true}"
+ WEB_UI_CONFIG: ${WEB_UI_CONFIG:-/web/config.json}
+ WEB_ASSET_PATH: ${WEB_ASSET_PATH:-/web/dist}
+ IDP_IDENTIFIER_REGISTRATION_CONF: ${IDP_IDENTIFIER_REGISTRATION_CONF:-/web/identifier-registration.yml}
+ PROXY_ENABLE_BASIC_AUTH: "${PROXY_ENABLE_BASIC_AUTH:-true}"
+ OCIS_LOG_LEVEL: ${OCIS_LOG_LEVEL:-error}
+ volumes:
+ - ./dist:/web/dist:ro
+ - ./tests/acceptance/mac-identifier-registration.yml:/web/identifier-registration.yml:ro
+ - ${OCIS_WEB_CONFIG:-./dev/docker/ocis.web.config.json}:/web/config.json:ro
+ extra_hosts:
+ - host.docker.internal:${DOCKER_HOST:-host-gateway}
+
+ oc10:
+ image: ${OC10_IMAGE:-owncloud/server:latest}
+ container_name: web_oc10
+ ports:
+ - 8080:8080
+ volumes:
+ - ${OC10_WEB_CONFIG:-./dev/docker/oc10.web.config.json}:/mnt/data/config/config.json
+ - ${OC10_CONFIG:-./dev/docker/oc10.config.php}:/mnt/data/config/setup.config.php
+ - ./dev/docker/oc10.entrypoint.sh:/usr/bin/entrypoint
+ - ./packages/web-integration-oc10/appinfo:/mnt/data/apps/web/appinfo
+ - ./packages/web-integration-oc10/lib:/mnt/data/apps/web/lib
+ - ./dist/css:/mnt/data/apps/web/css
+ - ./dist/img:/mnt/data/apps/web/img
+ - ./dist/js:/mnt/data/apps/web/js
+ - ./dist/themes:/mnt/data/apps/web/themes
+ - ./dist/index.html:/mnt/data/apps/web/index.html
+ - ./dist/manifest.json:/mnt/data/apps/web/manifest.json
+ - ./dist/oidc-callback.html:/mnt/data/apps/web/oidc-callback.html
+ - ./dist/oidc-silent-redirect.html:/mnt/data/apps/web/oidc-silent-redirect.html
+ extra_hosts:
+ - host.docker.internal:${DOCKER_HOST:-host-gateway}
+ entrypoint: /usr/bin/entrypoint
+
+ selenium:
+ build:
+ dockerfile: selenium.Dockerfile
+ context: ./dev/docker
+ args:
+ SELENIUM_IMAGE: ${SELENIUM_IMAGE:-selenium/standalone-chrome-debug}
+ container_name: web_selenium
+ ports:
+ - 4444:4444
+ - 5900:5900
+ volumes:
+ - /dev/shm:/dev/shm
+ - ./tests/acceptance/filesForUpload:/uploads:ro
+ extra_hosts:
+ - host.docker.internal:${DOCKER_HOST:-host-gateway}
+ environment:
+ VNC_NO_PASSWORD: "true"
+
+ vnc:
+ build:
+ dockerfile: vnc.Dockerfile
+ context: ./dev/docker
+ container_name: web_vnc
+ ports:
+ - 6080:6080
+ extra_hosts:
+ - host.docker.internal:${DOCKER_HOST:-host-gateway}
diff --git a/docs/_index.md b/docs/_index.md
index e161e4b259f..e0fa7be12df 100644
--- a/docs/_index.md
+++ b/docs/_index.md
@@ -8,4 +8,5 @@ geekdocFilePath: _index.md
geekdocCollapseSection: true
---
-This is the next generation ownCloud frontend.
+This is the next generation ownCloud frontend.
+If you're new here, head over to the the [getting started guide]({{< ref "getting-started.md" >}}) for a quick introduction.
diff --git a/docs/backend-ocis.md b/docs/backend-ocis.md
index f98982102eb..9feff3a9aec 100644
--- a/docs/backend-ocis.md
+++ b/docs/backend-ocis.md
@@ -1,5 +1,5 @@
---
-title: "Setup with OCIS"
+title: "Setup with oCIS"
date: 2020-04-15T00:00:00+00:00
weight: 50
geekdocRepo: https://github.com/owncloud/web
@@ -9,9 +9,9 @@ geekdocFilePath: backend-ocis.md
{{< toc >}}
-## Setting up OCIS services
+## Setting up oCIS services
-- Setup OCIS by following the [setup instructions](https://owncloud.dev/ocis/getting-started/).
+- Setup oCIS by following the [setup instructions](https://owncloud.dev/ocis/getting-started/).
- Kill the oCIS Web service `./ocis kill web`
## Setting up Web
@@ -27,5 +27,5 @@ geekdocFilePath: backend-ocis.md
## Running acceptance tests
-For testing, please refer to the [OCIS testing section]({{< ref "testing.md#running-acceptance-tests-using-ocis-backend" >}})
+For testing, please refer to the [oCIS testing section]({{< ref "testing.md#running-acceptance-tests-using-ocis-backend" >}})
diff --git a/docs/getting-started.md b/docs/getting-started.md
index e55900f0f10..d984f48be64 100644
--- a/docs/getting-started.md
+++ b/docs/getting-started.md
@@ -13,7 +13,23 @@ geekdocFilePath: getting-started.md
### Docker
-TBD
+Make sure to have Docker, Docker-Compose, Node.js and Yarn installed.
+
+{{< hint info >}}
+This setup currently doesn't work on Windows out of the box.
+
+
+ Workaround
+ One of our contributors has opened a PR to a dependency that prevents us from successfully bundling the frontend.
+ Feel free to check out [his changes](https://github.com/egoist/rollup-plugin-postcss/pull/384) and build them locally if you absolutely want to work on Windows.
+
+{{< /hint >}}
+
+After cloning the [source code](https://github.com/owncloud/web), install the dependencies via `yarn install` and bundle the frontend code by running `yarn build:w`.
+
+Then, you can start the backends by running `docker-compose up oc10 ocis` and access them via [https://host.docker.internal:9200](https://host.docker.internal:9200) (oCIS) and [http://host.docker.internal:8080](http://host.docker.internal:8080) (OC10). If you're not using Docker Desktop, you might have to modify your `/etc/hosts` and add `172.17.0.1 docker.host.internal` to make the `host.docker.internal` links work.
+
+The bundled frontend code automatically gets mounted into the Docker containers, recompiles on changes and you can log in using the demo user (admin/admin) and take a look around!
### Source code
@@ -35,17 +51,18 @@ substring of a value of the authenticated user. Examples are `/Shares`, `/{{.Id}
- `options.previewFileExtensions` Specifies which filetypes will be previewed in the ui. For example to only preview jpg and txt files set this option to `["jpg", "txt"]`.
- `options.disableFeedbackLink` Set this option to `true` to disable the feedback link in the topbar. Keeping it enabled (value `false` or absence of the option)
allows ownCloud to get feedback from your user base through a dedicated survey website.
+- `options.sharingRecipientsPerPage` Sets the amount of users shown as recipients in the dropdown when sharing resources. Default amount is 200.
## Setting up backend and running
-Web can run against either [ownCloud 10](https://github.com/owncloud/core/) as backend or [OCIS](https://github.com/owncloud/ocis).
+Web can run against either [ownCloud 10](https://github.com/owncloud/core/) as backend or [oCIS](https://github.com/owncloud/ocis).
Depending which one you chose, please check the matching section:
- [Setting up with ownCloud as backend]({{< ref "backend-oc10.md" >}})
-- [Setting up with OCIS as backend]({{< ref "backend-ocis.md" >}})
+- [Setting up with oCIS as backend]({{< ref "backend-ocis.md" >}})
## Running
- [Running with ownCloud as backend]({{< ref "backend-oc10.md#running-web" >}})
-- [Running with OCIS as backend]({{< ref "backend-ocis.md#running-web" >}})
+- [Running with oCIS as backend]({{< ref "backend-ocis.md#running-web" >}})
diff --git a/docs/testing-manual.md b/docs/testing-manual.md
new file mode 100644
index 00000000000..43f8ae880ac
--- /dev/null
+++ b/docs/testing-manual.md
@@ -0,0 +1,178 @@
+---
+title: "Running acceptance tests - manual"
+date: 2020-04-15T00:00:00+00:00
+weight: 60
+geekdocRepo: https://github.com/owncloud/web
+geekdocEditPath: edit/master/docs
+geekdocFilePath: testing-old.md
+---
+
+{{< toc >}}
+
+## Setup Selenium
+
+There are multiple ways to run Selenium:
+
+- [Setup using Docker](#setup-using-docker)
+- [Setup using Docker Desktop for Mac](#setup-using-docker-desktop-for-mac)
+- [Setup using a standalone Selenium server](#setup-using-standalone-selenium-server)
+
+### Setup using Docker
+
+- Set the environment variables `SELENIUM_HOST` as `localhost` and `SERVER_HOST` in the format `http://:9100`.
+- If you are a Linux user, run `docker run --rm -d --network="host" -v /dev/shm:/dev/shm -v ${REMOTE_UPLOAD_DIR:-$PWD/tests/acceptance/filesForUpload}:${LOCAL_UPLOAD_DIR:-/uploads}:ro --name web-tests-selenium selenium/standalone-chrome-debug`
+- If you are a Mac user, run `docker run --rm -d -p ${SELENIUM_PORT:-4444}:4444 -p 5900:5900 -v /dev/shm:/dev/shm -v ${REMOTE_UPLOAD_DIR:-$PWD/tests/acceptance/filesForUpload}:${LOCAL_UPLOAD_DIR:-/uploads}:ro --name web-tests-selenium selenium/standalone-chrome-debug`
+ - This command creates a docker container which uses port forwarding instead of host networking [which is not supported on Mac](https://docs.docker.com/network/host/)
+
+ If you are running selenium with these docker commands, you can run these commands from the `web` folder, then you wont need to set `REMOTE_UPLOAD_DIR`.
+
+### Setup using Docker Desktop for Mac
+
+In order to run acceptance tests with selenium running in Docker Desktop for Mac while having ownCloud Server and Web running as services
+on the host machine, `localhost` will not work as URL. Use the Docker host ip `172.17.0.1` or its alias `host.docker.internal` instead.
+This requires adjusting all relevant config files to use `host.docker.internal` instead of `localhost` (config.json in Web and
+config/config.php in oC10) and changing the web OIDC-callback url. Set the `SERVER_HOST` and `BACKEND_HOST` environment variables
+accordingly. In order to use the same url for development on the host machine, define it as an alias to `127.0.0.1` in `/etc/hosts`.
+After all these changes Web will be accessible at `http://host.docker.internal:9100` for both development and acceptance tests.
+
+### Setup using standalone Selenium server
+
+When running a standalone Selenium server, make sure to set the environment variable `SELENIUM_HOST`, `SELENIUM_PORT` and `LOCAL_UPLOAD_DIR` accordingly.
+
+## Setup backend
+
+### ownCloud 10
+
+- set up the [ownCloud 10 backend]({{< ref "backend-oc10.md" >}})
+- clone and install the [testing app](http://github.com/owncloud/testing) into ownCloud
+
+### oCIS
+In order to run the acceptance tests you need to run oCIS using the oCIS storage driver. Also, you need to enable basic auth on the server with these environment variables.
+
+`PROXY_ENABLE_BASIC_AUTH=true STORAGE_HOME_DRIVER=owncloud STORAGE_USERS_DRIVER=owncloud`
+
+- set up the [oCIS backend]({{< ref "backend-ocis.md" >}})
+ - if you are a Mac user, you need to start the server with additional environment variables: `STORAGE_HOME_DATA_SERVER_URL='http://host.docker.internal:9155/data' STORAGE_DATAGATEWAY_PUBLIC_URL='https://host.docker.internal:9200/data' STORAGE_USERS_DATA_SERVER_URL='http://host.docker.internal:9158/data' STORAGE_FRONTEND_PUBLIC_URL='https://host.docker.internal:9200' PROXY_ENABLE_BASIC_AUTH=true PROXY_OIDC_ISSUER='https://host.docker.internal:9200' IDP_INSECURE='true' IDP_IDENTIFIER_REGISTRATION_CONF='/tests/acceptance/mac-identifier-registration.yml' IDP_ISS='https://host.docker.internal:9200' IDP_TLS='true'` (`` needs to be replaced with the your local clone of ownCloud Web)
+
+## Setup ownCloud Web
+
+- [build Web]({{< ref "building.md" >}})
+- [start the Web server]({{< ref "backend-oc10.md#running-web" >}})
+- if you are running web against the oCIS backend, clone the testing app `git clone git@github.com:owncloud/testing.git tests/testing-app`
+
+## Run tests
+
+- set `SERVER_HOST` to point at the URL where the Web web pages are served, for example "http://localhost:9100"
+- set `BACKEND_HOST` to point to the URL of the backend, for example "http://localhost/owncloud/"
+- to be able to run federation tests, additional setup is needed:
+ 1. Install and set up a second ownCloud server-instance that is accessible by a different URL. That second server-instance must have its own database and data directory.
+ 2. clone and install the testing app into the second ownCloud server-instance from http://github.com/owncloud/testing .
+ 3. when running the acceptance tests use `REMOTE_BACKEND_HOST` environment variable to define its address, for example, `REMOTE_BACKEND_HOST=http:// yarn test:acceptance:oc10 `
+
+- set the `SELENIUM_HOST` environment variable to your host that runs selenium, mostly `localhost`
+- set the `SELENIUM_PORT` environment variable to your selenium port, mostly `4444`
+- set the `TESTING_DATA_DIR` when running the tests on oCIS pointing to the testing data that includes data like skeleton directories. The testing directory is available [here](https://github.com/owncloud/testing/tree/master/data). This is handled automatically by the testrunner while running the tests in oc10.
+
+The feature files are located in the "tests/acceptance/features" subdirectories.
+
+see [available settings](#available-settings-to-be-set-by-environment-variables) for further setup if needed
+
+### with oC10 backend
+
+- run `yarn test:acceptance:oc10 `
+
+### with oCIS backend
+
+- run `yarn test:acceptance:ocis `
+- If you are a mac user, run `STORAGE_HOME_DATA_SERVER_URL='http://host.docker.internal:9155/data' STORAGE_DATAGATEWAY_PUBLIC_URL='https://host.docker.internal:9200/data' STORAGE_USERS_DATA_SERVER_URL='http://host.docker.internal:9158/data' STORAGE_FRONTEND_PUBLIC_URL='https://host.docker.internal:9200' PROXY_ENABLE_BASIC_AUTH=true PROXY_OIDC_ISSUER='https://host.docker.internal:9200' IDP_INSECURE='true' IDP_IDENTIFIER_REGISTRATION_CONF='./tests/acceptance/mac-identifier-registration.yml' IDP_ISS='https://host.docker.internal:9200' IDP_TLS='true' yarn test:acceptance:ocis `
+
+### Visual Regression Testing
+
+The test suite consists of snapshots of UI components which can be compared for visual regression testing when running the acceptance tests. These comparisons are done in the existing scenarios. You can check the existing snapshots of the components in the directory `/tests/vrt/baseline`.
+
+#### Running the visual regression tests
+
+When you run the acceptance tests as usual, all the visual regression comparisons are skipped. To run the acceptance test suite with the visual comparison enabled you need to set the env variable, `VISUAL_TEST` to `true`
+
+eg.
+```
+VISUAL_TEST=true SERVER_HOST=http:// BACKEND_HOST=http:// yarn test:acceptance:oc10
+```
+
+#### Updating the snapshots
+
+If there is some change in the components, and you want to update the snapshots of the components you can run the tests with `UPDATE_VRT_SCREENSHOTS` set to `true`. When this env variable is set, the testrunner will ignore if the visual comparison fails and updates the baseline images with the latest images if the comparison fails.
+
+eg.
+```
+VISUAL_TEST=true UPDATE_VRT_SCREENSHOTS=true SERVER_HOST=http:// BACKEND_HOST=http:// yarn test:acceptance:oc10
+```
+
+**note** Visual regression testing may not be completely reliable every time as small changes such as window size and screen resolution may affect the result. For better results it is recommended that you run the tests using the `selenium/standalone-chrome-debug` image of selenium and window size of `1280x1024`
+
+see [available settings](#available-settings-to-be-set-by-environment-variables) for further setup if needed
+
+## Available settings to be set by environment variables
+
+These values can be set using the environment variables to configure `yarn test:acceptance:oc10` and `yarn test:acceptance:ocis` to match your local test environment.
+
+| setting | meaning | default |
+|-------------------- | -----------------------------------------------------------------------| ----------------------|
+| `SERVER_HOST` | web URL | http://localhost:9100 |
+| `BACKEND_HOST` | ownCloud server URL (or reva service url for running with oCIS) | http://localhost:8080 |
+| `BACKEND_USERNAME` | ownCloud administrator username | admin |
+| `BACKEND_PASSWORD` | ownCloud administrator password | admin |
+| `SELENIUM_HOST` | selenium server host, if not set yarn will start selenium automatically if running the selenium docker container as mentioned above set to `localhost` | |
+| `SELENIUM_PORT` | port of selenium server | 4444 |
+| `SCREEN_RESOLUTION` | width and height in px to set the browser resolution to e.g. 375x812 | empty = fullscreen |
+| `REMOTE_UPLOAD_DIR` | path to `filesForUpload` directory, used when uploading files through api | `./tests/acceptance/filesForUpload` |
+| `LOCAL_UPLOAD_DIR` | `filesForUpload` directory available for selenium for direct uploads If using selenium-docker and example above, set it as `/uploads`. If running local selenium, set value same as `REMOTE_UPLOAD_DIR` (please, remember to use absolute path)| `/uploads` |
+| `REMOTE_BACKEND_HOST` | ownCloud remote server URL | http://localhost:8080 |
+| `RUN_ON_OCIS` | Running the tests using the oCIS backend | false |
+| `OCIS_REVA_DATA_ROOT` | Data directory of oCIS | /var/tmp/reva |
+| `TESTING_DATA_DIR` | Testing data directory for new users | - |
+| `WEB_UI_CONFIG` | Path for the web config file (usually in the dist folder) | - |
+| `VISUAL_TEST` | Run the visual regression comparison while running the acceptance tests | - |
+| `UPDATE_VRT_SCREENSHOTS` | Update the baseline snapshots with the latest images for visual regression tests | - |
+
+## Tips
+
+### too many open files
+
+If tests were running fine and then suddenly start to fail your system might run into open file limits.
+In that case you will see messages in the oCIS log output that look like this:
+
+`2020-05-12 11:33:43.974552 I | http: Accept error: accept tcp [::]:9200: accept4: too many open files; retrying in 1s`
+
+In that case increase the open file limits, how to do that would be beyond the scope of this documentation.
+
+## Acceptance Tests in CI
+
+In the CI we run the UI tests using different backends on different repos. We use commit IDs to indicate the version of the backend or testrunner we want to use. These commit IDs should be regularly updated in the `.drone.star` file to keep the CI up to date.
+We run web UI tests in the following repos in the CI.
+
+### 1. web Repo
+
+In the `owncloud/web` repo, we run the tests using both the oc10 backend and the oCIS backend.
+For the oc10 backend, we use the `owncloudci/core` docker image which runs the latest `daily-master-qa` version of owncloud.
+
+For the oCIS backend, we use the Commit ID from the `owncloud/ocis` repo to indicate which version of backend to use. This can be specified in the `.drone.env` file.
+```
+ # The version of oCIS to use in pipelines that test against oCIS
+ OCIS_COMMITID=352034d9eba8be8c4bc4b80421f3c0093e7d472c
+ OCIS_BRANCH=master
+```
+If the version you want to run is on a different branch from master, you also need to change the branch name.
+
+In order to check if new tests are compatible with oCIS, after changing the commit id and the branch name, we can create a draft PR in `owncloud/web` which triggers the CI, and we can see the result there.
+
+### 2. oCIS Repo
+
+We follow the same approach in the `owncloud/ocis` repo too. In order to run the UI tests in CI we use commit IDs from web which can be changed in the `.drone.env` file.
+
+```
+ # The test runner source for UI tests
+ WEB_COMMITID=3cab4e32bca513f14f59127a0387b44a409763a3
+ WEB_BRANCH=master
+```
+This is the commit ID of web indicating the version of testrunner we want to use. If the version is on a branch other than master, we will also need to change the branch name.
diff --git a/docs/testing.md b/docs/testing.md
index db286aa9d44..39441e2b31b 100644
--- a/docs/testing.md
+++ b/docs/testing.md
@@ -1,6 +1,6 @@
---
title: "Running acceptance tests"
-date: 2020-04-15T00:00:00+00:00
+date: 2021-07-27T00:00:00+00:00
weight: 60
geekdocRepo: https://github.com/owncloud/web
geekdocEditPath: edit/master/docs
@@ -8,171 +8,81 @@ geekdocFilePath: testing.md
---
{{< toc >}}
+## Introduction
-## Setup Selenium
+In order to allow us to make changes quickly, often and with a high level of confidence, we heavily rely on tests within the `web` repository.
-There are multiple ways to run Selenium:
+All the steps below require you to have the `web` repo cloned locally and dependencies installed.
+This can be achieved by running
-- [Setup using Docker](#setup-using-docker)
-- [Setup using Docker Desktop for Mac](#setup-using-docker-desktop-for-mac)
-- [Setup using a standalone Selenium server](#setup-using-standalone-selenium-server)
-
-### Setup using Docker
-
-- Set the environment variables `SELENIUM_HOST` as `localhost` and `SERVER_HOST` in the format `http://:9100`.
-- If you are a Linux user, run `docker run --rm -d --network="host" -v /dev/shm:/dev/shm -v ${REMOTE_UPLOAD_DIR:-$PWD/tests/acceptance/filesForUpload}:${LOCAL_UPLOAD_DIR:-/uploads}:ro --name web-tests-selenium selenium/standalone-chrome-debug`
-- If you are a Mac user, run `docker run --rm -d -p ${SELENIUM_PORT:-4444}:4444 -p 5900:5900 -v /dev/shm:/dev/shm -v ${REMOTE_UPLOAD_DIR:-$PWD/tests/acceptance/filesForUpload}:${LOCAL_UPLOAD_DIR:-/uploads}:ro --name web-tests-selenium selenium/standalone-chrome-debug`
- - This command creates a docker container which uses port forwarding instead of host networking [which is not supported on Mac](https://docs.docker.com/network/host/)
-
- If you are running selenium with these docker commands, you can run these commands from the `web` folder, then you wont need to set `REMOTE_UPLOAD_DIR`.
-
-### Setup using Docker Desktop for Mac
-
-In order to run acceptance tests with selenium running in Docker Desktop for Mac while having ownCloud Server and Web running as services
-on the host machine, `localhost` will not work as URL. Use the Docker host ip `172.17.0.1` or its alias `host.docker.internal` instead.
-This requires adjusting all relevant config files to use `host.docker.internal` instead of `localhost` (config.json in Web and
-config/config.php in oC10) and changing the web OIDC-callback url. Set the `SERVER_HOST` and `BACKEND_HOST` environment variables
-accordingly. In order to use the same url for development on the host machine, define it as an alias to `127.0.0.1` in `/etc/hosts`.
-After all these changes Web will be accessible at `http://host.docker.internal:9100` for both development and acceptance tests.
-
-### Setup using standalone Selenium server
-
-When running a standalone Selenium server, make sure to set the environment variable `SELENIUM_HOST`, `SELENIUM_PORT` and `LOCAL_UPLOAD_DIR` accordingly.
-
-## Setup backend
-
-### ownCloud 10
-
-- set up the [ownCloud 10 backend]({{< ref "backend-oc10.md" >}})
-- clone and install the [testing app](http://github.com/owncloud/testing) into ownCloud
-
-### oCIS
-In order to run the acceptance tests you need to run ocis using the ocis storage driver. Also, you need to enable basic auth on the server with these environment variables.
-
-`PROXY_ENABLE_BASIC_AUTH=true STORAGE_HOME_DRIVER=owncloud STORAGE_USERS_DRIVER=owncloud`
-
-- set up the [oCIS backend]({{< ref "backend-ocis.md" >}})
- - if you are a Mac user, you need to start the server with additional environment variables: `STORAGE_HOME_DATA_SERVER_URL='http://host.docker.internal:9155/data' STORAGE_DATAGATEWAY_PUBLIC_URL='https://host.docker.internal:9200/data' STORAGE_USERS_DATA_SERVER_URL='http://host.docker.internal:9158/data' STORAGE_FRONTEND_PUBLIC_URL='https://host.docker.internal:9200' PROXY_ENABLE_BASIC_AUTH=true PROXY_OIDC_ISSUER='https://host.docker.internal:9200' IDP_INSECURE='true' IDP_IDENTIFIER_REGISTRATION_CONF='/tests/acceptance/mac-identifier-registration.yml' IDP_ISS='https://host.docker.internal:9200' IDP_TLS='true'` (`` needs to be replaced with the your local clone of ownCloud Web)
-
-## Setup ownCloud Web
-
-- [build Web]({{< ref "building.md" >}})
-- [start the Web server]({{< ref "backend-oc10.md#running-web" >}})
-- if you are running web against the oCIS backend, clone the testing app `git clone git@github.com:owncloud/testing.git tests/testing-app`
-
-## Run tests
+```shell
+$ git clone https://github.com/owncloud/web.git
+$ cd web
+$ yarn
+```
-- set `SERVER_HOST` to point at the URL where the Web web pages are served, for example "http://localhost:9100"
-- set `BACKEND_HOST` to point to the URL of the backend, for example "http://localhost/owncloud/"
-- to be able to run federation tests, additional setup is needed:
- 1. Install and set up a second ownCloud server-instance that is accessible by a different URL. That second server-instance must have its own database and data directory.
- 2. clone and install the testing app into the second ownCloud server-instance from http://github.com/owncloud/testing .
- 3. when running the acceptance tests use `REMOTE_BACKEND_HOST` environment variable to define its address, for example, `REMOTE_BACKEND_HOST=http:// yarn test:acceptance:oc10 `
+### Unit & Integration Tests
-- set the `SELENIUM_HOST` environment variable to your host that runs selenium, mostly `localhost`
-- set the `SELENIUM_PORT` environment variable to your selenium port, mostly `4444`
-- set the `TESTING_DATA_DIR` when running the tests on ocis pointing to the testing data that includes data like skeleton directories. The testing directory is available [here](https://github.com/owncloud/testing/tree/master/data). This is handled automatically by the testrunner while running the tests in oc10.
+We have a steadily growing coverage of both unit and integration tests. You can run them locally via
-The feature files are located in the "tests/acceptance/features" subdirectories.
+```shell
+$ yarn test:unit
+$ yarn test:integration
+```
-see [available settings](#available-settings-to-be-set-by-environment-variables) for further setup if needed
+You can also specify which tests to run by giving a path param, like so: `yarn test:unit packages//tests/unit/path/to/test.spec.js`.
-### with oC10 backend
+### Acceptance Tests
-- run `yarn test:acceptance:oc10 `
+At ownCloud, we have decided to adopt Docker as the main environment for developing our application.
+This also applies for running our acceptance tests. To run the tests without Docker on your local machine, please refer to the [manual testing guide]({{< ref "testing-manual.md" >}})
-### with oCIS backend
+#### Prerequisites
-- run `yarn test:acceptance:ocis `
-- If you are a mac user, run `STORAGE_HOME_DATA_SERVER_URL='http://host.docker.internal:9155/data' STORAGE_DATAGATEWAY_PUBLIC_URL='https://host.docker.internal:9200/data' STORAGE_USERS_DATA_SERVER_URL='http://host.docker.internal:9158/data' STORAGE_FRONTEND_PUBLIC_URL='https://host.docker.internal:9200' PROXY_ENABLE_BASIC_AUTH=true PROXY_OIDC_ISSUER='https://host.docker.internal:9200' IDP_INSECURE='true' IDP_IDENTIFIER_REGISTRATION_CONF='./tests/acceptance/mac-identifier-registration.yml' IDP_ISS='https://host.docker.internal:9200' IDP_TLS='true' yarn test:acceptance:ocis `
+To run acceptance tests with Docker, please make sure you have the following tools installed:
-### Visual Regression Testing
+- docker
+- docker-compose
+- yarn
+- node
-The test suite consists of snapshots of UI components which can be compared for visual regression testing when running the acceptance tests. These comparisons are done in the existing scenarios. You can check the existing snapshots of the components in the directory `/tests/vrt/baseline`.
+Please also make sure to point `http://host.docker.internal/` to `127.0.0.1` by adding it to your hosts.
-#### Running the visual regression tests
+#### Prepare & start web
-When you run the acceptance tests as usual, all the visual regression comparisons are skipped. To run the acceptance test suite with the visual comparison enabled you need to set the env variable, `VISUAL_TEST` to `true`
+Bundle the web frontend, which then gets mounted into the respective backends. It also gets recompiled on changes.
-eg.
-```
-VISUAL_TEST=true SERVER_HOST=http:// BACKEND_HOST=http:// yarn test:acceptance:oc10
+```shell
+$ yarn build:w
```
-#### Updating the snapshots
+#### Start Docker
-If there is some change in the components, and you want to update the snapshots of the components you can run the tests with `UPDATE_VRT_SCREENSHOTS` set to `true`. When this env variable is set, the testrunner will ignore if the visual comparison fails and updates the baseline images with the latest images if the comparison fails.
+Using compose, you can start the required Docker containers by running
-eg.
-```
-VISUAL_TEST=true UPDATE_VRT_SCREENSHOTS=true SERVER_HOST=http:// BACKEND_HOST=http:// yarn test:acceptance:oc10
+```shell
+$ docker compose up oc10 ocis vnc selenium
```
-**note** Visual regression testing may not be completely reliable every time as small changes such as window size and screen resolution may affect the result. For better results it is recommended that you run the tests using the `selenium/standalone-chrome-debug` image of selenium and window size of `1280x1024`
-
-see [available settings](#available-settings-to-be-set-by-environment-variables) for further setup if needed
-
-## Available settings to be set by environment variables
-
-These values can be set using the environment variables to configure `yarn test:acceptance:oc10` and `yarn test:acceptance:ocis` to match your local test environment.
-
-| setting | meaning | default |
-|-------------------- | -----------------------------------------------------------------------| ----------------------|
-| `SERVER_HOST` | web URL | http://localhost:9100 |
-| `BACKEND_HOST` | ownCloud server URL (or reva service url for running with OCIS) | http://localhost:8080 |
-| `BACKEND_USERNAME` | ownCloud administrator username | admin |
-| `BACKEND_PASSWORD` | ownCloud administrator password | admin |
-| `SELENIUM_HOST` | selenium server host, if not set yarn will start selenium automatically if running the selenium docker container as mentioned above set to `localhost` | |
-| `SELENIUM_PORT` | port of selenium server | 4444 |
-| `SCREEN_RESOLUTION` | width and height in px to set the browser resolution to e.g. 375x812 | empty = fullscreen |
-| `REMOTE_UPLOAD_DIR` | path to `filesForUpload` directory, used when uploading files through api | `./tests/acceptance/filesForUpload` |
-| `LOCAL_UPLOAD_DIR` | `filesForUpload` directory available for selenium for direct uploads If using selenium-docker and example above, set it as `/uploads`. If running local selenium, set value same as `REMOTE_UPLOAD_DIR` (please, remember to use absolute path)| `/uploads` |
-| `REMOTE_BACKEND_HOST` | ownCloud remote server URL | http://localhost:8080 |
-| `RUN_ON_OCIS` | Running the tests using the OCIS backend | false |
-| `OCIS_REVA_DATA_ROOT` | Data directory of OCIS | /var/tmp/reva |
-| `TESTING_DATA_DIR` | Testing data directory for new users | - |
-| `WEB_UI_CONFIG` | Path for the web config file (usually in the dist folder) | - |
-| `VISUAL_TEST` | Run the visual regression comparison while running the acceptance tests | - |
-| `UPDATE_VRT_SCREENSHOTS` | Update the baseline snapshots with the latest images for visual regression tests | - |
-
-## Tips
-
-### too many open files
+and make sure there are no conflicting ports and everything runs smoothly. You can check if everything has worked by opening [https://host.docker.internal:9200](https://host.docker.internal:9200) (oCIS) and [http://host.docker.internal:8080](http://host.docker.internal:8080) (OC10) and logging in using the demo user (admin/admin).
-If tests were running fine and then suddenly start to fail your system might run into open file limits.
-In that case you will see messages in the OCIS log output that look like this:
+If you're using a M1 Mac, you need to use `seleniarm/standalone-chromium:4.0.0-beta-1-20210215`for now. To do so, export `SELENIUM_IMAGE=seleniarm/standalone-chromium:4.0.0-beta-1-20210215`.
-`2020-05-12 11:33:43.974552 I | http: Accept error: accept tcp [::]:9200: accept4: too many open files; retrying in 1s`
+#### Run acceptance tests
-In that case increase the open file limits, how to do that would be beyond the scope of this documentation.
+Depending on the backend you're running the tests on, you can either run
-## Acceptance Tests in CI
-
-In the CI we run the UI tests using different backends on different repos. We use commit IDs to indicate the version of the backend or testrunner we want to use. These commit IDs should be regularly updated in the `.drone.star` file to keep the CI up to date.
-We run web UI tests in the following repos in the CI.
-
-### 1. web Repo
-
-In the `owncloud/web` repo, we run the tests using both the oc10 backend and the OCIS backend.
-For the oc10 backend, we use the `owncloudci/core` docker image which runs the latest `daily-master-qa` version of owncloud.
-
-For the OCIS backend, we use the Commit ID from the `owncloud/ocis` repo to indicate which version of backend to use. This can be specified in the `.drone.env` file.
+```shell
+$ yarn test:acceptance:oc10 tests/acceptance/features/path/to/test
```
- # The version of OCIS to use in pipelines that test against OCIS
- OCIS_COMMITID=352034d9eba8be8c4bc4b80421f3c0093e7d472c
- OCIS_BRANCH=master
-```
-If the version you want to run is on a different branch from master, you also need to change the branch name.
-In order to check if new tests are compatible with OCIS, after changing the commit id and the branch name, we can create a draft PR in `owncloud/web` which triggers the CI, and we can see the result there.
+for ownCloud 10.X or
-### 2. ocis Repo
+```shell
+$ yarn test:acceptance:ocis tests/acceptance/features/path/to/test
+```
-We follow the same approach in the `owncloud/ocis` repo too. In order to run the UI tests in CI we use commit IDs from web which can be changed in the `.drone.env` file.
+for oCIS acceptance tests.
+#### Watch the test run
-```
- # The test runner source for UI tests
- WEB_COMMITID=3cab4e32bca513f14f59127a0387b44a409763a3
- WEB_BRANCH=master
-```
-This is the commit ID of web indicating the version of testrunner we want to use. If the version is on a branch other than master, we will also need to change the branch name.
+To watch the tests while running, open [http://host.docker.internal:6080/](http://host.docker.internal:6080/) in the browser to access your VNC client.
diff --git a/nightwatch.conf.js b/nightwatch.conf.js
index 17cec8b7fbe..6a4fbdecae2 100644
--- a/nightwatch.conf.js
+++ b/nightwatch.conf.js
@@ -5,10 +5,14 @@ const withHttp = url => (/^https?:\/\//i.test(url) ? url : `http://${url}`)
const RUN_WITH_LDAP = !!process.env.RUN_WITH_LDAP
const RUN_ON_OCIS = !!process.env.RUN_ON_OCIS
const LOCAL_LAUNCH_URL = withHttp(
- process.env.SERVER_HOST || (RUN_ON_OCIS ? 'https://localhost:9200' : 'http://localhost:9100')
+ process.env.SERVER_HOST ||
+ (RUN_ON_OCIS
+ ? 'https://host.docker.internal:9200'
+ : 'http://host.docker.internal:8080/index.php/apps/web/index.html')
)
const LOCAL_BACKEND_URL = withHttp(
- process.env.BACKEND_HOST || (RUN_ON_OCIS ? 'https://localhost:9200' : 'http://localhost:8080')
+ process.env.BACKEND_HOST ||
+ (RUN_ON_OCIS ? 'https://host.docker.internal:9200' : 'http://host.docker.internal:8080')
)
const REMOTE_BACKEND_URL = process.env.REMOTE_BACKEND_HOST
? withHttp(process.env.REMOTE_BACKEND_HOST || 'http://localhost:8080')
@@ -36,6 +40,7 @@ const SCREENSHOTS = !!process.env.SCREENSHOTS
const VISUAL_TEST = !!process.env.VISUAL_TEST
const UPDATE_VRT_SCREENSHOTS = !!process.env.UPDATE_VRT_SCREENSHOTS
+
function generateScreenshotFilePath(nightwatchClient, basePath, imagePath) {
return path.join(process.cwd(), basePath, imagePath)
}
diff --git a/package.json b/package.json
index 4f59a7d125c..708c76546b6 100644
--- a/package.json
+++ b/package.json
@@ -1,5 +1,5 @@
{
- "version": "3.4.1",
+ "version": "4.0.0",
"private": true,
"homepage": "https://github.com/owncloud/web",
"license": "AGPL-3.0",
@@ -9,6 +9,7 @@
"packages/web-app-files",
"packages/web-app-markdown-editor",
"packages/web-app-media-viewer",
+ "packages/web-app-search",
"packages/web-pkg",
"packages/web-runtime"
],
@@ -40,17 +41,19 @@
"@rollup/plugin-commonjs": "^17.0.0",
"@rollup/plugin-html": "^0.2.0",
"@rollup/plugin-json": "^4.1.0",
- "@rollup/plugin-typescript": "^8.2.1",
+ "@rollup/plugin-typescript": "^8.2.5",
"@testing-library/jest-dom": "^5.13.0",
"@testing-library/vue": "^5.6.2",
"@types/jest": "^26.0.23",
"@types/jest-axe": "^3.5.2",
"@typescript-eslint/eslint-plugin": "^4.28.3",
"@typescript-eslint/parser": "^4.28.3",
+ "@types/lodash-es": "^4.17.4",
+ "@types/vue": "^2.0.0",
"@vue/test-utils": "^1.1.2",
"archiver": "^3.0.0",
"autoprefixer": "^10.2.4",
- "axe-core": "^4.2.0",
+ "axe-core": "^4.3.2",
"babel-core": "^7.0.0-bridge.0",
"babel-eslint": "^10.1.0",
"babel-jest": "^27.0.6",
@@ -69,7 +72,7 @@
"eslint-plugin-prettier": "^3.4.0",
"eslint-plugin-promise": "^5.1.0",
"eslint-plugin-vue": "^7.13.0",
- "eslint-plugin-vuejs-accessibility": "^0.6.1",
+ "eslint-plugin-vuejs-accessibility": "^0.7.1",
"focus-trap": "^6.4.0",
"focus-trap-vue": "^1.1.1",
"fs-extra": "^9.0.1",
@@ -105,7 +108,7 @@
"rollup-plugin-serve": "^1.1.0",
"rollup-plugin-terser": "^7.0.2",
"rollup-plugin-ts": "^1.4.0",
- "rollup-plugin-visualizer": "^5.5.1",
+ "rollup-plugin-visualizer": "^5.5.2",
"rollup-plugin-vue": "^5.1.4",
"sync-fetch": "^0.3.0",
"ts-jest": "^26.5.6",
diff --git a/packages/web-app-draw-io/l10n/translations.json b/packages/web-app-draw-io/l10n/translations.json
index 0d3c742fbc0..b1b9ffcd7c5 100644
--- a/packages/web-app-draw-io/l10n/translations.json
+++ b/packages/web-app-draw-io/l10n/translations.json
@@ -1 +1 @@
-{"cs":{},"de":{"Diagram imported":"Diagramm importiert","Draw.io editor":"Draw.io Editor","Loading media":"Lade Daten","New draw.io document…":"Neues draw.io Dokument...","The diagram could not be loaded…":"Das Diagramm konnte nicht geladen werden..."},"es":{},"fr":{},"gl":{},"it":{}}
\ No newline at end of file
+{"cs":{},"de":{"Diagram imported":"Diagramm importiert","Draw.io editor":"Draw.io Editor","Loading media":"Lade Daten","New draw.io document…":"Neues draw.io Dokument...","The diagram could not be loaded…":"Das Diagramm konnte nicht geladen werden..."},"es":{"Diagram imported":"Diagrama importado","Draw.io editor":"Editor Draw.io","Loading media":"Cargando medios","New draw.io document…":"Nuevo documento Draw.io ...","The diagram could not be loaded…":"El diagrama no puede cargarse ..."},"fr":{"Diagram imported":"Diagramme importé","New draw.io document…":"Nouveau document draw.io …"},"gl":{},"it":{}}
\ No newline at end of file
diff --git a/packages/web-app-files/l10n/translations.json b/packages/web-app-files/l10n/translations.json
index fdf3a1f327d..7060a9823fe 100644
--- a/packages/web-app-files/l10n/translations.json
+++ b/packages/web-app-files/l10n/translations.json
@@ -1 +1 @@
-{"cs":{"%{file} was successfully deleted":"%{file} byl úspěšně odstraněn","%{name} already exists":"%{name} již existuje","Accept":"Přijmout","Accepted":"Přijato","Actions":"Akce","Add new person by name, email or federation ID's":"Přidat novou osobu podle jména, emailu nebo federačního ID","Add people":"Přidat lidi","Adding People":"Přidávání lidí","Advanced permissions":"Pokročilá oprávnění","All files":"Všechny soubory","Allow creating":"Povolit vytváření","Allow deleting":"Povolit mazání","Allow editing":"Povolit úpravy","An error occurred while loading the public link":"Při načítání veřejného odkazu došlo k chybě","An error occurred while resolving the private link":"Při načítání odkazu nastala chyba","Cancel":"Zrušit","Confirm":"Potvrdit","Continue":"Pokračovat","Contributor":"Přispěvatel","Copy":"Kopírovat","Create":"Vytvořit","Creating file failed…":"Vytváření souboru selhalo...","Creating folder failed…":"Vytváření složky selhalo...","Decline":"Odmítnout","Declined":"Odmítnuto","Delete":"Odstranit","Delete public link":"Smazat veřejný odkaz","Deletion of %{file} failed":"Odstranění %{file} selhalo","Do you want to overwrite it?":"Opravdu si přejete přepsat tento soubor?","Download":"Stáhnout","Download and preview":"Stáhnout a zobrazit","Drag and drop to upload content into current folder":"Přetáhněte soubor, abyste ho nahráli do aktuální složky","Drop files here to upload or click to select file":"Sem přetáhněte soubory, které chcete nahrát, nebo kliknutím vyberte soubor","Edit public link":"Upravit veřejný odkaz","Edit, download and preview":"Upravit, stáhnout a zobrazit","Editor":"Editor","Error while deleting \"%{file}\"":"Chyba při odstraňování \"%{file}\"","Error while deleting \"%{file}\" - the file is locked":"Chyba při odstraňování \"%{file}\" - tento soubor je zamčený","Error while renaming \"%{file}\" to \"%{newName}\" - the file is locked":"Chyba při přejmenování \"%{file}\" na \"%{newName}\" - tento soubor je zamčený","Error while searching.":"Hledání selhalo.","Error while sharing.":"Sdílení selhalo.","Expiration date":"Datum vypršení","Favorites":"Oblíbené","File name":"Název souboru","File name cannot be empty":"Jméno souboru nemůže být prázdné","File name cannot be equal to \"..\"":"Název souboru nemůže být \"..\"","File name cannot be equal to \".\"":"Název souboru nemůže být \".\"","File name cannot contain \"/\"":"Název souboru nemůže obsahovat \"/\"","File name cannot end with whitespace":"Název souboru nemůže končit mezerou","File upload failed…":"Nahrávání souboru selhalo...","Files":"Soubory","Folder %{folder} already exists.":"Složka s názvem %{folder} již existuje","Folder name":"Jméno složky","Folder name cannot be empty":"Jméno složky nemůže být prázdný","Folder name cannot be equal to \"..\"":"Název složky nemůže být \"..\"","Folder name cannot be equal to \".\"":"Název složky nemůže být \".\"","Folder name cannot contain \"/\"":"Název složky nemůže obsahovat \"/\"","Folder name cannot end with whitespace":"Název složky nemůže končit mezerou","Group":"Skupina","Links":"Odkazy","Loading public link…":"Načítání veřejného odkazu...","Mail recipients":"Příjemci pošty","Mark as favorite":"Označit jako oblíbené","Move":{"Action in the files list row to initiate move of a single resource":"Přesunout","":"Přesunout"},"Move here":{"Confirm action in the location picker for move":"Přesunout sem"},"Name":"Název","New":"Nový","New file":"Nový soubor","New folder":"Nová složka","No Versions available for this file":"Pro tento soubor nejsou dostupné žádné verze","Overwrite":"Přepsat","Owner":"Vlastník","Password":"Heslo","Pending":"Čekající","Personal note":"Soukromá poznámka","Public link":"Veřejný odkaz","Public Links":"Veřejné odkazy","Recipients can view and download contents.":"Příjemci mohou prohlížet a stahovat obsah.","Recipients can view, download and upload contents.":"Příjemci mohou prohlížet, stahovat a nahrávat obsah.","Recipients can view, download, edit, delete and upload contents.":"Příjemci mohou prohlížet, stahovat, upravovat, mazat a nahrávat obsah.","Remove password":"Odstranit heslo","Rename":"Přejmenovat","Rename file %{name}":"Přejmenovat soubor %{name}","Rename folder %{name}":"Přejmenovat složku %{name}","Resolving private link…":"Načítání soukromého odkazu...","Restoration of %{file} failed":"Obnovení %{file} selhalo","Restore":"Obnovit","Role":"Role","Save":"Uložit","Send a copy to myself":"Pošlete mi kopii","Set detailed permissions":"Nastavit podrobná oprávnění","Share":"Sdílet","Shared with me":"Sdíleno se mnou","Show Details":"Zobrazit detaily","The name \"%{name}\" is already taken":"Jméno \"%{name}\" je již obsazeno","The name cannot be equal to \"..\"":"Název nemůže být \"..\"","The name cannot be equal to \".\"":"Název nemůže být \".\"","The name cannot contain \"/\"":"Název nemůže obsahovat \"/\"","The name cannot end with whitespace":"Název nemůže končit mezerou","The private link has been copied to your clipboard.":"Soukromý odkaz byl úspěšně zkopírován","This resource is password-protected.":"Tento zdroj je chráněný heslem.","title":"název","Unmark as favorite":"Odznačit jako oblíbené","Upload complete":"Nahrávání dokončeno","Upload failed":"Nahrávání selhalo","Upload File":"Nahrát soubor","Upload Folder":"Nahrát složku","Upload of a folder is not supported in Internet Explorer.":"Nahrávání složky není v aplikaci Internet Explorer podporováno.","Upload, edit, delete, download and preview":"Nahrát, upravit, smazat, stáhnout a zobrazit","Uploader":"Nahrál","User":"Uživatel","Versions":"Verze","Viewer":"Divák","You have no permission to upload!":"Nemáte oprávnění nahrávat soubory.","You have not enough space left to upload!":"Nemáte dostatek místa pro nahrátí."},"de":{"(me)":"(ich)","(Opens in new window)":"(Öffnet in neuem Fenster)","%{ amount } item selected. Actions are available above the table.":["%{ amount } Element ausgewählt. Aktionen sind oberhalb der Tabelle verfügbar.","%{ amount } Elemente ausgewählt. Aktionen sind oberhalb der Tabelle verfügbar."],"%{ amount } selected item":["%{ amount } ausgewähltes Element","%{ amount } ausgewählte Elemente"],"%{ amount } selected item - %{ size }":["%{ amount } ausgewähltes Element - %{ size }","%{ amount } ausgewählte Elemente - %{ size }"],"%{ filesCount } file":["%{ filesCount } Datei","%{ filesCount } Dateien"],"%{ foldersCount } folder":["%{ foldersCount } Ordner","%{ foldersCount } Ordner"],"%{ itemsCount } item in total (%{ filesStr}, %{foldersStr})":["%{ itemsCount } Datei insgesamt (%{ filesStr}, %{foldersStr})","%{ itemsCount } Dateien insgesamt (%{ filesStr}, %{foldersStr})"],"%{ itemsCount } item with %{ itemSize } in total (%{ filesStr}, %{foldersStr})":["%{ itemsCount } Datei mit %{ itemSize } insgesamt (%{ filesStr}, %{foldersStr})","%{ itemsCount } Dateien mit %{ itemSize } insgesamt (%{ filesStr}, %{foldersStr})"],"%{count} resource could not be copied":["%{count} Ressource konnte nicht kopiert werden","%{count} Dateien konnten nicht kopiert werden"],"%{count} resource could not be moved":["%{count} Ressource konnte nicht verschoben werden","%{count} Dateien konnten nicht verschoben werden"],"%{file} was restored successfully":"%{file} wurde erfolgreich wiederhergestellt","%{file} was successfully deleted":"%{file} wurde erfolgreich gelöscht","%{name} already exists":"%{name} existiert bereits","%{owner} shared this folder with you for uploading":"%{owner} hat diesen Ordner zum Upload geteilt.","%{resource} was restored successfully":"%{resource} erfolgreich wiederhergestellt","Accept":"Annehmen","Accept share":"Freigabe annehmen","Accepted":"Angenommen","action":"Aktion","Actions":"Aktionen","Add files or folders":"Dateien oder Ordner hinzufügen","Add new person by name, email or federation ID's":"Eine neue Person durch Name, E-Mail oder Federation-ID hinzufügen","Add people":"Personen hinzufügen","Adding People":"Personen werden hinzugefügt","Additional permissions":"Zusätzliche Rechte","Advanced permissions":"Zusätzliche Rechte","All":"Alle","All deleted files were removed":"Alle gelöschten Dateien wurden entfernt","All files":"Alle Dateien","Allow creating":"Erstellen erlauben","Allow deleting":"Löschen erlauben","Allow editing":"Editieren erlauben","Allow sharing":"Teilen erlauben","An error occurred while copying %{resource}":"Beim Kopieren von %{resource} ist ein Fehler aufgetreten","An error occurred while copying several resources":"Beim Kopieren von mehreren Dateien ist ein Fehler aufgetreten","An error occurred while loading the public link":"Beim Laden des öffentlichen Links ist ein Fehler aufgetreten","An error occurred while moving %{resource}":"Beim Verschieben von %{resource} ist ein Fehler aufgetreten","An error occurred while moving several resources":"Beim Verschieben von mehreren Dateien ist ein Fehler aufgetreten","An error occurred while resolving the private link":"Beim Auflösen des privaten Links ist ein Fehler aufgetreten.","Any external person with the respective link can access this resource. No sign-in\n required. Assign a password to avoid unintended document exposure.":"Externe Personen mit einem Link können auf diese Datei oder diesen Ordner zugreifen. Ein Login ist nicht erforderlich. Um unbeabsichtigte Zugriffe zu verhindern, sollte ein Passwort vergeben werden.","Are you sure you want to delete all selected resources?":"Sollen die gewählten Dateien wirklich gelöscht werden?","Are you sure you want to delete all selected resources? All their content will be permanently removed. This action cannot be undone.":"Sollen die gewählten Dateien wirklich gelöscht werden? Der gesamte Inhalt wird endgültig gelöscht. Diese Aktion kann nicht rückgängig gemacht werden.","Are you sure you want to delete this file?":"Soll diese Datei wirklich gelöscht werden?","Are you sure you want to delete this file? All it’s content will be permanently removed. This action cannot be undone.":"Soll diese Datei wirklich gelöscht werden? Der gesamte Inhalt wird endgültig gelöscht. Diese Aktion kann nicht rückgängig gemacht werden.","Are you sure you want to delete this folder?":"Soll dieser Ordner wirklich gelöscht werden?","Are you sure you want to delete this folder? All it’s content will be permanently removed. This action cannot be undone.":"Soll dieser Ordner wirklich gelöscht werden? Der gesamte Inhalt wird endgültig gelöscht. Diese Aktion kann nicht rückgängig gemacht werden.","Are you sure you want to delete this link? Recreating the same link again is not possible.":"Soll der ausgewählte Link wirklich gelöscht werden? Derselbe Link kann danach nicht wieder erzeugt werden.","Cancel":"Abbrechen","Clear selection":"Auswahl aufheben","Click row to toggle upload progress details":"Zeile anklicken für Uploaddetails","Click to mark this file as favorite":"Klicken Sie um diese Datei als Favorit zu markieren.","Click to remove this file from your favorites":"Klicken Sie um diese Datei als Favorit abzuwählen.","Close file sidebar":"Seitenleiste schließen","Confirm":"Bestätigen","Continue":"Weiter","Contributor":"Mitarbeiter","Copy":"Kopieren","Copy into »%{ target }«":"Nach »%{ target }« kopieren","Copy link to clipboard":"Link in die Zwischenablage kopieren","Copy private link to clipboard":"Privaten Link in die Zwischenablage kopieren","Could not delete files":"Dateien konnten nicht gelöscht werden","Create":"Erstellen","Create a new file":"Neue Datei erstellen","Create a new folder":"Neuen Ordner erstellen","Create and copy public link":"Öffentlichen Link erstellen und kopieren","Create new public link":"Neuen öffentlichen Link erstellen","Creating":"Erstelle","Creating file failed…":"Erstellen der Datei fehlgeschlagen…","Creating folder failed…":"Erstellen des Ordners fehlgeschlagen…","Creating Public Link":"Erstelle den öffentlichen Link","Decline":"Ablehnen","Decline share":"Freigabe ablehnen","Declined":"Abgelehnt","Delete":"Löschen","Delete file %{name}":"Datei %{name} löschen","Delete folder %{name}":"Ordner %{name} löschen","Delete public link":"Lösche den öffentlichen Link","Delete selected resource?":["Ausgewählte Ressource löschen?","%{amount} ausgewählte Dateien löschen?"],"Delete share":"Freigabe entfernen","Delete share with %{ currentCollaborator }":"%{ currentCollaborator } die Freigabe entziehen","Deleted files":"Gelöschte Dateien","Deletion of %{file} failed":"Löschen von %{file} ist fehlgeschlagen","Details":"Details","Display customization options of the files list":"Anpassungsoptionen für die Dateienliste anzeigen","Do you want to create a new version?":"Soll eine neue Version erstellt werden?","Do you want to overwrite it?":"Soll es überschrieben werden?","Download":"Herunterladen","Download and preview":"Herunterladen und Vorschau","Download older version":"Ältere Version herunterladen","Download, preview and share":"Herunterladen, Vorschau und Teilen","Drag and drop to upload content into current folder":"Ziehen Sie Inhalte per Drag & Drop in den aktuellen Ordner","Drag files and folders here or use the \"+ New\" button to upload":"Dateien und Ordner hierher ziehen oder den \"+Neu\"-Button zum Hochladen nutzen","Drop files here to upload or click to select file":"Dateien hier fallenlassen oder anklicken zum Selektieren","Edit public link":"Bearbeite öffentlichen Link","Edit share with %{ currentCollaborator }":"Freigabe für %{ currentCollaborator } bearbeiten","Edit, download and preview":"Bearbeiten, Herunterladen und Vorschau","Edit, download, preview and share":"Bearbeiten, Herunterladen, Vorschau und Teilen","Editing share with %{ currentCollaborator }":"Freigabe für %{ currentCollaborator } bearbeiten","Editor":"Editor","Empty trash bin":"Papierkorb leeren","Enter password for public link":"Passworteingabe für öffentlichen Link","Error while accepting the selected share.":["Fehler beim Annehmen der ausgewählten Freigabe.","Fehler beim Annehmen der ausgewählten Freigaben."],"Error while declining the selected share.":["Fehler beim Ablehnen der ausgewählten Freigabe.","Fehler beim Ablehnen der ausgewählten Freigaben."],"Error while deleting \"%{file}\"":"Fehler beim Löschen von \"%{file}\"","Error while deleting \"%{file}\" - the file is locked":"Fehler beim Löschen von \"%{file}\" - Datei ist gesperrt","Error while renaming \"%{file}\" to \"%{newName}\"":"Fehler beim Umbennen von \"%{file}\" zu \"%{newName}\"","Error while renaming \"%{file}\" to \"%{newName}\" - the file is locked":"Fehler beim Umbennen von \"%{file}\" zu \"%{newName}\" - Datei ist gesperrt","Error while searching.":"Fehler beim Suchen.","Error while sharing.":"Fehler beim Teilen.","Error while starring \"%{file}\"":"Fehler beim hinzufügen von \"%{file}\" zu den Favoriten","Expiration date":"Ablaufdatum","Expiration date (required)":"Verfallsdatum (erforderlich)","Expires %{expires}":"Läuft ab: %{expires}","Favorite files":"Favorisierte Dateien","Favorites":"Favoriten","File %{file} already exists":"Datei %{file} bereits vorhanden","File name":"Dateiname","File name cannot be empty":"Der Dateiname darf nicht leer sein.","File name cannot be equal to \"..\"":"Der Dateiname darf nicht \"..\" sein.","File name cannot be equal to \".\"":"Der Dateiname darf nicht \".\" sein.","File name cannot contain \"/\"":"Der Dateiname darf kein \"/\" enthalten.","File name cannot end with whitespace":"Der Dateiname darf nicht mit einem Leerzeichen enden.","File owner":"Besitzer","File upload failed…":"Datei konnte nicht hochgeladen werden…","Files":"Dateien","Files shared via link":"Per Link geteilte Dateien","Files shared with me":"Mit mir geteilte Dateien","Files shared with others":"Mit anderen geteilten Dateien","Folder %{folder} already exists.":"Der Ordner %{folder} existiert bereits..","Folder name":"Ordnername","Folder name cannot be empty":"Der Ordnername darf nicht leer sein.","Folder name cannot be equal to \"..\"":"Der Ordnername darf nicht \"..\" sein.","Folder name cannot be equal to \".\"":"Der Ordnername darf nicht \".\" sein.","Folder name cannot contain \"/\"":"Der Ordnername darf kein \"/\" enthalten.","Folder name cannot end with whitespace":"Der Ordnername darf nicht mit einem Leerzeichen enden.","Go to »All files«":"Gehe zu \"Alle Dateien\"","Group":"Gruppe","Guest":"Gast","Hide Details":"Details verstecken","Incorrect password":"Falsches Kennwort","Items per page":"Dateien pro Seite","Last modified:":"Zuletzt bearbeitet:","Links":"Links","Loading list of file links":"Lade Dateilinks","Loading people list":"Lade Personen","Loading public link…":"Lade öffentlichen Link…","Mail recipients":"E-Mail Empfänger","Mark as favorite":"Als Favorit markieren","Move":{"Action in the files list row to initiate move of a single resource":"Verschieben","":"Verschieben"},"Move here":{"Confirm action in the location picker for move":"Hierher verschieben"},"Move into »%{ target }«":"Nach »%{ target }« verschieben","msg":"Nachricht","Multiple files already exists":"Mehrere Dateien bereits vorhanden","Name":"Name","Navigate into the desired folder and copy selected resources into it.\n You can navigate into a folder by clicking on its name.\n To navigate back, you can click on the breadcrumbs.\n Resources will be copied into the folder where you are currently located.":"Navigieren Sie in den gewünschten Ordner und kopieren Sie die ausgewählten Datei dorthin.\nSie können in einen Ordner navigieren, indem Sie auf seinen Namen klicken.\nUm zurück zu navigieren, können Sie auf die Brotkrümelnavigation klicken.\nDie Dateien werden in den Ordner kopiert, in dem Sie sich gerade befinden.","Navigate into the desired folder and move selected resources into it.\n You can navigate into a folder by clicking on its name.\n To navigate back, you can click on the breadcrumbs.\n Resources will be moved into the folder where you are currently located.":"Navigieren Sie in den gewünschten Ordner und kopieren Sie die ausgewählten Datei dorthin.\nSie können in einen Ordner navigieren, indem Sie auf seinen Namen klicken.\nUm zurück zu navigieren, können Sie auf die Brotkrümelnavigation klicken.\nDie Dateien werden in den Ordner kopiert, in dem Sie sich gerade befinden.","Navigate to the parent":"Zum übergeordneten Ordner wechseln","New":"Neu","New file":"Neue Datei","New folder":"Neuer Ordner","New folder…":"Neuer Ordner…","No information to display":"Keine Informationen anzeigbar","No items selected.":"Keine Elemente ausgewählt.","No matching role found":"Keine passende Rolle gefunden","No public links":"Keine öffentlichen Links","No Versions available for this file":"Für diese Datei sind keine Versionen verfügbar. ","Only invited people can use this link.":"Nur eingeladene Personen können diesen Link öffnen.","Open folder":{"Action in the files list row to open a folder":"Ordner öffnen"},"Open in %{app}":"In %{app} öffnen","Open in browser":"Im Browser öffnen","Overview of the information about the selected file":"Übersicht der Informationen für die ausgewählte Datei","Overwrite":"Überschreiben","Owner":"Besitzer","Owner:":"Besitzer:","Password":"Passwort","Password (required)":"Passwort (erforderlich)","Password protected":"Geschützt durch Passwort","Paste here":{"Confirm action in the location picker for copy":"Hier einfügen"},"Pending":"Ausstehend","People":"Personen","Permanently delete file %{name}":"Datei %{name} endgültig löschen?","Permanently delete folder %{name}":"Ordner %{name} endgültig löschen?","Permanently delete selected resource?":["Ausgewählte Ressource endgültig löschen?","%{amount} ausgewählte Dateien endgültig löschen?"],"Person was added":"Person hinzugefügt","Personal note":"Persönliche Notiz","Please, accept this share first to display available actions":"Um die verfügbaren Aktionen anzuzeigen, muss diese Freigabe zuerst akzeptiert werden.","Private Link":"Privater Link","Private link copied":"Privater Link kopiert","Public file upload":"Öffentlicher Datei-Upload","Public files":"Öffentliche Dateien","Public link":"Öffentlicher Link","Public link copied":"Öffentlicher Link kopiert","Public link created":"Öffentlicher Link erstellt","Public link has been successfully created and copied into your clipboard.":"Der öffentliche Link wurde erfolgreich erstellt und in die Zwischenablage kopiert.","Public link was successfully deleted":"Der öffentliche Link wurde erfolgreich gelöscht","Public Links":"Öffentliche Links","Recipients can upload but existing contents are not revealed.":"Empfänger können hochladen, aber existierende Inhalte werden nicht angezeigt.","Recipients can view and download contents.":"Empfänger können Inhalte sehen und herunterladen.","Recipients can view, download and upload contents.":"Empfänger können Inhalte sehen, herunterladen und hochladen.","Recipients can view, download, edit, delete and upload contents.":"Empfänger können Inhalte sehen, herunterladen, hochladen, editieren und löschen.","Reload public link":"Öffentlichen Link neu laden","Remote user":"Remote-Benutzer","Remove expiration date":"Entferne Ablaufdatum","Remove password":"Entferne Passwort","Removing person":"Entferne Person","Removing public link":"Entferne öffentlichen Link","Rename":"Umbenennen","Rename file %{name}":"Datei %{name} umbenennen","Rename folder %{name}":"Ordner %{name} umbenennen","Resharer":"Weiter-Verteiler","Resolving private link":"Privater Link wird aufgelöst","Resolving private link…":"Auflösen des privaten Links…","Resolving public link":"Öffentlicher Link wird aufgelöst","Resource not found":"Datei nicht gefunden","Resource with name %{name} already exists":"Datei oder Ordner mit dem Namen %{name} ist bereits vorhanden","Restoration of %{file} failed":"Wiederherstellen von %{fileName} ist fehlgeschlagen.","Restoration of %{resource} failed":"%{resource} konnte nicht wiederhergestellt werden","Restore":"Wiederherstellen","Restore older version":"Ältere Version wiederherstellen","Role":"Rolle","Save":"Speichern","Save Share":"Freigabe speichern","Saving":"Speichern","Saving Public Link":"Speichere den öffentlichen Link","Saving Share":"Speichere Freigabe","See all versions":"Alle Versionen ansehen","Select a person to add":"Person zum hinzufügen auswählen","Selected people":"Ausgewählte Personen","Send a copy to myself":"Eine Kopie an mich schicken","Set detailed permissions":"Detaillierte Rechte festlegen","Share":"Teilen","Share receivers":"Empfänger der Freigabe","Shared by":"Geteilt von","Shared by %{resharer}":"Geteilt von %{resharer}","Shared via link":"Per Link geteilt","Shared with me":"Mit mir geteilt","Shared with others":"Mit anderen geteilt","Shared:":"Geteilt:","Show Details":"Details ansehen","Show hidden files":"Versteckte Dateien anzeigen","Show invited people":"Zeige eingeladene Personen","Show links":"Zeige Links","Size:":"Größe:","Tags":"Schlagwörter","The name \"%{name}\" is already taken":"Der Name \"%{name}\" ist bereits vergeben","The name cannot be empty":"Der Name darf nicht leer sein","The name cannot be equal to \"..\"":"Der Name darf nicht \"..\" sein.","The name cannot be equal to \".\"":"Der Name darf nicht \".\" sein.","The name cannot contain \"/\"":"Der Name darf kein \"/\" enthalten.","The name cannot end with whitespace":"Der Name darf nicht mit einem Leerzeichen enden","The private link has been copied to your clipboard.":"Der private Link wurde in die Zwichenablage kopiert.","The public link \"%{linkName}\" has been copied to your clipboard.":"Der öffentliche Link \"%{linkName}\" wurde in die Zwischenablage kopiert.","There are no resources in this folder":"Dieser Ordner hat keinen Inhalt","There are no resources in this folder.":"Dieser Ordner hat keinen Inhalt.","There are no resources marked as favorite":"Nichts zum favorisieren ausgewählt","There are no resources with a public link at the moment":"Aktuell gibt es keine Dateien mit öffentlichen Links","this":"dies","This file has been shared.":"Diese Datei wurde geteilt.","This folder contains %{ itemCount } item.":["Dieser Ordner enthält %{ itemCount } Element.","Dieser Ordner enthält %{ itemCount } Elemente."],"This folder has been shared.":"Dieser Ordner wurde geteilt.","This folder has no content.":"Dieser Ordner ist leer.","This item is directly shared via links.":"Dieses Element wurde direkt über Links geteilt.","This item is directly shared with others.":"Dieses Element wurde direkt mit anderen Personen geteilt.","This item is shared via links through one of the parent folders.":"Dieses Element wurde durch einen übergeordneten Ordner über Links geteilt.","This item is shared with others through one of the parent folders.":"Dieses Element wurde durch einen übergeordneten Ordner mit anderen Personen geteilt.","This resource is password-protected.":"Diese Datei ist passwortgeschützt.","title":"Titel","Unknown Role":"Unbekannte Rolle","Unknown type":"Unbekannter Typ","Unmark as favorite":"Favorit abwählen","Upload complete":"Hochladen abgeschlossen","Upload failed":"Hochladen fehlgeschlagen","Upload File":"Datei hochladen","Upload Folder":"Ordner hochladen","Upload of a folder is not supported in Internet Explorer.":"Das Hochladen eines Ordners wird im Internet Explorer nicht unterstützt.","Upload, edit, delete, download and preview":"Hochladen, Bearbeiten, Löschen, Herunterladen und Vorschau","Upload, edit, delete, download, preview and share":"Hochladen, Bearbeiten, Löschen, Herunterladen, Vorschau und Teilen","Uploader":"Nur hochladen","Uploading \"%{ fileName }\"":"Hochladen \"%{ fileName }\"","Uploading %{ count } item":["Hochladen von %{ count } Element","Hochladen von %{ count } Elementen"],"Uploading file \"%{fileName}\"":"Lade Datei \"%{ fileName }\" hoch","User":"Benutzer","Versions":"Versionen","Versions:":"Versionen:","Via %{folderName}":"Durch %{folderName}","View":"Ansicht","Viewer":"Betrachter","We went looking everywhere, but were unable to find the selected resource.":"Wir haben überall gesucht, konnten die ausgewählte Datei aber nicht finden.","You are currently not collaborating on any of your resources with other people":"Es sind keine Inhalte mit anderen Personen zur Zusammenarbeit geteilt","You are currently not collaborating on other people's resources":"Es gibt keine Einladungen zur Zusammenarbeit für Inhalte anderer Personen","You are the file owner":"Sie sind der Besitzer","You don't have permission to share this file.":"Keine Berechtigung diese Datei zu teilen.","You don't have permission to share this folder.":"Keine Berechtigung diesen Ordner zu teilen.","You have no deleted files":"Keine gelöschte Dateien","You have no permission to upload!":"Sie haben keine Berechtigung zum Hochladen!","You have not enough space left to upload!":"Sie haben zum Hochladen nicht genügend Speicherplatz zur Verfügung."},"es":{"(me)":"(yo)","%{ amount } selected item":["%{ amount } elemento seleccionado","%{ amount } elementos seleccionados"],"%{file} was restored successfully":"%{file} fue restaurado con éxito","%{file} was successfully deleted":"%{file} fue eliminado exitosamente","%{name} already exists":"%{name} ya existe","%{owner} shared this folder with you for uploading":"%{owner} compartió esta carpeta con usted para subir archivos.","Accept":"Aceptar","Actions":"Acciones","Advanced permissions":"Permisos avanzados","All files":"Todos los archivos","Allow creating":"Permitir crear","Allow deleting":"Permitir eliminar","Allow editing":"Permitir editar","An error occurred while loading the public link":"Se ha producido un error al cargar el enlace público","An error occurred while resolving the private link":"Un error ocurrió resolviendo el enlace privado ","Cancel":"Cancelar","Continue":"Continuar","Contributor":"Colaborador","Create":"Crear","Creating":"Creando","Creating file failed…":"Falló la creación de archivo...","Creating folder failed…":"Falló la creación de la carpeta...","Creating Public Link":"Creando Enlace Público","Decline":"Rechazar","Declined":"Rechazado","Delete":"Eliminar","Delete public link":"Eliminar enlace público","Deleted files":"Archivos borrados","Deletion of %{file} failed":"Borrado de %{file} falló","Do you want to create a new version?":"¿Quieres crear una nueva versión?","Do you want to overwrite it?":"¿Quieres sobreescribirlo?","Download":"Descargar","Download and preview":"Descargar y previsualizar","Drag and drop to upload content into current folder":"Arrastre y suelte para subir contenido a la carpeta actual","Drop files here to upload or click to select file":"Arrastra archivos aquí o haz clic para seleccionar un archivo","Edit public link":"Editar enlace público","Edit, download and preview":"Editar, descargar y previsualizar","Editor":"Editor","Empty trash bin":"Vaciar papelera","Error while deleting \"%{file}\"":"Error al eliminar \"%{file}\"","Error while deleting \"%{file}\" - the file is locked":"Error al eliminar \"%{file}\" - el archivo está bloqueado","Error while renaming \"%{file}\" to \"%{newName}\"":"Error al renombrar \"%{file}\" a \"%{newName}\"","Error while renaming \"%{file}\" to \"%{newName}\" - the file is locked":"Error al renombrar \"%{file}\" a \"%{newName}\" - el archivo está bloqueado","Error while searching.":"Error durante la búsqueda.","Error while sharing.":"Error al compartir","Expiration date":"Fecha de expiración","Expires %{expires}":"Expira %{expires}","Favorites":"Favoritos","File name":"Nombre de archivo","File name cannot be empty":"El nombre de archivo no puede ser vacío","File name cannot be equal to \"..\"":"El nombre de archivo no puede ser igual a \"..\"","File name cannot be equal to \".\"":"El nombre de archivo no puede ser igual a \".\"","File name cannot contain \"/\"":"El nombre del archivo no puede contener \"/\"","File name cannot end with whitespace":"El nombre del archivo no puede terminar con un espacio en blanco","File upload failed…":"La subida del archivo falló...","Files":"Archivos","Folder %{folder} already exists.":"La carpeta %{folder} ya existe.","Folder name":"Nombre de carpeta","Folder name cannot be empty":"El nombre de carpeta no puede ser vacío","Folder name cannot be equal to \"..\"":"El nombre de carpeta no puede ser igual a \"..\"","Folder name cannot be equal to \".\"":"El nombre de carpeta no puede ser igual a \".\"","Folder name cannot contain \"/\"":"El nombre de la carpeta no puede contener \"/\"","Folder name cannot end with whitespace":"El nombre de la carpeta no puede terminar con un espacio en blanco","Group":"Grupo","Hide Details":"Ocultar Detalles","Links":"Enlaces","Loading public link…":"Cargando enlace público...","Mail recipients":"Destinatarios de correo","msg":"msg","Name":"Nombre","New file":"Nuevo archivo","New folder":"Nueva carpeta","New folder…":"Nueva carpeta...","No public links":"Ningún enlace público","No Versions available for this file":"No hay versiones disponibles para este archivo","Owner":"Propietario","Password":"Contraseña","Password protected":"Protegido con contraseña","Pending":"Pendiente","Personal note":"Nota personal","Private Link":"Enlace Privado","Public Links":"Enlaces Públicos","Recipients can upload but existing contents are not revealed.":"Los receptores pueden subir archivos pero el contenido existente no será revelado.","Recipients can view and download contents.":"Los destinatarios pueden ver y descargar contenidos.","Recipients can view, download and upload contents.":"Los destinatarios pueden ver, descargar y cargar contenidos.","Recipients can view, download, edit, delete and upload contents.":"Los destinatarios pueden ver, descargar, editar, borrar y cargar contenidos.","Remove expiration date":"Eliminar fecha de vencimiento","Remove password":"Eliminar contraseña","Rename":"Renombrar","Rename file %{name}":"Renombrar archivo %{name}","Rename folder %{name}":"Renombrar carpeta %{name}","Resharer":"Recompartidor","Resolving private link…":"Resolviendo enlace privado...","Restoration of %{file} failed":"Restauración de %{file} falló","Restore":"Restaurar","Role":"Rol","Save":"Guardar","Save Share":"Guardar recurso compartido","Saving":"Guardando","Saving Public Link":"Guardar Enlace Público","Saving Share":"Guardando recurso compartido","Send a copy to myself":"Enviar una copia a mí mismo","Set detailed permissions":"Definir permisos detallados","Shared with me":"Compartido conmigo","Shared with others":"Compartido con otros","Show Details":"Mostrar Detalles","The name \"%{name}\" is already taken":"El nombre \"%{name}\" ya está tomado","The name cannot be equal to \"..\"":"El nombre no puede ser igual a \"..\"","The name cannot be equal to \".\"":"El nombre no puede ser igual a \".\"","The name cannot contain \"/\"":"El nombre no puede contener \"/\"","The name cannot end with whitespace":"El nombre no puede terminar con un espacio en blanco","The private link has been copied to your clipboard.":"El enlace privado ha sido copiado al portapapeles","There are no resources in this folder.":"No hay recursos en esta carpeta.","this":"esto","This resource is password-protected.":"Este recurso está protegido por contraseña.","title":"titulo","Unknown Role":"Rol desconocido","Upload complete":"Subida completa","Upload failed":"Subida fallida","Upload File":"Subir archivo","Upload Folder":"Subir carpeta","Upload of a folder is not supported in Internet Explorer.":"Subir carpetas no esta soportado en Internet Explorer","Upload, edit, delete, download and preview":"Subir, editar, eliminar, descargar y previsualizar","Uploader":"Cargador","Uploading \"%{ fileName }\"":"Subiendo \"%{ fileName }\"","Uploading %{ count } item":["Subiendo %{ count } ítems","Subiendo %{ count } ítems"],"Uploading file \"%{fileName}\"":"Subiendo archivo \"%{fileName}\"","User":"Usuario","Versions":"Versiones","Via %{folderName}":"A través de %{folderName}","Viewer":"Visor","You have no permission to upload!":"No tienes permisos para subir.","You have not enough space left to upload!":"No tiene suficiente espacio para subir."},"fr":{"%{file} was restored successfully":"%{file} a été réstauré avec succès","%{file} was successfully deleted":"%{file} a été supprimé avec succès","%{name} already exists":"%{name} est déjà existant","%{owner} shared this folder with you for uploading":"%{owner} a partagé ce dossier avec vous pour uploader.","Accept":"Accepter","Actions":"Actions","Add new person by name, email or federation ID's":"Ajouter une nouvelle personne par nom, email ou par son ID de Fédération","Add people":"Ajouter des personnes ","Adding People":"Ajout des personnes ","Advanced permissions":"Permissions avancées","All deleted files were removed":"Tous les fichiers supprimés ont été retirés","All files":"Tous les fichiers","Allow creating":"Autoriser la création","Allow deleting":"Autoriser la suppression","Allow editing":"Autoriser les modifications","Allow sharing":"Autoriser le partage","An error occurred while copying %{resource}":"Une erreur est survenue lors de la copie de %{resource}","An error occurred while copying several resources":"Une erreur est survenue lors de la copie de plusieurs fichiers","An error occurred while loading the public link":"Une erreur est apparue lors du chargement du lien public","An error occurred while moving %{resource}":"Une erreur est survenue lors du déplacement de %{resource}","An error occurred while moving several resources":"Une erreur est survenue lors du déplacement de plusieurs fichiers","An error occurred while resolving the private link":"Une erreur est apparue lors de la résolution du lien privé","Are you sure you want to delete all selected resources?":"Êtes vous sûr de vouloir supprimer les ressources selectionnées?","Are you sure you want to delete all selected resources? All their content will be permanently removed. This action cannot be undone.":"Êtes-vous sûr de vouloir supprimer toutes les ressources sélectionnées ? Tout leur contenu sera définitivement supprimé. Cette action ne peut pas être annulée. ","Are you sure you want to delete this file?":"Êtes-vous sûr de vouloir supprimer \"%{file}\"?","Are you sure you want to delete this file? All it’s content will be permanently removed. This action cannot be undone.":"Êtes-vous sûr de vouloir supprimer ce fichier ? Tout son contenu sera supprimé de manière permanente. Cette action ne peut pas être annulée.","Are you sure you want to delete this folder?":"Êtes-vous sûr de vouloir supprimer ce dossier?","Are you sure you want to delete this folder? All it’s content will be permanently removed. This action cannot be undone.":"Êtes-vous sûr de vouloir supprimer ce dossier? Tout son contenu sera supprimé de manière permanente. Cette action ne peut pas être annulée.","Cancel":"Annuler","Clear selection":"Annuler la sélection","Confirm":"Confirmer","Continue":"Continuer","Contributor":"Contributeur","Copy":"Copier","Could not delete files":"Impossible de supprimer les fichiers","Create":"Créer","Create a new file":"Créer un nouveau fichier...","Create a new folder":"Créer un nouveau dossier...","Create new public link":"Créer un nouveau lien public","Creating":"Création en cours","Creating file failed…":"Echec de création de fichier...","Creating folder failed…":"Echec de création de dossier...","Creating Public Link":"Création lien public","Decline":"Décliner","Declined":"Décliné","Delete":"Supprimer","Delete file %{name}":"Supprimer le fichier %{name}","Delete folder %{name}":"Supprimer le dossier %{name}","Delete public link":"Supprimer lien public","Delete selected resource?":[" Supprimer la ressource sélectionnée?"," Supprimer les %{amount} ressources sélectionnées?"],"Deleted files":"Fichiers supprimés","Deletion of %{file} failed":"Echec de la suppression de %{file}","Do you want to create a new version?":"Voulez-vous creer une nouvelle version ?","Do you want to overwrite it?":"Voulez-vous l'écraser ?","Download":"Télécharger","Download and preview":"Téléchargé et visualiser","Download, preview and share":"Téléchargé, visualiser et partager","Drag and drop to upload content into current folder":"Glisser et déplacer pour uploader du contenu dans le dossier courant","Drop files here to upload or click to select file":"Déposer des fichiers ici pour uploader ou cliquer pour sélectionner des fichiers","Edit public link":"Editer lien public","Edit, download and preview":"Modifier, télécharger et visualiser","Edit, download, preview and share":"Modifier, téléchargé, visualiser et partager","Editor":"Éditeur","Empty trash bin":"Vider la corbeille","Enter password for public link":"Entrer le mot de passe du lien public","Error while deleting \"%{file}\"":"Erreur lors de la suppression de \"%{file}\"","Error while deleting \"%{file}\" - the file is locked":"Erreur lors de la suppression de \"%{file}\" - le fichier est verrouillé","Error while renaming \"%{file}\" to \"%{newName}\"":"Erreur lors du renommage de \"%{file}\" en \"%{newName}\"","Error while renaming \"%{file}\" to \"%{newName}\" - the file is locked":"Erreur lors du renommage de \"%{file}\" en \"%{newName}\" - le fichier est verrouillé","Error while searching.":"Erreur apparue lors de la recherche.","Error while sharing.":"Erreur apparue lors du partage.","Expiration date":"Date d'éxpiration","Favorites":"Favoris","File name":"Nom de fichier","File name cannot be empty":"Nom de fichier ne peut pas être vide","File name cannot be equal to \"..\"":"Le nom du fichier ne peut pas être \"..\"","File name cannot be equal to \".\"":"Le nom du fichier ne peut pas être \".\"","File name cannot contain \"/\"":"Le nom du fichier ne peut pas contenir \"/\"","File name cannot end with whitespace":"Le nom du fichier ne peut pas se terminer avec un espace","File upload failed…":"Échec d'upload du fichier...","Files":"Fichiers","Folder %{folder} already exists.":"Dossier %{folder} existe déjà","Folder name":"Nom de dossier","Folder name cannot be empty":"Nom de dossier ne peut pas être vide","Folder name cannot be equal to \"..\"":"Le nom du dossier ne peut pas être \"..\"","Folder name cannot be equal to \".\"":"Le nom du dossier ne peut pas être \".\"","Folder name cannot contain \"/\"":"Le nom du dossier ne peut pas contenir \"/\"","Folder name cannot end with whitespace":"Le nom du dossier ne peut pas se terminer avec un espace","Go to »All files«":"Aller à »All files« ","Group":"Groupe","Guest":" Invité","Hide Details":"Masquer les détails","Incorrect password":"Mot de passe incorrect","Links":"Liens","Loading public link…":"Chargement du lien public...","Mail recipients":"Destinataires","Move":{"Action in the files list row to initiate move of a single resource":"Déplacer","":"Déplacer"},"Move here":{"Confirm action in the location picker for move":"Déplacer ici"},"msg":"msg","Name":"Nom","New file":"Nouveau fichier","New folder":"Nouveau dossier","New folder…":"Nouveau dossier...","No public links":"Aucun lien public","No Versions available for this file":"Aucune version n'existe pour ce fichier","Only invited people can use this link.":"Seuls les personnes invités peuvent utiliser ce lien.","Open folder":{"Action in the files list row to open a folder":"Ouvrir le dossie"},"Open in browser":"Ouvrir dans le navigateur","Owner":"Propriétaire","Password":"Mot de passe","Password protected":"Protégé par mot de passe","Pending":"En attente","Permanently delete folder %{name}":" Supprimer définitivement le dossier %{name}","Permanently delete selected resource?":["Supprimer définitivement la ressource sélectionnée ?"," Supprimer définitivement les %{amount} ressources sélectionnées?"],"Person was added":"Une personne a été ajoutée","Personal note":"Note personnelle","Please, accept this share first to display available actions":"S’il vous plaît, acceptez ce partage pour afficher les actions disponibles ","Private Link":"Lien privé","Public link":"Lien public","Public link created":"Lien public créé","Public Links":"Liens publics","Recipients can upload but existing contents are not revealed.":"Destinataires peuvent uploader mais le contenu existant n'est pas visible.","Recipients can view and download contents.":"Destinataires peuvent lister et télécharger le contenu.","Recipients can view, download and upload contents.":"Destinataires peuvent lister, télécharger et uploader du contenu.","Recipients can view, download, edit, delete and upload contents.":"Destinataires peuvent lister, télécharger, modifier, supprimer et uploader du contenu.","Reload public link":"Recharger le lien public","Remote user":"Utilisateur distant","Remove expiration date":"Supprimer date d'expiration","Remove password":"Supprimer mot de passe","Rename":"Renommer","Rename file %{name}":"Renommer fichier %{name}","Rename folder %{name}":"Renommer dossier %{name}","Resharer":"Partageur","Resolving private link…":"Résolution du lien privé...","Resource not found":" Ressource introuvable ","Restoration of %{file} failed":"Échec de restauration du fichier %{file}","Restore":"Restaurer","Role":"Role","Save":"Sauvegarder","Save Share":"Enregistrer partage","Saving":"Sauvegarde en cours","Saving Public Link":"Enregistrement lien public","Saving Share":"Enregistrement partage","Send a copy to myself":"M'envoyer une copie","Set detailed permissions":"Définir des permissions détaillées","Shared with me":"Partagé avec moi","Shared with others":"Partagé avec autres","The name \"%{name}\" is already taken":"Le nom \"%{name}\" existe déjà","The name cannot be empty":"Le nom ne peut pas être vide","The name cannot be equal to \"..\"":"Le nom ne peut pas être \"..\"","The name cannot be equal to \".\"":"Le nom ne peut pas être \".\"","The name cannot contain \"/\"":"Le nom ne peut pas contenir \"/\"","The name cannot end with whitespace":"Le nom ne peut pas finir avec un espace","The private link has been copied to your clipboard.":"Le lien privé a été copié dans le presse-papier.","There are no resources in this folder.":"Il n'y a aucune ressource dans ce dossier","This resource is password-protected.":"Cette resource est protégée par mot de passe.","title":"titre","Unknown Role":"Role inconnu","Unknown type":"Type inconnu","Unmark as favorite":"Retirer des favoris","Upload complete":"Upload terminé","Upload failed":"Upload a échoué","Upload File":"Uploader un Fichier","Upload Folder":"Uploader un Dossier","Upload of a folder is not supported in Internet Explorer.":"Upload de dossier n'est pas supporté sur Internet Explorer.","Upload, edit, delete, download and preview":"Uploader, modifier, supprimer, télécharger et visualiser","Upload, edit, delete, download, preview and share":"Uploader, modifier, supprimer, télécharger, visualiser et partager","Uploader":"Uploadeur","Uploading %{ count } item":["Upload fichier \"%{fileName}\"","Upload %{ count } entrées"],"Uploading file \"%{fileName}\"":"Upload fichier \"%{fileName}\"","User":"Utilisateur","Versions":"Versions","Via %{folderName}":"Via %{folderName}","Viewer":"Visionneur","We went looking everywhere, but were unable to find the selected resource.":"Nous avons cherché partout, mais nous n’avons pas pu trouver la ressource sélectionnée.","You don't have permission to share this file.":"Vous n'avez pas la permission de partager ce fichier.","You don't have permission to share this folder.":"Vous n'avez pas la permission de partager ce dossier.","You have no permission to upload!":"Vous n'avez pas la permission d'uploader !","You have not enough space left to upload!":"Vous n'avec pas assez d'espace disponible pour uploader !"},"gl":{"(me)":"(eu)","%{ amount } selected item":["%{ amount } elemento seleccionado","%{ amount } elementos seleccionados"],"%{ amount } selected item - %{ size }":["%{ amount } elemento seleccionado - %{ size }","%{ amount } elementos seleccionados - %{ size }"],"%{count} resource could not be copied":["Non foi posíbel copiar %{count} recurso","Non foi posíbel copiar %{count} recursos"],"%{count} resource could not be moved":["Non foi posíbel mover %{count} recurso","Non foi posíbel mover %{count} recursos"],"%{file} was restored successfully":"%{file} foi restaurado satisfactoriamente","%{file} was successfully deleted":"%{file} foi eliminado satisfactoriamente","%{name} already exists":"%{name} xa existe","%{owner} shared this folder with you for uploading":"%{owner} compartiu este cartafol con vostede para envialo","Accept":"Aceptar","Accepted":"Aceptado","Actions":"Accións","Add new person by name, email or federation ID's":"Engadir unha nova persoa por nome, correo ou ID de federación","Add people":"Engadir xente","Adding People":"Engadindo xente","Additional permissions":"Permisos adicionais","Advanced permissions":"Permisos avanzados","All deleted files were removed":"Retiráronse todos os ficheiros eliminados","All files":"Todos os ficheiros","Allow creating":"Permitir crear","Allow deleting":"Permitir eliminar","Allow editing":"Permitir editar","Allow sharing":"Permitir compartir","An error occurred while copying %{resource}":"Produciuse un erro ao copiar %{resource}","An error occurred while copying several resources":"Produciuse un erro ao copiar varios recursos","An error occurred while loading the public link":"Produciuse un erro ao cargar a ligazón pública","An error occurred while moving %{resource}":"Produciuse un erro ao mover %{resource}","An error occurred while moving several resources":"Produciuse un erro ao mover varios recursos","An error occurred while resolving the private link":"Produciuse un erro ao resolver a ligazón privada","Are you sure you want to delete all selected resources?":"Confirma que quere eliminar todos os recursos seleccionados?","Are you sure you want to delete all selected resources? All their content will be permanently removed. This action cannot be undone.":" \nConfirma que quere eliminar todos os recursos seleccionados? Todo o seu contido eliminarase definitivamente. Esta acción non se pode desfacer.","Are you sure you want to delete this file?":"Confirma que quere eliminar este ficheiro?","Are you sure you want to delete this file? All it’s content will be permanently removed. This action cannot be undone.":"Confirma que quere eliminar este ficheiro? Todo o seu contido eliminarase definitivamente. Esta acción non se pode desfacer.","Are you sure you want to delete this folder?":"Confirma que quere eliminar este cartafol?","Are you sure you want to delete this folder? All it’s content will be permanently removed. This action cannot be undone.":"Confirma que quere eliminar este cartafol? Todo o seu contido eliminarase definitivamente. Esta acción non se pode desfacer.","Cancel":"Cancelar","Clear selection":"Limpar a selección","Confirm":"Confirmar","Continue":"Continuar","Contributor":"Colaborador","Copy":"Copiar","Could not delete files":"Non foi posíbel eliminar os ficheiros","Create":"Crear","Create a new file":"Crear un novo ficheiro","Create a new folder":"Crear un novo cartafol","Create and copy public link":"Crear e copiar unha ligazón pública","Create new public link":"Crear unha nova ligazón pública","Creating":"Creando","Creating file failed…":"Produciuse un fallo ao crear o ficheiro…","Creating folder failed…":"Produciuse un fallo ao crear o cartafol…","Creating Public Link":"Creando a ligazón pública","Decline":"Declinar","Declined":"Declinada","Delete":"Eliminar","Delete file %{name}":"Eliminar o ficheiro %{name}","Delete folder %{name}":"Eliminar o cartafol %{name}","Delete public link":"Eliminar ligazón pública","Delete selected resource?":["Eliminar o recurso seleccionado?","Eliminar os %{amount} recursos seleccionados?"],"Deleted files":"Ficheiros eliminados","Deletion of %{file} failed":"Produciuse un fallo ao eliminar %{file}","Do you want to create a new version?":"Quere crear unha nova versión?","Do you want to overwrite it?":"Quere sobrescribilo?","Download":"Descargar","Download and preview":"Descargar e visionar","Download, preview and share":"Descargar e visionar e compartir","Drag and drop to upload content into current folder":"Arrastre e solte para enviar contido ao cartafol actual","Drop files here to upload or click to select file":"Solte os ficheiros aquí para envialos ou prema para seleccionar ficheiro","Edit public link":"Editar ligazón pública","Edit, download and preview":"Editar, descargar e visionar","Edit, download, preview and share":"Editar, descargar e visionar e compartir","Editor":"Editor","Empty trash bin":"Cesto do lixo baleiro","Enter password for public link":"Introduza o contrasinal para a ligazón pública","Error while deleting \"%{file}\"":"Produciuse un erro ao eliminar «%{file}»","Error while deleting \"%{file}\" - the file is locked":"Produciuse un erro ao eliminar «%{file}» — o ficheiro está bloqueado","Error while renaming \"%{file}\" to \"%{newName}\"":"Produciuse un erro ao cambiar o nome de «%{file}« a «%{newName}»","Error while renaming \"%{file}\" to \"%{newName}\" - the file is locked":"Produciuse un erro ao cambiar o nome de «%{file}« a «%{newName}» — o ficheiro está bloqueado","Error while searching.":"Produciuse un erro durante a busca.","Error while sharing.":"Produciuse un erro durante a compartición.","Error while starring \"%{file}\"":"Produciuse un erro ao destacar «%{file}»","Expiration date":"Data de caducidade","Expires %{expires}":"Caduca %{expires}","Favorites":"Favoritos","File %{file} already exists":"Xa existe o ficheiro %{file}","File name":"Nome de ficheiro","File name cannot be empty":"O nome do ficheiro non pode estar baleiro","File name cannot be equal to \"..\"":"O nome do ficheiro non pode ser igual a «..»","File name cannot be equal to \".\"":"O nome do ficheiro non pode ser igual a «.»","File name cannot contain \"/\"":"O nome do ficheiro non pode conter unha «/»","File name cannot end with whitespace":"O nome do ficheiro non pode rematar cun espazo en branco","File upload failed…":"Produciuse un fallo ao enviar o ficheiro…","Files":"Ficheiros","Folder %{folder} already exists.":"Xa existe o cartafol %{folder}.","Folder name":"Nome do cartafol","Folder name cannot be empty":"O nome do cartafol non pode estar baleiro","Folder name cannot be equal to \"..\"":"O nome do cartafol non pode ser igual a «..»","Folder name cannot be equal to \".\"":"O nome do cartafol non pode ser igual a «.»","Folder name cannot contain \"/\"":"O nome do cartafol non pode conter unha «/»","Folder name cannot end with whitespace":"O nome do cartafol non pode rematar cun espazo en branco","Go to »All files«":"Ir a «Todos os ficheiros»","Group":"Grupo","Guest":"Convidado","Hide Details":"Agochar os detalles","Incorrect password":"Contrasinal incorrecta","Links":"Ligazóns","Loading public link…":"Cargando a ligazón pública…","Mail recipients":"Destinatarios de correo","Mark as favorite":"Marca como favorito","Move":{"Action in the files list row to initiate move of a single resource":"Mover","":"Mover"},"Move here":{"Confirm action in the location picker for move":"Mover aquí"},"msg":"msx","Multiple files already exists":"Xa existen varios ficheiros","Name":"Nome","Navigate to the parent":"Navegar ata o pai","New":"Novo","New file":"Novo ficheiro","New folder":"Novo cartafol","New folder…":"Novo cartafol…","No public links":"Non hai ligazóns públicas","No Versions available for this file":"Non hai versións dispoñíbeis para este ficheiro","Only invited people can use this link.":"Só as persoas convidadas poden usar esta ligazón.","Open folder":{"Action in the files list row to open a folder":"Abrir cartafol"},"Open in browser":"Abrir no navegador","Overwrite":"Sobreescribir","Owner":"Propietario","Password":"Contrasinal","Password protected":"Protexido por contrasinal","Paste here":{"Confirm action in the location picker for copy":"Pegar aquí"},"Pending":"Pendente","People":"Xente","Permanently delete file %{name}":"Eliminar de xeito permanente o ficheiro %{name}","Permanently delete folder %{name}":"Eliminar de xeito permanente o cartafol %{name}","Permanently delete selected resource?":["Eliminar de xeito permanente o recurso seleccionado?","Eliminar de xeito permanente os %{amount} recursos seleccionados?"],"Person was added":"Engadiuse a persoa","Personal note":"Nota persoal","Please, accept this share first to display available actions":"Acepte primeiro esta compartición para amosar as accións dispoñíbeis","Private Link":"Ligazón privada","Public link":"Ligazón pública","Public link created":"Creouse unha ligazón pública","Public link has been successfully created and copied into your clipboard.":"A ligazón pública foi creada e copiada satispactoriamente no portapapeis.","Public Links":"Ligazóns públicas","Recipients can upload but existing contents are not revealed.":"Os destinatarios poden enviar, mais non se revelan os contidos existentes.","Recipients can view and download contents.":"Os destinatarios poden ver e descargar contidos.","Recipients can view, download and upload contents.":"Os destinatarios poden ver, descargar e enviar contidos.","Recipients can view, download, edit, delete and upload contents.":"Os destinatarios poden ver, descargar, editar, eliminar e enviar contidos.","Reload public link":"Volvendo cargar a ligazón pública","Remote user":"Usuario remoto","Remove expiration date":"Retirar a data de caducidade","Remove password":"Retirar o contrasinal","Rename":"Renomear","Rename file %{name}":"Renomear o ficheiro %{name}","Rename folder %{name}":"Renomear o cartafol %{name}","Resharer":"Volver compartir","Resolving private link…":"Resolvendo a ligazón privada…","Resource not found":"Non se atopou o recurso","Resource with name %{name} already exists":"Xa existe o frecurso nome %{name}","Restoration of %{file} failed":"Produciuse un fallo ao restaurar %{file}","Restore":"Restaurar","Role":"Rol","Save":"Gardar","Save Share":"Gardar a compartición","Saving":"Gardando","Saving Public Link":"Gardando ligazón pública","Saving Share":"Gardando compartición","Send a copy to myself":"Envíame unha copia","Set detailed permissions":"Estabelecer os permisos detallados","Share":"Compartir","Shared by %{resharer}":"Compartido por %{resharer}","Shared with me":"Compartido comigo","Shared with others":"Compartido con outros","Show Details":"Amosar os detalles","The name \"%{name}\" is already taken":"O nome «%{name}» xa está ocupado","The name cannot be empty":"O nome non pode estar baleiro","The name cannot be equal to \"..\"":"O nome non pode ser igual a «..»","The name cannot be equal to \".\"":"O nome non pode ser igual a «.»","The name cannot contain \"/\"":"O nome non pode conter unha «/»","The name cannot end with whitespace":"O nome non pode rematar cun espazo en branco","The private link has been copied to your clipboard.":"A ligazón privada foi copiada no portapapeis.","There are no resources in this folder.":"Non hai recursos neste cartafol.","this":"este","This resource is password-protected.":"Este recurso está protexido por contrasinal.","title":"título","Unknown Role":"Rol descoñecido","Unknown type":"Tipo descoñecido","Unmark as favorite":"Retirar a marca de favorito","Upload complete":"Envío completado","Upload failed":"Produciuse un fallo no envío","Upload File":"Enviar ficheiro","Upload Folder":"Enviar cartafol","Upload of a folder is not supported in Internet Explorer.":"O envío dun cartafol non é compatíbel co Internet Explorer.","Upload, edit, delete, download and preview":"Enviar, editar, eliminar, descargar e visionar","Upload, edit, delete, download, preview and share":"Enviar, editar, eliminar, descargar visionar e compartir","Uploader":"Xestor de envíos","Uploading \"%{ fileName }\"":"Enviando «%{ fileName }»","Uploading %{ count } item":["Enviando %{ count } elemento","Enviando %{ count } elementos"],"Uploading file \"%{fileName}\"":"Enviando o ficheiro «%{fileName}»","User":"Usuario","Versions":"Versións","Via %{folderName}":"Mediante %{folderName}","Viewer":"Visor","We went looking everywhere, but were unable to find the selected resource.":"Buscamos por todas partes, mais non puidemos atopar o recurso seleccionado.","You don't have permission to share this file.":"Non ten permiso para compartir este ficheiro.","You don't have permission to share this folder.":"Non ten permiso para compartir este cartafol.","You have no permission to upload!":"Non ten permiso para facer envíos!","You have not enough space left to upload!":"Non dispón de espazo abondo para facer un envío!"},"it":{}}
\ No newline at end of file
+{"cs":{"%{file} was successfully deleted":"%{file} byl úspěšně odstraněn","%{name} already exists":"%{name} již existuje","Accept":"Přijmout","Accepted":"Přijato","Actions":"Akce","Add people":"Přidat lidi","Adding People":"Přidávání lidí","Advanced permissions":"Pokročilá oprávnění","All files":"Všechny soubory","Allow creating":"Povolit vytváření","Allow deleting":"Povolit mazání","Allow editing":"Povolit úpravy","An error occurred while loading the public link":"Při načítání veřejného odkazu došlo k chybě","An error occurred while resolving the private link":"Při načítání odkazu nastala chyba","Cancel":"Zrušit","Confirm":"Potvrdit","Continue":"Pokračovat","Contributor":"Přispěvatel","Copy":"Kopírovat","Create":"Vytvořit","Creating file failed…":"Vytváření souboru selhalo...","Creating folder failed…":"Vytváření složky selhalo...","Decline":"Odmítnout","Declined":"Odmítnuto","Delete":"Odstranit","Delete public link":"Smazat veřejný odkaz","Deletion of %{file} failed":"Odstranění %{file} selhalo","Do you want to overwrite it?":"Opravdu si přejete přepsat tento soubor?","Download":"Stáhnout","Download and preview":"Stáhnout a zobrazit","Drag and drop to upload content into current folder":"Přetáhněte soubor, abyste ho nahráli do aktuální složky","Drop files here to upload or click to select file":"Sem přetáhněte soubory, které chcete nahrát, nebo kliknutím vyberte soubor","Edit public link":"Upravit veřejný odkaz","Edit, download and preview":"Upravit, stáhnout a zobrazit","Editor":"Editor","Error while deleting \"%{file}\"":"Chyba při odstraňování \"%{file}\"","Error while deleting \"%{file}\" - the file is locked":"Chyba při odstraňování \"%{file}\" - tento soubor je zamčený","Error while renaming \"%{file}\" to \"%{newName}\" - the file is locked":"Chyba při přejmenování \"%{file}\" na \"%{newName}\" - tento soubor je zamčený","Error while sharing.":"Sdílení selhalo.","Expiration date":"Datum vypršení","Favorites":"Oblíbené","File name":"Název souboru","File name cannot be empty":"Jméno souboru nemůže být prázdné","File name cannot be equal to \"..\"":"Název souboru nemůže být \"..\"","File name cannot be equal to \".\"":"Název souboru nemůže být \".\"","File name cannot contain \"/\"":"Název souboru nemůže obsahovat \"/\"","File name cannot end with whitespace":"Název souboru nemůže končit mezerou","File upload failed…":"Nahrávání souboru selhalo...","Files":"Soubory","Folder %{folder} already exists.":"Složka s názvem %{folder} již existuje","Folder name":"Jméno složky","Folder name cannot be empty":"Jméno složky nemůže být prázdný","Folder name cannot be equal to \"..\"":"Název složky nemůže být \"..\"","Folder name cannot be equal to \".\"":"Název složky nemůže být \".\"","Folder name cannot contain \"/\"":"Název složky nemůže obsahovat \"/\"","Folder name cannot end with whitespace":"Název složky nemůže končit mezerou","Group":"Skupina","Links":"Odkazy","Loading public link…":"Načítání veřejného odkazu...","Mail recipients":"Příjemci pošty","Move":{"Action in the files list row to initiate move of a single resource":"Přesunout","":"Přesunout"},"Move here":{"Confirm action in the location picker for move":"Přesunout sem"},"Name":"Název","New":"Nový","New file":"Nový soubor","New folder":"Nová složka","No Versions available for this file":"Pro tento soubor nejsou dostupné žádné verze","Overwrite":"Přepsat","Owner":"Vlastník","Password":"Heslo","Pending":"Čekající","Personal note":"Soukromá poznámka","Public link":"Veřejný odkaz","Public Links":"Veřejné odkazy","Recipients can view and download contents.":"Příjemci mohou prohlížet a stahovat obsah.","Recipients can view, download and upload contents.":"Příjemci mohou prohlížet, stahovat a nahrávat obsah.","Recipients can view, download, edit, delete and upload contents.":"Příjemci mohou prohlížet, stahovat, upravovat, mazat a nahrávat obsah.","Remove password":"Odstranit heslo","Rename":"Přejmenovat","Rename file %{name}":"Přejmenovat soubor %{name}","Rename folder %{name}":"Přejmenovat složku %{name}","Resolving private link…":"Načítání soukromého odkazu...","Restoration of %{file} failed":"Obnovení %{file} selhalo","Restore":"Obnovit","Role":"Role","Save":"Uložit","Send a copy to myself":"Pošlete mi kopii","Set detailed permissions":"Nastavit podrobná oprávnění","Share":"Sdílet","Shared with me":"Sdíleno se mnou","Show Details":"Zobrazit detaily","The name \"%{name}\" is already taken":"Jméno \"%{name}\" je již obsazeno","The name cannot be equal to \"..\"":"Název nemůže být \"..\"","The name cannot be equal to \".\"":"Název nemůže být \".\"","The name cannot contain \"/\"":"Název nemůže obsahovat \"/\"","The name cannot end with whitespace":"Název nemůže končit mezerou","The private link has been copied to your clipboard.":"Soukromý odkaz byl úspěšně zkopírován","This resource is password-protected.":"Tento zdroj je chráněný heslem.","title":"název","Upload complete":"Nahrávání dokončeno","Upload failed":"Nahrávání selhalo","Upload File":"Nahrát soubor","Upload Folder":"Nahrát složku","Upload of a folder is not supported in Internet Explorer.":"Nahrávání složky není v aplikaci Internet Explorer podporováno.","Upload, edit, delete, download and preview":"Nahrát, upravit, smazat, stáhnout a zobrazit","Uploader":"Nahrál","User":"Uživatel","Versions":"Verze","Viewer":"Divák","You have no permission to upload!":"Nemáte oprávnění nahrávat soubory.","You have not enough space left to upload!":"Nemáte dostatek místa pro nahrátí."},"de":{"(me)":"(ich)","(Opens in new window)":"(Öffnet in neuem Fenster)","%{ amount } item selected. Actions are available above the table.":["%{ amount } Element ausgewählt. Aktionen sind oberhalb der Tabelle verfügbar.","%{ amount } Elemente ausgewählt. Aktionen sind oberhalb der Tabelle verfügbar."],"%{ amount } selected item":["%{ amount } ausgewähltes Element","%{ amount } ausgewählte Elemente"],"%{ amount } selected item - %{ size }":["%{ amount } ausgewähltes Element - %{ size }","%{ amount } ausgewählte Elemente - %{ size }"],"%{ filesCount } file":["%{ filesCount } Datei","%{ filesCount } Dateien"],"%{ foldersCount } folder":["%{ foldersCount } Ordner","%{ foldersCount } Ordner"],"%{ itemsCount } item in total (%{ filesStr}, %{foldersStr})":["%{ itemsCount } Datei insgesamt (%{ filesStr}, %{foldersStr})","%{ itemsCount } Elemente insgesamt (%{ filesStr}, %{foldersStr})"],"%{ itemsCount } item with %{ itemSize } in total (%{ filesStr}, %{foldersStr})":["%{ itemsCount } Element mit %{ itemSize } insgesamt (%{ filesStr}, %{foldersStr})","%{ itemsCount } Elemente mit %{ itemSize } insgesamt (%{ filesStr}, %{foldersStr})"],"%{count} resource could not be copied":["%{count} Ressource konnte nicht kopiert werden","%{count} Dateien konnten nicht kopiert werden"],"%{count} resource could not be moved":["%{count} Ressource konnte nicht verschoben werden","%{count} Dateien konnten nicht verschoben werden"],"%{file} was restored successfully":"%{file} wurde erfolgreich wiederhergestellt","%{file} was successfully deleted":"%{file} wurde erfolgreich gelöscht","%{name} already exists":"%{name} existiert bereits","%{owner} shared this folder with you for uploading":"%{owner} hat diesen Ordner zum Upload geteilt.","%{resource} was restored successfully":"%{resource} erfolgreich wiederhergestellt","Accept":"Annehmen","Accept share":"Freigabe annehmen","Accepted":"Angenommen","action":"Aktion","Actions":"Aktionen","Add files or folders":"Dateien oder Ordner hinzufügen","Add new person by name, email or federation IDs":"Neue Person per Name, Email oder Federation-ID hinzufügen","Add people":"Personen hinzufügen","Add to favorites":"Zu Favoriten hinzufügen","Adding People":"Personen werden hinzugefügt","Additional permissions":"Zusätzliche Rechte","Advanced permissions":"Zusätzliche Rechte","All":"Alle","All Actions":"Alle Interaktionen","All deleted files were removed":"Alle gelöschten Dateien wurden entfernt","All files":"Alle Dateien","Allow creating":"Erstellen erlauben","Allow deleting":"Löschen erlauben","Allow editing":"Editieren erlauben","Allow sharing":"Teilen erlauben","An error occurred while copying %{resource}":"Beim Kopieren von %{resource} ist ein Fehler aufgetreten","An error occurred while copying several resources":"Beim Kopieren von mehreren Dateien ist ein Fehler aufgetreten","An error occurred while loading the public link":"Beim Laden des öffentlichen Links ist ein Fehler aufgetreten","An error occurred while moving %{resource}":"Beim Verschieben von %{resource} ist ein Fehler aufgetreten","An error occurred while moving several resources":"Beim Verschieben von mehreren Dateien ist ein Fehler aufgetreten","An error occurred while resolving the private link":"Beim Auflösen des privaten Links ist ein Fehler aufgetreten.","Any external person with the respective link can access this resource. No sign-in\n required. Assign a password to avoid unintended document exposure.":"Externe Personen mit einem Link können auf diese Datei oder diesen Ordner zugreifen. Ein Login ist nicht erforderlich. Um unbeabsichtigte Zugriffe zu verhindern, sollte ein Passwort vergeben werden.","Are you sure you want to delete all selected resources?":"Sollen die gewählten Dateien wirklich gelöscht werden?","Are you sure you want to delete all selected resources? All their content will be permanently removed. This action cannot be undone.":"Sollen die gewählten Dateien wirklich gelöscht werden? Der gesamte Inhalt wird endgültig gelöscht. Diese Aktion kann nicht rückgängig gemacht werden.","Are you sure you want to delete this file?":"Soll diese Datei wirklich gelöscht werden?","Are you sure you want to delete this file? All it’s content will be permanently removed. This action cannot be undone.":"Soll diese Datei wirklich gelöscht werden? Der gesamte Inhalt wird endgültig gelöscht. Diese Aktion kann nicht rückgängig gemacht werden.","Are you sure you want to delete this folder?":"Soll dieser Ordner wirklich gelöscht werden?","Are you sure you want to delete this folder? All it’s content will be permanently removed. This action cannot be undone.":"Soll dieser Ordner wirklich gelöscht werden? Der gesamte Inhalt wird endgültig gelöscht. Diese Aktion kann nicht rückgängig gemacht werden.","Are you sure you want to delete this link? Recreating the same link again is not possible.":"Soll der ausgewählte Link wirklich gelöscht werden? Derselbe Link kann danach nicht wieder erzeugt werden.","Back to %{panel} panel":"Zurück zum %{panel} Panel","Cancel":"Abbrechen","Clear selection":"Auswahl aufheben","Click row to toggle upload progress details":"Zeile anklicken für Uploaddetails","Click to mark this file as favorite":"Klicken Sie um diese Datei als Favorit zu markieren.","Click to remove this file from your favorites":"Klicken Sie um diese Datei als Favorit abzuwählen.","Close file sidebar":"Seitenleiste schließen","Confirm":"Bestätigen","Continue":"Weiter","Contributor":"Mitarbeiter","Copy":"Kopieren","Copy into »%{ target }«":"Nach »%{ target }« kopieren","Copy link to clipboard":"Link in die Zwischenablage kopieren","Copy private link to clipboard":"Privaten Link in die Zwischenablage kopieren","Could not delete files":"Dateien konnten nicht gelöscht werden","Create":"Erstellen","Create & copy public link":"Öffentlichen Link erzeugen & kopieren","Create a new file":"Neue Datei erstellen","Create a new folder":"Neuen Ordner erstellen","Create and copy public link":"Öffentlichen Link erstellen und kopieren","Create new public link":"Neuen öffentlichen Link erstellen","Creating":"Erstelle","Creating file failed…":"Erstellen der Datei fehlgeschlagen…","Creating folder failed…":"Erstellen des Ordners fehlgeschlagen…","Creating Public Link":"Erstelle den öffentlichen Link","Decline":"Ablehnen","Decline share":"Freigabe ablehnen","Declined":"Abgelehnt","Delete":"Löschen","Delete file %{name}":"Datei %{name} löschen","Delete folder %{name}":"Ordner %{name} löschen","Delete public link":"Lösche den öffentlichen Link","Delete selected resource?":["Ausgewählte Ressource löschen?","%{amount} ausgewählte Dateien löschen?"],"Delete share with %{ currentCollaborator }":"%{ currentCollaborator } die Freigabe entziehen","Deleted files":"Gelöschte Dateien","Deletion of %{file} failed":"Löschen von %{file} ist fehlgeschlagen","Deselect %{name}":"Auswahl für %{name} aufheben","Details":"Details","Display customization options of the files list":"Anpassungsoptionen für die Dateienliste anzeigen","Do you want to create a new version?":"Soll eine neue Version erstellt werden?","Do you want to overwrite it?":"Soll es überschrieben werden?","Download":"Herunterladen","Download and preview":"Herunterladen und Vorschau","Download older version":"Ältere Version herunterladen","Download, preview and share":"Herunterladen, Vorschau und Teilen","Drag and drop to upload content into current folder":"Ziehen Sie Inhalte per Drag & Drop in den aktuellen Ordner","Drag files and folders here or use the \"+ New\" button to upload":"Dateien und Ordner hierher ziehen oder den \"+Neu\"-Button zum Hochladen nutzen","Drop files here to upload or click to select file":"Dateien hier fallenlassen oder anklicken zum Selektieren","Edit public link":"Bearbeite öffentlichen Link","Edit share with %{ currentCollaborator }":"Freigabe für %{ currentCollaborator } bearbeiten","Edit, download and preview":"Bearbeiten, Herunterladen und Vorschau","Edit, download, preview and share":"Bearbeiten, Herunterladen, Vorschau und Teilen","Editing share with %{ currentCollaborator }":"Freigabe für %{ currentCollaborator } bearbeiten","Editor":"Editor","Empty trash bin":"Papierkorb leeren","Enter password for public link":"Passworteingabe für öffentlichen Link","Error while accepting the selected share.":["Fehler beim Annehmen der ausgewählten Freigabe.","Fehler beim Annehmen der ausgewählten Freigaben."],"Error while declining the selected share.":["Fehler beim Ablehnen der ausgewählten Freigabe.","Fehler beim Ablehnen der ausgewählten Freigaben."],"Error while deleting \"%{file}\"":"Fehler beim Löschen von \"%{file}\"","Error while deleting \"%{file}\" - the file is locked":"Fehler beim Löschen von \"%{file}\" - Datei ist gesperrt","Error while renaming \"%{file}\" to \"%{newName}\"":"Fehler beim Umbennen von \"%{file}\" zu \"%{newName}\"","Error while renaming \"%{file}\" to \"%{newName}\" - the file is locked":"Fehler beim Umbennen von \"%{file}\" zu \"%{newName}\" - Datei ist gesperrt","Error while sharing.":"Fehler beim Teilen.","Error while starring \"%{file}\"":"Fehler beim hinzufügen von \"%{file}\" zu den Favoriten","Expiration date":"Ablaufdatum","Expiration date (required)":"Verfallsdatum (erforderlich)","Expires %{expires}":"Läuft ab: %{expires}","Favorite files":"Favorisierte Dateien","Favorites":"Favoriten","File %{file} already exists":"Datei %{file} bereits vorhanden","File name":"Dateiname","File name cannot be empty":"Der Dateiname darf nicht leer sein.","File name cannot be equal to \"..\"":"Der Dateiname darf nicht \"..\" sein.","File name cannot be equal to \".\"":"Der Dateiname darf nicht \".\" sein.","File name cannot contain \"/\"":"Der Dateiname darf kein \"/\" enthalten.","File name cannot end with whitespace":"Der Dateiname darf nicht mit einem Leerzeichen enden.","File owner":"Besitzer","File upload failed…":"Datei konnte nicht hochgeladen werden…","Files":"Dateien","Files shared via link":"Per Link geteilte Dateien","Files shared with me":"Mit mir geteilte Dateien","Files shared with others":"Mit anderen geteilten Dateien","Folder %{folder} already exists.":"Der Ordner %{folder} existiert bereits..","Folder name":"Ordnername","Folder name cannot be empty":"Der Ordnername darf nicht leer sein.","Folder name cannot be equal to \"..\"":"Der Ordnername darf nicht \"..\" sein.","Folder name cannot be equal to \".\"":"Der Ordnername darf nicht \".\" sein.","Folder name cannot contain \"/\"":"Der Ordnername darf kein \"/\" enthalten.","Folder name cannot end with whitespace":"Der Ordnername darf nicht mit einem Leerzeichen enden.","Go to »All files«":"Gehe zu \"Alle Dateien\"","Group":"Gruppe","Guest":"Gast","Guest user":"Gastnutzer","Hide Details":"Details verstecken","Incorrect password":"Falsches Kennwort","Invite":"Einladen","Items per page":"Dateien pro Seite","Last modified:":"Zuletzt bearbeitet:","Links":"Links","Loading list of file links":"Lade Dateilinks","Loading people list":"Lade Personen","Loading public link…":"Lade öffentlichen Link…","Mail recipients":"E-Mail Empfänger","Move":{"Action in the files list row to initiate move of a single resource":"Verschieben","":"Verschieben"},"Move here":{"Confirm action in the location picker for move":"Hierher verschieben"},"Move into »%{ target }«":"Nach »%{ target }« verschieben","msg":"Nachricht","Multiple files already exists":"Mehrere Dateien bereits vorhanden","Name":"Name","Navigate into the desired folder and copy selected resources into it.\n You can navigate into a folder by clicking on its name.\n To navigate back, you can click on the breadcrumbs.\n Resources will be copied into the folder where you are currently located.":"Navigieren Sie in den gewünschten Ordner und kopieren Sie die ausgewählten Datei dorthin.\nSie können in einen Ordner navigieren, indem Sie auf seinen Namen klicken.\nUm zurück zu navigieren, können Sie auf die Brotkrümelnavigation klicken.\nDie Dateien werden in den Ordner kopiert, in dem Sie sich gerade befinden.","Navigate into the desired folder and move selected resources into it.\n You can navigate into a folder by clicking on its name.\n To navigate back, you can click on the breadcrumbs.\n Resources will be moved into the folder where you are currently located.":"Navigieren Sie in den gewünschten Ordner und kopieren Sie die ausgewählten Datei dorthin.\nSie können in einen Ordner navigieren, indem Sie auf seinen Namen klicken.\nUm zurück zu navigieren, können Sie auf die Brotkrümelnavigation klicken.\nDie Dateien werden in den Ordner kopiert, in dem Sie sich gerade befinden.","Navigate to the parent":"Zum übergeordneten Ordner wechseln","New":"Neu","New file":"Neue Datei","New folder":"Neuer Ordner","New folder…":"Neuer Ordner…","No information to display":"Keine Informationen anzeigbar","No items selected.":"Keine Elemente ausgewählt.","No matching role found":"Keine passende Rolle gefunden","No public links":"Keine öffentlichen Links","No resource found":"Keine Dateien gefunden","No search term entered":"Kein Suchbegriff eingegeben","No users or groups found.":"Keine Benutzer oder Gruppen gefunden.","No Versions available for this file":"Für diese Datei sind keine Versionen verfügbar. ","Only invited people can use this link.":"Nur eingeladene Personen können diesen Link öffnen.","Open folder":{"Action in the files list row to open a folder":"Ordner öffnen"},"Open in %{app}":"In %{app} öffnen","Open in browser":"Im Browser öffnen","Overview of the information about the selected file":"Übersicht der Informationen für die ausgewählte Datei","Overwrite":"Überschreiben","Owner":"Besitzer","Owner:":"Besitzer:","Password":"Passwort","Password (required)":"Passwort (erforderlich)","Password protected":"Geschützt durch Passwort","Paste here":{"Confirm action in the location picker for copy":"Hier einfügen"},"Pending":"Ausstehend","People":"Personen","Permanently delete file %{name}":"Datei %{name} endgültig löschen?","Permanently delete folder %{name}":"Ordner %{name} endgültig löschen?","Permanently delete selected resource?":["Ausgewählte Ressource endgültig löschen?","%{amount} ausgewählte Dateien endgültig löschen?"],"Person was added":"Person hinzugefügt","Personal note":"Persönliche Notiz","Please, accept this share first to display available actions":"Um die verfügbaren Aktionen anzuzeigen, muss diese Freigabe zuerst akzeptiert werden.","Private Link":"Privater Link","Private link copied":"Privater Link kopiert","Public file upload":"Öffentlicher Datei-Upload","Public files":"Öffentliche Dateien","Public link":"Öffentlicher Link","Public link copied":"Öffentlicher Link kopiert","Public link created":"Öffentlicher Link erstellt","Public link has been successfully created and copied into your clipboard.":"Der öffentliche Link wurde erfolgreich erstellt und in die Zwischenablage kopiert.","Public link was successfully deleted":"Der öffentliche Link wurde erfolgreich gelöscht","Public Links":"Öffentliche Links","Recipients can upload but existing contents are not revealed.":"Empfänger können hochladen, aber existierende Inhalte werden nicht angezeigt.","Recipients can view and download contents.":"Empfänger können Inhalte sehen und herunterladen.","Recipients can view, download and upload contents.":"Empfänger können Inhalte sehen, herunterladen und hochladen.","Recipients can view, download, edit, delete and upload contents.":"Empfänger können Inhalte sehen, herunterladen, hochladen, editieren und löschen.","Reload public link":"Öffentlichen Link neu laden","Remote user":"Remote-Benutzer","Remove expiration date":"Entferne Ablaufdatum","Remove from favorites":"Von Favoriten entfernen","Remove password":"Entferne Passwort","Removing person":"Entferne Person","Removing public link":"Entferne öffentlichen Link","Rename":"Umbenennen","Rename file %{name}":"Datei %{name} umbenennen","Rename folder %{name}":"Ordner %{name} umbenennen","Resharer":"Weiter-Verteiler","Resolving private link":"Privater Link wird aufgelöst","Resolving private link…":"Auflösen des privaten Links…","Resolving public link":"Öffentlicher Link wird aufgelöst","Resource not found":"Datei nicht gefunden","Resource with name %{name} already exists":"Datei oder Ordner mit dem Namen %{name} ist bereits vorhanden","Restoration of %{file} failed":"Wiederherstellen von %{fileName} ist fehlgeschlagen.","Restoration of %{resource} failed":"%{resource} konnte nicht wiederhergestellt werden","Restore":"Wiederherstellen","Restore older version":"Ältere Version wiederherstellen","Role":"Rolle","Save":"Speichern","Save Share":"Freigabe speichern","Saving":"Speichern","Saving Public Link":"Speichere den öffentlichen Link","Saving Share":"Speichere Freigabe","See all versions":"Alle Versionen ansehen","Send a copy to myself":"Eine Kopie an mich schicken","Set detailed permissions":"Detaillierte Rechte festlegen","Share":"Teilen","Share receivers":"Empfänger der Freigabe","Shared by":"Geteilt von","Shared by %{resharer}":"Geteilt von %{resharer}","Shared via link":"Per Link geteilt","Shared with me":"Mit mir geteilt","Shared with others":"Mit anderen geteilt","Shared:":"Geteilt:","Show Details":"Details ansehen","Show hidden files":"Versteckte Dateien anzeigen","Show invited people":"Zeige eingeladene Personen","Show links":"Zeige Links","Size:":"Größe:","Tags":"Schlagwörter","The name \"%{name}\" is already taken":"Der Name \"%{name}\" ist bereits vergeben","The name cannot be empty":"Der Name darf nicht leer sein","The name cannot be equal to \"..\"":"Der Name darf nicht \"..\" sein.","The name cannot be equal to \".\"":"Der Name darf nicht \".\" sein.","The name cannot contain \"/\"":"Der Name darf kein \"/\" enthalten.","The name cannot end with whitespace":"Der Name darf nicht mit einem Leerzeichen enden","The private link has been copied to your clipboard.":"Der private Link wurde in die Zwichenablage kopiert.","The public link \"%{linkName}\" has been copied to your clipboard.":"Der öffentliche Link \"%{linkName}\" wurde in die Zwischenablage kopiert.","There are no resources in this folder":"Dieser Ordner hat keinen Inhalt","There are no resources in this folder.":"Dieser Ordner hat keinen Inhalt.","There are no resources marked as favorite":"Nichts zum favorisieren ausgewählt","There are no resources with a public link at the moment":"Aktuell gibt es keine Dateien mit öffentlichen Links","this":"dies","This file has been shared.":"Diese Datei wurde geteilt.","This folder contains %{ itemCount } item.":["Dieser Ordner enthält %{ itemCount } Element.","Dieser Ordner enthält %{ itemCount } Elemente."],"This folder has been shared.":"Dieser Ordner wurde geteilt.","This folder has no content.":"Dieser Ordner ist leer.","This item is directly shared via links.":"Dieses Element wurde direkt über Links geteilt.","This item is directly shared with others.":"Dieses Element wurde direkt mit anderen Personen geteilt.","This item is shared via links through one of the parent folders.":"Dieses Element wurde durch einen übergeordneten Ordner über Links geteilt.","This item is shared with others through one of the parent folders.":"Dieses Element wurde durch einen übergeordneten Ordner mit anderen Personen geteilt.","This resource is password-protected.":"Diese Datei ist passwortgeschützt.","title":"Titel","Unknown Role":"Unbekannte Rolle","Unknown type":"Unbekannter Typ","Upload complete":"Hochladen abgeschlossen","Upload failed":"Hochladen fehlgeschlagen","Upload File":"Datei hochladen","Upload Folder":"Ordner hochladen","Upload of a folder is not supported in Internet Explorer.":"Das Hochladen eines Ordners wird im Internet Explorer nicht unterstützt.","Upload, edit, delete, download and preview":"Hochladen, Bearbeiten, Löschen, Herunterladen und Vorschau","Upload, edit, delete, download, preview and share":"Hochladen, Bearbeiten, Löschen, Herunterladen, Vorschau und Teilen","Uploader":"Nur hochladen","Uploading \"%{ fileName }\"":"Hochladen \"%{ fileName }\"","Uploading %{ count } item":["Hochladen von %{ count } Element","Hochladen von %{ count } Elementen"],"Uploading file \"%{fileName}\"":"Lade Datei \"%{ fileName }\" hoch","User":"Benutzer","Versions":"Versionen","Versions:":"Versionen:","Via %{folderName}":"Durch %{folderName}","View":"Ansicht","Viewer":"Betrachter","We went looking everywhere, but were unable to find the selected resource.":"Wir haben überall gesucht, konnten die ausgewählte Datei aber nicht finden.","You are currently not collaborating on any of your resources with other people":"Es sind keine Inhalte mit anderen Personen zur Zusammenarbeit geteilt","You are currently not collaborating on other people's resources":"Es gibt keine Einladungen zur Zusammenarbeit für Inhalte anderer Personen","You are the file owner":"Sie sind der Besitzer","You don't have permission to share this file.":"Keine Berechtigung diese Datei zu teilen.","You don't have permission to share this folder.":"Keine Berechtigung diesen Ordner zu teilen.","You have no deleted files":"Keine gelöschte Dateien","You have no permission to upload!":"Sie haben keine Berechtigung zum Hochladen!","You have not enough space left to upload!":"Sie haben zum Hochladen nicht genügend Speicherplatz zur Verfügung."},"es":{"(me)":"(yo)","%{ amount } selected item":["%{ amount } elemento seleccionado","%{ amount } elementos seleccionados"],"%{file} was restored successfully":"%{file} fue restaurado con éxito","%{file} was successfully deleted":"%{file} fue eliminado exitosamente","%{name} already exists":"%{name} ya existe","%{owner} shared this folder with you for uploading":"%{owner} compartió esta carpeta con usted para subir archivos.","Accept":"Aceptar","Actions":"Acciones","Advanced permissions":"Permisos avanzados","All files":"Todos los archivos","Allow creating":"Permitir crear","Allow deleting":"Permitir eliminar","Allow editing":"Permitir editar","An error occurred while loading the public link":"Se ha producido un error al cargar el enlace público","An error occurred while resolving the private link":"Un error ocurrió resolviendo el enlace privado ","Cancel":"Cancelar","Continue":"Continuar","Contributor":"Colaborador","Create":"Crear","Creating":"Creando","Creating file failed…":"Falló la creación de archivo...","Creating folder failed…":"Falló la creación de la carpeta...","Creating Public Link":"Creando Enlace Público","Decline":"Rechazar","Declined":"Rechazado","Delete":"Eliminar","Delete public link":"Eliminar enlace público","Deleted files":"Archivos borrados","Deletion of %{file} failed":"Borrado de %{file} falló","Do you want to create a new version?":"¿Quieres crear una nueva versión?","Do you want to overwrite it?":"¿Quieres sobreescribirlo?","Download":"Descargar","Download and preview":"Descargar y previsualizar","Drag and drop to upload content into current folder":"Arrastre y suelte para subir contenido a la carpeta actual","Drop files here to upload or click to select file":"Arrastra archivos aquí o haz clic para seleccionar un archivo","Edit public link":"Editar enlace público","Edit, download and preview":"Editar, descargar y previsualizar","Editor":"Editor","Empty trash bin":"Vaciar papelera","Error while deleting \"%{file}\"":"Error al eliminar \"%{file}\"","Error while deleting \"%{file}\" - the file is locked":"Error al eliminar \"%{file}\" - el archivo está bloqueado","Error while renaming \"%{file}\" to \"%{newName}\"":"Error al renombrar \"%{file}\" a \"%{newName}\"","Error while renaming \"%{file}\" to \"%{newName}\" - the file is locked":"Error al renombrar \"%{file}\" a \"%{newName}\" - el archivo está bloqueado","Error while sharing.":"Error al compartir","Expiration date":"Fecha de expiración","Expires %{expires}":"Expira %{expires}","Favorites":"Favoritos","File name":"Nombre de archivo","File name cannot be empty":"El nombre de archivo no puede ser vacío","File name cannot be equal to \"..\"":"El nombre de archivo no puede ser igual a \"..\"","File name cannot be equal to \".\"":"El nombre de archivo no puede ser igual a \".\"","File name cannot contain \"/\"":"El nombre del archivo no puede contener \"/\"","File name cannot end with whitespace":"El nombre del archivo no puede terminar con un espacio en blanco","File upload failed…":"La subida del archivo falló...","Files":"Archivos","Folder %{folder} already exists.":"La carpeta %{folder} ya existe.","Folder name":"Nombre de carpeta","Folder name cannot be empty":"El nombre de carpeta no puede ser vacío","Folder name cannot be equal to \"..\"":"El nombre de carpeta no puede ser igual a \"..\"","Folder name cannot be equal to \".\"":"El nombre de carpeta no puede ser igual a \".\"","Folder name cannot contain \"/\"":"El nombre de la carpeta no puede contener \"/\"","Folder name cannot end with whitespace":"El nombre de la carpeta no puede terminar con un espacio en blanco","Group":"Grupo","Hide Details":"Ocultar Detalles","Links":"Enlaces","Loading public link…":"Cargando enlace público...","Mail recipients":"Destinatarios de correo","msg":"msg","Name":"Nombre","New file":"Nuevo archivo","New folder":"Nueva carpeta","New folder…":"Nueva carpeta...","No public links":"Ningún enlace público","No Versions available for this file":"No hay versiones disponibles para este archivo","Owner":"Propietario","Password":"Contraseña","Password protected":"Protegido con contraseña","Pending":"Pendiente","Personal note":"Nota personal","Private Link":"Enlace Privado","Public Links":"Enlaces Públicos","Recipients can upload but existing contents are not revealed.":"Los receptores pueden subir archivos pero el contenido existente no será revelado.","Recipients can view and download contents.":"Los destinatarios pueden ver y descargar contenidos.","Recipients can view, download and upload contents.":"Los destinatarios pueden ver, descargar y cargar contenidos.","Recipients can view, download, edit, delete and upload contents.":"Los destinatarios pueden ver, descargar, editar, borrar y cargar contenidos.","Remove expiration date":"Eliminar fecha de vencimiento","Remove password":"Eliminar contraseña","Rename":"Renombrar","Rename file %{name}":"Renombrar archivo %{name}","Rename folder %{name}":"Renombrar carpeta %{name}","Resharer":"Recompartidor","Resolving private link…":"Resolviendo enlace privado...","Restoration of %{file} failed":"Restauración de %{file} falló","Restore":"Restaurar","Role":"Rol","Save":"Guardar","Save Share":"Guardar recurso compartido","Saving":"Guardando","Saving Public Link":"Guardar Enlace Público","Saving Share":"Guardando recurso compartido","Send a copy to myself":"Enviar una copia a mí mismo","Set detailed permissions":"Definir permisos detallados","Shared with me":"Compartido conmigo","Shared with others":"Compartido con otros","Show Details":"Mostrar Detalles","The name \"%{name}\" is already taken":"El nombre \"%{name}\" ya está tomado","The name cannot be equal to \"..\"":"El nombre no puede ser igual a \"..\"","The name cannot be equal to \".\"":"El nombre no puede ser igual a \".\"","The name cannot contain \"/\"":"El nombre no puede contener \"/\"","The name cannot end with whitespace":"El nombre no puede terminar con un espacio en blanco","The private link has been copied to your clipboard.":"El enlace privado ha sido copiado al portapapeles","There are no resources in this folder.":"No hay recursos en esta carpeta.","this":"esto","This resource is password-protected.":"Este recurso está protegido por contraseña.","title":"titulo","Unknown Role":"Rol desconocido","Upload complete":"Subida completa","Upload failed":"Subida fallida","Upload File":"Subir archivo","Upload Folder":"Subir carpeta","Upload of a folder is not supported in Internet Explorer.":"Subir carpetas no esta soportado en Internet Explorer","Upload, edit, delete, download and preview":"Subir, editar, eliminar, descargar y previsualizar","Uploader":"Cargador","Uploading \"%{ fileName }\"":"Subiendo \"%{ fileName }\"","Uploading %{ count } item":["Subiendo %{ count } ítems","Subiendo %{ count } ítems"],"Uploading file \"%{fileName}\"":"Subiendo archivo \"%{fileName}\"","User":"Usuario","Versions":"Versiones","Via %{folderName}":"A través de %{folderName}","Viewer":"Visor","You have no permission to upload!":"No tienes permisos para subir.","You have not enough space left to upload!":"No tiene suficiente espacio para subir."},"fr":{"(me)":"(moi)","(Opens in new window)":"(ouvre dans une nouvelle fenêtre)","%{ amount } selected item":["%{ amount } élément sélectionné","%{ amount } éléments sélectionnés"],"%{ foldersCount } folder":["%{ foldersCount } dossier","%{ foldersCount } dossiers"],"%{file} was restored successfully":"%{file} a été réstauré avec succès","%{file} was successfully deleted":"%{file} a été supprimé avec succès","%{name} already exists":"%{name} est déjà existant","%{owner} shared this folder with you for uploading":"%{owner} a partagé ce dossier avec vous pour uploader.","%{resource} was restored successfully":"%{resource} a été restauré avec succès","Accept":"Accepter","Accept share":"Accepter le partage","Accepted":"Accepté","action":"action","Actions":"Actions","Add files or folders":"Ajouter des fichiers ou des dossiers","Add people":"Ajouter des personnes ","Add to favorites":"Ajouter aux favoris","Adding People":"Ajout des personnes ","Advanced permissions":"Permissions avancées","All":"Tout","All Actions":"Toutes les actions","All deleted files were removed":"Tous les fichiers supprimés ont été retirés","All files":"Tous les fichiers","Allow creating":"Autoriser la création","Allow deleting":"Autoriser la suppression","Allow editing":"Autoriser les modifications","Allow sharing":"Autoriser le partage","An error occurred while copying %{resource}":"Une erreur est survenue lors de la copie de %{resource}","An error occurred while copying several resources":"Une erreur est survenue lors de la copie de plusieurs fichiers","An error occurred while loading the public link":"Une erreur est apparue lors du chargement du lien public","An error occurred while moving %{resource}":"Une erreur est survenue lors du déplacement de %{resource}","An error occurred while moving several resources":"Une erreur est survenue lors du déplacement de plusieurs fichiers","An error occurred while resolving the private link":"Une erreur est apparue lors de la résolution du lien privé","Are you sure you want to delete all selected resources?":"Êtes vous sûr de vouloir supprimer les ressources selectionnées?","Are you sure you want to delete all selected resources? All their content will be permanently removed. This action cannot be undone.":"Êtes-vous sûr de vouloir supprimer toutes les ressources sélectionnées ? Tout leur contenu sera définitivement supprimé. Cette action ne peut pas être annulée. ","Are you sure you want to delete this file?":"Êtes-vous sûr de vouloir supprimer \"%{file}\"?","Are you sure you want to delete this file? All it’s content will be permanently removed. This action cannot be undone.":"Êtes-vous sûr de vouloir supprimer ce fichier ? Tout son contenu sera supprimé de manière permanente. Cette action ne peut pas être annulée.","Are you sure you want to delete this folder?":"Êtes-vous sûr de vouloir supprimer ce dossier?","Are you sure you want to delete this folder? All it’s content will be permanently removed. This action cannot be undone.":"Êtes-vous sûr de vouloir supprimer ce dossier? Tout son contenu sera supprimé de manière permanente. Cette action ne peut pas être annulée.","Cancel":"Annuler","Clear selection":"Annuler la sélection","Confirm":"Confirmer","Continue":"Continuer","Contributor":"Contributeur","Copy":"Copier","Could not delete files":"Impossible de supprimer les fichiers","Create":"Créer","Create a new file":"Créer un nouveau fichier...","Create a new folder":"Créer un nouveau dossier...","Create and copy public link":"Créer et copier un nouveau lien public","Create new public link":"Créer un nouveau lien public","Creating":"Création en cours","Creating file failed…":"Echec de création de fichier...","Creating folder failed…":"Echec de création de dossier...","Creating Public Link":"Création lien public","Decline":"Décliner","Decline share":"Refuser le partage","Declined":"Décliné","Delete":"Supprimer","Delete file %{name}":"Supprimer le fichier %{name}","Delete folder %{name}":"Supprimer le dossier %{name}","Delete public link":"Supprimer lien public","Delete selected resource?":[" Supprimer la ressource sélectionnée?"," Supprimer les %{amount} ressources sélectionnées?"],"Deleted files":"Fichiers supprimés","Deletion of %{file} failed":"Echec de la suppression de %{file}","Details":"Détails","Do you want to create a new version?":"Voulez-vous creer une nouvelle version ?","Do you want to overwrite it?":"Voulez-vous l'écraser ?","Download":"Télécharger","Download and preview":"Téléchargé et visualiser","Download, preview and share":"Téléchargé, visualiser et partager","Drag and drop to upload content into current folder":"Glisser et déplacer pour uploader du contenu dans le dossier courant","Drag files and folders here or use the \"+ New\" button to upload":"Glissez des fichiers ou dossiers ici ou utilisez le bouton \"+ Nouveau\" pour en ajouter.","Drop files here to upload or click to select file":"Déposer des fichiers ici pour uploader ou cliquer pour sélectionner des fichiers","Edit public link":"Editer lien public","Edit, download and preview":"Modifier, télécharger et visualiser","Edit, download, preview and share":"Modifier, téléchargé, visualiser et partager","Editor":"Éditeur","Empty trash bin":"Vider la corbeille","Enter password for public link":"Entrer le mot de passe du lien public","Error while deleting \"%{file}\"":"Erreur lors de la suppression de \"%{file}\"","Error while deleting \"%{file}\" - the file is locked":"Erreur lors de la suppression de \"%{file}\" - le fichier est verrouillé","Error while renaming \"%{file}\" to \"%{newName}\"":"Erreur lors du renommage de \"%{file}\" en \"%{newName}\"","Error while renaming \"%{file}\" to \"%{newName}\" - the file is locked":"Erreur lors du renommage de \"%{file}\" en \"%{newName}\" - le fichier est verrouillé","Error while sharing.":"Erreur apparue lors du partage.","Expiration date":"Date d'éxpiration","Expiration date (required)":"Date d'expiration (obligatoire)","Expires %{expires}":"Expire le %{expires}","Favorite files":"Fichiers favoris","Favorites":"Favoris","File name":"Nom de fichier","File name cannot be empty":"Nom de fichier ne peut pas être vide","File name cannot be equal to \"..\"":"Le nom du fichier ne peut pas être \"..\"","File name cannot be equal to \".\"":"Le nom du fichier ne peut pas être \".\"","File name cannot contain \"/\"":"Le nom du fichier ne peut pas contenir \"/\"","File name cannot end with whitespace":"Le nom du fichier ne peut pas se terminer avec un espace","File owner":"Propriétaire du fichier","File upload failed…":"Échec d'upload du fichier...","Files":"Fichiers","Files shared with me":"Fichiers partagés avec moi","Files shared with others":"Fichiers partagés avec d'autres personnes","Folder %{folder} already exists.":"Dossier %{folder} existe déjà","Folder name":"Nom de dossier","Folder name cannot be empty":"Nom de dossier ne peut pas être vide","Folder name cannot be equal to \"..\"":"Le nom du dossier ne peut pas être \"..\"","Folder name cannot be equal to \".\"":"Le nom du dossier ne peut pas être \".\"","Folder name cannot contain \"/\"":"Le nom du dossier ne peut pas contenir \"/\"","Folder name cannot end with whitespace":"Le nom du dossier ne peut pas se terminer avec un espace","Go to »All files«":"Aller à »All files« ","Group":"Groupe","Guest":" Invité","Guest user":"Utilisateur invité","Hide Details":"Masquer les détails","Incorrect password":"Mot de passe incorrect","Items per page":"Éléments par page","Last modified:":"Dernière modification le :","Links":"Liens","Loading public link…":"Chargement du lien public...","Mail recipients":"Destinataires","Move":{"Action in the files list row to initiate move of a single resource":"Déplacer","":"Déplacer"},"Move here":{"Confirm action in the location picker for move":"Déplacer ici"},"msg":"msg","Name":"Nom","New":"Nouveau","New file":"Nouveau fichier","New folder":"Nouveau dossier","New folder…":"Nouveau dossier...","No public links":"Aucun lien public","No Versions available for this file":"Aucune version n'existe pour ce fichier","Only invited people can use this link.":"Seuls les personnes invités peuvent utiliser ce lien.","Open folder":{"Action in the files list row to open a folder":"Ouvrir le dossie"},"Open in %{app}":"Ouvrir avec %{app}","Open in browser":"Ouvrir dans le navigateur","Overwrite":"Écraser","Owner":"Propriétaire","Owner:":"Propriétaire :","Password":"Mot de passe","Password (required)":"Mot de passe (obligatoire)","Password protected":"Protégé par mot de passe","Paste here":{"Confirm action in the location picker for copy":"Coller ici"},"Pending":"En attente","Permanently delete folder %{name}":" Supprimer définitivement le dossier %{name}","Permanently delete selected resource?":["Supprimer définitivement la ressource sélectionnée ?"," Supprimer définitivement les %{amount} ressources sélectionnées?"],"Person was added":"Une personne a été ajoutée","Personal note":"Note personnelle","Please, accept this share first to display available actions":"S’il vous plaît, acceptez ce partage pour afficher les actions disponibles ","Private Link":"Lien privé","Private link copied":"Lien privé copié","Public files":"Fichiers publics","Public link":"Lien public","Public link created":"Lien public créé","Public Links":"Liens publics","Recipients can upload but existing contents are not revealed.":"Destinataires peuvent uploader mais le contenu existant n'est pas visible.","Recipients can view and download contents.":"Destinataires peuvent lister et télécharger le contenu.","Recipients can view, download and upload contents.":"Destinataires peuvent lister, télécharger et uploader du contenu.","Recipients can view, download, edit, delete and upload contents.":"Destinataires peuvent lister, télécharger, modifier, supprimer et uploader du contenu.","Reload public link":"Recharger le lien public","Remote user":"Utilisateur distant","Remove expiration date":"Supprimer date d'expiration","Remove from favorites":"Retirer des favoris","Remove password":"Supprimer mot de passe","Removing public link":"Supprimer le lien public","Rename":"Renommer","Rename file %{name}":"Renommer fichier %{name}","Rename folder %{name}":"Renommer dossier %{name}","Resharer":"Partageur","Resolving private link…":"Résolution du lien privé...","Resource not found":" Ressource introuvable ","Restoration of %{file} failed":"Échec de restauration du fichier %{file}","Restore":"Restaurer","Restore older version":"Restaurer une ancienne version","Role":"Role","Save":"Sauvegarder","Save Share":"Enregistrer partage","Saving":"Sauvegarde en cours","Saving Public Link":"Enregistrement lien public","Saving Share":"Enregistrement partage","Send a copy to myself":"M'envoyer une copie","Set detailed permissions":"Définir des permissions détaillées","Share":"Partager","Shared by":"Partagé par","Shared by %{resharer}":"Partagé par %{resharer}","Shared with me":"Partagé avec moi","Shared with others":"Partagé avec autres","Show Details":"Afficher les détails","Show hidden files":"Afficher les fichiers masqués","Show links":"Afficher les liens","Size:":"Taille :","Tags":"Étiquettes","The name \"%{name}\" is already taken":"Le nom \"%{name}\" existe déjà","The name cannot be empty":"Le nom ne peut pas être vide","The name cannot be equal to \"..\"":"Le nom ne peut pas être \"..\"","The name cannot be equal to \".\"":"Le nom ne peut pas être \".\"","The name cannot contain \"/\"":"Le nom ne peut pas contenir \"/\"","The name cannot end with whitespace":"Le nom ne peut pas finir avec un espace","The private link has been copied to your clipboard.":"Le lien privé a été copié dans le presse-papier.","There are no resources in this folder.":"Il n'y a aucune ressource dans ce dossier","This folder contains %{ itemCount } item.":["Ce dossier contient %{ itemCount } élément.","Ce dossier contient %{ itemCount } éléments."],"This folder has been shared.":"Ce dossier est partagé.","This folder has no content.":"Ce dossier est vide.","This resource is password-protected.":"Cette resource est protégée par mot de passe.","title":"titre","Unknown Role":"Role inconnu","Unknown type":"Type inconnu","Upload complete":"Upload terminé","Upload failed":"Upload a échoué","Upload File":"Uploader un Fichier","Upload Folder":"Uploader un Dossier","Upload of a folder is not supported in Internet Explorer.":"Upload de dossier n'est pas supporté sur Internet Explorer.","Upload, edit, delete, download and preview":"Uploader, modifier, supprimer, télécharger et visualiser","Upload, edit, delete, download, preview and share":"Uploader, modifier, supprimer, télécharger, visualiser et partager","Uploader":"Uploadeur","Uploading %{ count } item":["Upload fichier \"%{fileName}\"","Upload %{ count } entrées"],"Uploading file \"%{fileName}\"":"Upload fichier \"%{fileName}\"","User":"Utilisateur","Versions":"Versions","Versions:":"Versions :","Via %{folderName}":"Via %{folderName}","Viewer":"Visionneur","We went looking everywhere, but were unable to find the selected resource.":"Nous avons cherché partout, mais nous n’avons pas pu trouver la ressource sélectionnée.","You don't have permission to share this file.":"Vous n'avez pas la permission de partager ce fichier.","You don't have permission to share this folder.":"Vous n'avez pas la permission de partager ce dossier.","You have no permission to upload!":"Vous n'avez pas la permission d'uploader !","You have not enough space left to upload!":"Vous n'avec pas assez d'espace disponible pour uploader !"},"gl":{"(me)":"(eu)","%{ amount } selected item":["%{ amount } elemento seleccionado","%{ amount } elementos seleccionados"],"%{ amount } selected item - %{ size }":["%{ amount } elemento seleccionado - %{ size }","%{ amount } elementos seleccionados - %{ size }"],"%{count} resource could not be copied":["Non foi posíbel copiar %{count} recurso","Non foi posíbel copiar %{count} recursos"],"%{count} resource could not be moved":["Non foi posíbel mover %{count} recurso","Non foi posíbel mover %{count} recursos"],"%{file} was restored successfully":"%{file} foi restaurado satisfactoriamente","%{file} was successfully deleted":"%{file} foi eliminado satisfactoriamente","%{name} already exists":"%{name} xa existe","%{owner} shared this folder with you for uploading":"%{owner} compartiu este cartafol con vostede para envialo","Accept":"Aceptar","Accepted":"Aceptado","Actions":"Accións","Add people":"Engadir xente","Adding People":"Engadindo xente","Additional permissions":"Permisos adicionais","Advanced permissions":"Permisos avanzados","All deleted files were removed":"Retiráronse todos os ficheiros eliminados","All files":"Todos os ficheiros","Allow creating":"Permitir crear","Allow deleting":"Permitir eliminar","Allow editing":"Permitir editar","Allow sharing":"Permitir compartir","An error occurred while copying %{resource}":"Produciuse un erro ao copiar %{resource}","An error occurred while copying several resources":"Produciuse un erro ao copiar varios recursos","An error occurred while loading the public link":"Produciuse un erro ao cargar a ligazón pública","An error occurred while moving %{resource}":"Produciuse un erro ao mover %{resource}","An error occurred while moving several resources":"Produciuse un erro ao mover varios recursos","An error occurred while resolving the private link":"Produciuse un erro ao resolver a ligazón privada","Are you sure you want to delete all selected resources?":"Confirma que quere eliminar todos os recursos seleccionados?","Are you sure you want to delete all selected resources? All their content will be permanently removed. This action cannot be undone.":" \nConfirma que quere eliminar todos os recursos seleccionados? Todo o seu contido eliminarase definitivamente. Esta acción non se pode desfacer.","Are you sure you want to delete this file?":"Confirma que quere eliminar este ficheiro?","Are you sure you want to delete this file? All it’s content will be permanently removed. This action cannot be undone.":"Confirma que quere eliminar este ficheiro? Todo o seu contido eliminarase definitivamente. Esta acción non se pode desfacer.","Are you sure you want to delete this folder?":"Confirma que quere eliminar este cartafol?","Are you sure you want to delete this folder? All it’s content will be permanently removed. This action cannot be undone.":"Confirma que quere eliminar este cartafol? Todo o seu contido eliminarase definitivamente. Esta acción non se pode desfacer.","Cancel":"Cancelar","Clear selection":"Limpar a selección","Confirm":"Confirmar","Continue":"Continuar","Contributor":"Colaborador","Copy":"Copiar","Could not delete files":"Non foi posíbel eliminar os ficheiros","Create":"Crear","Create a new file":"Crear un novo ficheiro","Create a new folder":"Crear un novo cartafol","Create and copy public link":"Crear e copiar unha ligazón pública","Create new public link":"Crear unha nova ligazón pública","Creating":"Creando","Creating file failed…":"Produciuse un fallo ao crear o ficheiro…","Creating folder failed…":"Produciuse un fallo ao crear o cartafol…","Creating Public Link":"Creando a ligazón pública","Decline":"Declinar","Declined":"Declinada","Delete":"Eliminar","Delete file %{name}":"Eliminar o ficheiro %{name}","Delete folder %{name}":"Eliminar o cartafol %{name}","Delete public link":"Eliminar ligazón pública","Delete selected resource?":["Eliminar o recurso seleccionado?","Eliminar os %{amount} recursos seleccionados?"],"Deleted files":"Ficheiros eliminados","Deletion of %{file} failed":"Produciuse un fallo ao eliminar %{file}","Do you want to create a new version?":"Quere crear unha nova versión?","Do you want to overwrite it?":"Quere sobrescribilo?","Download":"Descargar","Download and preview":"Descargar e visionar","Download, preview and share":"Descargar e visionar e compartir","Drag and drop to upload content into current folder":"Arrastre e solte para enviar contido ao cartafol actual","Drop files here to upload or click to select file":"Solte os ficheiros aquí para envialos ou prema para seleccionar ficheiro","Edit public link":"Editar ligazón pública","Edit, download and preview":"Editar, descargar e visionar","Edit, download, preview and share":"Editar, descargar e visionar e compartir","Editor":"Editor","Empty trash bin":"Cesto do lixo baleiro","Enter password for public link":"Introduza o contrasinal para a ligazón pública","Error while deleting \"%{file}\"":"Produciuse un erro ao eliminar «%{file}»","Error while deleting \"%{file}\" - the file is locked":"Produciuse un erro ao eliminar «%{file}» — o ficheiro está bloqueado","Error while renaming \"%{file}\" to \"%{newName}\"":"Produciuse un erro ao cambiar o nome de «%{file}« a «%{newName}»","Error while renaming \"%{file}\" to \"%{newName}\" - the file is locked":"Produciuse un erro ao cambiar o nome de «%{file}« a «%{newName}» — o ficheiro está bloqueado","Error while sharing.":"Produciuse un erro durante a compartición.","Error while starring \"%{file}\"":"Produciuse un erro ao destacar «%{file}»","Expiration date":"Data de caducidade","Expires %{expires}":"Caduca %{expires}","Favorites":"Favoritos","File %{file} already exists":"Xa existe o ficheiro %{file}","File name":"Nome de ficheiro","File name cannot be empty":"O nome do ficheiro non pode estar baleiro","File name cannot be equal to \"..\"":"O nome do ficheiro non pode ser igual a «..»","File name cannot be equal to \".\"":"O nome do ficheiro non pode ser igual a «.»","File name cannot contain \"/\"":"O nome do ficheiro non pode conter unha «/»","File name cannot end with whitespace":"O nome do ficheiro non pode rematar cun espazo en branco","File upload failed…":"Produciuse un fallo ao enviar o ficheiro…","Files":"Ficheiros","Folder %{folder} already exists.":"Xa existe o cartafol %{folder}.","Folder name":"Nome do cartafol","Folder name cannot be empty":"O nome do cartafol non pode estar baleiro","Folder name cannot be equal to \"..\"":"O nome do cartafol non pode ser igual a «..»","Folder name cannot be equal to \".\"":"O nome do cartafol non pode ser igual a «.»","Folder name cannot contain \"/\"":"O nome do cartafol non pode conter unha «/»","Folder name cannot end with whitespace":"O nome do cartafol non pode rematar cun espazo en branco","Go to »All files«":"Ir a «Todos os ficheiros»","Group":"Grupo","Guest":"Convidado","Hide Details":"Agochar os detalles","Incorrect password":"Contrasinal incorrecta","Links":"Ligazóns","Loading public link…":"Cargando a ligazón pública…","Mail recipients":"Destinatarios de correo","Move":{"Action in the files list row to initiate move of a single resource":"Mover","":"Mover"},"Move here":{"Confirm action in the location picker for move":"Mover aquí"},"msg":"msx","Multiple files already exists":"Xa existen varios ficheiros","Name":"Nome","Navigate to the parent":"Navegar ata o pai","New":"Novo","New file":"Novo ficheiro","New folder":"Novo cartafol","New folder…":"Novo cartafol…","No public links":"Non hai ligazóns públicas","No Versions available for this file":"Non hai versións dispoñíbeis para este ficheiro","Only invited people can use this link.":"Só as persoas convidadas poden usar esta ligazón.","Open folder":{"Action in the files list row to open a folder":"Abrir cartafol"},"Open in browser":"Abrir no navegador","Overwrite":"Sobreescribir","Owner":"Propietario","Password":"Contrasinal","Password protected":"Protexido por contrasinal","Paste here":{"Confirm action in the location picker for copy":"Pegar aquí"},"Pending":"Pendente","People":"Xente","Permanently delete file %{name}":"Eliminar de xeito permanente o ficheiro %{name}","Permanently delete folder %{name}":"Eliminar de xeito permanente o cartafol %{name}","Permanently delete selected resource?":["Eliminar de xeito permanente o recurso seleccionado?","Eliminar de xeito permanente os %{amount} recursos seleccionados?"],"Person was added":"Engadiuse a persoa","Personal note":"Nota persoal","Please, accept this share first to display available actions":"Acepte primeiro esta compartición para amosar as accións dispoñíbeis","Private Link":"Ligazón privada","Public link":"Ligazón pública","Public link created":"Creouse unha ligazón pública","Public link has been successfully created and copied into your clipboard.":"A ligazón pública foi creada e copiada satispactoriamente no portapapeis.","Public Links":"Ligazóns públicas","Recipients can upload but existing contents are not revealed.":"Os destinatarios poden enviar, mais non se revelan os contidos existentes.","Recipients can view and download contents.":"Os destinatarios poden ver e descargar contidos.","Recipients can view, download and upload contents.":"Os destinatarios poden ver, descargar e enviar contidos.","Recipients can view, download, edit, delete and upload contents.":"Os destinatarios poden ver, descargar, editar, eliminar e enviar contidos.","Reload public link":"Volvendo cargar a ligazón pública","Remote user":"Usuario remoto","Remove expiration date":"Retirar a data de caducidade","Remove password":"Retirar o contrasinal","Rename":"Renomear","Rename file %{name}":"Renomear o ficheiro %{name}","Rename folder %{name}":"Renomear o cartafol %{name}","Resharer":"Volver compartir","Resolving private link…":"Resolvendo a ligazón privada…","Resource not found":"Non se atopou o recurso","Resource with name %{name} already exists":"Xa existe o frecurso nome %{name}","Restoration of %{file} failed":"Produciuse un fallo ao restaurar %{file}","Restore":"Restaurar","Role":"Rol","Save":"Gardar","Save Share":"Gardar a compartición","Saving":"Gardando","Saving Public Link":"Gardando ligazón pública","Saving Share":"Gardando compartición","Send a copy to myself":"Envíame unha copia","Set detailed permissions":"Estabelecer os permisos detallados","Share":"Compartir","Shared by %{resharer}":"Compartido por %{resharer}","Shared with me":"Compartido comigo","Shared with others":"Compartido con outros","Show Details":"Amosar os detalles","The name \"%{name}\" is already taken":"O nome «%{name}» xa está ocupado","The name cannot be empty":"O nome non pode estar baleiro","The name cannot be equal to \"..\"":"O nome non pode ser igual a «..»","The name cannot be equal to \".\"":"O nome non pode ser igual a «.»","The name cannot contain \"/\"":"O nome non pode conter unha «/»","The name cannot end with whitespace":"O nome non pode rematar cun espazo en branco","The private link has been copied to your clipboard.":"A ligazón privada foi copiada no portapapeis.","There are no resources in this folder.":"Non hai recursos neste cartafol.","this":"este","This resource is password-protected.":"Este recurso está protexido por contrasinal.","title":"título","Unknown Role":"Rol descoñecido","Unknown type":"Tipo descoñecido","Upload complete":"Envío completado","Upload failed":"Produciuse un fallo no envío","Upload File":"Enviar ficheiro","Upload Folder":"Enviar cartafol","Upload of a folder is not supported in Internet Explorer.":"O envío dun cartafol non é compatíbel co Internet Explorer.","Upload, edit, delete, download and preview":"Enviar, editar, eliminar, descargar e visionar","Upload, edit, delete, download, preview and share":"Enviar, editar, eliminar, descargar visionar e compartir","Uploader":"Xestor de envíos","Uploading \"%{ fileName }\"":"Enviando «%{ fileName }»","Uploading %{ count } item":["Enviando %{ count } elemento","Enviando %{ count } elementos"],"Uploading file \"%{fileName}\"":"Enviando o ficheiro «%{fileName}»","User":"Usuario","Versions":"Versións","Via %{folderName}":"Mediante %{folderName}","Viewer":"Visor","We went looking everywhere, but were unable to find the selected resource.":"Buscamos por todas partes, mais non puidemos atopar o recurso seleccionado.","You don't have permission to share this file.":"Non ten permiso para compartir este ficheiro.","You don't have permission to share this folder.":"Non ten permiso para compartir este cartafol.","You have no permission to upload!":"Non ten permiso para facer envíos!","You have not enough space left to upload!":"Non dispón de espazo abondo para facer un envío!"},"it":{}}
\ No newline at end of file
diff --git a/packages/web-app-files/package.json b/packages/web-app-files/package.json
index c587904de2e..8eb24e03362 100644
--- a/packages/web-app-files/package.json
+++ b/packages/web-app-files/package.json
@@ -7,6 +7,7 @@
"copy-to-clipboard": "^3.3.1",
"filesize": "^6.4.0",
"filter-obj": "^2.0.1",
+ "fuse.js": "^6.4.6",
"lodash-es": "^4.17.21",
"p-queue": "^6.6.2",
"query-string": "^6.8.3",
diff --git a/packages/web-app-files/src/components/AppBar/AppBar.vue b/packages/web-app-files/src/components/AppBar/AppBar.vue
index 47462e8ce6f..eed17714793 100644
--- a/packages/web-app-files/src/components/AppBar/AppBar.vue
+++ b/packages/web-app-files/src/components/AppBar/AppBar.vue
@@ -141,7 +141,7 @@ export default {
computed: {
...mapGetters(['getToken', 'configuration', 'newFileHandlers', 'quota', 'user']),
...mapGetters('Files', [
- 'activeFiles',
+ 'files',
'inProgress',
'currentFolder',
'davProperties',
@@ -397,7 +397,7 @@ export default {
return this.$gettext('Folder name cannot end with whitespace')
}
- const exists = this.activeFiles.find(file => file.name === folderName)
+ const exists = this.files.find(file => file.name === folderName)
if (exists) {
const translated = this.$gettext('%{name} already exists')
@@ -486,7 +486,7 @@ export default {
return this.$gettext('File name cannot end with whitespace')
}
- const exists = this.activeFiles.find(file => file.name === fileName)
+ const exists = this.files.find(file => file.name === fileName)
if (exists) {
const translated = this.$gettext('%{name} already exists')
diff --git a/packages/web-app-files/src/components/FilesList/ContextActions.vue b/packages/web-app-files/src/components/FilesList/ContextActions.vue
index 9100a4fdf65..f0a34e2a660 100644
--- a/packages/web-app-files/src/components/FilesList/ContextActions.vue
+++ b/packages/web-app-files/src/components/FilesList/ContextActions.vue
@@ -1,21 +1,28 @@
+
+
+
+
+
diff --git a/packages/web-app-search/tests/unit/portals/SearchBar.spec.ts b/packages/web-app-search/tests/unit/portals/SearchBar.spec.ts
new file mode 100644
index 00000000000..8819251b744
--- /dev/null
+++ b/packages/web-app-search/tests/unit/portals/SearchBar.spec.ts
@@ -0,0 +1,513 @@
+import { Wrapper, mount, createLocalVue } from '@vue/test-utils'
+import DesignSystem from 'owncloud-design-system'
+import SearchBar from '../../../src/portals/SearchBar.vue'
+import AsyncComputed from 'vue-async-computed'
+import merge from 'lodash-es/merge'
+
+const localVue = createLocalVue()
+localVue.use(DesignSystem)
+localVue.use(AsyncComputed)
+
+let wrapper: Wrapper
+
+const dummyProviderOne = {
+ id: 'dummy.one',
+ label: 'dummy.one.label',
+ available: true,
+ reset: jest.fn(),
+ updateTerm: jest.fn(),
+ activate: jest.fn(),
+ previewSearch: {
+ available: true,
+ search: jest.fn(),
+ activate: jest.fn()
+ }
+}
+
+const dummyProviderTwo = {
+ id: 'dummy.two',
+ label: 'dummy.two.label',
+ available: true,
+ reset: jest.fn(),
+ updateTerm: jest.fn(),
+ activate: jest.fn()
+}
+
+const searchEventOptions = {
+ path: [{ id: 'files-global-search-bar' }]
+}
+
+beforeEach(() => {
+ jest.resetAllMocks()
+})
+
+afterEach(() => {
+ wrapper.destroy()
+})
+
+describe('Search Bar portal component', () => {
+ test('does not render a search field if not all requirements are fulfilled', () => {
+ wrapper = mount(SearchBar, { localVue })
+ expect(wrapper.element.innerHTML).toBeFalsy()
+ })
+ test('updates the search term on input', async () => {
+ wrapper = mount(SearchBar, {
+ localVue,
+ data() {
+ return {
+ optionsVisible: true,
+ term: 'old',
+ activeProvider: dummyProviderOne,
+ providerStore: {
+ availableProviders: [dummyProviderOne]
+ }
+ }
+ }
+ })
+ expect(wrapper.vm.$data.term).toBe('old')
+ await wrapper.find('input').setValue('new')
+ expect(wrapper.vm.$data.term).toBe('new')
+ })
+ test('the active provider get reset on route change', () => {
+ wrapper = mount(SearchBar, {
+ localVue,
+ data() {
+ return {
+ activeProvider: { available: false }
+ }
+ },
+ mocks: {
+ $route: {
+ name: 'old'
+ }
+ }
+ })
+
+ expect(wrapper.vm.$data.activeProvider).toBeTruthy()
+ ;(wrapper.vm.$options.watch.$route as any).call(wrapper.vm)
+ expect(wrapper.vm.$data.activeProvider).toBeFalsy()
+ })
+ test('notifies active provider to update term on input', async () => {
+ wrapper = mount(SearchBar, {
+ localVue,
+ data() {
+ return {
+ optionsVisible: true,
+ term: 'old',
+ activeProvider: dummyProviderOne,
+ providerStore: {
+ availableProviders: [dummyProviderOne]
+ }
+ }
+ }
+ })
+ await wrapper.find('input').setValue('new')
+ expect(dummyProviderOne.updateTerm).toBeCalledTimes(1)
+ expect(dummyProviderOne.updateTerm).toBeCalledWith('new')
+ })
+ test('hides options on clear', async () => {
+ wrapper = mount(SearchBar, {
+ localVue,
+ data() {
+ return {
+ optionsVisible: true,
+ term: 'old',
+ activeProvider: dummyProviderOne,
+ providerStore: {
+ availableProviders: [dummyProviderOne]
+ }
+ }
+ }
+ })
+ expect(wrapper.find('#files-global-search-options').exists()).toBeTruthy()
+ await wrapper.find('input').setValue('new')
+ await wrapper.find('.oc-search-clear').trigger('click')
+ expect(wrapper.find('#files-global-search-options').exists()).toBeFalsy()
+ })
+ test('resets term on clear', async () => {
+ wrapper = mount(SearchBar, {
+ localVue,
+ data() {
+ return {
+ optionsVisible: true,
+ term: 'old',
+ activeProvider: dummyProviderOne,
+ providerStore: {
+ availableProviders: [dummyProviderOne]
+ }
+ }
+ }
+ })
+ await wrapper.find('input').setValue('new')
+ await wrapper.find('.oc-search-clear').trigger('click')
+ expect(wrapper.vm.$data.term).toBeFalsy()
+ })
+ test('notifies active provider to reset on clear', async () => {
+ wrapper = mount(SearchBar, {
+ localVue,
+ data() {
+ return {
+ optionsVisible: true,
+ term: 'old',
+ activeProvider: dummyProviderOne,
+ providerStore: {
+ availableProviders: [dummyProviderOne]
+ }
+ }
+ }
+ })
+ await wrapper.find('input').setValue('new')
+ await wrapper.find('.oc-search-clear').trigger('click')
+ expect(dummyProviderOne.reset).toBeCalledTimes(1)
+ })
+ test('hides options if no term given', async () => {
+ wrapper = mount(SearchBar, {
+ localVue,
+ data() {
+ return {
+ optionsVisible: true,
+ term: 'old',
+ activeProvider: dummyProviderOne,
+ providerStore: {
+ availableProviders: [dummyProviderOne]
+ }
+ }
+ }
+ })
+ expect(wrapper.find('#files-global-search-options').exists()).toBeTruthy()
+ await wrapper.find('input').setValue('')
+ expect(wrapper.find('#files-global-search-options').exists()).toBeFalsy()
+ })
+ test('shows options only if optionsVisible is true and a search term is given', async () => {
+ wrapper = mount(SearchBar, {
+ localVue,
+ data() {
+ return {
+ optionsVisible: false,
+ term: undefined,
+ activeProvider: dummyProviderOne,
+ providerStore: {
+ availableProviders: [dummyProviderOne]
+ }
+ }
+ }
+ })
+ expect(wrapper.find('#files-global-search-options').exists()).toBeFalsy()
+ await wrapper.setData({ optionsVisible: true })
+ expect(wrapper.find('#files-global-search-options').exists()).toBeFalsy()
+ await wrapper.setData({ term: 'defined' })
+ expect(wrapper.find('#files-global-search-options').exists()).toBeTruthy()
+ })
+ test('lists all available providers', async () => {
+ wrapper = mount(SearchBar, {
+ localVue,
+ data() {
+ return {
+ optionsVisible: true,
+ term: 'old',
+ activeProvider: dummyProviderOne,
+ providerStore: {
+ availableProviders: [dummyProviderOne]
+ }
+ }
+ }
+ })
+ expect(wrapper.findAll('li.provider').length).toBe(1)
+ await wrapper.setData({
+ providerStore: {
+ availableProviders: [dummyProviderOne, dummyProviderTwo]
+ }
+ })
+ expect(wrapper.findAll('li.provider').length).toBe(2)
+ })
+ test('marks the active provider as selected', () => {
+ wrapper = mount(SearchBar, {
+ localVue,
+ data() {
+ return {
+ optionsVisible: true,
+ term: 'old',
+ activeProvider: dummyProviderTwo,
+ providerStore: {
+ availableProviders: [dummyProviderOne, dummyProviderTwo]
+ }
+ }
+ }
+ })
+ const providers = wrapper.findAll('li.provider')
+ expect(providers.at(0).classes()).not.toContain('selected')
+ expect(providers.at(1).classes()).toContain('selected')
+ })
+ test('activates the provider by clicking the list item', async () => {
+ wrapper = mount(SearchBar, {
+ localVue,
+ data() {
+ return {
+ optionsVisible: true,
+ term: 'old',
+ providerStore: {
+ availableProviders: [dummyProviderOne, dummyProviderTwo]
+ }
+ }
+ }
+ })
+ const providers = wrapper.findAll('li.provider')
+ await providers.at(0).trigger('click')
+ expect(dummyProviderOne.activate).toBeCalledTimes(1)
+ expect(dummyProviderOne.activate).toBeCalledWith('old')
+ })
+ test('shows and truncates the search term on providers list item', async () => {
+ wrapper = mount(SearchBar, {
+ localVue,
+ data() {
+ return {
+ optionsVisible: true,
+ term: 'old',
+ activeProvider: dummyProviderOne,
+ providerStore: {
+ availableProviders: [dummyProviderOne, dummyProviderTwo]
+ }
+ }
+ }
+ })
+ const providers = wrapper.findAll('li.provider')
+ expect(providers.length).toBe(2)
+ await wrapper.find('input').setValue('oldoldoldoldoldoldoldoldoldoldo')
+ for (let i = 0; i < providers.length; i++) {
+ expect(providers.at(i).get('.term').element.innerHTML).toBe('oldoldoldoldoldoldoldoldold...')
+ }
+ })
+ test('provider label is displayed as tag in provider list item', () => {
+ wrapper = mount(SearchBar, {
+ localVue,
+ data() {
+ return {
+ optionsVisible: true,
+ term: 'old',
+ activeProvider: dummyProviderOne,
+ providerStore: {
+ availableProviders: [dummyProviderOne, dummyProviderTwo]
+ }
+ }
+ }
+ })
+ const providers = wrapper.findAll('li.provider')
+ expect(providers.at(0).get('.label').element.innerHTML).toBe(dummyProviderOne.label)
+ expect(providers.at(1).get('.label').element.innerHTML).toBe(dummyProviderTwo.label)
+ })
+ test.todo('shows a loading spinner if the active provider is loading')
+ test('shows the preview search result from the active provider only if the provider preview is available', async () => {
+ wrapper = mount(SearchBar, {
+ localVue,
+ data() {
+ return {
+ optionsVisible: true,
+ term: 'old',
+ activeProvider: merge({}, dummyProviderOne, {
+ previewSearch: {
+ available: false
+ }
+ }),
+ providerStore: {
+ availableProviders: [dummyProviderOne, dummyProviderTwo]
+ }
+ }
+ }
+ })
+ await wrapper.find('input').setValue('new')
+ expect(dummyProviderOne.previewSearch.search).toBeCalledTimes(0)
+ })
+ test('shows the preview search result from the active provider', async () => {
+ wrapper = mount(SearchBar, {
+ localVue,
+ data() {
+ return {
+ optionsVisible: true,
+ term: 'old',
+ activeProvider: dummyProviderOne,
+ providerStore: {
+ availableProviders: [dummyProviderOne, dummyProviderTwo]
+ }
+ }
+ }
+ })
+ dummyProviderOne.previewSearch.search.mockReturnValueOnce([
+ { id: 'dummyProviderOne.1', data: 'dummyProviderOne - 1' },
+ { id: 'dummyProviderOne.2', data: 'dummyProviderOne - 2' }
+ ])
+ expect(wrapper.findAll('li.preview').length).toBe(0)
+ await wrapper.find('input').setValue('new')
+ await wrapper.vm.$nextTick()
+ expect(wrapper.findAll('li.preview').length).toBe(2)
+ })
+ test('activate a preview by clicking it', async () => {
+ wrapper = mount(SearchBar, {
+ localVue,
+ data() {
+ return {
+ optionsVisible: true,
+ term: 'old',
+ activeProvider: dummyProviderOne,
+ providerStore: {
+ availableProviders: [dummyProviderOne, dummyProviderTwo]
+ }
+ }
+ }
+ })
+ dummyProviderOne.previewSearch.search.mockReturnValueOnce([
+ { id: 'dummyProviderOne.1', data: 'dummyProviderOne - 1' },
+ { id: 'dummyProviderOne.2', data: 'dummyProviderOne - 2' }
+ ])
+ await wrapper.find('input').setValue('new')
+ await wrapper.vm.$nextTick()
+ await wrapper
+ .findAll('li.preview')
+ .at(1)
+ .trigger('click')
+ expect(dummyProviderOne.previewSearch.activate).toBeCalledTimes(1)
+ expect(dummyProviderOne.previewSearch.activate).toBeCalledWith({
+ id: 'dummyProviderOne.2',
+ data: 'dummyProviderOne - 2'
+ })
+ })
+ test('sets the search term and input term to the route value on mount', () => {
+ wrapper = mount(SearchBar, {
+ localVue,
+ data() {
+ return {
+ optionsVisible: true,
+ activeProvider: dummyProviderOne,
+ providerStore: {
+ availableProviders: [dummyProviderOne, dummyProviderTwo]
+ }
+ }
+ },
+ mocks: {
+ $route: {
+ query: {
+ term: 'routeTerm'
+ }
+ }
+ }
+ })
+
+ expect(wrapper.vm.$data.term).toBe('routeTerm')
+ expect((wrapper.get('input').element as HTMLInputElement).value).toBe('routeTerm')
+ })
+ test("ignores events that don't belong to the SearchBar", async () => {
+ wrapper = mount(SearchBar, {
+ localVue,
+ attachTo: document.body,
+ data() {
+ return {
+ optionsVisible: true,
+ term: 'old',
+ activeProvider: dummyProviderOne,
+ providerStore: {
+ availableProviders: [dummyProviderOne, dummyProviderTwo]
+ }
+ }
+ }
+ })
+ const options = { path: [] }
+ await wrapper.trigger('keyup.a', options)
+ expect(wrapper.find('.files-global-search-options').exists()).toBeFalsy()
+ await wrapper.trigger('click', options)
+ expect(wrapper.find('.files-global-search-options').exists()).toBeFalsy()
+ await wrapper.trigger('focusin', options)
+ expect(wrapper.find('.files-global-search-options').exists()).toBeFalsy()
+ })
+ test('providers can be switched by using the arrow up and down keys on keyboard', async () => {
+ wrapper = mount(SearchBar, {
+ localVue,
+ attachTo: document.body,
+ data() {
+ return {
+ optionsVisible: true,
+ term: 'old',
+ activeProvider: dummyProviderOne,
+ providerStore: {
+ availableProviders: [dummyProviderOne, dummyProviderTwo]
+ }
+ }
+ }
+ })
+ const getClasses = (at: number) => wrapper.findAll('.provider').at(at).element.classList
+ await wrapper.trigger('keyup.up', searchEventOptions)
+ expect(getClasses(1)).toContain('selected')
+
+ await wrapper.trigger('keyup.up', searchEventOptions)
+ expect(getClasses(0)).toContain('selected')
+
+ await wrapper.trigger('keyup.down', searchEventOptions)
+ expect(getClasses(1)).toContain('selected')
+
+ await wrapper.trigger('keyup.down', searchEventOptions)
+ expect(getClasses(0)).toContain('selected')
+ })
+ test('hides options on escape key press', async () => {
+ wrapper = mount(SearchBar, {
+ localVue,
+ attachTo: document.body,
+ data() {
+ return {
+ optionsVisible: true,
+ term: 'old',
+ activeProvider: dummyProviderOne,
+ providerStore: {
+ availableProviders: [dummyProviderOne, dummyProviderTwo]
+ }
+ }
+ }
+ })
+ expect(wrapper.vm.$data.optionsVisible).toBeTruthy()
+ await wrapper.trigger('keyup.esc', searchEventOptions)
+ expect(wrapper.vm.$data.optionsVisible).toBeFalsy()
+ })
+ test('activate provider on enter key press', async () => {
+ wrapper = mount(SearchBar, {
+ localVue,
+ attachTo: document.body,
+ data() {
+ return {
+ term: 'old',
+ providerStore: {
+ availableProviders: [dummyProviderOne, dummyProviderTwo]
+ }
+ }
+ }
+ })
+ await wrapper.trigger('click', searchEventOptions)
+ await wrapper.find('input').setValue('new')
+
+ const providers = wrapper.findAll('li.provider')
+ expect(providers.at(0).classes()).toContain('selected')
+ expect(wrapper.vm.$data.optionsVisible).toBeTruthy()
+ await wrapper.trigger('keyup.enter', searchEventOptions)
+ expect(dummyProviderOne.activate).toBeCalledWith('new')
+ expect(dummyProviderOne.activate).toBeCalledTimes(1)
+ })
+ test('activate provider on click', async () => {
+ wrapper = mount(SearchBar, {
+ localVue,
+ attachTo: document.body,
+ data() {
+ return {
+ term: 'old',
+ providerStore: {
+ availableProviders: [dummyProviderOne, dummyProviderTwo]
+ }
+ }
+ }
+ })
+ await wrapper.trigger('click', searchEventOptions)
+ await wrapper.find('input').setValue('new')
+
+ const providers = wrapper.findAll('li.provider')
+ expect(providers.at(0).classes()).toContain('selected')
+ expect(wrapper.vm.$data.optionsVisible).toBeTruthy()
+ await providers.at(0).trigger('click', searchEventOptions)
+ expect(dummyProviderOne.activate).toBeCalledWith('new')
+ expect(dummyProviderOne.activate).toBeCalledTimes(1)
+ })
+})
diff --git a/packages/web-app-search/tests/unit/service/providerStore.spec.ts b/packages/web-app-search/tests/unit/service/providerStore.spec.ts
new file mode 100644
index 00000000000..73d9ff89b4b
--- /dev/null
+++ b/packages/web-app-search/tests/unit/service/providerStore.spec.ts
@@ -0,0 +1,26 @@
+import { providerStore } from '../../../src/service'
+
+const dummyProviderOne = {
+ id: 'id',
+ available: true,
+ reset: jest.fn(),
+ updateTerm: jest.fn(),
+ activate: jest.fn()
+}
+
+const dummyProviderTwo = { ...dummyProviderOne, available: false }
+
+beforeEach(() => (providerStore.providers = []))
+
+describe('providerStore service', () => {
+ test('new providers can be added to the store', () => {
+ providerStore.addProvider(dummyProviderOne)
+ providerStore.addProvider(dummyProviderTwo)
+ expect(providerStore.providers.length).toBe(2)
+ })
+ test('only available providers can be requested', () => {
+ providerStore.addProvider(dummyProviderOne)
+ providerStore.addProvider(dummyProviderTwo)
+ expect(providerStore.availableProviders.length).toBe(1)
+ })
+})
diff --git a/packages/web-app-search/tests/unit/store/options.spec.ts b/packages/web-app-search/tests/unit/store/options.spec.ts
new file mode 100644
index 00000000000..794cdc00f19
--- /dev/null
+++ b/packages/web-app-search/tests/unit/store/options.spec.ts
@@ -0,0 +1,9 @@
+import optionsStore from '../../../src/store/options'
+
+describe('search options store', () => {
+ test('by default the search is visible', () => {
+ const { state, getters } = optionsStore
+ const { hideSearchBar } = getters.options(state) as any
+ expect(hideSearchBar).toBe(false)
+ })
+})
diff --git a/packages/web-app-search/tests/unit/views/List.spec.ts b/packages/web-app-search/tests/unit/views/List.spec.ts
new file mode 100644
index 00000000000..f8e6f2659fb
--- /dev/null
+++ b/packages/web-app-search/tests/unit/views/List.spec.ts
@@ -0,0 +1,48 @@
+import List from '../../../src/views/List.vue'
+import { Wrapper, mount, createLocalVue } from '@vue/test-utils'
+import AsyncComputed from 'vue-async-computed'
+import { providerStore } from '../../../src/service'
+
+const localVue = createLocalVue()
+localVue.use(AsyncComputed)
+
+let wrapper: Wrapper
+const mockProvider = {
+ id: 'p1',
+ available: true,
+ reset: jest.fn(),
+ updateTerm: jest.fn(),
+ activate: jest.fn(),
+ listSearch: {
+ search: jest.fn()
+ } as any
+}
+
+beforeEach(() => {
+ jest.resetAllMocks()
+ providerStore.providers = []
+})
+
+afterEach(() => {
+ wrapper.destroy()
+})
+
+describe('search result List view', () => {
+ test('it requests the listSearch from the current active provider', () => {
+ providerStore.providers = [mockProvider]
+ wrapper = mount(List, {
+ localVue,
+ stubs: {
+ OcSpinner: true
+ },
+ mocks: {
+ $route: {
+ query: {
+ provider: 'p1'
+ }
+ }
+ }
+ })
+ expect(wrapper.vm.$data.listSearch).toMatchObject(mockProvider.listSearch)
+ })
+})
diff --git a/packages/web-integration-oc10/appinfo/info.xml b/packages/web-integration-oc10/appinfo/info.xml
index 447e983be21..3c4e2a29f22 100644
--- a/packages/web-integration-oc10/appinfo/info.xml
+++ b/packages/web-integration-oc10/appinfo/info.xml
@@ -15,7 +15,7 @@ For feedback and bug reports, please use the [public issue tracker](https://gith
AGPLownCloud
- 3.4.1
+ 4.0.0toolshttps://github.com/owncloud/webhttps://github.com/owncloud/web/issues
@@ -24,7 +24,7 @@ For feedback and bug reports, please use the [public issue tracker](https://gith
https://owncloud.dev/clients/web/deployments/oc10-app
-
+ https://raw.githubusercontent.com/owncloud/screenshots/master/web/oc_web.png
diff --git a/packages/web-pkg/src/cache/cache.ts b/packages/web-pkg/src/cache/cache.ts
index 25904d8923c..ef23b12d787 100644
--- a/packages/web-pkg/src/cache/cache.ts
+++ b/packages/web-pkg/src/cache/cache.ts
@@ -63,6 +63,11 @@ export default class Cache {
return [...this.map.keys()]
}
+ public has(key: K): boolean {
+ this.evict()
+ return this.map.has(key)
+ }
+
public values(): V[] {
this.evict()
return [...this.map.values()].map(e => e.value)
diff --git a/packages/web-pkg/src/decorator/debounce.ts b/packages/web-pkg/src/decorator/debounce.ts
new file mode 100644
index 00000000000..d0b3f397236
--- /dev/null
+++ b/packages/web-pkg/src/decorator/debounce.ts
@@ -0,0 +1,43 @@
+import debounce from 'lodash-es/debounce'
+
+/**
+ * Wrap lodash debounce as a decorator
+ * @param {number} wait The number of milliseconds to delay.
+ * @param {Object} options The options object.
+ * @param {boolean} options.leading? Specify invoking on the leading edge of the timeout.
+ * @param {number} options.maxWait? The maximum time decorated func is allowed to be delayed before it’s invoked.
+ * @param {boolean} options.trailing? Specify invoking on the trailing edge of the timeout.
+ */
+export default (
+ wait: number,
+ options?: {
+ leading?: boolean
+ maxWait?: number
+ trailing?: boolean
+ }
+) => {
+ return function(target: unknown, key: string, descriptor: PropertyDescriptor): void {
+ const fn = descriptor.value
+ const bouncer = debounce(
+ async function(
+ executor: { resolve: (value: any) => void; reject: (reason: any) => void },
+ ...args: any[]
+ ) {
+ try {
+ const result = await fn.apply(this, args)
+ executor.resolve(result)
+ } catch (error) {
+ executor.reject(error)
+ }
+ },
+ wait,
+ options
+ )
+
+ descriptor.value = function(...args: any[]) {
+ return new Promise((resolve, reject) => {
+ bouncer.apply(this, [{ resolve, reject }, ...args])
+ })
+ }
+ }
+}
diff --git a/packages/web-pkg/src/decorator/index.ts b/packages/web-pkg/src/decorator/index.ts
new file mode 100644
index 00000000000..a3d8dac5459
--- /dev/null
+++ b/packages/web-pkg/src/decorator/index.ts
@@ -0,0 +1 @@
+export { default as debounce } from './debounce'
diff --git a/packages/web-pkg/src/event/bus.ts b/packages/web-pkg/src/event/bus.ts
new file mode 100644
index 00000000000..db2ca7b9194
--- /dev/null
+++ b/packages/web-pkg/src/event/bus.ts
@@ -0,0 +1,21 @@
+export class EventBus {
+ private listeners: Map void>
+
+ constructor() {
+ this.listeners = new Map()
+ }
+
+ public on(selector: string, cb: (event?: unknown) => void): void {
+ this.listeners.set(selector, cb)
+ }
+
+ public emit(selector: string, evt?: unknown): void {
+ const listener = this.listeners.get(selector)
+
+ if (!listener) {
+ return
+ }
+
+ listener(evt)
+ }
+}
diff --git a/packages/web-pkg/src/event/index.ts b/packages/web-pkg/src/event/index.ts
new file mode 100644
index 00000000000..6ea99c417b1
--- /dev/null
+++ b/packages/web-pkg/src/event/index.ts
@@ -0,0 +1 @@
+export * from './bus'
diff --git a/packages/web-pkg/src/instance/index.ts b/packages/web-pkg/src/instance/index.ts
new file mode 100644
index 00000000000..93d9649ab18
--- /dev/null
+++ b/packages/web-pkg/src/instance/index.ts
@@ -0,0 +1,3 @@
+import { EventBus } from '../event'
+
+export const bus = new EventBus()
diff --git a/packages/web-pkg/tests/unit/cache/cache.spec.ts b/packages/web-pkg/tests/unit/cache/cache.spec.ts
index 338d7cfe3f5..ad58563a769 100644
--- a/packages/web-pkg/tests/unit/cache/cache.spec.ts
+++ b/packages/web-pkg/tests/unit/cache/cache.spec.ts
@@ -123,4 +123,12 @@ describe('Cache', () => {
cache.clear()
expect(cache.entries().length).toBe(0)
})
+
+ it('can check if a cache contains a entry for given key', () => {
+ const values = [1, 2, 3, 4, 5]
+ const cache = newCache(values)
+
+ values.forEach(value => expect(cache.has(value - 1)).toBeTruthy())
+ expect(cache.has(5)).toBeFalsy()
+ })
})
diff --git a/packages/web-pkg/tests/unit/decorator/debounce.spec.ts b/packages/web-pkg/tests/unit/decorator/debounce.spec.ts
new file mode 100644
index 00000000000..0a2d05d90c4
--- /dev/null
+++ b/packages/web-pkg/tests/unit/decorator/debounce.spec.ts
@@ -0,0 +1,28 @@
+import Debounce from '../../../src/decorator/debounce'
+
+const hammered = jest.fn()
+
+class Sample {
+ @Debounce(500)
+ public resolve(): void {
+ hammered()
+ }
+}
+
+describe('Debounce', () => {
+ test('debounce decorated function', () => {
+ jest.useFakeTimers('modern')
+
+ const sample = new Sample()
+
+ for (let i = 0; i < 100; i++) {
+ sample.resolve()
+ }
+
+ expect(hammered).toBeCalledTimes(0)
+
+ jest.runAllTimers()
+
+ expect(hammered).toBeCalledTimes(1)
+ })
+})
diff --git a/packages/web-pkg/tests/unit/event/bus.spec.ts b/packages/web-pkg/tests/unit/event/bus.spec.ts
new file mode 100644
index 00000000000..38fbc072797
--- /dev/null
+++ b/packages/web-pkg/tests/unit/event/bus.spec.ts
@@ -0,0 +1,26 @@
+import { EventBus } from '../../../src/event/bus'
+
+describe('EventBus', () => {
+ test('pubSub', () => {
+ const bus = new EventBus()
+ let val
+
+ for (let i = 0; i < 1000; i++) {
+ bus.on(`evt.${i}`, v => (val = v))
+ }
+
+ for (let i = 0; i < 1000; i++) {
+ const msg = `msg - ${i}`
+ bus.emit(`evt.${i}`, msg)
+ expect(val).toBe(msg)
+ }
+
+ val = 'untouched'
+
+ for (let i = 0; i < 1000; i++) {
+ bus.emit(`evt.unknown.${i}`, `unknown - ${i}`)
+ }
+
+ expect(val).toBe('untouched')
+ })
+})
diff --git a/packages/web-pkg/tests/unit/instance/index.spec.ts b/packages/web-pkg/tests/unit/instance/index.spec.ts
new file mode 100644
index 00000000000..d14d9a243c2
--- /dev/null
+++ b/packages/web-pkg/tests/unit/instance/index.spec.ts
@@ -0,0 +1,8 @@
+import { EventBus } from '../../../src/event'
+import { bus } from '../../../src/instance'
+
+describe('instance', () => {
+ test('exports eventBus', () => {
+ expect(bus).toBeInstanceOf(EventBus)
+ })
+})
diff --git a/packages/web-runtime/l10n/translations.json b/packages/web-runtime/l10n/translations.json
index c91096d5da2..894b4020ead 100644
--- a/packages/web-runtime/l10n/translations.json
+++ b/packages/web-runtime/l10n/translations.json
@@ -1 +1 @@
-{"cs":{"Account":"Účet","Account Information":"Informace o účtu","Application Switcher":"Přepínač Aplikací","Authentication failed":"Ověření selhalo","documentation":"dokumentace","Download failed":"Stahování selhalo","Edit":"Upravit","File could not be located":"Soubor se nepodařilo najít","For help visit our":"Pro pomoc navštivte naše","If you like to login with a different user please proceed to exit.":"Pokud se chcete přihlásit jako jiný uživatel, pokračujte prosím odhlášením.","item":"položka","Loading folder failed…":"Načítání složky selhalo...","Log out":"Odhlásit","Login":"Přihlásit","Login Error":"Chyba přihlášení","No email has been set up":"Žádná emailová adresa nebyla nastavena","Notifications":"Oznámení","Open search bar":"Otevřít pole hledání","Please click the button below to authenticate and get access to your data.":"Stiskněte prosím tlačítko dole pro udělení oprávnění a zpřístupněte tak svá data.","Please contact the administrator if this error persists.":"Pokud tato chyba přetrvává, kontaktujte administrátora.","Please contact your administrator if you think this message shows up in error.":"Pokud si myslíte, že se tato zpráva zobrazuje omylem, kontaktujte svého administrátora.","Please wait a while. You are being redirected.":"Prosím vydržte chvíli. Probíhá přesměrování.","Profile":"Profil","Public link":"Veřejný odkaz","Redirecting":"Přesměrování","Search failed":"Hledání selhalo","Welcome to %{productName}":"Vítejte v %{productName}","You are not allowed to use this application.":"Tuto aplikaci nemáte povoleno používat.","You are not part of any group":"Nejste členem žádné skupiny"},"de":{"{{ n.title }}":"{{ n.title }}","%{used} of %{total}":"%{used} von %{total}","Attention: this will log you out from all applications you are running in\n this browser with your current user.":"Achtung: sie werden automatischen aus allen Anwendungen ausgeloggt.","Access denied":"Zugriff verweigert","Account":"Konto","Account Information":"Kontoinformationen","Account menu":"Benutzer-Menü","Also, make sure to check the browser console for more information.":"Bitte prüfen Sie auch die Browser-Konsole für weitere Informationen.","Application Switcher":"Apps-Menü","Authentication failed":"Authentifizierung fehlgeschlagen","chat":"chat","Close sidebar":"Seitenleiste schließen","Display name":"Anzeigename","documentation":"Dokumentation","Download failed":"Fehler beim Herunterladen","Edit":"Bearbeiten","Email":"E-Mail","Enter search query":"Suchbegriff eingeben","File could not be located":"Datei konnte nicht gefunden werden","For help visit our":"Für Hilfe besuche unsere","Group memberships":"Gruppenzugehörigkeiten","If you like to login with a different user please proceed to exit.":"Wenn Sie sich mit einem anderen Benutzer anmelden möchten, gehen Sie bitte zu exit.","item":"Element","Loading":"Lädt","Loading folder failed…":"Laden des Ordners fehlgeschlagen…","Log out":"Abmelden","Login":"Login","Login Error":"Fehler beim Login","Main navigation":"Hauptnavigation","Missing or invalid config":"Fehlende oder falsche Konfiguration","msg":"Nachricht","n":"n","Navigate to all files page":"Zur Seite \"Alle Dateien\" navigieren","Navigated to %{ pageTitle }":"Zur Seite %{ pageTitle } navigiert","No email has been set up":"Es wurde noch keine E-Mail eingerichtet","Notifications":"Benachrichtigungen","Oidc callback":"Oidc Callback","Oidc redirect":"Oidc Weiterleitung","Open navigation menu":"Navigationsmenü öffnen","Open search bar":"Suchleiste öffnen","or join our":"oder machen Sie mit bei ","ownCloud feedback survey":"ownCloud Feedbackumfrage","Please check if the file config.json exists and is correct.":"Bitte prüfen Sie ob die config.json Konfigurationsdatei existiert und valide ist.","Please click the button below to authenticate and get access to your data.":"Klicken Sie auf die Schaltfläche unten, um sich zu authentifizieren und auf Ihre Daten zuzugreifen.","Please contact the administrator if this error persists.":"Bitte kontaktieren Sie den Administrator, wenn dieser Fehler weiterhin besteht.","Please contact your administrator if you think this message shows up in error.":"Falls diese Meldung fehlerhaft erscheint bitte die Systemverwaltung kontaktieren.","Please wait a while. You are being redirected.":"Bitte einen Moment Geduld. Sie werden weitergeleitet.","Private link":"Privater Link","Profile":"Profil","Provide your feedback: We'd like to improve the web design and would be happy to hear your feedback. Thank you! Your ownCloud team.":"Gib uns Feedback: Wir würden unser Webdesign gerne verbessern und freuen uns über deine Rückmeldung. Vielen Dank! Dein ownCloud Team.","Public link":"Öffentlicher Link","Redirecting":"Weiterleiten","route":"Verbindung","Search failed":"Die Suche ist fehlgeschlagen","Sidebar footer":"Fußzeile der Seitenleiste","Sidebar header":"Kopfbereich der Seitenleiste","Sidebar navigation menu":"Navigation in der Seitenleiste","Skip to main":"Zum Hauptinhalt springen","this":"dies","Top bar":"Kopfleiste","User ID":"Nutzer ID","User Menu":"Benutzermenü","Username":"Nutzername","Welcome to %{productName}":"Willkommen zu %{productName}","You are not allowed to use this application.":"Keine Berechtigung zur Benutzung dieser Applikation.","You are not part of any group":"Sie gehören keiner Gruppe an."},"es":{"Account":"Cuenta","Account Information":"Información de cuenta","Authentication failed":"Fallo de autenticación","documentation":"documentación","Download failed":"Descarga fallida","Edit":"Editar","For help visit our":"Para ayuda visite nuestra","If you like to login with a different user please proceed to exit.":"Si deseas entrar con un nombre de usuario distinto por favor procede a salir.","Loading":"Cargando","Loading folder failed…":"Falló la subida de la carpeta...","Log out":"Salir","Login":"Iniciar sesión","Login Error":"Error de inicio de sesión","msg":"msg","No email has been set up":"No se ha establecido ningún correo electrónico","Please click the button below to authenticate and get access to your data.":"Pulse el botón para autenticarse y ganar acceso a sus datos.","Please contact the administrator if this error persists.":"Contacta con el administrador si el error persiste","Please contact your administrator if you think this message shows up in error.":"Póngase en contacto con su administrador si cree que este mensaje aparece por error.","Please wait a while. You are being redirected.":"Por favor espere. Lo estamos redireccionando.","Redirecting":"Redireccionando","Search failed":"Falló la búsqueda","this":"esto","Welcome to %{productName}":"Bienvenido a %{productName} ","You are not allowed to use this application.":"No se le permite usar esta aplicación.","You are not part of any group":"No eres parte de ningún grupo"},"fr":{"%{used} of %{total}":"%{used} sur %{total}","Account":"Compte","Account Information":"Informations de compte","Application Switcher":" Changeur d'applications","Authentication failed":"Error d'authentification","documentation":"documentation","Download failed":"Echec de téléchargement","Edit":"Editer","File could not be located":"Le fichier n'a pas été trouvé","For help visit our":"Pour de l'aide visiter notre ","If you like to login with a different user please proceed to exit.":"Pour vous connecter avec un utilisateur différent, veuillez procéder à la sortie.","Loading":"Chargement","Loading folder failed…":"Erreur de chargement du dossier…","Log out":"Se déconnecter","Login":"Se connecter","Login Error":"Erreur de connection","msg":"msg","No email has been set up":"Pas d'adresse e-mail configurée","Notifications":"Notifications","Please click the button below to authenticate and get access to your data.":"Veuillez cliquer le button ci-dessous pour vous authentifier et obtenir accès à vos données.","Please contact the administrator if this error persists.":"Veuillez contacter l'administrateur si cette erreur persiste.","Please contact your administrator if you think this message shows up in error.":"Veuillez contacter l'administrateur si vous pensez que ce message apparaît par erreur.","Please wait a while. You are being redirected.":"Veuillez patienter. Redirection en cours.","Profile":"Profil","Public link":"Lien public","Redirecting":"Redirection en cours","Search failed":"Échec de la recherche","Welcome to %{productName}":"Bienvenue sur %{productName}","You are not allowed to use this application.":"Vous n'êtes pas autorisé à utiliser cette application.","You are not part of any group":"Vous n'êtes membre d'aucun groupe"},"gl":{"%{used} of %{total}":"%{used} de %{total}","Account":"Conta","Account Information":"Información da conta","Application Switcher":"Cambiador de aplicacións","Authentication failed":"Produciuse un fallo de autenticación","documentation":"documentación","Download failed":"Produciuse un fallo na descarga","Edit":"Editar","File could not be located":"Non foi posíbel localizar o ficheiro","For help visit our":"Para obter axuda visite o noso","If you like to login with a different user please proceed to exit.":"Se quere iniciar sesión cun usuario diferente, proceda a saír.","item":"elemento","Loading":"Cargando","Loading folder failed…":"Produciuse un fallo ao cargar o cartafol…","Log out":"Saír","Login":"Acceso","Login Error":"Produciuse un erro de acceso","msg":"msx","No email has been set up":"Non se configurou ningún correo-e","Notifications":"Notificacións","Open search bar":"Abrir a barra de busca","Please click the button below to authenticate and get access to your data.":"Prema no botón de embaixo para autenticarse e obter acceso aos seus datos.","Please contact the administrator if this error persists.":"Póñase en contacto co seu administrador se persiste o erro.","Please contact your administrator if you think this message shows up in error.":"Póñase en contacto co seu administrador se cre que esta mensaxe aparece por erro.","Please wait a while. You are being redirected.":"Agarde un chisco. Está a ser redirixido.","Profile":"Perfil","Public link":"Ligazón pública","Redirecting":"Redirixindo","Search failed":"Produciuse un fallo na busca","this":"este","Welcome to %{productName}":"Benvido a %{productName}","You are not allowed to use this application.":"Non ten permiso para empregar esta aplicación","You are not part of any group":"Vostede non forma parte de ningún grupo"},"it":{}}
\ No newline at end of file
+{"cs":{"Account":"Účet","Account Information":"Informace o účtu","Application Switcher":"Přepínač Aplikací","Authentication failed":"Ověření selhalo","documentation":"dokumentace","Download failed":"Stahování selhalo","Edit":"Upravit","File could not be located":"Soubor se nepodařilo najít","For help visit our":"Pro pomoc navštivte naše","If you like to login with a different user please proceed to exit.":"Pokud se chcete přihlásit jako jiný uživatel, pokračujte prosím odhlášením.","item":"položka","Loading folder failed…":"Načítání složky selhalo...","Log out":"Odhlásit","Login":"Přihlásit","Login Error":"Chyba přihlášení","No email has been set up":"Žádná emailová adresa nebyla nastavena","Notifications":"Oznámení","Please click the button below to authenticate and get access to your data.":"Stiskněte prosím tlačítko dole pro udělení oprávnění a zpřístupněte tak svá data.","Please contact the administrator if this error persists.":"Pokud tato chyba přetrvává, kontaktujte administrátora.","Please contact your administrator if you think this message shows up in error.":"Pokud si myslíte, že se tato zpráva zobrazuje omylem, kontaktujte svého administrátora.","Please wait a while. You are being redirected.":"Prosím vydržte chvíli. Probíhá přesměrování.","Profile":"Profil","Public link":"Veřejný odkaz","Redirecting":"Přesměrování","Welcome to %{productName}":"Vítejte v %{productName}","You are not allowed to use this application.":"Tuto aplikaci nemáte povoleno používat.","You are not part of any group":"Nejste členem žádné skupiny"},"de":{"{{ n.title }}":"{{ n.title }}","%{used} of %{total}":"%{used} von %{total}","Attention: this will log you out from all applications you are running in\n this browser with your current user.":"Achtung: sie werden automatischen aus allen Anwendungen ausgeloggt.","Access denied":"Zugriff verweigert","Account":"Konto","Account Information":"Kontoinformationen","Account menu":"Benutzer-Menü","Also, make sure to check the browser console for more information.":"Bitte prüfen Sie auch die Browser-Konsole für weitere Informationen.","Application Switcher":"Apps-Menü","Authentication failed":"Authentifizierung fehlgeschlagen","chat":"chat","Close sidebar":"Seitenleiste schließen","Display name":"Anzeigename","documentation":"Dokumentation","Download failed":"Fehler beim Herunterladen","Edit":"Bearbeiten","Email":"E-Mail","File could not be located":"Datei konnte nicht gefunden werden","For help visit our":"Für Hilfe besuche unsere","Group memberships":"Gruppenzugehörigkeiten","If you like to login with a different user please proceed to exit.":"Wenn Sie sich mit einem anderen Benutzer anmelden möchten, gehen Sie bitte zu exit.","item":"Element","Loading":"Lädt","Loading folder failed…":"Laden des Ordners fehlgeschlagen…","Log out":"Abmelden","Login":"Login","Login Error":"Fehler beim Login","Main navigation":"Hauptnavigation","Missing or invalid config":"Fehlende oder falsche Konfiguration","msg":"Nachricht","n":"n","Navigate to all files page":"Zur Seite \"Alle Dateien\" navigieren","Navigated to %{ pageTitle }":"Zur Seite %{ pageTitle } navigiert","No email has been set up":"Es wurde noch keine E-Mail eingerichtet","Notifications":"Benachrichtigungen","Oidc callback":"Oidc Callback","Oidc redirect":"Oidc Weiterleitung","Open navigation menu":"Navigationsmenü öffnen","or join our":"oder machen Sie mit bei ","ownCloud feedback survey":"ownCloud Feedbackumfrage","Please check if the file config.json exists and is correct.":"Bitte prüfen Sie ob die config.json Konfigurationsdatei existiert und valide ist.","Please click the button below to authenticate and get access to your data.":"Klicken Sie auf die Schaltfläche unten, um sich zu authentifizieren und auf Ihre Daten zuzugreifen.","Please contact the administrator if this error persists.":"Bitte kontaktieren Sie den Administrator, wenn dieser Fehler weiterhin besteht.","Please contact your administrator if you think this message shows up in error.":"Falls diese Meldung fehlerhaft erscheint bitte die Systemverwaltung kontaktieren.","Please wait a while. You are being redirected.":"Bitte einen Moment Geduld. Sie werden weitergeleitet.","Private link":"Privater Link","Profile":"Profil","Provide your feedback: We'd like to improve the web design and would be happy to hear your feedback. Thank you! Your ownCloud team.":"Gib uns Feedback: Wir würden unser Webdesign gerne verbessern und freuen uns über deine Rückmeldung. Vielen Dank! Dein ownCloud Team.","Public link":"Öffentlicher Link","Redirecting":"Weiterleiten","route":"Verbindung","Sidebar footer":"Fußzeile der Seitenleiste","Sidebar header":"Kopfbereich der Seitenleiste","Sidebar navigation menu":"Navigation in der Seitenleiste","Skip to main":"Zum Hauptinhalt springen","this":"dies","Top bar":"Kopfleiste","User ID":"Nutzer ID","User Menu":"Benutzermenü","Username":"Nutzername","Welcome to %{productName}":"Willkommen zu %{productName}","You are not allowed to use this application.":"Keine Berechtigung zur Benutzung dieser Applikation.","You are not part of any group":"Sie gehören keiner Gruppe an."},"es":{"Account":"Cuenta","Account Information":"Información de cuenta","Authentication failed":"Fallo de autenticación","documentation":"documentación","Download failed":"Descarga fallida","Edit":"Editar","For help visit our":"Para ayuda visite nuestra","If you like to login with a different user please proceed to exit.":"Si deseas entrar con un nombre de usuario distinto por favor procede a salir.","Loading":"Cargando","Loading folder failed…":"Falló la subida de la carpeta...","Log out":"Salir","Login":"Iniciar sesión","Login Error":"Error de inicio de sesión","msg":"msg","No email has been set up":"No se ha establecido ningún correo electrónico","Please click the button below to authenticate and get access to your data.":"Pulse el botón para autenticarse y ganar acceso a sus datos.","Please contact the administrator if this error persists.":"Contacta con el administrador si el error persiste","Please contact your administrator if you think this message shows up in error.":"Póngase en contacto con su administrador si cree que este mensaje aparece por error.","Please wait a while. You are being redirected.":"Por favor espere. Lo estamos redireccionando.","Redirecting":"Redireccionando","this":"esto","Welcome to %{productName}":"Bienvenido a %{productName} ","You are not allowed to use this application.":"No se le permite usar esta aplicación.","You are not part of any group":"No eres parte de ningún grupo"},"fr":{"%{used} of %{total}":"%{used} sur %{total}","Account":"Compte","Account Information":"Informations de compte","Application Switcher":" Changeur d'applications","Authentication failed":"Error d'authentification","chat":"chat","documentation":"documentation","Download failed":"Echec de téléchargement","Edit":"Editer","Email":"Email","File could not be located":"Le fichier n'a pas été trouvé","For help visit our":"Pour de l'aide visiter notre ","If you like to login with a different user please proceed to exit.":"Pour vous connecter avec un utilisateur différent, veuillez procéder à la sortie.","item":"Élément","Loading":"Chargement","Loading folder failed…":"Erreur de chargement du dossier…","Log out":"Se déconnecter","Login":"Se connecter","Login Error":"Erreur de connection","msg":"msg","No email has been set up":"Pas d'adresse e-mail configurée","Notifications":"Notifications","Please click the button below to authenticate and get access to your data.":"Veuillez cliquer le button ci-dessous pour vous authentifier et obtenir accès à vos données.","Please contact the administrator if this error persists.":"Veuillez contacter l'administrateur si cette erreur persiste.","Please contact your administrator if you think this message shows up in error.":"Veuillez contacter l'administrateur si vous pensez que ce message apparaît par erreur.","Please wait a while. You are being redirected.":"Veuillez patienter. Redirection en cours.","Private link":"Lien privé","Profile":"Profil","Public link":"Lien public","Redirecting":"Redirection en cours","User ID":"ID utilisateur","User Menu":"Menu utilisateur","Username":"Nom d'utilisateur","Welcome to %{productName}":"Bienvenue sur %{productName}","You are not allowed to use this application.":"Vous n'êtes pas autorisé à utiliser cette application.","You are not part of any group":"Vous n'êtes membre d'aucun groupe"},"gl":{"%{used} of %{total}":"%{used} de %{total}","Account":"Conta","Account Information":"Información da conta","Application Switcher":"Cambiador de aplicacións","Authentication failed":"Produciuse un fallo de autenticación","documentation":"documentación","Download failed":"Produciuse un fallo na descarga","Edit":"Editar","File could not be located":"Non foi posíbel localizar o ficheiro","For help visit our":"Para obter axuda visite o noso","If you like to login with a different user please proceed to exit.":"Se quere iniciar sesión cun usuario diferente, proceda a saír.","item":"elemento","Loading":"Cargando","Loading folder failed…":"Produciuse un fallo ao cargar o cartafol…","Log out":"Saír","Login":"Acceso","Login Error":"Produciuse un erro de acceso","msg":"msx","No email has been set up":"Non se configurou ningún correo-e","Notifications":"Notificacións","Please click the button below to authenticate and get access to your data.":"Prema no botón de embaixo para autenticarse e obter acceso aos seus datos.","Please contact the administrator if this error persists.":"Póñase en contacto co seu administrador se persiste o erro.","Please contact your administrator if you think this message shows up in error.":"Póñase en contacto co seu administrador se cre que esta mensaxe aparece por erro.","Please wait a while. You are being redirected.":"Agarde un chisco. Está a ser redirixido.","Profile":"Perfil","Public link":"Ligazón pública","Redirecting":"Redirixindo","this":"este","Welcome to %{productName}":"Benvido a %{productName}","You are not allowed to use this application.":"Non ten permiso para empregar esta aplicación","You are not part of any group":"Vostede non forma parte de ningún grupo"},"it":{}}
\ No newline at end of file
diff --git a/packages/web-runtime/package.json b/packages/web-runtime/package.json
index 2056d4ed32c..f421fd5a388 100644
--- a/packages/web-runtime/package.json
+++ b/packages/web-runtime/package.json
@@ -13,9 +13,10 @@
"lodash-es": "^4.17.21",
"luxon": "^1.27.0",
"oidc-client": "1.11.5",
- "owncloud-design-system": "^8.2.0",
+ "owncloud-design-system": "^8.3.1",
"owncloud-sdk": "1.0.0-2296",
"p-queue": "^6.1.1",
+ "portal-vue": "^2.1.7",
"tippy.js": "^6.3.1",
"tus-js-client": "^1.8.0",
"uikit": "3.5.16",
@@ -31,7 +32,7 @@
"vue-resize": "^0.4.5",
"vue-router": "^3.1.3",
"vue-scrollto": "^2.15.0",
- "vue-select": "^3.11.2",
+ "vue-select": "^3.12.0",
"vue2-touch-events": "^3.2.2",
"vuex": "^3.1.1",
"vuex-extensions": "^1.1.5",
diff --git a/packages/web-runtime/src/App.vue b/packages/web-runtime/src/App.vue
index dd258c9f159..ef791cb07f2 100644
--- a/packages/web-runtime/src/App.vue
+++ b/packages/web-runtime/src/App.vue
@@ -182,7 +182,7 @@ export default {
},
sidebarNavItems() {
- if (!this.user.token) {
+ if (this.publicPage()) {
return []
}
diff --git a/packages/web-runtime/src/components/Notifications.vue b/packages/web-runtime/src/components/Notifications.vue
index de83d67d023..8edd3c0af56 100644
--- a/packages/web-runtime/src/components/Notifications.vue
+++ b/packages/web-runtime/src/components/Notifications.vue
@@ -1,5 +1,5 @@
-