diff options
Diffstat (limited to 'apps')
240 files changed, 2459 insertions, 1099 deletions
diff --git a/apps/dav/lib/CardDAV/AddressBook.php b/apps/dav/lib/CardDAV/AddressBook.php index b0fb8c8ee5c..468961b958e 100644 --- a/apps/dav/lib/CardDAV/AddressBook.php +++ b/apps/dav/lib/CardDAV/AddressBook.php @@ -223,10 +223,7 @@ class AddressBook extends \Sabre\CardDAV\AddressBook implements IShareable, IMov } public function propPatch(PropPatch $propPatch) { - // shared address books will be handled by - // \OCA\DAV\DAV\CustomPropertiesBackend::propPatch - // to save values in db table instead of dav object - if (!$this->isShared()) { + if (!isset($this->addressBookInfo['{http://owncloud.org/ns}owner-principal'])) { parent::propPatch($propPatch); } } diff --git a/apps/dav/lib/CardDAV/CardDavBackend.php b/apps/dav/lib/CardDAV/CardDavBackend.php index 045ad4d1385..d7bad8d74ca 100644 --- a/apps/dav/lib/CardDAV/CardDavBackend.php +++ b/apps/dav/lib/CardDAV/CardDavBackend.php @@ -311,10 +311,12 @@ class CardDavBackend implements BackendInterface, SyncSupport { '{' . Plugin::NS_CARDDAV . '}addressbook-description' => $row['description'], '{http://calendarserver.org/ns/}getctag' => $row['synctoken'], '{http://sabredav.org/ns}sync-token' => $row['synctoken'] ?: '0', + ]; // system address books are always read only if ($principal === 'principals/system/system') { + $addressBook['{' . \OCA\DAV\DAV\Sharing\Plugin::NS_OWNCLOUD . '}owner-principal'] = $row['principaluri']; $addressBook['{' . \OCA\DAV\DAV\Sharing\Plugin::NS_OWNCLOUD . '}read-only'] = true; } diff --git a/apps/dav/lib/Connector/Sabre/FilesPlugin.php b/apps/dav/lib/Connector/Sabre/FilesPlugin.php index ae3caa29b91..709a4cd68ed 100644 --- a/apps/dav/lib/Connector/Sabre/FilesPlugin.php +++ b/apps/dav/lib/Connector/Sabre/FilesPlugin.php @@ -465,13 +465,17 @@ class FilesPlugin extends ServerPlugin { $requestProperties = $propFind->getRequestedProperties(); - if ($this->config->getSystemValueBool('enable_file_metadata', true)) { - $requestedMetaData = []; - foreach ($requestProperties as $requestProperty) { - if (isset(self::ALL_METADATA_PROPS[$requestProperty])) { - $requestedMetaData[] = self::ALL_METADATA_PROPS[$requestProperty]; - } + $requestedMetaData = []; + foreach ($requestProperties as $requestProperty) { + if (isset(self::ALL_METADATA_PROPS[$requestProperty])) { + $requestedMetaData[] = self::ALL_METADATA_PROPS[$requestProperty]; } + } + if ( + $this->config->getSystemValueBool('enable_file_metadata', true) && + $propFind->getDepth() === 1 && + $requestedMetaData + ) { $children = $node->getChildren(); // Preloading of the metadata diff --git a/apps/dav/lib/Connector/Sabre/Principal.php b/apps/dav/lib/Connector/Sabre/Principal.php index 0a882288314..b1f1da6f63d 100644 --- a/apps/dav/lib/Connector/Sabre/Principal.php +++ b/apps/dav/lib/Connector/Sabre/Principal.php @@ -208,6 +208,11 @@ class Principal implements BackendInterface { '{DAV:}displayname' => $group->getDisplayName(), ]; } + } elseif ($prefix === 'principals/system') { + return [ + 'uri' => 'principals/system/' . $name, + '{DAV:}displayname' => $this->languageFactory->get('dav')->t("Accounts"), + ]; } return null; } diff --git a/apps/dav/tests/unit/CalDAV/CalDavBackendTest.php b/apps/dav/tests/unit/CalDAV/CalDavBackendTest.php index acf5504eb66..3da6ca61b7e 100644 --- a/apps/dav/tests/unit/CalDAV/CalDavBackendTest.php +++ b/apps/dav/tests/unit/CalDAV/CalDavBackendTest.php @@ -656,7 +656,7 @@ EOS; try { $actual = $this->backend->getDenormalizedData($calData); $this->assertEquals($expected, $actual[$key]); - } catch (\ValueError $e) { + } catch (\Throwable $e) { if (($e->getMessage() === 'Epoch doesn\'t fit in a PHP integer') && (PHP_INT_SIZE < 8)) { $this->markTestSkipped('This fail on 32bits because of PHP limitations in DateTime'); } diff --git a/apps/dav/tests/unit/CardDAV/AddressBookTest.php b/apps/dav/tests/unit/CardDAV/AddressBookTest.php index 9aa7eb14fff..06d81662a42 100644 --- a/apps/dav/tests/unit/CardDAV/AddressBookTest.php +++ b/apps/dav/tests/unit/CardDAV/AddressBookTest.php @@ -124,7 +124,6 @@ class AddressBookTest extends TestCase { $backend = $this->getMockBuilder(CardDavBackend::class)->disableOriginalConstructor()->getMock(); $backend->expects($this->atLeast(1))->method('updateAddressBook'); $addressBookInfo = [ - '{http://owncloud.org/ns}owner-principal' => 'user1', '{DAV:}displayname' => 'Test address book', 'principaluri' => 'user1', 'id' => 666, diff --git a/apps/files/appinfo/routes.php b/apps/files/appinfo/routes.php index 05d0a37fd70..97f47facff0 100644 --- a/apps/files/appinfo/routes.php +++ b/apps/files/appinfo/routes.php @@ -139,16 +139,14 @@ $application->registerRoutes( 'verb' => 'GET' ], [ - 'name' => 'view#index', + 'name' => 'view#indexView', 'url' => '/{view}', 'verb' => 'GET', - 'postfix' => 'view', ], [ - 'name' => 'view#index', + 'name' => 'view#indexViewFileid', 'url' => '/{view}/{fileid}', 'verb' => 'GET', - 'postfix' => 'fileid', ], ], 'ocs' => [ diff --git a/apps/files/css/files.css b/apps/files/css/files.css index 517153358eb..edf2f43b3f2 100644 --- a/apps/files/css/files.css +++ b/apps/files/css/files.css @@ -1 +1 @@ -.actions{padding:3px;height:100%;display:inline-block;float:left}.actions input,.actions button,.actions .button{margin:0;float:left}.actions .button a{color:#555}.actions .button a:hover,.actions .button a:focus{background-color:var(--color-background-hover)}.actions .button a:active{background-color:var(--color-primary-element-light)}.actions.creatable{position:relative;display:flex;flex:1 1}.actions.creatable .button:not(:last-child){margin-right:3px}.actions.hidden{display:none}#trash{margin-right:8px;float:right;z-index:1010;padding:10px;font-weight:normal}.newFileMenu .error,.newFileMenu .error+.icon-confirm,.files-fileList .error{color:var(--color-error);border-color:var(--color-error)}.files-filestable{position:relative;width:100%;min-width:250px;display:block;flex-direction:column}.emptycontent:not(.hidden)~.files-filestable{display:none}.files-filestable thead{position:-webkit-sticky;position:sticky;top:44px;z-index:60;display:block;background-color:var(--color-main-background-translucent)}.files-filestable tbody{display:table;width:100%}.files-filestable tbody tr[data-permissions="0"],.files-filestable tbody tr[data-permissions="16"]{background-color:var(--color-background-dark)}.files-filestable tbody tr[data-permissions="0"] td.filename .nametext .innernametext,.files-filestable tbody tr[data-permissions="16"] td.filename .nametext .innernametext{color:var(--color-text-maxcontrast)}.files-filestable tbody tr[data-e2eencrypted=true] .selection{pointer-events:none}.files-filestable.hidden{display:none}.app-files #app-content>.viewcontainer{min-height:0%;width:100%}.app-files #app-content{width:calc(100% - 300px);overflow-anchor:none}.file-drag,.file-drag .files-filestable tbody tr,.file-drag .files-filestable tbody tr:hover{background-color:var(--color-primary-element-light) !important}.app-files #app-content.dir-drop{background-color:var(--color-main-background) !important}.file-drag .files-filestable tbody tr,.file-drag .files-filestable tbody tr:hover{background-color:rgba(0,0,0,0) !important}.app-files #app-content.dir-drop .files-filestable tbody tr.dropping-to-dir{background-color:var(--color-primary-element-light) !important}.nav-icon-files{background-image:var(--icon-folder-dark)}.nav-icon-recent{background-image:var(--icon-recent-dark)}.nav-icon-favorites{background-image:var(--icon-starred-dark)}.nav-icon-sharinginOld,.nav-icon-sharingoutOld,.nav-icon-pendingsharesOld,.nav-icon-shareoverviewOld{background-image:var(--icon-share-dark)}.nav-icon-sharinglinksOld{background-image:var(--icon-public-dark)}.nav-icon-extstoragemounts{background-image:var(--icon-external-dark)}.nav-icon-trashbin{background-image:var(--icon-delete-dark)}.nav-icon-trashbin-starred{background-image:var(--icon-delete-#ff0000)}.nav-icon-deletedsharesOld{background-image:var(--icon-unshare-dark)}.nav-icon-favorites-starred{background-image:var(--icon-starred-yellow)}#app-navigation .nav-files a.nav-icon-files{width:auto}#app-navigation .nav-files a.new{width:40px;height:32px;padding:0 10px;margin:0;cursor:pointer}#app-navigation .nav-files a.new.hidden{display:none}#app-navigation .nav-files a.new.disabled{opacity:.3}.files-filestable tbody tr{height:51px}.files-filestable tbody tr:hover,.files-filestable tbody tr:focus,.files-filestable tbody .name:focus,.files-filestable tbody tr:hover .filename form,table tr.mouseOver td{background-color:var(--color-background-hover)}.files-filestable tbody tr:active,.files-filestable tbody tr.highlighted,.files-filestable tbody tr.highlighted .name:focus,.files-filestable tbody tr.selected,.files-filestable tbody tr.searchresult{background-color:var(--color-primary-element-light)}tbody a{color:var(--color-main-text)}span.conflict-path,span.extension,span.uploading,td.date{color:var(--color-text-maxcontrast)}span.conflict-path,span.extension{-webkit-transition:opacity 300ms;-moz-transition:opacity 300ms;-o-transition:opacity 300ms;transition:opacity 300ms;vertical-align:top}tr:hover span.conflict-path,tr:focus span.conflict-path,tr:hover span.extension,tr:focus span.extension{opacity:1;color:var(--color-text-maxcontrast)}table th,table th a{color:var(--color-text-maxcontrast)}table.multiselect th a{color:var(--color-main-text)}table th .columntitle{display:block;padding:15px;height:50px;box-sizing:border-box;-moz-box-sizing:border-box;vertical-align:middle}table th .columntitle:focus-visible{border-radius:2px}table.multiselect th .columntitle{display:inline-block;margin-right:-20px}table th .columntitle.name{padding-left:0;margin-left:44px}table.multiselect th .columntitle.name{margin-left:0}table th .sort-indicator{width:10px;height:8px;margin-left:5px;display:inline-block;vertical-align:text-bottom;opacity:.3}.sort-indicator.hidden,.multiselect .sort-indicator,table.multiselect th:hover .sort-indicator.hidden,table.multiselect th:focus .sort-indicator.hidden{visibility:hidden}.multiselect .sort,.multiselect .sort span{cursor:default}table th:hover .sort-indicator.hidden,table th:focus .sort-indicator.hidden{visibility:visible}table th,table td{border-bottom:1px solid var(--color-border);text-align:left;font-weight:normal}table td{padding:0 15px;font-style:normal;background-position:8px center;background-repeat:no-repeat}table th.column-name{position:relative;width:9999px;padding:0}.column-name-container{position:relative;height:50px}table th.column-selection{padding-top:2px}table th.column-size,table td.filesize{text-align:right}table th.column-mtime,table td.date,table th.column-last,table td.column-last{-moz-box-sizing:border-box;box-sizing:border-box;position:relative;min-width:130px}#app-content-recent,#app-content-favorites,#app-content-shareoverview,#app-content-sharingout,#app-content-sharingin,#app-content-sharinglinks,#app-content-deletedshares,#app-content-pendingshares{margin-top:22px}#app-content-recent thead,#app-content-favorites thead,#app-content-shareoverview thead,#app-content-sharingout thead,#app-content-sharingin thead,#app-content-sharinglinks thead,#app-content-deletedshares thead,#app-content-pendingshares thead{top:0}table.multiselect thead th{background-color:var(--color-main-background-translucent);font-weight:bold}#app-content.with-app-sidebar table.multiselect thead{margin-right:27%}table.multiselect .column-name{position:relative;width:9999px}table.multiselect .column-mtime>a{display:none}table td.selection,table th.selection,table td.fileaction{width:32px;text-align:center}table td.filename a.name,table td.filename p.name{display:flex;position:relative;-moz-box-sizing:border-box;box-sizing:border-box;height:50px;line-height:50px;padding:0}table td.filename .thumbnail-wrapper{width:0;min-width:50px;max-width:50px;height:50px}table td.filename .thumbnail-wrapper.icon-loading-small:after{z-index:10}table td.filename .thumbnail-wrapper.icon-loading-small .thumbnail{opacity:.2}table td.filename .thumbnail{display:inline-block;width:32px;height:32px;background-size:contain;background-position:center;background-repeat:no-repeat;margin-left:9px;margin-top:9px;border-radius:var(--border-radius);cursor:pointer;position:absolute;z-index:4}table td.filename p.name .thumbnail{cursor:default}table tr[data-has-preview=true] .thumbnail{border:1px solid var(--color-border)}table:not(.view-grid) td.filename input.filename{width:70% !important;margin-left:48px !important;cursor:text}table td.filename form{margin-top:-40px;position:relative;top:-6px}table td.filename a,table td.login,table td.logout,table td.download,table td.upload,table td.create,table td.delete{padding:3px 8px 8px 3px}table td.filename .nametext,.modified,.column-last>span:first-child{float:left;padding:15px 0}.modified,.column-last>span:first-child{position:relative;overflow:hidden;text-overflow:ellipsis;width:110px}table td.filename{max-width:0}table td.filename .nametext{width:0;flex-grow:1;display:flex;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;height:100%;z-index:10;padding:0 20px 0 0}table td.filename .system-tags{--min-size: 32px;display:flex;justify-content:center;align-items:center;min-width:calc(var(--min-size)*2);max-width:300px}table td.filename .system-tags .system-tags__tag{padding:5px 10px;border:1px solid;border-radius:var(--border-radius-pill);border-color:var(--color-border);color:var(--color-text-maxcontrast);height:var(--min-size);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;line-height:22px;text-align:center}table td.filename .system-tags .system-tags__tag--more{overflow:visible;text-overflow:initial}table td.filename .system-tags .system-tags__tag+.system-tags__tag{margin-left:5px}.hide-hidden-files .files-filestable .files-fileList tr.hidden-file,.hide-hidden-files .files-filestable .files-fileList tr.hidden-file.dragging{display:none !important}.files-fileList tr.animate-opacity{-webkit-transition:opacity 250ms;-moz-transition:opacity 250ms;-o-transition:opacity 250ms;transition:opacity 250ms}.files-fileList tr.dragging{opacity:.2}table td.filename .nametext .innernametext{text-overflow:ellipsis;overflow:hidden;position:relative;vertical-align:top}table td.filename .uploadtext{position:absolute;font-weight:normal;margin-left:50px;left:0;bottom:0;height:20px;padding:0 4px;padding-left:1px;font-size:11px;line-height:22px;color:var(--color-text-maxcontrast);text-overflow:ellipsis;white-space:nowrap}table td.selection{padding:0}.files-fileList tr td.selection>.selectCheckBox+label:before{opacity:.3;margin-right:0}.files-fileList tr:hover td.selection>.selectCheckBox+label:before,.files-fileList tr:focus td.selection>.selectCheckBox+label:before,.files-fileList tr td.selection>.selectCheckBox:checked+label:before,.files-fileList tr.selected td.selection>.selectCheckBox+label:before{opacity:1}.files-fileList tr.halfselected td.selection>.selectCheckBox+label:before{opacity:.5}.files-fileList tr td.selection>.selectCheckBox+label,.select-all+label{padding:16px}.files-fileList tr td.selection>.selectCheckBox:focus-visible+label,.select-all:focus-visible+label{background-color:var(--color-background-hover);border-radius:var(--border-radius-pill);outline:none !important;border:2px solid var(--color-primary-element) !important;padding:14px}.files-fileList tr td.selection>.selectCheckBox:focus-visible+label,.select-all:focus-visible+label{outline-offset:0px}.files-fileList tr td.filename{position:relative;width:100%;padding-left:0;padding-right:0;-webkit-transition:background-image 500ms;-moz-transition:background-image 500ms;-o-transition:background-image 500ms;transition:background-image 500ms}.files-fileList tr td.filename a.name label,.files-fileList tr td.filename p.name label{position:absolute;width:80%;height:50px}.files-fileList tr td.filename .favorite{display:inline-block;float:left}.files-fileList tr td.filename .favorite-mark{position:absolute;display:block;top:-8px;right:-8px;line-height:100%;text-align:center}.files-fileList tr td.filename .favorite-mark.permanent{background-color:var(--color-main-background);mask:var(--icon-star-rounded-white) no-repeat;mask-size:22px 22px;width:22px;height:22px;display:flex;align-content:center;justify-content:center}.files-fileList tr:hover td.filename .favorite-mark.permanent{background-color:var(--color-background-hover)}#uploadsize-message,#delete-confirm{display:none}.fileactions{z-index:50}.busy .fileactions,.busy .action{visibility:hidden}.bubble,#app-navigation .app-navigation-entry-menu{min-width:100px}.files-fileList .icon-loading-small{opacity:1 !important;display:inline !important}.files-fileList .action.action-share-notification span,.files-fileList a.name{cursor:default !important}.files-fileList a.name.disabled *{cursor:default}.files-fileList a.name.disabled a,.files-fileList a.name.disabled a *{cursor:pointer}.files-fileList a.name.disabled:focus{background:none}a.action>img{height:16px;width:16px;vertical-align:text-bottom}a.action.action-editlocally img.icon,a.action.action-setreminder img.icon{filter:var(--background-invert-if-dark)}.selectedActions{position:relative;display:inline-block;vertical-align:middle}.selectedActions.hidden{display:none}.selectedActions a{display:inline;line-height:50px;padding:16px 5px}.selectedActions a.hidden{display:none}.selectedActions a img{position:relative;vertical-align:text-bottom;margin-bottom:-1px}.selectedActions .actions-selected .icon-more{margin-top:-3px}.files-fileList td a a.action{display:inline;padding:17px 8px;line-height:50px;opacity:.3}.files-fileList td a a.action.action-share{padding:17px 14px}.files-fileList td a a.action.action-share.permanent:not(.shared-style) .icon-shared+span{position:absolute;left:-10000px;top:auto;width:1px;height:1px;overflow:hidden}.files-fileList td a a.action.action-share .avatar{display:inline-block;vertical-align:middle}.files-fileList td a a.action.action-menu{padding-top:17px;padding-bottom:17px;padding-left:14px;padding-right:14px}.files-fileList td a a.action.no-permission:hover,.files-fileList td a a.action.no-permission:focus{opacity:.3}.files-fileList td a a.action.disabled:hover,.files-fileList td a a.action.disabled:focus,.files-fileList td a a.action.disabled img{opacity:.3}.files-fileList td a a.action.disabled.action-download{opacity:.7}.files-fileList td a a.action.disabled.action-download:hover,.files-fileList td a a.action.disabled.action-download:focus{opacity:.7}.files-fileList td a a.action:hover,.files-fileList td a a.action:focus{opacity:1}.files-fileList td a a.action:focus{background-color:var(--color-background-hover);border-radius:var(--border-radius-pill)}.files-fileList td a .fileActionsMenu a.action,.files-fileList td a a.action.action-share.shared-style{opacity:.7}.files-fileList td a .fileActionsMenu .action.permanent{opacity:1}.files-fileList .action.action-share.permanent.shared-style span:not(.icon){display:inline-block;max-width:70px;overflow:hidden;text-overflow:ellipsis;vertical-align:middle;margin-left:6px}.files-fileList .remoteAddress .userDomain{margin-left:0 !important}.files-fileList .favorite-mark.permanent{opacity:1}.files-fileList .fileActionsMenu a.action:hover,.files-fileList .fileActionsMenu a.action:focus,.files-fileList a.action.action-share.shared-style:hover,.files-fileList a.action.action-share.shared-style:focus{opacity:1}.files-fileList tr a.action.disabled{background:none}.selectedActions a.download.disabled,.files-fileList tr a.action.action-download.disabled{color:#000}.files-fileList tr:hover a.action.disabled:hover *{cursor:default}.summary{color:var(--color-text-maxcontrast);height:330px}.files-filestable .summary .filesummary{width:100%;padding-left:101px}#body-public .summary{height:180px}.summary:hover,.summary:focus,.summary,table tr.summary td{background-color:rgba(0,0,0,0)}.summary td{border-bottom:none;vertical-align:top;padding-top:20px}.summary td:first-child{padding:0}.hiddeninfo{white-space:pre-line}table.dragshadow{width:auto;z-index:2000}table.dragshadow td.filename{padding-left:60px;padding-right:16px;height:36px;max-width:unset}table.dragshadow td.size{padding-right:8px}.mask{z-index:50;position:absolute;top:0;left:0;right:0;bottom:0;background-color:var(--color-main-background);background-repeat:no-repeat no-repeat;background-position:50%;opacity:.7;transition:opacity 100ms;-moz-transition:opacity 100ms;-o-transition:opacity 100ms;-ms-transition:opacity 100ms;-webkit-transition:opacity 100ms}.mask.transparent{opacity:0}.newFileMenu{font-weight:300;top:100%;left:-48px !important;margin-top:4px;min-width:100px;z-index:1001}.newFileMenu::after{left:61px !important}.files-controls{box-sizing:border-box;position:-webkit-sticky;position:sticky;height:50px;padding:0;margin:0;background-color:var(--color-main-background-translucent);z-index:62;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:flex;top:0;padding-left:50px}.files-controls .actions>div>.button,.files-controls .actions>div button,.files-controls .actions>.button,.files-controls .actions button{box-sizing:border-box;display:inline-block;display:flex;height:44px;width:44px;padding:9px;align-items:center;justify-content:center}.files-controls .actions>div .button.hidden,.files-controls .actions .button.hidden{display:none}.viewer-mode #app-navigation+#app-content .files-controls{left:0}.files-filestable .filename .action .icon,.files-filestable .selectedActions a .icon,.files-filestable .filename .favorite-mark .icon,.files-controls .actions .button .icon{display:inline-block;vertical-align:middle;background-size:16px 16px}.files-filestable .filename .favorite-mark .icon-star{background-image:none}.files-filestable .filename .favorite-mark .icon-starred{background-image:var(--icon-starred-yellow) !important}.files-filestable .filename .action .icon.hidden,.files-filestable .selectedActions a .icon.hidden,.files-controls .actions .button .icon.hidden{display:none}.files-filestable .filename .action .icon.loading,.files-filestable .selectedActions a .icon.loading,.files-controls .actions .button .icon.loading{width:15px;height:15px}.app-files .actions .button.new{position:relative}.breadcrumb{align-items:center}.breadcrumb .icon-home{border-radius:var(--border-radius)}.breadcrumb .canDrop>a,.files-filestable tbody tr.canDrop{background-color:rgba(0,130,201,.3)}.dropzone-background{background-color:rgba(0,130,201,.3)}.dropzone-background :hover{box-shadow:none !important}.notCreatable{margin-left:12px;margin-right:44px;margin-top:12px;color:var(--color-main-text);overflow:auto;min-width:160px;height:54px}.notCreatable:not(.hidden){display:flex}.notCreatable .icon-alert-outline{top:-15px;position:relative;margin-right:4px}.quota-navigation-item{margin:0 !important;border:none;border-radius:0;background-color:rgba(0,0,0,0);z-index:1;height:44px;display:flex !important;flex-direction:column}.quota-navigation-item__text{height:30px}.quota-navigation-item[href="#"],.quota-navigation-item[href="#"] *{cursor:default !important}.quota-navigation-item__container{height:5px;border-radius:var(--border-radius)}.files-filestable.view-grid:not(.hidden) thead tr{display:block;border-bottom:1px solid var(--color-border);background-color:var(--color-main-background-translucent)}.files-filestable.view-grid:not(.hidden) thead tr th{width:auto;border:none}.files-filestable.view-grid:not(.hidden) tbody{display:grid;grid-template-columns:repeat(auto-fill, 160px);justify-content:space-around;row-gap:15px;margin:15px 0}.files-filestable.view-grid:not(.hidden) tbody tr:not(.hidden){display:block;position:relative;height:190px;border-radius:var(--border-radius)}.files-filestable.view-grid:not(.hidden) tbody tr:not(.hidden):hover,.files-filestable.view-grid:not(.hidden) tbody tr:not(.hidden):focus,.files-filestable.view-grid:not(.hidden) tbody tr:not(.hidden):active,.files-filestable.view-grid:not(.hidden) tbody tr:not(.hidden).selected,.files-filestable.view-grid:not(.hidden) tbody tr:not(.hidden).searchresult,.files-filestable.view-grid:not(.hidden) tbody tr:not(.hidden) .name:focus,.files-filestable.view-grid:not(.hidden) tbody tr:not(.hidden).highlighted{background-color:rgba(0,0,0,0)}.files-filestable.view-grid:not(.hidden) tbody tr:not(.hidden):hover .thumbnail-wrapper,.files-filestable.view-grid:not(.hidden) tbody tr:not(.hidden):hover .nametext,.files-filestable.view-grid:not(.hidden) tbody tr:not(.hidden):hover .fileactions,.files-filestable.view-grid:not(.hidden) tbody tr:not(.hidden):focus .thumbnail-wrapper,.files-filestable.view-grid:not(.hidden) tbody tr:not(.hidden):focus .nametext,.files-filestable.view-grid:not(.hidden) tbody tr:not(.hidden):focus .fileactions,.files-filestable.view-grid:not(.hidden) tbody tr:not(.hidden):active .thumbnail-wrapper,.files-filestable.view-grid:not(.hidden) tbody tr:not(.hidden):active .nametext,.files-filestable.view-grid:not(.hidden) tbody tr:not(.hidden):active .fileactions,.files-filestable.view-grid:not(.hidden) tbody tr:not(.hidden).selected .thumbnail-wrapper,.files-filestable.view-grid:not(.hidden) tbody tr:not(.hidden).selected .nametext,.files-filestable.view-grid:not(.hidden) tbody tr:not(.hidden).selected .fileactions,.files-filestable.view-grid:not(.hidden) tbody tr:not(.hidden).searchresult .thumbnail-wrapper,.files-filestable.view-grid:not(.hidden) tbody tr:not(.hidden).searchresult .nametext,.files-filestable.view-grid:not(.hidden) tbody tr:not(.hidden).searchresult .fileactions,.files-filestable.view-grid:not(.hidden) tbody tr:not(.hidden) .name:focus .thumbnail-wrapper,.files-filestable.view-grid:not(.hidden) tbody tr:not(.hidden) .name:focus .nametext,.files-filestable.view-grid:not(.hidden) tbody tr:not(.hidden) .name:focus .fileactions,.files-filestable.view-grid:not(.hidden) tbody tr:not(.hidden).highlighted .thumbnail-wrapper,.files-filestable.view-grid:not(.hidden) tbody tr:not(.hidden).highlighted .nametext,.files-filestable.view-grid:not(.hidden) tbody tr:not(.hidden).highlighted .fileactions{background-color:var(--color-background-hover)}.files-filestable.view-grid:not(.hidden) tbody td{display:inline;border-bottom:none}.files-filestable.view-grid:not(.hidden) tbody td.filename .thumbnail-wrapper{min-width:0;max-width:none;position:absolute;width:160px;height:160px;padding:14px;top:0;left:0;z-index:-1}.files-filestable.view-grid:not(.hidden) tbody td.filename .thumbnail-wrapper .thumbnail{width:calc(100% - 2 * 14px);height:calc(100% - 2 * 14px);background-size:contain;margin:0;border-radius:var(--border-radius);background-repeat:no-repeat;background-position:center}.files-filestable.view-grid:not(.hidden) tbody td.filename .thumbnail-wrapper .thumbnail .favorite-mark{left:auto;top:-11px;right:-11px}.files-filestable.view-grid:not(.hidden) tbody td.filename .uploadtext{width:100%;margin:0;top:0;bottom:auto;height:28px;padding-top:4px;padding-left:28px}.files-filestable.view-grid:not(.hidden) tbody td.filename .name{height:100%;border-radius:var(--border-radius);overflow:hidden;cursor:pointer !important}.files-filestable.view-grid:not(.hidden) tbody td.filename .name .nametext{display:flex;height:44px;margin-top:146px;text-align:center;line-height:44px;padding:0}.files-filestable.view-grid:not(.hidden) tbody td.filename .name .nametext .innernametext{display:inline-block;text-align:center;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.files-filestable.view-grid:not(.hidden) tbody td.filename .name .nametext:before{content:"";flex:1;min-width:14px}.files-filestable.view-grid:not(.hidden) tbody td.filename .name .nametext:after{content:"";flex:1;min-width:44px}.files-filestable.view-grid:not(.hidden) tbody td.filename .name .nametext .extension{display:none}.files-filestable.view-grid:not(.hidden) tbody td.filename .name .system-tags{display:none}.files-filestable.view-grid:not(.hidden) tbody td.filename .name .fileactions{height:initial;margin-top:146px;display:flex;align-items:center;position:absolute;right:0}.files-filestable.view-grid:not(.hidden) tbody td.filename .name .fileactions .action{padding:14px;width:44px;height:44px;display:flex;align-items:center;justify-content:center}.files-filestable.view-grid:not(.hidden) tbody td.filename .name .fileactions .action:not(.action-menu){display:none}.files-filestable.view-grid:not(.hidden) tbody td.filename .fileActionsMenu .action-share-container.hidden{display:block !important}.files-filestable.view-grid:not(.hidden) tbody td.filename .fileActionsMenu .action-share-container.hidden .action-share img{padding:6px;border-radius:50%}.files-filestable.view-grid:not(.hidden) tbody td.filename .fileActionsMenu .action-restore-container.hidden{display:block !important}.files-filestable.view-grid:not(.hidden) tbody td.filename .fileActionsMenu .action-comment-container.hidden{display:block !important}.files-filestable.view-grid:not(.hidden) tbody td.filename form{padding:3px 14px;border-radius:var(--border-radius)}.files-filestable.view-grid:not(.hidden) tbody td.filename form input.filename{width:100%;margin-left:0;cursor:text}.files-filestable.view-grid:not(.hidden) tbody td.filesize,.files-filestable.view-grid:not(.hidden) tbody td.date{display:none}.files-filestable.view-grid:not(.hidden) tbody td.selection,.files-filestable.view-grid:not(.hidden) tbody td.filename .favorite-mark{position:absolute;top:-8px;left:-8px;display:flex;z-index:10}.files-filestable.view-grid:not(.hidden) tbody td.selection label,.files-filestable.view-grid:not(.hidden) tbody td.filename .favorite-mark label{width:44px;height:44px;display:inline-flex;padding:14px}.files-filestable.view-grid:not(.hidden) tbody td.selection label::before,.files-filestable.view-grid:not(.hidden) tbody td.filename .favorite-mark label::before{margin:0;width:14px;height:14px}.files-filestable.view-grid:not(.hidden) tbody td .popovermenu{left:0;width:150px;margin:0 5px}.files-filestable.view-grid:not(.hidden) tbody td .popovermenu .menuitem span:not(.icon){overflow:hidden;text-overflow:ellipsis}.files-filestable.view-grid:not(.hidden) tr.hidden-file td.filename .name .nametext .extension{display:block}.files-filestable.view-grid:not(.hidden) tfoot{display:grid}.files-filestable.view-grid:not(.hidden) tfoot .summary:not(.hidden){display:inline-block;margin:0 auto;height:418px}.files-filestable.view-grid:not(.hidden) tfoot .summary:not(.hidden) td{padding-top:50px}.files-filestable.view-grid:not(.hidden) tfoot .summary:not(.hidden) td:first-child,.files-filestable.view-grid:not(.hidden) tfoot .summary:not(.hidden) td.date{display:none}.files-filestable.view-grid:not(.hidden) tfoot .summary:not(.hidden) td .info{margin-left:0}#view-toggle{background-color:var(--color-main-background-translucent);border:none;margin:0;padding:22px;opacity:.5;float:right;right:var(--default-grid-baseline);top:var(--default-grid-baseline);z-index:100;position:sticky}#view-toggle:hover,#view-toggle:focus,#showgridview:focus+#view-toggle{opacity:1}#view-toggle:focus-visible,#showgridview:focus-visible+#view-toggle{box-shadow:inset 0 0 0 2px var(--color-primary-element) !important}#showgridview{position:fixed;top:0}#body-public .files-filestable.view-grid:not(.hidden) tbody td.filename .name .nametext .innernametext{max-width:124px}#body-public .files-filestable.view-grid:not(.hidden) tbody td .popovermenu{left:-80px}#body-public #view-toggle{position:absolute;right:0;top:0}#gallery-button{display:none}#tag_multiple_files_container{overflow:hidden;background-color:#fff;border-radius:3px;position:relative;display:flex;flex-wrap:wrap;margin-bottom:10px}#tag_multiple_files_container h3{width:100%;padding:0 18px}#tag_multiple_files_container .systemTagsInputFieldContainer{flex:1 1 80%;min-width:0;margin:0 12px}/*# sourceMappingURL=files.css.map */ +.actions{padding:3px;height:100%;display:inline-block;float:left}.actions input,.actions button,.actions .button{margin:0;float:left}.actions .button a{color:#555}.actions .button a:hover,.actions .button a:focus{background-color:var(--color-background-hover)}.actions .button a:active{background-color:var(--color-primary-element-light)}.actions.creatable{position:relative;display:flex;flex:1 1}.actions.creatable .button:not(:last-child){margin-right:3px;width:unset;gap:14px;background-color:var(--color-primary-element-light);color:var(--color-primary-element-light-text);border:unset;padding:0px 20px}.actions.hidden{display:none}#trash{margin-right:8px;float:right;z-index:1010;padding:10px;font-weight:normal}.newFileMenu .error,.newFileMenu .error+.icon-confirm,.files-fileList .error{color:var(--color-error);border-color:var(--color-error)}.files-filestable{position:relative;width:100%;min-width:250px;display:block;flex-direction:column}.emptycontent:not(.hidden)~.files-filestable{display:none}.files-filestable thead{position:-webkit-sticky;position:sticky;top:44px;z-index:60;display:block;background-color:var(--color-main-background-translucent)}.files-filestable tbody{display:table;width:100%}.files-filestable tbody tr[data-permissions="0"],.files-filestable tbody tr[data-permissions="16"]{background-color:var(--color-background-dark)}.files-filestable tbody tr[data-permissions="0"] td.filename .nametext .innernametext,.files-filestable tbody tr[data-permissions="16"] td.filename .nametext .innernametext{color:var(--color-text-maxcontrast)}.files-filestable tbody tr[data-e2eencrypted=true] .selection{pointer-events:none}.files-filestable.hidden{display:none}.app-files #app-content>.viewcontainer{min-height:0%;width:100%}.app-files #app-content{width:calc(100% - 300px);overflow-anchor:none}.file-drag,.file-drag .files-filestable tbody tr,.file-drag .files-filestable tbody tr:hover{background-color:var(--color-primary-element-light) !important}.app-files #app-content.dir-drop{background-color:var(--color-main-background) !important}.file-drag .files-filestable tbody tr,.file-drag .files-filestable tbody tr:hover{background-color:rgba(0,0,0,0) !important}.app-files #app-content.dir-drop .files-filestable tbody tr.dropping-to-dir{background-color:var(--color-primary-element-light) !important}#app-navigation .nav-files a.new{width:40px;height:32px;padding:0 10px;margin:0;cursor:pointer}#app-navigation .nav-files a.new.hidden{display:none}#app-navigation .nav-files a.new.disabled{opacity:.3}.files-filestable tbody tr{height:51px}.files-filestable tbody tr:hover,.files-filestable tbody tr:focus,.files-filestable tbody .name:focus,.files-filestable tbody tr:hover .filename form,table tr.mouseOver td{background-color:var(--color-background-hover)}.files-filestable tbody tr:active,.files-filestable tbody tr.highlighted,.files-filestable tbody tr.highlighted .name:focus,.files-filestable tbody tr.selected,.files-filestable tbody tr.searchresult{background-color:var(--color-primary-element-light)}tbody a{color:var(--color-main-text)}span.conflict-path,span.extension,span.uploading,td.date{color:var(--color-text-maxcontrast)}span.conflict-path,span.extension{-webkit-transition:opacity 300ms;-moz-transition:opacity 300ms;-o-transition:opacity 300ms;transition:opacity 300ms;vertical-align:top}tr:hover span.conflict-path,tr:focus span.conflict-path,tr:hover span.extension,tr:focus span.extension{opacity:1;color:var(--color-text-maxcontrast)}table th,table th a{color:var(--color-text-maxcontrast)}table.multiselect th a{color:var(--color-main-text)}table th .columntitle{display:block;padding:15px;height:50px;box-sizing:border-box;-moz-box-sizing:border-box;vertical-align:middle}table th .columntitle:focus-visible{border-radius:2px}table.multiselect th .columntitle{display:inline-block;margin-right:-20px}table th .columntitle.name{padding-left:0;margin-left:44px}table.multiselect th .columntitle.name{margin-left:0}table th .sort-indicator{width:10px;height:8px;margin-left:5px;display:inline-block;vertical-align:text-bottom;opacity:.3}.sort-indicator.hidden,.multiselect .sort-indicator,table.multiselect th:hover .sort-indicator.hidden,table.multiselect th:focus .sort-indicator.hidden{visibility:hidden}.multiselect .sort,.multiselect .sort span{cursor:default}table th:hover .sort-indicator.hidden,table th:focus .sort-indicator.hidden{visibility:visible}table th,table td{border-bottom:1px solid var(--color-border);text-align:left;font-weight:normal}table td{padding:0 15px;font-style:normal;background-position:8px center;background-repeat:no-repeat}table th.column-name{position:relative;width:9999px;padding:0}.column-name-container{position:relative;height:50px}table th.column-selection{padding-top:2px}table th.column-size,table td.filesize{text-align:right}table th.column-mtime,table td.date,table th.column-last,table td.column-last{-moz-box-sizing:border-box;box-sizing:border-box;position:relative;min-width:130px}#app-content-recent,#app-content-favorites,#app-content-shareoverview,#app-content-sharingout,#app-content-sharingin,#app-content-sharinglinks,#app-content-deletedshares,#app-content-pendingshares{margin-top:22px}#app-content-recent thead,#app-content-favorites thead,#app-content-shareoverview thead,#app-content-sharingout thead,#app-content-sharingin thead,#app-content-sharinglinks thead,#app-content-deletedshares thead,#app-content-pendingshares thead{top:0}table.multiselect thead th{background-color:var(--color-main-background-translucent);font-weight:bold}#app-content.with-app-sidebar table.multiselect thead{margin-right:27%}table.multiselect .column-name{position:relative;width:9999px}table.multiselect .column-mtime>a{display:none}table td.selection,table th.selection,table td.fileaction{width:32px;text-align:center}table td.filename a.name,table td.filename p.name{display:flex;position:relative;-moz-box-sizing:border-box;box-sizing:border-box;height:50px;line-height:50px;padding:0}table td.filename .thumbnail-wrapper{width:0;min-width:50px;max-width:50px;height:50px}table td.filename .thumbnail-wrapper.icon-loading-small:after{z-index:10}table td.filename .thumbnail-wrapper.icon-loading-small .thumbnail{opacity:.2}table td.filename .thumbnail{display:inline-block;width:32px;height:32px;background-size:contain;background-position:center;background-repeat:no-repeat;margin-left:9px;margin-top:9px;border-radius:var(--border-radius);cursor:pointer;position:absolute;z-index:4}table td.filename p.name .thumbnail{cursor:default}table tr[data-has-preview=true] .thumbnail{border:1px solid var(--color-border)}table:not(.view-grid) td.filename input.filename{width:70% !important;margin-left:48px !important;cursor:text}table td.filename form{margin-top:-40px;position:relative;top:-6px}table td.filename a,table td.login,table td.logout,table td.download,table td.upload,table td.create,table td.delete{padding:3px 8px 8px 3px}table td.filename .nametext,.modified,.column-last>span:first-child{float:left;padding:15px 0}.modified,.column-last>span:first-child{position:relative;overflow:hidden;text-overflow:ellipsis;width:110px}table td.filename{max-width:0}table td.filename .nametext{width:0;flex-grow:1;display:flex;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;height:100%;z-index:10;padding:0 20px 0 0}table td.filename .system-tags{--min-size: 32px;display:flex;justify-content:center;align-items:center;min-width:calc(var(--min-size)*2);max-width:300px}table td.filename .system-tags .system-tags__tag{padding:5px 10px;border:1px solid;border-radius:var(--border-radius-pill);border-color:var(--color-border);color:var(--color-text-maxcontrast);height:var(--min-size);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;line-height:22px;text-align:center}table td.filename .system-tags .system-tags__tag--more{overflow:visible;text-overflow:initial}table td.filename .system-tags .system-tags__tag+.system-tags__tag{margin-left:5px}.hide-hidden-files .files-filestable .files-fileList tr.hidden-file,.hide-hidden-files .files-filestable .files-fileList tr.hidden-file.dragging{display:none !important}.files-fileList tr.animate-opacity{-webkit-transition:opacity 250ms;-moz-transition:opacity 250ms;-o-transition:opacity 250ms;transition:opacity 250ms}.files-fileList tr.dragging{opacity:.2}table td.filename .nametext .innernametext{text-overflow:ellipsis;overflow:hidden;position:relative;vertical-align:top}table td.filename .uploadtext{position:absolute;font-weight:normal;margin-left:50px;left:0;bottom:0;height:20px;padding:0 4px;padding-left:1px;font-size:11px;line-height:22px;color:var(--color-text-maxcontrast);text-overflow:ellipsis;white-space:nowrap}table td.selection{padding:0}.files-fileList tr td.selection>.selectCheckBox+label:before{opacity:.3;margin-right:0}.files-fileList tr:hover td.selection>.selectCheckBox+label:before,.files-fileList tr:focus td.selection>.selectCheckBox+label:before,.files-fileList tr td.selection>.selectCheckBox:checked+label:before,.files-fileList tr.selected td.selection>.selectCheckBox+label:before{opacity:1}.files-fileList tr.halfselected td.selection>.selectCheckBox+label:before{opacity:.5}.files-fileList tr td.selection>.selectCheckBox+label,.select-all+label{padding:16px}.files-fileList tr td.selection>.selectCheckBox:focus-visible+label,.select-all:focus-visible+label{background-color:var(--color-background-hover);border-radius:var(--border-radius-pill);outline:none !important;border:2px solid var(--color-primary-element) !important;padding:14px}.files-fileList tr td.selection>.selectCheckBox:focus-visible+label,.select-all:focus-visible+label{outline-offset:0px}.files-fileList tr td.filename{position:relative;width:100%;padding-left:0;padding-right:0;-webkit-transition:background-image 500ms;-moz-transition:background-image 500ms;-o-transition:background-image 500ms;transition:background-image 500ms}.files-fileList tr td.filename a.name label,.files-fileList tr td.filename p.name label{position:absolute;width:80%;height:50px}.files-fileList tr td.filename .favorite{display:inline-block;float:left}.files-fileList tr td.filename .favorite-mark{position:absolute;display:block;top:-8px;right:-8px;line-height:100%;text-align:center}.files-fileList tr td.filename .favorite-mark.permanent{background-color:var(--color-main-background);mask:var(--icon-star-rounded-white) no-repeat;mask-size:22px 22px;width:22px;height:22px;display:flex;align-content:center;justify-content:center}.files-fileList tr:hover td.filename .favorite-mark.permanent{background-color:var(--color-background-hover)}#uploadsize-message,#delete-confirm{display:none}.fileactions{z-index:50}.busy .fileactions,.busy .action{visibility:hidden}.bubble,#app-navigation .app-navigation-entry-menu{min-width:100px}.files-fileList .icon-loading-small{opacity:1 !important;display:inline !important}.files-fileList .action.action-share-notification span,.files-fileList a.name{cursor:default !important}.files-fileList a.name.disabled *{cursor:default}.files-fileList a.name.disabled a,.files-fileList a.name.disabled a *{cursor:pointer}.files-fileList a.name.disabled:focus{background:none}a.action>img{height:16px;width:16px;vertical-align:text-bottom}a.action.action-editlocally img.icon,a.action.action-setreminder img.icon{filter:var(--background-invert-if-dark)}.selectedActions{position:relative;display:inline-block;vertical-align:middle}.selectedActions.hidden{display:none}.selectedActions a{display:inline;line-height:50px;padding:16px 5px}.selectedActions a.hidden{display:none}.selectedActions a img{position:relative;vertical-align:text-bottom;margin-bottom:-1px}.selectedActions .actions-selected .icon-more{margin-top:-3px}.files-fileList td a a.action{display:inline;padding:17px 8px;line-height:50px;opacity:.3}.files-fileList td a a.action.action-share{padding:17px 14px}.files-fileList td a a.action.action-share.permanent:not(.shared-style) .icon-shared+span{position:absolute;left:-10000px;top:auto;width:1px;height:1px;overflow:hidden}.files-fileList td a a.action.action-share .avatar{display:inline-block;vertical-align:middle}.files-fileList td a a.action.action-menu{padding-top:17px;padding-bottom:17px;padding-left:14px;padding-right:14px}.files-fileList td a a.action.no-permission:hover,.files-fileList td a a.action.no-permission:focus{opacity:.3}.files-fileList td a a.action.disabled:hover,.files-fileList td a a.action.disabled:focus,.files-fileList td a a.action.disabled img{opacity:.3}.files-fileList td a a.action.disabled.action-download{opacity:.7}.files-fileList td a a.action.disabled.action-download:hover,.files-fileList td a a.action.disabled.action-download:focus{opacity:.7}.files-fileList td a a.action:hover,.files-fileList td a a.action:focus{opacity:1}.files-fileList td a a.action:focus{background-color:var(--color-background-hover);border-radius:var(--border-radius-pill)}.files-fileList td a .fileActionsMenu a.action,.files-fileList td a a.action.action-share.shared-style{opacity:.7}.files-fileList td a .fileActionsMenu .action.permanent{opacity:1}.files-fileList .action.action-share.permanent.shared-style span:not(.icon){display:inline-block;max-width:70px;overflow:hidden;text-overflow:ellipsis;vertical-align:middle;margin-left:6px}.files-fileList .remoteAddress .userDomain{margin-left:0 !important}.files-fileList .favorite-mark.permanent{opacity:1}.files-fileList .fileActionsMenu a.action:hover,.files-fileList .fileActionsMenu a.action:focus,.files-fileList a.action.action-share.shared-style:hover,.files-fileList a.action.action-share.shared-style:focus{opacity:1}.files-fileList tr a.action.disabled{background:none}.selectedActions a.download.disabled,.files-fileList tr a.action.action-download.disabled{color:#000}.files-fileList tr:hover a.action.disabled:hover *{cursor:default}.summary{color:var(--color-text-maxcontrast);height:330px}.files-filestable .summary .filesummary{width:100%;padding-left:101px}#body-public .summary{height:180px}.summary:hover,.summary:focus,.summary,table tr.summary td{background-color:rgba(0,0,0,0)}.summary td{border-bottom:none;vertical-align:top;padding-top:20px}.summary td:first-child{padding:0}.hiddeninfo{white-space:pre-line}table.dragshadow{width:auto;z-index:2000}table.dragshadow td.filename{padding-left:60px;padding-right:16px;height:36px;max-width:unset}table.dragshadow td.size{padding-right:8px}.mask{z-index:50;position:absolute;top:0;left:0;right:0;bottom:0;background-color:var(--color-main-background);background-repeat:no-repeat no-repeat;background-position:50%;opacity:.7;transition:opacity 100ms;-moz-transition:opacity 100ms;-o-transition:opacity 100ms;-ms-transition:opacity 100ms;-webkit-transition:opacity 100ms}.mask.transparent{opacity:0}.newFileMenu{font-weight:300;top:100%;left:-48px !important;margin-top:4px;min-width:100px;z-index:1001}.newFileMenu::after{left:84px !important}.files-controls{box-sizing:border-box;position:-webkit-sticky;position:sticky;height:50px;padding:0;margin:0;background-color:var(--color-main-background-translucent);z-index:62;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:flex;top:0;padding-left:50px}.files-controls .actions>div>.button,.files-controls .actions>div button,.files-controls .actions>.button,.files-controls .actions button{box-sizing:border-box;display:inline-block;display:flex;height:44px;width:44px;padding:9px;align-items:center;justify-content:center}.files-controls .actions>div .button.hidden,.files-controls .actions .button.hidden{display:none}.viewer-mode #app-navigation+#app-content .files-controls{left:0}.files-filestable .filename .action .icon,.files-filestable .selectedActions a .icon,.files-filestable .filename .favorite-mark .icon,.files-controls .actions .button .icon{display:inline-block;vertical-align:middle;background-size:16px 16px}.files-filestable .filename .favorite-mark .icon-star{background-image:none}.files-filestable .filename .favorite-mark .icon-starred{background-image:var(--icon-starred-yellow) !important}.files-filestable .filename .action .icon.hidden,.files-filestable .selectedActions a .icon.hidden,.files-controls .actions .button .icon.hidden{display:none}.files-filestable .filename .action .icon.loading,.files-filestable .selectedActions a .icon.loading,.files-controls .actions .button .icon.loading{width:15px;height:15px}.app-files .actions .button.new{position:relative;width:unset;gap:14px;background-color:var(--color-primary-element-light);color:var(--color-primary-element-light-text);border:unset;padding:0px 20px}.breadcrumb{align-items:center}.breadcrumb .icon-home{border-radius:var(--border-radius)}.breadcrumb .canDrop>a,.files-filestable tbody tr.canDrop{background-color:rgba(0,130,201,.3)}.dropzone-background{background-color:rgba(0,130,201,.3)}.dropzone-background :hover{box-shadow:none !important}.notCreatable{margin-left:12px;margin-right:44px;margin-top:12px;color:var(--color-main-text);overflow:auto;min-width:160px;height:54px}.notCreatable:not(.hidden){display:flex}.notCreatable .icon-alert-outline{top:-15px;position:relative;margin-right:4px}.quota-navigation-item{margin:0 !important;border:none;border-radius:0;background-color:rgba(0,0,0,0);z-index:1;height:44px;display:flex !important;flex-direction:column}.quota-navigation-item__text{height:30px}.quota-navigation-item[href="#"],.quota-navigation-item[href="#"] *{cursor:default !important}.quota-navigation-item__container{height:5px;border-radius:var(--border-radius)}.files-filestable.view-grid:not(.hidden) thead tr{display:block;border-bottom:1px solid var(--color-border);background-color:var(--color-main-background-translucent)}.files-filestable.view-grid:not(.hidden) thead tr th{width:auto;border:none}.files-filestable.view-grid:not(.hidden) tbody{display:grid;grid-template-columns:repeat(auto-fill, 160px);justify-content:space-around;row-gap:15px;margin:15px 0}.files-filestable.view-grid:not(.hidden) tbody tr:not(.hidden){display:block;position:relative;height:190px;border-radius:var(--border-radius)}.files-filestable.view-grid:not(.hidden) tbody tr:not(.hidden):hover,.files-filestable.view-grid:not(.hidden) tbody tr:not(.hidden):focus,.files-filestable.view-grid:not(.hidden) tbody tr:not(.hidden):active,.files-filestable.view-grid:not(.hidden) tbody tr:not(.hidden).selected,.files-filestable.view-grid:not(.hidden) tbody tr:not(.hidden).searchresult,.files-filestable.view-grid:not(.hidden) tbody tr:not(.hidden) .name:focus,.files-filestable.view-grid:not(.hidden) tbody tr:not(.hidden).highlighted{background-color:rgba(0,0,0,0)}.files-filestable.view-grid:not(.hidden) tbody tr:not(.hidden):hover .thumbnail-wrapper,.files-filestable.view-grid:not(.hidden) tbody tr:not(.hidden):hover .nametext,.files-filestable.view-grid:not(.hidden) tbody tr:not(.hidden):hover .fileactions,.files-filestable.view-grid:not(.hidden) tbody tr:not(.hidden):focus .thumbnail-wrapper,.files-filestable.view-grid:not(.hidden) tbody tr:not(.hidden):focus .nametext,.files-filestable.view-grid:not(.hidden) tbody tr:not(.hidden):focus .fileactions,.files-filestable.view-grid:not(.hidden) tbody tr:not(.hidden):active .thumbnail-wrapper,.files-filestable.view-grid:not(.hidden) tbody tr:not(.hidden):active .nametext,.files-filestable.view-grid:not(.hidden) tbody tr:not(.hidden):active .fileactions,.files-filestable.view-grid:not(.hidden) tbody tr:not(.hidden).selected .thumbnail-wrapper,.files-filestable.view-grid:not(.hidden) tbody tr:not(.hidden).selected .nametext,.files-filestable.view-grid:not(.hidden) tbody tr:not(.hidden).selected .fileactions,.files-filestable.view-grid:not(.hidden) tbody tr:not(.hidden).searchresult .thumbnail-wrapper,.files-filestable.view-grid:not(.hidden) tbody tr:not(.hidden).searchresult .nametext,.files-filestable.view-grid:not(.hidden) tbody tr:not(.hidden).searchresult .fileactions,.files-filestable.view-grid:not(.hidden) tbody tr:not(.hidden) .name:focus .thumbnail-wrapper,.files-filestable.view-grid:not(.hidden) tbody tr:not(.hidden) .name:focus .nametext,.files-filestable.view-grid:not(.hidden) tbody tr:not(.hidden) .name:focus .fileactions,.files-filestable.view-grid:not(.hidden) tbody tr:not(.hidden).highlighted .thumbnail-wrapper,.files-filestable.view-grid:not(.hidden) tbody tr:not(.hidden).highlighted .nametext,.files-filestable.view-grid:not(.hidden) tbody tr:not(.hidden).highlighted .fileactions{background-color:var(--color-background-hover)}.files-filestable.view-grid:not(.hidden) tbody td{display:inline;border-bottom:none}.files-filestable.view-grid:not(.hidden) tbody td.filename .thumbnail-wrapper{min-width:0;max-width:none;position:absolute;width:160px;height:160px;padding:14px;top:0;left:0;z-index:-1}.files-filestable.view-grid:not(.hidden) tbody td.filename .thumbnail-wrapper .thumbnail{width:calc(100% - 2 * 14px);height:calc(100% - 2 * 14px);background-size:contain;margin:0;border-radius:var(--border-radius);background-repeat:no-repeat;background-position:center}.files-filestable.view-grid:not(.hidden) tbody td.filename .thumbnail-wrapper .thumbnail .favorite-mark{left:auto;top:-11px;right:-11px}.files-filestable.view-grid:not(.hidden) tbody td.filename .uploadtext{width:100%;margin:0;top:0;bottom:auto;height:28px;padding-top:4px;padding-left:28px}.files-filestable.view-grid:not(.hidden) tbody td.filename .name{height:100%;border-radius:var(--border-radius);overflow:hidden;cursor:pointer !important}.files-filestable.view-grid:not(.hidden) tbody td.filename .name .nametext{display:flex;height:44px;margin-top:146px;text-align:center;line-height:44px;padding:0}.files-filestable.view-grid:not(.hidden) tbody td.filename .name .nametext .innernametext{display:inline-block;text-align:center;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.files-filestable.view-grid:not(.hidden) tbody td.filename .name .nametext:before{content:"";flex:1;min-width:14px}.files-filestable.view-grid:not(.hidden) tbody td.filename .name .nametext:after{content:"";flex:1;min-width:44px}.files-filestable.view-grid:not(.hidden) tbody td.filename .name .nametext .extension{display:none}.files-filestable.view-grid:not(.hidden) tbody td.filename .name .system-tags{display:none}.files-filestable.view-grid:not(.hidden) tbody td.filename .name .fileactions{height:initial;margin-top:146px;display:flex;align-items:center;position:absolute;right:0}.files-filestable.view-grid:not(.hidden) tbody td.filename .name .fileactions .action{padding:14px;width:44px;height:44px;display:flex;align-items:center;justify-content:center}.files-filestable.view-grid:not(.hidden) tbody td.filename .name .fileactions .action:not(.action-menu){display:none}.files-filestable.view-grid:not(.hidden) tbody td.filename .fileActionsMenu .action-share-container.hidden{display:block !important}.files-filestable.view-grid:not(.hidden) tbody td.filename .fileActionsMenu .action-share-container.hidden .action-share img{padding:6px;border-radius:50%}.files-filestable.view-grid:not(.hidden) tbody td.filename .fileActionsMenu .action-restore-container.hidden{display:block !important}.files-filestable.view-grid:not(.hidden) tbody td.filename .fileActionsMenu .action-comment-container.hidden{display:block !important}.files-filestable.view-grid:not(.hidden) tbody td.filename form{padding:3px 14px;border-radius:var(--border-radius)}.files-filestable.view-grid:not(.hidden) tbody td.filename form input.filename{width:100%;margin-left:0;cursor:text}.files-filestable.view-grid:not(.hidden) tbody td.filesize,.files-filestable.view-grid:not(.hidden) tbody td.date{display:none}.files-filestable.view-grid:not(.hidden) tbody td.selection,.files-filestable.view-grid:not(.hidden) tbody td.filename .favorite-mark{position:absolute;top:-8px;left:-8px;display:flex;z-index:10}.files-filestable.view-grid:not(.hidden) tbody td.selection label,.files-filestable.view-grid:not(.hidden) tbody td.filename .favorite-mark label{width:44px;height:44px;display:inline-flex;padding:14px}.files-filestable.view-grid:not(.hidden) tbody td.selection label::before,.files-filestable.view-grid:not(.hidden) tbody td.filename .favorite-mark label::before{margin:0;width:14px;height:14px}.files-filestable.view-grid:not(.hidden) tbody td .popovermenu{left:0;width:150px;margin:0 5px}.files-filestable.view-grid:not(.hidden) tbody td .popovermenu .menuitem span:not(.icon){overflow:hidden;text-overflow:ellipsis}.files-filestable.view-grid:not(.hidden) tr.hidden-file td.filename .name .nametext .extension{display:block}.files-filestable.view-grid:not(.hidden) tfoot{display:grid}.files-filestable.view-grid:not(.hidden) tfoot .summary:not(.hidden){display:inline-block;margin:0 auto;height:418px}.files-filestable.view-grid:not(.hidden) tfoot .summary:not(.hidden) td{padding-top:50px}.files-filestable.view-grid:not(.hidden) tfoot .summary:not(.hidden) td:first-child,.files-filestable.view-grid:not(.hidden) tfoot .summary:not(.hidden) td.date{display:none}.files-filestable.view-grid:not(.hidden) tfoot .summary:not(.hidden) td .info{margin-left:0}#view-toggle{background-color:var(--color-main-background-translucent);border:none;margin:0;padding:22px;opacity:.5;float:right;right:var(--default-grid-baseline);top:var(--default-grid-baseline);z-index:100;position:sticky}#view-toggle:hover,#view-toggle:focus,#showgridview:focus+#view-toggle{opacity:1}#view-toggle:focus-visible,#showgridview:focus-visible+#view-toggle{box-shadow:inset 0 0 0 2px var(--color-primary-element) !important}#showgridview{position:fixed;top:0}#body-public .files-filestable.view-grid:not(.hidden) tbody td.filename .name .nametext .innernametext{max-width:124px}#body-public .files-filestable.view-grid:not(.hidden) tbody td .popovermenu{left:-80px}#body-public #view-toggle{position:absolute;right:0;top:0}#gallery-button{display:none}#tag_multiple_files_container{overflow:hidden;background-color:#fff;border-radius:3px;position:relative;display:flex;flex-wrap:wrap;margin-bottom:10px}#tag_multiple_files_container h3{width:100%;padding:0 18px}#tag_multiple_files_container .systemTagsInputFieldContainer{flex:1 1 80%;min-width:0;margin:0 12px}/*# sourceMappingURL=files.css.map */ diff --git a/apps/files/css/files.css.map b/apps/files/css/files.css.map index e8e1d739385..14065fd4a68 100644 --- a/apps/files/css/files.css.map +++ b/apps/files/css/files.css.map @@ -1 +1 @@ -{"version":3,"sourceRoot":"","sources":["files.scss","../../../core/css/functions.scss"],"names":[],"mappings":"AAWA,SAEC,YACA,YACA,qBACA,WAED,oEACA,8BACA,kDAEC,+CAED,0BACC,oDAGD,mBACC,kBACA,aACA,SACA,4CACC,iBAIF,gBACC,aAGD,OACC,iBACA,YACA,aACA,aACA,mBAGD,6EAGC,yBACA,gCAID,kBACC,kBACA,WACA,gBACA,cACA,sBAEA,6CACC,aAGD,wBACC,wBACA,gBAEA,SAEA,WACA,cACA,0DAMD,wBACC,cACA,WAEA,mGAEC,8CAEA,6KACC,oCAKF,8DACC,oBAKH,yBACC,aAID,uCACC,cACA,WAGD,wBAGC,yBAEA,qBAGD,6FACC,+DAGD,iCACC,yDAGD,kFACC,0CAGD,4EACC,+DAID,gBCxEC,yCD2ED,iBC3EC,yCD8ED,oBC9EC,0CDiFD,qGCjFC,wCDuFD,0BCvFC,yCD0FD,2BC1FC,2CD6FD,mBC7FC,yCDgGD,2BChGC,4CDmGD,2BCnGC,0CDsGD,4BCtGC,4CD0GD,4CACC,WAGD,iCACC,WACA,YACA,eACA,SACA,eAGD,wCACC,aAGD,0CACC,WAGD,2BACC,YAED,4KAKC,+CAED,wMAKC,oDAGD,qCAEA,yDACC,oCAED,kCACC,iCACA,8BACA,4BACA,yBACA,mBAED,wGAIC,UACA,oCAGD,oBACC,oCAED,uBACC,6BAED,sBACC,cACA,aACA,YACA,sBACA,2BACA,sBACA,oCACC,kBAGF,kCACC,qBACA,mBAED,2BACC,eACA,iBAGD,uCACC,cAGD,yBACC,WACA,WACA,gBACA,qBACA,2BACA,WAED,wJAIC,kBAED,2CACC,eAED,4EAEC,mBAGD,kBAEC,4CACA,gBACA,mBAED,SACC,eACA,kBACA,+BACA,4BAED,qBACC,kBACA,aACA,UAGD,uBACC,kBACA,YAGD,0BACC,gBAED,uCACC,iBAED,8EAEC,2BACA,sBACA,kBAEA,gBAGD,qMAQC,gBACA,qPACC,MAIF,2BACC,0DACA,iBAGD,sDACC,iBAGD,+BACC,kBACA,aAED,kCACC,aAGD,0DAGC,WACA,kBAED,kDAEC,aACA,kBACA,2BACA,sBACA,YACA,iBACA,UAED,qCAEC,QACA,eACA,eACA,YAGA,8DACC,WAED,mEACC,WAGF,6BACC,qBACA,WACA,YACA,wBACA,2BACA,4BACA,gBACA,eACA,mCACA,eACA,kBACA,UAED,oCACC,eAID,2CACC,qCAGD,iDACC,qBACA,4BACA,YAED,uBACC,iBACA,kBACA,SAGD,6IACA,8FAEA,wCACC,kBACA,gBACA,uBACA,YAKA,kBACC,YACA,4BACC,QACA,YACA,aACA,gBACA,mBACA,uBACA,YACA,WACA,mBAID,+BACC,iBACA,aACA,uBACA,mBACA,kCACA,gBAEA,iDACC,iBACA,iBACA,wCACA,iCACA,oCACA,uBACA,mBACA,gBACA,uBACA,iBACA,kBAEA,uDACC,iBACA,sBAID,mEACC,gBAOL,iJAEC,wBAGD,mCACC,iCACA,8BACA,4BACA,yBAED,4BACC,WAGD,2CACC,uBACA,gBACA,kBACA,mBAKD,8BACC,kBACA,mBAEA,iBACA,OACA,SACA,YACA,cAEA,iBACA,eAEA,iBACA,oCACA,uBACA,mBAGD,mBACC,UAID,6DACC,WACA,eAID,iRAIC,UAID,0EACC,WAMA,wEACC,aAGD,oGACC,+CACA,wCACA,wBACA,yDACA,aAIF,oGAEC,mBAGD,+BACC,kBACA,WACA,eACA,gBACA,wJAGD,wFAEC,kBACA,UACA,YAGD,yCACC,qBACA,WAED,8CACC,kBACA,cACA,SACA,WACA,iBACA,kBACA,wDAEC,8CACA,8CACA,oBAEA,WACA,YACA,aACA,qBACA,uBAGF,8DACC,+CAGD,iDAGA,aACC,WAGD,iCACC,kBAID,mDAEC,gBAID,oCACC,qBACA,0BAGD,8EACC,0BAOA,kCACC,eAGD,sEACC,eAGD,sCACC,gBAIF,aACC,YACA,WACA,2BAKA,0EACC,wCAKF,iBACI,kBACA,qBACA,sBAEJ,wBACI,aAEJ,mBACC,eACA,iBACA,iBAGD,0BACC,aAED,uBACC,kBACA,2BACA,mBAGD,8CACC,gBAIA,8BACC,eACA,iBACA,iBACA,WACA,2CACC,kBACA,0FAGC,kBACA,cACA,SACA,UACA,WACA,gBAED,mDACC,qBACA,sBAGF,0CACC,iBACA,oBACA,kBACA,mBAGA,oGACC,WAID,qIAEC,WAED,uDACC,WACA,0HACC,WAIH,wEACC,UAED,oCACC,+CACA,wCAGF,uGACC,WAED,wDACC,UAKF,4EACC,qBACA,eACA,gBACA,uBACA,sBACA,gBAGD,2CACC,yBAGD,yCACC,UAGD,kNAKC,UAGD,qCACC,gBAGD,0FAEC,WAGD,mDACC,eAGD,SACC,oCAGA,aAED,wCACC,WAEA,mBAKD,sBACC,aAED,2DAIC,+BAED,YACC,mBACA,mBACA,iBAED,wBACC,UAED,YACC,qBAGD,iBACC,WACA,aAED,6BACC,kBACA,mBACA,YAGA,gBAED,yBACC,kBAED,MACC,WACA,kBACA,MACA,OACA,QACA,SACA,8CACA,sCACA,wBACA,WACA,yBACA,8BACA,4BACA,6BACA,iCAED,kBACC,UAGD,aACC,gBACA,SACA,sBACA,eACA,gBACA,aAGA,oBACC,qBAKF,gBACC,sBACA,wBACA,gBACA,YACA,UACA,SACA,0DACA,WACA,yBACA,sBACA,qBACA,iBACA,aACA,MACA,kBAKE,0IACC,sBACA,qBACA,aACA,YACA,WACA,YACA,mBACA,uBAED,oFACC,aAQJ,0DACC,OAGD,6KAIC,qBACA,sBACA,0BAMA,sDACC,sBAED,yDACC,uDAIF,iJAGC,aAGD,oJAGC,WACA,YAGD,gCACC,kBAGD,YACC,mBAEA,uBACC,mCAIF,0DAEC,oCAED,qBACC,oCACA,4BACC,2BAIF,cACC,iBACA,kBACA,gBACA,6BACA,cACA,gBACA,YAEA,2BACC,aAGD,kCACC,UACA,kBACA,iBAIF,uBACC,oBACA,YACA,gBACA,+BACA,UACA,YACA,wBACA,sBAEA,6BACC,YAKA,oEACC,0BAIF,kCACC,WACA,mCAWA,kDACC,cACA,4CACA,0DACA,qDACC,WACA,YAMH,+CACC,aACA,+CACA,6BACA,aACA,cAGA,+DACC,cACA,kBACA,aACA,mCAEA,0fAKC,+BAEA,oxDAGC,+CAKH,kDACC,eACA,mBAGC,8EACC,YACA,eACA,kBACA,MAvDQ,MAwDR,OAxDQ,MAyDR,QAxDO,KAyDP,MACA,OACA,WAEA,yFACC,4BACA,6BACA,wBACA,SACA,mCACA,4BACA,2BAKA,wGACC,UACA,UACA,YAKH,uEACC,WACA,SACA,MACA,YAEA,YACA,gBAEA,kBAGD,iEACC,YACA,mCAIA,gBAKA,0BAEA,2EACC,aACA,YACA,iBACA,kBACA,iBACA,UAEA,0FACC,qBACA,kBACA,gBACA,uBACA,mBAED,kFACC,WACA,OACA,eAED,iFACC,WACA,OACA,eAID,sFACC,aAKF,8EACC,aAGD,8EACC,eACA,iBACA,aACA,mBACA,kBACA,QAEA,sFACC,QAxJK,KAyJL,WACA,YACA,aACA,mBACA,uBAGA,wGACC,aAQH,2GACC,yBAEA,6HACC,YACA,kBAIF,6GACC,yBAGD,6GACC,yBAIF,gEACC,iBACA,mCAEA,+EACC,WACA,cACA,YAMH,kHAEC,aAGD,sIAEC,kBACA,SACA,UACA,aACA,WAEA,kJACC,WACA,YACA,oBACA,QAzNO,KA0NP,kKACC,SACA,MA5NM,KA6NN,OA7NM,KAmOT,+DACC,OACA,YACA,aAGA,yFACC,gBACA,uBAMJ,+FACC,cAID,+CACC,aAEA,qEACC,qBACA,cAEA,aAEA,wEACC,iBAEA,iKAEC,aAGD,8EACI,cAQR,aACC,0DACA,YACA,SACA,aACA,WACA,YACA,mCACA,iCACA,YACA,gBAEA,uEAGC,UAGD,oEAEC,mEASF,cACC,eACA,MAOC,uGACC,gBAID,4EACC,WAKF,0BACC,kBACA,QACA,MAKF,gBACC,aAGD,8BACC,gBACA,sBACA,kBACA,kBACA,aACA,eACA,mBAEA,iCACC,WACA,eAGD,6DACC,aACA,YACA","file":"files.css"}
\ No newline at end of file +{"version":3,"sourceRoot":"","sources":["files.scss"],"names":[],"mappings":"AAWA,SAEC,YACA,YACA,qBACA,WAED,oEACA,8BACA,kDAEC,+CAED,0BACC,oDAGD,mBACC,kBACA,aACA,SACA,4CACC,iBACA,YACA,SACA,oDACA,8CACA,aACA,iBAIF,gBACC,aAGD,OACC,iBACA,YACA,aACA,aACA,mBAGD,6EAGC,yBACA,gCAID,kBACC,kBACA,WACA,gBACA,cACA,sBAEA,6CACC,aAGD,wBACC,wBACA,gBAEA,SAEA,WACA,cACA,0DAMD,wBACC,cACA,WAEA,mGAEC,8CAEA,6KACC,oCAKF,8DACC,oBAKH,yBACC,aAID,uCACC,cACA,WAGD,wBAGC,yBAEA,qBAGD,6FACC,+DAGD,iCACC,yDAGD,kFACC,0CAGD,4EACC,+DAID,iCACC,WACA,YACA,eACA,SACA,eAGD,wCACC,aAGD,0CACC,WAGD,2BACC,YAED,4KAKC,+CAED,wMAKC,oDAGD,qCAEA,yDACC,oCAED,kCACC,iCACA,8BACA,4BACA,yBACA,mBAED,wGAIC,UACA,oCAGD,oBACC,oCAED,uBACC,6BAED,sBACC,cACA,aACA,YACA,sBACA,2BACA,sBACA,oCACC,kBAGF,kCACC,qBACA,mBAED,2BACC,eACA,iBAGD,uCACC,cAGD,yBACC,WACA,WACA,gBACA,qBACA,2BACA,WAED,wJAIC,kBAED,2CACC,eAED,4EAEC,mBAGD,kBAEC,4CACA,gBACA,mBAED,SACC,eACA,kBACA,+BACA,4BAED,qBACC,kBACA,aACA,UAGD,uBACC,kBACA,YAGD,0BACC,gBAED,uCACC,iBAED,8EAEC,2BACA,sBACA,kBAEA,gBAGD,qMAQC,gBACA,qPACC,MAIF,2BACC,0DACA,iBAGD,sDACC,iBAGD,+BACC,kBACA,aAED,kCACC,aAGD,0DAGC,WACA,kBAED,kDAEC,aACA,kBACA,2BACA,sBACA,YACA,iBACA,UAED,qCAEC,QACA,eACA,eACA,YAGA,8DACC,WAED,mEACC,WAGF,6BACC,qBACA,WACA,YACA,wBACA,2BACA,4BACA,gBACA,eACA,mCACA,eACA,kBACA,UAED,oCACC,eAID,2CACC,qCAGD,iDACC,qBACA,4BACA,YAED,uBACC,iBACA,kBACA,SAGD,6IACA,8FAEA,wCACC,kBACA,gBACA,uBACA,YAKA,kBACC,YACA,4BACC,QACA,YACA,aACA,gBACA,mBACA,uBACA,YACA,WACA,mBAID,+BACC,iBACA,aACA,uBACA,mBACA,kCACA,gBAEA,iDACC,iBACA,iBACA,wCACA,iCACA,oCACA,uBACA,mBACA,gBACA,uBACA,iBACA,kBAEA,uDACC,iBACA,sBAID,mEACC,gBAOL,iJAEC,wBAGD,mCACC,iCACA,8BACA,4BACA,yBAED,4BACC,WAGD,2CACC,uBACA,gBACA,kBACA,mBAKD,8BACC,kBACA,mBAEA,iBACA,OACA,SACA,YACA,cAEA,iBACA,eAEA,iBACA,oCACA,uBACA,mBAGD,mBACC,UAID,6DACC,WACA,eAID,iRAIC,UAID,0EACC,WAMA,wEACC,aAGD,oGACC,+CACA,wCACA,wBACA,yDACA,aAIF,oGAEC,mBAGD,+BACC,kBACA,WACA,eACA,gBACA,wJAGD,wFAEC,kBACA,UACA,YAGD,yCACC,qBACA,WAED,8CACC,kBACA,cACA,SACA,WACA,iBACA,kBACA,wDAEC,8CACA,8CACA,oBAEA,WACA,YACA,aACA,qBACA,uBAGF,8DACC,+CAGD,iDAGA,aACC,WAGD,iCACC,kBAID,mDAEC,gBAID,oCACC,qBACA,0BAGD,8EACC,0BAOA,kCACC,eAGD,sEACC,eAGD,sCACC,gBAIF,aACC,YACA,WACA,2BAKA,0EACC,wCAKF,iBACI,kBACA,qBACA,sBAEJ,wBACI,aAEJ,mBACC,eACA,iBACA,iBAGD,0BACC,aAED,uBACC,kBACA,2BACA,mBAGD,8CACC,gBAIA,8BACC,eACA,iBACA,iBACA,WACA,2CACC,kBACA,0FAGC,kBACA,cACA,SACA,UACA,WACA,gBAED,mDACC,qBACA,sBAGF,0CACC,iBACA,oBACA,kBACA,mBAGA,oGACC,WAID,qIAEC,WAED,uDACC,WACA,0HACC,WAIH,wEACC,UAED,oCACC,+CACA,wCAGF,uGACC,WAED,wDACC,UAKF,4EACC,qBACA,eACA,gBACA,uBACA,sBACA,gBAGD,2CACC,yBAGD,yCACC,UAGD,kNAKC,UAGD,qCACC,gBAGD,0FAEC,WAGD,mDACC,eAGD,SACC,oCAGA,aAED,wCACC,WAEA,mBAKD,sBACC,aAED,2DAIC,+BAED,YACC,mBACA,mBACA,iBAED,wBACC,UAED,YACC,qBAGD,iBACC,WACA,aAED,6BACC,kBACA,mBACA,YAGA,gBAED,yBACC,kBAED,MACC,WACA,kBACA,MACA,OACA,QACA,SACA,8CACA,sCACA,wBACA,WACA,yBACA,8BACA,4BACA,6BACA,iCAED,kBACC,UAGD,aACC,gBACA,SACA,sBACA,eACA,gBACA,aAGA,oBACC,qBAKF,gBACC,sBACA,wBACA,gBACA,YACA,UACA,SACA,0DACA,WACA,yBACA,sBACA,qBACA,iBACA,aACA,MACA,kBAKE,0IACC,sBACA,qBACA,aACA,YACA,WACA,YACA,mBACA,uBAED,oFACC,aAQJ,0DACC,OAGD,6KAIC,qBACA,sBACA,0BAMA,sDACC,sBAED,yDACC,uDAIF,iJAGC,aAGD,oJAGC,WACA,YAGD,gCACC,kBACA,YACA,SACA,oDACA,8CACA,aACA,iBAGD,YACC,mBAEA,uBACC,mCAIF,0DAEC,oCAED,qBACC,oCACA,4BACC,2BAIF,cACC,iBACA,kBACA,gBACA,6BACA,cACA,gBACA,YAEA,2BACC,aAGD,kCACC,UACA,kBACA,iBAIF,uBACC,oBACA,YACA,gBACA,+BACA,UACA,YACA,wBACA,sBAEA,6BACC,YAKA,oEACC,0BAIF,kCACC,WACA,mCAWA,kDACC,cACA,4CACA,0DACA,qDACC,WACA,YAMH,+CACC,aACA,+CACA,6BACA,aACA,cAGA,+DACC,cACA,kBACA,aACA,mCAEA,0fAKC,+BAEA,oxDAGC,+CAKH,kDACC,eACA,mBAGC,8EACC,YACA,eACA,kBACA,MAvDQ,MAwDR,OAxDQ,MAyDR,QAxDO,KAyDP,MACA,OACA,WAEA,yFACC,4BACA,6BACA,wBACA,SACA,mCACA,4BACA,2BAKA,wGACC,UACA,UACA,YAKH,uEACC,WACA,SACA,MACA,YAEA,YACA,gBAEA,kBAGD,iEACC,YACA,mCAIA,gBAKA,0BAEA,2EACC,aACA,YACA,iBACA,kBACA,iBACA,UAEA,0FACC,qBACA,kBACA,gBACA,uBACA,mBAED,kFACC,WACA,OACA,eAED,iFACC,WACA,OACA,eAID,sFACC,aAKF,8EACC,aAGD,8EACC,eACA,iBACA,aACA,mBACA,kBACA,QAEA,sFACC,QAxJK,KAyJL,WACA,YACA,aACA,mBACA,uBAGA,wGACC,aAQH,2GACC,yBAEA,6HACC,YACA,kBAIF,6GACC,yBAGD,6GACC,yBAIF,gEACC,iBACA,mCAEA,+EACC,WACA,cACA,YAMH,kHAEC,aAGD,sIAEC,kBACA,SACA,UACA,aACA,WAEA,kJACC,WACA,YACA,oBACA,QAzNO,KA0NP,kKACC,SACA,MA5NM,KA6NN,OA7NM,KAmOT,+DACC,OACA,YACA,aAGA,yFACC,gBACA,uBAMJ,+FACC,cAID,+CACC,aAEA,qEACC,qBACA,cAEA,aAEA,wEACC,iBAEA,iKAEC,aAGD,8EACI,cAQR,aACC,0DACA,YACA,SACA,aACA,WACA,YACA,mCACA,iCACA,YACA,gBAEA,uEAGC,UAGD,oEAEC,mEASF,cACC,eACA,MAOC,uGACC,gBAID,4EACC,WAKF,0BACC,kBACA,QACA,MAKF,gBACC,aAGD,8BACC,gBACA,sBACA,kBACA,kBACA,aACA,eACA,mBAEA,iCACC,WACA,eAGD,6DACC,aACA,YACA","file":"files.css"}
\ No newline at end of file diff --git a/apps/files/css/files.scss b/apps/files/css/files.scss index c7bcc50b7f7..1b5d10e6cd1 100644 --- a/apps/files/css/files.scss +++ b/apps/files/css/files.scss @@ -32,6 +32,12 @@ flex: 1 1; .button:not(:last-child) { margin-right: 3px; + width: unset; + gap: 14px; + background-color: var(--color-primary-element-light); + color: var(--color-primary-element-light-text); + border: unset; + padding: 0px 20px; } } @@ -134,44 +140,6 @@ background-color: var(--color-primary-element-light) !important; } -/* icons for sidebar */ -.nav-icon-files { - @include icon-color('folder', 'files', variables.$color-black); -} -.nav-icon-recent { - @include icon-color('recent', 'files', variables.$color-black); -} -.nav-icon-favorites { - @include icon-color('starred', 'actions', variables.$color-black, 2, true); -} -.nav-icon-sharinginOld, -.nav-icon-sharingoutOld, -.nav-icon-pendingsharesOld, -.nav-icon-shareoverviewOld { - @include icon-color('share', 'files', variables.$color-black); -} -.nav-icon-sharinglinksOld { - @include icon-color('public', 'files', variables.$color-black); -} -.nav-icon-extstoragemounts { - @include icon-color('external', 'files', variables.$color-black); -} -.nav-icon-trashbin { - @include icon-color('delete', 'files', variables.$color-black); -} -.nav-icon-trashbin-starred { - @include icon-color('delete', 'files', #ff0000); -} -.nav-icon-deletedsharesOld { - @include icon-color('unshare', 'files', variables.$color-black); -} -.nav-icon-favorites-starred { - @include icon-color('starred', 'actions', variables.$color-yellow, 2, true); -} - -#app-navigation .nav-files a.nav-icon-files { - width: auto; -} /* button needs overrides due to navigation styles */ #app-navigation .nav-files a.new { width: 40px; @@ -872,7 +840,7 @@ table.dragshadow td.size { /* Center triangle */ &::after { - left: 61px !important; + left: 84px !important; } } @@ -955,6 +923,12 @@ table.dragshadow td.size { .app-files .actions .button.new { position: relative; + width: unset; + gap: 14px; + background-color: var(--color-primary-element-light); + color: var(--color-primary-element-light-text); + border: unset; + padding: 0px 20px; } .breadcrumb { diff --git a/apps/files/css/merged.css b/apps/files/css/merged.css index 602fb3f9e84..6edd7f8580c 100644 --- a/apps/files/css/merged.css +++ b/apps/files/css/merged.css @@ -1 +1 @@ -.actions{padding:3px;height:100%;display:inline-block;float:left}.actions input,.actions button,.actions .button{margin:0;float:left}.actions .button a{color:#555}.actions .button a:hover,.actions .button a:focus{background-color:var(--color-background-hover)}.actions .button a:active{background-color:var(--color-primary-element-light)}.actions.creatable{position:relative;display:flex;flex:1 1}.actions.creatable .button:not(:last-child){margin-right:3px}.actions.hidden{display:none}#trash{margin-right:8px;float:right;z-index:1010;padding:10px;font-weight:normal}.newFileMenu .error,.newFileMenu .error+.icon-confirm,.files-fileList .error{color:var(--color-error);border-color:var(--color-error)}.files-filestable{position:relative;width:100%;min-width:250px;display:block;flex-direction:column}.emptycontent:not(.hidden)~.files-filestable{display:none}.files-filestable thead{position:-webkit-sticky;position:sticky;top:44px;z-index:60;display:block;background-color:var(--color-main-background-translucent)}.files-filestable tbody{display:table;width:100%}.files-filestable tbody tr[data-permissions="0"],.files-filestable tbody tr[data-permissions="16"]{background-color:var(--color-background-dark)}.files-filestable tbody tr[data-permissions="0"] td.filename .nametext .innernametext,.files-filestable tbody tr[data-permissions="16"] td.filename .nametext .innernametext{color:var(--color-text-maxcontrast)}.files-filestable tbody tr[data-e2eencrypted=true] .selection{pointer-events:none}.files-filestable.hidden{display:none}.app-files #app-content>.viewcontainer{min-height:0%;width:100%}.app-files #app-content{width:calc(100% - 300px);overflow-anchor:none}.file-drag,.file-drag .files-filestable tbody tr,.file-drag .files-filestable tbody tr:hover{background-color:var(--color-primary-element-light) !important}.app-files #app-content.dir-drop{background-color:var(--color-main-background) !important}.file-drag .files-filestable tbody tr,.file-drag .files-filestable tbody tr:hover{background-color:rgba(0,0,0,0) !important}.app-files #app-content.dir-drop .files-filestable tbody tr.dropping-to-dir{background-color:var(--color-primary-element-light) !important}.nav-icon-files{background-image:var(--icon-folder-dark)}.nav-icon-recent{background-image:var(--icon-recent-dark)}.nav-icon-favorites{background-image:var(--icon-starred-dark)}.nav-icon-sharinginOld,.nav-icon-sharingoutOld,.nav-icon-pendingsharesOld,.nav-icon-shareoverviewOld{background-image:var(--icon-share-dark)}.nav-icon-sharinglinksOld{background-image:var(--icon-public-dark)}.nav-icon-extstoragemounts{background-image:var(--icon-external-dark)}.nav-icon-trashbin{background-image:var(--icon-delete-dark)}.nav-icon-trashbin-starred{background-image:var(--icon-delete-#ff0000)}.nav-icon-deletedsharesOld{background-image:var(--icon-unshare-dark)}.nav-icon-favorites-starred{background-image:var(--icon-starred-yellow)}#app-navigation .nav-files a.nav-icon-files{width:auto}#app-navigation .nav-files a.new{width:40px;height:32px;padding:0 10px;margin:0;cursor:pointer}#app-navigation .nav-files a.new.hidden{display:none}#app-navigation .nav-files a.new.disabled{opacity:.3}.files-filestable tbody tr{height:51px}.files-filestable tbody tr:hover,.files-filestable tbody tr:focus,.files-filestable tbody .name:focus,.files-filestable tbody tr:hover .filename form,table tr.mouseOver td{background-color:var(--color-background-hover)}.files-filestable tbody tr:active,.files-filestable tbody tr.highlighted,.files-filestable tbody tr.highlighted .name:focus,.files-filestable tbody tr.selected,.files-filestable tbody tr.searchresult{background-color:var(--color-primary-element-light)}tbody a{color:var(--color-main-text)}span.conflict-path,span.extension,span.uploading,td.date{color:var(--color-text-maxcontrast)}span.conflict-path,span.extension{-webkit-transition:opacity 300ms;-moz-transition:opacity 300ms;-o-transition:opacity 300ms;transition:opacity 300ms;vertical-align:top}tr:hover span.conflict-path,tr:focus span.conflict-path,tr:hover span.extension,tr:focus span.extension{opacity:1;color:var(--color-text-maxcontrast)}table th,table th a{color:var(--color-text-maxcontrast)}table.multiselect th a{color:var(--color-main-text)}table th .columntitle{display:block;padding:15px;height:50px;box-sizing:border-box;-moz-box-sizing:border-box;vertical-align:middle}table th .columntitle:focus-visible{border-radius:2px}table.multiselect th .columntitle{display:inline-block;margin-right:-20px}table th .columntitle.name{padding-left:0;margin-left:44px}table.multiselect th .columntitle.name{margin-left:0}table th .sort-indicator{width:10px;height:8px;margin-left:5px;display:inline-block;vertical-align:text-bottom;opacity:.3}.sort-indicator.hidden,.multiselect .sort-indicator,table.multiselect th:hover .sort-indicator.hidden,table.multiselect th:focus .sort-indicator.hidden{visibility:hidden}.multiselect .sort,.multiselect .sort span{cursor:default}table th:hover .sort-indicator.hidden,table th:focus .sort-indicator.hidden{visibility:visible}table th,table td{border-bottom:1px solid var(--color-border);text-align:left;font-weight:normal}table td{padding:0 15px;font-style:normal;background-position:8px center;background-repeat:no-repeat}table th.column-name{position:relative;width:9999px;padding:0}.column-name-container{position:relative;height:50px}table th.column-selection{padding-top:2px}table th.column-size,table td.filesize{text-align:right}table th.column-mtime,table td.date,table th.column-last,table td.column-last{-moz-box-sizing:border-box;box-sizing:border-box;position:relative;min-width:130px}#app-content-recent,#app-content-favorites,#app-content-shareoverview,#app-content-sharingout,#app-content-sharingin,#app-content-sharinglinks,#app-content-deletedshares,#app-content-pendingshares{margin-top:22px}#app-content-recent thead,#app-content-favorites thead,#app-content-shareoverview thead,#app-content-sharingout thead,#app-content-sharingin thead,#app-content-sharinglinks thead,#app-content-deletedshares thead,#app-content-pendingshares thead{top:0}table.multiselect thead th{background-color:var(--color-main-background-translucent);font-weight:bold}#app-content.with-app-sidebar table.multiselect thead{margin-right:27%}table.multiselect .column-name{position:relative;width:9999px}table.multiselect .column-mtime>a{display:none}table td.selection,table th.selection,table td.fileaction{width:32px;text-align:center}table td.filename a.name,table td.filename p.name{display:flex;position:relative;-moz-box-sizing:border-box;box-sizing:border-box;height:50px;line-height:50px;padding:0}table td.filename .thumbnail-wrapper{width:0;min-width:50px;max-width:50px;height:50px}table td.filename .thumbnail-wrapper.icon-loading-small:after{z-index:10}table td.filename .thumbnail-wrapper.icon-loading-small .thumbnail{opacity:.2}table td.filename .thumbnail{display:inline-block;width:32px;height:32px;background-size:contain;background-position:center;background-repeat:no-repeat;margin-left:9px;margin-top:9px;border-radius:var(--border-radius);cursor:pointer;position:absolute;z-index:4}table td.filename p.name .thumbnail{cursor:default}table tr[data-has-preview=true] .thumbnail{border:1px solid var(--color-border)}table:not(.view-grid) td.filename input.filename{width:70% !important;margin-left:48px !important;cursor:text}table td.filename form{margin-top:-40px;position:relative;top:-6px}table td.filename a,table td.login,table td.logout,table td.download,table td.upload,table td.create,table td.delete{padding:3px 8px 8px 3px}table td.filename .nametext,.modified,.column-last>span:first-child{float:left;padding:15px 0}.modified,.column-last>span:first-child{position:relative;overflow:hidden;text-overflow:ellipsis;width:110px}table td.filename{max-width:0}table td.filename .nametext{width:0;flex-grow:1;display:flex;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;height:100%;z-index:10;padding:0 20px 0 0}table td.filename .system-tags{--min-size: 32px;display:flex;justify-content:center;align-items:center;min-width:calc(var(--min-size)*2);max-width:300px}table td.filename .system-tags .system-tags__tag{padding:5px 10px;border:1px solid;border-radius:var(--border-radius-pill);border-color:var(--color-border);color:var(--color-text-maxcontrast);height:var(--min-size);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;line-height:22px;text-align:center}table td.filename .system-tags .system-tags__tag--more{overflow:visible;text-overflow:initial}table td.filename .system-tags .system-tags__tag+.system-tags__tag{margin-left:5px}.hide-hidden-files .files-filestable .files-fileList tr.hidden-file,.hide-hidden-files .files-filestable .files-fileList tr.hidden-file.dragging{display:none !important}.files-fileList tr.animate-opacity{-webkit-transition:opacity 250ms;-moz-transition:opacity 250ms;-o-transition:opacity 250ms;transition:opacity 250ms}.files-fileList tr.dragging{opacity:.2}table td.filename .nametext .innernametext{text-overflow:ellipsis;overflow:hidden;position:relative;vertical-align:top}table td.filename .uploadtext{position:absolute;font-weight:normal;margin-left:50px;left:0;bottom:0;height:20px;padding:0 4px;padding-left:1px;font-size:11px;line-height:22px;color:var(--color-text-maxcontrast);text-overflow:ellipsis;white-space:nowrap}table td.selection{padding:0}.files-fileList tr td.selection>.selectCheckBox+label:before{opacity:.3;margin-right:0}.files-fileList tr:hover td.selection>.selectCheckBox+label:before,.files-fileList tr:focus td.selection>.selectCheckBox+label:before,.files-fileList tr td.selection>.selectCheckBox:checked+label:before,.files-fileList tr.selected td.selection>.selectCheckBox+label:before{opacity:1}.files-fileList tr.halfselected td.selection>.selectCheckBox+label:before{opacity:.5}.files-fileList tr td.selection>.selectCheckBox+label,.select-all+label{padding:16px}.files-fileList tr td.selection>.selectCheckBox:focus-visible+label,.select-all:focus-visible+label{background-color:var(--color-background-hover);border-radius:var(--border-radius-pill);outline:none !important;border:2px solid var(--color-primary-element) !important;padding:14px}.files-fileList tr td.selection>.selectCheckBox:focus-visible+label,.select-all:focus-visible+label{outline-offset:0px}.files-fileList tr td.filename{position:relative;width:100%;padding-left:0;padding-right:0;-webkit-transition:background-image 500ms;-moz-transition:background-image 500ms;-o-transition:background-image 500ms;transition:background-image 500ms}.files-fileList tr td.filename a.name label,.files-fileList tr td.filename p.name label{position:absolute;width:80%;height:50px}.files-fileList tr td.filename .favorite{display:inline-block;float:left}.files-fileList tr td.filename .favorite-mark{position:absolute;display:block;top:-8px;right:-8px;line-height:100%;text-align:center}.files-fileList tr td.filename .favorite-mark.permanent{background-color:var(--color-main-background);mask:var(--icon-star-rounded-white) no-repeat;mask-size:22px 22px;width:22px;height:22px;display:flex;align-content:center;justify-content:center}.files-fileList tr:hover td.filename .favorite-mark.permanent{background-color:var(--color-background-hover)}#uploadsize-message,#delete-confirm{display:none}.fileactions{z-index:50}.busy .fileactions,.busy .action{visibility:hidden}.bubble,#app-navigation .app-navigation-entry-menu{min-width:100px}.files-fileList .icon-loading-small{opacity:1 !important;display:inline !important}.files-fileList .action.action-share-notification span,.files-fileList a.name{cursor:default !important}.files-fileList a.name.disabled *{cursor:default}.files-fileList a.name.disabled a,.files-fileList a.name.disabled a *{cursor:pointer}.files-fileList a.name.disabled:focus{background:none}a.action>img{height:16px;width:16px;vertical-align:text-bottom}a.action.action-editlocally img.icon,a.action.action-setreminder img.icon{filter:var(--background-invert-if-dark)}.selectedActions{position:relative;display:inline-block;vertical-align:middle}.selectedActions.hidden{display:none}.selectedActions a{display:inline;line-height:50px;padding:16px 5px}.selectedActions a.hidden{display:none}.selectedActions a img{position:relative;vertical-align:text-bottom;margin-bottom:-1px}.selectedActions .actions-selected .icon-more{margin-top:-3px}.files-fileList td a a.action{display:inline;padding:17px 8px;line-height:50px;opacity:.3}.files-fileList td a a.action.action-share{padding:17px 14px}.files-fileList td a a.action.action-share.permanent:not(.shared-style) .icon-shared+span{position:absolute;left:-10000px;top:auto;width:1px;height:1px;overflow:hidden}.files-fileList td a a.action.action-share .avatar{display:inline-block;vertical-align:middle}.files-fileList td a a.action.action-menu{padding-top:17px;padding-bottom:17px;padding-left:14px;padding-right:14px}.files-fileList td a a.action.no-permission:hover,.files-fileList td a a.action.no-permission:focus{opacity:.3}.files-fileList td a a.action.disabled:hover,.files-fileList td a a.action.disabled:focus,.files-fileList td a a.action.disabled img{opacity:.3}.files-fileList td a a.action.disabled.action-download{opacity:.7}.files-fileList td a a.action.disabled.action-download:hover,.files-fileList td a a.action.disabled.action-download:focus{opacity:.7}.files-fileList td a a.action:hover,.files-fileList td a a.action:focus{opacity:1}.files-fileList td a a.action:focus{background-color:var(--color-background-hover);border-radius:var(--border-radius-pill)}.files-fileList td a .fileActionsMenu a.action,.files-fileList td a a.action.action-share.shared-style{opacity:.7}.files-fileList td a .fileActionsMenu .action.permanent{opacity:1}.files-fileList .action.action-share.permanent.shared-style span:not(.icon){display:inline-block;max-width:70px;overflow:hidden;text-overflow:ellipsis;vertical-align:middle;margin-left:6px}.files-fileList .remoteAddress .userDomain{margin-left:0 !important}.files-fileList .favorite-mark.permanent{opacity:1}.files-fileList .fileActionsMenu a.action:hover,.files-fileList .fileActionsMenu a.action:focus,.files-fileList a.action.action-share.shared-style:hover,.files-fileList a.action.action-share.shared-style:focus{opacity:1}.files-fileList tr a.action.disabled{background:none}.selectedActions a.download.disabled,.files-fileList tr a.action.action-download.disabled{color:#000}.files-fileList tr:hover a.action.disabled:hover *{cursor:default}.summary{color:var(--color-text-maxcontrast);height:330px}.files-filestable .summary .filesummary{width:100%;padding-left:101px}#body-public .summary{height:180px}.summary:hover,.summary:focus,.summary,table tr.summary td{background-color:rgba(0,0,0,0)}.summary td{border-bottom:none;vertical-align:top;padding-top:20px}.summary td:first-child{padding:0}.hiddeninfo{white-space:pre-line}table.dragshadow{width:auto;z-index:2000}table.dragshadow td.filename{padding-left:60px;padding-right:16px;height:36px;max-width:unset}table.dragshadow td.size{padding-right:8px}.mask{z-index:50;position:absolute;top:0;left:0;right:0;bottom:0;background-color:var(--color-main-background);background-repeat:no-repeat no-repeat;background-position:50%;opacity:.7;transition:opacity 100ms;-moz-transition:opacity 100ms;-o-transition:opacity 100ms;-ms-transition:opacity 100ms;-webkit-transition:opacity 100ms}.mask.transparent{opacity:0}.newFileMenu{font-weight:300;top:100%;left:-48px !important;margin-top:4px;min-width:100px;z-index:1001}.newFileMenu::after{left:61px !important}.files-controls{box-sizing:border-box;position:-webkit-sticky;position:sticky;height:50px;padding:0;margin:0;background-color:var(--color-main-background-translucent);z-index:62;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:flex;top:0;padding-left:50px}.files-controls .actions>div>.button,.files-controls .actions>div button,.files-controls .actions>.button,.files-controls .actions button{box-sizing:border-box;display:inline-block;display:flex;height:44px;width:44px;padding:9px;align-items:center;justify-content:center}.files-controls .actions>div .button.hidden,.files-controls .actions .button.hidden{display:none}.viewer-mode #app-navigation+#app-content .files-controls{left:0}.files-filestable .filename .action .icon,.files-filestable .selectedActions a .icon,.files-filestable .filename .favorite-mark .icon,.files-controls .actions .button .icon{display:inline-block;vertical-align:middle;background-size:16px 16px}.files-filestable .filename .favorite-mark .icon-star{background-image:none}.files-filestable .filename .favorite-mark .icon-starred{background-image:var(--icon-starred-yellow) !important}.files-filestable .filename .action .icon.hidden,.files-filestable .selectedActions a .icon.hidden,.files-controls .actions .button .icon.hidden{display:none}.files-filestable .filename .action .icon.loading,.files-filestable .selectedActions a .icon.loading,.files-controls .actions .button .icon.loading{width:15px;height:15px}.app-files .actions .button.new{position:relative}.breadcrumb{align-items:center}.breadcrumb .icon-home{border-radius:var(--border-radius)}.breadcrumb .canDrop>a,.files-filestable tbody tr.canDrop{background-color:rgba(0,130,201,.3)}.dropzone-background{background-color:rgba(0,130,201,.3)}.dropzone-background :hover{box-shadow:none !important}.notCreatable{margin-left:12px;margin-right:44px;margin-top:12px;color:var(--color-main-text);overflow:auto;min-width:160px;height:54px}.notCreatable:not(.hidden){display:flex}.notCreatable .icon-alert-outline{top:-15px;position:relative;margin-right:4px}.quota-navigation-item{margin:0 !important;border:none;border-radius:0;background-color:rgba(0,0,0,0);z-index:1;height:44px;display:flex !important;flex-direction:column}.quota-navigation-item__text{height:30px}.quota-navigation-item[href="#"],.quota-navigation-item[href="#"] *{cursor:default !important}.quota-navigation-item__container{height:5px;border-radius:var(--border-radius)}.files-filestable.view-grid:not(.hidden) thead tr{display:block;border-bottom:1px solid var(--color-border);background-color:var(--color-main-background-translucent)}.files-filestable.view-grid:not(.hidden) thead tr th{width:auto;border:none}.files-filestable.view-grid:not(.hidden) tbody{display:grid;grid-template-columns:repeat(auto-fill, 160px);justify-content:space-around;row-gap:15px;margin:15px 0}.files-filestable.view-grid:not(.hidden) tbody tr:not(.hidden){display:block;position:relative;height:190px;border-radius:var(--border-radius)}.files-filestable.view-grid:not(.hidden) tbody tr:not(.hidden):hover,.files-filestable.view-grid:not(.hidden) tbody tr:not(.hidden):focus,.files-filestable.view-grid:not(.hidden) tbody tr:not(.hidden):active,.files-filestable.view-grid:not(.hidden) tbody tr:not(.hidden).selected,.files-filestable.view-grid:not(.hidden) tbody tr:not(.hidden).searchresult,.files-filestable.view-grid:not(.hidden) tbody tr:not(.hidden) .name:focus,.files-filestable.view-grid:not(.hidden) tbody tr:not(.hidden).highlighted{background-color:rgba(0,0,0,0)}.files-filestable.view-grid:not(.hidden) tbody tr:not(.hidden):hover .thumbnail-wrapper,.files-filestable.view-grid:not(.hidden) tbody tr:not(.hidden):hover .nametext,.files-filestable.view-grid:not(.hidden) tbody tr:not(.hidden):hover .fileactions,.files-filestable.view-grid:not(.hidden) tbody tr:not(.hidden):focus .thumbnail-wrapper,.files-filestable.view-grid:not(.hidden) tbody tr:not(.hidden):focus .nametext,.files-filestable.view-grid:not(.hidden) tbody tr:not(.hidden):focus .fileactions,.files-filestable.view-grid:not(.hidden) tbody tr:not(.hidden):active .thumbnail-wrapper,.files-filestable.view-grid:not(.hidden) tbody tr:not(.hidden):active .nametext,.files-filestable.view-grid:not(.hidden) tbody tr:not(.hidden):active .fileactions,.files-filestable.view-grid:not(.hidden) tbody tr:not(.hidden).selected .thumbnail-wrapper,.files-filestable.view-grid:not(.hidden) tbody tr:not(.hidden).selected .nametext,.files-filestable.view-grid:not(.hidden) tbody tr:not(.hidden).selected .fileactions,.files-filestable.view-grid:not(.hidden) tbody tr:not(.hidden).searchresult .thumbnail-wrapper,.files-filestable.view-grid:not(.hidden) tbody tr:not(.hidden).searchresult .nametext,.files-filestable.view-grid:not(.hidden) tbody tr:not(.hidden).searchresult .fileactions,.files-filestable.view-grid:not(.hidden) tbody tr:not(.hidden) .name:focus .thumbnail-wrapper,.files-filestable.view-grid:not(.hidden) tbody tr:not(.hidden) .name:focus .nametext,.files-filestable.view-grid:not(.hidden) tbody tr:not(.hidden) .name:focus .fileactions,.files-filestable.view-grid:not(.hidden) tbody tr:not(.hidden).highlighted .thumbnail-wrapper,.files-filestable.view-grid:not(.hidden) tbody tr:not(.hidden).highlighted .nametext,.files-filestable.view-grid:not(.hidden) tbody tr:not(.hidden).highlighted .fileactions{background-color:var(--color-background-hover)}.files-filestable.view-grid:not(.hidden) tbody td{display:inline;border-bottom:none}.files-filestable.view-grid:not(.hidden) tbody td.filename .thumbnail-wrapper{min-width:0;max-width:none;position:absolute;width:160px;height:160px;padding:14px;top:0;left:0;z-index:-1}.files-filestable.view-grid:not(.hidden) tbody td.filename .thumbnail-wrapper .thumbnail{width:calc(100% - 2 * 14px);height:calc(100% - 2 * 14px);background-size:contain;margin:0;border-radius:var(--border-radius);background-repeat:no-repeat;background-position:center}.files-filestable.view-grid:not(.hidden) tbody td.filename .thumbnail-wrapper .thumbnail .favorite-mark{left:auto;top:-11px;right:-11px}.files-filestable.view-grid:not(.hidden) tbody td.filename .uploadtext{width:100%;margin:0;top:0;bottom:auto;height:28px;padding-top:4px;padding-left:28px}.files-filestable.view-grid:not(.hidden) tbody td.filename .name{height:100%;border-radius:var(--border-radius);overflow:hidden;cursor:pointer !important}.files-filestable.view-grid:not(.hidden) tbody td.filename .name .nametext{display:flex;height:44px;margin-top:146px;text-align:center;line-height:44px;padding:0}.files-filestable.view-grid:not(.hidden) tbody td.filename .name .nametext .innernametext{display:inline-block;text-align:center;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.files-filestable.view-grid:not(.hidden) tbody td.filename .name .nametext:before{content:"";flex:1;min-width:14px}.files-filestable.view-grid:not(.hidden) tbody td.filename .name .nametext:after{content:"";flex:1;min-width:44px}.files-filestable.view-grid:not(.hidden) tbody td.filename .name .nametext .extension{display:none}.files-filestable.view-grid:not(.hidden) tbody td.filename .name .system-tags{display:none}.files-filestable.view-grid:not(.hidden) tbody td.filename .name .fileactions{height:initial;margin-top:146px;display:flex;align-items:center;position:absolute;right:0}.files-filestable.view-grid:not(.hidden) tbody td.filename .name .fileactions .action{padding:14px;width:44px;height:44px;display:flex;align-items:center;justify-content:center}.files-filestable.view-grid:not(.hidden) tbody td.filename .name .fileactions .action:not(.action-menu){display:none}.files-filestable.view-grid:not(.hidden) tbody td.filename .fileActionsMenu .action-share-container.hidden{display:block !important}.files-filestable.view-grid:not(.hidden) tbody td.filename .fileActionsMenu .action-share-container.hidden .action-share img{padding:6px;border-radius:50%}.files-filestable.view-grid:not(.hidden) tbody td.filename .fileActionsMenu .action-restore-container.hidden{display:block !important}.files-filestable.view-grid:not(.hidden) tbody td.filename .fileActionsMenu .action-comment-container.hidden{display:block !important}.files-filestable.view-grid:not(.hidden) tbody td.filename form{padding:3px 14px;border-radius:var(--border-radius)}.files-filestable.view-grid:not(.hidden) tbody td.filename form input.filename{width:100%;margin-left:0;cursor:text}.files-filestable.view-grid:not(.hidden) tbody td.filesize,.files-filestable.view-grid:not(.hidden) tbody td.date{display:none}.files-filestable.view-grid:not(.hidden) tbody td.selection,.files-filestable.view-grid:not(.hidden) tbody td.filename .favorite-mark{position:absolute;top:-8px;left:-8px;display:flex;z-index:10}.files-filestable.view-grid:not(.hidden) tbody td.selection label,.files-filestable.view-grid:not(.hidden) tbody td.filename .favorite-mark label{width:44px;height:44px;display:inline-flex;padding:14px}.files-filestable.view-grid:not(.hidden) tbody td.selection label::before,.files-filestable.view-grid:not(.hidden) tbody td.filename .favorite-mark label::before{margin:0;width:14px;height:14px}.files-filestable.view-grid:not(.hidden) tbody td .popovermenu{left:0;width:150px;margin:0 5px}.files-filestable.view-grid:not(.hidden) tbody td .popovermenu .menuitem span:not(.icon){overflow:hidden;text-overflow:ellipsis}.files-filestable.view-grid:not(.hidden) tr.hidden-file td.filename .name .nametext .extension{display:block}.files-filestable.view-grid:not(.hidden) tfoot{display:grid}.files-filestable.view-grid:not(.hidden) tfoot .summary:not(.hidden){display:inline-block;margin:0 auto;height:418px}.files-filestable.view-grid:not(.hidden) tfoot .summary:not(.hidden) td{padding-top:50px}.files-filestable.view-grid:not(.hidden) tfoot .summary:not(.hidden) td:first-child,.files-filestable.view-grid:not(.hidden) tfoot .summary:not(.hidden) td.date{display:none}.files-filestable.view-grid:not(.hidden) tfoot .summary:not(.hidden) td .info{margin-left:0}#view-toggle{background-color:var(--color-main-background-translucent);border:none;margin:0;padding:22px;opacity:.5;float:right;right:var(--default-grid-baseline);top:var(--default-grid-baseline);z-index:100;position:sticky}#view-toggle:hover,#view-toggle:focus,#showgridview:focus+#view-toggle{opacity:1}#view-toggle:focus-visible,#showgridview:focus-visible+#view-toggle{box-shadow:inset 0 0 0 2px var(--color-primary-element) !important}#showgridview{position:fixed;top:0}#body-public .files-filestable.view-grid:not(.hidden) tbody td.filename .name .nametext .innernametext{max-width:124px}#body-public .files-filestable.view-grid:not(.hidden) tbody td .popovermenu{left:-80px}#body-public #view-toggle{position:absolute;right:0;top:0}#gallery-button{display:none}#tag_multiple_files_container{overflow:hidden;background-color:#fff;border-radius:3px;position:relative;display:flex;flex-wrap:wrap;margin-bottom:10px}#tag_multiple_files_container h3{width:100%;padding:0 18px}#tag_multiple_files_container .systemTagsInputFieldContainer{flex:1 1 80%;min-width:0;margin:0 12px}#upload{box-sizing:border-box;height:36px;width:39px;padding:0 !important;margin-left:3px;overflow:hidden;vertical-align:top;position:relative;z-index:-20}#upload .icon-upload{position:relative;display:block;width:100%;height:44px;width:44px;margin:-5px -3px;cursor:pointer;z-index:10;opacity:.65}.file_upload_target{display:none}.file_upload_form{display:inline;float:left;margin:0;padding:0;cursor:pointer;overflow:visible}.uploadprogresswrapper,.uploadprogresswrapper *{box-sizing:border-box}.uploadprogresswrapper{display:inline-block;vertical-align:top;height:36px;margin-left:3px}.uploadprogresswrapper>input[type=button]{height:36px;margin-left:3px}#uploadprogressbar{border-color:var(--color-border-dark);border-radius:var(--border-radius-pill) 0 0 var(--border-radius-pill);border-right:0;position:relative;float:left;width:200px;height:44px;display:inline-block;text-align:center}#uploadprogressbar .ui-progressbar-value{margin-top:.1em}#uploadprogressbar .ui-progressbar-value.ui-widget-header.ui-corner-left{height:calc(100% + 2px);top:-1px;left:-1px;position:absolute;overflow:hidden;background-color:var(--color-primary-element)}#uploadprogressbar .label{top:8px;opacity:1;overflow:hidden;white-space:nowrap;font-weight:normal}#uploadprogressbar .label.inner{color:var(--color-primary-element-text);position:absolute;display:block;width:200px}#uploadprogressbar .label.outer{position:relative;color:var(--color-main-text)}#uploadprogressbar .desktop{display:block}#uploadprogressbar .mobile{display:none}#uploadprogressbar+.stop{border-top-left-radius:0;border-bottom-left-radius:0}.oc-dialog .fileexists{-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;margin-bottom:30px}.oc-dialog .fileexists .conflict .filename,.oc-dialog .fileexists .conflict .mtime,.oc-dialog .fileexists .conflict .size{-webkit-touch-callout:initial;-webkit-user-select:initial;-khtml-user-select:initial;-moz-user-select:initial;-ms-user-select:initial;user-select:initial}.oc-dialog .fileexists .conflict .message{color:#e9322d}.oc-dialog .fileexists table{width:100%}.oc-dialog .fileexists th{padding-left:0;padding-right:0}.oc-dialog .fileexists th input[type=checkbox]{margin-right:3px}.oc-dialog .fileexists th:first-child{width:225px}.oc-dialog .fileexists th label{font-weight:normal;color:var(--color-main-text)}.oc-dialog .fileexists th .count{margin-left:3px}.oc-dialog .fileexists .conflicts .template{display:none}.oc-dialog .fileexists .conflict{width:100%;height:85px}.oc-dialog .fileexists .conflict .filename{color:#777;word-break:break-all;clear:left}.oc-dialog .fileexists .icon{width:64px;height:64px;margin:0px 5px 5px 5px;background-repeat:no-repeat;background-size:64px 64px;float:left}.oc-dialog .fileexists .original,.oc-dialog .fileexists .replacement{float:left;width:50%}.oc-dialog .fileexists .conflicts{overflow-y:auto;max-height:225px}.oc-dialog .fileexists .conflict input[type=checkbox]{float:left}.oc-dialog .fileexists #allfileslabel{float:right}.oc-dialog .fileexists #allfiles{vertical-align:bottom;position:relative;top:-3px}.oc-dialog .fileexists #allfiles+span{vertical-align:bottom}.oc-dialog .oc-dialog-buttonrow{width:100%;text-align:right}.oc-dialog .oc-dialog-buttonrow .cancel{float:left}.highlightUploaded{-webkit-animation:highlightAnimation 2s 1;-moz-animation:highlightAnimation 2s 1;-o-animation:highlightAnimation 2s 1;animation:highlightAnimation 2s 1}@-webkit-keyframes highlightAnimation{0%{background-color:#ffff8c}100%{background-color:rgba(0,0,0,0)}}@-moz-keyframes highlightAnimation{0%{background-color:#ffff8c}100%{background-color:rgba(0,0,0,0)}}@-o-keyframes highlightAnimation{0%{background-color:#ffff8c}100%{background-color:rgba(0,0,0,0)}}@keyframes highlightAnimation{0%{background-color:#ffff8c}100%{background-color:rgba(0,0,0,0)}}@media only screen and (max-width: 988px)and (min-width: 1025px),only screen and (max-width: 688px){.app-files #app-content.dir-drop{background-color:#fff !important}table th.column-size,table td.filesize,table th.column-mtime,table td.date{display:none}table td{padding:0}table.multiselect thead{padding-left:0}.fileList a.action.action-menu img{padding-left:0}.fileList .fileActionsMenu{margin-right:6px}.fileList a.action-share span:not(.icon):not(.avatar){position:absolute;left:-10000px;top:auto;width:1px;height:1px;overflow:hidden}td.filename a.name .system-tags{display:none}#uploadprogressbar,#uploadprogressbar .label.inner{width:50px}#uploadprogressbar .desktop{display:none !important}#uploadprogressbar .mobile{display:block !important}table.dragshadow{z-index:1000}}@media only screen and (max-width: 480px){table th .selectedActions{float:right}table th .selectedActions>a span:not(.icon){display:none}table th .selectedActions a{padding:17px 14px}table.multiselect th .columntitle.name{margin-left:0}}.app-sidebar .detailFileInfoContainer{min-height:50px;padding:15px}.app-sidebar .detailFileInfoContainer>div{clear:both}.app-sidebar .mainFileInfoView .icon{display:inline-block;background-size:16px 16px}.app-sidebar .mainFileInfoView .permalink{padding:6px 10px;vertical-align:top;opacity:.6}.app-sidebar .mainFileInfoView .permalink:hover,.app-sidebar .mainFileInfoView .permalink:focus{opacity:1}.app-sidebar .mainFileInfoView .permalink-field>input{clear:both;width:90%}.app-sidebar .thumbnailContainer.large{margin-left:-15px;margin-right:-35px;margin-top:-15px}.app-sidebar .thumbnailContainer.large.portrait{margin:0}.app-sidebar .large .thumbnail{width:100%;display:block;background-repeat:no-repeat;background-position:center;background-size:100%;float:none;margin:0;height:auto}.app-sidebar .large .thumbnail .stretcher{content:"";display:block;padding-bottom:56.25%}.app-sidebar .large.portrait .thumbnail{background-position:50% top}.app-sidebar .large.portrait .thumbnail{background-size:contain}.app-sidebar .large.text{overflow-y:scroll;overflow-x:hidden;padding-top:14px;font-size:80%;margin-left:0}.app-sidebar .thumbnail{width:100%;min-height:75px;display:inline-block;float:left;margin-right:10px;background-size:contain;background-repeat:no-repeat}.app-sidebar .ellipsis{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.app-sidebar .fileName{font-size:16px;padding-top:13px;padding-bottom:3px}.app-sidebar .fileName h3{width:calc(100% - 42px);display:inline-block;padding:5px 0;margin:-5px 0}.app-sidebar .file-details{color:var(--color-text-maxcontrast)}.app-sidebar .action-favorite{vertical-align:sub;padding:10px;margin:-10px}.app-sidebar .action-favorite>span{opacity:.7 !important}.app-sidebar .detailList{float:left}.app-sidebar .close{position:absolute;top:0;right:0;opacity:.5;z-index:1;width:44px;height:44px}.whatsNewPopover{bottom:35px !important;left:15px !important;width:270px;z-index:700}.whatsNewPopover p{width:auto !important}.whatsNewPopover .caption{font-weight:bold;cursor:auto !important}.whatsNewPopover .icon-close{position:absolute;right:0}.whatsNewPopover::after{content:none}/*# sourceMappingURL=merged.css.map */ +.actions{padding:3px;height:100%;display:inline-block;float:left}.actions input,.actions button,.actions .button{margin:0;float:left}.actions .button a{color:#555}.actions .button a:hover,.actions .button a:focus{background-color:var(--color-background-hover)}.actions .button a:active{background-color:var(--color-primary-element-light)}.actions.creatable{position:relative;display:flex;flex:1 1}.actions.creatable .button:not(:last-child){margin-right:3px;width:unset;gap:14px;background-color:var(--color-primary-element-light);color:var(--color-primary-element-light-text);border:unset;padding:0px 20px}.actions.hidden{display:none}#trash{margin-right:8px;float:right;z-index:1010;padding:10px;font-weight:normal}.newFileMenu .error,.newFileMenu .error+.icon-confirm,.files-fileList .error{color:var(--color-error);border-color:var(--color-error)}.files-filestable{position:relative;width:100%;min-width:250px;display:block;flex-direction:column}.emptycontent:not(.hidden)~.files-filestable{display:none}.files-filestable thead{position:-webkit-sticky;position:sticky;top:44px;z-index:60;display:block;background-color:var(--color-main-background-translucent)}.files-filestable tbody{display:table;width:100%}.files-filestable tbody tr[data-permissions="0"],.files-filestable tbody tr[data-permissions="16"]{background-color:var(--color-background-dark)}.files-filestable tbody tr[data-permissions="0"] td.filename .nametext .innernametext,.files-filestable tbody tr[data-permissions="16"] td.filename .nametext .innernametext{color:var(--color-text-maxcontrast)}.files-filestable tbody tr[data-e2eencrypted=true] .selection{pointer-events:none}.files-filestable.hidden{display:none}.app-files #app-content>.viewcontainer{min-height:0%;width:100%}.app-files #app-content{width:calc(100% - 300px);overflow-anchor:none}.file-drag,.file-drag .files-filestable tbody tr,.file-drag .files-filestable tbody tr:hover{background-color:var(--color-primary-element-light) !important}.app-files #app-content.dir-drop{background-color:var(--color-main-background) !important}.file-drag .files-filestable tbody tr,.file-drag .files-filestable tbody tr:hover{background-color:rgba(0,0,0,0) !important}.app-files #app-content.dir-drop .files-filestable tbody tr.dropping-to-dir{background-color:var(--color-primary-element-light) !important}#app-navigation .nav-files a.new{width:40px;height:32px;padding:0 10px;margin:0;cursor:pointer}#app-navigation .nav-files a.new.hidden{display:none}#app-navigation .nav-files a.new.disabled{opacity:.3}.files-filestable tbody tr{height:51px}.files-filestable tbody tr:hover,.files-filestable tbody tr:focus,.files-filestable tbody .name:focus,.files-filestable tbody tr:hover .filename form,table tr.mouseOver td{background-color:var(--color-background-hover)}.files-filestable tbody tr:active,.files-filestable tbody tr.highlighted,.files-filestable tbody tr.highlighted .name:focus,.files-filestable tbody tr.selected,.files-filestable tbody tr.searchresult{background-color:var(--color-primary-element-light)}tbody a{color:var(--color-main-text)}span.conflict-path,span.extension,span.uploading,td.date{color:var(--color-text-maxcontrast)}span.conflict-path,span.extension{-webkit-transition:opacity 300ms;-moz-transition:opacity 300ms;-o-transition:opacity 300ms;transition:opacity 300ms;vertical-align:top}tr:hover span.conflict-path,tr:focus span.conflict-path,tr:hover span.extension,tr:focus span.extension{opacity:1;color:var(--color-text-maxcontrast)}table th,table th a{color:var(--color-text-maxcontrast)}table.multiselect th a{color:var(--color-main-text)}table th .columntitle{display:block;padding:15px;height:50px;box-sizing:border-box;-moz-box-sizing:border-box;vertical-align:middle}table th .columntitle:focus-visible{border-radius:2px}table.multiselect th .columntitle{display:inline-block;margin-right:-20px}table th .columntitle.name{padding-left:0;margin-left:44px}table.multiselect th .columntitle.name{margin-left:0}table th .sort-indicator{width:10px;height:8px;margin-left:5px;display:inline-block;vertical-align:text-bottom;opacity:.3}.sort-indicator.hidden,.multiselect .sort-indicator,table.multiselect th:hover .sort-indicator.hidden,table.multiselect th:focus .sort-indicator.hidden{visibility:hidden}.multiselect .sort,.multiselect .sort span{cursor:default}table th:hover .sort-indicator.hidden,table th:focus .sort-indicator.hidden{visibility:visible}table th,table td{border-bottom:1px solid var(--color-border);text-align:left;font-weight:normal}table td{padding:0 15px;font-style:normal;background-position:8px center;background-repeat:no-repeat}table th.column-name{position:relative;width:9999px;padding:0}.column-name-container{position:relative;height:50px}table th.column-selection{padding-top:2px}table th.column-size,table td.filesize{text-align:right}table th.column-mtime,table td.date,table th.column-last,table td.column-last{-moz-box-sizing:border-box;box-sizing:border-box;position:relative;min-width:130px}#app-content-recent,#app-content-favorites,#app-content-shareoverview,#app-content-sharingout,#app-content-sharingin,#app-content-sharinglinks,#app-content-deletedshares,#app-content-pendingshares{margin-top:22px}#app-content-recent thead,#app-content-favorites thead,#app-content-shareoverview thead,#app-content-sharingout thead,#app-content-sharingin thead,#app-content-sharinglinks thead,#app-content-deletedshares thead,#app-content-pendingshares thead{top:0}table.multiselect thead th{background-color:var(--color-main-background-translucent);font-weight:bold}#app-content.with-app-sidebar table.multiselect thead{margin-right:27%}table.multiselect .column-name{position:relative;width:9999px}table.multiselect .column-mtime>a{display:none}table td.selection,table th.selection,table td.fileaction{width:32px;text-align:center}table td.filename a.name,table td.filename p.name{display:flex;position:relative;-moz-box-sizing:border-box;box-sizing:border-box;height:50px;line-height:50px;padding:0}table td.filename .thumbnail-wrapper{width:0;min-width:50px;max-width:50px;height:50px}table td.filename .thumbnail-wrapper.icon-loading-small:after{z-index:10}table td.filename .thumbnail-wrapper.icon-loading-small .thumbnail{opacity:.2}table td.filename .thumbnail{display:inline-block;width:32px;height:32px;background-size:contain;background-position:center;background-repeat:no-repeat;margin-left:9px;margin-top:9px;border-radius:var(--border-radius);cursor:pointer;position:absolute;z-index:4}table td.filename p.name .thumbnail{cursor:default}table tr[data-has-preview=true] .thumbnail{border:1px solid var(--color-border)}table:not(.view-grid) td.filename input.filename{width:70% !important;margin-left:48px !important;cursor:text}table td.filename form{margin-top:-40px;position:relative;top:-6px}table td.filename a,table td.login,table td.logout,table td.download,table td.upload,table td.create,table td.delete{padding:3px 8px 8px 3px}table td.filename .nametext,.modified,.column-last>span:first-child{float:left;padding:15px 0}.modified,.column-last>span:first-child{position:relative;overflow:hidden;text-overflow:ellipsis;width:110px}table td.filename{max-width:0}table td.filename .nametext{width:0;flex-grow:1;display:flex;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;height:100%;z-index:10;padding:0 20px 0 0}table td.filename .system-tags{--min-size: 32px;display:flex;justify-content:center;align-items:center;min-width:calc(var(--min-size)*2);max-width:300px}table td.filename .system-tags .system-tags__tag{padding:5px 10px;border:1px solid;border-radius:var(--border-radius-pill);border-color:var(--color-border);color:var(--color-text-maxcontrast);height:var(--min-size);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;line-height:22px;text-align:center}table td.filename .system-tags .system-tags__tag--more{overflow:visible;text-overflow:initial}table td.filename .system-tags .system-tags__tag+.system-tags__tag{margin-left:5px}.hide-hidden-files .files-filestable .files-fileList tr.hidden-file,.hide-hidden-files .files-filestable .files-fileList tr.hidden-file.dragging{display:none !important}.files-fileList tr.animate-opacity{-webkit-transition:opacity 250ms;-moz-transition:opacity 250ms;-o-transition:opacity 250ms;transition:opacity 250ms}.files-fileList tr.dragging{opacity:.2}table td.filename .nametext .innernametext{text-overflow:ellipsis;overflow:hidden;position:relative;vertical-align:top}table td.filename .uploadtext{position:absolute;font-weight:normal;margin-left:50px;left:0;bottom:0;height:20px;padding:0 4px;padding-left:1px;font-size:11px;line-height:22px;color:var(--color-text-maxcontrast);text-overflow:ellipsis;white-space:nowrap}table td.selection{padding:0}.files-fileList tr td.selection>.selectCheckBox+label:before{opacity:.3;margin-right:0}.files-fileList tr:hover td.selection>.selectCheckBox+label:before,.files-fileList tr:focus td.selection>.selectCheckBox+label:before,.files-fileList tr td.selection>.selectCheckBox:checked+label:before,.files-fileList tr.selected td.selection>.selectCheckBox+label:before{opacity:1}.files-fileList tr.halfselected td.selection>.selectCheckBox+label:before{opacity:.5}.files-fileList tr td.selection>.selectCheckBox+label,.select-all+label{padding:16px}.files-fileList tr td.selection>.selectCheckBox:focus-visible+label,.select-all:focus-visible+label{background-color:var(--color-background-hover);border-radius:var(--border-radius-pill);outline:none !important;border:2px solid var(--color-primary-element) !important;padding:14px}.files-fileList tr td.selection>.selectCheckBox:focus-visible+label,.select-all:focus-visible+label{outline-offset:0px}.files-fileList tr td.filename{position:relative;width:100%;padding-left:0;padding-right:0;-webkit-transition:background-image 500ms;-moz-transition:background-image 500ms;-o-transition:background-image 500ms;transition:background-image 500ms}.files-fileList tr td.filename a.name label,.files-fileList tr td.filename p.name label{position:absolute;width:80%;height:50px}.files-fileList tr td.filename .favorite{display:inline-block;float:left}.files-fileList tr td.filename .favorite-mark{position:absolute;display:block;top:-8px;right:-8px;line-height:100%;text-align:center}.files-fileList tr td.filename .favorite-mark.permanent{background-color:var(--color-main-background);mask:var(--icon-star-rounded-white) no-repeat;mask-size:22px 22px;width:22px;height:22px;display:flex;align-content:center;justify-content:center}.files-fileList tr:hover td.filename .favorite-mark.permanent{background-color:var(--color-background-hover)}#uploadsize-message,#delete-confirm{display:none}.fileactions{z-index:50}.busy .fileactions,.busy .action{visibility:hidden}.bubble,#app-navigation .app-navigation-entry-menu{min-width:100px}.files-fileList .icon-loading-small{opacity:1 !important;display:inline !important}.files-fileList .action.action-share-notification span,.files-fileList a.name{cursor:default !important}.files-fileList a.name.disabled *{cursor:default}.files-fileList a.name.disabled a,.files-fileList a.name.disabled a *{cursor:pointer}.files-fileList a.name.disabled:focus{background:none}a.action>img{height:16px;width:16px;vertical-align:text-bottom}a.action.action-editlocally img.icon,a.action.action-setreminder img.icon{filter:var(--background-invert-if-dark)}.selectedActions{position:relative;display:inline-block;vertical-align:middle}.selectedActions.hidden{display:none}.selectedActions a{display:inline;line-height:50px;padding:16px 5px}.selectedActions a.hidden{display:none}.selectedActions a img{position:relative;vertical-align:text-bottom;margin-bottom:-1px}.selectedActions .actions-selected .icon-more{margin-top:-3px}.files-fileList td a a.action{display:inline;padding:17px 8px;line-height:50px;opacity:.3}.files-fileList td a a.action.action-share{padding:17px 14px}.files-fileList td a a.action.action-share.permanent:not(.shared-style) .icon-shared+span{position:absolute;left:-10000px;top:auto;width:1px;height:1px;overflow:hidden}.files-fileList td a a.action.action-share .avatar{display:inline-block;vertical-align:middle}.files-fileList td a a.action.action-menu{padding-top:17px;padding-bottom:17px;padding-left:14px;padding-right:14px}.files-fileList td a a.action.no-permission:hover,.files-fileList td a a.action.no-permission:focus{opacity:.3}.files-fileList td a a.action.disabled:hover,.files-fileList td a a.action.disabled:focus,.files-fileList td a a.action.disabled img{opacity:.3}.files-fileList td a a.action.disabled.action-download{opacity:.7}.files-fileList td a a.action.disabled.action-download:hover,.files-fileList td a a.action.disabled.action-download:focus{opacity:.7}.files-fileList td a a.action:hover,.files-fileList td a a.action:focus{opacity:1}.files-fileList td a a.action:focus{background-color:var(--color-background-hover);border-radius:var(--border-radius-pill)}.files-fileList td a .fileActionsMenu a.action,.files-fileList td a a.action.action-share.shared-style{opacity:.7}.files-fileList td a .fileActionsMenu .action.permanent{opacity:1}.files-fileList .action.action-share.permanent.shared-style span:not(.icon){display:inline-block;max-width:70px;overflow:hidden;text-overflow:ellipsis;vertical-align:middle;margin-left:6px}.files-fileList .remoteAddress .userDomain{margin-left:0 !important}.files-fileList .favorite-mark.permanent{opacity:1}.files-fileList .fileActionsMenu a.action:hover,.files-fileList .fileActionsMenu a.action:focus,.files-fileList a.action.action-share.shared-style:hover,.files-fileList a.action.action-share.shared-style:focus{opacity:1}.files-fileList tr a.action.disabled{background:none}.selectedActions a.download.disabled,.files-fileList tr a.action.action-download.disabled{color:#000}.files-fileList tr:hover a.action.disabled:hover *{cursor:default}.summary{color:var(--color-text-maxcontrast);height:330px}.files-filestable .summary .filesummary{width:100%;padding-left:101px}#body-public .summary{height:180px}.summary:hover,.summary:focus,.summary,table tr.summary td{background-color:rgba(0,0,0,0)}.summary td{border-bottom:none;vertical-align:top;padding-top:20px}.summary td:first-child{padding:0}.hiddeninfo{white-space:pre-line}table.dragshadow{width:auto;z-index:2000}table.dragshadow td.filename{padding-left:60px;padding-right:16px;height:36px;max-width:unset}table.dragshadow td.size{padding-right:8px}.mask{z-index:50;position:absolute;top:0;left:0;right:0;bottom:0;background-color:var(--color-main-background);background-repeat:no-repeat no-repeat;background-position:50%;opacity:.7;transition:opacity 100ms;-moz-transition:opacity 100ms;-o-transition:opacity 100ms;-ms-transition:opacity 100ms;-webkit-transition:opacity 100ms}.mask.transparent{opacity:0}.newFileMenu{font-weight:300;top:100%;left:-48px !important;margin-top:4px;min-width:100px;z-index:1001}.newFileMenu::after{left:84px !important}.files-controls{box-sizing:border-box;position:-webkit-sticky;position:sticky;height:50px;padding:0;margin:0;background-color:var(--color-main-background-translucent);z-index:62;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:flex;top:0;padding-left:50px}.files-controls .actions>div>.button,.files-controls .actions>div button,.files-controls .actions>.button,.files-controls .actions button{box-sizing:border-box;display:inline-block;display:flex;height:44px;width:44px;padding:9px;align-items:center;justify-content:center}.files-controls .actions>div .button.hidden,.files-controls .actions .button.hidden{display:none}.viewer-mode #app-navigation+#app-content .files-controls{left:0}.files-filestable .filename .action .icon,.files-filestable .selectedActions a .icon,.files-filestable .filename .favorite-mark .icon,.files-controls .actions .button .icon{display:inline-block;vertical-align:middle;background-size:16px 16px}.files-filestable .filename .favorite-mark .icon-star{background-image:none}.files-filestable .filename .favorite-mark .icon-starred{background-image:var(--icon-starred-yellow) !important}.files-filestable .filename .action .icon.hidden,.files-filestable .selectedActions a .icon.hidden,.files-controls .actions .button .icon.hidden{display:none}.files-filestable .filename .action .icon.loading,.files-filestable .selectedActions a .icon.loading,.files-controls .actions .button .icon.loading{width:15px;height:15px}.app-files .actions .button.new{position:relative;width:unset;gap:14px;background-color:var(--color-primary-element-light);color:var(--color-primary-element-light-text);border:unset;padding:0px 20px}.breadcrumb{align-items:center}.breadcrumb .icon-home{border-radius:var(--border-radius)}.breadcrumb .canDrop>a,.files-filestable tbody tr.canDrop{background-color:rgba(0,130,201,.3)}.dropzone-background{background-color:rgba(0,130,201,.3)}.dropzone-background :hover{box-shadow:none !important}.notCreatable{margin-left:12px;margin-right:44px;margin-top:12px;color:var(--color-main-text);overflow:auto;min-width:160px;height:54px}.notCreatable:not(.hidden){display:flex}.notCreatable .icon-alert-outline{top:-15px;position:relative;margin-right:4px}.quota-navigation-item{margin:0 !important;border:none;border-radius:0;background-color:rgba(0,0,0,0);z-index:1;height:44px;display:flex !important;flex-direction:column}.quota-navigation-item__text{height:30px}.quota-navigation-item[href="#"],.quota-navigation-item[href="#"] *{cursor:default !important}.quota-navigation-item__container{height:5px;border-radius:var(--border-radius)}.files-filestable.view-grid:not(.hidden) thead tr{display:block;border-bottom:1px solid var(--color-border);background-color:var(--color-main-background-translucent)}.files-filestable.view-grid:not(.hidden) thead tr th{width:auto;border:none}.files-filestable.view-grid:not(.hidden) tbody{display:grid;grid-template-columns:repeat(auto-fill, 160px);justify-content:space-around;row-gap:15px;margin:15px 0}.files-filestable.view-grid:not(.hidden) tbody tr:not(.hidden){display:block;position:relative;height:190px;border-radius:var(--border-radius)}.files-filestable.view-grid:not(.hidden) tbody tr:not(.hidden):hover,.files-filestable.view-grid:not(.hidden) tbody tr:not(.hidden):focus,.files-filestable.view-grid:not(.hidden) tbody tr:not(.hidden):active,.files-filestable.view-grid:not(.hidden) tbody tr:not(.hidden).selected,.files-filestable.view-grid:not(.hidden) tbody tr:not(.hidden).searchresult,.files-filestable.view-grid:not(.hidden) tbody tr:not(.hidden) .name:focus,.files-filestable.view-grid:not(.hidden) tbody tr:not(.hidden).highlighted{background-color:rgba(0,0,0,0)}.files-filestable.view-grid:not(.hidden) tbody tr:not(.hidden):hover .thumbnail-wrapper,.files-filestable.view-grid:not(.hidden) tbody tr:not(.hidden):hover .nametext,.files-filestable.view-grid:not(.hidden) tbody tr:not(.hidden):hover .fileactions,.files-filestable.view-grid:not(.hidden) tbody tr:not(.hidden):focus .thumbnail-wrapper,.files-filestable.view-grid:not(.hidden) tbody tr:not(.hidden):focus .nametext,.files-filestable.view-grid:not(.hidden) tbody tr:not(.hidden):focus .fileactions,.files-filestable.view-grid:not(.hidden) tbody tr:not(.hidden):active .thumbnail-wrapper,.files-filestable.view-grid:not(.hidden) tbody tr:not(.hidden):active .nametext,.files-filestable.view-grid:not(.hidden) tbody tr:not(.hidden):active .fileactions,.files-filestable.view-grid:not(.hidden) tbody tr:not(.hidden).selected .thumbnail-wrapper,.files-filestable.view-grid:not(.hidden) tbody tr:not(.hidden).selected .nametext,.files-filestable.view-grid:not(.hidden) tbody tr:not(.hidden).selected .fileactions,.files-filestable.view-grid:not(.hidden) tbody tr:not(.hidden).searchresult .thumbnail-wrapper,.files-filestable.view-grid:not(.hidden) tbody tr:not(.hidden).searchresult .nametext,.files-filestable.view-grid:not(.hidden) tbody tr:not(.hidden).searchresult .fileactions,.files-filestable.view-grid:not(.hidden) tbody tr:not(.hidden) .name:focus .thumbnail-wrapper,.files-filestable.view-grid:not(.hidden) tbody tr:not(.hidden) .name:focus .nametext,.files-filestable.view-grid:not(.hidden) tbody tr:not(.hidden) .name:focus .fileactions,.files-filestable.view-grid:not(.hidden) tbody tr:not(.hidden).highlighted .thumbnail-wrapper,.files-filestable.view-grid:not(.hidden) tbody tr:not(.hidden).highlighted .nametext,.files-filestable.view-grid:not(.hidden) tbody tr:not(.hidden).highlighted .fileactions{background-color:var(--color-background-hover)}.files-filestable.view-grid:not(.hidden) tbody td{display:inline;border-bottom:none}.files-filestable.view-grid:not(.hidden) tbody td.filename .thumbnail-wrapper{min-width:0;max-width:none;position:absolute;width:160px;height:160px;padding:14px;top:0;left:0;z-index:-1}.files-filestable.view-grid:not(.hidden) tbody td.filename .thumbnail-wrapper .thumbnail{width:calc(100% - 2 * 14px);height:calc(100% - 2 * 14px);background-size:contain;margin:0;border-radius:var(--border-radius);background-repeat:no-repeat;background-position:center}.files-filestable.view-grid:not(.hidden) tbody td.filename .thumbnail-wrapper .thumbnail .favorite-mark{left:auto;top:-11px;right:-11px}.files-filestable.view-grid:not(.hidden) tbody td.filename .uploadtext{width:100%;margin:0;top:0;bottom:auto;height:28px;padding-top:4px;padding-left:28px}.files-filestable.view-grid:not(.hidden) tbody td.filename .name{height:100%;border-radius:var(--border-radius);overflow:hidden;cursor:pointer !important}.files-filestable.view-grid:not(.hidden) tbody td.filename .name .nametext{display:flex;height:44px;margin-top:146px;text-align:center;line-height:44px;padding:0}.files-filestable.view-grid:not(.hidden) tbody td.filename .name .nametext .innernametext{display:inline-block;text-align:center;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.files-filestable.view-grid:not(.hidden) tbody td.filename .name .nametext:before{content:"";flex:1;min-width:14px}.files-filestable.view-grid:not(.hidden) tbody td.filename .name .nametext:after{content:"";flex:1;min-width:44px}.files-filestable.view-grid:not(.hidden) tbody td.filename .name .nametext .extension{display:none}.files-filestable.view-grid:not(.hidden) tbody td.filename .name .system-tags{display:none}.files-filestable.view-grid:not(.hidden) tbody td.filename .name .fileactions{height:initial;margin-top:146px;display:flex;align-items:center;position:absolute;right:0}.files-filestable.view-grid:not(.hidden) tbody td.filename .name .fileactions .action{padding:14px;width:44px;height:44px;display:flex;align-items:center;justify-content:center}.files-filestable.view-grid:not(.hidden) tbody td.filename .name .fileactions .action:not(.action-menu){display:none}.files-filestable.view-grid:not(.hidden) tbody td.filename .fileActionsMenu .action-share-container.hidden{display:block !important}.files-filestable.view-grid:not(.hidden) tbody td.filename .fileActionsMenu .action-share-container.hidden .action-share img{padding:6px;border-radius:50%}.files-filestable.view-grid:not(.hidden) tbody td.filename .fileActionsMenu .action-restore-container.hidden{display:block !important}.files-filestable.view-grid:not(.hidden) tbody td.filename .fileActionsMenu .action-comment-container.hidden{display:block !important}.files-filestable.view-grid:not(.hidden) tbody td.filename form{padding:3px 14px;border-radius:var(--border-radius)}.files-filestable.view-grid:not(.hidden) tbody td.filename form input.filename{width:100%;margin-left:0;cursor:text}.files-filestable.view-grid:not(.hidden) tbody td.filesize,.files-filestable.view-grid:not(.hidden) tbody td.date{display:none}.files-filestable.view-grid:not(.hidden) tbody td.selection,.files-filestable.view-grid:not(.hidden) tbody td.filename .favorite-mark{position:absolute;top:-8px;left:-8px;display:flex;z-index:10}.files-filestable.view-grid:not(.hidden) tbody td.selection label,.files-filestable.view-grid:not(.hidden) tbody td.filename .favorite-mark label{width:44px;height:44px;display:inline-flex;padding:14px}.files-filestable.view-grid:not(.hidden) tbody td.selection label::before,.files-filestable.view-grid:not(.hidden) tbody td.filename .favorite-mark label::before{margin:0;width:14px;height:14px}.files-filestable.view-grid:not(.hidden) tbody td .popovermenu{left:0;width:150px;margin:0 5px}.files-filestable.view-grid:not(.hidden) tbody td .popovermenu .menuitem span:not(.icon){overflow:hidden;text-overflow:ellipsis}.files-filestable.view-grid:not(.hidden) tr.hidden-file td.filename .name .nametext .extension{display:block}.files-filestable.view-grid:not(.hidden) tfoot{display:grid}.files-filestable.view-grid:not(.hidden) tfoot .summary:not(.hidden){display:inline-block;margin:0 auto;height:418px}.files-filestable.view-grid:not(.hidden) tfoot .summary:not(.hidden) td{padding-top:50px}.files-filestable.view-grid:not(.hidden) tfoot .summary:not(.hidden) td:first-child,.files-filestable.view-grid:not(.hidden) tfoot .summary:not(.hidden) td.date{display:none}.files-filestable.view-grid:not(.hidden) tfoot .summary:not(.hidden) td .info{margin-left:0}#view-toggle{background-color:var(--color-main-background-translucent);border:none;margin:0;padding:22px;opacity:.5;float:right;right:var(--default-grid-baseline);top:var(--default-grid-baseline);z-index:100;position:sticky}#view-toggle:hover,#view-toggle:focus,#showgridview:focus+#view-toggle{opacity:1}#view-toggle:focus-visible,#showgridview:focus-visible+#view-toggle{box-shadow:inset 0 0 0 2px var(--color-primary-element) !important}#showgridview{position:fixed;top:0}#body-public .files-filestable.view-grid:not(.hidden) tbody td.filename .name .nametext .innernametext{max-width:124px}#body-public .files-filestable.view-grid:not(.hidden) tbody td .popovermenu{left:-80px}#body-public #view-toggle{position:absolute;right:0;top:0}#gallery-button{display:none}#tag_multiple_files_container{overflow:hidden;background-color:#fff;border-radius:3px;position:relative;display:flex;flex-wrap:wrap;margin-bottom:10px}#tag_multiple_files_container h3{width:100%;padding:0 18px}#tag_multiple_files_container .systemTagsInputFieldContainer{flex:1 1 80%;min-width:0;margin:0 12px}#upload{box-sizing:border-box;height:36px;width:39px;padding:0 !important;margin-left:3px;overflow:hidden;vertical-align:top;position:relative;z-index:-20}#upload .icon-upload{position:relative;display:block;width:100%;height:44px;width:44px;margin:-5px -3px;cursor:pointer;z-index:10;opacity:.65}.file_upload_target{display:none}.file_upload_form{display:inline;float:left;margin:0;padding:0;cursor:pointer;overflow:visible}.uploadprogresswrapper,.uploadprogresswrapper *{box-sizing:border-box}.uploadprogresswrapper{display:inline-block;vertical-align:top;height:36px;margin-left:3px}.uploadprogresswrapper>input[type=button]{height:36px;margin-left:3px}#uploadprogressbar{border-color:var(--color-border-dark);border-radius:var(--border-radius-pill) 0 0 var(--border-radius-pill);border-right:0;position:relative;float:left;width:200px;height:44px;display:inline-block;text-align:center}#uploadprogressbar .ui-progressbar-value{margin-top:.1em}#uploadprogressbar .ui-progressbar-value.ui-widget-header.ui-corner-left{height:calc(100% + 2px);top:-1px;left:-1px;position:absolute;overflow:hidden;background-color:var(--color-primary-element)}#uploadprogressbar .label{top:8px;opacity:1;overflow:hidden;white-space:nowrap;font-weight:normal}#uploadprogressbar .label.inner{color:var(--color-primary-element-text);position:absolute;display:block;width:200px}#uploadprogressbar .label.outer{position:relative;color:var(--color-main-text)}#uploadprogressbar .desktop{display:block}#uploadprogressbar .mobile{display:none}#uploadprogressbar+.stop{border-top-left-radius:0;border-bottom-left-radius:0}.oc-dialog .fileexists{-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;margin-bottom:30px}.oc-dialog .fileexists .conflict .filename,.oc-dialog .fileexists .conflict .mtime,.oc-dialog .fileexists .conflict .size{-webkit-touch-callout:initial;-webkit-user-select:initial;-khtml-user-select:initial;-moz-user-select:initial;-ms-user-select:initial;user-select:initial}.oc-dialog .fileexists .conflict .message{color:#e9322d}.oc-dialog .fileexists table{width:100%}.oc-dialog .fileexists th{padding-left:0;padding-right:0}.oc-dialog .fileexists th input[type=checkbox]{margin-right:3px}.oc-dialog .fileexists th:first-child{width:225px}.oc-dialog .fileexists th label{font-weight:normal;color:var(--color-main-text)}.oc-dialog .fileexists th .count{margin-left:3px}.oc-dialog .fileexists .conflicts .template{display:none}.oc-dialog .fileexists .conflict{width:100%;height:85px}.oc-dialog .fileexists .conflict .filename{color:#777;word-break:break-all;clear:left}.oc-dialog .fileexists .icon{width:64px;height:64px;margin:0px 5px 5px 5px;background-repeat:no-repeat;background-size:64px 64px;float:left}.oc-dialog .fileexists .original,.oc-dialog .fileexists .replacement{float:left;width:50%}.oc-dialog .fileexists .conflicts{overflow-y:auto;max-height:225px}.oc-dialog .fileexists .conflict input[type=checkbox]{float:left}.oc-dialog .fileexists #allfileslabel{float:right}.oc-dialog .fileexists #allfiles{vertical-align:bottom;position:relative;top:-3px}.oc-dialog .fileexists #allfiles+span{vertical-align:bottom}.oc-dialog .oc-dialog-buttonrow{width:100%;text-align:right}.oc-dialog .oc-dialog-buttonrow .cancel{float:left}.highlightUploaded{-webkit-animation:highlightAnimation 2s 1;-moz-animation:highlightAnimation 2s 1;-o-animation:highlightAnimation 2s 1;animation:highlightAnimation 2s 1}@-webkit-keyframes highlightAnimation{0%{background-color:#ffff8c}100%{background-color:rgba(0,0,0,0)}}@-moz-keyframes highlightAnimation{0%{background-color:#ffff8c}100%{background-color:rgba(0,0,0,0)}}@-o-keyframes highlightAnimation{0%{background-color:#ffff8c}100%{background-color:rgba(0,0,0,0)}}@keyframes highlightAnimation{0%{background-color:#ffff8c}100%{background-color:rgba(0,0,0,0)}}@media only screen and (max-width: 988px)and (min-width: 1025px),only screen and (max-width: 688px){.app-files #app-content.dir-drop{background-color:#fff !important}table th.column-size,table td.filesize,table th.column-mtime,table td.date{display:none}table td{padding:0}table.multiselect thead{padding-left:0}.fileList a.action.action-menu img{padding-left:0}.fileList .fileActionsMenu{margin-right:6px}.fileList a.action-share span:not(.icon):not(.avatar){position:absolute;left:-10000px;top:auto;width:1px;height:1px;overflow:hidden}td.filename a.name .system-tags{display:none}#uploadprogressbar,#uploadprogressbar .label.inner{width:50px}#uploadprogressbar .desktop{display:none !important}#uploadprogressbar .mobile{display:block !important}table.dragshadow{z-index:1000}}@media only screen and (max-width: 480px){table th .selectedActions{float:right}table th .selectedActions>a span:not(.icon){display:none}table th .selectedActions a{padding:17px 14px}table.multiselect th .columntitle.name{margin-left:0}}.app-sidebar .detailFileInfoContainer{min-height:50px;padding:15px}.app-sidebar .detailFileInfoContainer>div{clear:both}.app-sidebar .mainFileInfoView .icon{display:inline-block;background-size:16px 16px}.app-sidebar .mainFileInfoView .permalink{padding:6px 10px;vertical-align:top;opacity:.6}.app-sidebar .mainFileInfoView .permalink:hover,.app-sidebar .mainFileInfoView .permalink:focus{opacity:1}.app-sidebar .mainFileInfoView .permalink-field>input{clear:both;width:90%}.app-sidebar .thumbnailContainer.large{margin-left:-15px;margin-right:-35px;margin-top:-15px}.app-sidebar .thumbnailContainer.large.portrait{margin:0}.app-sidebar .large .thumbnail{width:100%;display:block;background-repeat:no-repeat;background-position:center;background-size:100%;float:none;margin:0;height:auto}.app-sidebar .large .thumbnail .stretcher{content:"";display:block;padding-bottom:56.25%}.app-sidebar .large.portrait .thumbnail{background-position:50% top}.app-sidebar .large.portrait .thumbnail{background-size:contain}.app-sidebar .large.text{overflow-y:scroll;overflow-x:hidden;padding-top:14px;font-size:80%;margin-left:0}.app-sidebar .thumbnail{width:100%;min-height:75px;display:inline-block;float:left;margin-right:10px;background-size:contain;background-repeat:no-repeat}.app-sidebar .ellipsis{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.app-sidebar .fileName{font-size:16px;padding-top:13px;padding-bottom:3px}.app-sidebar .fileName h3{width:calc(100% - 42px);display:inline-block;padding:5px 0;margin:-5px 0}.app-sidebar .file-details{color:var(--color-text-maxcontrast)}.app-sidebar .action-favorite{vertical-align:sub;padding:10px;margin:-10px}.app-sidebar .action-favorite>span{opacity:.7 !important}.app-sidebar .detailList{float:left}.app-sidebar .close{position:absolute;top:0;right:0;opacity:.5;z-index:1;width:44px;height:44px}.whatsNewPopover{bottom:35px !important;left:15px !important;width:270px;z-index:700}.whatsNewPopover p{width:auto !important}.whatsNewPopover .caption{font-weight:bold;cursor:auto !important}.whatsNewPopover .icon-close{position:absolute;right:0}.whatsNewPopover::after{content:none}/*# sourceMappingURL=merged.css.map */ diff --git a/apps/files/css/merged.css.map b/apps/files/css/merged.css.map index eb29ba162d6..f8c6e77d0d6 100644 --- a/apps/files/css/merged.css.map +++ b/apps/files/css/merged.css.map @@ -1 +1 @@ -{"version":3,"sourceRoot":"","sources":["files.scss","../../../core/css/functions.scss","upload.scss","mobile.scss","detailsView.scss","../../../core/css/whatsnew.scss"],"names":[],"mappings":"AAWA,SAEC,YACA,YACA,qBACA,WAED,oEACA,8BACA,kDAEC,+CAED,0BACC,oDAGD,mBACC,kBACA,aACA,SACA,4CACC,iBAIF,gBACC,aAGD,OACC,iBACA,YACA,aACA,aACA,mBAGD,6EAGC,yBACA,gCAID,kBACC,kBACA,WACA,gBACA,cACA,sBAEA,6CACC,aAGD,wBACC,wBACA,gBAEA,SAEA,WACA,cACA,0DAMD,wBACC,cACA,WAEA,mGAEC,8CAEA,6KACC,oCAKF,8DACC,oBAKH,yBACC,aAID,uCACC,cACA,WAGD,wBAGC,yBAEA,qBAGD,6FACC,+DAGD,iCACC,yDAGD,kFACC,0CAGD,4EACC,+DAID,gBCxEC,yCD2ED,iBC3EC,yCD8ED,oBC9EC,0CDiFD,qGCjFC,wCDuFD,0BCvFC,yCD0FD,2BC1FC,2CD6FD,mBC7FC,yCDgGD,2BChGC,4CDmGD,2BCnGC,0CDsGD,4BCtGC,4CD0GD,4CACC,WAGD,iCACC,WACA,YACA,eACA,SACA,eAGD,wCACC,aAGD,0CACC,WAGD,2BACC,YAED,4KAKC,+CAED,wMAKC,oDAGD,qCAEA,yDACC,oCAED,kCACC,iCACA,8BACA,4BACA,yBACA,mBAED,wGAIC,UACA,oCAGD,oBACC,oCAED,uBACC,6BAED,sBACC,cACA,aACA,YACA,sBACA,2BACA,sBACA,oCACC,kBAGF,kCACC,qBACA,mBAED,2BACC,eACA,iBAGD,uCACC,cAGD,yBACC,WACA,WACA,gBACA,qBACA,2BACA,WAED,wJAIC,kBAED,2CACC,eAED,4EAEC,mBAGD,kBAEC,4CACA,gBACA,mBAED,SACC,eACA,kBACA,+BACA,4BAED,qBACC,kBACA,aACA,UAGD,uBACC,kBACA,YAGD,0BACC,gBAED,uCACC,iBAED,8EAEC,2BACA,sBACA,kBAEA,gBAGD,qMAQC,gBACA,qPACC,MAIF,2BACC,0DACA,iBAGD,sDACC,iBAGD,+BACC,kBACA,aAED,kCACC,aAGD,0DAGC,WACA,kBAED,kDAEC,aACA,kBACA,2BACA,sBACA,YACA,iBACA,UAED,qCAEC,QACA,eACA,eACA,YAGA,8DACC,WAED,mEACC,WAGF,6BACC,qBACA,WACA,YACA,wBACA,2BACA,4BACA,gBACA,eACA,mCACA,eACA,kBACA,UAED,oCACC,eAID,2CACC,qCAGD,iDACC,qBACA,4BACA,YAED,uBACC,iBACA,kBACA,SAGD,6IACA,8FAEA,wCACC,kBACA,gBACA,uBACA,YAKA,kBACC,YACA,4BACC,QACA,YACA,aACA,gBACA,mBACA,uBACA,YACA,WACA,mBAID,+BACC,iBACA,aACA,uBACA,mBACA,kCACA,gBAEA,iDACC,iBACA,iBACA,wCACA,iCACA,oCACA,uBACA,mBACA,gBACA,uBACA,iBACA,kBAEA,uDACC,iBACA,sBAID,mEACC,gBAOL,iJAEC,wBAGD,mCACC,iCACA,8BACA,4BACA,yBAED,4BACC,WAGD,2CACC,uBACA,gBACA,kBACA,mBAKD,8BACC,kBACA,mBAEA,iBACA,OACA,SACA,YACA,cAEA,iBACA,eAEA,iBACA,oCACA,uBACA,mBAGD,mBACC,UAID,6DACC,WACA,eAID,iRAIC,UAID,0EACC,WAMA,wEACC,aAGD,oGACC,+CACA,wCACA,wBACA,yDACA,aAIF,oGAEC,mBAGD,+BACC,kBACA,WACA,eACA,gBACA,wJAGD,wFAEC,kBACA,UACA,YAGD,yCACC,qBACA,WAED,8CACC,kBACA,cACA,SACA,WACA,iBACA,kBACA,wDAEC,8CACA,8CACA,oBAEA,WACA,YACA,aACA,qBACA,uBAGF,8DACC,+CAGD,iDAGA,aACC,WAGD,iCACC,kBAID,mDAEC,gBAID,oCACC,qBACA,0BAGD,8EACC,0BAOA,kCACC,eAGD,sEACC,eAGD,sCACC,gBAIF,aACC,YACA,WACA,2BAKA,0EACC,wCAKF,iBACI,kBACA,qBACA,sBAEJ,wBACI,aAEJ,mBACC,eACA,iBACA,iBAGD,0BACC,aAED,uBACC,kBACA,2BACA,mBAGD,8CACC,gBAIA,8BACC,eACA,iBACA,iBACA,WACA,2CACC,kBACA,0FAGC,kBACA,cACA,SACA,UACA,WACA,gBAED,mDACC,qBACA,sBAGF,0CACC,iBACA,oBACA,kBACA,mBAGA,oGACC,WAID,qIAEC,WAED,uDACC,WACA,0HACC,WAIH,wEACC,UAED,oCACC,+CACA,wCAGF,uGACC,WAED,wDACC,UAKF,4EACC,qBACA,eACA,gBACA,uBACA,sBACA,gBAGD,2CACC,yBAGD,yCACC,UAGD,kNAKC,UAGD,qCACC,gBAGD,0FAEC,WAGD,mDACC,eAGD,SACC,oCAGA,aAED,wCACC,WAEA,mBAKD,sBACC,aAED,2DAIC,+BAED,YACC,mBACA,mBACA,iBAED,wBACC,UAED,YACC,qBAGD,iBACC,WACA,aAED,6BACC,kBACA,mBACA,YAGA,gBAED,yBACC,kBAED,MACC,WACA,kBACA,MACA,OACA,QACA,SACA,8CACA,sCACA,wBACA,WACA,yBACA,8BACA,4BACA,6BACA,iCAED,kBACC,UAGD,aACC,gBACA,SACA,sBACA,eACA,gBACA,aAGA,oBACC,qBAKF,gBACC,sBACA,wBACA,gBACA,YACA,UACA,SACA,0DACA,WACA,yBACA,sBACA,qBACA,iBACA,aACA,MACA,kBAKE,0IACC,sBACA,qBACA,aACA,YACA,WACA,YACA,mBACA,uBAED,oFACC,aAQJ,0DACC,OAGD,6KAIC,qBACA,sBACA,0BAMA,sDACC,sBAED,yDACC,uDAIF,iJAGC,aAGD,oJAGC,WACA,YAGD,gCACC,kBAGD,YACC,mBAEA,uBACC,mCAIF,0DAEC,oCAED,qBACC,oCACA,4BACC,2BAIF,cACC,iBACA,kBACA,gBACA,6BACA,cACA,gBACA,YAEA,2BACC,aAGD,kCACC,UACA,kBACA,iBAIF,uBACC,oBACA,YACA,gBACA,+BACA,UACA,YACA,wBACA,sBAEA,6BACC,YAKA,oEACC,0BAIF,kCACC,WACA,mCAWA,kDACC,cACA,4CACA,0DACA,qDACC,WACA,YAMH,+CACC,aACA,+CACA,6BACA,aACA,cAGA,+DACC,cACA,kBACA,aACA,mCAEA,0fAKC,+BAEA,oxDAGC,+CAKH,kDACC,eACA,mBAGC,8EACC,YACA,eACA,kBACA,MAvDQ,MAwDR,OAxDQ,MAyDR,QAxDO,KAyDP,MACA,OACA,WAEA,yFACC,4BACA,6BACA,wBACA,SACA,mCACA,4BACA,2BAKA,wGACC,UACA,UACA,YAKH,uEACC,WACA,SACA,MACA,YAEA,YACA,gBAEA,kBAGD,iEACC,YACA,mCAIA,gBAKA,0BAEA,2EACC,aACA,YACA,iBACA,kBACA,iBACA,UAEA,0FACC,qBACA,kBACA,gBACA,uBACA,mBAED,kFACC,WACA,OACA,eAED,iFACC,WACA,OACA,eAID,sFACC,aAKF,8EACC,aAGD,8EACC,eACA,iBACA,aACA,mBACA,kBACA,QAEA,sFACC,QAxJK,KAyJL,WACA,YACA,aACA,mBACA,uBAGA,wGACC,aAQH,2GACC,yBAEA,6HACC,YACA,kBAIF,6GACC,yBAGD,6GACC,yBAIF,gEACC,iBACA,mCAEA,+EACC,WACA,cACA,YAMH,kHAEC,aAGD,sIAEC,kBACA,SACA,UACA,aACA,WAEA,kJACC,WACA,YACA,oBACA,QAzNO,KA0NP,kKACC,SACA,MA5NM,KA6NN,OA7NM,KAmOT,+DACC,OACA,YACA,aAGA,yFACC,gBACA,uBAMJ,+FACC,cAID,+CACC,aAEA,qEACC,qBACA,cAEA,aAEA,wEACC,iBAEA,iKAEC,aAGD,8EACI,cAQR,aACC,0DACA,YACA,SACA,aACA,WACA,YACA,mCACA,iCACA,YACA,gBAEA,uEAGC,UAGD,oEAEC,mEASF,cACC,eACA,MAOC,uGACC,gBAID,4EACC,WAKF,0BACC,kBACA,QACA,MAKF,gBACC,aAGD,8BACC,gBACA,sBACA,kBACA,kBACA,aACA,eACA,mBAEA,iCACC,WACA,eAGD,6DACC,aACA,YACA,cEl2CF,QACC,sBACA,YACA,WACA,qBACA,gBACA,gBACA,mBACA,kBACA,YAED,qBACC,kBACA,cACA,WACA,YACA,WACA,iBACA,eACA,WACA,YAED,iCACA,+FAEA,gDACC,sBAGD,uBACC,qBACA,mBACA,YACA,gBAED,0CACC,YACA,gBAED,mBACC,sCACA,sEACA,eACA,kBACA,WACA,YACA,YACA,qBACA,kBAEA,yCACC,gBAGF,yEACC,wBACA,SACA,UACA,kBACA,gBACA,8CAED,0BACC,QACA,UACA,gBACA,mBACA,mBAED,gCACC,wCACA,kBACA,cACA,YAED,gCACC,kBACA,6BAED,4BACC,cAED,2BACC,aAGD,yBACC,yBACA,4BAGD,uBACC,2BACA,yBACA,wBACA,sBACA,qBACA,iBACA,mBAGD,0HAGC,8BACA,4BACA,2BACA,yBACA,wBACA,oBAED,0CACC,cAED,6BACC,WAED,0BACC,eACA,gBAED,+CACC,iBAED,sCACC,YAED,gCACC,mBACA,6BAED,iCACC,gBAED,4CACC,aAED,iCACC,WACA,YAED,2CACC,WACA,qBACA,WAED,6BACC,WACA,YACA,uBACA,4BACA,0BACA,WAGD,qEAEC,WACA,UAED,kCACC,gBACA,iBAED,sDACC,WAED,sCACC,YAED,iCACC,sBACA,kBACA,SAED,sCACC,sBAGD,gCACC,WACA,iBAEA,wCACC,WAIF,mBACC,0CACA,uCACA,qCACA,kCAGD,sCACE,4BACA,qCAEF,mCACE,4BACA,qCAEF,iCACE,4BACA,qCAEF,8BACE,4BACA,qCC3MF,oGAEA,iCACC,iCAGD,2EAIC,aAID,SACC,UAID,wBACC,eAGD,mCACC,eAGD,2BACC,iBAID,sDACC,kBACA,cACA,SACA,UACA,WACA,gBAID,gCACC,aAKD,mDACC,WAGD,4BACC,wBAED,2BACC,yBAID,iBACC,cAID,0CAEC,0BACC,YAED,4CACC,aAID,4BACC,kBAID,uCACC,eCvFF,sCACC,gBACA,aAGD,0CACC,WAID,qCACC,qBACA,0BAGD,0CACC,iBACA,mBACA,WAEA,gGAEC,UAGF,sDACC,WACA,UAGD,uCACC,kBACA,mBACA,iBAGD,gDACC,SAGD,+BACC,WACA,cACA,4BACA,2BACA,qBACA,WACA,SACA,YAGD,0CACC,WACA,cACA,sBAGD,wCACC,4BAGD,wCACC,wBAGD,yBACC,kBACA,kBACA,iBACA,cACA,cAGD,wBACC,WACA,gBACA,qBACA,WACA,kBACA,wBACA,4BAGD,uBACC,mBACA,uBACA,gBAGD,uBACC,eACA,iBACA,mBAGD,0BACC,wBACA,qBACA,cACA,cAGD,2BACC,oCAGD,8BACC,mBACA,aACA,aAGD,mCACC,sBAGD,yBACC,WAGD,oBACC,kBACA,MACA,QACA,WACA,UACA,WACA,YCxHD,iBACE,uBACA,qBACA,YACA,YAGF,mBACE,sBAGF,0BACE,iBACA,uBAGF,6BACE,kBACA,QAGF,wBACE","file":"merged.css"}
\ No newline at end of file +{"version":3,"sourceRoot":"","sources":["files.scss","upload.scss","mobile.scss","detailsView.scss","../../../core/css/whatsnew.scss"],"names":[],"mappings":"AAWA,SAEC,YACA,YACA,qBACA,WAED,oEACA,8BACA,kDAEC,+CAED,0BACC,oDAGD,mBACC,kBACA,aACA,SACA,4CACC,iBACA,YACA,SACA,oDACA,8CACA,aACA,iBAIF,gBACC,aAGD,OACC,iBACA,YACA,aACA,aACA,mBAGD,6EAGC,yBACA,gCAID,kBACC,kBACA,WACA,gBACA,cACA,sBAEA,6CACC,aAGD,wBACC,wBACA,gBAEA,SAEA,WACA,cACA,0DAMD,wBACC,cACA,WAEA,mGAEC,8CAEA,6KACC,oCAKF,8DACC,oBAKH,yBACC,aAID,uCACC,cACA,WAGD,wBAGC,yBAEA,qBAGD,6FACC,+DAGD,iCACC,yDAGD,kFACC,0CAGD,4EACC,+DAID,iCACC,WACA,YACA,eACA,SACA,eAGD,wCACC,aAGD,0CACC,WAGD,2BACC,YAED,4KAKC,+CAED,wMAKC,oDAGD,qCAEA,yDACC,oCAED,kCACC,iCACA,8BACA,4BACA,yBACA,mBAED,wGAIC,UACA,oCAGD,oBACC,oCAED,uBACC,6BAED,sBACC,cACA,aACA,YACA,sBACA,2BACA,sBACA,oCACC,kBAGF,kCACC,qBACA,mBAED,2BACC,eACA,iBAGD,uCACC,cAGD,yBACC,WACA,WACA,gBACA,qBACA,2BACA,WAED,wJAIC,kBAED,2CACC,eAED,4EAEC,mBAGD,kBAEC,4CACA,gBACA,mBAED,SACC,eACA,kBACA,+BACA,4BAED,qBACC,kBACA,aACA,UAGD,uBACC,kBACA,YAGD,0BACC,gBAED,uCACC,iBAED,8EAEC,2BACA,sBACA,kBAEA,gBAGD,qMAQC,gBACA,qPACC,MAIF,2BACC,0DACA,iBAGD,sDACC,iBAGD,+BACC,kBACA,aAED,kCACC,aAGD,0DAGC,WACA,kBAED,kDAEC,aACA,kBACA,2BACA,sBACA,YACA,iBACA,UAED,qCAEC,QACA,eACA,eACA,YAGA,8DACC,WAED,mEACC,WAGF,6BACC,qBACA,WACA,YACA,wBACA,2BACA,4BACA,gBACA,eACA,mCACA,eACA,kBACA,UAED,oCACC,eAID,2CACC,qCAGD,iDACC,qBACA,4BACA,YAED,uBACC,iBACA,kBACA,SAGD,6IACA,8FAEA,wCACC,kBACA,gBACA,uBACA,YAKA,kBACC,YACA,4BACC,QACA,YACA,aACA,gBACA,mBACA,uBACA,YACA,WACA,mBAID,+BACC,iBACA,aACA,uBACA,mBACA,kCACA,gBAEA,iDACC,iBACA,iBACA,wCACA,iCACA,oCACA,uBACA,mBACA,gBACA,uBACA,iBACA,kBAEA,uDACC,iBACA,sBAID,mEACC,gBAOL,iJAEC,wBAGD,mCACC,iCACA,8BACA,4BACA,yBAED,4BACC,WAGD,2CACC,uBACA,gBACA,kBACA,mBAKD,8BACC,kBACA,mBAEA,iBACA,OACA,SACA,YACA,cAEA,iBACA,eAEA,iBACA,oCACA,uBACA,mBAGD,mBACC,UAID,6DACC,WACA,eAID,iRAIC,UAID,0EACC,WAMA,wEACC,aAGD,oGACC,+CACA,wCACA,wBACA,yDACA,aAIF,oGAEC,mBAGD,+BACC,kBACA,WACA,eACA,gBACA,wJAGD,wFAEC,kBACA,UACA,YAGD,yCACC,qBACA,WAED,8CACC,kBACA,cACA,SACA,WACA,iBACA,kBACA,wDAEC,8CACA,8CACA,oBAEA,WACA,YACA,aACA,qBACA,uBAGF,8DACC,+CAGD,iDAGA,aACC,WAGD,iCACC,kBAID,mDAEC,gBAID,oCACC,qBACA,0BAGD,8EACC,0BAOA,kCACC,eAGD,sEACC,eAGD,sCACC,gBAIF,aACC,YACA,WACA,2BAKA,0EACC,wCAKF,iBACI,kBACA,qBACA,sBAEJ,wBACI,aAEJ,mBACC,eACA,iBACA,iBAGD,0BACC,aAED,uBACC,kBACA,2BACA,mBAGD,8CACC,gBAIA,8BACC,eACA,iBACA,iBACA,WACA,2CACC,kBACA,0FAGC,kBACA,cACA,SACA,UACA,WACA,gBAED,mDACC,qBACA,sBAGF,0CACC,iBACA,oBACA,kBACA,mBAGA,oGACC,WAID,qIAEC,WAED,uDACC,WACA,0HACC,WAIH,wEACC,UAED,oCACC,+CACA,wCAGF,uGACC,WAED,wDACC,UAKF,4EACC,qBACA,eACA,gBACA,uBACA,sBACA,gBAGD,2CACC,yBAGD,yCACC,UAGD,kNAKC,UAGD,qCACC,gBAGD,0FAEC,WAGD,mDACC,eAGD,SACC,oCAGA,aAED,wCACC,WAEA,mBAKD,sBACC,aAED,2DAIC,+BAED,YACC,mBACA,mBACA,iBAED,wBACC,UAED,YACC,qBAGD,iBACC,WACA,aAED,6BACC,kBACA,mBACA,YAGA,gBAED,yBACC,kBAED,MACC,WACA,kBACA,MACA,OACA,QACA,SACA,8CACA,sCACA,wBACA,WACA,yBACA,8BACA,4BACA,6BACA,iCAED,kBACC,UAGD,aACC,gBACA,SACA,sBACA,eACA,gBACA,aAGA,oBACC,qBAKF,gBACC,sBACA,wBACA,gBACA,YACA,UACA,SACA,0DACA,WACA,yBACA,sBACA,qBACA,iBACA,aACA,MACA,kBAKE,0IACC,sBACA,qBACA,aACA,YACA,WACA,YACA,mBACA,uBAED,oFACC,aAQJ,0DACC,OAGD,6KAIC,qBACA,sBACA,0BAMA,sDACC,sBAED,yDACC,uDAIF,iJAGC,aAGD,oJAGC,WACA,YAGD,gCACC,kBACA,YACA,SACA,oDACA,8CACA,aACA,iBAGD,YACC,mBAEA,uBACC,mCAIF,0DAEC,oCAED,qBACC,oCACA,4BACC,2BAIF,cACC,iBACA,kBACA,gBACA,6BACA,cACA,gBACA,YAEA,2BACC,aAGD,kCACC,UACA,kBACA,iBAIF,uBACC,oBACA,YACA,gBACA,+BACA,UACA,YACA,wBACA,sBAEA,6BACC,YAKA,oEACC,0BAIF,kCACC,WACA,mCAWA,kDACC,cACA,4CACA,0DACA,qDACC,WACA,YAMH,+CACC,aACA,+CACA,6BACA,aACA,cAGA,+DACC,cACA,kBACA,aACA,mCAEA,0fAKC,+BAEA,oxDAGC,+CAKH,kDACC,eACA,mBAGC,8EACC,YACA,eACA,kBACA,MAvDQ,MAwDR,OAxDQ,MAyDR,QAxDO,KAyDP,MACA,OACA,WAEA,yFACC,4BACA,6BACA,wBACA,SACA,mCACA,4BACA,2BAKA,wGACC,UACA,UACA,YAKH,uEACC,WACA,SACA,MACA,YAEA,YACA,gBAEA,kBAGD,iEACC,YACA,mCAIA,gBAKA,0BAEA,2EACC,aACA,YACA,iBACA,kBACA,iBACA,UAEA,0FACC,qBACA,kBACA,gBACA,uBACA,mBAED,kFACC,WACA,OACA,eAED,iFACC,WACA,OACA,eAID,sFACC,aAKF,8EACC,aAGD,8EACC,eACA,iBACA,aACA,mBACA,kBACA,QAEA,sFACC,QAxJK,KAyJL,WACA,YACA,aACA,mBACA,uBAGA,wGACC,aAQH,2GACC,yBAEA,6HACC,YACA,kBAIF,6GACC,yBAGD,6GACC,yBAIF,gEACC,iBACA,mCAEA,+EACC,WACA,cACA,YAMH,kHAEC,aAGD,sIAEC,kBACA,SACA,UACA,aACA,WAEA,kJACC,WACA,YACA,oBACA,QAzNO,KA0NP,kKACC,SACA,MA5NM,KA6NN,OA7NM,KAmOT,+DACC,OACA,YACA,aAGA,yFACC,gBACA,uBAMJ,+FACC,cAID,+CACC,aAEA,qEACC,qBACA,cAEA,aAEA,wEACC,iBAEA,iKAEC,aAGD,8EACI,cAQR,aACC,0DACA,YACA,SACA,aACA,WACA,YACA,mCACA,iCACA,YACA,gBAEA,uEAGC,UAGD,oEAEC,mEASF,cACC,eACA,MAOC,uGACC,gBAID,4EACC,WAKF,0BACC,kBACA,QACA,MAKF,gBACC,aAGD,8BACC,gBACA,sBACA,kBACA,kBACA,aACA,eACA,mBAEA,iCACC,WACA,eAGD,6DACC,aACA,YACA,cCx0CF,QACC,sBACA,YACA,WACA,qBACA,gBACA,gBACA,mBACA,kBACA,YAED,qBACC,kBACA,cACA,WACA,YACA,WACA,iBACA,eACA,WACA,YAED,iCACA,+FAEA,gDACC,sBAGD,uBACC,qBACA,mBACA,YACA,gBAED,0CACC,YACA,gBAED,mBACC,sCACA,sEACA,eACA,kBACA,WACA,YACA,YACA,qBACA,kBAEA,yCACC,gBAGF,yEACC,wBACA,SACA,UACA,kBACA,gBACA,8CAED,0BACC,QACA,UACA,gBACA,mBACA,mBAED,gCACC,wCACA,kBACA,cACA,YAED,gCACC,kBACA,6BAED,4BACC,cAED,2BACC,aAGD,yBACC,yBACA,4BAGD,uBACC,2BACA,yBACA,wBACA,sBACA,qBACA,iBACA,mBAGD,0HAGC,8BACA,4BACA,2BACA,yBACA,wBACA,oBAED,0CACC,cAED,6BACC,WAED,0BACC,eACA,gBAED,+CACC,iBAED,sCACC,YAED,gCACC,mBACA,6BAED,iCACC,gBAED,4CACC,aAED,iCACC,WACA,YAED,2CACC,WACA,qBACA,WAED,6BACC,WACA,YACA,uBACA,4BACA,0BACA,WAGD,qEAEC,WACA,UAED,kCACC,gBACA,iBAED,sDACC,WAED,sCACC,YAED,iCACC,sBACA,kBACA,SAED,sCACC,sBAGD,gCACC,WACA,iBAEA,wCACC,WAIF,mBACC,0CACA,uCACA,qCACA,kCAGD,sCACE,4BACA,qCAEF,mCACE,4BACA,qCAEF,iCACE,4BACA,qCAEF,8BACE,4BACA,qCC3MF,oGAEA,iCACC,iCAGD,2EAIC,aAID,SACC,UAID,wBACC,eAGD,mCACC,eAGD,2BACC,iBAID,sDACC,kBACA,cACA,SACA,UACA,WACA,gBAID,gCACC,aAKD,mDACC,WAGD,4BACC,wBAED,2BACC,yBAID,iBACC,cAID,0CAEC,0BACC,YAED,4CACC,aAID,4BACC,kBAID,uCACC,eCvFF,sCACC,gBACA,aAGD,0CACC,WAID,qCACC,qBACA,0BAGD,0CACC,iBACA,mBACA,WAEA,gGAEC,UAGF,sDACC,WACA,UAGD,uCACC,kBACA,mBACA,iBAGD,gDACC,SAGD,+BACC,WACA,cACA,4BACA,2BACA,qBACA,WACA,SACA,YAGD,0CACC,WACA,cACA,sBAGD,wCACC,4BAGD,wCACC,wBAGD,yBACC,kBACA,kBACA,iBACA,cACA,cAGD,wBACC,WACA,gBACA,qBACA,WACA,kBACA,wBACA,4BAGD,uBACC,mBACA,uBACA,gBAGD,uBACC,eACA,iBACA,mBAGD,0BACC,wBACA,qBACA,cACA,cAGD,2BACC,oCAGD,8BACC,mBACA,aACA,aAGD,mCACC,sBAGD,yBACC,WAGD,oBACC,kBACA,MACA,QACA,WACA,UACA,WACA,YCxHD,iBACE,uBACA,qBACA,YACA,YAGF,mBACE,sBAGF,0BACE,iBACA,uBAGF,6BACE,kBACA,QAGF,wBACE","file":"merged.css"}
\ No newline at end of file diff --git a/apps/files/img/app-dark.svg b/apps/files/img/app-dark.svg new file mode 100644 index 00000000000..9b7d771861e --- /dev/null +++ b/apps/files/img/app-dark.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" id="mdi-folder" viewBox="0 0 24 24"><path d="M10,4H4C2.89,4 2,4.89 2,6V18A2,2 0 0,0 4,20H20A2,2 0 0,0 22,18V8C22,6.89 21.1,6 20,6H12L10,4Z" /></svg>
\ No newline at end of file diff --git a/apps/files/img/app.svg b/apps/files/img/app.svg index 0d0c5c0428e..803e010cd11 100644 --- a/apps/files/img/app.svg +++ b/apps/files/img/app.svg @@ -1 +1 @@ -<svg width="32" height="32" version="1.1" viewBox="0 0 32 32" xmlns="http://www.w3.org/2000/svg"><path d="m3 4c-0.5 0-1 0.5-1 1v22c0 0.52 0.48 1 1 1h26c0.52 0 1-0.482 1-1v-18c0-0.5-0.5-1-1-1h-13l-4-4z" fill="#fff"/></svg> +<svg xmlns="http://www.w3.org/2000/svg" id="mdi-folder" viewBox="0 0 24 24"><path d="M10,4H4C2.89,4 2,4.89 2,6V18A2,2 0 0,0 4,20H20A2,2 0 0,0 22,18V8C22,6.89 21.1,6 20,6H12L10,4Z" fill="#fff" /></svg>
\ No newline at end of file diff --git a/apps/files/img/computer.svg b/apps/files/img/computer.svg deleted file mode 100644 index c5cbf81b37d..00000000000 --- a/apps/files/img/computer.svg +++ /dev/null @@ -1 +0,0 @@ -<svg width="24px" height="24px" fill="#000000" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M20 18c1.1 0 1.99-.9 1.99-2L22 6c0-1.1-.9-2-2-2H4c-1.1 0-2 .9-2 2v10c0 1.1.9 2 2 2H1c-.55 0-1 .45-1 1s.45 1 1 1h22c.55 0 1-.45 1-1s-.45-1-1-1h-3zM5 6h14c.55 0 1 .45 1 1v8c0 .55-.45 1-1 1H5c-.55 0-1-.45-1-1V7c0-.55.45-1 1-1z"/></svg> diff --git a/apps/files/img/delete.svg b/apps/files/img/delete.svg deleted file mode 100644 index 5f40f94eaee..00000000000 --- a/apps/files/img/delete.svg +++ /dev/null @@ -1 +0,0 @@ -<svg width="16" height="16" version="1.1" viewbox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"><path d="M6.5 1L6 2H3c-.554 0-1 .446-1 1v1h12V3c0-.554-.446-1-1-1h-3l-.5-1zM3 5l.875 9c.06.55.573 1 1.125 1h6c.552 0 1.064-.45 1.125-1L13 5z"/></svg> diff --git a/apps/files/img/external.svg b/apps/files/img/external.svg deleted file mode 100644 index 9653fd9db7a..00000000000 --- a/apps/files/img/external.svg +++ /dev/null @@ -1 +0,0 @@ -<svg width="16" height="16" version="1.1" viewbox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"><path d="m8 1 2.4 2.44-3.46 3.5 2.12 2.12 3.5-3.5 2.44 2.44v-7zm-5.25 1.5c-0.68 0-1.25 0.57-1.25 1.25v9.5c0 0.68 0.57 1.25 1.25 1.25h9.5c0.68 0 1.25-0.57 1.25-1.25v-4.25l-1.5-1.5v5.5h-9v-9h5.5l-1.5-1.5z"/></svg> diff --git a/apps/files/img/folder.svg b/apps/files/img/folder.svg index c3ad7028f9a..9b7d771861e 100644 --- a/apps/files/img/folder.svg +++ b/apps/files/img/folder.svg @@ -1 +1 @@ -<svg width="16" height="16" version="1.1" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"><path d="m1.5 2c-0.25 0-0.5 0.25-0.5 0.5v11c0 0.26 0.24 0.5 0.5 0.5h13c0.26 0 0.5-0.241 0.5-0.5v-9c0-0.25-0.25-0.5-0.5-0.5h-6.5l-2-2z"/></svg> +<svg xmlns="http://www.w3.org/2000/svg" id="mdi-folder" viewBox="0 0 24 24"><path d="M10,4H4C2.89,4 2,4.89 2,6V18A2,2 0 0,0 4,20H20A2,2 0 0,0 22,18V8C22,6.89 21.1,6 20,6H12L10,4Z" /></svg>
\ No newline at end of file diff --git a/apps/files/img/public.svg b/apps/files/img/public.svg deleted file mode 100644 index b900cd4a75d..00000000000 --- a/apps/files/img/public.svg +++ /dev/null @@ -1 +0,0 @@ -<svg width="16" height="16" version="1.1" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"><path d="m9.2363 2.166-3.1816 3.1836c-0.7071 0.7072-1.0378 1.6182-0.9883 2.457 0.05 0.8389 0.4333 1.5841 0.9883 2.1387l1.4121-1.416c-0.5672-0.5672-0.5444-1.2192 2e-3 -1.7656l3.1812-3.1817c0.52536-0.52536 1.2507-0.52318 1.772-2e-3 0.48245 0.5556 0.52732 1.2382-4e-3 1.7695l-0.82 0.8203c0.555 0.785 0.645 1.3663 0.593 2.2344l1.641-1.6406c1.2374-1.2374 1.2371-3.3645 0-4.6016-1.236-1.2361-3.342-1.2113-4.5957 4e-3zm0.7071 3.8848-1.4141 1.418h4e-3c0.55 0.55 0.50736 1.2582-4e-3 1.7695l-3.1816 3.1817c-0.696 0.59192-1.2985 0.47105-1.7696 0-0.62636-0.62636-0.5-1.2681 0-1.768l0.85-0.8473c-0.556-0.7835-0.6484-1.365-0.5976-2.2324l-1.666 1.666c-1.2393 1.2393-1.2357 3.36 0 4.5957 1.2353 1.2353 3.362 1.2356 4.5976 0l3.1817-3.182c0.7086-0.7083 1.0396-1.6184 0.9906-2.4586-0.048-0.8401-0.432-1.5864-0.9887-2.1407z"/></svg> diff --git a/apps/files/img/recent.svg b/apps/files/img/recent.svg deleted file mode 100644 index d50e1e1eda8..00000000000 --- a/apps/files/img/recent.svg +++ /dev/null @@ -1 +0,0 @@ -<svg width="16" height="16" version="1.1" viewbox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"><circle cx="8" cy="8" r="7" fill="none" stroke="#000" stroke-width="2"/><path d="m8 3.5-1 5 3.5 2-2-2z" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5"/></svg> diff --git a/apps/files/img/share.svg b/apps/files/img/share.svg deleted file mode 100644 index 06a8d313f64..00000000000 --- a/apps/files/img/share.svg +++ /dev/null @@ -1 +0,0 @@ -<svg width="16" height="16" version="1.1" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"><circle cx="3.5" cy="8" r="2.5"/><circle cx="12.5" cy="12.5" r="2.5"/><circle cx="12.5" cy="3.5" r="2.5"/><path d="m3.5 8 9 4.5m-9-4.5 9-4.5" fill="none" stroke="#000" stroke-width="2"/></svg> diff --git a/apps/files/img/star.svg b/apps/files/img/star.svg deleted file mode 100644 index 8a2c0d6deff..00000000000 --- a/apps/files/img/star.svg +++ /dev/null @@ -1 +0,0 @@ -<svg width="16" height="16" version="1.1" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"><path d="m8 0.5 2.2 5.3 5.8 0.45-4.5 3.75 1.5 5.5-5-3.1-5 3.1 1.5-5.5-4.5-3.75 5.8-0.45z"/></svg> diff --git a/apps/files/img/unshare.svg b/apps/files/img/unshare.svg deleted file mode 100644 index 0c22ca64057..00000000000 --- a/apps/files/img/unshare.svg +++ /dev/null @@ -1 +0,0 @@ -<svg width="16" height="16" version="1.1" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"><path d="m12.5 1a2.5 2.5 0 0 0-2.5 2.5 2.5 2.5 0 0 0 0.003906 0.12891l-4.9023 2.4512a2.5 2.5 0 0 0-1.6016-0.58008 2.5 2.5 0 0 0-2.5 2.5 2.5 2.5 0 0 0 2.5 2.5 2.5 2.5 0 0 0 0.30469-0.021484l3.4395-1.7246-1.25-0.625a2.5 2.5 0 0 0 0.0058594-0.12891 2.5 2.5 0 0 0-0.0039062-0.12891l4.9023-2.4512a2.5 2.5 0 0 0 1.6016 0.58008 2.5 2.5 0 0 0 0.26562-0.013672l1.5625-0.7832a2.5 2.5 0 0 0 0.67188-1.7031 2.5 2.5 0 0 0-2.5-2.5zm0.25391 9.0156-3.7246 1.8672 0.97656 0.48828a2.5 2.5 0 0 0-0.005859 0.12891 2.5 2.5 0 0 0 2.5 2.5 2.5 2.5 0 0 0 2.5-2.5 2.5 2.5 0 0 0-2.2461-2.4844z"/><rect transform="rotate(-26.63)" x="-1.0586" y="11.891" width="11.687" height="2.0029" ry="0" style="paint-order:normal"/></svg> diff --git a/apps/files/js/filelist.js b/apps/files/js/filelist.js index a3c868789fc..cfc21e909c0 100644 --- a/apps/files/js/filelist.js +++ b/apps/files/js/filelist.js @@ -3846,7 +3846,8 @@ return; } var $newButton = $(OCA.Files.Templates['template_addbutton']({ - addText: t('files', 'New file/folder menu'), + addText: t('files', 'New'), + addLongText: t('files', 'New file/folder menu'), iconClass: 'icon-add', })); diff --git a/apps/files/js/templates.js b/apps/files/js/templates.js index 315f697728e..3b0aec46ccb 100644 --- a/apps/files/js/templates.js +++ b/apps/files/js/templates.js @@ -419,10 +419,12 @@ templates['template_addbutton'] = template({"compiler":[8,">= 4.3.0"],"main":fun return undefined }; - return "<a href=\"#\" class=\"button new\">\n <span class=\"icon " + return "<a href=\"#\" class=\"button new\" aria-label=\"" + + alias4(((helper = (helper = lookupProperty(helpers,"addLongText") || (depth0 != null ? lookupProperty(depth0,"addLongText") : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"addLongText","hash":{},"data":data,"loc":{"start":{"line":1,"column":43},"end":{"line":1,"column":58}}}) : helper))) + + "\">\n <span class=\"icon " + alias4(((helper = (helper = lookupProperty(helpers,"iconClass") || (depth0 != null ? lookupProperty(depth0,"iconClass") : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"iconClass","hash":{},"data":data,"loc":{"start":{"line":2,"column":19},"end":{"line":2,"column":32}}}) : helper))) - + "\"></span>\n <span class=\"hidden-visually\">" - + alias4(((helper = (helper = lookupProperty(helpers,"addText") || (depth0 != null ? lookupProperty(depth0,"addText") : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"addText","hash":{},"data":data,"loc":{"start":{"line":3,"column":31},"end":{"line":3,"column":42}}}) : helper))) + + "\"></span>\n <span>" + + alias4(((helper = (helper = lookupProperty(helpers,"addText") || (depth0 != null ? lookupProperty(depth0,"addText") : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"addText","hash":{},"data":data,"loc":{"start":{"line":3,"column":7},"end":{"line":3,"column":18}}}) : helper))) + "</span>\n</a>\n"; },"useData":true}); })();
\ No newline at end of file diff --git a/apps/files/js/templates/template_addbutton.handlebars b/apps/files/js/templates/template_addbutton.handlebars index 62a022715a9..478465d93aa 100644 --- a/apps/files/js/templates/template_addbutton.handlebars +++ b/apps/files/js/templates/template_addbutton.handlebars @@ -1,4 +1,4 @@ -<a href="#" class="button new"> +<a href="#" class="button new" aria-label="{{addLongText}}"> <span class="icon {{iconClass}}"></span> - <span class="hidden-visually">{{addText}}</span> + <span>{{addText}}</span> </a> diff --git a/apps/files/l10n/ar.js b/apps/files/l10n/ar.js index 838df930e15..5bed52dbc9a 100644 --- a/apps/files/l10n/ar.js +++ b/apps/files/l10n/ar.js @@ -79,6 +79,7 @@ OC.L10N.register( "_including %n hidden_::_including %n hidden_" : ["يشمل %n مخفي","يشمل %n مخفي","يشمل %n مخفي","يشمل %n مخفي","يشمل %n مخفي","يشمل %n مخفي"], "You do not have permission to upload or create files here" : "لا يوجد تخويل برفع أو إنشاء ملفات هنا", "_Uploading %n file_::_Uploading %n files_" : ["لا يوجد ملفات %n لتحميلها","تحميل 1 ملف %n","تحميل 2 ملف %n","يتم تحميل عدد قليل من ملفات %n","يتم تحميل عدد كبير من ملفات %n","يتم تحميل ملفات %n"], + "New" : "جديد", "New file/folder menu" : "قائمة ملف/مجلد جديد", "Select file range" : "حدد نطاق الملف", "{used}%" : "{مُستخدَم}%", @@ -278,6 +279,7 @@ OC.L10N.register( "Open folder {name}" : "إفتح المجلد {name}", "This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "لم يمكن عرض هذه القائمة بالكامل بسبب إشكالية في الأداء. سيتم عرض الملفات عندما تمر عليها في القائمة", "Search for an account" : "البحث عن حساب", + "Choose" : "إختَر", "No files or folders have been deleted yet" : "لم يتم حذف أي ملفات أو مجلدات بعدُ" }, "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"); diff --git a/apps/files/l10n/ar.json b/apps/files/l10n/ar.json index 15cb79db21c..62cb0e539b8 100644 --- a/apps/files/l10n/ar.json +++ b/apps/files/l10n/ar.json @@ -77,6 +77,7 @@ "_including %n hidden_::_including %n hidden_" : ["يشمل %n مخفي","يشمل %n مخفي","يشمل %n مخفي","يشمل %n مخفي","يشمل %n مخفي","يشمل %n مخفي"], "You do not have permission to upload or create files here" : "لا يوجد تخويل برفع أو إنشاء ملفات هنا", "_Uploading %n file_::_Uploading %n files_" : ["لا يوجد ملفات %n لتحميلها","تحميل 1 ملف %n","تحميل 2 ملف %n","يتم تحميل عدد قليل من ملفات %n","يتم تحميل عدد كبير من ملفات %n","يتم تحميل ملفات %n"], + "New" : "جديد", "New file/folder menu" : "قائمة ملف/مجلد جديد", "Select file range" : "حدد نطاق الملف", "{used}%" : "{مُستخدَم}%", @@ -276,6 +277,7 @@ "Open folder {name}" : "إفتح المجلد {name}", "This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "لم يمكن عرض هذه القائمة بالكامل بسبب إشكالية في الأداء. سيتم عرض الملفات عندما تمر عليها في القائمة", "Search for an account" : "البحث عن حساب", + "Choose" : "إختَر", "No files or folders have been deleted yet" : "لم يتم حذف أي ملفات أو مجلدات بعدُ" },"pluralForm" :"nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" }
\ No newline at end of file diff --git a/apps/files/l10n/bg.js b/apps/files/l10n/bg.js index 2fbf4a3b722..92ab2684108 100644 --- a/apps/files/l10n/bg.js +++ b/apps/files/l10n/bg.js @@ -78,6 +78,7 @@ OC.L10N.register( "_including %n hidden_::_including %n hidden_" : ["включително %n скрит","включително %n скрити"], "You do not have permission to upload or create files here" : "Нямате право да качвате или създавате файлове тук", "_Uploading %n file_::_Uploading %n files_" : ["Качване на %n файл","Качване на %n файла"], + "New" : "Нов", "New file/folder menu" : "Ново меню за файл/папка", "Select file range" : "Избери от файловете", "{used}%" : "{used}%", @@ -257,6 +258,7 @@ OC.L10N.register( "Open folder {name}" : "Отваряне на папка {name}", "This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Този списък не е напълно рендиран поради причини, свързани с производителността. Файловете ще бъдат рендирани, докато навигирате из списъка.", "Search for an account" : "Търсене на профил", + "Choose" : "Изберете", "No files or folders have been deleted yet" : "Все още няма изтрити файлове или папки" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/bg.json b/apps/files/l10n/bg.json index bb2b01c309a..b21b70ba3e1 100644 --- a/apps/files/l10n/bg.json +++ b/apps/files/l10n/bg.json @@ -76,6 +76,7 @@ "_including %n hidden_::_including %n hidden_" : ["включително %n скрит","включително %n скрити"], "You do not have permission to upload or create files here" : "Нямате право да качвате или създавате файлове тук", "_Uploading %n file_::_Uploading %n files_" : ["Качване на %n файл","Качване на %n файла"], + "New" : "Нов", "New file/folder menu" : "Ново меню за файл/папка", "Select file range" : "Избери от файловете", "{used}%" : "{used}%", @@ -255,6 +256,7 @@ "Open folder {name}" : "Отваряне на папка {name}", "This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Този списък не е напълно рендиран поради причини, свързани с производителността. Файловете ще бъдат рендирани, докато навигирате из списъка.", "Search for an account" : "Търсене на профил", + "Choose" : "Изберете", "No files or folders have been deleted yet" : "Все още няма изтрити файлове или папки" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files/l10n/br.js b/apps/files/l10n/br.js index 88659a1daf3..1d260787847 100644 --- a/apps/files/l10n/br.js +++ b/apps/files/l10n/br.js @@ -67,6 +67,7 @@ OC.L10N.register( "{dirs} and {files}" : "{dirs} ha {files}", "_including %n hidden_::_including %n hidden_" : [" %n koachet en o zouez","%n goachet en o zouez","koachet en o zouez","koachet en o zouez","koachet en o zouez %n"], "_Uploading %n file_::_Uploading %n files_" : ["%n restr o vezañ karget","%n restr o vezañ karget","restroù zo o vezañ karget","an darn vrasañ eus ar restroù o vezañ karget","%n restr o vezañ karget"], + "New" : "Nevez", "Select file range" : "Dibab un tachad restroù", "{used} of {quota} used" : "{used} diwar {quota} implijet", "{used} used" : "{used} implijet", @@ -181,6 +182,7 @@ OC.L10N.register( "Shared with you" : "Rannet ganeoc'h", "Shared by link" : "Rannet dre liamm", "Deleted shares" : "Rannañ dilemet", - "Pending shares" : "Rannañ o c'hortoz" + "Pending shares" : "Rannañ o c'hortoz", + "Choose" : "Dibab" }, "nplurals=5; plural=((n%10 == 1) && (n%100 != 11) && (n%100 !=71) && (n%100 !=91) ? 0 :(n%10 == 2) && (n%100 != 12) && (n%100 !=72) && (n%100 !=92) ? 1 :(n%10 ==3 || n%10==4 || n%10==9) && (n%100 < 10 || n% 100 > 19) && (n%100 < 70 || n%100 > 79) && (n%100 < 90 || n%100 > 99) ? 2 :(n != 0 && n % 1000000 == 0) ? 3 : 4);"); diff --git a/apps/files/l10n/br.json b/apps/files/l10n/br.json index 6f7e48e2d4e..750dc5302b3 100644 --- a/apps/files/l10n/br.json +++ b/apps/files/l10n/br.json @@ -65,6 +65,7 @@ "{dirs} and {files}" : "{dirs} ha {files}", "_including %n hidden_::_including %n hidden_" : [" %n koachet en o zouez","%n goachet en o zouez","koachet en o zouez","koachet en o zouez","koachet en o zouez %n"], "_Uploading %n file_::_Uploading %n files_" : ["%n restr o vezañ karget","%n restr o vezañ karget","restroù zo o vezañ karget","an darn vrasañ eus ar restroù o vezañ karget","%n restr o vezañ karget"], + "New" : "Nevez", "Select file range" : "Dibab un tachad restroù", "{used} of {quota} used" : "{used} diwar {quota} implijet", "{used} used" : "{used} implijet", @@ -179,6 +180,7 @@ "Shared with you" : "Rannet ganeoc'h", "Shared by link" : "Rannet dre liamm", "Deleted shares" : "Rannañ dilemet", - "Pending shares" : "Rannañ o c'hortoz" + "Pending shares" : "Rannañ o c'hortoz", + "Choose" : "Dibab" },"pluralForm" :"nplurals=5; plural=((n%10 == 1) && (n%100 != 11) && (n%100 !=71) && (n%100 !=91) ? 0 :(n%10 == 2) && (n%100 != 12) && (n%100 !=72) && (n%100 !=92) ? 1 :(n%10 ==3 || n%10==4 || n%10==9) && (n%100 < 10 || n% 100 > 19) && (n%100 < 70 || n%100 > 79) && (n%100 < 90 || n%100 > 99) ? 2 :(n != 0 && n % 1000000 == 0) ? 3 : 4);" }
\ No newline at end of file diff --git a/apps/files/l10n/ca.js b/apps/files/l10n/ca.js index 08e56c1d52e..07804b376d4 100644 --- a/apps/files/l10n/ca.js +++ b/apps/files/l10n/ca.js @@ -79,6 +79,7 @@ OC.L10N.register( "_including %n hidden_::_including %n hidden_" : ["incloent-hi %n element ocult","incloent-hi %n elements ocults"], "You do not have permission to upload or create files here" : "No teniu permís per a pujar o crear fitxers aquí", "_Uploading %n file_::_Uploading %n files_" : ["S'està pujant %n fitxer","S'estan pujant %n fitxers"], + "New" : "Nou", "New file/folder menu" : "Menú de fitxer o carpeta nova", "Select file range" : "Selecciona un interval de fitxers", "{used}%" : "{used}%", @@ -278,6 +279,7 @@ OC.L10N.register( "Open folder {name}" : "Obre la carpeta {name}", "This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Aquesta llista no es mostra completament per raons de rendiment. Es mostraran els fitxers a mesura que navegueu per la llista.", "Search for an account" : "Cerqueu un compte", + "Choose" : "Escolliu", "No files or folders have been deleted yet" : "Encara no s'ha suprimit cap fitxer o carpeta" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/ca.json b/apps/files/l10n/ca.json index 302b5e7f916..b908dd01735 100644 --- a/apps/files/l10n/ca.json +++ b/apps/files/l10n/ca.json @@ -77,6 +77,7 @@ "_including %n hidden_::_including %n hidden_" : ["incloent-hi %n element ocult","incloent-hi %n elements ocults"], "You do not have permission to upload or create files here" : "No teniu permís per a pujar o crear fitxers aquí", "_Uploading %n file_::_Uploading %n files_" : ["S'està pujant %n fitxer","S'estan pujant %n fitxers"], + "New" : "Nou", "New file/folder menu" : "Menú de fitxer o carpeta nova", "Select file range" : "Selecciona un interval de fitxers", "{used}%" : "{used}%", @@ -276,6 +277,7 @@ "Open folder {name}" : "Obre la carpeta {name}", "This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Aquesta llista no es mostra completament per raons de rendiment. Es mostraran els fitxers a mesura que navegueu per la llista.", "Search for an account" : "Cerqueu un compte", + "Choose" : "Escolliu", "No files or folders have been deleted yet" : "Encara no s'ha suprimit cap fitxer o carpeta" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files/l10n/cs.js b/apps/files/l10n/cs.js index eff2fc76813..89b45473671 100644 --- a/apps/files/l10n/cs.js +++ b/apps/files/l10n/cs.js @@ -32,6 +32,7 @@ OC.L10N.register( "Move" : "Přesunout", "Copy" : "Kopírovat", "Choose target folder" : "Zvolte cílovou složku", + "Set reminder" : "Nastavit připomínku", "Edit locally" : "Upravit lokálně", "Open" : "Otevřít", "Delete file" : "Smazat soubor", @@ -78,6 +79,7 @@ OC.L10N.register( "_including %n hidden_::_including %n hidden_" : ["včetně %n skrytého","včetně %n skrytých","včetně %n skrytých","včetně %n skrytých"], "You do not have permission to upload or create files here" : "Nemáte oprávnění sem nahrávat nebo zde vytvářet soubory", "_Uploading %n file_::_Uploading %n files_" : ["Nahrává se %n soubor","Nahrávají se %n soubory","Nahrává se %n souborů","Nahrávají se %n soubory"], + "New" : "Nové", "New file/folder menu" : "Nabídka souboru/složky", "Select file range" : "Vybrat rozsah souborů", "{used}%" : "{used}%", @@ -277,6 +279,7 @@ OC.L10N.register( "Open folder {name}" : "Otevřít složku {name}", "This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Seznam není vykreslen celý z důvodu nároků na výkon. Soubory budou dokreslovány, jak se budete posouvat seznamem.", "Search for an account" : "Hledat účet", + "Choose" : "Vybrat", "No files or folders have been deleted yet" : "Zatím nebyly smazány žádné soubory či složky" }, "nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n <= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;"); diff --git a/apps/files/l10n/cs.json b/apps/files/l10n/cs.json index dd7cf116c96..6d0a9049733 100644 --- a/apps/files/l10n/cs.json +++ b/apps/files/l10n/cs.json @@ -30,6 +30,7 @@ "Move" : "Přesunout", "Copy" : "Kopírovat", "Choose target folder" : "Zvolte cílovou složku", + "Set reminder" : "Nastavit připomínku", "Edit locally" : "Upravit lokálně", "Open" : "Otevřít", "Delete file" : "Smazat soubor", @@ -76,6 +77,7 @@ "_including %n hidden_::_including %n hidden_" : ["včetně %n skrytého","včetně %n skrytých","včetně %n skrytých","včetně %n skrytých"], "You do not have permission to upload or create files here" : "Nemáte oprávnění sem nahrávat nebo zde vytvářet soubory", "_Uploading %n file_::_Uploading %n files_" : ["Nahrává se %n soubor","Nahrávají se %n soubory","Nahrává se %n souborů","Nahrávají se %n soubory"], + "New" : "Nové", "New file/folder menu" : "Nabídka souboru/složky", "Select file range" : "Vybrat rozsah souborů", "{used}%" : "{used}%", @@ -275,6 +277,7 @@ "Open folder {name}" : "Otevřít složku {name}", "This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Seznam není vykreslen celý z důvodu nároků na výkon. Soubory budou dokreslovány, jak se budete posouvat seznamem.", "Search for an account" : "Hledat účet", + "Choose" : "Vybrat", "No files or folders have been deleted yet" : "Zatím nebyly smazány žádné soubory či složky" },"pluralForm" :"nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n <= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;" }
\ No newline at end of file diff --git a/apps/files/l10n/da.js b/apps/files/l10n/da.js index 95686c9ba27..13e1ede44e7 100644 --- a/apps/files/l10n/da.js +++ b/apps/files/l10n/da.js @@ -78,6 +78,7 @@ OC.L10N.register( "_including %n hidden_::_including %n hidden_" : ["%n skujlte inkluderet","%n skujlte inkluderet"], "You do not have permission to upload or create files here" : "Du har ikke tilladelse til at uploade eller oprette filer her", "_Uploading %n file_::_Uploading %n files_" : ["Uploader %n fil","Uploader %n filer"], + "New" : "Ny", "New file/folder menu" : "Ny fil/mappe menu", "Select file range" : "Vælg filområde", "{used}%" : "{used}%", @@ -239,6 +240,7 @@ OC.L10N.register( "Shared with you" : "Delt med dig", "Shared by link" : "Delt via link", "Deleted shares" : "Slettede delinger", - "Pending shares" : "Afventende delinger" + "Pending shares" : "Afventende delinger", + "Choose" : "Vælg" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/da.json b/apps/files/l10n/da.json index 1a560b04a90..b5266c1e1b6 100644 --- a/apps/files/l10n/da.json +++ b/apps/files/l10n/da.json @@ -76,6 +76,7 @@ "_including %n hidden_::_including %n hidden_" : ["%n skujlte inkluderet","%n skujlte inkluderet"], "You do not have permission to upload or create files here" : "Du har ikke tilladelse til at uploade eller oprette filer her", "_Uploading %n file_::_Uploading %n files_" : ["Uploader %n fil","Uploader %n filer"], + "New" : "Ny", "New file/folder menu" : "Ny fil/mappe menu", "Select file range" : "Vælg filområde", "{used}%" : "{used}%", @@ -237,6 +238,7 @@ "Shared with you" : "Delt med dig", "Shared by link" : "Delt via link", "Deleted shares" : "Slettede delinger", - "Pending shares" : "Afventende delinger" + "Pending shares" : "Afventende delinger", + "Choose" : "Vælg" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files/l10n/de.js b/apps/files/l10n/de.js index 77a247479d4..8435376e013 100644 --- a/apps/files/l10n/de.js +++ b/apps/files/l10n/de.js @@ -78,6 +78,7 @@ OC.L10N.register( "_including %n hidden_::_including %n hidden_" : ["%n versteckte eingeschlossen","%n versteckte eingeschlossen"], "You do not have permission to upload or create files here" : "Du hast keine Berechtigung, hier Dateien hochzuladen oder zu erstellen", "_Uploading %n file_::_Uploading %n files_" : ["%n Datei wird hochgeladen","%n Dateien werden hochgeladen"], + "New" : "Neu", "New file/folder menu" : "Menü für neue Datei/Ordner", "Select file range" : "Dateibereich auswählen", "{used}%" : "{used}%", @@ -256,6 +257,7 @@ OC.L10N.register( "Open folder {name}" : "Ordner {name} öffnen", "This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Diese Liste ist aus Performance-Gründen nicht vollständig gerendert. Die Dateien werden gerendert, wenn du durch die Liste navigierst.", "Search for an account" : "Nach einem Konto suchen", + "Choose" : "Benötigt keine Übersetzung. Hier wird nur die formelle Übersetzung verwendet (de_DE).", "No files or folders have been deleted yet" : "Es wurden noch keine Dateien oder Ordner gelöscht" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/de.json b/apps/files/l10n/de.json index cbf47e063dd..b560b2d792a 100644 --- a/apps/files/l10n/de.json +++ b/apps/files/l10n/de.json @@ -76,6 +76,7 @@ "_including %n hidden_::_including %n hidden_" : ["%n versteckte eingeschlossen","%n versteckte eingeschlossen"], "You do not have permission to upload or create files here" : "Du hast keine Berechtigung, hier Dateien hochzuladen oder zu erstellen", "_Uploading %n file_::_Uploading %n files_" : ["%n Datei wird hochgeladen","%n Dateien werden hochgeladen"], + "New" : "Neu", "New file/folder menu" : "Menü für neue Datei/Ordner", "Select file range" : "Dateibereich auswählen", "{used}%" : "{used}%", @@ -254,6 +255,7 @@ "Open folder {name}" : "Ordner {name} öffnen", "This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Diese Liste ist aus Performance-Gründen nicht vollständig gerendert. Die Dateien werden gerendert, wenn du durch die Liste navigierst.", "Search for an account" : "Nach einem Konto suchen", + "Choose" : "Benötigt keine Übersetzung. Hier wird nur die formelle Übersetzung verwendet (de_DE).", "No files or folders have been deleted yet" : "Es wurden noch keine Dateien oder Ordner gelöscht" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files/l10n/de_DE.js b/apps/files/l10n/de_DE.js index 4a90712960e..85011a3c1aa 100644 --- a/apps/files/l10n/de_DE.js +++ b/apps/files/l10n/de_DE.js @@ -79,6 +79,7 @@ OC.L10N.register( "_including %n hidden_::_including %n hidden_" : ["%n versteckte eingeschlossen","%n versteckte eingeschlossen"], "You do not have permission to upload or create files here" : "Sie haben keine Berechtigung, hier Dateien hochzuladen oder zu erstellen", "_Uploading %n file_::_Uploading %n files_" : ["%n Datei wird hoch geladen","%n Dateien werden hochgeladen"], + "New" : "Neu", "New file/folder menu" : "Menü für neue Datei/Ordner", "Select file range" : "Dateibereich auswählen", "{used}%" : "{used}%", @@ -278,6 +279,7 @@ OC.L10N.register( "Open folder {name}" : "Ordner {name} öffnen", "This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Diese Liste ist aus Performance-Gründen nicht vollständig gerendert. Die Dateien werden gerendert, wenn Sie durch die Liste navigieren.", "Search for an account" : "Nach einem Konto suchen", + "Choose" : "Auswählen", "No files or folders have been deleted yet" : "Es wurden noch keine Dateien oder Ordner gelöscht" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/de_DE.json b/apps/files/l10n/de_DE.json index bd9ce939360..521f411b78c 100644 --- a/apps/files/l10n/de_DE.json +++ b/apps/files/l10n/de_DE.json @@ -77,6 +77,7 @@ "_including %n hidden_::_including %n hidden_" : ["%n versteckte eingeschlossen","%n versteckte eingeschlossen"], "You do not have permission to upload or create files here" : "Sie haben keine Berechtigung, hier Dateien hochzuladen oder zu erstellen", "_Uploading %n file_::_Uploading %n files_" : ["%n Datei wird hoch geladen","%n Dateien werden hochgeladen"], + "New" : "Neu", "New file/folder menu" : "Menü für neue Datei/Ordner", "Select file range" : "Dateibereich auswählen", "{used}%" : "{used}%", @@ -276,6 +277,7 @@ "Open folder {name}" : "Ordner {name} öffnen", "This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Diese Liste ist aus Performance-Gründen nicht vollständig gerendert. Die Dateien werden gerendert, wenn Sie durch die Liste navigieren.", "Search for an account" : "Nach einem Konto suchen", + "Choose" : "Auswählen", "No files or folders have been deleted yet" : "Es wurden noch keine Dateien oder Ordner gelöscht" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files/l10n/el.js b/apps/files/l10n/el.js index 144eaa7bd59..4b5564eb116 100644 --- a/apps/files/l10n/el.js +++ b/apps/files/l10n/el.js @@ -78,6 +78,7 @@ OC.L10N.register( "_including %n hidden_::_including %n hidden_" : ["περιλαμβάνεται %n κρυφό","περιλαμβάνονται %n κρυφά"], "You do not have permission to upload or create files here" : "Δεν έχετε δικαιώματα μεταφόρτωσης ή δημιουργίας αρχείων εδώ", "_Uploading %n file_::_Uploading %n files_" : ["Μεταφόρτωση %n αρχείου","Μεταφόρτωση %n αρχείων"], + "New" : "Νέα", "New file/folder menu" : "Μενού νέου αρχείου/φακέλου", "Select file range" : "Επιλέξτε εύρος αρχείων", "{used}%" : "{used}%", @@ -248,6 +249,7 @@ OC.L10N.register( "Pending shares" : "Κοινή χρήση σε εκκρεμότητα", "Open folder {name}" : "Άνοιγμα φακέλου {name}", "Search for an account" : "Αναζήτηση για λογαριασμό", + "Choose" : "Επιλογή", "No files or folders have been deleted yet" : "Κανένα αρχείο ή φάκελος δεν έχει διαγραφεί ακόμα" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/el.json b/apps/files/l10n/el.json index 78e004eb298..652f8dbf9bc 100644 --- a/apps/files/l10n/el.json +++ b/apps/files/l10n/el.json @@ -76,6 +76,7 @@ "_including %n hidden_::_including %n hidden_" : ["περιλαμβάνεται %n κρυφό","περιλαμβάνονται %n κρυφά"], "You do not have permission to upload or create files here" : "Δεν έχετε δικαιώματα μεταφόρτωσης ή δημιουργίας αρχείων εδώ", "_Uploading %n file_::_Uploading %n files_" : ["Μεταφόρτωση %n αρχείου","Μεταφόρτωση %n αρχείων"], + "New" : "Νέα", "New file/folder menu" : "Μενού νέου αρχείου/φακέλου", "Select file range" : "Επιλέξτε εύρος αρχείων", "{used}%" : "{used}%", @@ -246,6 +247,7 @@ "Pending shares" : "Κοινή χρήση σε εκκρεμότητα", "Open folder {name}" : "Άνοιγμα φακέλου {name}", "Search for an account" : "Αναζήτηση για λογαριασμό", + "Choose" : "Επιλογή", "No files or folders have been deleted yet" : "Κανένα αρχείο ή φάκελος δεν έχει διαγραφεί ακόμα" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files/l10n/en_GB.js b/apps/files/l10n/en_GB.js index 8db2a40e5e5..1d6993a986e 100644 --- a/apps/files/l10n/en_GB.js +++ b/apps/files/l10n/en_GB.js @@ -79,6 +79,7 @@ OC.L10N.register( "_including %n hidden_::_including %n hidden_" : ["including %n hidden","including %n hidden"], "You do not have permission to upload or create files here" : "You do not have permission to upload or create files here", "_Uploading %n file_::_Uploading %n files_" : ["Uploading %n file","Uploading %n files"], + "New" : "New", "New file/folder menu" : "New file/folder menu", "Select file range" : "Select file range", "{used}%" : "{used}%", @@ -278,6 +279,7 @@ OC.L10N.register( "Open folder {name}" : "Open folder {name}", "This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list.", "Search for an account" : "Search for an account", + "Choose" : "Choose", "No files or folders have been deleted yet" : "No files or folders have been deleted yet" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/en_GB.json b/apps/files/l10n/en_GB.json index e71423f0a97..6662dcd2a05 100644 --- a/apps/files/l10n/en_GB.json +++ b/apps/files/l10n/en_GB.json @@ -77,6 +77,7 @@ "_including %n hidden_::_including %n hidden_" : ["including %n hidden","including %n hidden"], "You do not have permission to upload or create files here" : "You do not have permission to upload or create files here", "_Uploading %n file_::_Uploading %n files_" : ["Uploading %n file","Uploading %n files"], + "New" : "New", "New file/folder menu" : "New file/folder menu", "Select file range" : "Select file range", "{used}%" : "{used}%", @@ -276,6 +277,7 @@ "Open folder {name}" : "Open folder {name}", "This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list.", "Search for an account" : "Search for an account", + "Choose" : "Choose", "No files or folders have been deleted yet" : "No files or folders have been deleted yet" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files/l10n/eo.js b/apps/files/l10n/eo.js index b63fff55a03..8ccd8b4557e 100644 --- a/apps/files/l10n/eo.js +++ b/apps/files/l10n/eo.js @@ -66,6 +66,7 @@ OC.L10N.register( "{dirs} and {files}" : "{dirs} kaj {files}", "_including %n hidden_::_including %n hidden_" : ["inkluzive %n kaŝita","inkluzive %n kaŝita(j)"], "_Uploading %n file_::_Uploading %n files_" : ["Alŝutatas %n dosiero","Alŝutatas %n dosieroj"], + "New" : "Nova", "Select file range" : "Elekti dosierintervalon", "{used}%" : "{used}%", "{used} of {quota} used" : "{used} uzataj el {quota}", @@ -168,6 +169,7 @@ OC.L10N.register( "Shared with others" : "Kunhavata kun aliaj", "Shared with you" : "Kunhavata kun vi", "Shared by link" : "Kunhavata per ligilo", - "Deleted shares" : "Forigitaj kunhavigoj" + "Deleted shares" : "Forigitaj kunhavigoj", + "Choose" : "Elekti" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/eo.json b/apps/files/l10n/eo.json index bdee44bfaa5..af502849fd5 100644 --- a/apps/files/l10n/eo.json +++ b/apps/files/l10n/eo.json @@ -64,6 +64,7 @@ "{dirs} and {files}" : "{dirs} kaj {files}", "_including %n hidden_::_including %n hidden_" : ["inkluzive %n kaŝita","inkluzive %n kaŝita(j)"], "_Uploading %n file_::_Uploading %n files_" : ["Alŝutatas %n dosiero","Alŝutatas %n dosieroj"], + "New" : "Nova", "Select file range" : "Elekti dosierintervalon", "{used}%" : "{used}%", "{used} of {quota} used" : "{used} uzataj el {quota}", @@ -166,6 +167,7 @@ "Shared with others" : "Kunhavata kun aliaj", "Shared with you" : "Kunhavata kun vi", "Shared by link" : "Kunhavata per ligilo", - "Deleted shares" : "Forigitaj kunhavigoj" + "Deleted shares" : "Forigitaj kunhavigoj", + "Choose" : "Elekti" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files/l10n/es.js b/apps/files/l10n/es.js index 06f085f209c..54791212dba 100644 --- a/apps/files/l10n/es.js +++ b/apps/files/l10n/es.js @@ -78,6 +78,7 @@ OC.L10N.register( "_including %n hidden_::_including %n hidden_" : ["incluyendo %n oculto","incluyendo %n ocultos","incluyendo %n ocultos"], "You do not have permission to upload or create files here" : "No tienes permiso para subir o crear archivos aquí", "_Uploading %n file_::_Uploading %n files_" : ["Subiendo %n archivo","Subiendo %n archivos","Subiendo %n archivos"], + "New" : "Nuevo", "New file/folder menu" : "Menú de carpeta/archivo nuevo", "Select file range" : "Seleccionar el rango de archivos", "{used}%" : "{used}%", @@ -277,6 +278,7 @@ OC.L10N.register( "Open folder {name}" : "Abrir carpeta {name}", "This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Esta lista no se renderiza completa por razones de rendimiento. Los archivos serán renderizados mientras ud. navegue por la lista.", "Search for an account" : "Buscar una cuenta", + "Choose" : "Selecciona", "No files or folders have been deleted yet" : "No se han borrado archivos o carpetas todavía" }, "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); diff --git a/apps/files/l10n/es.json b/apps/files/l10n/es.json index 1415a9a7eeb..65b7d72b786 100644 --- a/apps/files/l10n/es.json +++ b/apps/files/l10n/es.json @@ -76,6 +76,7 @@ "_including %n hidden_::_including %n hidden_" : ["incluyendo %n oculto","incluyendo %n ocultos","incluyendo %n ocultos"], "You do not have permission to upload or create files here" : "No tienes permiso para subir o crear archivos aquí", "_Uploading %n file_::_Uploading %n files_" : ["Subiendo %n archivo","Subiendo %n archivos","Subiendo %n archivos"], + "New" : "Nuevo", "New file/folder menu" : "Menú de carpeta/archivo nuevo", "Select file range" : "Seleccionar el rango de archivos", "{used}%" : "{used}%", @@ -275,6 +276,7 @@ "Open folder {name}" : "Abrir carpeta {name}", "This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Esta lista no se renderiza completa por razones de rendimiento. Los archivos serán renderizados mientras ud. navegue por la lista.", "Search for an account" : "Buscar una cuenta", + "Choose" : "Selecciona", "No files or folders have been deleted yet" : "No se han borrado archivos o carpetas todavía" },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" }
\ No newline at end of file diff --git a/apps/files/l10n/es_AR.js b/apps/files/l10n/es_AR.js index dbcc4f5cbe0..919efcdcc2e 100644 --- a/apps/files/l10n/es_AR.js +++ b/apps/files/l10n/es_AR.js @@ -58,6 +58,7 @@ OC.L10N.register( "{dirs} and {files}" : "{dirs} y {files}", "_including %n hidden_::_including %n hidden_" : ["incluyendo %n escondido","incluyendo %n ocultos","incluyendo %n ocultos"], "_Uploading %n file_::_Uploading %n files_" : ["Subiendo %n archivo","Cargando %n archivos","Cargando %n archivos"], + "New" : "Nuevo", "\"{name}\" is an invalid file name." : "\"{name}\" es un nombre de archivo inválido. ", "File name cannot be empty." : "El nombre de archivo no puede estar vacío.", "\"{name}\" is not an allowed filetype" : "\"{name}\" es un tipo de archivo no permitido", @@ -139,6 +140,7 @@ OC.L10N.register( "Shares" : "Shares", "Shared with others" : "Compartido con otros", "Shared with you" : "Compartido con usted", - "Shared by link" : "Compartido por link" + "Shared by link" : "Compartido por link", + "Choose" : "Elige" }, "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); diff --git a/apps/files/l10n/es_AR.json b/apps/files/l10n/es_AR.json index 3919575c214..4ee63e6be7a 100644 --- a/apps/files/l10n/es_AR.json +++ b/apps/files/l10n/es_AR.json @@ -56,6 +56,7 @@ "{dirs} and {files}" : "{dirs} y {files}", "_including %n hidden_::_including %n hidden_" : ["incluyendo %n escondido","incluyendo %n ocultos","incluyendo %n ocultos"], "_Uploading %n file_::_Uploading %n files_" : ["Subiendo %n archivo","Cargando %n archivos","Cargando %n archivos"], + "New" : "Nuevo", "\"{name}\" is an invalid file name." : "\"{name}\" es un nombre de archivo inválido. ", "File name cannot be empty." : "El nombre de archivo no puede estar vacío.", "\"{name}\" is not an allowed filetype" : "\"{name}\" es un tipo de archivo no permitido", @@ -137,6 +138,7 @@ "Shares" : "Shares", "Shared with others" : "Compartido con otros", "Shared with you" : "Compartido con usted", - "Shared by link" : "Compartido por link" + "Shared by link" : "Compartido por link", + "Choose" : "Elige" },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" }
\ No newline at end of file diff --git a/apps/files/l10n/es_CL.js b/apps/files/l10n/es_CL.js index abcebe453fe..a280d06f77e 100644 --- a/apps/files/l10n/es_CL.js +++ b/apps/files/l10n/es_CL.js @@ -57,6 +57,7 @@ OC.L10N.register( "{dirs} and {files}" : "{dirs} y {files}", "_including %n hidden_::_including %n hidden_" : ["incluyendo %n oculto","incluyendo %n ocultos","incluyendo %n ocultos"], "_Uploading %n file_::_Uploading %n files_" : ["Subiendo %n archivo","Cargando %n archivos","Cargando %n archivos"], + "New" : "Nuevo", "{used} of {quota} used" : "{used} de {quota} usados", "{used} used" : "{used} usados", "\"{name}\" is an invalid file name." : "\"{name}\" es un nombre de archivo inválido. ", @@ -144,6 +145,7 @@ OC.L10N.register( "Shares" : "Elementos compartidos", "Shared with others" : "Compartido con otros", "Shared with you" : "Compartido con usted", - "Shared by link" : "Compartido por liga" + "Shared by link" : "Compartido por liga", + "Choose" : "Seleccionar" }, "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); diff --git a/apps/files/l10n/es_CL.json b/apps/files/l10n/es_CL.json index f5274523048..bc81ede34e2 100644 --- a/apps/files/l10n/es_CL.json +++ b/apps/files/l10n/es_CL.json @@ -55,6 +55,7 @@ "{dirs} and {files}" : "{dirs} y {files}", "_including %n hidden_::_including %n hidden_" : ["incluyendo %n oculto","incluyendo %n ocultos","incluyendo %n ocultos"], "_Uploading %n file_::_Uploading %n files_" : ["Subiendo %n archivo","Cargando %n archivos","Cargando %n archivos"], + "New" : "Nuevo", "{used} of {quota} used" : "{used} de {quota} usados", "{used} used" : "{used} usados", "\"{name}\" is an invalid file name." : "\"{name}\" es un nombre de archivo inválido. ", @@ -142,6 +143,7 @@ "Shares" : "Elementos compartidos", "Shared with others" : "Compartido con otros", "Shared with you" : "Compartido con usted", - "Shared by link" : "Compartido por liga" + "Shared by link" : "Compartido por liga", + "Choose" : "Seleccionar" },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" }
\ No newline at end of file diff --git a/apps/files/l10n/es_CO.js b/apps/files/l10n/es_CO.js index 7cbbff23342..14beaedd507 100644 --- a/apps/files/l10n/es_CO.js +++ b/apps/files/l10n/es_CO.js @@ -58,6 +58,7 @@ OC.L10N.register( "{dirs} and {files}" : "{dirs} y {files}", "_including %n hidden_::_including %n hidden_" : ["incluyendo %n oculto","incluyendo %n ocultos","incluyendo %n ocultos"], "_Uploading %n file_::_Uploading %n files_" : ["Subiendo %n archivo","Cargando %n archivos","Cargando %n archivos"], + "New" : "Nuevo", "{used} of {quota} used" : "{used} de {quota} usados", "{used} used" : "{used} usados", "\"{name}\" is an invalid file name." : "\"{name}\" es un nombre de archivo inválido. ", @@ -144,6 +145,7 @@ OC.L10N.register( "Shares" : "Elementos compartidos", "Shared with others" : "Compartido con otros", "Shared with you" : "Compartido con usted", - "Shared by link" : "Compartido por liga" + "Shared by link" : "Compartido por liga", + "Choose" : "Seleccionar" }, "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); diff --git a/apps/files/l10n/es_CO.json b/apps/files/l10n/es_CO.json index db38378d954..e19940c2923 100644 --- a/apps/files/l10n/es_CO.json +++ b/apps/files/l10n/es_CO.json @@ -56,6 +56,7 @@ "{dirs} and {files}" : "{dirs} y {files}", "_including %n hidden_::_including %n hidden_" : ["incluyendo %n oculto","incluyendo %n ocultos","incluyendo %n ocultos"], "_Uploading %n file_::_Uploading %n files_" : ["Subiendo %n archivo","Cargando %n archivos","Cargando %n archivos"], + "New" : "Nuevo", "{used} of {quota} used" : "{used} de {quota} usados", "{used} used" : "{used} usados", "\"{name}\" is an invalid file name." : "\"{name}\" es un nombre de archivo inválido. ", @@ -142,6 +143,7 @@ "Shares" : "Elementos compartidos", "Shared with others" : "Compartido con otros", "Shared with you" : "Compartido con usted", - "Shared by link" : "Compartido por liga" + "Shared by link" : "Compartido por liga", + "Choose" : "Seleccionar" },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" }
\ No newline at end of file diff --git a/apps/files/l10n/es_CR.js b/apps/files/l10n/es_CR.js index 670c44d2d67..bd3e9c302b4 100644 --- a/apps/files/l10n/es_CR.js +++ b/apps/files/l10n/es_CR.js @@ -57,6 +57,7 @@ OC.L10N.register( "{dirs} and {files}" : "{dirs} y {files}", "_including %n hidden_::_including %n hidden_" : ["incluyendo %n oculto","incluyendo %n ocultos","incluyendo %n ocultos"], "_Uploading %n file_::_Uploading %n files_" : ["Subiendo %n archivo","Cargando %n archivos","Cargando %n archivos"], + "New" : "Nuevo", "{used} of {quota} used" : "{used} de {quota} usados", "{used} used" : "{used} usados", "\"{name}\" is an invalid file name." : "\"{name}\" es un nombre de archivo inválido. ", @@ -143,6 +144,7 @@ OC.L10N.register( "Shares" : "Elementos compartidos", "Shared with others" : "Compartido con otros", "Shared with you" : "Compartido con usted", - "Shared by link" : "Compartido por liga" + "Shared by link" : "Compartido por liga", + "Choose" : "Seleccionar" }, "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); diff --git a/apps/files/l10n/es_CR.json b/apps/files/l10n/es_CR.json index 9cc5ade1ce6..838573a6915 100644 --- a/apps/files/l10n/es_CR.json +++ b/apps/files/l10n/es_CR.json @@ -55,6 +55,7 @@ "{dirs} and {files}" : "{dirs} y {files}", "_including %n hidden_::_including %n hidden_" : ["incluyendo %n oculto","incluyendo %n ocultos","incluyendo %n ocultos"], "_Uploading %n file_::_Uploading %n files_" : ["Subiendo %n archivo","Cargando %n archivos","Cargando %n archivos"], + "New" : "Nuevo", "{used} of {quota} used" : "{used} de {quota} usados", "{used} used" : "{used} usados", "\"{name}\" is an invalid file name." : "\"{name}\" es un nombre de archivo inválido. ", @@ -141,6 +142,7 @@ "Shares" : "Elementos compartidos", "Shared with others" : "Compartido con otros", "Shared with you" : "Compartido con usted", - "Shared by link" : "Compartido por liga" + "Shared by link" : "Compartido por liga", + "Choose" : "Seleccionar" },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" }
\ No newline at end of file diff --git a/apps/files/l10n/es_DO.js b/apps/files/l10n/es_DO.js index 670c44d2d67..bd3e9c302b4 100644 --- a/apps/files/l10n/es_DO.js +++ b/apps/files/l10n/es_DO.js @@ -57,6 +57,7 @@ OC.L10N.register( "{dirs} and {files}" : "{dirs} y {files}", "_including %n hidden_::_including %n hidden_" : ["incluyendo %n oculto","incluyendo %n ocultos","incluyendo %n ocultos"], "_Uploading %n file_::_Uploading %n files_" : ["Subiendo %n archivo","Cargando %n archivos","Cargando %n archivos"], + "New" : "Nuevo", "{used} of {quota} used" : "{used} de {quota} usados", "{used} used" : "{used} usados", "\"{name}\" is an invalid file name." : "\"{name}\" es un nombre de archivo inválido. ", @@ -143,6 +144,7 @@ OC.L10N.register( "Shares" : "Elementos compartidos", "Shared with others" : "Compartido con otros", "Shared with you" : "Compartido con usted", - "Shared by link" : "Compartido por liga" + "Shared by link" : "Compartido por liga", + "Choose" : "Seleccionar" }, "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); diff --git a/apps/files/l10n/es_DO.json b/apps/files/l10n/es_DO.json index 9cc5ade1ce6..838573a6915 100644 --- a/apps/files/l10n/es_DO.json +++ b/apps/files/l10n/es_DO.json @@ -55,6 +55,7 @@ "{dirs} and {files}" : "{dirs} y {files}", "_including %n hidden_::_including %n hidden_" : ["incluyendo %n oculto","incluyendo %n ocultos","incluyendo %n ocultos"], "_Uploading %n file_::_Uploading %n files_" : ["Subiendo %n archivo","Cargando %n archivos","Cargando %n archivos"], + "New" : "Nuevo", "{used} of {quota} used" : "{used} de {quota} usados", "{used} used" : "{used} usados", "\"{name}\" is an invalid file name." : "\"{name}\" es un nombre de archivo inválido. ", @@ -141,6 +142,7 @@ "Shares" : "Elementos compartidos", "Shared with others" : "Compartido con otros", "Shared with you" : "Compartido con usted", - "Shared by link" : "Compartido por liga" + "Shared by link" : "Compartido por liga", + "Choose" : "Seleccionar" },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" }
\ No newline at end of file diff --git a/apps/files/l10n/es_EC.js b/apps/files/l10n/es_EC.js index f8c20d4a76d..16cf475ca6e 100644 --- a/apps/files/l10n/es_EC.js +++ b/apps/files/l10n/es_EC.js @@ -78,6 +78,7 @@ OC.L10N.register( "_including %n hidden_::_including %n hidden_" : ["incluyendo %n oculto","incluyendo %n ocultos","incluyendo %n ocultos"], "You do not have permission to upload or create files here" : "No tienes permiso para cargar o crear archivos aquí.", "_Uploading %n file_::_Uploading %n files_" : ["Subiendo %n archivo","Cargando %n archivos","Cargando %n archivos"], + "New" : "Nuevo", "New file/folder menu" : "Menú de archivo/carpeta nuevo.", "Select file range" : "Selecciona un rango de archivos.", "{used}%" : "{used}%", @@ -272,6 +273,7 @@ OC.L10N.register( "Open folder {name}" : "Abrir carpeta {name}", "This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Esta lista no se muestra completamente por motivos de rendimiento. Los archivos se mostrarán a medida que navegas por la lista.", "Search for an account" : "Buscar una cuenta", + "Choose" : "Seleccionar", "No files or folders have been deleted yet" : "No se han eliminado archivos o carpetas todavía." }, "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); diff --git a/apps/files/l10n/es_EC.json b/apps/files/l10n/es_EC.json index 987b25645ab..b7b0f06fd02 100644 --- a/apps/files/l10n/es_EC.json +++ b/apps/files/l10n/es_EC.json @@ -76,6 +76,7 @@ "_including %n hidden_::_including %n hidden_" : ["incluyendo %n oculto","incluyendo %n ocultos","incluyendo %n ocultos"], "You do not have permission to upload or create files here" : "No tienes permiso para cargar o crear archivos aquí.", "_Uploading %n file_::_Uploading %n files_" : ["Subiendo %n archivo","Cargando %n archivos","Cargando %n archivos"], + "New" : "Nuevo", "New file/folder menu" : "Menú de archivo/carpeta nuevo.", "Select file range" : "Selecciona un rango de archivos.", "{used}%" : "{used}%", @@ -270,6 +271,7 @@ "Open folder {name}" : "Abrir carpeta {name}", "This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Esta lista no se muestra completamente por motivos de rendimiento. Los archivos se mostrarán a medida que navegas por la lista.", "Search for an account" : "Buscar una cuenta", + "Choose" : "Seleccionar", "No files or folders have been deleted yet" : "No se han eliminado archivos o carpetas todavía." },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" }
\ No newline at end of file diff --git a/apps/files/l10n/es_GT.js b/apps/files/l10n/es_GT.js index 670c44d2d67..bd3e9c302b4 100644 --- a/apps/files/l10n/es_GT.js +++ b/apps/files/l10n/es_GT.js @@ -57,6 +57,7 @@ OC.L10N.register( "{dirs} and {files}" : "{dirs} y {files}", "_including %n hidden_::_including %n hidden_" : ["incluyendo %n oculto","incluyendo %n ocultos","incluyendo %n ocultos"], "_Uploading %n file_::_Uploading %n files_" : ["Subiendo %n archivo","Cargando %n archivos","Cargando %n archivos"], + "New" : "Nuevo", "{used} of {quota} used" : "{used} de {quota} usados", "{used} used" : "{used} usados", "\"{name}\" is an invalid file name." : "\"{name}\" es un nombre de archivo inválido. ", @@ -143,6 +144,7 @@ OC.L10N.register( "Shares" : "Elementos compartidos", "Shared with others" : "Compartido con otros", "Shared with you" : "Compartido con usted", - "Shared by link" : "Compartido por liga" + "Shared by link" : "Compartido por liga", + "Choose" : "Seleccionar" }, "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); diff --git a/apps/files/l10n/es_GT.json b/apps/files/l10n/es_GT.json index 9cc5ade1ce6..838573a6915 100644 --- a/apps/files/l10n/es_GT.json +++ b/apps/files/l10n/es_GT.json @@ -55,6 +55,7 @@ "{dirs} and {files}" : "{dirs} y {files}", "_including %n hidden_::_including %n hidden_" : ["incluyendo %n oculto","incluyendo %n ocultos","incluyendo %n ocultos"], "_Uploading %n file_::_Uploading %n files_" : ["Subiendo %n archivo","Cargando %n archivos","Cargando %n archivos"], + "New" : "Nuevo", "{used} of {quota} used" : "{used} de {quota} usados", "{used} used" : "{used} usados", "\"{name}\" is an invalid file name." : "\"{name}\" es un nombre de archivo inválido. ", @@ -141,6 +142,7 @@ "Shares" : "Elementos compartidos", "Shared with others" : "Compartido con otros", "Shared with you" : "Compartido con usted", - "Shared by link" : "Compartido por liga" + "Shared by link" : "Compartido por liga", + "Choose" : "Seleccionar" },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" }
\ No newline at end of file diff --git a/apps/files/l10n/es_MX.js b/apps/files/l10n/es_MX.js index f78df128565..016716df9b3 100644 --- a/apps/files/l10n/es_MX.js +++ b/apps/files/l10n/es_MX.js @@ -78,6 +78,7 @@ OC.L10N.register( "_including %n hidden_::_including %n hidden_" : ["incluyendo %n oculto","incluyendo %n ocultos","incluyendo %n ocultos"], "You do not have permission to upload or create files here" : "No tiene permiso para crear o cargar archivos aquí", "_Uploading %n file_::_Uploading %n files_" : ["Subiendo %n archivo","Cargando %n archivos","Cargando %n archivos"], + "New" : "Nuevo", "New file/folder menu" : "Menú de carpeta/archivo nuevo", "Select file range" : "Seleccione rango de archivos", "{used}%" : "{used}%", @@ -230,6 +231,7 @@ OC.L10N.register( "Shared with you" : "Compartido con usted", "Shared by link" : "Compartido por liga", "Deleted shares" : "Recursos compartidos eliminados", - "Pending shares" : "Recursos compartidos pendientes" + "Pending shares" : "Recursos compartidos pendientes", + "Choose" : "Seleccionar" }, "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); diff --git a/apps/files/l10n/es_MX.json b/apps/files/l10n/es_MX.json index 76fe760ed6e..2a364c3cd00 100644 --- a/apps/files/l10n/es_MX.json +++ b/apps/files/l10n/es_MX.json @@ -76,6 +76,7 @@ "_including %n hidden_::_including %n hidden_" : ["incluyendo %n oculto","incluyendo %n ocultos","incluyendo %n ocultos"], "You do not have permission to upload or create files here" : "No tiene permiso para crear o cargar archivos aquí", "_Uploading %n file_::_Uploading %n files_" : ["Subiendo %n archivo","Cargando %n archivos","Cargando %n archivos"], + "New" : "Nuevo", "New file/folder menu" : "Menú de carpeta/archivo nuevo", "Select file range" : "Seleccione rango de archivos", "{used}%" : "{used}%", @@ -228,6 +229,7 @@ "Shared with you" : "Compartido con usted", "Shared by link" : "Compartido por liga", "Deleted shares" : "Recursos compartidos eliminados", - "Pending shares" : "Recursos compartidos pendientes" + "Pending shares" : "Recursos compartidos pendientes", + "Choose" : "Seleccionar" },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" }
\ No newline at end of file diff --git a/apps/files/l10n/es_PE.js b/apps/files/l10n/es_PE.js index b17130b06a5..236adf76054 100644 --- a/apps/files/l10n/es_PE.js +++ b/apps/files/l10n/es_PE.js @@ -76,6 +76,7 @@ OC.L10N.register( "_including %n hidden_::_including %n hidden_" : ["incluyendo %n escondido","incluyendo %n ocultos","incluyendo %n ocultos"], "You do not have permission to upload or create files here" : "No tiene permiso para crear o cargar archivos aquí", "_Uploading %n file_::_Uploading %n files_" : ["Subiendo %n archivo","Cargando %n archivos","Cargando %n archivos"], + "New" : "Nuevo", "Select file range" : "Seleccione rango de archivos", "{used}%" : "{used}%", "{used} of {quota} used" : "{used} de {quota} usado", @@ -156,6 +157,7 @@ OC.L10N.register( "Shares" : "Elementos compartidos", "Shared with others" : "Compartido con otros", "Shared with you" : "Compartido con usted", - "Shared by link" : "Compartido por liga" + "Shared by link" : "Compartido por liga", + "Choose" : "Seleccionar" }, "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); diff --git a/apps/files/l10n/es_PE.json b/apps/files/l10n/es_PE.json index cbab8fde7d6..cef23eb8b32 100644 --- a/apps/files/l10n/es_PE.json +++ b/apps/files/l10n/es_PE.json @@ -74,6 +74,7 @@ "_including %n hidden_::_including %n hidden_" : ["incluyendo %n escondido","incluyendo %n ocultos","incluyendo %n ocultos"], "You do not have permission to upload or create files here" : "No tiene permiso para crear o cargar archivos aquí", "_Uploading %n file_::_Uploading %n files_" : ["Subiendo %n archivo","Cargando %n archivos","Cargando %n archivos"], + "New" : "Nuevo", "Select file range" : "Seleccione rango de archivos", "{used}%" : "{used}%", "{used} of {quota} used" : "{used} de {quota} usado", @@ -154,6 +155,7 @@ "Shares" : "Elementos compartidos", "Shared with others" : "Compartido con otros", "Shared with you" : "Compartido con usted", - "Shared by link" : "Compartido por liga" + "Shared by link" : "Compartido por liga", + "Choose" : "Seleccionar" },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" }
\ No newline at end of file diff --git a/apps/files/l10n/es_PY.js b/apps/files/l10n/es_PY.js index a0bb0ca3a1a..65b3ff64a3c 100644 --- a/apps/files/l10n/es_PY.js +++ b/apps/files/l10n/es_PY.js @@ -67,6 +67,7 @@ OC.L10N.register( "{dirs} and {files}" : "{dirs} y {files}", "_including %n hidden_::_including %n hidden_" : ["incluyendo %n escondido","incluyendo %n ocultos","incluyendo %n ocultos"], "_Uploading %n file_::_Uploading %n files_" : ["Subiendo %n archivo","Cargando %n archivos","Cargando %n archivos"], + "New" : "Nuevo", "{used} of {quota} used" : "{used} de {quota} usado", "{used} used" : "{used} usado", "\"{name}\" is an invalid file name." : "\"{name}\" es un nombre de archivo inválido. ", @@ -147,6 +148,7 @@ OC.L10N.register( "Shares" : "Elementos compartidos", "Shared with others" : "Compartido con otros", "Shared with you" : "Compartido con usted", - "Shared by link" : "Compartido por liga" + "Shared by link" : "Compartido por liga", + "Choose" : "Seleccionar" }, "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); diff --git a/apps/files/l10n/es_PY.json b/apps/files/l10n/es_PY.json index e2287f41bc5..4262d75aeee 100644 --- a/apps/files/l10n/es_PY.json +++ b/apps/files/l10n/es_PY.json @@ -65,6 +65,7 @@ "{dirs} and {files}" : "{dirs} y {files}", "_including %n hidden_::_including %n hidden_" : ["incluyendo %n escondido","incluyendo %n ocultos","incluyendo %n ocultos"], "_Uploading %n file_::_Uploading %n files_" : ["Subiendo %n archivo","Cargando %n archivos","Cargando %n archivos"], + "New" : "Nuevo", "{used} of {quota} used" : "{used} de {quota} usado", "{used} used" : "{used} usado", "\"{name}\" is an invalid file name." : "\"{name}\" es un nombre de archivo inválido. ", @@ -145,6 +146,7 @@ "Shares" : "Elementos compartidos", "Shared with others" : "Compartido con otros", "Shared with you" : "Compartido con usted", - "Shared by link" : "Compartido por liga" + "Shared by link" : "Compartido por liga", + "Choose" : "Seleccionar" },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" }
\ No newline at end of file diff --git a/apps/files/l10n/es_SV.js b/apps/files/l10n/es_SV.js index 670c44d2d67..bd3e9c302b4 100644 --- a/apps/files/l10n/es_SV.js +++ b/apps/files/l10n/es_SV.js @@ -57,6 +57,7 @@ OC.L10N.register( "{dirs} and {files}" : "{dirs} y {files}", "_including %n hidden_::_including %n hidden_" : ["incluyendo %n oculto","incluyendo %n ocultos","incluyendo %n ocultos"], "_Uploading %n file_::_Uploading %n files_" : ["Subiendo %n archivo","Cargando %n archivos","Cargando %n archivos"], + "New" : "Nuevo", "{used} of {quota} used" : "{used} de {quota} usados", "{used} used" : "{used} usados", "\"{name}\" is an invalid file name." : "\"{name}\" es un nombre de archivo inválido. ", @@ -143,6 +144,7 @@ OC.L10N.register( "Shares" : "Elementos compartidos", "Shared with others" : "Compartido con otros", "Shared with you" : "Compartido con usted", - "Shared by link" : "Compartido por liga" + "Shared by link" : "Compartido por liga", + "Choose" : "Seleccionar" }, "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); diff --git a/apps/files/l10n/es_SV.json b/apps/files/l10n/es_SV.json index 9cc5ade1ce6..838573a6915 100644 --- a/apps/files/l10n/es_SV.json +++ b/apps/files/l10n/es_SV.json @@ -55,6 +55,7 @@ "{dirs} and {files}" : "{dirs} y {files}", "_including %n hidden_::_including %n hidden_" : ["incluyendo %n oculto","incluyendo %n ocultos","incluyendo %n ocultos"], "_Uploading %n file_::_Uploading %n files_" : ["Subiendo %n archivo","Cargando %n archivos","Cargando %n archivos"], + "New" : "Nuevo", "{used} of {quota} used" : "{used} de {quota} usados", "{used} used" : "{used} usados", "\"{name}\" is an invalid file name." : "\"{name}\" es un nombre de archivo inválido. ", @@ -141,6 +142,7 @@ "Shares" : "Elementos compartidos", "Shared with others" : "Compartido con otros", "Shared with you" : "Compartido con usted", - "Shared by link" : "Compartido por liga" + "Shared by link" : "Compartido por liga", + "Choose" : "Seleccionar" },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" }
\ No newline at end of file diff --git a/apps/files/l10n/et_EE.js b/apps/files/l10n/et_EE.js index 63d30864537..56051cc1cf3 100644 --- a/apps/files/l10n/et_EE.js +++ b/apps/files/l10n/et_EE.js @@ -77,6 +77,7 @@ OC.L10N.register( "_including %n hidden_::_including %n hidden_" : ["sealhulgas %n peidetud","sealhulgas %n peidetud"], "You do not have permission to upload or create files here" : "Sul pole luba siia faile lisada ja üles laadida", "_Uploading %n file_::_Uploading %n files_" : ["Laadin üles %n faili","Laadin üles %n faili"], + "New" : "Uus", "Select file range" : "Vali failivahemik", "{used}%" : "{used}%", "{used} of {quota} used" : "{used} / {quota} kasutusel", @@ -203,6 +204,7 @@ OC.L10N.register( "Pending shares" : "Ootel jagamised", "Open folder {name}" : "Ava kaust {name}", "Search for an account" : "Otsi kontot", + "Choose" : "Vali", "No files or folders have been deleted yet" : "Faile ega kaustu pole veel kustutatud" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/et_EE.json b/apps/files/l10n/et_EE.json index 7a57c10a3f2..7f6a6e08e7b 100644 --- a/apps/files/l10n/et_EE.json +++ b/apps/files/l10n/et_EE.json @@ -75,6 +75,7 @@ "_including %n hidden_::_including %n hidden_" : ["sealhulgas %n peidetud","sealhulgas %n peidetud"], "You do not have permission to upload or create files here" : "Sul pole luba siia faile lisada ja üles laadida", "_Uploading %n file_::_Uploading %n files_" : ["Laadin üles %n faili","Laadin üles %n faili"], + "New" : "Uus", "Select file range" : "Vali failivahemik", "{used}%" : "{used}%", "{used} of {quota} used" : "{used} / {quota} kasutusel", @@ -201,6 +202,7 @@ "Pending shares" : "Ootel jagamised", "Open folder {name}" : "Ava kaust {name}", "Search for an account" : "Otsi kontot", + "Choose" : "Vali", "No files or folders have been deleted yet" : "Faile ega kaustu pole veel kustutatud" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files/l10n/eu.js b/apps/files/l10n/eu.js index e18047aa1c1..cdb9ab2879f 100644 --- a/apps/files/l10n/eu.js +++ b/apps/files/l10n/eu.js @@ -78,6 +78,7 @@ OC.L10N.register( "_including %n hidden_::_including %n hidden_" : ["ezkutuko %n barne","ezkutuko %n barne"], "You do not have permission to upload or create files here" : "Ez duzu hemen fitxategiak kargatzeko edo sortzeko baimenik", "_Uploading %n file_::_Uploading %n files_" : ["Fitxategi %n kargatzen","%n fitxategi kargatzen"], + "New" : "Berria", "New file/folder menu" : "Fitxategi/karpeta berri menua", "Select file range" : "Hautatu fitxategi-barrutia", "{used}%" : "%{used}", @@ -277,6 +278,7 @@ OC.L10N.register( "Open folder {name}" : "Ireki {name} karpeta", "This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Zerrenda hau ez da guztiz ikusten errendimendu arrazoiengatik. Fitxategiak zerrendan zehar nabigatzen duten heinean bistaratuko dira.", "Search for an account" : "Bilatu kontu bat", + "Choose" : "Aukeratu", "No files or folders have been deleted yet" : "Oraindik ez da ezabatu fitxategirik edo karpetarik" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/eu.json b/apps/files/l10n/eu.json index b969c01694c..c5c91cfe386 100644 --- a/apps/files/l10n/eu.json +++ b/apps/files/l10n/eu.json @@ -76,6 +76,7 @@ "_including %n hidden_::_including %n hidden_" : ["ezkutuko %n barne","ezkutuko %n barne"], "You do not have permission to upload or create files here" : "Ez duzu hemen fitxategiak kargatzeko edo sortzeko baimenik", "_Uploading %n file_::_Uploading %n files_" : ["Fitxategi %n kargatzen","%n fitxategi kargatzen"], + "New" : "Berria", "New file/folder menu" : "Fitxategi/karpeta berri menua", "Select file range" : "Hautatu fitxategi-barrutia", "{used}%" : "%{used}", @@ -275,6 +276,7 @@ "Open folder {name}" : "Ireki {name} karpeta", "This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Zerrenda hau ez da guztiz ikusten errendimendu arrazoiengatik. Fitxategiak zerrendan zehar nabigatzen duten heinean bistaratuko dira.", "Search for an account" : "Bilatu kontu bat", + "Choose" : "Aukeratu", "No files or folders have been deleted yet" : "Oraindik ez da ezabatu fitxategirik edo karpetarik" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files/l10n/fa.js b/apps/files/l10n/fa.js index 1bbffdf5c50..5ab1047267e 100644 --- a/apps/files/l10n/fa.js +++ b/apps/files/l10n/fa.js @@ -79,6 +79,7 @@ OC.L10N.register( "_including %n hidden_::_including %n hidden_" : ["از جمله %nپنهان","از جمله %nپنهان"], "You do not have permission to upload or create files here" : "شما اجازه آپلود یا ایجاد فایل در اینجا را ندارید", "_Uploading %n file_::_Uploading %n files_" : ["در حال بارگذاری %n فایل","در حال بارگذاری %n فایل"], + "New" : "جدید", "New file/folder menu" : "منوی فایل/پوشه جدید", "Select file range" : "محدوده فایل را انتخاب کنید", "{used}%" : "{used}%", @@ -278,6 +279,7 @@ OC.L10N.register( "Open folder {name}" : "باز کردن پوشه {name}", "This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "این لیست به دلایل اجرایی به طور کامل ارائه نشده است. در حین حرکت در لیست، فایل ها ارائه می شوند.", "Search for an account" : "جستجو برای یک حساب کاربری", + "Choose" : "انتخاب کنید", "No files or folders have been deleted yet" : "هنوز هیچ فایل یا پوشه ای حذف نشده است" }, "nplurals=2; plural=(n > 1);"); diff --git a/apps/files/l10n/fa.json b/apps/files/l10n/fa.json index a51d43bc077..8108b6bebbc 100644 --- a/apps/files/l10n/fa.json +++ b/apps/files/l10n/fa.json @@ -77,6 +77,7 @@ "_including %n hidden_::_including %n hidden_" : ["از جمله %nپنهان","از جمله %nپنهان"], "You do not have permission to upload or create files here" : "شما اجازه آپلود یا ایجاد فایل در اینجا را ندارید", "_Uploading %n file_::_Uploading %n files_" : ["در حال بارگذاری %n فایل","در حال بارگذاری %n فایل"], + "New" : "جدید", "New file/folder menu" : "منوی فایل/پوشه جدید", "Select file range" : "محدوده فایل را انتخاب کنید", "{used}%" : "{used}%", @@ -276,6 +277,7 @@ "Open folder {name}" : "باز کردن پوشه {name}", "This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "این لیست به دلایل اجرایی به طور کامل ارائه نشده است. در حین حرکت در لیست، فایل ها ارائه می شوند.", "Search for an account" : "جستجو برای یک حساب کاربری", + "Choose" : "انتخاب کنید", "No files or folders have been deleted yet" : "هنوز هیچ فایل یا پوشه ای حذف نشده است" },"pluralForm" :"nplurals=2; plural=(n > 1);" }
\ No newline at end of file diff --git a/apps/files/l10n/fi.js b/apps/files/l10n/fi.js index f3f6215d013..402ac1c6614 100644 --- a/apps/files/l10n/fi.js +++ b/apps/files/l10n/fi.js @@ -79,6 +79,7 @@ OC.L10N.register( "_including %n hidden_::_including %n hidden_" : ["Sisältäen %n piilotetun","Sisältäen %n piilotettua"], "You do not have permission to upload or create files here" : "Käyttöoikeutesi eivät riitä tiedostojen lähettämiseen tai luomiseen tähän sijaintiin", "_Uploading %n file_::_Uploading %n files_" : ["Lähetetään %n tiedosto","Lähetetään %n tiedostoa"], + "New" : "Uusi", "New file/folder menu" : "Uusi tiedosto/kansio -valikko", "Select file range" : "Valitse tiedostojoukko", "{used}%" : "{used} %", @@ -269,6 +270,7 @@ OC.L10N.register( "Open folder {name}" : "Avaa kansio {name}", "This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Tätä luetteloa ei ole esitetty täysin suorituskykyyn liittyvistä syistä. Tiedostot esitetään sitä mukaa, kun selaat luetteloa.", "Search for an account" : "Etsi tiliä", + "Choose" : "Valitse", "No files or folders have been deleted yet" : "Tiedostoja tai kansioita ei ole vielä poistettu" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/fi.json b/apps/files/l10n/fi.json index b0ccf1287ba..1addf259b19 100644 --- a/apps/files/l10n/fi.json +++ b/apps/files/l10n/fi.json @@ -77,6 +77,7 @@ "_including %n hidden_::_including %n hidden_" : ["Sisältäen %n piilotetun","Sisältäen %n piilotettua"], "You do not have permission to upload or create files here" : "Käyttöoikeutesi eivät riitä tiedostojen lähettämiseen tai luomiseen tähän sijaintiin", "_Uploading %n file_::_Uploading %n files_" : ["Lähetetään %n tiedosto","Lähetetään %n tiedostoa"], + "New" : "Uusi", "New file/folder menu" : "Uusi tiedosto/kansio -valikko", "Select file range" : "Valitse tiedostojoukko", "{used}%" : "{used} %", @@ -267,6 +268,7 @@ "Open folder {name}" : "Avaa kansio {name}", "This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Tätä luetteloa ei ole esitetty täysin suorituskykyyn liittyvistä syistä. Tiedostot esitetään sitä mukaa, kun selaat luetteloa.", "Search for an account" : "Etsi tiliä", + "Choose" : "Valitse", "No files or folders have been deleted yet" : "Tiedostoja tai kansioita ei ole vielä poistettu" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files/l10n/fr.js b/apps/files/l10n/fr.js index a9f9437746c..de7c367dbcb 100644 --- a/apps/files/l10n/fr.js +++ b/apps/files/l10n/fr.js @@ -78,6 +78,7 @@ OC.L10N.register( "_including %n hidden_::_including %n hidden_" : ["dont %n masqué","dont %n masqués","dont %n masqués"], "You do not have permission to upload or create files here" : "Vous n'avez pas la permission de téléverser ou de créer des fichiers ici", "_Uploading %n file_::_Uploading %n files_" : ["Téléversement de %n fichier","Envoi de %n fichiers","Envoi de %n fichiers"], + "New" : "Nouveau", "New file/folder menu" : "Menu nouveau fichier/dossier", "Select file range" : "Activer la sélection d'une plage de fichiers", "{used}%" : "{used}%", @@ -273,6 +274,7 @@ OC.L10N.register( "Open folder {name}" : "Ouvrir le dossier {name}", "This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Cette liste n'est pas affichée en totalité pour des raisons de performances. Les fichiers seront affichés au fur et à mesure que vous parcourrez la liste.", "Search for an account" : "Chercher un compte", + "Choose" : "Sélectionner", "No files or folders have been deleted yet" : "Aucun fichier ou dossier n'a encore été supprimé" }, "nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); diff --git a/apps/files/l10n/fr.json b/apps/files/l10n/fr.json index dce386acb8e..e6ae6e42b7c 100644 --- a/apps/files/l10n/fr.json +++ b/apps/files/l10n/fr.json @@ -76,6 +76,7 @@ "_including %n hidden_::_including %n hidden_" : ["dont %n masqué","dont %n masqués","dont %n masqués"], "You do not have permission to upload or create files here" : "Vous n'avez pas la permission de téléverser ou de créer des fichiers ici", "_Uploading %n file_::_Uploading %n files_" : ["Téléversement de %n fichier","Envoi de %n fichiers","Envoi de %n fichiers"], + "New" : "Nouveau", "New file/folder menu" : "Menu nouveau fichier/dossier", "Select file range" : "Activer la sélection d'une plage de fichiers", "{used}%" : "{used}%", @@ -271,6 +272,7 @@ "Open folder {name}" : "Ouvrir le dossier {name}", "This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Cette liste n'est pas affichée en totalité pour des raisons de performances. Les fichiers seront affichés au fur et à mesure que vous parcourrez la liste.", "Search for an account" : "Chercher un compte", + "Choose" : "Sélectionner", "No files or folders have been deleted yet" : "Aucun fichier ou dossier n'a encore été supprimé" },"pluralForm" :"nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" }
\ No newline at end of file diff --git a/apps/files/l10n/gl.js b/apps/files/l10n/gl.js index cf30fef359d..ff21da82747 100644 --- a/apps/files/l10n/gl.js +++ b/apps/files/l10n/gl.js @@ -79,6 +79,7 @@ OC.L10N.register( "_including %n hidden_::_including %n hidden_" : ["incluíndo %n agachado","incluíndo %n agochados"], "You do not have permission to upload or create files here" : "Non ten permiso para enviar ou crear ficheiros aquí", "_Uploading %n file_::_Uploading %n files_" : ["Enviando %n ficheiro","Enviando %n ficheiros"], + "New" : "Novo", "New file/folder menu" : "Novo menú ficheiro/cartafol", "Select file range" : "Seleccionar o intervalo de ficheiros ", "{used}%" : "{used}%", @@ -278,6 +279,7 @@ OC.L10N.register( "Open folder {name}" : "Abrir o cartafol {name}", "This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Esta lista non se representa de xeito completo por mor do rendemento. Os ficheiros represéntanse mentres navega pola lista.", "Search for an account" : "Buscar por unha conta", + "Choose" : "Escoller", "No files or folders have been deleted yet" : "Aínda non se eliminou ningún ficheiro nin cartafol" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/gl.json b/apps/files/l10n/gl.json index e2143d9a58d..a80da01bdf0 100644 --- a/apps/files/l10n/gl.json +++ b/apps/files/l10n/gl.json @@ -77,6 +77,7 @@ "_including %n hidden_::_including %n hidden_" : ["incluíndo %n agachado","incluíndo %n agochados"], "You do not have permission to upload or create files here" : "Non ten permiso para enviar ou crear ficheiros aquí", "_Uploading %n file_::_Uploading %n files_" : ["Enviando %n ficheiro","Enviando %n ficheiros"], + "New" : "Novo", "New file/folder menu" : "Novo menú ficheiro/cartafol", "Select file range" : "Seleccionar o intervalo de ficheiros ", "{used}%" : "{used}%", @@ -276,6 +277,7 @@ "Open folder {name}" : "Abrir o cartafol {name}", "This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Esta lista non se representa de xeito completo por mor do rendemento. Os ficheiros represéntanse mentres navega pola lista.", "Search for an account" : "Buscar por unha conta", + "Choose" : "Escoller", "No files or folders have been deleted yet" : "Aínda non se eliminou ningún ficheiro nin cartafol" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files/l10n/he.js b/apps/files/l10n/he.js index a24763bc5c5..a326b1ec756 100644 --- a/apps/files/l10n/he.js +++ b/apps/files/l10n/he.js @@ -69,6 +69,7 @@ OC.L10N.register( "{dirs} and {files}" : "{dirs} וכן {files}", "_including %n hidden_::_including %n hidden_" : ["לרבות %n מוסתר","לרבות %n מוסתרים","לרבות %n מוסתרים","לרבות %n מוסתרים"], "_Uploading %n file_::_Uploading %n files_" : ["מעלה %n קובץ","מעלה %n קבצים","מעלה %n קבצים","מעלה %n קבצים"], + "New" : "חדש", "Select file range" : "בחירת טווח קבצים", "{used} of {quota} used" : "{used} מתוך {quota} בשימוש", "{used} used" : "{used} בשימוש", @@ -192,6 +193,7 @@ OC.L10N.register( "Shared with you" : "משותף אתך", "Shared by link" : "משותף על ידי קישור", "Deleted shares" : "שיתופים שנמחקו", - "Pending shares" : "שיתופים ממתינים" + "Pending shares" : "שיתופים ממתינים", + "Choose" : "בחר" }, "nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % 1 == 0) ? 1: (n % 10 == 0 && n % 1 == 0 && n > 10) ? 2 : 3;"); diff --git a/apps/files/l10n/he.json b/apps/files/l10n/he.json index 47b936d7c6e..f09ccbfbc27 100644 --- a/apps/files/l10n/he.json +++ b/apps/files/l10n/he.json @@ -67,6 +67,7 @@ "{dirs} and {files}" : "{dirs} וכן {files}", "_including %n hidden_::_including %n hidden_" : ["לרבות %n מוסתר","לרבות %n מוסתרים","לרבות %n מוסתרים","לרבות %n מוסתרים"], "_Uploading %n file_::_Uploading %n files_" : ["מעלה %n קובץ","מעלה %n קבצים","מעלה %n קבצים","מעלה %n קבצים"], + "New" : "חדש", "Select file range" : "בחירת טווח קבצים", "{used} of {quota} used" : "{used} מתוך {quota} בשימוש", "{used} used" : "{used} בשימוש", @@ -190,6 +191,7 @@ "Shared with you" : "משותף אתך", "Shared by link" : "משותף על ידי קישור", "Deleted shares" : "שיתופים שנמחקו", - "Pending shares" : "שיתופים ממתינים" + "Pending shares" : "שיתופים ממתינים", + "Choose" : "בחר" },"pluralForm" :"nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % 1 == 0) ? 1: (n % 10 == 0 && n % 1 == 0 && n > 10) ? 2 : 3;" }
\ No newline at end of file diff --git a/apps/files/l10n/hr.js b/apps/files/l10n/hr.js index daa05ed382c..d20df4abbeb 100644 --- a/apps/files/l10n/hr.js +++ b/apps/files/l10n/hr.js @@ -68,6 +68,7 @@ OC.L10N.register( "{dirs} and {files}" : "{dirs} i {files}", "_including %n hidden_::_including %n hidden_" : ["uključujući %n skrivenih","uključujući %n skrivenih","uključujući %n skrivenih"], "_Uploading %n file_::_Uploading %n files_" : ["Otpremanje %n datoteku","Prenosim %n datoteka","Prenosim %n datoteka"], + "New" : "Novo", "Select file range" : "Odaberi raspon datoteka", "{used} of {quota} used" : "Iskorišteno {used} od {quota}", "{used} used" : "Iskorišteno {used}", @@ -210,6 +211,7 @@ OC.L10N.register( "Shared with you" : "Podijeljeno s vama", "Shared by link" : "Podijeljeno putem poveznice", "Deleted shares" : "Izbrisana dijeljenja", - "Pending shares" : "Dijeljenja na čekanju" + "Pending shares" : "Dijeljenja na čekanju", + "Choose" : "Odaberite" }, "nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;"); diff --git a/apps/files/l10n/hr.json b/apps/files/l10n/hr.json index cadc1250436..e38a45429e7 100644 --- a/apps/files/l10n/hr.json +++ b/apps/files/l10n/hr.json @@ -66,6 +66,7 @@ "{dirs} and {files}" : "{dirs} i {files}", "_including %n hidden_::_including %n hidden_" : ["uključujući %n skrivenih","uključujući %n skrivenih","uključujući %n skrivenih"], "_Uploading %n file_::_Uploading %n files_" : ["Otpremanje %n datoteku","Prenosim %n datoteka","Prenosim %n datoteka"], + "New" : "Novo", "Select file range" : "Odaberi raspon datoteka", "{used} of {quota} used" : "Iskorišteno {used} od {quota}", "{used} used" : "Iskorišteno {used}", @@ -208,6 +209,7 @@ "Shared with you" : "Podijeljeno s vama", "Shared by link" : "Podijeljeno putem poveznice", "Deleted shares" : "Izbrisana dijeljenja", - "Pending shares" : "Dijeljenja na čekanju" + "Pending shares" : "Dijeljenja na čekanju", + "Choose" : "Odaberite" },"pluralForm" :"nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;" }
\ No newline at end of file diff --git a/apps/files/l10n/hu.js b/apps/files/l10n/hu.js index 1d12e8341d1..af32b85de85 100644 --- a/apps/files/l10n/hu.js +++ b/apps/files/l10n/hu.js @@ -78,6 +78,7 @@ OC.L10N.register( "_including %n hidden_::_including %n hidden_" : ["köztük %n rejtett","köztük %n rejtett"], "You do not have permission to upload or create files here" : "Nincs jogosultsága fájlok ide feltöltéséhez vagy létrehozásához", "_Uploading %n file_::_Uploading %n files_" : ["%n fájl feltöltése","%n fájl feltöltése"], + "New" : "Új", "New file/folder menu" : "Új fájl/mappa menü", "Select file range" : "Válasszon fájltartományt", "{used}%" : "{used}%", @@ -260,6 +261,7 @@ OC.L10N.register( "Open folder {name}" : "A(z) {name} mappa megnyitása", "This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Ez a lista teljesítménybeli okokból nincs teljes egészében megjelenítve. A fájlok a listában navigálás során jelennek meg, ", "Search for an account" : "Fiók keresése", + "Choose" : "Válasszon", "No files or folders have been deleted yet" : "Még nem lettek fájlok vagy mappák törölve" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/hu.json b/apps/files/l10n/hu.json index 7ff28ed1e26..6644eb00d60 100644 --- a/apps/files/l10n/hu.json +++ b/apps/files/l10n/hu.json @@ -76,6 +76,7 @@ "_including %n hidden_::_including %n hidden_" : ["köztük %n rejtett","köztük %n rejtett"], "You do not have permission to upload or create files here" : "Nincs jogosultsága fájlok ide feltöltéséhez vagy létrehozásához", "_Uploading %n file_::_Uploading %n files_" : ["%n fájl feltöltése","%n fájl feltöltése"], + "New" : "Új", "New file/folder menu" : "Új fájl/mappa menü", "Select file range" : "Válasszon fájltartományt", "{used}%" : "{used}%", @@ -258,6 +259,7 @@ "Open folder {name}" : "A(z) {name} mappa megnyitása", "This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Ez a lista teljesítménybeli okokból nincs teljes egészében megjelenítve. A fájlok a listában navigálás során jelennek meg, ", "Search for an account" : "Fiók keresése", + "Choose" : "Válasszon", "No files or folders have been deleted yet" : "Még nem lettek fájlok vagy mappák törölve" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files/l10n/id.js b/apps/files/l10n/id.js index 62ff7f89b12..c20a30cebd8 100644 --- a/apps/files/l10n/id.js +++ b/apps/files/l10n/id.js @@ -78,6 +78,7 @@ OC.L10N.register( "_including %n hidden_::_including %n hidden_" : ["Termasuk %n tersembunyi"], "You do not have permission to upload or create files here" : "Anda tidak memiliki izin untuk mengunggah atau membuat berkas di sini", "_Uploading %n file_::_Uploading %n files_" : ["Mengunggah %n berkas"], + "New" : "Baru", "New file/folder menu" : "Menu berkas/folder baru", "Select file range" : "Pilih rentang berkas", "{used}%" : "{used}%", @@ -234,6 +235,7 @@ OC.L10N.register( "Shared with you" : "Shared with you", "Shared by link" : "Dibagikan dengan tautan", "Deleted shares" : "Berbagi terhapus", - "Pending shares" : "Berbagi tertunda" + "Pending shares" : "Berbagi tertunda", + "Choose" : "Pilih" }, "nplurals=1; plural=0;"); diff --git a/apps/files/l10n/id.json b/apps/files/l10n/id.json index a2768575c70..d74d99dec3c 100644 --- a/apps/files/l10n/id.json +++ b/apps/files/l10n/id.json @@ -76,6 +76,7 @@ "_including %n hidden_::_including %n hidden_" : ["Termasuk %n tersembunyi"], "You do not have permission to upload or create files here" : "Anda tidak memiliki izin untuk mengunggah atau membuat berkas di sini", "_Uploading %n file_::_Uploading %n files_" : ["Mengunggah %n berkas"], + "New" : "Baru", "New file/folder menu" : "Menu berkas/folder baru", "Select file range" : "Pilih rentang berkas", "{used}%" : "{used}%", @@ -232,6 +233,7 @@ "Shared with you" : "Shared with you", "Shared by link" : "Dibagikan dengan tautan", "Deleted shares" : "Berbagi terhapus", - "Pending shares" : "Berbagi tertunda" + "Pending shares" : "Berbagi tertunda", + "Choose" : "Pilih" },"pluralForm" :"nplurals=1; plural=0;" }
\ No newline at end of file diff --git a/apps/files/l10n/is.js b/apps/files/l10n/is.js index ab80087dcbd..5c66847aee5 100644 --- a/apps/files/l10n/is.js +++ b/apps/files/l10n/is.js @@ -69,6 +69,7 @@ OC.L10N.register( "{dirs} and {files}" : "{dirs} og {files}", "_including %n hidden_::_including %n hidden_" : ["þar á meðal %n falin","þar á meðal %n faldar"], "_Uploading %n file_::_Uploading %n files_" : ["Sendi inn %n skrá","Sendi inn %n skrár"], + "New" : "Nýtt", "Select file range" : "Veldu skráasvið", "{used} of {quota} used" : "{used} af {quota} notað", "{used} used" : "{used} notað", @@ -185,6 +186,7 @@ OC.L10N.register( "Shared with you" : "Deilt með þér", "Shared by link" : "Deilt með tengli", "Deleted shares" : "Eyddar sameignir", - "Pending shares" : "Sameignir í bið" + "Pending shares" : "Sameignir í bið", + "Choose" : "Velja" }, "nplurals=2; plural=(n % 10 != 1 || n % 100 == 11);"); diff --git a/apps/files/l10n/is.json b/apps/files/l10n/is.json index 1df6548fb15..87dbcbfda1f 100644 --- a/apps/files/l10n/is.json +++ b/apps/files/l10n/is.json @@ -67,6 +67,7 @@ "{dirs} and {files}" : "{dirs} og {files}", "_including %n hidden_::_including %n hidden_" : ["þar á meðal %n falin","þar á meðal %n faldar"], "_Uploading %n file_::_Uploading %n files_" : ["Sendi inn %n skrá","Sendi inn %n skrár"], + "New" : "Nýtt", "Select file range" : "Veldu skráasvið", "{used} of {quota} used" : "{used} af {quota} notað", "{used} used" : "{used} notað", @@ -183,6 +184,7 @@ "Shared with you" : "Deilt með þér", "Shared by link" : "Deilt með tengli", "Deleted shares" : "Eyddar sameignir", - "Pending shares" : "Sameignir í bið" + "Pending shares" : "Sameignir í bið", + "Choose" : "Velja" },"pluralForm" :"nplurals=2; plural=(n % 10 != 1 || n % 100 == 11);" }
\ No newline at end of file diff --git a/apps/files/l10n/it.js b/apps/files/l10n/it.js index bbb69e292e4..33a73581cc0 100644 --- a/apps/files/l10n/it.js +++ b/apps/files/l10n/it.js @@ -78,6 +78,7 @@ OC.L10N.register( "_including %n hidden_::_including %n hidden_" : ["incluso %n nascosto","inclusi %n nascosti","inclusi %n nascosti"], "You do not have permission to upload or create files here" : "Non disponi dell'autorizzazione per caricare o creare file qui", "_Uploading %n file_::_Uploading %n files_" : ["Caricamento di %n file in corso","Caricamento di %n file in corso","Caricamento di %n file in corso"], + "New" : "Nuovo", "New file/folder menu" : "Nuovo menu file/cartella", "Select file range" : "Seleziona intervallo di file", "{used}%" : "{used}%", @@ -277,6 +278,7 @@ OC.L10N.register( "Open folder {name}" : "Apri la cartella {name}", "This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Questa lista non è stata mostrata completamente per ragioni di performances. I file verranno mostrati durante la navigazione della lista.", "Search for an account" : "Cerca un account", + "Choose" : "Scegli", "No files or folders have been deleted yet" : "Nessun file o cartella è stato ancora eliminato" }, "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); diff --git a/apps/files/l10n/it.json b/apps/files/l10n/it.json index d11a7d2d114..4fe5762eb62 100644 --- a/apps/files/l10n/it.json +++ b/apps/files/l10n/it.json @@ -76,6 +76,7 @@ "_including %n hidden_::_including %n hidden_" : ["incluso %n nascosto","inclusi %n nascosti","inclusi %n nascosti"], "You do not have permission to upload or create files here" : "Non disponi dell'autorizzazione per caricare o creare file qui", "_Uploading %n file_::_Uploading %n files_" : ["Caricamento di %n file in corso","Caricamento di %n file in corso","Caricamento di %n file in corso"], + "New" : "Nuovo", "New file/folder menu" : "Nuovo menu file/cartella", "Select file range" : "Seleziona intervallo di file", "{used}%" : "{used}%", @@ -275,6 +276,7 @@ "Open folder {name}" : "Apri la cartella {name}", "This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Questa lista non è stata mostrata completamente per ragioni di performances. I file verranno mostrati durante la navigazione della lista.", "Search for an account" : "Cerca un account", + "Choose" : "Scegli", "No files or folders have been deleted yet" : "Nessun file o cartella è stato ancora eliminato" },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" }
\ No newline at end of file diff --git a/apps/files/l10n/ja.js b/apps/files/l10n/ja.js index fccc9d7f442..8f17e99f58b 100644 --- a/apps/files/l10n/ja.js +++ b/apps/files/l10n/ja.js @@ -32,6 +32,7 @@ OC.L10N.register( "Move" : "移動", "Copy" : "コピー", "Choose target folder" : "ターゲットフォルダーを選択", + "Set reminder" : "リマインダーを設定", "Edit locally" : "ローカルで編集", "Open" : "開く", "Delete file" : "ファイルを削除", @@ -78,6 +79,7 @@ OC.L10N.register( "_including %n hidden_::_including %n hidden_" : ["%n 個の隠しファイルが含まれています"], "You do not have permission to upload or create files here" : "ここにファイルをアップロードまたは作成する権限がありません", "_Uploading %n file_::_Uploading %n files_" : ["%n 個のファイルをアップロード中"], + "New" : "新規作成", "New file/folder menu" : "新規ファイル/フォルダメニュー", "Select file range" : "ファイルを範囲選択", "{used}%" : "{used}%", @@ -236,6 +238,7 @@ OC.L10N.register( "Shared with you" : "他ユーザーがあなたと共有中", "Shared by link" : "URLリンクで共有中", "Deleted shares" : "削除された共有", - "Pending shares" : "保留中の共有" + "Pending shares" : "保留中の共有", + "Choose" : "選択" }, "nplurals=1; plural=0;"); diff --git a/apps/files/l10n/ja.json b/apps/files/l10n/ja.json index f4bf1f24372..2859887e016 100644 --- a/apps/files/l10n/ja.json +++ b/apps/files/l10n/ja.json @@ -30,6 +30,7 @@ "Move" : "移動", "Copy" : "コピー", "Choose target folder" : "ターゲットフォルダーを選択", + "Set reminder" : "リマインダーを設定", "Edit locally" : "ローカルで編集", "Open" : "開く", "Delete file" : "ファイルを削除", @@ -76,6 +77,7 @@ "_including %n hidden_::_including %n hidden_" : ["%n 個の隠しファイルが含まれています"], "You do not have permission to upload or create files here" : "ここにファイルをアップロードまたは作成する権限がありません", "_Uploading %n file_::_Uploading %n files_" : ["%n 個のファイルをアップロード中"], + "New" : "新規作成", "New file/folder menu" : "新規ファイル/フォルダメニュー", "Select file range" : "ファイルを範囲選択", "{used}%" : "{used}%", @@ -234,6 +236,7 @@ "Shared with you" : "他ユーザーがあなたと共有中", "Shared by link" : "URLリンクで共有中", "Deleted shares" : "削除された共有", - "Pending shares" : "保留中の共有" + "Pending shares" : "保留中の共有", + "Choose" : "選択" },"pluralForm" :"nplurals=1; plural=0;" }
\ No newline at end of file diff --git a/apps/files/l10n/ka_GE.js b/apps/files/l10n/ka_GE.js index 62627310b34..3d3ed32d943 100644 --- a/apps/files/l10n/ka_GE.js +++ b/apps/files/l10n/ka_GE.js @@ -57,6 +57,7 @@ OC.L10N.register( "{dirs} and {files}" : "{dirs} და {files}", "_including %n hidden_::_including %n hidden_" : ["%n დამალულის ჩათვლით","%n დამალულის ჩათვლით"], "_Uploading %n file_::_Uploading %n files_" : ["ვტვირთავთ %n ფაილს","ვტვირთავთ %n ფაილს"], + "New" : "ახალი", "{used} of {quota} used" : "გამოყენებულია {used} სულ {quota}-დან", "{used} used" : "გამოყენებულია {used}", "\"{name}\" is an invalid file name." : "\"{name}\" არასწორი ფაილის სახელია.", @@ -142,6 +143,7 @@ OC.L10N.register( "Shares" : "გაზიარებები", "Shared with others" : "გაზიარდა სხვებთან", "Shared with you" : "გაზიარდა თქვენთან", - "Shared by link" : "გაზიარდა ბმულით" + "Shared by link" : "გაზიარდა ბმულით", + "Choose" : "აირჩიეთ" }, "nplurals=2; plural=(n!=1);"); diff --git a/apps/files/l10n/ka_GE.json b/apps/files/l10n/ka_GE.json index e561cb78bb3..0bb6669eeea 100644 --- a/apps/files/l10n/ka_GE.json +++ b/apps/files/l10n/ka_GE.json @@ -55,6 +55,7 @@ "{dirs} and {files}" : "{dirs} და {files}", "_including %n hidden_::_including %n hidden_" : ["%n დამალულის ჩათვლით","%n დამალულის ჩათვლით"], "_Uploading %n file_::_Uploading %n files_" : ["ვტვირთავთ %n ფაილს","ვტვირთავთ %n ფაილს"], + "New" : "ახალი", "{used} of {quota} used" : "გამოყენებულია {used} სულ {quota}-დან", "{used} used" : "გამოყენებულია {used}", "\"{name}\" is an invalid file name." : "\"{name}\" არასწორი ფაილის სახელია.", @@ -140,6 +141,7 @@ "Shares" : "გაზიარებები", "Shared with others" : "გაზიარდა სხვებთან", "Shared with you" : "გაზიარდა თქვენთან", - "Shared by link" : "გაზიარდა ბმულით" + "Shared by link" : "გაზიარდა ბმულით", + "Choose" : "აირჩიეთ" },"pluralForm" :"nplurals=2; plural=(n!=1);" }
\ No newline at end of file diff --git a/apps/files/l10n/ko.js b/apps/files/l10n/ko.js index 538e8e5ba17..d79474ef289 100644 --- a/apps/files/l10n/ko.js +++ b/apps/files/l10n/ko.js @@ -78,6 +78,7 @@ OC.L10N.register( "_including %n hidden_::_including %n hidden_" : ["%n개의 숨겨진 파일 포함"], "You do not have permission to upload or create files here" : "여기에 파일을 업로드하거나 만들 권한이 없습니다.", "_Uploading %n file_::_Uploading %n files_" : ["파일 %n개 업로드 중"], + "New" : "새로 만들기", "New file/folder menu" : "새 파일/폴더 메뉴", "Select file range" : "파일 범위 선택", "{used} of {quota} used" : "{quota} 중 {used} 사용함", @@ -256,6 +257,7 @@ OC.L10N.register( "Open folder {name}" : "{name} 폴더 열기", "This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "이 목록은 성능 상의 이유로 완전히 표시되지 않았습니다. 목록을 탐색하면 파일이 표시됩니다.", "Search for an account" : "계정 검색", + "Choose" : "선택", "No files or folders have been deleted yet" : "아직 삭제된 파일이나 폴더가 없습니다." }, "nplurals=1; plural=0;"); diff --git a/apps/files/l10n/ko.json b/apps/files/l10n/ko.json index a5248db2479..afc41727593 100644 --- a/apps/files/l10n/ko.json +++ b/apps/files/l10n/ko.json @@ -76,6 +76,7 @@ "_including %n hidden_::_including %n hidden_" : ["%n개의 숨겨진 파일 포함"], "You do not have permission to upload or create files here" : "여기에 파일을 업로드하거나 만들 권한이 없습니다.", "_Uploading %n file_::_Uploading %n files_" : ["파일 %n개 업로드 중"], + "New" : "새로 만들기", "New file/folder menu" : "새 파일/폴더 메뉴", "Select file range" : "파일 범위 선택", "{used} of {quota} used" : "{quota} 중 {used} 사용함", @@ -254,6 +255,7 @@ "Open folder {name}" : "{name} 폴더 열기", "This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "이 목록은 성능 상의 이유로 완전히 표시되지 않았습니다. 목록을 탐색하면 파일이 표시됩니다.", "Search for an account" : "계정 검색", + "Choose" : "선택", "No files or folders have been deleted yet" : "아직 삭제된 파일이나 폴더가 없습니다." },"pluralForm" :"nplurals=1; plural=0;" }
\ No newline at end of file diff --git a/apps/files/l10n/lt_LT.js b/apps/files/l10n/lt_LT.js index 518344ba844..08cabc2de37 100644 --- a/apps/files/l10n/lt_LT.js +++ b/apps/files/l10n/lt_LT.js @@ -77,6 +77,7 @@ OC.L10N.register( "_including %n hidden_::_including %n hidden_" : ["įskaitant %n paslėptą","įskaitant %n paslėptus","įskaitant %n paslėptų","įskaitant %n paslėptą"], "You do not have permission to upload or create files here" : "Neturite teisės įkalti ar kurti failus šioje vietoje", "_Uploading %n file_::_Uploading %n files_" : ["Įkeliamas %n failas","Įkeliami %n failai","Įkeliama %n failų","Įkeliamas %n failas"], + "New" : "Nauja", "Select file range" : "Žymėti failų rėžį", "{used}%" : "{used}%", "{used} of {quota} used" : "panaudota {used} iš {quota}", @@ -217,6 +218,7 @@ OC.L10N.register( "Shared with you" : "Bendrinama su jumis", "Shared by link" : "Bendrinama pagal nuorodą", "Deleted shares" : "Ištrinti viešiniai", - "Pending shares" : "Laukiantys viešiniai" + "Pending shares" : "Laukiantys viešiniai", + "Choose" : "Pasirinkite" }, "nplurals=4; plural=(n % 10 == 1 && (n % 100 > 19 || n % 100 < 11) ? 0 : (n % 10 >= 2 && n % 10 <=9) && (n % 100 > 19 || n % 100 < 11) ? 1 : n % 1 != 0 ? 2: 3);"); diff --git a/apps/files/l10n/lt_LT.json b/apps/files/l10n/lt_LT.json index c6b2070c133..06c5cbd23c5 100644 --- a/apps/files/l10n/lt_LT.json +++ b/apps/files/l10n/lt_LT.json @@ -75,6 +75,7 @@ "_including %n hidden_::_including %n hidden_" : ["įskaitant %n paslėptą","įskaitant %n paslėptus","įskaitant %n paslėptų","įskaitant %n paslėptą"], "You do not have permission to upload or create files here" : "Neturite teisės įkalti ar kurti failus šioje vietoje", "_Uploading %n file_::_Uploading %n files_" : ["Įkeliamas %n failas","Įkeliami %n failai","Įkeliama %n failų","Įkeliamas %n failas"], + "New" : "Nauja", "Select file range" : "Žymėti failų rėžį", "{used}%" : "{used}%", "{used} of {quota} used" : "panaudota {used} iš {quota}", @@ -215,6 +216,7 @@ "Shared with you" : "Bendrinama su jumis", "Shared by link" : "Bendrinama pagal nuorodą", "Deleted shares" : "Ištrinti viešiniai", - "Pending shares" : "Laukiantys viešiniai" + "Pending shares" : "Laukiantys viešiniai", + "Choose" : "Pasirinkite" },"pluralForm" :"nplurals=4; plural=(n % 10 == 1 && (n % 100 > 19 || n % 100 < 11) ? 0 : (n % 10 >= 2 && n % 10 <=9) && (n % 100 > 19 || n % 100 < 11) ? 1 : n % 1 != 0 ? 2: 3);" }
\ No newline at end of file diff --git a/apps/files/l10n/lv.js b/apps/files/l10n/lv.js index bb625ca0f03..20b37cb1ed6 100644 --- a/apps/files/l10n/lv.js +++ b/apps/files/l10n/lv.js @@ -58,6 +58,7 @@ OC.L10N.register( "{dirs} and {files}" : "{dirs} un {files}", "_including %n hidden_::_including %n hidden_" : ["ieskaitot %n paslēptos","ieskaitot %n paslēptos","ieskaitot %n paslēptos"], "_Uploading %n file_::_Uploading %n files_" : ["%n","Augšupielāde %n failu","Augšupielādē %n datnes"], + "New" : "Jauns", "\"{name}\" is an invalid file name." : "\"{name}\" ir nepareizs datnes nosaukums.", "File name cannot be empty." : "Datnes nosaukums nevar būt tukšs.", "\"/\" is not allowed inside a file name." : "\"/\" nav atļauts faila nosaukumā.", @@ -141,6 +142,7 @@ OC.L10N.register( "Shared with you" : "Koplietots ar tevi", "Shared by link" : "Koplietots ar saiti", "Deleted shares" : "Dzēstās koplietotnes", - "Pending shares" : "Gaidošie koplietojumi" + "Pending shares" : "Gaidošie koplietojumi", + "Choose" : "Izvēlies" }, "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);"); diff --git a/apps/files/l10n/lv.json b/apps/files/l10n/lv.json index d62e5eda24c..9b130402a0e 100644 --- a/apps/files/l10n/lv.json +++ b/apps/files/l10n/lv.json @@ -56,6 +56,7 @@ "{dirs} and {files}" : "{dirs} un {files}", "_including %n hidden_::_including %n hidden_" : ["ieskaitot %n paslēptos","ieskaitot %n paslēptos","ieskaitot %n paslēptos"], "_Uploading %n file_::_Uploading %n files_" : ["%n","Augšupielāde %n failu","Augšupielādē %n datnes"], + "New" : "Jauns", "\"{name}\" is an invalid file name." : "\"{name}\" ir nepareizs datnes nosaukums.", "File name cannot be empty." : "Datnes nosaukums nevar būt tukšs.", "\"/\" is not allowed inside a file name." : "\"/\" nav atļauts faila nosaukumā.", @@ -139,6 +140,7 @@ "Shared with you" : "Koplietots ar tevi", "Shared by link" : "Koplietots ar saiti", "Deleted shares" : "Dzēstās koplietotnes", - "Pending shares" : "Gaidošie koplietojumi" + "Pending shares" : "Gaidošie koplietojumi", + "Choose" : "Izvēlies" },"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);" }
\ No newline at end of file diff --git a/apps/files/l10n/mk.js b/apps/files/l10n/mk.js index b3f5d067592..e071c84f6b7 100644 --- a/apps/files/l10n/mk.js +++ b/apps/files/l10n/mk.js @@ -78,6 +78,7 @@ OC.L10N.register( "_including %n hidden_::_including %n hidden_" : ["вклучувајќи %n скриена","вклучувајќи %n скриени"], "You do not have permission to upload or create files here" : "Немате дозвола да прикачувате или да креирате датотеки овде", "_Uploading %n file_::_Uploading %n files_" : ["Прикачување %n датотека","Прикачување на %n датотеки"], + "New" : "Ново", "New file/folder menu" : "Мени Нова датотека/папка", "Select file range" : "Избери опсег на датотеки", "{used}%" : "{used}%", @@ -235,6 +236,7 @@ OC.L10N.register( "Shared with you" : "Споделено со тебе", "Shared by link" : "Споделено со линк", "Deleted shares" : "Избришани споделувања", - "Pending shares" : "Споделувања на чекање" + "Pending shares" : "Споделувања на чекање", + "Choose" : "Избери" }, "nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;"); diff --git a/apps/files/l10n/mk.json b/apps/files/l10n/mk.json index c9ad5b8ceb0..2390bddb892 100644 --- a/apps/files/l10n/mk.json +++ b/apps/files/l10n/mk.json @@ -76,6 +76,7 @@ "_including %n hidden_::_including %n hidden_" : ["вклучувајќи %n скриена","вклучувајќи %n скриени"], "You do not have permission to upload or create files here" : "Немате дозвола да прикачувате или да креирате датотеки овде", "_Uploading %n file_::_Uploading %n files_" : ["Прикачување %n датотека","Прикачување на %n датотеки"], + "New" : "Ново", "New file/folder menu" : "Мени Нова датотека/папка", "Select file range" : "Избери опсег на датотеки", "{used}%" : "{used}%", @@ -233,6 +234,7 @@ "Shared with you" : "Споделено со тебе", "Shared by link" : "Споделено со линк", "Deleted shares" : "Избришани споделувања", - "Pending shares" : "Споделувања на чекање" + "Pending shares" : "Споделувања на чекање", + "Choose" : "Избери" },"pluralForm" :"nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;" }
\ No newline at end of file diff --git a/apps/files/l10n/nb.js b/apps/files/l10n/nb.js index 93b08e97d66..a12a3868d61 100644 --- a/apps/files/l10n/nb.js +++ b/apps/files/l10n/nb.js @@ -78,6 +78,7 @@ OC.L10N.register( "_including %n hidden_::_including %n hidden_" : ["Inkludert %n skjult","Inkludert %n skjulte"], "You do not have permission to upload or create files here" : "Du har ikke tilgang til å laste opp eller opprette filer her", "_Uploading %n file_::_Uploading %n files_" : ["Laster opp %n fil","Laster opp %n filer"], + "New" : "Ny", "New file/folder menu" : "Ny fil/mappe-meny", "Select file range" : "Velg filutvalg", "{used}%" : "{used}%", @@ -232,6 +233,7 @@ OC.L10N.register( "Shared with you" : "Delt med deg", "Shared by link" : "Delt med lenke", "Deleted shares" : "Slettede delinger", - "Pending shares" : "Ventende delinger" + "Pending shares" : "Ventende delinger", + "Choose" : "Velg" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/nb.json b/apps/files/l10n/nb.json index e3957bc2de7..28ef7a6e167 100644 --- a/apps/files/l10n/nb.json +++ b/apps/files/l10n/nb.json @@ -76,6 +76,7 @@ "_including %n hidden_::_including %n hidden_" : ["Inkludert %n skjult","Inkludert %n skjulte"], "You do not have permission to upload or create files here" : "Du har ikke tilgang til å laste opp eller opprette filer her", "_Uploading %n file_::_Uploading %n files_" : ["Laster opp %n fil","Laster opp %n filer"], + "New" : "Ny", "New file/folder menu" : "Ny fil/mappe-meny", "Select file range" : "Velg filutvalg", "{used}%" : "{used}%", @@ -230,6 +231,7 @@ "Shared with you" : "Delt med deg", "Shared by link" : "Delt med lenke", "Deleted shares" : "Slettede delinger", - "Pending shares" : "Ventende delinger" + "Pending shares" : "Ventende delinger", + "Choose" : "Velg" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files/l10n/nl.js b/apps/files/l10n/nl.js index a44143a7a9f..151013daf4c 100644 --- a/apps/files/l10n/nl.js +++ b/apps/files/l10n/nl.js @@ -77,6 +77,7 @@ OC.L10N.register( "_including %n hidden_::_including %n hidden_" : ["inclusief %n verborgen","inclusief %n verborgen"], "You do not have permission to upload or create files here" : "Je hebt geen toestemming om hier te uploaden of bestanden aan te maken", "_Uploading %n file_::_Uploading %n files_" : ["%n bestand aan het uploaden","%n bestanden aan het uploaden"], + "New" : "Nieuw", "Select file range" : "Kies een reeks bestanden", "{used}%" : "{used}%", "{used} of {quota} used" : "{used} van {quota} gebruikt", @@ -226,6 +227,7 @@ OC.L10N.register( "Shared with you" : "Gedeeld met jou", "Shared by link" : "Gedeeld via link", "Deleted shares" : "Verwijderde shares", - "Pending shares" : "Deellinks in behandeling" + "Pending shares" : "Deellinks in behandeling", + "Choose" : "Kies" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/nl.json b/apps/files/l10n/nl.json index f84b5edc166..9f061522773 100644 --- a/apps/files/l10n/nl.json +++ b/apps/files/l10n/nl.json @@ -75,6 +75,7 @@ "_including %n hidden_::_including %n hidden_" : ["inclusief %n verborgen","inclusief %n verborgen"], "You do not have permission to upload or create files here" : "Je hebt geen toestemming om hier te uploaden of bestanden aan te maken", "_Uploading %n file_::_Uploading %n files_" : ["%n bestand aan het uploaden","%n bestanden aan het uploaden"], + "New" : "Nieuw", "Select file range" : "Kies een reeks bestanden", "{used}%" : "{used}%", "{used} of {quota} used" : "{used} van {quota} gebruikt", @@ -224,6 +225,7 @@ "Shared with you" : "Gedeeld met jou", "Shared by link" : "Gedeeld via link", "Deleted shares" : "Verwijderde shares", - "Pending shares" : "Deellinks in behandeling" + "Pending shares" : "Deellinks in behandeling", + "Choose" : "Kies" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files/l10n/pl.js b/apps/files/l10n/pl.js index e4760fd1b0e..c4434eff462 100644 --- a/apps/files/l10n/pl.js +++ b/apps/files/l10n/pl.js @@ -78,6 +78,7 @@ OC.L10N.register( "_including %n hidden_::_including %n hidden_" : ["w tym %n ukryty","w tym %n ukryte","w tym %n ukrytych","w tym %n ukrytych"], "You do not have permission to upload or create files here" : "Nie masz uprawnień do wysyłania lub tworzenia plików w tym miejscu", "_Uploading %n file_::_Uploading %n files_" : ["Wysyłanie %n pliku","Wysyłanie %n plików","Wysyłanie %n plików","Wysyłanie %n plików"], + "New" : "Nowy", "New file/folder menu" : "Nowe menu plików/katalogów", "Select file range" : "Wybierz zakres plików", "{used}%" : "{used}%", @@ -259,6 +260,7 @@ OC.L10N.register( "Open folder {name}" : "Otwórz katalog {name}", "This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Ta lista nie jest w pełni renderowana ze względu na wydajność. Pliki będą renderowane podczas poruszania się po liście.", "Search for an account" : "Wyszukaj konto", + "Choose" : "Wybierz", "No files or folders have been deleted yet" : "Żadne pliki ani katalogi nie zostały jeszcze usunięte" }, "nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);"); diff --git a/apps/files/l10n/pl.json b/apps/files/l10n/pl.json index fa33c27f8b1..098049043f7 100644 --- a/apps/files/l10n/pl.json +++ b/apps/files/l10n/pl.json @@ -76,6 +76,7 @@ "_including %n hidden_::_including %n hidden_" : ["w tym %n ukryty","w tym %n ukryte","w tym %n ukrytych","w tym %n ukrytych"], "You do not have permission to upload or create files here" : "Nie masz uprawnień do wysyłania lub tworzenia plików w tym miejscu", "_Uploading %n file_::_Uploading %n files_" : ["Wysyłanie %n pliku","Wysyłanie %n plików","Wysyłanie %n plików","Wysyłanie %n plików"], + "New" : "Nowy", "New file/folder menu" : "Nowe menu plików/katalogów", "Select file range" : "Wybierz zakres plików", "{used}%" : "{used}%", @@ -257,6 +258,7 @@ "Open folder {name}" : "Otwórz katalog {name}", "This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Ta lista nie jest w pełni renderowana ze względu na wydajność. Pliki będą renderowane podczas poruszania się po liście.", "Search for an account" : "Wyszukaj konto", + "Choose" : "Wybierz", "No files or folders have been deleted yet" : "Żadne pliki ani katalogi nie zostały jeszcze usunięte" },"pluralForm" :"nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);" }
\ No newline at end of file diff --git a/apps/files/l10n/pt_BR.js b/apps/files/l10n/pt_BR.js index 14845c573df..3a396b3b43f 100644 --- a/apps/files/l10n/pt_BR.js +++ b/apps/files/l10n/pt_BR.js @@ -79,6 +79,7 @@ OC.L10N.register( "_including %n hidden_::_including %n hidden_" : ["incluindo %n oculto","incluindo %n ocultos","incluindo %n ocultos"], "You do not have permission to upload or create files here" : "Você não tem permissão para upload ou criar arquivos aqui", "_Uploading %n file_::_Uploading %n files_" : ["Enviando %n arquivo","Enviando %n arquivos","Enviando %n arquivos"], + "New" : "Novo", "New file/folder menu" : "Novo menu de arquivo/pasta", "Select file range" : "Selecionar o intervalo de arquivos", "{used}%" : "{used}%", @@ -278,6 +279,7 @@ OC.L10N.register( "Open folder {name}" : "Abra a pasta {nome}", "This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Esta lista não é totalmente renderizada por motivos de desempenho. Os arquivos serão renderizados conforme você navega pela lista.", "Search for an account" : "Pesquisar uma conta", + "Choose" : "Escolher", "No files or folders have been deleted yet" : "Nenhum arquivo ou pasta foi excluído ainda" }, "nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); diff --git a/apps/files/l10n/pt_BR.json b/apps/files/l10n/pt_BR.json index e43aba3447e..59a7bb0c943 100644 --- a/apps/files/l10n/pt_BR.json +++ b/apps/files/l10n/pt_BR.json @@ -77,6 +77,7 @@ "_including %n hidden_::_including %n hidden_" : ["incluindo %n oculto","incluindo %n ocultos","incluindo %n ocultos"], "You do not have permission to upload or create files here" : "Você não tem permissão para upload ou criar arquivos aqui", "_Uploading %n file_::_Uploading %n files_" : ["Enviando %n arquivo","Enviando %n arquivos","Enviando %n arquivos"], + "New" : "Novo", "New file/folder menu" : "Novo menu de arquivo/pasta", "Select file range" : "Selecionar o intervalo de arquivos", "{used}%" : "{used}%", @@ -276,6 +277,7 @@ "Open folder {name}" : "Abra a pasta {nome}", "This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Esta lista não é totalmente renderizada por motivos de desempenho. Os arquivos serão renderizados conforme você navega pela lista.", "Search for an account" : "Pesquisar uma conta", + "Choose" : "Escolher", "No files or folders have been deleted yet" : "Nenhum arquivo ou pasta foi excluído ainda" },"pluralForm" :"nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" }
\ No newline at end of file diff --git a/apps/files/l10n/pt_PT.js b/apps/files/l10n/pt_PT.js index 37bd652f8de..95008e6503c 100644 --- a/apps/files/l10n/pt_PT.js +++ b/apps/files/l10n/pt_PT.js @@ -78,6 +78,7 @@ OC.L10N.register( "_including %n hidden_::_including %n hidden_" : ["incluindo %n ocultos","incluindo %n ocultos","incluindo %n ocultos"], "You do not have permission to upload or create files here" : "Não tem permissão para carregar ou criar ficheiros aqui", "_Uploading %n file_::_Uploading %n files_" : ["A enviar %n ficheiro","A enviar %n ficheiros","A enviar %n ficheiros"], + "New" : "Novo", "New file/folder menu" : "Novo menu ficheiro/pasta", "Select file range" : "Selecionar o intervalo", "{used}%" : "{used}%", @@ -171,6 +172,7 @@ OC.L10N.register( "Shares" : "Partilhas", "Shared with others" : "Partilhado com terceiros", "Shared with you" : "Partilhado consigo ", - "Shared by link" : "Partilhado por hiperligação" + "Shared by link" : "Partilhado por hiperligação", + "Choose" : "Escolher" }, "nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); diff --git a/apps/files/l10n/pt_PT.json b/apps/files/l10n/pt_PT.json index 755d4521d6d..59249e6057c 100644 --- a/apps/files/l10n/pt_PT.json +++ b/apps/files/l10n/pt_PT.json @@ -76,6 +76,7 @@ "_including %n hidden_::_including %n hidden_" : ["incluindo %n ocultos","incluindo %n ocultos","incluindo %n ocultos"], "You do not have permission to upload or create files here" : "Não tem permissão para carregar ou criar ficheiros aqui", "_Uploading %n file_::_Uploading %n files_" : ["A enviar %n ficheiro","A enviar %n ficheiros","A enviar %n ficheiros"], + "New" : "Novo", "New file/folder menu" : "Novo menu ficheiro/pasta", "Select file range" : "Selecionar o intervalo", "{used}%" : "{used}%", @@ -169,6 +170,7 @@ "Shares" : "Partilhas", "Shared with others" : "Partilhado com terceiros", "Shared with you" : "Partilhado consigo ", - "Shared by link" : "Partilhado por hiperligação" + "Shared by link" : "Partilhado por hiperligação", + "Choose" : "Escolher" },"pluralForm" :"nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" }
\ No newline at end of file diff --git a/apps/files/l10n/ro.js b/apps/files/l10n/ro.js index 2724a6a5c45..9f004f36b78 100644 --- a/apps/files/l10n/ro.js +++ b/apps/files/l10n/ro.js @@ -76,6 +76,7 @@ OC.L10N.register( "_including %n hidden_::_including %n hidden_" : ["incluzând %n ascuns","incluzând %nascunse","incluzând %nascuns"], "You do not have permission to upload or create files here" : "Nu ai permisiunea de a încărca fișiere aici", "_Uploading %n file_::_Uploading %n files_" : ["Se încarcă %n fișier.","Se încarcă %n fișiere.","Se încarcă %n fișiere."], + "New" : "Nou", "Select file range" : "Selectează un interval", "{used} of {quota} used" : "{used} din {quota} folosiți", "{used} used" : "{used} folosiți", @@ -217,6 +218,7 @@ OC.L10N.register( "Shared with you" : "Partajat cu tine", "Shared by link" : "Partajat prin link", "Deleted shares" : "Partajări șterse", - "Pending shares" : "Partajări in asteptare" + "Pending shares" : "Partajări in asteptare", + "Choose" : "Alege" }, "nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));"); diff --git a/apps/files/l10n/ro.json b/apps/files/l10n/ro.json index d72bc5dec2b..a393fe5c030 100644 --- a/apps/files/l10n/ro.json +++ b/apps/files/l10n/ro.json @@ -74,6 +74,7 @@ "_including %n hidden_::_including %n hidden_" : ["incluzând %n ascuns","incluzând %nascunse","incluzând %nascuns"], "You do not have permission to upload or create files here" : "Nu ai permisiunea de a încărca fișiere aici", "_Uploading %n file_::_Uploading %n files_" : ["Se încarcă %n fișier.","Se încarcă %n fișiere.","Se încarcă %n fișiere."], + "New" : "Nou", "Select file range" : "Selectează un interval", "{used} of {quota} used" : "{used} din {quota} folosiți", "{used} used" : "{used} folosiți", @@ -215,6 +216,7 @@ "Shared with you" : "Partajat cu tine", "Shared by link" : "Partajat prin link", "Deleted shares" : "Partajări șterse", - "Pending shares" : "Partajări in asteptare" + "Pending shares" : "Partajări in asteptare", + "Choose" : "Alege" },"pluralForm" :"nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));" }
\ No newline at end of file diff --git a/apps/files/l10n/ru.js b/apps/files/l10n/ru.js index 85f651bd88c..2c1bad5d358 100644 --- a/apps/files/l10n/ru.js +++ b/apps/files/l10n/ru.js @@ -78,6 +78,7 @@ OC.L10N.register( "_including %n hidden_::_including %n hidden_" : ["включая %n скрытый","включая %n скрытых","включая %n скрытых","включая %n скрытых"], "You do not have permission to upload or create files here" : "У вас нет разрешения на загрузку или создание файлов здесь", "_Uploading %n file_::_Uploading %n files_" : ["Передача %n файла","Передача %n файлов","Передача %n файлов","Передача %n файлов"], + "New" : "Новый", "New file/folder menu" : "Меню создания файла или папки", "Select file range" : "Выбор диапазона файлов", "{used}%" : "{used}%", @@ -272,6 +273,7 @@ OC.L10N.register( "Open folder {name}" : "Открыть папку {name}", "This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Этот список отображается не полностью из соображений производительности. Файлы будут отображаться по мере перемещения по списку.", "Search for an account" : "Поиск по учетной записи", + "Choose" : "Выберите", "No files or folders have been deleted yet" : "Файлы или папки еще не удалены" }, "nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);"); diff --git a/apps/files/l10n/ru.json b/apps/files/l10n/ru.json index 11bc64d5256..afb9c43e700 100644 --- a/apps/files/l10n/ru.json +++ b/apps/files/l10n/ru.json @@ -76,6 +76,7 @@ "_including %n hidden_::_including %n hidden_" : ["включая %n скрытый","включая %n скрытых","включая %n скрытых","включая %n скрытых"], "You do not have permission to upload or create files here" : "У вас нет разрешения на загрузку или создание файлов здесь", "_Uploading %n file_::_Uploading %n files_" : ["Передача %n файла","Передача %n файлов","Передача %n файлов","Передача %n файлов"], + "New" : "Новый", "New file/folder menu" : "Меню создания файла или папки", "Select file range" : "Выбор диапазона файлов", "{used}%" : "{used}%", @@ -270,6 +271,7 @@ "Open folder {name}" : "Открыть папку {name}", "This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Этот список отображается не полностью из соображений производительности. Файлы будут отображаться по мере перемещения по списку.", "Search for an account" : "Поиск по учетной записи", + "Choose" : "Выберите", "No files or folders have been deleted yet" : "Файлы или папки еще не удалены" },"pluralForm" :"nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);" }
\ No newline at end of file diff --git a/apps/files/l10n/sc.js b/apps/files/l10n/sc.js index 631160ac15b..4ffc7b1006d 100644 --- a/apps/files/l10n/sc.js +++ b/apps/files/l10n/sc.js @@ -70,6 +70,7 @@ OC.L10N.register( "{dirs} and {files}" : "{dirs} e {files}", "_including %n hidden_::_including %n hidden_" : ["inclùdidu %n cuadu","inclùdidos %n cuados"], "_Uploading %n file_::_Uploading %n files_" : ["Carrighende %n archìviu","Carrighende %n archìvios"], + "New" : "Nou", "Select file range" : "Seletziona classe de archìviu", "{used} of {quota} used" : "{used} de {quota} impreadu", "{used} used" : "{used} impreadu", @@ -211,6 +212,7 @@ OC.L10N.register( "Shared with you" : "Cumpartzidu cun tegus", "Shared by link" : "Cumpartzidu cun ligòngiu", "Deleted shares" : "Cumpartziduras cantzelladas", - "Pending shares" : "Cumpartziduras in suspesu" + "Pending shares" : "Cumpartziduras in suspesu", + "Choose" : "Sèbera" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/sc.json b/apps/files/l10n/sc.json index ffdbba01328..411ed975558 100644 --- a/apps/files/l10n/sc.json +++ b/apps/files/l10n/sc.json @@ -68,6 +68,7 @@ "{dirs} and {files}" : "{dirs} e {files}", "_including %n hidden_::_including %n hidden_" : ["inclùdidu %n cuadu","inclùdidos %n cuados"], "_Uploading %n file_::_Uploading %n files_" : ["Carrighende %n archìviu","Carrighende %n archìvios"], + "New" : "Nou", "Select file range" : "Seletziona classe de archìviu", "{used} of {quota} used" : "{used} de {quota} impreadu", "{used} used" : "{used} impreadu", @@ -209,6 +210,7 @@ "Shared with you" : "Cumpartzidu cun tegus", "Shared by link" : "Cumpartzidu cun ligòngiu", "Deleted shares" : "Cumpartziduras cantzelladas", - "Pending shares" : "Cumpartziduras in suspesu" + "Pending shares" : "Cumpartziduras in suspesu", + "Choose" : "Sèbera" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files/l10n/sk.js b/apps/files/l10n/sk.js index e75a21482ac..e63d8d7ddc7 100644 --- a/apps/files/l10n/sk.js +++ b/apps/files/l10n/sk.js @@ -78,6 +78,7 @@ OC.L10N.register( "_including %n hidden_::_including %n hidden_" : ["vrátane %n skytého","vrátane %n skrytých","vrátane %n skrytých","vrátane %n skrytých"], "You do not have permission to upload or create files here" : "Nemáte oprávnenie sem nahrávať alebo vytvárať súbory", "_Uploading %n file_::_Uploading %n files_" : ["Nahrávam %n súbor","Nahrávam %n súbory","Nahrávam %n súborov","Nahrávam %n súborov"], + "New" : "Nový", "New file/folder menu" : "Ponuka nového súboru/priečinka", "Select file range" : "Vybrať rozsah súborov", "{used}%" : "{used}%", @@ -227,6 +228,7 @@ OC.L10N.register( "Shared with you" : "Vám sprístupnené", "Shared by link" : "Sprístupnené prostredníctvom odkazu", "Deleted shares" : "Vymazané zdieľania", - "Pending shares" : "Čakajúce prístupy" + "Pending shares" : "Čakajúce prístupy", + "Choose" : "Vybrať" }, "nplurals=4; plural=(n % 1 == 0 && n == 1 ? 0 : n % 1 == 0 && n >= 2 && n <= 4 ? 1 : n % 1 != 0 ? 2: 3);"); diff --git a/apps/files/l10n/sk.json b/apps/files/l10n/sk.json index 86f9864dd72..094a6cc8cb2 100644 --- a/apps/files/l10n/sk.json +++ b/apps/files/l10n/sk.json @@ -76,6 +76,7 @@ "_including %n hidden_::_including %n hidden_" : ["vrátane %n skytého","vrátane %n skrytých","vrátane %n skrytých","vrátane %n skrytých"], "You do not have permission to upload or create files here" : "Nemáte oprávnenie sem nahrávať alebo vytvárať súbory", "_Uploading %n file_::_Uploading %n files_" : ["Nahrávam %n súbor","Nahrávam %n súbory","Nahrávam %n súborov","Nahrávam %n súborov"], + "New" : "Nový", "New file/folder menu" : "Ponuka nového súboru/priečinka", "Select file range" : "Vybrať rozsah súborov", "{used}%" : "{used}%", @@ -225,6 +226,7 @@ "Shared with you" : "Vám sprístupnené", "Shared by link" : "Sprístupnené prostredníctvom odkazu", "Deleted shares" : "Vymazané zdieľania", - "Pending shares" : "Čakajúce prístupy" + "Pending shares" : "Čakajúce prístupy", + "Choose" : "Vybrať" },"pluralForm" :"nplurals=4; plural=(n % 1 == 0 && n == 1 ? 0 : n % 1 == 0 && n >= 2 && n <= 4 ? 1 : n % 1 != 0 ? 2: 3);" }
\ No newline at end of file diff --git a/apps/files/l10n/sl.js b/apps/files/l10n/sl.js index 12eceac7f70..d21d089fd73 100644 --- a/apps/files/l10n/sl.js +++ b/apps/files/l10n/sl.js @@ -78,6 +78,7 @@ OC.L10N.register( "_including %n hidden_::_including %n hidden_" : ["vključujoč %n skrito","vključujoč %n skriti","vključujoč %n skrite","vključujoč %n skritih"], "You do not have permission to upload or create files here" : "Ni ustreznih dovoljenja za pošiljanje ali ustvarjanje novih datotek", "_Uploading %n file_::_Uploading %n files_" : ["Posodabljanje %n datoteke","Posodabljanje %n datotek","Posodabljanje %n datotek","Poteka posodabljanje %n datotek"], + "New" : "Novo", "New file/folder menu" : "Nov meni datoteke/mape", "Select file range" : "Izbor obsega datotek", "{used}%" : "{used} %", @@ -260,6 +261,7 @@ OC.L10N.register( "Open folder {name}" : "Odpri mapo {name}", "This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Seznam datotek ni v celoti izpisan zaradi zagotavljanja hitrosti in odzivnosti sistema. Predmeti se bodo dopolnjevali ob brskanju.", "Search for an account" : "Poišči račun", + "Choose" : "Izbor", "No files or folders have been deleted yet" : "Ni še izbrisanih datotek in map" }, "nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);"); diff --git a/apps/files/l10n/sl.json b/apps/files/l10n/sl.json index b9d80dc05d7..fb7a15b081c 100644 --- a/apps/files/l10n/sl.json +++ b/apps/files/l10n/sl.json @@ -76,6 +76,7 @@ "_including %n hidden_::_including %n hidden_" : ["vključujoč %n skrito","vključujoč %n skriti","vključujoč %n skrite","vključujoč %n skritih"], "You do not have permission to upload or create files here" : "Ni ustreznih dovoljenja za pošiljanje ali ustvarjanje novih datotek", "_Uploading %n file_::_Uploading %n files_" : ["Posodabljanje %n datoteke","Posodabljanje %n datotek","Posodabljanje %n datotek","Poteka posodabljanje %n datotek"], + "New" : "Novo", "New file/folder menu" : "Nov meni datoteke/mape", "Select file range" : "Izbor obsega datotek", "{used}%" : "{used} %", @@ -258,6 +259,7 @@ "Open folder {name}" : "Odpri mapo {name}", "This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Seznam datotek ni v celoti izpisan zaradi zagotavljanja hitrosti in odzivnosti sistema. Predmeti se bodo dopolnjevali ob brskanju.", "Search for an account" : "Poišči račun", + "Choose" : "Izbor", "No files or folders have been deleted yet" : "Ni še izbrisanih datotek in map" },"pluralForm" :"nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);" }
\ No newline at end of file diff --git a/apps/files/l10n/sr.js b/apps/files/l10n/sr.js index 91d2881d702..599852eac9d 100644 --- a/apps/files/l10n/sr.js +++ b/apps/files/l10n/sr.js @@ -32,6 +32,7 @@ OC.L10N.register( "Move" : "Помери", "Copy" : "Копирај", "Choose target folder" : "Одаберите одредишну фасциклу", + "Set reminder" : "Постави подсетник", "Edit locally" : "Уреди локално", "Open" : "Отвори", "Delete file" : "Обриши фајл", @@ -78,6 +79,7 @@ OC.L10N.register( "_including %n hidden_::_including %n hidden_" : ["укључујући и %n скривени","укључујући и %n скривена","укључујући и %n скривених"], "You do not have permission to upload or create files here" : "Немате дозволу да овде отпреминте или креирате фајлове", "_Uploading %n file_::_Uploading %n files_" : ["Отпремам %n фајл","Отпремам %n фајла","Отпремам %n фајлова"], + "New" : "Нов", "New file/folder menu" : "Мени за нови фајл/фолдер", "Select file range" : "Одаберите опсег фајлова", "{used}%" : "{used}%", @@ -194,6 +196,7 @@ OC.L10N.register( "descending" : "опадајуће", "Sort list by {column} ({direction})" : "Поређај листу по {column} ({direction})", "List of files and folders." : "Листа фајлова и фолдера.", + "This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Ова листа није у потпуности приказана из разлога перформанси. Фајлови ће се приказивати како се крећете кроз листу.", "Storage informations" : "Информације о складишту`", "{usedQuotaByte} used" : "{usedQuotaByte} искоришћено", "{relative}% used" : "{relative}% искоришћено", @@ -239,6 +242,7 @@ OC.L10N.register( "Unable to create new file from template" : "Из шаблона није могао да се креира нови фајл", "Delete permanently" : "Обриши заувек", "Open folder {displayName}" : "Отвори фолдер {displayName}", + "Open in Files" : "Отвори у Фајловима", "Open details" : "Отвори детаље", "Set up templates folder" : "Постављање фолдера са шаблонима", "Templates" : "Шаблони", @@ -247,6 +251,9 @@ OC.L10N.register( "List of favorites files and folders." : "Листа омиљених фајлова и директоријума.", "No favorites yet" : "Још нема омиљених", "Files and folders you mark as favorite will show up here" : "Фајлови и фасцикле које обележите као омиљене појавиће се овде", + "List of recently modified files and folders." : "Листа фајлова и директоријума који су недавно измењени.", + "No recently modified files" : "Нема недавно промењених фајлова", + "Files and folders you recently modified will show up here." : "Овде ће се појавити фајлови и фолдери које сте недавно изменили.", "Toggle %1$s sublist" : "Укљ./искљ. %1$s подлисте", "Toggle grid view" : "Укључи/искључи приказ мреже", "No entries found in this folder" : "Нема ничега у овој фасцикли", @@ -272,6 +279,7 @@ OC.L10N.register( "Open folder {name}" : "Отвори фолдер {name}", "This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Ова листа није у потпуности приказана из разлога перформанси. Фајлови ће се приказивати како се крећете кроз листу.", "Search for an account" : "Претражите налог", + "Choose" : "Изаберите", "No files or folders have been deleted yet" : "Још увек није обрисан ниједан фајл или фолдер" }, "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"); diff --git a/apps/files/l10n/sr.json b/apps/files/l10n/sr.json index c784e9a86cd..70fe46616b5 100644 --- a/apps/files/l10n/sr.json +++ b/apps/files/l10n/sr.json @@ -30,6 +30,7 @@ "Move" : "Помери", "Copy" : "Копирај", "Choose target folder" : "Одаберите одредишну фасциклу", + "Set reminder" : "Постави подсетник", "Edit locally" : "Уреди локално", "Open" : "Отвори", "Delete file" : "Обриши фајл", @@ -76,6 +77,7 @@ "_including %n hidden_::_including %n hidden_" : ["укључујући и %n скривени","укључујући и %n скривена","укључујући и %n скривених"], "You do not have permission to upload or create files here" : "Немате дозволу да овде отпреминте или креирате фајлове", "_Uploading %n file_::_Uploading %n files_" : ["Отпремам %n фајл","Отпремам %n фајла","Отпремам %n фајлова"], + "New" : "Нов", "New file/folder menu" : "Мени за нови фајл/фолдер", "Select file range" : "Одаберите опсег фајлова", "{used}%" : "{used}%", @@ -192,6 +194,7 @@ "descending" : "опадајуће", "Sort list by {column} ({direction})" : "Поређај листу по {column} ({direction})", "List of files and folders." : "Листа фајлова и фолдера.", + "This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Ова листа није у потпуности приказана из разлога перформанси. Фајлови ће се приказивати како се крећете кроз листу.", "Storage informations" : "Информације о складишту`", "{usedQuotaByte} used" : "{usedQuotaByte} искоришћено", "{relative}% used" : "{relative}% искоришћено", @@ -237,6 +240,7 @@ "Unable to create new file from template" : "Из шаблона није могао да се креира нови фајл", "Delete permanently" : "Обриши заувек", "Open folder {displayName}" : "Отвори фолдер {displayName}", + "Open in Files" : "Отвори у Фајловима", "Open details" : "Отвори детаље", "Set up templates folder" : "Постављање фолдера са шаблонима", "Templates" : "Шаблони", @@ -245,6 +249,9 @@ "List of favorites files and folders." : "Листа омиљених фајлова и директоријума.", "No favorites yet" : "Још нема омиљених", "Files and folders you mark as favorite will show up here" : "Фајлови и фасцикле које обележите као омиљене појавиће се овде", + "List of recently modified files and folders." : "Листа фајлова и директоријума који су недавно измењени.", + "No recently modified files" : "Нема недавно промењених фајлова", + "Files and folders you recently modified will show up here." : "Овде ће се појавити фајлови и фолдери које сте недавно изменили.", "Toggle %1$s sublist" : "Укљ./искљ. %1$s подлисте", "Toggle grid view" : "Укључи/искључи приказ мреже", "No entries found in this folder" : "Нема ничега у овој фасцикли", @@ -270,6 +277,7 @@ "Open folder {name}" : "Отвори фолдер {name}", "This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Ова листа није у потпуности приказана из разлога перформанси. Фајлови ће се приказивати како се крећете кроз листу.", "Search for an account" : "Претражите налог", + "Choose" : "Изаберите", "No files or folders have been deleted yet" : "Још увек није обрисан ниједан фајл или фолдер" },"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);" }
\ No newline at end of file diff --git a/apps/files/l10n/sv.js b/apps/files/l10n/sv.js index a54d0ca5bbe..ce7fffe3f16 100644 --- a/apps/files/l10n/sv.js +++ b/apps/files/l10n/sv.js @@ -79,6 +79,7 @@ OC.L10N.register( "_including %n hidden_::_including %n hidden_" : ["inkluderar %n dold","inkluderar %n dolda"], "You do not have permission to upload or create files here" : "Du har inte behörighet att ladda upp eller skapa filer här", "_Uploading %n file_::_Uploading %n files_" : ["Laddar upp %n fil","Laddar upp %n filer"], + "New" : "Ny", "New file/folder menu" : "Ny fil/mapp -meny", "Select file range" : "Välj filintervall", "{used}%" : "{used}%", @@ -278,6 +279,7 @@ OC.L10N.register( "Open folder {name}" : "Öppna mappen {name}", "This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Denna lista är inte helt återgiven av prestandaskäl. Filerna kommer att renderas när du navigerar genom listan.", "Search for an account" : "Sök efter ett konto", + "Choose" : "Välj", "No files or folders have been deleted yet" : "Inga filer eller mappar har tagits bort än" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/sv.json b/apps/files/l10n/sv.json index 9b8bffca034..6bbcafa255d 100644 --- a/apps/files/l10n/sv.json +++ b/apps/files/l10n/sv.json @@ -77,6 +77,7 @@ "_including %n hidden_::_including %n hidden_" : ["inkluderar %n dold","inkluderar %n dolda"], "You do not have permission to upload or create files here" : "Du har inte behörighet att ladda upp eller skapa filer här", "_Uploading %n file_::_Uploading %n files_" : ["Laddar upp %n fil","Laddar upp %n filer"], + "New" : "Ny", "New file/folder menu" : "Ny fil/mapp -meny", "Select file range" : "Välj filintervall", "{used}%" : "{used}%", @@ -276,6 +277,7 @@ "Open folder {name}" : "Öppna mappen {name}", "This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Denna lista är inte helt återgiven av prestandaskäl. Filerna kommer att renderas när du navigerar genom listan.", "Search for an account" : "Sök efter ett konto", + "Choose" : "Välj", "No files or folders have been deleted yet" : "Inga filer eller mappar har tagits bort än" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files/l10n/th.js b/apps/files/l10n/th.js index 455e0e51a79..30cb727c42d 100644 --- a/apps/files/l10n/th.js +++ b/apps/files/l10n/th.js @@ -78,6 +78,7 @@ OC.L10N.register( "_including %n hidden_::_including %n hidden_" : ["รวมถึง %n ไฟล์ที่ซ่อนอยู่"], "You do not have permission to upload or create files here" : "คุณไม่ได้รับอนุญาตให้อัปโหลดหรือสร้างไฟล์ที่นี่", "_Uploading %n file_::_Uploading %n files_" : ["กำลังอัปโหลด %n ไฟล์"], + "New" : "ใหม่", "New file/folder menu" : "เมนูไฟล์/โฟลเดอร์ใหม่", "Select file range" : "เลือกช่วงไฟล์", "{used}%" : "{used}%", @@ -229,6 +230,7 @@ OC.L10N.register( "Shared with you" : "แชร์กับคุณ", "Shared by link" : "แชร์โดยลิงก์", "Deleted shares" : "การแชร์ที่ถูกลบ", - "Pending shares" : "การแชร์ที่กำลังดำเนินการ" + "Pending shares" : "การแชร์ที่กำลังดำเนินการ", + "Choose" : "เลือก" }, "nplurals=1; plural=0;"); diff --git a/apps/files/l10n/th.json b/apps/files/l10n/th.json index 19a6682d362..408ce827cd4 100644 --- a/apps/files/l10n/th.json +++ b/apps/files/l10n/th.json @@ -76,6 +76,7 @@ "_including %n hidden_::_including %n hidden_" : ["รวมถึง %n ไฟล์ที่ซ่อนอยู่"], "You do not have permission to upload or create files here" : "คุณไม่ได้รับอนุญาตให้อัปโหลดหรือสร้างไฟล์ที่นี่", "_Uploading %n file_::_Uploading %n files_" : ["กำลังอัปโหลด %n ไฟล์"], + "New" : "ใหม่", "New file/folder menu" : "เมนูไฟล์/โฟลเดอร์ใหม่", "Select file range" : "เลือกช่วงไฟล์", "{used}%" : "{used}%", @@ -227,6 +228,7 @@ "Shared with you" : "แชร์กับคุณ", "Shared by link" : "แชร์โดยลิงก์", "Deleted shares" : "การแชร์ที่ถูกลบ", - "Pending shares" : "การแชร์ที่กำลังดำเนินการ" + "Pending shares" : "การแชร์ที่กำลังดำเนินการ", + "Choose" : "เลือก" },"pluralForm" :"nplurals=1; plural=0;" }
\ No newline at end of file diff --git a/apps/files/l10n/tr.js b/apps/files/l10n/tr.js index 1da8162fb37..4435cebf317 100644 --- a/apps/files/l10n/tr.js +++ b/apps/files/l10n/tr.js @@ -79,6 +79,7 @@ OC.L10N.register( "_including %n hidden_::_including %n hidden_" : ["%n gizli ile birlikte","%n gizli ile birlikte"], "You do not have permission to upload or create files here" : "Buraya dosya yükleme ya da ekleme izniniz yok", "_Uploading %n file_::_Uploading %n files_" : ["%n dosya yükleniyor","%n dosya yükleniyor"], + "New" : "Yeni", "New file/folder menu" : "Yeni dosya/klasör menüsü", "Select file range" : "Dosya aralığını seçin", "{used}%" : "%{used}", @@ -278,6 +279,7 @@ OC.L10N.register( "Open folder {name}" : "{name} klasörünü aç", "This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Başarımı olumsuz etkilememek için listenin tümü görüntülenmiyor. Listede ilerledikçe dosyalar görüntülenecek.", "Search for an account" : "Hesap ara", + "Choose" : "Seçin", "No files or folders have been deleted yet" : "Henüz silinmiş bir dosya ya da klasör yok" }, "nplurals=2; plural=(n > 1);"); diff --git a/apps/files/l10n/tr.json b/apps/files/l10n/tr.json index f6400f0dba0..b03f0268ceb 100644 --- a/apps/files/l10n/tr.json +++ b/apps/files/l10n/tr.json @@ -77,6 +77,7 @@ "_including %n hidden_::_including %n hidden_" : ["%n gizli ile birlikte","%n gizli ile birlikte"], "You do not have permission to upload or create files here" : "Buraya dosya yükleme ya da ekleme izniniz yok", "_Uploading %n file_::_Uploading %n files_" : ["%n dosya yükleniyor","%n dosya yükleniyor"], + "New" : "Yeni", "New file/folder menu" : "Yeni dosya/klasör menüsü", "Select file range" : "Dosya aralığını seçin", "{used}%" : "%{used}", @@ -276,6 +277,7 @@ "Open folder {name}" : "{name} klasörünü aç", "This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Başarımı olumsuz etkilememek için listenin tümü görüntülenmiyor. Listede ilerledikçe dosyalar görüntülenecek.", "Search for an account" : "Hesap ara", + "Choose" : "Seçin", "No files or folders have been deleted yet" : "Henüz silinmiş bir dosya ya da klasör yok" },"pluralForm" :"nplurals=2; plural=(n > 1);" }
\ No newline at end of file diff --git a/apps/files/l10n/uk.js b/apps/files/l10n/uk.js index 7aa34096f23..f5a6c77e082 100644 --- a/apps/files/l10n/uk.js +++ b/apps/files/l10n/uk.js @@ -79,6 +79,7 @@ OC.L10N.register( "_including %n hidden_::_including %n hidden_" : ["включаючи %n прихований","включаючи %n прихованих","включаючи %n прихованих","включно %n прихованих"], "You do not have permission to upload or create files here" : "У вас відсутні повноваження для завантаження або створення файлів тут", "_Uploading %n file_::_Uploading %n files_" : ["Вивантаження %n файлу","Вивантаження %n файлів","Вивантаження %n файлів","Завантаження %n файлів"], + "New" : "Створити", "New file/folder menu" : "Меню з новим файлом/каталогом", "Select file range" : "Вибрати кілька файлів", "{used}%" : "{used}%", @@ -278,6 +279,7 @@ OC.L10N.register( "Open folder {name}" : "Відкрити каталог {name}", "This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Через обмеження, пов'язані з потужністю, список не показується повністю. Файли показуватимуться, щойно ви рухатиметеся списком.", "Search for an account" : "Пошук облікового запису", + "Choose" : "Вибрати", "No files or folders have been deleted yet" : "Поки жодного каталогу чи файлу не було вилучено" }, "nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != 11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || (n % 100 >=11 && n % 100 <=14 )) ? 2: 3);"); diff --git a/apps/files/l10n/uk.json b/apps/files/l10n/uk.json index b83592698c4..de5c524411c 100644 --- a/apps/files/l10n/uk.json +++ b/apps/files/l10n/uk.json @@ -77,6 +77,7 @@ "_including %n hidden_::_including %n hidden_" : ["включаючи %n прихований","включаючи %n прихованих","включаючи %n прихованих","включно %n прихованих"], "You do not have permission to upload or create files here" : "У вас відсутні повноваження для завантаження або створення файлів тут", "_Uploading %n file_::_Uploading %n files_" : ["Вивантаження %n файлу","Вивантаження %n файлів","Вивантаження %n файлів","Завантаження %n файлів"], + "New" : "Створити", "New file/folder menu" : "Меню з новим файлом/каталогом", "Select file range" : "Вибрати кілька файлів", "{used}%" : "{used}%", @@ -276,6 +277,7 @@ "Open folder {name}" : "Відкрити каталог {name}", "This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Через обмеження, пов'язані з потужністю, список не показується повністю. Файли показуватимуться, щойно ви рухатиметеся списком.", "Search for an account" : "Пошук облікового запису", + "Choose" : "Вибрати", "No files or folders have been deleted yet" : "Поки жодного каталогу чи файлу не було вилучено" },"pluralForm" :"nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != 11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || (n % 100 >=11 && n % 100 <=14 )) ? 2: 3);" }
\ No newline at end of file diff --git a/apps/files/l10n/vi.js b/apps/files/l10n/vi.js index c018a91950a..4dd815a46c3 100644 --- a/apps/files/l10n/vi.js +++ b/apps/files/l10n/vi.js @@ -78,6 +78,7 @@ OC.L10N.register( "_including %n hidden_::_including %n hidden_" : ["Bao gồm %n ẩn"], "You do not have permission to upload or create files here" : "Bạn không đủ quyền để Tải lên hoặc Tạo tập tin ở đây", "_Uploading %n file_::_Uploading %n files_" : ["Đang tải lên %n tập tin"], + "New" : "Tạo mới", "New file/folder menu" : "Menu tệp tin/thư mục mới", "Select file range" : "Chọn phạm vi tệp", "{used} of {quota} used" : "{used} trong { quota } được sử dụng", @@ -234,6 +235,7 @@ OC.L10N.register( "Shared with you" : "Đã chia sẻ với bạn", "Shared by link" : "Được chia sẻ bởi liên kết", "Deleted shares" : "Chia sẻ đã xóa", - "Pending shares" : "Chia sẻ đang chờ xử lý" + "Pending shares" : "Chia sẻ đang chờ xử lý", + "Choose" : "Chọn" }, "nplurals=1; plural=0;"); diff --git a/apps/files/l10n/vi.json b/apps/files/l10n/vi.json index bd2ebbc9a15..866500c9d9c 100644 --- a/apps/files/l10n/vi.json +++ b/apps/files/l10n/vi.json @@ -76,6 +76,7 @@ "_including %n hidden_::_including %n hidden_" : ["Bao gồm %n ẩn"], "You do not have permission to upload or create files here" : "Bạn không đủ quyền để Tải lên hoặc Tạo tập tin ở đây", "_Uploading %n file_::_Uploading %n files_" : ["Đang tải lên %n tập tin"], + "New" : "Tạo mới", "New file/folder menu" : "Menu tệp tin/thư mục mới", "Select file range" : "Chọn phạm vi tệp", "{used} of {quota} used" : "{used} trong { quota } được sử dụng", @@ -232,6 +233,7 @@ "Shared with you" : "Đã chia sẻ với bạn", "Shared by link" : "Được chia sẻ bởi liên kết", "Deleted shares" : "Chia sẻ đã xóa", - "Pending shares" : "Chia sẻ đang chờ xử lý" + "Pending shares" : "Chia sẻ đang chờ xử lý", + "Choose" : "Chọn" },"pluralForm" :"nplurals=1; plural=0;" }
\ No newline at end of file diff --git a/apps/files/l10n/zh_CN.js b/apps/files/l10n/zh_CN.js index 98bd1a4fbd6..05e1ce04cd1 100644 --- a/apps/files/l10n/zh_CN.js +++ b/apps/files/l10n/zh_CN.js @@ -78,6 +78,7 @@ OC.L10N.register( "_including %n hidden_::_including %n hidden_" : ["包括 %n 个隐藏文件"], "You do not have permission to upload or create files here" : "您没有在此上传或创建文件的权限", "_Uploading %n file_::_Uploading %n files_" : ["正在上传 %n 个文件"], + "New" : "新建", "New file/folder menu" : "新建文件/文件夹菜单", "Select file range" : "选择文件范围", "{used}%" : "{used}%", @@ -271,6 +272,7 @@ OC.L10N.register( "Open folder {name}" : "打开文件夹 {name}", "This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "因为性能原因,该列表没有完全加载。这些文件将会在您浏览列表的时候加载。", "Search for an account" : "搜索一个账户", + "Choose" : "选择", "No files or folders have been deleted yet" : "尚未删除任何文件或文件夹" }, "nplurals=1; plural=0;"); diff --git a/apps/files/l10n/zh_CN.json b/apps/files/l10n/zh_CN.json index f022c6c31fa..a4b545daacd 100644 --- a/apps/files/l10n/zh_CN.json +++ b/apps/files/l10n/zh_CN.json @@ -76,6 +76,7 @@ "_including %n hidden_::_including %n hidden_" : ["包括 %n 个隐藏文件"], "You do not have permission to upload or create files here" : "您没有在此上传或创建文件的权限", "_Uploading %n file_::_Uploading %n files_" : ["正在上传 %n 个文件"], + "New" : "新建", "New file/folder menu" : "新建文件/文件夹菜单", "Select file range" : "选择文件范围", "{used}%" : "{used}%", @@ -269,6 +270,7 @@ "Open folder {name}" : "打开文件夹 {name}", "This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "因为性能原因,该列表没有完全加载。这些文件将会在您浏览列表的时候加载。", "Search for an account" : "搜索一个账户", + "Choose" : "选择", "No files or folders have been deleted yet" : "尚未删除任何文件或文件夹" },"pluralForm" :"nplurals=1; plural=0;" }
\ No newline at end of file diff --git a/apps/files/l10n/zh_HK.js b/apps/files/l10n/zh_HK.js index fcea217faba..7486e1010be 100644 --- a/apps/files/l10n/zh_HK.js +++ b/apps/files/l10n/zh_HK.js @@ -79,6 +79,7 @@ OC.L10N.register( "_including %n hidden_::_including %n hidden_" : ["包括 %n 個隱藏檔"], "You do not have permission to upload or create files here" : "您無權限上傳或建立檔案", "_Uploading %n file_::_Uploading %n files_" : ["正在上傳 %n 個檔案"], + "New" : "新", "New file/folder menu" : "新檔案/資料夾選項單", "Select file range" : "選擇多個檔案", "{used}%" : "{used}%", @@ -278,6 +279,7 @@ OC.L10N.register( "Open folder {name}" : "打開資料夾 {name}", "This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "出於性能考慮,此清單未完全呈現。檔案將在您瀏覽清單時呈現。", "Search for an account" : "搜尋賬號", + "Choose" : "選擇", "No files or folders have been deleted yet" : "尚未刪除任何檔案或資料夾" }, "nplurals=1; plural=0;"); diff --git a/apps/files/l10n/zh_HK.json b/apps/files/l10n/zh_HK.json index b447c994571..4e28350f9df 100644 --- a/apps/files/l10n/zh_HK.json +++ b/apps/files/l10n/zh_HK.json @@ -77,6 +77,7 @@ "_including %n hidden_::_including %n hidden_" : ["包括 %n 個隱藏檔"], "You do not have permission to upload or create files here" : "您無權限上傳或建立檔案", "_Uploading %n file_::_Uploading %n files_" : ["正在上傳 %n 個檔案"], + "New" : "新", "New file/folder menu" : "新檔案/資料夾選項單", "Select file range" : "選擇多個檔案", "{used}%" : "{used}%", @@ -276,6 +277,7 @@ "Open folder {name}" : "打開資料夾 {name}", "This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "出於性能考慮,此清單未完全呈現。檔案將在您瀏覽清單時呈現。", "Search for an account" : "搜尋賬號", + "Choose" : "選擇", "No files or folders have been deleted yet" : "尚未刪除任何檔案或資料夾" },"pluralForm" :"nplurals=1; plural=0;" }
\ No newline at end of file diff --git a/apps/files/l10n/zh_TW.js b/apps/files/l10n/zh_TW.js index 52df07232e1..01b5399c540 100644 --- a/apps/files/l10n/zh_TW.js +++ b/apps/files/l10n/zh_TW.js @@ -79,6 +79,7 @@ OC.L10N.register( "_including %n hidden_::_including %n hidden_" : ["包含 %n 個隱藏檔"], "You do not have permission to upload or create files here" : "您無權在此上傳或建立檔案", "_Uploading %n file_::_Uploading %n files_" : ["正在上傳 %n 個檔案"], + "New" : "新增", "New file/folder menu" : "新檔案/資料夾選單", "Select file range" : "選取多個檔案", "{used}%" : "{used}%", @@ -278,6 +279,7 @@ OC.L10N.register( "Open folder {name}" : "開啟資料夾 {name}", "This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "出於效能考量,此清單未完全呈現。檔案將在您瀏覽清單時呈現。", "Search for an account" : "搜尋帳號", + "Choose" : "選擇", "No files or folders have been deleted yet" : "尚未刪除任何檔案或資料夾" }, "nplurals=1; plural=0;"); diff --git a/apps/files/l10n/zh_TW.json b/apps/files/l10n/zh_TW.json index a572f64f75e..58072ca38b3 100644 --- a/apps/files/l10n/zh_TW.json +++ b/apps/files/l10n/zh_TW.json @@ -77,6 +77,7 @@ "_including %n hidden_::_including %n hidden_" : ["包含 %n 個隱藏檔"], "You do not have permission to upload or create files here" : "您無權在此上傳或建立檔案", "_Uploading %n file_::_Uploading %n files_" : ["正在上傳 %n 個檔案"], + "New" : "新增", "New file/folder menu" : "新檔案/資料夾選單", "Select file range" : "選取多個檔案", "{used}%" : "{used}%", @@ -276,6 +277,7 @@ "Open folder {name}" : "開啟資料夾 {name}", "This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "出於效能考量,此清單未完全呈現。檔案將在您瀏覽清單時呈現。", "Search for an account" : "搜尋帳號", + "Choose" : "選擇", "No files or folders have been deleted yet" : "尚未刪除任何檔案或資料夾" },"pluralForm" :"nplurals=1; plural=0;" }
\ No newline at end of file diff --git a/apps/files/lib/AppInfo/Application.php b/apps/files/lib/AppInfo/Application.php index feba7b09178..9099dbaceb2 100644 --- a/apps/files/lib/AppInfo/Application.php +++ b/apps/files/lib/AppInfo/Application.php @@ -133,7 +133,6 @@ class Application extends App implements IBootstrap { $context->injectFn([Listener::class, 'register']); $context->injectFn(Closure::fromCallable([$this, 'registerSearchProvider'])); $this->registerTemplates(); - $context->injectFn(Closure::fromCallable([$this, 'registerNavigation'])); $this->registerHooks(); } @@ -152,18 +151,6 @@ class Application extends App implements IBootstrap { $templateManager->registerTemplate('application/vnd.oasis.opendocument.spreadsheet', 'core/templates/filetemplates/template.ods'); } - private function registerNavigation(IL10N $l10n): void { - \OCA\Files\App::getNavigationManager()->add(function () use ($l10n) { - return [ - 'id' => 'files', - 'appname' => 'files', - 'script' => 'list.php', - 'order' => 0, - 'name' => $l10n->t('All files') - ]; - }); - } - private function registerHooks(): void { Util::connectHook('\OCP\Config', 'js', '\OCA\Files\App', 'extendJsConfig'); } diff --git a/apps/files/lib/Controller/ApiController.php b/apps/files/lib/Controller/ApiController.php index 3d490f06b75..bee6fb26d9e 100644 --- a/apps/files/lib/Controller/ApiController.php +++ b/apps/files/lib/Controller/ApiController.php @@ -388,6 +388,7 @@ class ApiController extends Controller { /** * @NoAdminRequired * @NoCSRFRequired + * @PublicPage * * Get the service-worker Javascript for previews * diff --git a/apps/files/lib/Controller/ViewController.php b/apps/files/lib/Controller/ViewController.php index 01f85a7c939..8fe7eea01a0 100644 --- a/apps/files/lib/Controller/ViewController.php +++ b/apps/files/lib/Controller/ViewController.php @@ -153,17 +153,36 @@ class ViewController extends Controller { * * @param string $fileid * @return TemplateResponse|RedirectResponse - * @throws NotFoundException */ - public function showFile(string $fileid = null, int $openfile = 1): Response { + public function showFile(string $fileid = null): Response { + if (!$fileid) { + return new RedirectResponse($this->urlGenerator->linkToRoute('files.view.index')); + } + // This is the entry point from the `/f/{fileid}` URL which is hardcoded in the server. try { - return $this->redirectToFile($fileid, $openfile !== 0); + return $this->redirectToFile((int) $fileid); } catch (NotFoundException $e) { return new RedirectResponse($this->urlGenerator->linkToRoute('files.view.index', ['fileNotFound' => true])); } } + + /** + * @NoCSRFRequired + * @NoAdminRequired + * @UseSession + * + * @param string $dir + * @param string $view + * @param string $fileid + * @param bool $fileNotFound + * @return TemplateResponse|RedirectResponse + */ + public function indexView($dir = '', $view = '', $fileid = null, $fileNotFound = false) { + return $this->index($dir, $view, $fileid, $fileNotFound); + } + /** * @NoCSRFRequired * @NoAdminRequired @@ -173,22 +192,30 @@ class ViewController extends Controller { * @param string $view * @param string $fileid * @param bool $fileNotFound - * @param string $openfile - the openfile URL parameter if it was present in the initial request * @return TemplateResponse|RedirectResponse - * @throws NotFoundException */ - public function index($dir = '', $view = '', $fileid = null, $fileNotFound = false, $openfile = null) { + public function indexViewFileid($dir = '', $view = '', $fileid = null, $fileNotFound = false) { + return $this->index($dir, $view, $fileid, $fileNotFound); + } - if ($fileid !== null && $dir === '') { + /** + * @NoCSRFRequired + * @NoAdminRequired + * @UseSession + * + * @param string $dir + * @param string $view + * @param string $fileid + * @param bool $fileNotFound + * @return TemplateResponse|RedirectResponse + */ + public function index($dir = '', $view = '', $fileid = null, $fileNotFound = false) { + if ($fileid !== null && $view !== 'trashbin') { try { - return $this->redirectToFile($fileid); - } catch (NotFoundException $e) { - return new RedirectResponse($this->urlGenerator->linkToRoute('files.view.index', ['fileNotFound' => true])); - } + return $this->redirectToFileIfInTrashbin((int) $fileid); + } catch (NotFoundException $e) {} } - $nav = new \OCP\Template('files', 'appnavigation', ''); - // Load the files we need \OCP\Util::addStyle('files', 'merged'); \OCP\Util::addScript('files', 'merged-index', 'files'); @@ -203,17 +230,6 @@ class ViewController extends Controller { $favElements['folders'] = []; } - $navItems = \OCA\Files\App::getNavigationManager()->getAll(); - - // parse every menu and add the expanded user value - foreach ($navItems as $key => $item) { - $navItems[$key]['expanded'] = $this->config->getUserValue($userId, 'files', 'show_' . $item['id'], '0') === '1'; - } - - $nav->assign('navigationItems', $navItems); - - $contentItems = []; - try { // If view is files, we use the directory, otherwise we use the root storage $storageInfo = $this->getStorageInfo(($view === 'files' && $dir) ? $dir : '/'); @@ -222,7 +238,6 @@ class ViewController extends Controller { } $this->initialState->provideInitialState('storageStats', $storageInfo); - $this->initialState->provideInitialState('navigation', $navItems); $this->initialState->provideInitialState('config', $this->userConfig->getConfigs()); $this->initialState->provideInitialState('viewConfigs', $this->viewConfig->getConfigs()); $this->initialState->provideInitialState('favoriteFolders', $favElements['folders'] ?? []); @@ -231,34 +246,9 @@ class ViewController extends Controller { $filesSortingConfig = json_decode($this->config->getUserValue($userId, 'files', 'files_sorting_configs', '{}'), true); $this->initialState->provideInitialState('filesSortingConfig', $filesSortingConfig); - // render the container content for every navigation item - foreach ($navItems as $item) { - $content = ''; - if (isset($item['script'])) { - $content = $this->renderScript($item['appname'], $item['script']); - } - // parse submenus - if (isset($item['sublist'])) { - foreach ($item['sublist'] as $subitem) { - $subcontent = ''; - if (isset($subitem['script'])) { - $subcontent = $this->renderScript($subitem['appname'], $subitem['script']); - } - $contentItems[$subitem['id']] = [ - 'id' => $subitem['id'], - 'content' => $subcontent - ]; - } - } - $contentItems[$item['id']] = [ - 'id' => $item['id'], - 'content' => $content - ]; - } - - $this->eventDispatcher->dispatchTyped(new ResourcesLoadAdditionalScriptsEvent()); $event = new LoadAdditionalScriptsEvent(); $this->eventDispatcher->dispatchTyped($event); + $this->eventDispatcher->dispatchTyped(new ResourcesLoadAdditionalScriptsEvent()); $this->eventDispatcher->dispatchTyped(new LoadSidebar()); // Load Viewer scripts if (class_exists(LoadViewer::class)) { @@ -268,23 +258,9 @@ class ViewController extends Controller { $this->initialState->provideInitialState('templates_path', $this->templateManager->hasTemplateDirectory() ? $this->templateManager->getTemplatePath() : false); $this->initialState->provideInitialState('templates', $this->templateManager->listCreators()); - $params = []; - $params['usedSpacePercent'] = (int) $storageInfo['relative']; - $params['owner'] = $storageInfo['owner'] ?? ''; - $params['ownerDisplayName'] = $storageInfo['ownerDisplayName'] ?? ''; - $params['isPublic'] = false; - $params['allowShareWithLink'] = $this->shareManager->shareApiAllowLinks() ? 'yes' : 'no'; - $params['defaultFileSorting'] = $filesSortingConfig['files']['mode'] ?? 'basename'; - $params['defaultFileSortingDirection'] = $filesSortingConfig['files']['direction'] ?? 'asc'; - $params['showgridview'] = $this->config->getUserValue($userId, 'files', 'show_grid', false); - $showHidden = (bool) $this->config->getUserValue($userId, 'files', 'show_hidden', false); - $params['showHiddenFiles'] = $showHidden ? 1 : 0; - $cropImagePreviews = (bool) $this->config->getUserValue($userId, 'files', 'crop_image_previews', true); - $params['cropImagePreviews'] = $cropImagePreviews ? 1 : 0; - $params['fileNotFound'] = $fileNotFound ? 1 : 0; - $params['appNavigation'] = $nav; - $params['appContents'] = $contentItems; - $params['hiddenFields'] = $event->getHiddenFields(); + $params = [ + 'fileNotFound' => $fileNotFound ? 1 : 0 + ]; $response = new TemplateResponse( Application::APP_ID, @@ -293,21 +269,23 @@ class ViewController extends Controller { ); $policy = new ContentSecurityPolicy(); $policy->addAllowedFrameDomain('\'self\''); + // Allow preview service worker + $policy->addAllowedWorkerSrcDomain('\'self\''); $response->setContentSecurityPolicy($policy); - $this->provideInitialState($dir, $openfile); + $this->provideInitialState($dir, $fileid); return $response; } /** - * Add openFileInfo in initialState if $openfile is set. + * Add openFileInfo in initialState. * @param string $dir - the ?dir= URL param - * @param string $openfile - the ?openfile= URL param + * @param string $fileid - the fileid URL param * @return void */ - private function provideInitialState(string $dir, ?string $openfile): void { - if ($openfile === null) { + private function provideInitialState(string $dir, ?string $fileid): void { + if ($fileid === null) { return; } @@ -319,7 +297,7 @@ class ViewController extends Controller { $uid = $user->getUID(); $userFolder = $this->rootFolder->getUserFolder($uid); - $nodes = $userFolder->getById((int) $openfile); + $nodes = $userFolder->getById((int) $fileid); $node = array_shift($nodes); if ($node === null) { @@ -351,44 +329,70 @@ class ViewController extends Controller { } /** - * Redirects to the file list and highlight the given file id + * Redirects to the trashbin file list and highlight the given file id * - * @param string $fileId file id to show - * @param bool $setOpenfile - whether or not to set the openfile URL parameter + * @param int $fileId file id to show * @return RedirectResponse redirect response or not found response - * @throws \OCP\Files\NotFoundException + * @throws NotFoundException */ - private function redirectToFile($fileId, bool $setOpenfile = false) { + private function redirectToFileIfInTrashbin($fileId): RedirectResponse { $uid = $this->userSession->getUser()->getUID(); $baseFolder = $this->rootFolder->getUserFolder($uid); - $files = $baseFolder->getById($fileId); + $nodes = $baseFolder->getById($fileId); $params = []; - if (empty($files) && $this->appManager->isEnabledForUser('files_trashbin')) { + if (empty($nodes) && $this->appManager->isEnabledForUser('files_trashbin')) { + /** @var Folder */ $baseFolder = $this->rootFolder->get($uid . '/files_trashbin/files/'); - $files = $baseFolder->getById($fileId); + $nodes = $baseFolder->getById($fileId); $params['view'] = 'trashbin'; + + if (!empty($nodes)) { + $node = current($nodes); + $params['fileid'] = $fileId; + if ($node instanceof Folder) { + // set the full path to enter the folder + $params['dir'] = $baseFolder->getRelativePath($node->getPath()); + } else { + // set parent path as dir + $params['dir'] = $baseFolder->getRelativePath($node->getParent()->getPath()); + } + return new RedirectResponse($this->urlGenerator->linkToRoute('files.view.indexViewFileid', $params)); + } } + throw new NotFoundException(); + } + + /** + * Redirects to the file list and highlight the given file id + * + * @param int $fileId file id to show + * @return RedirectResponse redirect response or not found response + * @throws NotFoundException + */ + private function redirectToFile(int $fileId) { + $uid = $this->userSession->getUser()->getUID(); + $baseFolder = $this->rootFolder->getUserFolder($uid); + $nodes = $baseFolder->getById($fileId); + $params = []; + + try { + $this->redirectToFileIfInTrashbin($fileId); + } catch (NotFoundException $e) {} - if (!empty($files)) { - $file = current($files); - if ($file instanceof Folder) { + if (!empty($nodes)) { + $node = current($nodes); + $params['fileid'] = $fileId; + if ($node instanceof Folder) { // set the full path to enter the folder - $params['dir'] = $baseFolder->getRelativePath($file->getPath()); + $params['dir'] = $baseFolder->getRelativePath($node->getPath()); } else { // set parent path as dir - $params['dir'] = $baseFolder->getRelativePath($file->getParent()->getPath()); - // and scroll to the entry - $params['scrollto'] = $file->getName(); - - if ($setOpenfile) { - // forward the openfile URL parameter. - $params['openfile'] = $fileId; - } + $params['dir'] = $baseFolder->getRelativePath($node->getParent()->getPath()); } - - return new RedirectResponse($this->urlGenerator->linkToRoute('files.view.index', $params)); + return new RedirectResponse($this->urlGenerator->linkToRoute('files.view.indexViewFileid', $params)); } - throw new \OCP\Files\NotFoundException(); + + throw new NotFoundException(); } } diff --git a/apps/files/lib/Event/LoadAdditionalScriptsEvent.php b/apps/files/lib/Event/LoadAdditionalScriptsEvent.php index 5291a776e81..1e2080622f4 100644 --- a/apps/files/lib/Event/LoadAdditionalScriptsEvent.php +++ b/apps/files/lib/Event/LoadAdditionalScriptsEvent.php @@ -31,18 +31,7 @@ use OCP\EventDispatcher\Event; /** * This event is triggered when the files app is rendered. - * It can be used to add additional scripts to the files app. * * @since 17.0.0 */ -class LoadAdditionalScriptsEvent extends Event { - private $hiddenFields = []; - - public function addHiddenField(string $name, string $value): void { - $this->hiddenFields[$name] = $value; - } - - public function getHiddenFields(): array { - return $this->hiddenFields; - } -} +class LoadAdditionalScriptsEvent extends Event {}
\ No newline at end of file diff --git a/apps/files/openapi.json b/apps/files/openapi.json index c8e9bb6ff41..4eb3ecf8d0b 100644 --- a/apps/files/openapi.json +++ b/apps/files/openapi.json @@ -340,6 +340,7 @@ "api" ], "security": [ + {}, { "bearer_auth": [] }, diff --git a/apps/files/src/actions/openFolderAction.spec.ts b/apps/files/src/actions/openFolderAction.spec.ts index 5a0ccc98978..49fc9a9a63a 100644 --- a/apps/files/src/actions/openFolderAction.spec.ts +++ b/apps/files/src/actions/openFolderAction.spec.ts @@ -19,11 +19,13 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. * */ -import { action } from './openFolderAction' +import type { Navigation } from '../services/Navigation' + import { expect } from '@jest/globals' import { File, Folder, Node, Permission } from '@nextcloud/files' + +import { action } from './openFolderAction' import { DefaultType, FileAction } from '../services/FileAction' -import type { Navigation } from '../services/Navigation' const view = { id: 'files', @@ -132,7 +134,7 @@ describe('Open folder action execute tests', () => { // Silent action expect(exec).toBe(null) expect(goToRouteMock).toBeCalledTimes(1) - expect(goToRouteMock).toBeCalledWith(null, null, { dir: '/FooBar' }) + expect(goToRouteMock).toBeCalledWith(null, { fileid: undefined, view: 'files' }, { dir: '/FooBar' }) }) test('Open folder fails without node', async () => { diff --git a/apps/files/src/actions/openFolderAction.ts b/apps/files/src/actions/openFolderAction.ts index ccb3f1a43ea..c0e03b20af0 100644 --- a/apps/files/src/actions/openFolderAction.ts +++ b/apps/files/src/actions/openFolderAction.ts @@ -59,8 +59,8 @@ export const action = new FileAction({ window.OCP.Files.Router.goToRoute( null, - null, - { dir: join(dir, node.basename) }, + { view: view.id, fileid: undefined }, + { dir: join(dir, node.basename), fileid: undefined }, ) return null }, diff --git a/apps/files/src/actions/openInFilesAction.spec.ts b/apps/files/src/actions/openInFilesAction.spec.ts index 302a6c45c6b..4fc402c73a8 100644 --- a/apps/files/src/actions/openInFilesAction.spec.ts +++ b/apps/files/src/actions/openInFilesAction.spec.ts @@ -78,7 +78,7 @@ describe('Open in files action execute tests', () => { // Silent action expect(exec).toBe(null) expect(goToRouteMock).toBeCalledTimes(1) - expect(goToRouteMock).toBeCalledWith(null, { fileid: 1, view: 'files' }, { fileid: 1, dir: '/Foo', openfile: true }) + expect(goToRouteMock).toBeCalledWith(null, { fileid: 1, view: 'files' }, { fileid: 1, dir: '/Foo' }) }) test('Open in files with folder', async () => { @@ -98,6 +98,6 @@ describe('Open in files action execute tests', () => { // Silent action expect(exec).toBe(null) expect(goToRouteMock).toBeCalledTimes(1) - expect(goToRouteMock).toBeCalledWith(null, { fileid: 1, view: 'files' }, { fileid: 1, dir: '/Foo/Bar', openfile: true }) + expect(goToRouteMock).toBeCalledWith(null, { fileid: 1, view: 'files' }, { fileid: 1, dir: '/Foo/Bar' }) }) }) diff --git a/apps/files/src/actions/openInFilesAction.ts b/apps/files/src/actions/openInFilesAction.ts index 283bfc63d50..9d3ceaf3b7b 100644 --- a/apps/files/src/actions/openInFilesAction.ts +++ b/apps/files/src/actions/openInFilesAction.ts @@ -44,7 +44,7 @@ export const action = new FileAction({ window.OCP.Files.Router.goToRoute( null, // use default route { view: 'files', fileid: node.fileid }, - { dir, fileid: node.fileid, openfile: true }, + { dir, fileid: node.fileid }, ) return null }, diff --git a/apps/files/src/actions/sidebarAction.spec.ts b/apps/files/src/actions/sidebarAction.spec.ts index 69eabe4be79..6b33667d1dd 100644 --- a/apps/files/src/actions/sidebarAction.spec.ts +++ b/apps/files/src/actions/sidebarAction.spec.ts @@ -19,11 +19,13 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. * */ -import { action } from './sidebarAction' +import type { Navigation } from '../services/Navigation' + import { expect } from '@jest/globals' import { File, Permission } from '@nextcloud/files' + +import { action } from './sidebarAction' import { FileAction } from '../services/FileAction' -import type { Navigation } from '../services/Navigation' import logger from '../logger' const view = { @@ -127,6 +129,8 @@ describe('Open sidebar action exec tests', () => { test('Open sidebar', async () => { const openMock = jest.fn() window.OCA = { Files: { Sidebar: { open: openMock } } } + const goToRouteMock = jest.fn() + window.OCP = { Files: { Router: { goToRoute: goToRouteMock } } } const file = new File({ id: 1, @@ -139,6 +143,12 @@ describe('Open sidebar action exec tests', () => { // Silent action expect(exec).toBe(null) expect(openMock).toBeCalledWith('/foobar.txt') + expect(goToRouteMock).toBeCalledWith( + null, + { view: view.id, fileid: 1 }, + { dir: '/' }, + true, + ) }) test('Open sidebar fails', async () => { diff --git a/apps/files/src/actions/sidebarAction.ts b/apps/files/src/actions/sidebarAction.ts index 6c553d97902..849cf78368d 100644 --- a/apps/files/src/actions/sidebarAction.ts +++ b/apps/files/src/actions/sidebarAction.ts @@ -19,9 +19,11 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. * */ +import type { Navigation } from '../services/Navigation' + +import { Permission, type Node } from '@nextcloud/files' import { translate as t } from '@nextcloud/l10n' import InformationSvg from '@mdi/svg/svg/information-variant.svg?raw' -import { Permission, type Node } from '@nextcloud/files' import { registerFileAction, FileAction } from '../services/FileAction' import logger from '../logger.js' @@ -40,6 +42,10 @@ export const action = new FileAction({ return false } + if (!nodes[0]) { + return false + } + // Only work if the sidebar is available if (!window?.OCA?.Files?.Sidebar) { return false @@ -48,10 +54,18 @@ export const action = new FileAction({ return (nodes[0].root?.startsWith('/files/') && nodes[0].permissions !== Permission.NONE) ?? false }, - async exec(node: Node) { + async exec(node: Node, view: Navigation) { try { // TODO: migrate Sidebar to use a Node instead - window?.OCA?.Files?.Sidebar?.open?.(node.path) + await window.OCA.Files.Sidebar.open(node.path) + + // Silently update current fileid + window.OCP.Files.Router.goToRoute( + null, + { view: view.id, fileid: node.fileid }, + { dir: node.dirname }, + true, + ) return null } catch (error) { diff --git a/apps/files/src/actions/viewInFolderAction.spec.ts b/apps/files/src/actions/viewInFolderAction.spec.ts index 887ed5d47c6..7d61fa4298d 100644 --- a/apps/files/src/actions/viewInFolderAction.spec.ts +++ b/apps/files/src/actions/viewInFolderAction.spec.ts @@ -128,7 +128,7 @@ describe('View in folder action execute tests', () => { // Silent action expect(exec).toBe(null) expect(goToRouteMock).toBeCalledTimes(1) - expect(goToRouteMock).toBeCalledWith(null, { fileid: 1, view: 'files' }, { fileid: 1, dir: '/' }) + expect(goToRouteMock).toBeCalledWith(null, { fileid: 1, view: 'files' }, { dir: '/' }) }) test('View in (sub) folder', async () => { @@ -148,7 +148,7 @@ describe('View in folder action execute tests', () => { // Silent action expect(exec).toBe(null) expect(goToRouteMock).toBeCalledTimes(1) - expect(goToRouteMock).toBeCalledWith(null, { fileid: 1, view: 'files' }, { fileid: 1, dir: '/Foo/Bar' }) + expect(goToRouteMock).toBeCalledWith(null, { fileid: 1, view: 'files' }, { dir: '/Foo/Bar' }) }) test('View in folder fails without node', async () => { diff --git a/apps/files/src/actions/viewInFolderAction.ts b/apps/files/src/actions/viewInFolderAction.ts index 2f603e6cf3a..f0c5d2485a3 100644 --- a/apps/files/src/actions/viewInFolderAction.ts +++ b/apps/files/src/actions/viewInFolderAction.ts @@ -61,7 +61,7 @@ export const action = new FileAction({ window.OCP.Files.Router.goToRoute( null, { view: 'files', fileid: node.fileid }, - { dir: node.dirname, fileid: node.fileid }, + { dir: node.dirname }, ) return null }, diff --git a/apps/files/src/components/FileEntry.vue b/apps/files/src/components/FileEntry.vue index 775c868b18e..7aaa43c6c01 100644 --- a/apps/files/src/components/FileEntry.vue +++ b/apps/files/src/components/FileEntry.vue @@ -21,9 +21,18 @@ --> <template> - <Fragment> + <tr :class="{'files-list__row--visible': visible, 'files-list__row--active': isActive}" + data-cy-files-list-row + :data-cy-files-list-row-fileid="fileid" + :data-cy-files-list-row-name="source.basename" + class="list__row" + @contextmenu="onRightClick"> + <!-- Failed indicator --> + <span v-if="source.attributes.failed" class="files-list__row--failed" /> + + <!-- Checkbox --> <td class="files-list__row-checkbox"> - <NcCheckboxRadioSwitch v-if="active" + <NcCheckboxRadioSwitch v-if="visible" :aria-label="t('files', 'Select the row for {displayName}', { displayName })" :checked="selectedFiles" :value="fileid" @@ -32,7 +41,7 @@ </td> <!-- Link to file --> - <td class="files-list__row-name"> + <td class="files-list__row-name" data-cy-files-list-row-name> <!-- Icon or preview --> <span class="files-list__row-icon" @click="execDefaultAction"> <FolderIcon v-if="source.type === 'folder'" /> @@ -43,10 +52,6 @@ class="files-list__row-icon-preview" :style="{ backgroundImage }" /> - <span v-else-if="mimeIconUrl" - class="files-list__row-icon-preview files-list__row-icon-preview--mime" - :style="{ backgroundImage: mimeIconUrl }" /> - <FileIcon v-else /> <!-- Favorite icon --> @@ -79,6 +84,7 @@ ref="basename" :aria-hidden="isRenaming" class="files-list__row-name-link" + data-cy-files-list-row-name-link v-bind="linkTo" @click="execDefaultAction"> <!-- File name --> @@ -91,7 +97,10 @@ </td> <!-- Actions --> - <td v-show="!isRenamingSmallScreen" :class="`files-list__row-actions-${uniqueId}`" class="files-list__row-actions"> + <td v-show="!isRenamingSmallScreen" + :class="`files-list__row-actions-${uniqueId}`" + class="files-list__row-actions" + data-cy-files-list-row-actions> <!-- Render actions --> <CustomElementRender v-for="action in enabledRenderActions" :key="action.id" @@ -100,10 +109,10 @@ :source="source" /> <!-- Menu actions --> - <NcActions v-if="active" + <NcActions v-if="visible" ref="actionsMenu" - :boundaries-element="boundariesElement" - :container="boundariesElement" + :boundaries-element="getBoundariesElement()" + :container="getBoundariesElement()" :disabled="source._loading" :force-name="true" :force-menu="enabledInlineActions.length === 0 /* forceMenu only if no inline actions */" @@ -113,6 +122,7 @@ :key="action.id" :class="'files-list__row-action-' + action.id" :close-after-click="true" + :data-cy-files-list-row-action="action.id" @click="onActionClick(action)"> <template #icon> <NcLoadingIcon v-if="loading === action.id" :size="18" /> @@ -127,6 +137,7 @@ <td v-if="isSizeAvailable" :style="{ opacity: sizeOpacity }" class="files-list__row-size" + data-cy-files-list-row-size @click="openDetailsIfAvailable"> <span>{{ size }}</span> </td> @@ -134,6 +145,7 @@ <!-- Mtime --> <td v-if="isMtimeAvailable" class="files-list__row-mtime" + data-cy-files-list-row-mtime @click="openDetailsIfAvailable"> <span>{{ mtime }}</span> </td> @@ -143,36 +155,36 @@ :key="column.id" :class="`files-list__row-${currentView?.id}-${column.id}`" class="files-list__row-column-custom" + :data-cy-files-list-row-column-custom="column.id" @click="openDetailsIfAvailable"> - <CustomElementRender v-if="active" + <CustomElementRender v-if="visible" :current-view="currentView" :render="column.render" :source="source" /> </td> - </Fragment> + </tr> </template> <script lang='ts'> +import { CancelablePromise } from 'cancelable-promise' import { debounce } from 'debounce' import { emit } from '@nextcloud/event-bus' -import { formatFileSize, Permission } from '@nextcloud/files' -import { Fragment } from 'vue-frag' import { extname } from 'path' +import { formatFileSize, Permission } from '@nextcloud/files' +import { generateUrl } from '@nextcloud/router' import { showError, showSuccess } from '@nextcloud/dialogs' import { translate } from '@nextcloud/l10n' -import { generateUrl } from '@nextcloud/router' import { vOnClickOutside } from '@vueuse/components' import axios from '@nextcloud/axios' -import CancelablePromise from 'cancelable-promise' import FileIcon from 'vue-material-design-icons/File.vue' import FolderIcon from 'vue-material-design-icons/Folder.vue' +import moment from '@nextcloud/moment' import NcActionButton from '@nextcloud/vue/dist/Components/NcActionButton.js' import NcActions from '@nextcloud/vue/dist/Components/NcActions.js' import NcCheckboxRadioSwitch from '@nextcloud/vue/dist/Components/NcCheckboxRadioSwitch.js' import NcLoadingIcon from '@nextcloud/vue/dist/Components/NcLoadingIcon.js' import NcTextField from '@nextcloud/vue/dist/Components/NcTextField.js' import Vue from 'vue' -import type moment from 'moment' import { ACTION_DETAILS } from '../actions/sidebarAction.ts' import { getFileActions, DefaultType } from '../services/FileAction.ts' @@ -181,9 +193,9 @@ import { isCachedPreview } from '../services/PreviewService.ts' import { useActionsMenuStore } from '../store/actionsmenu.ts' import { useFilesStore } from '../store/files.ts' import { useKeyboardStore } from '../store/keyboard.ts' +import { useRenamingStore } from '../store/renaming.ts' import { useSelectionStore } from '../store/selection.ts' import { useUserConfigStore } from '../store/userconfig.ts' -import { useRenamingStore } from '../store/renaming.ts' import CustomElementRender from './CustomElementRender.vue' import CustomSvgIconRender from './CustomSvgIconRender.vue' import FavoriteIcon from './FavoriteIcon.vue' @@ -203,7 +215,6 @@ export default Vue.extend({ FavoriteIcon, FileIcon, FolderIcon, - Fragment, NcActionButton, NcActions, NcCheckboxRadioSwitch, @@ -212,7 +223,7 @@ export default Vue.extend({ }, props: { - active: { + visible: { type: Boolean, default: false, }, @@ -263,7 +274,6 @@ export default Vue.extend({ return { backgroundFailed: false, backgroundImage: '', - boundariesElement: document.querySelector('.app-content > .files-list'), loading: '', } }, @@ -284,10 +294,13 @@ export default Vue.extend({ return this.currentView?.columns || [] }, - dir() { + currentDir() { // Remove any trailing slash but leave root slash return (this.$route?.query?.dir || '/').replace(/^(.+)\/$/, '$1') }, + currentFileId() { + return this.$route.params.fileid || this.$route.query.fileid || null + }, fileid() { return this.source?.fileid?.toString?.() }, @@ -342,6 +355,13 @@ export default Vue.extend({ }, linkTo() { + if (this.source.attributes.failed) { + return { + title: this.t('files', 'This node is unavailable'), + is: 'span', + } + } + if (this.enabledDefaultActions.length > 0) { const action = this.enabledDefaultActions[0] const displayName = action.displayName([this.source], this.currentView) @@ -368,7 +388,7 @@ export default Vue.extend({ return this.selectionStore.selected }, isSelected() { - return this.selectedFiles.includes(this.source?.fileid?.toString?.()) + return this.selectedFiles.includes(this.fileid) }, cropPreviews() { @@ -385,6 +405,7 @@ export default Vue.extend({ // Request tiny previews url.searchParams.set('x', '32') url.searchParams.set('y', '32') + url.searchParams.set('mimeFallback', 'true') // Handle cropping url.searchParams.set('a', this.cropPreviews === true ? '0' : '1') @@ -393,17 +414,13 @@ export default Vue.extend({ return null } }, - mimeIconUrl() { - const mimeType = this.source.mime || 'application/octet-stream' - const mimeIconUrl = window.OC?.MimeType?.getIconUrl?.(mimeType) - if (mimeIconUrl) { - return `url(${mimeIconUrl})` - } - return '' - }, // Sorted actions that are enabled for this node enabledActions() { + if (this.source.attributes.failed) { + return [] + } + return actions .filter(action => !action.enabled || action.enabled([this.source], this.currentView)) .sort((a, b) => (a.order || 0) - (b.order || 0)) @@ -419,7 +436,7 @@ export default Vue.extend({ // Enabled action that are displayed inline with a custom render function enabledRenderActions() { - if (!this.active) { + if (!this.visible) { return [] } return this.enabledActions.filter(action => typeof action.renderInline === 'function') @@ -473,24 +490,13 @@ export default Vue.extend({ this.renamingStore.newName = newName }, }, - }, - - watch: { - active(active, before) { - if (active === false && before === true) { - this.resetState() - - // When the row is not active anymore - // remove the display from the row to prevent - // keyboard interaction with it. - this.$el.parentNode.style.display = 'none' - return - } - // Restore default tabindex - this.$el.parentNode.style.display = '' + isActive() { + return this.fileid === this.currentFileId?.toString?.() }, + }, + watch: { /** * When the source changes, reset the preview * and fetch the new one. @@ -522,9 +528,6 @@ export default Vue.extend({ // Fetch the preview on init this.debounceIfNotCached() - - // Right click watcher on tr - this.$el.parentNode?.addEventListener?.('contextmenu', this.onRightClick) }, beforeDestroy() { @@ -563,8 +566,8 @@ export default Vue.extend({ // Store the promise to be able to cancel it this.previewPromise = new CancelablePromise((resolve, reject, onCancel) => { const img = new Image() - // If active, load the preview with higher priority - img.fetchpriority = this.active ? 'high' : 'auto' + // If visible, load the preview with higher priority + img.fetchpriority = this.visible ? 'high' : 'auto' img.onload = () => { this.backgroundImage = `url(${this.previewUrl})` this.backgroundFailed = false @@ -613,7 +616,7 @@ export default Vue.extend({ this.loading = action.id Vue.set(this.source, '_loading', true) - const success = await action.exec(this.source, this.currentView, this.dir) + const success = await action.exec(this.source, this.currentView, this.currentDir) // If the action returns null, we stay silent if (success === null) { @@ -639,7 +642,7 @@ export default Vue.extend({ event.preventDefault() event.stopPropagation() // Execute the first default action if any - this.enabledDefaultActions[0].exec(this.source, this.currentView, this.dir) + this.enabledDefaultActions[0].exec(this.source, this.currentView, this.currentDir) } }, @@ -816,7 +819,7 @@ export default Vue.extend({ showError(this.t('files', 'Could not rename "{oldName}", it does not exist any more', { oldName })) return } else if (error?.response?.status === 412) { - showError(this.t('files', 'The name "{newName}"" is already used in the folder "{dir}". Please choose a different name.', { newName, dir: this.dir })) + showError(this.t('files', 'The name "{newName}"" is already used in the folder "{dir}". Please choose a different name.', { newName, dir: this.currentDir })) return } @@ -828,6 +831,15 @@ export default Vue.extend({ } }, + /** + * Making this a function in case the files-list + * reference changes in the future. That way we're + * sure there is one at the time we call it. + */ + getBoundariesElement() { + return document.querySelector('.app-content > .files-list') + }, + t: translate, formatFileSize, }, @@ -839,7 +851,7 @@ export default Vue.extend({ tr { &:hover, &:focus, - &:active { + &:visible { background-color: var(--color-background-dark); } } diff --git a/apps/files/src/components/FilesListHeader.vue b/apps/files/src/components/FilesListHeader.vue index d36c9dd46a6..74dc224a39b 100644 --- a/apps/files/src/components/FilesListHeader.vue +++ b/apps/files/src/components/FilesListHeader.vue @@ -20,194 +20,51 @@ - --> <template> - <tr> - <th class="files-list__column files-list__row-checkbox"> - <NcCheckboxRadioSwitch v-bind="selectAllBind" @update:checked="onToggleAll" /> - </th> - - <!-- Actions multiple if some are selected --> - <FilesListHeaderActions v-if="!isNoneSelected" - :current-view="currentView" - :selected-nodes="selectedNodes" /> - - <!-- Columns display --> - <template v-else> - <!-- Link to file --> - <th class="files-list__column files-list__row-name files-list__column--sortable" - @click.stop.prevent="toggleSortBy('basename')"> - <!-- Icon or preview --> - <span class="files-list__row-icon" /> - - <!-- Name --> - <FilesListHeaderButton :name="t('files', 'Name')" mode="basename" /> - </th> - - <!-- Actions --> - <th class="files-list__row-actions" /> - - <!-- Size --> - <th v-if="isSizeAvailable" - :class="{'files-list__column--sortable': isSizeAvailable}" - class="files-list__column files-list__row-size"> - <FilesListHeaderButton :name="t('files', 'Size')" mode="size" /> - </th> - - <!-- Mtime --> - <th v-if="isMtimeAvailable" - :class="{'files-list__column--sortable': isMtimeAvailable}" - class="files-list__column files-list__row-mtime"> - <FilesListHeaderButton :name="t('files', 'Modified')" mode="mtime" /> - </th> - - <!-- Custom views columns --> - <th v-for="column in columns" - :key="column.id" - :class="classForColumn(column)"> - <FilesListHeaderButton v-if="!!column.sort" :name="column.title" :mode="column.id" /> - <span v-else> - {{ column.title }} - </span> - </th> - </template> - </tr> + <div v-show="enabled" :class="`files-list__header-${header.id}`"> + <span ref="mount" /> + </div> </template> <script lang="ts"> -import { translate } from '@nextcloud/l10n' -import NcCheckboxRadioSwitch from '@nextcloud/vue/dist/Components/NcCheckboxRadioSwitch.js' -import Vue from 'vue' - -import { useFilesStore } from '../store/files.ts' -import { useSelectionStore } from '../store/selection.ts' -import FilesListHeaderActions from './FilesListHeaderActions.vue' -import FilesListHeaderButton from './FilesListHeaderButton.vue' -import filesSortingMixin from '../mixins/filesSorting.ts' -import logger from '../logger.js' - -export default Vue.extend({ +/** + * This component is used to render custom + * elements provided by an API. Vue doesn't allow + * to directly render an HTMLElement, so we can do + * this magic here. + */ +export default { name: 'FilesListHeader', - - components: { - FilesListHeaderButton, - NcCheckboxRadioSwitch, - FilesListHeaderActions, - }, - - mixins: [ - filesSortingMixin, - ], - props: { - isMtimeAvailable: { - type: Boolean, - default: false, - }, - isSizeAvailable: { - type: Boolean, - default: false, + header: { + type: Object, + required: true, }, - nodes: { - type: Array, + currentFolder: { + type: Object, required: true, }, - filesListWidth: { - type: Number, - default: 0, + currentView: { + type: Object, + required: true, }, }, - - setup() { - const filesStore = useFilesStore() - const selectionStore = useSelectionStore() - return { - filesStore, - selectionStore, - } - }, - computed: { - currentView() { - return this.$navigation.active - }, - - columns() { - // Hide columns if the list is too small - if (this.filesListWidth < 512) { - return [] - } - return this.currentView?.columns || [] - }, - - dir() { - // Remove any trailing slash but leave root slash - return (this.$route?.query?.dir || '/').replace(/^(.+)\/$/, '$1') - }, - - selectAllBind() { - const label = this.isNoneSelected || this.isSomeSelected - ? this.t('files', 'Select all') - : this.t('files', 'Unselect all') - return { - 'aria-label': label, - checked: this.isAllSelected, - indeterminate: this.isSomeSelected, - title: label, - } - }, - - selectedNodes() { - return this.selectionStore.selected - }, - - isAllSelected() { - return this.selectedNodes.length === this.nodes.length - }, - - isNoneSelected() { - return this.selectedNodes.length === 0 - }, - - isSomeSelected() { - return !this.isAllSelected && !this.isNoneSelected + enabled() { + console.debug('Enabled', this.header.id) + return this.header.enabled(this.currentFolder, this.currentView) }, }, - - methods: { - classForColumn(column) { - return { - 'files-list__column': true, - 'files-list__column--sortable': !!column.sort, - 'files-list__row-column-custom': true, - [`files-list__row-${this.currentView.id}-${column.id}`]: true, - } - }, - - onToggleAll(selected) { - if (selected) { - const selection = this.nodes.map(node => node.fileid.toString()) - logger.debug('Added all nodes to selection', { selection }) - this.selectionStore.setLastIndex(null) - this.selectionStore.set(selection) - } else { - logger.debug('Cleared selection') - this.selectionStore.reset() + watch: { + enabled(enabled) { + if (!enabled) { + return } + this.header.updated(this.currentFolder, this.currentView) }, - - t: translate, }, -}) -</script> - -<style scoped lang="scss"> -.files-list__column { - user-select: none; - // Make sure the cell colors don't apply to column headers - color: var(--color-text-maxcontrast) !important; - - &--sortable { - cursor: pointer; - } + mounted() { + console.debug('Mounted', this.header.id) + this.header.render(this.$refs.mount, this.currentFolder, this.currentView) + }, } - -</style> +</script> diff --git a/apps/files/src/components/FilesListTableFooter.vue b/apps/files/src/components/FilesListTableFooter.vue new file mode 100644 index 00000000000..3e8f49deace --- /dev/null +++ b/apps/files/src/components/FilesListTableFooter.vue @@ -0,0 +1,175 @@ +<!-- + - @copyright Copyright (c) 2023 John Molakvoæ <skjnldsv@protonmail.com> + - + - @author John Molakvoæ <skjnldsv@protonmail.com> + - + - @license GNU AGPL version 3 or any later version + - + - This program is free software: you can redistribute it and/or modify + - it under the terms of the GNU Affero General Public License as + - published by the Free Software Foundation, either version 3 of the + - License, or (at your option) any later version. + - + - This program is distributed in the hope that it will be useful, + - but WITHOUT ANY WARRANTY; without even the implied warranty of + - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + - GNU Affero General Public License for more details. + - + - You should have received a copy of the GNU Affero General Public License + - along with this program. If not, see <http://www.gnu.org/licenses/>. + - + --> +<template> + <tr> + <th class="files-list__row-checkbox"> + <span class="hidden-visually">{{ t('files', 'Total rows summary') }}</span> + </th> + + <!-- Link to file --> + <td class="files-list__row-name"> + <!-- Icon or preview --> + <span class="files-list__row-icon" /> + + <!-- Summary --> + <span>{{ summary }}</span> + </td> + + <!-- Actions --> + <td class="files-list__row-actions" /> + + <!-- Size --> + <td v-if="isSizeAvailable" + class="files-list__column files-list__row-size"> + <span>{{ totalSize }}</span> + </td> + + <!-- Mtime --> + <td v-if="isMtimeAvailable" + class="files-list__column files-list__row-mtime" /> + + <!-- Custom views columns --> + <th v-for="column in columns" + :key="column.id" + :class="classForColumn(column)"> + <span>{{ column.summary?.(nodes, currentView) }}</span> + </th> + </tr> +</template> + +<script lang="ts"> +import { formatFileSize } from '@nextcloud/files' +import { translate } from '@nextcloud/l10n' +import Vue from 'vue' + +import { useFilesStore } from '../store/files.ts' +import { usePathsStore } from '../store/paths.ts' + +export default Vue.extend({ + name: 'FilesListTableFooter', + + components: { + }, + + props: { + isMtimeAvailable: { + type: Boolean, + default: false, + }, + isSizeAvailable: { + type: Boolean, + default: false, + }, + nodes: { + type: Array, + required: true, + }, + summary: { + type: String, + default: '', + }, + filesListWidth: { + type: Number, + default: 0, + }, + }, + + setup() { + const pathsStore = usePathsStore() + const filesStore = useFilesStore() + return { + filesStore, + pathsStore, + } + }, + + computed: { + currentView() { + return this.$navigation.active + }, + + dir() { + // Remove any trailing slash but leave root slash + return (this.$route?.query?.dir || '/').replace(/^(.+)\/$/, '$1') + }, + + currentFolder() { + if (!this.currentView?.id) { + return + } + + if (this.dir === '/') { + return this.filesStore.getRoot(this.currentView.id) + } + const fileId = this.pathsStore.getPath(this.currentView.id, this.dir) + return this.filesStore.getNode(fileId) + }, + + columns() { + // Hide columns if the list is too small + if (this.filesListWidth < 512) { + return [] + } + return this.currentView?.columns || [] + }, + + totalSize() { + // If we have the size already, let's use it + if (this.currentFolder?.size) { + return formatFileSize(this.currentFolder.size, true) + } + + // Otherwise let's compute it + return formatFileSize(this.nodes.reduce((total, node) => total + node.size || 0, 0), true) + }, + }, + + methods: { + classForColumn(column) { + return { + 'files-list__row-column-custom': true, + [`files-list__row-${this.currentView.id}-${column.id}`]: true, + } + }, + + t: translate, + }, +}) +</script> + +<style scoped lang="scss"> +// Scoped row +tr { + padding-bottom: 300px; + border-top: 1px solid var(--color-border); + // Prevent hover effect on the whole row + background-color: transparent !important; + border-bottom: none !important; +} + +td { + user-select: none; + // Make sure the cell colors don't apply to column headers + color: var(--color-text-maxcontrast) !important; +} + +</style> diff --git a/apps/files/src/components/FilesListTableHeader.vue b/apps/files/src/components/FilesListTableHeader.vue new file mode 100644 index 00000000000..52060d2589e --- /dev/null +++ b/apps/files/src/components/FilesListTableHeader.vue @@ -0,0 +1,213 @@ +<!-- + - @copyright Copyright (c) 2023 John Molakvoæ <skjnldsv@protonmail.com> + - + - @author John Molakvoæ <skjnldsv@protonmail.com> + - + - @license GNU AGPL version 3 or any later version + - + - This program is free software: you can redistribute it and/or modify + - it under the terms of the GNU Affero General Public License as + - published by the Free Software Foundation, either version 3 of the + - License, or (at your option) any later version. + - + - This program is distributed in the hope that it will be useful, + - but WITHOUT ANY WARRANTY; without even the implied warranty of + - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + - GNU Affero General Public License for more details. + - + - You should have received a copy of the GNU Affero General Public License + - along with this program. If not, see <http://www.gnu.org/licenses/>. + - + --> +<template> + <tr class="files-list__row-head"> + <th class="files-list__column files-list__row-checkbox"> + <NcCheckboxRadioSwitch v-bind="selectAllBind" @update:checked="onToggleAll" /> + </th> + + <!-- Actions multiple if some are selected --> + <FilesListTableHeaderActions v-if="!isNoneSelected" + :current-view="currentView" + :selected-nodes="selectedNodes" /> + + <!-- Columns display --> + <template v-else> + <!-- Link to file --> + <th class="files-list__column files-list__row-name files-list__column--sortable" + @click.stop.prevent="toggleSortBy('basename')"> + <!-- Icon or preview --> + <span class="files-list__row-icon" /> + + <!-- Name --> + <FilesListTableHeaderButton :name="t('files', 'Name')" mode="basename" /> + </th> + + <!-- Actions --> + <th class="files-list__row-actions" /> + + <!-- Size --> + <th v-if="isSizeAvailable" + :class="{'files-list__column--sortable': isSizeAvailable}" + class="files-list__column files-list__row-size"> + <FilesListTableHeaderButton :name="t('files', 'Size')" mode="size" /> + </th> + + <!-- Mtime --> + <th v-if="isMtimeAvailable" + :class="{'files-list__column--sortable': isMtimeAvailable}" + class="files-list__column files-list__row-mtime"> + <FilesListTableHeaderButton :name="t('files', 'Modified')" mode="mtime" /> + </th> + + <!-- Custom views columns --> + <th v-for="column in columns" + :key="column.id" + :class="classForColumn(column)"> + <FilesListTableHeaderButton v-if="!!column.sort" :name="column.title" :mode="column.id" /> + <span v-else> + {{ column.title }} + </span> + </th> + </template> + </tr> +</template> + +<script lang="ts"> +import { translate } from '@nextcloud/l10n' +import NcCheckboxRadioSwitch from '@nextcloud/vue/dist/Components/NcCheckboxRadioSwitch.js' +import Vue from 'vue' + +import { useFilesStore } from '../store/files.ts' +import { useSelectionStore } from '../store/selection.ts' +import FilesListTableHeaderActions from './FilesListTableHeaderActions.vue' +import FilesListTableHeaderButton from './FilesListTableHeaderButton.vue' +import filesSortingMixin from '../mixins/filesSorting.ts' +import logger from '../logger.js' + +export default Vue.extend({ + name: 'FilesListTableHeader', + + components: { + FilesListTableHeaderButton, + NcCheckboxRadioSwitch, + FilesListTableHeaderActions, + }, + + mixins: [ + filesSortingMixin, + ], + + props: { + isMtimeAvailable: { + type: Boolean, + default: false, + }, + isSizeAvailable: { + type: Boolean, + default: false, + }, + nodes: { + type: Array, + required: true, + }, + filesListWidth: { + type: Number, + default: 0, + }, + }, + + setup() { + const filesStore = useFilesStore() + const selectionStore = useSelectionStore() + return { + filesStore, + selectionStore, + } + }, + + computed: { + currentView() { + return this.$navigation.active + }, + + columns() { + // Hide columns if the list is too small + if (this.filesListWidth < 512) { + return [] + } + return this.currentView?.columns || [] + }, + + dir() { + // Remove any trailing slash but leave root slash + return (this.$route?.query?.dir || '/').replace(/^(.+)\/$/, '$1') + }, + + selectAllBind() { + const label = this.isNoneSelected || this.isSomeSelected + ? this.t('files', 'Select all') + : this.t('files', 'Unselect all') + return { + 'aria-label': label, + checked: this.isAllSelected, + indeterminate: this.isSomeSelected, + title: label, + } + }, + + selectedNodes() { + return this.selectionStore.selected + }, + + isAllSelected() { + return this.selectedNodes.length === this.nodes.length + }, + + isNoneSelected() { + return this.selectedNodes.length === 0 + }, + + isSomeSelected() { + return !this.isAllSelected && !this.isNoneSelected + }, + }, + + methods: { + classForColumn(column) { + return { + 'files-list__column': true, + 'files-list__column--sortable': !!column.sort, + 'files-list__row-column-custom': true, + [`files-list__row-${this.currentView.id}-${column.id}`]: true, + } + }, + + onToggleAll(selected) { + if (selected) { + const selection = this.nodes.map(node => node.fileid.toString()) + logger.debug('Added all nodes to selection', { selection }) + this.selectionStore.setLastIndex(null) + this.selectionStore.set(selection) + } else { + logger.debug('Cleared selection') + this.selectionStore.reset() + } + }, + + t: translate, + }, +}) +</script> + +<style scoped lang="scss"> +.files-list__column { + user-select: none; + // Make sure the cell colors don't apply to column headers + color: var(--color-text-maxcontrast) !important; + + &--sortable { + cursor: pointer; + } +} + +</style> diff --git a/apps/files/src/components/FilesListTableHeaderActions.vue b/apps/files/src/components/FilesListTableHeaderActions.vue new file mode 100644 index 00000000000..f55487d183b --- /dev/null +++ b/apps/files/src/components/FilesListTableHeaderActions.vue @@ -0,0 +1,226 @@ +<!-- + - @copyright Copyright (c) 2023 John Molakvoæ <skjnldsv@protonmail.com> + - + - @author John Molakvoæ <skjnldsv@protonmail.com> + - + - @license GNU AGPL version 3 or any later version + - + - This program is free software: you can redistribute it and/or modify + - it under the terms of the GNU Affero General Public License as + - published by the Free Software Foundation, either version 3 of the + - License, or (at your option) any later version. + - + - This program is distributed in the hope that it will be useful, + - but WITHOUT ANY WARRANTY; without even the implied warranty of + - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + - GNU Affero General Public License for more details. + - + - You should have received a copy of the GNU Affero General Public License + - along with this program. If not, see <http://www.gnu.org/licenses/>. + - + --> +<template> + <th class="files-list__column files-list__row-actions-batch" colspan="2"> + <NcActions ref="actionsMenu" + :disabled="!!loading || areSomeNodesLoading" + :force-name="true" + :inline="inlineActions" + :menu-name="inlineActions <= 1 ? t('files', 'Actions') : null" + :open.sync="openedMenu"> + <NcActionButton v-for="action in enabledActions" + :key="action.id" + :class="'files-list__row-actions-batch-' + action.id" + @click="onActionClick(action)"> + <template #icon> + <NcLoadingIcon v-if="loading === action.id" :size="18" /> + <CustomSvgIconRender v-else :svg="action.iconSvgInline(nodes, currentView)" /> + </template> + {{ action.displayName(nodes, currentView) }} + </NcActionButton> + </NcActions> + </th> +</template> + +<script lang="ts"> +import { showError, showSuccess } from '@nextcloud/dialogs' +import { translate } from '@nextcloud/l10n' +import NcActionButton from '@nextcloud/vue/dist/Components/NcActionButton.js' +import NcActions from '@nextcloud/vue/dist/Components/NcActions.js' +import NcLoadingIcon from '@nextcloud/vue/dist/Components/NcLoadingIcon.js' +import Vue from 'vue' + +import { getFileActions } from '../services/FileAction.ts' +import { useActionsMenuStore } from '../store/actionsmenu.ts' +import { useFilesStore } from '../store/files.ts' +import { useSelectionStore } from '../store/selection.ts' +import filesListWidthMixin from '../mixins/filesListWidth.ts' +import CustomSvgIconRender from './CustomSvgIconRender.vue' +import logger from '../logger.js' + +// The registered actions list +const actions = getFileActions() + +export default Vue.extend({ + name: 'FilesListTableHeaderActions', + + components: { + CustomSvgIconRender, + NcActions, + NcActionButton, + NcLoadingIcon, + }, + + mixins: [ + filesListWidthMixin, + ], + + props: { + currentView: { + type: Object, + required: true, + }, + selectedNodes: { + type: Array, + default: () => ([]), + }, + }, + + setup() { + const actionsMenuStore = useActionsMenuStore() + const filesStore = useFilesStore() + const selectionStore = useSelectionStore() + return { + actionsMenuStore, + filesStore, + selectionStore, + } + }, + + data() { + return { + loading: null, + } + }, + + computed: { + dir() { + // Remove any trailing slash but leave root slash + return (this.$route?.query?.dir || '/').replace(/^(.+)\/$/, '$1') + }, + enabledActions() { + return actions + .filter(action => action.execBatch) + .filter(action => !action.enabled || action.enabled(this.nodes, this.currentView)) + .sort((a, b) => (a.order || 0) - (b.order || 0)) + }, + + nodes() { + return this.selectedNodes + .map(fileid => this.getNode(fileid)) + .filter(node => node) + }, + + areSomeNodesLoading() { + return this.nodes.some(node => node._loading) + }, + + openedMenu: { + get() { + return this.actionsMenuStore.opened === 'global' + }, + set(opened) { + this.actionsMenuStore.opened = opened ? 'global' : null + }, + }, + + inlineActions() { + if (this.filesListWidth < 512) { + return 0 + } + if (this.filesListWidth < 768) { + return 1 + } + if (this.filesListWidth < 1024) { + return 2 + } + return 3 + }, + }, + + methods: { + /** + * Get a cached note from the store + * + * @param {number} fileId the file id to get + * @return {Folder|File} + */ + getNode(fileId) { + return this.filesStore.getNode(fileId) + }, + + async onActionClick(action) { + const displayName = action.displayName(this.nodes, this.currentView) + const selectionIds = this.selectedNodes + try { + // Set loading markers + this.loading = action.id + this.nodes.forEach(node => { + Vue.set(node, '_loading', true) + }) + + // Dispatch action execution + const results = await action.execBatch(this.nodes, this.currentView, this.dir) + + // Check if all actions returned null + if (!results.some(result => result !== null)) { + // If the actions returned null, we stay silent + this.selectionStore.reset() + return + } + + // Handle potential failures + if (results.some(result => result === false)) { + // Remove the failed ids from the selection + const failedIds = selectionIds + .filter((fileid, index) => results[index] === false) + this.selectionStore.set(failedIds) + + showError(this.t('files', '"{displayName}" failed on some elements ', { displayName })) + return + } + + // Show success message and clear selection + showSuccess(this.t('files', '"{displayName}" batch action executed successfully', { displayName })) + this.selectionStore.reset() + } catch (e) { + logger.error('Error while executing action', { action, e }) + showError(this.t('files', '"{displayName}" action failed', { displayName })) + } finally { + // Remove loading markers + this.loading = null + this.nodes.forEach(node => { + Vue.set(node, '_loading', false) + }) + } + }, + + t: translate, + }, +}) +</script> + +<style scoped lang="scss"> +.files-list__row-actions-batch { + flex: 1 1 100% !important; + + // Remove when https://github.com/nextcloud/nextcloud-vue/pull/3936 is merged + ::v-deep .button-vue__wrapper { + width: 100%; + span.button-vue__text { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + } +} +</style> diff --git a/apps/files/src/components/FilesListTableHeaderButton.vue b/apps/files/src/components/FilesListTableHeaderButton.vue new file mode 100644 index 00000000000..ebd1abb4314 --- /dev/null +++ b/apps/files/src/components/FilesListTableHeaderButton.vue @@ -0,0 +1,122 @@ +<!-- + - @copyright Copyright (c) 2023 John Molakvoæ <skjnldsv@protonmail.com> + - + - @author John Molakvoæ <skjnldsv@protonmail.com> + - + - @license GNU AGPL version 3 or any later version + - + - This program is free software: you can redistribute it and/or modify + - it under the terms of the GNU Affero General Public License as + - published by the Free Software Foundation, either version 3 of the + - License, or (at your option) any later version. + - + - This program is distributed in the hope that it will be useful, + - but WITHOUT ANY WARRANTY; without even the implied warranty of + - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + - GNU Affero General Public License for more details. + - + - You should have received a copy of the GNU Affero General Public License + - along with this program. If not, see <http://www.gnu.org/licenses/>. + - + --> +<template> + <NcButton :aria-label="sortAriaLabel(name)" + :class="{'files-list__column-sort-button--active': sortingMode === mode}" + class="files-list__column-sort-button" + type="tertiary" + @click.stop.prevent="toggleSortBy(mode)"> + <!-- Sort icon before text as size is align right --> + <MenuUp v-if="sortingMode !== mode || isAscSorting" slot="icon" /> + <MenuDown v-else slot="icon" /> + {{ name }} + </NcButton> +</template> + +<script lang="ts"> +import { translate } from '@nextcloud/l10n' +import MenuDown from 'vue-material-design-icons/MenuDown.vue' +import MenuUp from 'vue-material-design-icons/MenuUp.vue' +import NcButton from '@nextcloud/vue/dist/Components/NcButton.js' +import Vue from 'vue' + +import filesSortingMixin from '../mixins/filesSorting.ts' + +export default Vue.extend({ + name: 'FilesListTableHeaderButton', + + components: { + MenuDown, + MenuUp, + NcButton, + }, + + mixins: [ + filesSortingMixin, + ], + + props: { + name: { + type: String, + required: true, + }, + mode: { + type: String, + required: true, + }, + }, + + methods: { + sortAriaLabel(column) { + const direction = this.isAscSorting + ? this.t('files', 'ascending') + : this.t('files', 'descending') + return this.t('files', 'Sort list by {column} ({direction})', { + column, + direction, + }) + }, + + t: translate, + }, +}) +</script> + +<style lang="scss"> +.files-list__column-sort-button { + // Compensate for cells margin + margin: 0 calc(var(--cell-margin) * -1); + // Reverse padding + padding: 0 4px 0 16px !important; + + // Icon after text + .button-vue__wrapper { + flex-direction: row-reverse; + // Take max inner width for text overflow ellipsis + // Remove when https://github.com/nextcloud/nextcloud-vue/pull/3936 is merged + width: 100%; + } + + .button-vue__icon { + transition-timing-function: linear; + transition-duration: .1s; + transition-property: opacity; + opacity: 0; + } + + // Remove when https://github.com/nextcloud/nextcloud-vue/pull/3936 is merged + .button-vue__text { + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + } + + &--active, + &:hover, + &:focus, + &:active { + .button-vue__icon { + opacity: 1 !important; + } + } +} +</style> diff --git a/apps/files/src/components/FilesListVirtual.vue b/apps/files/src/components/FilesListVirtual.vue index 0488e8ef190..8c7242561e9 100644 --- a/apps/files/src/components/FilesListVirtual.vue +++ b/apps/files/src/components/FilesListVirtual.vue @@ -20,28 +20,18 @@ - --> <template> - <RecycleScroller ref="recycleScroller" - class="files-list" - key-field="source" - :items="nodes" - :item-size="55" - :table-mode="true" - item-class="files-list__row" - item-tag="tr" - list-class="files-list__body" - list-tag="tbody" - role="table"> - <template #default="{ item, active, index }"> - <!-- File row --> - <FileEntry :active="active" - :index="index" - :is-mtime-available="isMtimeAvailable" - :is-size-available="isSizeAvailable" - :files-list-width="filesListWidth" - :nodes="nodes" - :source="item" /> - </template> - + <VirtualList :data-component="FileEntry" + :data-key="'source'" + :data-sources="nodes" + :item-height="56" + :extra-props="{ + isMtimeAvailable, + isSizeAvailable, + nodes, + filesListWidth, + }" + :scroll-to-index="scrollToIndex"> + <!-- Accessibility description and headers --> <template #before> <!-- Accessibility description --> <caption class="hidden-visually"> @@ -49,42 +39,56 @@ {{ t('files', 'This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list.') }} </caption> - <!-- Thead--> - <FilesListHeader :files-list-width="filesListWidth" + <!-- Headers --> + <FilesListHeader v-for="header in sortedHeaders" + :key="header.id" + :current-folder="currentFolder" + :current-view="currentView" + :header="header" /> + </template> + + <!-- Thead--> + <template #header> + <FilesListTableHeader :files-list-width="filesListWidth" :is-mtime-available="isMtimeAvailable" :is-size-available="isSizeAvailable" :nodes="nodes" /> </template> - <template #after> - <!-- Tfoot--> - <FilesListFooter :files-list-width="filesListWidth" + <!-- Tfoot--> + <template #footer> + <FilesListTableFooter :files-list-width="filesListWidth" :is-mtime-available="isMtimeAvailable" :is-size-available="isSizeAvailable" :nodes="nodes" :summary="summary" /> </template> - </RecycleScroller> + </VirtualList> </template> <script lang="ts"> -import { RecycleScroller } from 'vue-virtual-scroller' import { translate, translatePlural } from '@nextcloud/l10n' +import { getFileListHeaders, type Node } from '@nextcloud/files' +import { showError } from '@nextcloud/dialogs' import Vue from 'vue' +import VirtualList from './VirtualList.vue' +import { action as sidebarAction } from '../actions/sidebarAction.ts' import FileEntry from './FileEntry.vue' -import FilesListFooter from './FilesListFooter.vue' import FilesListHeader from './FilesListHeader.vue' +import FilesListTableFooter from './FilesListTableFooter.vue' +import FilesListTableHeader from './FilesListTableHeader.vue' import filesListWidthMixin from '../mixins/filesListWidth.ts' +import logger from '../logger.js' export default Vue.extend({ name: 'FilesListVirtual', components: { - RecycleScroller, - FileEntry, FilesListHeader, - FilesListFooter, + FilesListTableHeader, + FilesListTableFooter, + VirtualList, }, mixins: [ @@ -96,6 +100,10 @@ export default Vue.extend({ type: Object, required: true, }, + currentFolder: { + type: Object, + required: true, + }, nodes: { type: Array, required: true, @@ -105,6 +113,8 @@ export default Vue.extend({ data() { return { FileEntry, + headers: getFileListHeaders(), + scrollToIndex: 0, } }, @@ -113,6 +123,10 @@ export default Vue.extend({ return this.nodes.filter(node => node.type === 'file') }, + fileId() { + return parseInt(this.$route.params.fileid || this.$route.query.fileid) || null + }, + summaryFile() { const count = this.files.length return translatePlural('files', '{count} file', '{count} files', count, { count }) @@ -138,13 +152,36 @@ export default Vue.extend({ } return this.nodes.some(node => node.attributes.size !== undefined) }, + + sortedHeaders() { + if (!this.currentFolder || !this.currentView) { + return [] + } + + return [...this.headers].sort((a, b) => a.order - b.order) + }, }, mounted() { - // Make the root recycle scroller a table for proper semantics - const slots = this.$el.querySelectorAll('.vue-recycle-scroller__slot') - slots[0].setAttribute('role', 'thead') - slots[1].setAttribute('role', 'tfoot') + // Scroll to the file if it's in the url + if (this.fileId) { + const index = this.nodes.findIndex(node => node.fileid === this.fileId) + if (index === -1) { + showError(this.t('files', 'File not found')) + } + this.scrollToIndex = Math.max(0, index) + } + + // Open the file sidebar if we have the room for it + if (document.documentElement.clientWidth > 1024) { + // Open the sidebar on the file if it's in the url and + // we're just loaded the app for the first time. + const node = this.nodes.find(n => n.fileid === this.fileId) as Node + if (node && sidebarAction?.enabled?.([node], this.currentView)) { + logger.debug('Opening sidebar on file ' + node.path, { node }) + sidebarAction.exec(node, this.currentView, this.currentFolder) + } + } }, methods: { @@ -173,7 +210,7 @@ export default Vue.extend({ &::v-deep { // Table head, body and footer - tbody, .vue-recycle-scroller__slot { + tbody { display: flex; flex-direction: column; width: 100%; @@ -181,22 +218,36 @@ export default Vue.extend({ position: relative; } + // Before table and thead + .files-list__before { + display: flex; + flex-direction: column; + } + // Table header - .vue-recycle-scroller__slot[role='thead'] { + .files-list__thead { // Pinned on top when scrolling position: sticky; z-index: 10; top: 0; - height: var(--row-height); + } + + .files-list__thead, + .files-list__tfoot { + display: flex; + width: 100%; background-color: var(--color-main-background); + } tr { - position: absolute; + position: relative; display: flex; align-items: center; width: 100%; + user-select: none; border-bottom: 1px solid var(--color-border); + user-select: none; } td, th { @@ -221,8 +272,21 @@ export default Vue.extend({ } } + .files-list__row--failed { + position: absolute; + display: block; + top: 0; + left: 0; + right: 0; + bottom: 0; + opacity: .1; + z-index: -1; + background: var(--color-error); + } + .files-list__row-checkbox { justify-content: center; + .checkbox-radio-switch { display: flex; justify-content: center; @@ -242,9 +306,14 @@ export default Vue.extend({ } } - // Hover state of the row should also change the favorite markers background - .files-list__row:hover .favorite-marker-icon svg path { - stroke: var(--color-background-dark); + .files-list__row{ + &:hover, &:focus, &:active, &--active { + background-color: var(--color-background-dark); + // Hover state of the row should also change the favorite markers background + .favorite-marker-icon svg path { + stroke: var(--color-background-dark); + } + } } // Entry preview or mime icon diff --git a/apps/files/src/components/NavigationQuota.vue b/apps/files/src/components/NavigationQuota.vue index d38d4d2fd9e..8dd9790461b 100644 --- a/apps/files/src/components/NavigationQuota.vue +++ b/apps/files/src/components/NavigationQuota.vue @@ -134,13 +134,13 @@ export default { // User storage stats display .app-navigation-entry__settings-quota { // Align title with progress and icon - &--not-unlimited::v-deep .app-navigation-entry__title { - margin-top: -4px; + &--not-unlimited::v-deep .app-navigation-entry__name { + margin-top: -6px; } progress { position: absolute; - bottom: 10px; + bottom: 12px; margin-left: 44px; width: calc(100% - 44px - 22px); } diff --git a/apps/files/src/components/VirtualList.vue b/apps/files/src/components/VirtualList.vue new file mode 100644 index 00000000000..e028df9fea1 --- /dev/null +++ b/apps/files/src/components/VirtualList.vue @@ -0,0 +1,163 @@ +<template> + <table class="files-list" data-cy-files-list> + <!-- Header --> + <div ref="before" class="files-list__before"> + <slot name="before" /> + </div> + + <!-- Header --> + <thead ref="thead" class="files-list__thead" data-cy-files-list-thead> + <slot name="header" /> + </thead> + + <!-- Body --> + <tbody :style="tbodyStyle" class="files-list__tbody" data-cy-files-list-tbody> + <component :is="dataComponent" + v-for="(item, i) in renderedItems" + :key="i" + :visible="(i >= bufferItems || index <= bufferItems) && (i < shownItems - bufferItems)" + :source="item" + :index="i" + v-bind="extraProps" /> + </tbody> + + <!-- Footer --> + <tfoot v-show="isReady" + ref="tfoot" + class="files-list__tfoot" + data-cy-files-list-tfoot> + <slot name="footer" /> + </tfoot> + </table> +</template> + +<script lang="ts"> +import { File, Folder } from '@nextcloud/files' +import { debounce } from 'debounce' +import Vue from 'vue' +import logger from '../logger.js' + +// Items to render before and after the visible area +const bufferItems = 3 + +export default Vue.extend({ + name: 'VirtualList', + + props: { + dataComponent: { + type: [Object, Function], + required: true, + }, + dataKey: { + type: String, + required: true, + }, + dataSources: { + type: Array as () => (File | Folder)[], + required: true, + }, + itemHeight: { + type: Number, + required: true, + }, + extraProps: { + type: Object, + default: () => ({}), + }, + scrollToIndex: { + type: Number, + default: 0, + }, + }, + + data() { + return { + bufferItems, + index: this.scrollToIndex, + beforeHeight: 0, + headerHeight: 0, + tableHeight: 0, + resizeObserver: null as ResizeObserver | null, + } + }, + + computed: { + // Wait for measurements to be done before rendering + isReady() { + return this.tableHeight > 0 + }, + + startIndex() { + return Math.max(0, this.index - bufferItems) + }, + shownItems() { + return Math.ceil((this.tableHeight - this.headerHeight) / this.itemHeight) + bufferItems * 2 + }, + renderedItems(): (File | Folder)[] { + if (!this.isReady) { + return [] + } + return this.dataSources.slice(this.startIndex, this.startIndex + this.shownItems) + }, + + tbodyStyle() { + const isOverScrolled = this.startIndex + this.shownItems > this.dataSources.length + const lastIndex = this.dataSources.length - this.startIndex - this.shownItems + const hiddenAfterItems = Math.min(this.dataSources.length - this.startIndex, lastIndex) + return { + paddingTop: `${this.startIndex * this.itemHeight}px`, + paddingBottom: isOverScrolled ? 0 : `${hiddenAfterItems * this.itemHeight}px`, + } + }, + }, + watch: { + scrollToIndex() { + this.index = this.scrollToIndex + this.$el.scrollTop = this.index * this.itemHeight + this.beforeHeight + }, + }, + + mounted() { + const before = this.$refs?.before as HTMLElement + const root = this.$el as HTMLElement + const tfoot = this.$refs?.tfoot as HTMLElement + const thead = this.$refs?.thead as HTMLElement + + this.resizeObserver = new ResizeObserver(debounce(() => { + this.beforeHeight = before?.clientHeight ?? 0 + this.headerHeight = thead?.clientHeight ?? 0 + this.tableHeight = root?.clientHeight ?? 0 + logger.debug('VirtualList resizeObserver updated') + this.onScroll() + }, 100, false)) + + this.resizeObserver.observe(before) + this.resizeObserver.observe(root) + this.resizeObserver.observe(tfoot) + this.resizeObserver.observe(thead) + + this.$el.addEventListener('scroll', this.onScroll) + + if (this.scrollToIndex) { + this.$el.scrollTop = this.index * this.itemHeight + this.beforeHeight + } + }, + + beforeDestroy() { + if (this.resizeObserver) { + this.resizeObserver.disconnect() + } + }, + + methods: { + onScroll() { + // Max 0 to prevent negative index + this.index = Math.max(0, Math.round((this.$el.scrollTop - this.beforeHeight) / this.itemHeight)) + }, + }, +}) +</script> + +<style scoped> + +</style> diff --git a/apps/files/src/legacy/navigationMapper.js b/apps/files/src/legacy/navigationMapper.js deleted file mode 100644 index 764a7cb6cd9..00000000000 --- a/apps/files/src/legacy/navigationMapper.js +++ /dev/null @@ -1,55 +0,0 @@ -/** - * @copyright Copyright (c) 2022 John Molakvoæ <skjnldsv@protonmail.com> - * - * @author John Molakvoæ <skjnldsv@protonmail.com> - * - * @license AGPL-3.0-or-later - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * - */ - -import { loadState } from '@nextcloud/initial-state' -import logger from '../logger.js' - -/** - * Fetch and register the legacy files views - */ -export default function() { - const legacyViews = Object.values(loadState('files', 'navigation', {})) - - if (legacyViews.length > 0) { - logger.debug('Legacy files views detected. Processing...', legacyViews) - legacyViews.forEach(view => { - registerLegacyView(view) - if (view.sublist) { - view.sublist.forEach(subview => registerLegacyView({ ...subview, parent: view.id })) - } - }) - } -} - -const registerLegacyView = function({ id, name, order, icon, parent, classes = '', expanded, params }) { - OCP.Files.Navigation.register({ - id, - name, - order, - params, - parent, - expanded: expanded === true, - iconClass: icon ? `icon-${icon}` : 'nav-icon-' + id, - legacy: true, - sticky: classes.includes('pinned'), - }) -} diff --git a/apps/files/src/main.ts b/apps/files/src/main.ts index 9317f437368..d0fb3922229 100644 --- a/apps/files/src/main.ts +++ b/apps/files/src/main.ts @@ -15,13 +15,13 @@ import Vue from 'vue' import { createPinia, PiniaVuePlugin } from 'pinia' import FilesListView from './views/FilesList.vue' -import NavigationService from './services/Navigation' +import { NavigationService } from './services/Navigation' import NavigationView from './views/Navigation.vue' -import processLegacyFilesViews from './legacy/navigationMapper.js' import registerFavoritesView from './views/favorites' import registerRecentView from './views/recent' +import registerFilesView from './views/files' import registerPreviewServiceWorker from './services/ServiceWorker.js' -import router from './router/router.js' +import router from './router/router' import RouterService from './services/RouterService' import SettingsModel from './models/Setting.js' import SettingsService from './services/Settings.js' @@ -78,8 +78,8 @@ const FilesList = new ListView({ FilesList.$mount('#app-content-vue') // Init legacy and new files views -processLegacyFilesViews() registerFavoritesView() +registerFilesView() registerRecentView() // Register preview service worker diff --git a/apps/files/src/mixins/filesSorting.ts b/apps/files/src/mixins/filesSorting.ts index 2f79a3eb171..e766ea631f3 100644 --- a/apps/files/src/mixins/filesSorting.ts +++ b/apps/files/src/mixins/filesSorting.ts @@ -23,14 +23,14 @@ import Vue from 'vue' import { mapState } from 'pinia' import { useViewConfigStore } from '../store/viewConfig' -import type { Navigation } from '../services/Navigation' +import type { NavigationService, Navigation } from '../services/Navigation' export default Vue.extend({ computed: { ...mapState(useViewConfigStore, ['getConfig', 'setSortingBy', 'toggleSortingDirection']), currentView(): Navigation { - return this.$navigation.active + return (this.$navigation as NavigationService).active as Navigation }, /** diff --git a/apps/files/src/router/router.js b/apps/files/src/router/router.ts index 0d833cd6464..5bb8f90770b 100644 --- a/apps/files/src/router/router.js +++ b/apps/files/src/router/router.ts @@ -19,26 +19,34 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. * */ -import Vue from 'vue' -import Router from 'vue-router' import { generateUrl } from '@nextcloud/router' import queryString from 'query-string' +import Router, { RawLocation, Route } from 'vue-router' +import Vue from 'vue' +import { ErrorHandler } from 'vue-router/types/router' Vue.use(Router) +// Prevent router from throwing errors when we're already on the page we're trying to go to +const originalPush = Router.prototype.push as (to, onComplete?, onAbort?) => Promise<Route> +Router.prototype.push = function push(to: RawLocation, onComplete?: ((route: Route) => void) | undefined, onAbort?: ErrorHandler | undefined): Promise<Route> { + if (onComplete || onAbort) return originalPush.call(this, to, onComplete, onAbort) + return originalPush.call(this, to).catch(err => err) +} + const router = new Router({ mode: 'history', // if index.php is in the url AND we got this far, then it's working: // let's keep using index.php in the url - base: generateUrl('/apps/files', ''), + base: generateUrl('/apps/files'), linkActiveClass: 'active', routes: [ { path: '/', // Pretending we're using the default view - alias: '/files', + redirect: { name: 'filelist' }, }, { path: '/:view/:fileid?', diff --git a/apps/files/src/services/Favorites.ts b/apps/files/src/services/Favorites.ts index 0e5411f08d3..2328a9e8af5 100644 --- a/apps/files/src/services/Favorites.ts +++ b/apps/files/src/services/Favorites.ts @@ -19,7 +19,7 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. * */ -import { File, Folder, parseWebdavPermissions } from '@nextcloud/files' +import { File, Folder, davParsePermissions } from '@nextcloud/files' import { generateRemoteUrl } from '@nextcloud/router' import { getClient, rootPath } from './WebdavClient' import { getCurrentUser } from '@nextcloud/auth' @@ -47,7 +47,7 @@ interface ResponseProps extends DAVResultResponseProps { const resultToNode = function(node: FileStat): File | Folder { const props = node.props as ResponseProps - const permissions = parseWebdavPermissions(props?.permissions) + const permissions = davParsePermissions(props?.permissions) const owner = getCurrentUser()?.uid as string const nodeData = { diff --git a/apps/files/src/services/FileInfo.js b/apps/files/src/services/FileInfo.js index c09af45f495..0b3b0040c26 100644 --- a/apps/files/src/services/FileInfo.js +++ b/apps/files/src/services/FileInfo.js @@ -21,6 +21,7 @@ */ import axios from '@nextcloud/axios' +import { davGetDefaultPropfind } from '@nextcloud/files' /** * @param {any} url - @@ -29,33 +30,7 @@ export default async function(url) { const response = await axios({ method: 'PROPFIND', url, - data: `<?xml version="1.0"?> - <d:propfind xmlns:d="DAV:" - xmlns:oc="http://owncloud.org/ns" - xmlns:nc="http://nextcloud.org/ns" - xmlns:ocs="http://open-collaboration-services.org/ns"> - <d:prop> - <d:getlastmodified /> - <d:getetag /> - <d:getcontenttype /> - <d:resourcetype /> - <oc:fileid /> - <oc:permissions /> - <oc:size /> - <d:getcontentlength /> - <nc:has-preview /> - <nc:mount-type /> - <nc:is-encrypted /> - <ocs:share-permissions /> - <nc:share-attributes /> - <oc:tags /> - <oc:favorite /> - <oc:comments-unread /> - <oc:owner-id /> - <oc:owner-display-name /> - <oc:share-types /> - </d:prop> - </d:propfind>`, + data: davGetDefaultPropfind(), }) // TODO: create new parser or use cdav-lib when available diff --git a/apps/files/src/services/Files.ts b/apps/files/src/services/Files.ts new file mode 100644 index 00000000000..b9d6f65a0b9 --- /dev/null +++ b/apps/files/src/services/Files.ts @@ -0,0 +1,102 @@ +/** + * @copyright Copyright (c) 2023 John Molakvoæ <skjnldsv@protonmail.com> + * + * @author John Molakvoæ <skjnldsv@protonmail.com> + * + * @license AGPL-3.0-or-later + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ +import type { ContentsWithRoot } from './Navigation' +import type { FileStat, ResponseDataDetailed, DAVResultResponseProps } from 'webdav' + +import { File, Folder, davParsePermissions } from '@nextcloud/files' +import { generateRemoteUrl } from '@nextcloud/router' +import { getCurrentUser } from '@nextcloud/auth' + +import { getClient, rootPath } from './WebdavClient' +import { getDefaultPropfind } from './DavProperties' +import { hashCode } from '../utils/hashUtils' +import logger from '../logger' + +const client = getClient() + +interface ResponseProps extends DAVResultResponseProps { + permissions: string, + fileid: number, + size: number, +} + +const resultToNode = function(node: FileStat): File | Folder { + const props = node.props as ResponseProps + const permissions = davParsePermissions(props?.permissions) + const owner = getCurrentUser()?.uid as string + + const source = generateRemoteUrl('dav' + rootPath + node.filename) + const id = props?.fileid < 0 + ? hashCode(source) + : props?.fileid as number || 0 + + const nodeData = { + id, + source, + mtime: new Date(node.lastmod), + mime: node.mime as string, + size: props?.size as number || 0, + permissions, + owner, + root: rootPath, + attributes: { + ...node, + ...props, + hasPreview: props?.['has-preview'], + failed: props?.fileid < 0, + }, + } + + delete nodeData.attributes.props + + return node.type === 'file' + ? new File(nodeData) + : new Folder(nodeData) +} + +export const getContents = async (path = '/'): Promise<ContentsWithRoot> => { + const propfindPayload = getDefaultPropfind() + + const contentsResponse = await client.getDirectoryContents(path, { + details: true, + data: propfindPayload, + includeSelf: true, + }) as ResponseDataDetailed<FileStat[]> + + const root = contentsResponse.data[0] + const contents = contentsResponse.data.slice(1) + if (root.filename !== path) { + throw new Error('Root node does not match requested path') + } + + return { + folder: resultToNode(root) as Folder, + contents: contents.map(result => { + try { + return resultToNode(result) + } catch (error) { + logger.error(`Invalid node detected '${result.basename}'`, { error }) + return null + } + }).filter(Boolean) as File[], + } +} diff --git a/apps/files/src/services/Navigation.ts b/apps/files/src/services/Navigation.ts index 56d3ba0b97d..8f8212783ca 100644 --- a/apps/files/src/services/Navigation.ts +++ b/apps/files/src/services/Navigation.ts @@ -96,22 +96,9 @@ export interface Navigation { * haven't customized their sorting column */ defaultSortKey?: string - - /** - * This view is sticky a legacy view. - * Here until all the views are migrated to Vue. - * @deprecated It will be removed in a near future - */ - legacy?: boolean - - /** - * An icon class. - * @deprecated It will be removed in a near future - */ - iconClass?: string } -export default class { +export class NavigationService { private _views: Navigation[] = [] private _currentView: Navigation | null = null @@ -131,14 +118,6 @@ export default class { throw e } - if (view.legacy) { - logger.warn('Legacy view detected, please migrate to Vue') - } - - if (view.iconClass) { - view.legacy = true - } - this._views.push(view) } @@ -192,18 +171,12 @@ const isValidNavigation = function(view: Navigation): boolean { throw new Error('Navigation caption is required for top-level views and must be a string') } - /** - * Legacy handle their content and icon differently - * TODO: remove when support for legacy views is removed - */ - if (!view.legacy) { - if (!view.getContents || typeof view.getContents !== 'function') { - throw new Error('Navigation getContents is required and must be a function') - } + if (!view.getContents || typeof view.getContents !== 'function') { + throw new Error('Navigation getContents is required and must be a function') + } - if (!view.icon || typeof view.icon !== 'string' || !isSvg(view.icon)) { - throw new Error('Navigation icon is required and must be a valid svg string') - } + if (!view.icon || typeof view.icon !== 'string' || !isSvg(view.icon)) { + throw new Error('Navigation icon is required and must be a valid svg string') } if (!('order' in view) || typeof view.order !== 'number') { diff --git a/apps/files/src/services/PreviewService.ts b/apps/files/src/services/PreviewService.ts index 840d6a48afa..e581257760a 100644 --- a/apps/files/src/services/PreviewService.ts +++ b/apps/files/src/services/PreviewService.ts @@ -26,8 +26,12 @@ const SWCacheName = 'previews' /** * Check if the preview is already cached by the service worker */ -export const isCachedPreview = function(previewUrl: string) { - return caches.open(SWCacheName) +export const isCachedPreview = function(previewUrl: string): Promise<boolean> { + if (!window?.caches?.open) { + return Promise.resolve(false) + } + + return window?.caches?.open(SWCacheName) .then(function(cache) { return cache.match(previewUrl) .then(function(response) { diff --git a/apps/files/src/services/Recent.ts b/apps/files/src/services/Recent.ts index d6468d6a60e..75044fb4579 100644 --- a/apps/files/src/services/Recent.ts +++ b/apps/files/src/services/Recent.ts @@ -19,7 +19,7 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. * */ -import { File, Folder, Permission, parseWebdavPermissions } from '@nextcloud/files' +import { File, Folder, Permission, davParsePermissions } from '@nextcloud/files' import { generateRemoteUrl } from '@nextcloud/router' import { getClient, rootPath } from './WebdavClient' import { getCurrentUser } from '@nextcloud/auth' @@ -94,7 +94,7 @@ interface ResponseProps extends DAVResultResponseProps { const resultToNode = function(node: FileStat): File | Folder { const props = node.props as ResponseProps - const permissions = parseWebdavPermissions(props?.permissions) + const permissions = davParsePermissions(props?.permissions) const owner = getCurrentUser()?.uid as string const nodeData = { diff --git a/apps/files/src/services/RouterService.ts b/apps/files/src/services/RouterService.ts index 55033f9c79c..7e3bd854e71 100644 --- a/apps/files/src/services/RouterService.ts +++ b/apps/files/src/services/RouterService.ts @@ -31,6 +31,18 @@ export default class RouterService { this._router = router } + get name(): string | null | undefined { + return this._router.currentRoute.name + } + + get query(): Dictionary<string | (string | null)[] | null | undefined> { + return this._router.currentRoute.query || {} + } + + get params(): Dictionary<string> { + return this._router.currentRoute.params || {} + } + /** * Trigger a route change on the files app * diff --git a/apps/files/src/views/FilesList.vue b/apps/files/src/views/FilesList.vue index 1a7ca5769aa..eb38d09e290 100644 --- a/apps/files/src/views/FilesList.vue +++ b/apps/files/src/views/FilesList.vue @@ -20,9 +20,7 @@ - --> <template> - <NcAppContent v-show="!currentView?.legacy" - :class="{'app-content--hidden': currentView?.legacy}" - data-cy-files-content> + <NcAppContent data-cy-files-content> <div class="files-list__header"> <!-- Current folder breadcrumbs --> <BreadCrumbs :path="dir" @reload="fetchContent" /> @@ -58,19 +56,25 @@ <!-- File list --> <FilesListVirtual v-else ref="filesListVirtual" + :current-folder="currentFolder" :current-view="currentView" - :nodes="dirContents" /> + :nodes="dirContentsSorted" /> </NcAppContent> </template> <script lang="ts"> -import { Folder, File, Node } from '@nextcloud/files' +import type { Route } from 'vue-router' +import type { Navigation, ContentsWithRoot } from '../services/Navigation.ts' +import type { UserConfig } from '../types.ts' + +import { Folder, Node } from '@nextcloud/files' import { join } from 'path' import { orderBy } from 'natural-orderby' import { translate } from '@nextcloud/l10n' import NcAppContent from '@nextcloud/vue/dist/Components/NcAppContent.js' import NcButton from '@nextcloud/vue/dist/Components/NcButton.js' import NcEmptyContent from '@nextcloud/vue/dist/Components/NcEmptyContent.js' +import NcIconSvgWrapper from '@nextcloud/vue/dist/Components/NcIconSvgWrapper.js' import NcLoadingIcon from '@nextcloud/vue/dist/Components/NcLoadingIcon.js' import Vue from 'vue' @@ -83,8 +87,6 @@ import BreadCrumbs from '../components/BreadCrumbs.vue' import FilesListVirtual from '../components/FilesListVirtual.vue' import filesSortingMixin from '../mixins/filesSorting.ts' import logger from '../logger.js' -import Navigation, { ContentsWithRoot } from '../services/Navigation.ts' -import NcIconSvgWrapper from '@nextcloud/vue/dist/Components/NcIconSvgWrapper.js' export default Vue.extend({ name: 'FilesList', @@ -126,32 +128,27 @@ export default Vue.extend({ }, computed: { - userConfig() { + userConfig(): UserConfig { return this.userConfigStore.userConfig }, - /** @return {Navigation} */ - currentView() { - return this.$navigation.active - || this.$navigation.views.find(view => view.id === 'files') + currentView(): Navigation { + return (this.$navigation.active + || this.$navigation.views.find(view => view.id === 'files')) as Navigation }, /** * The current directory query. - * - * @return {string} */ - dir() { + dir(): string { // Remove any trailing slash but leave root slash return (this.$route?.query?.dir || '/').replace(/^(.+)\/$/, '$1') }, /** * The current folder. - * - * @return {Folder|undefined} */ - currentFolder() { + currentFolder(): Folder|undefined { if (!this.currentView?.id) { return } @@ -165,10 +162,8 @@ export default Vue.extend({ /** * The current directory contents. - * - * @return {Node[]} */ - dirContents() { + dirContentsSorted(): Node[] { if (!this.currentView) { return [] } @@ -178,8 +173,7 @@ export default Vue.extend({ // Custom column must provide their own sorting methods if (customColumn?.sort && typeof customColumn.sort === 'function') { - const results = [...(this.currentFolder?._children || []).map(this.getNode).filter(file => file)] - .sort(customColumn.sort) + const results = [...this.dirContents].sort(customColumn.sort) return this.isAscSorting ? results : results.reverse() } @@ -198,16 +192,20 @@ export default Vue.extend({ const orders = new Array(identifiers.length).fill(this.isAscSorting ? 'asc' : 'desc') return orderBy( - [...(this.currentFolder?._children || []).map(this.getNode).filter(file => file)], + [...this.dirContents], identifiers, orders, ) }, + dirContents(): Node[] { + return (this.currentFolder?._children || []).map(this.getNode).filter(file => file) + }, + /** * The current directory is empty. */ - isEmptyDir() { + isEmptyDir(): boolean { return this.dirContents.length === 0 }, @@ -216,7 +214,7 @@ export default Vue.extend({ * But we already have a cached version of it * that is not empty. */ - isRefreshing() { + isRefreshing(): boolean { return this.currentFolder !== undefined && !this.isEmptyDir && this.loading @@ -225,7 +223,7 @@ export default Vue.extend({ /** * Route to the previous directory. */ - toPreviousDir() { + toPreviousDir(): Route { const dir = this.dir.split('/').slice(0, -1).join('/') || '/' return { ...this.$route, query: { dir } } }, @@ -257,10 +255,6 @@ export default Vue.extend({ methods: { async fetchContent() { - if (this.currentView?.legacy) { - return - } - this.loading = true const dir = this.dir const currentView = this.currentView @@ -272,8 +266,7 @@ export default Vue.extend({ } // Fetch the current dir contents - /** @type {Promise<ContentsWithRoot>} */ - this.promise = currentView.getContents(dir) + this.promise = currentView.getContents(dir) as Promise<ContentsWithRoot> try { const { folder, contents } = await this.promise logger.debug('Fetched contents', { dir, folder, contents }) @@ -333,12 +326,6 @@ export default Vue.extend({ overflow: hidden; flex-direction: column; max-height: 100%; - - // TODO: remove after all legacy views are migrated - // Hides the legacy app-content if shown view is not legacy - &:not(&--hidden)::v-deep + #app-content { - display: none; - } } $margin: 4px; diff --git a/apps/files/src/views/Navigation.cy.ts b/apps/files/src/views/Navigation.cy.ts index 8678465841a..a65016da297 100644 --- a/apps/files/src/views/Navigation.cy.ts +++ b/apps/files/src/views/Navigation.cy.ts @@ -2,9 +2,9 @@ import FolderSvg from '@mdi/svg/svg/folder.svg' import ShareSvg from '@mdi/svg/svg/share-variant.svg' import { createTestingPinia } from '@pinia/testing' -import NavigationService from '../services/Navigation' +import { NavigationService } from '../services/Navigation' import NavigationView from './Navigation.vue' -import router from '../router/router.js' +import router from '../router/router' import { useViewConfigStore } from '../store/viewConfig' describe('Navigation renders', () => { diff --git a/apps/files/src/views/Navigation.vue b/apps/files/src/views/Navigation.vue index 81ceac80a7f..9b1df413ccc 100644 --- a/apps/files/src/views/Navigation.vue +++ b/apps/files/src/views/Navigation.vue @@ -72,7 +72,7 @@ </NcAppNavigation> </template> -<script> +<script lang="ts"> import { emit, subscribe } from '@nextcloud/event-bus' import { translate } from '@nextcloud/l10n' import Cog from 'vue-material-design-icons/Cog.vue' @@ -83,7 +83,7 @@ import NcIconSvgWrapper from '@nextcloud/vue/dist/Components/NcIconSvgWrapper.js import { setPageHeading } from '../../../../core/src/OCP/accessibility.js' import { useViewConfigStore } from '../store/viewConfig.ts' import logger from '../logger.js' -import Navigation from '../services/Navigation.ts' +import type { NavigationService, Navigation } from '../services/Navigation.ts' import NavigationQuota from '../components/NavigationQuota.vue' import SettingsModal from './Settings.vue' @@ -102,7 +102,7 @@ export default { props: { // eslint-disable-next-line vue/prop-name-casing Navigation: { - type: Navigation, + type: Object as Navigation, required: true, }, }, @@ -125,18 +125,15 @@ export default { return this.$route?.params?.view || 'files' }, - /** @return {Navigation} */ - currentView() { + currentView(): Navigation { return this.views.find(view => view.id === this.currentViewId) }, - /** @return {Navigation[]} */ - views() { + views(): Navigation[] { return this.Navigation.views }, - /** @return {Navigation[]} */ - parentViews() { + parentViews(): Navigation[] { return this.views // filter child views .filter(view => !view.parent) @@ -146,8 +143,7 @@ export default { }) }, - /** @return {Navigation[]} */ - childViews() { + childViews(): Navigation[] { return this.views // filter parent views .filter(view => !!view.parent) @@ -165,17 +161,12 @@ export default { watch: { currentView(view, oldView) { - // If undefined, it means we're initializing the view - // This is handled by the legacy-view:initialized event - // TODO: remove when legacy views are dropped - if (view?.id === oldView?.id) { - return - } - - this.Navigation.setActive(view) - logger.debug('Navigation changed', { id: view.id, view }) + if (view.id !== oldView?.id) { + this.Navigation.setActive(view) + logger.debug('Navigation changed', { id: view.id, view }) - this.showView(view, oldView) + this.showView(view, oldView) + } }, }, @@ -184,70 +175,22 @@ export default { logger.debug('Navigation mounted. Showing requested view', { view: this.currentView }) this.showView(this.currentView) } - - subscribe('files:legacy-navigation:changed', this.onLegacyNavigationChanged) - - // TODO: remove this once the legacy navigation is gone - subscribe('files:legacy-view:initialized', () => { - logger.debug('Legacy view initialized', { ...this.currentView }) - this.showView(this.currentView) - }) }, methods: { - /** - * @param {Navigation} view the new active view - * @param {Navigation} oldView the old active view - */ - showView(view, oldView) { + showView(view: Navigation) { // Closing any opened sidebar window?.OCA?.Files?.Sidebar?.close?.() - - if (view?.legacy) { - const newAppContent = document.querySelector('#app-content #app-content-' + this.currentView.id + '.viewcontainer') - document.querySelectorAll('#app-content .viewcontainer').forEach(el => { - el.classList.add('hidden') - }) - newAppContent.classList.remove('hidden') - - // Triggering legacy navigation events - const { dir = '/' } = OC.Util.History.parseUrlQuery() - const params = { itemId: view.id, dir } - - logger.debug('Triggering legacy navigation event', params) - window.jQuery(newAppContent).trigger(new window.jQuery.Event('show', params)) - window.jQuery(newAppContent).trigger(new window.jQuery.Event('urlChanged', params)) - } - this.Navigation.setActive(view) setPageHeading(view.name) emit('files:navigation:changed', view) }, /** - * Coming from the legacy files app. - * TODO: remove when all views are migrated. - * - * @param {Navigation} view the new active view - */ - onLegacyNavigationChanged({ id } = { id: 'files' }) { - const view = this.Navigation.views.find(view => view.id === id) - if (view && view.legacy && view.id !== this.currentView.id) { - // Force update the current route as the request comes - // from the legacy files app router - this.$router.replace({ ...this.$route, params: { view: view.id } }) - this.Navigation.setActive(view) - this.showView(view) - } - }, - - /** * Expand/collapse a a view with children and permanently * save this setting in the server. - * - * @param {Navigation} view the view to toggle */ - onToggleExpand(view) { + onToggleExpand(view: Navigation) { // Invert state const isExpanded = this.isExpanded(view) // Update the view expanded state, might not be necessary @@ -258,10 +201,8 @@ export default { /** * Check if a view is expanded by user config * or fallback to the default value. - * - * @param {Navigation} view the view to check */ - isExpanded(view) { + isExpanded(view: Navigation): boolean { return typeof this.viewConfigStore.getConfig(view.id)?.expanded === 'boolean' ? this.viewConfigStore.getConfig(view.id).expanded === true : view.expanded === true @@ -269,10 +210,8 @@ export default { /** * Generate the route to a view - * - * @param {Navigation} view the view to toggle */ - generateToNavigation(view) { + generateToNavigation(view: Navigation) { if (view.params) { const { dir, fileid } = view.params return { name: 'filelist', params: view.params, query: { dir, fileid } } diff --git a/apps/files/src/views/Sidebar.vue b/apps/files/src/views/Sidebar.vue index 12581222f8e..65e4c302632 100644 --- a/apps/files/src/views/Sidebar.vue +++ b/apps/files/src/views/Sidebar.vue @@ -88,20 +88,22 @@ </NcAppSidebar> </template> <script> +import { emit } from '@nextcloud/event-bus' import { encodePath } from '@nextcloud/paths' +import { File, Folder } from '@nextcloud/files' +import { getCurrentUser } from '@nextcloud/auth' +import { Type as ShareTypes } from '@nextcloud/sharing' import $ from 'jquery' import axios from '@nextcloud/axios' -import { emit } from '@nextcloud/event-bus' import moment from '@nextcloud/moment' -import { Type as ShareTypes } from '@nextcloud/sharing' import NcAppSidebar from '@nextcloud/vue/dist/Components/NcAppSidebar.js' import NcActionButton from '@nextcloud/vue/dist/Components/NcActionButton.js' import NcEmptyContent from '@nextcloud/vue/dist/Components/NcEmptyContent.js' import FileInfo from '../services/FileInfo.js' -import SidebarTab from '../components/SidebarTab.vue' import LegacyView from '../components/LegacyView.vue' +import SidebarTab from '../components/SidebarTab.vue' import SystemTags from '../../../systemtags/src/components/SystemTags.vue' export default { @@ -253,7 +255,7 @@ export default { return { key: 'error', // force key to re-render subname: '', - title: '', + name: '', class: { 'app-sidebar--full': this.isFullScreen, }, @@ -263,7 +265,7 @@ export default { return { loading: this.loading, subname: '', - title: '', + name: '', class: { 'app-sidebar--full': this.isFullScreen, }, @@ -372,7 +374,13 @@ export default { */ setActiveTab(id) { OCA.Files.Sidebar.setActiveTab(id) - this.tabs.forEach(tab => tab.setIsActive(id === tab.id)) + this.tabs.forEach(tab => { + try { + tab.setIsActive(id === tab.id) + } catch (error) { + logger.error('Error while setting tab active state', { error, id: tab.id, tab }) + } + }) }, /** @@ -397,12 +405,18 @@ export default { </d:propertyupdate>`, }) - // TODO: Obliterate as soon as possible and use events with new files app - // Terrible fallback for legacy files: toggle filelist as well - if (OCA.Files && OCA.Files.App && OCA.Files.App.fileList && OCA.Files.App.fileList.fileActions) { - OCA.Files.App.fileList.fileActions.triggerAction('Favorite', OCA.Files.App.fileList.getModelForFile(this.fileInfo.name), OCA.Files.App.fileList) - } - + /** + * TODO: adjust this when the Sidebar is finally using File/Folder classes + * @see https://github.com/nextcloud/server/blob/8a75cb6e72acd42712ab9fea22296aa1af863ef5/apps/files/src/views/favorites.ts#L83-L115 + */ + const isDir = this.fileInfo.type === 'dir' + const Node = isDir ? Folder : File + emit(state ? 'files:favorites:added' : 'files:favorites:removed', new Node({ + fileid: this.fileInfo.id, + source: this.davPath, + root: `/files/${getCurrentUser().uid}`, + mime: isDir ? undefined : this.fileInfo.mimetype, + })) } catch (error) { OC.Notification.showTemporary(t('files', 'Unable to change the favourite state of the file')) console.error('Unable to change favourite state', error) @@ -437,39 +451,41 @@ export default { * @throws {Error} loading failure */ async open(path) { + if (!path || path.trim() === '') { + throw new Error(`Invalid path '${path}'`) + } + // update current opened file this.Sidebar.file = path - if (path && path.trim() !== '') { - // reset data, keep old fileInfo to not reload all tabs and just hide them - this.error = null - this.loading = true + // reset data, keep old fileInfo to not reload all tabs and just hide them + this.error = null + this.loading = true - try { - this.fileInfo = await FileInfo(this.davPath) - // adding this as fallback because other apps expect it - this.fileInfo.dir = this.file.split('/').slice(0, -1).join('/') - - // DEPRECATED legacy views - // TODO: remove - this.views.forEach(view => { - view.setFileInfo(this.fileInfo) - }) - - this.$nextTick(() => { - if (this.$refs.tabs) { - this.$refs.tabs.updateTabs() - } - this.setActiveTab(this.Sidebar.activeTab || this.tabs[0].id) - }) - } catch (error) { - this.error = t('files', 'Error while loading the file data') - console.error('Error while loading the file data', error) + try { + this.fileInfo = await FileInfo(this.davPath) + // adding this as fallback because other apps expect it + this.fileInfo.dir = this.file.split('/').slice(0, -1).join('/') + + // DEPRECATED legacy views + // TODO: remove + this.views.forEach(view => { + view.setFileInfo(this.fileInfo) + }) - throw new Error(error) - } finally { - this.loading = false - } + this.$nextTick(() => { + if (this.$refs.tabs) { + this.$refs.tabs.updateTabs() + } + this.setActiveTab(this.Sidebar.activeTab || this.tabs[0].id) + }) + } catch (error) { + this.error = t('files', 'Error while loading the file data') + console.error('Error while loading the file data', error) + + throw new Error(error) + } finally { + this.loading = false } }, diff --git a/apps/files/src/views/favorites.spec.ts b/apps/files/src/views/favorites.spec.ts index d39def283a9..b1340187244 100644 --- a/apps/files/src/views/favorites.spec.ts +++ b/apps/files/src/views/favorites.spec.ts @@ -27,7 +27,7 @@ import * as eventBus from '@nextcloud/event-bus' import { action } from '../actions/favoriteAction' import * as favoritesService from '../services/Favorites' -import NavigationService from '../services/Navigation' +import { NavigationService } from '../services/Navigation' import registerFavoritesView from './favorites' jest.mock('webdav/dist/node/request.js', () => ({ diff --git a/apps/files/src/views/favorites.ts b/apps/files/src/views/favorites.ts index 20baa2c582d..7485340a2fe 100644 --- a/apps/files/src/views/favorites.ts +++ b/apps/files/src/views/favorites.ts @@ -19,8 +19,7 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. * */ -import type { Navigation } from '../services/Navigation' -import type NavigationService from '../services/Navigation' +import type { Navigation, NavigationService } from '../services/Navigation' import { getLanguage, translate as t } from '@nextcloud/l10n' import FolderSvg from '@mdi/svg/svg/folder.svg?raw' import StarSvg from '@mdi/svg/svg/star.svg?raw' diff --git a/apps/files/src/views/files.ts b/apps/files/src/views/files.ts new file mode 100644 index 00000000000..baafc8572c2 --- /dev/null +++ b/apps/files/src/views/files.ts @@ -0,0 +1,41 @@ +/** + * @copyright Copyright (c) 2023 John Molakvoæ <skjnldsv@protonmail.com> + * + * @author John Molakvoæ <skjnldsv@protonmail.com> + * + * @license AGPL-3.0-or-later + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ +import type { NavigationService, Navigation } from '../services/Navigation' + +import { translate as t } from '@nextcloud/l10n' +import FolderSvg from '@mdi/svg/svg/folder.svg?raw' + +import { getContents } from '../services/Files' + +export default () => { + const Navigation = window.OCP.Files.Navigation as NavigationService + Navigation.register({ + id: 'files', + name: t('files', 'All files'), + caption: t('files', 'List of your files and folders.'), + + icon: FolderSvg, + order: 0, + + getContents, + } as Navigation) +} diff --git a/apps/files/src/views/recent.ts b/apps/files/src/views/recent.ts index 5a0dbd91860..3e0c51184e4 100644 --- a/apps/files/src/views/recent.ts +++ b/apps/files/src/views/recent.ts @@ -19,8 +19,7 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. * */ -import type NavigationService from '../services/Navigation' -import type { Navigation } from '../services/Navigation' +import type { NavigationService, Navigation } from '../services/Navigation' import { translate as t } from '@nextcloud/l10n' import HistorySvg from '@mdi/svg/svg/history.svg?raw' diff --git a/apps/files/templates/index.php b/apps/files/templates/index.php index c6f145bfe40..c974a37aa5b 100644 --- a/apps/files/templates/index.php +++ b/apps/files/templates/index.php @@ -1,41 +1,9 @@ -<?php /** @var \OCP\IL10N $l */ ?> -<?php $_['appNavigation']->printPage(); ?> +<!-- File navigation --> +<div id="app-navigation-files" role="navigation"></div> -<!-- New files vue container --> +<!-- File list vue container --> <div id="app-content-vue" class="hidden"></div> -<div id="app-content" tabindex="0"> - - <input type="checkbox" class="hidden-visually" id="showgridview" - aria-label="<?php p($l->t('Toggle grid view'))?>" - <?php if ($_['showgridview']) { ?>checked="checked" <?php } ?>/> - <label id="view-toggle" for="showgridview" tabindex="0" class="button <?php p($_['showgridview'] ? 'icon-toggle-filelist' : 'icon-toggle-pictures') ?>" - title="<?php p($_['showgridview'] ? $l->t('Show list view') : $l->t('Show grid view'))?>"></label> - - - <!-- Legacy views --> - <?php foreach ($_['appContents'] as $content) { ?> - <div id="app-content-<?php p($content['id']) ?>" class="hidden viewcontainer"> - <?php print_unescaped($content['content']) ?> - </div> - <?php } ?> - <div id="searchresults" class="hidden"></div> -</div><!-- closing app-content --> - <!-- config hints for javascript --> <input type="hidden" name="filesApp" id="filesApp" value="1" /> -<input type="hidden" name="usedSpacePercent" id="usedSpacePercent" value="<?php p($_['usedSpacePercent']); ?>" /> -<input type="hidden" name="owner" id="owner" value="<?php p($_['owner']); ?>" /> -<input type="hidden" name="ownerDisplayName" id="ownerDisplayName" value="<?php p($_['ownerDisplayName']); ?>" /> <input type="hidden" name="fileNotFound" id="fileNotFound" value="<?php p($_['fileNotFound']); ?>" /> -<?php if (!$_['isPublic']) :?> -<input type="hidden" name="allowShareWithLink" id="allowShareWithLink" value="<?php p($_['allowShareWithLink']) ?>" /> -<input type="hidden" name="defaultFileSorting" id="defaultFileSorting" value="<?php p($_['defaultFileSorting']) ?>" /> -<input type="hidden" name="defaultFileSortingDirection" id="defaultFileSortingDirection" value="<?php p($_['defaultFileSortingDirection']) ?>" /> -<input type="hidden" name="showHiddenFiles" id="showHiddenFiles" value="<?php p($_['showHiddenFiles']); ?>" /> -<input type="hidden" name="cropImagePreviews" id="cropImagePreviews" value="<?php p($_['cropImagePreviews']); ?>" /> -<?php endif; - -foreach ($_['hiddenFields'] as $name => $value) {?> -<input type="hidden" name="<?php p($name) ?>" id="<?php p($name) ?>" value="<?php p($value) ?>" /> -<?php } diff --git a/apps/files/tests/Controller/ViewControllerTest.php b/apps/files/tests/Controller/ViewControllerTest.php index 783c9c8bbbb..b997bbcad65 100644 --- a/apps/files/tests/Controller/ViewControllerTest.php +++ b/apps/files/tests/Controller/ViewControllerTest.php @@ -158,78 +158,33 @@ class ViewControllerTest extends TestCase { ->willReturnMap([ [$this->user->getUID(), 'files', 'file_sorting', 'name', 'name'], [$this->user->getUID(), 'files', 'file_sorting_direction', 'asc', 'asc'], + [$this->user->getUID(), 'files', 'files_sorting_configs', '{}', '{}'], [$this->user->getUID(), 'files', 'show_hidden', false, false], [$this->user->getUID(), 'files', 'crop_image_previews', true, true], [$this->user->getUID(), 'files', 'show_grid', true], ]); + + $baseFolderFiles = $this->getMockBuilder(Folder::class)->getMock(); + + $this->rootFolder->expects($this->any()) + ->method('getUserFolder') + ->with('testuser1') + ->willReturn($baseFolderFiles); $this->config ->expects($this->any()) ->method('getAppValue') ->willReturnArgument(2); - $this->shareManager->method('shareApiAllowLinks') - ->willReturn(true); - - $nav = new Template('files', 'appnavigation'); - $nav->assign('navigationItems', [ - 'files' => [ - 'id' => 'files', - 'appname' => 'files', - 'script' => 'list.php', - 'order' => 0, - 'name' => \OC::$server->getL10N('files')->t('All files'), - 'active' => false, - 'icon' => '', - 'type' => 'link', - 'classes' => '', - 'expanded' => false, - 'unread' => 0, - ], - 'systemtagsfilter' => [ - 'id' => 'systemtagsfilter', - 'appname' => 'systemtags', - 'script' => 'list.php', - 'order' => 25, - 'name' => \OC::$server->getL10N('systemtags')->t('Tags'), - 'active' => false, - 'icon' => '', - 'type' => 'link', - 'classes' => '', - 'expanded' => false, - 'unread' => 0, - ], - ]); $expected = new Http\TemplateResponse( 'files', 'index', [ - 'usedSpacePercent' => 123, - 'owner' => 'MyName', - 'ownerDisplayName' => 'MyDisplayName', - 'isPublic' => false, - 'defaultFileSorting' => 'basename', - 'defaultFileSortingDirection' => 'asc', - 'showHiddenFiles' => 0, - 'cropImagePreviews' => 1, 'fileNotFound' => 0, - 'allowShareWithLink' => 'yes', - 'appNavigation' => $nav, - 'appContents' => [ - 'files' => [ - 'id' => 'files', - 'content' => null, - ], - 'systemtagsfilter' => [ - 'id' => 'systemtagsfilter', - 'content' => null, - ], - ], - 'hiddenFields' => [], - 'showgridview' => null ] ); $policy = new Http\ContentSecurityPolicy(); + $policy->addAllowedWorkerSrcDomain('\'self\''); $policy->addAllowedFrameDomain('\'self\''); $expected->setContentSecurityPolicy($policy); @@ -248,100 +203,6 @@ class ViewControllerTest extends TestCase { $this->assertEquals($expected, $this->viewController->index('MyDir', 'MyView')); } - public function testShowFileRouteWithFolder() { - $node = $this->getMockBuilder(Folder::class)->getMock(); - $node->expects($this->once()) - ->method('getPath') - ->willReturn('/testuser1/files/test/sub'); - - $baseFolder = $this->getMockBuilder(Folder::class)->getMock(); - - $this->rootFolder->expects($this->once()) - ->method('getUserFolder') - ->with('testuser1') - ->willReturn($baseFolder); - - $baseFolder->expects($this->once()) - ->method('getById') - ->with(123) - ->willReturn([$node]); - $baseFolder->expects($this->once()) - ->method('getRelativePath') - ->with('/testuser1/files/test/sub') - ->willReturn('/test/sub'); - - $this->urlGenerator - ->expects($this->once()) - ->method('linkToRoute') - ->with('files.view.index', ['dir' => '/test/sub']) - ->willReturn('/apps/files/?dir=/test/sub'); - - $expected = new Http\RedirectResponse('/apps/files/?dir=/test/sub'); - $this->assertEquals($expected, $this->viewController->index('', '', '123')); - } - - public function testShowFileRouteWithFile() { - $parentNode = $this->getMockBuilder(Folder::class)->getMock(); - $parentNode->expects($this->once()) - ->method('getPath') - ->willReturn('testuser1/files/test'); - - $baseFolder = $this->getMockBuilder(Folder::class)->getMock(); - - $this->rootFolder->expects($this->once()) - ->method('getUserFolder') - ->with('testuser1') - ->willReturn($baseFolder); - - $node = $this->getMockBuilder(File::class)->getMock(); - $node->expects($this->once()) - ->method('getParent') - ->willReturn($parentNode); - $node->expects($this->once()) - ->method('getName') - ->willReturn('somefile.txt'); - - $baseFolder->expects($this->once()) - ->method('getById') - ->with(123) - ->willReturn([$node]); - $baseFolder->expects($this->once()) - ->method('getRelativePath') - ->with('testuser1/files/test') - ->willReturn('/test'); - - $this->urlGenerator - ->expects($this->once()) - ->method('linkToRoute') - ->with('files.view.index', ['dir' => '/test', 'scrollto' => 'somefile.txt']) - ->willReturn('/apps/files/?dir=/test/sub&scrollto=somefile.txt'); - - $expected = new Http\RedirectResponse('/apps/files/?dir=/test/sub&scrollto=somefile.txt'); - $this->assertEquals($expected, $this->viewController->index('', '', '123')); - } - - public function testShowFileRouteWithInvalidFileId() { - $baseFolder = $this->getMockBuilder(Folder::class)->getMock(); - $this->rootFolder->expects($this->once()) - ->method('getUserFolder') - ->with('testuser1') - ->willReturn($baseFolder); - - $baseFolder->expects($this->once()) - ->method('getById') - ->with(123) - ->willReturn([]); - - $this->urlGenerator->expects($this->once()) - ->method('linkToRoute') - ->with('files.view.index', ['fileNotFound' => true]) - ->willReturn('redirect.url'); - - $response = $this->viewController->index('', 'MyView', '123'); - $this->assertInstanceOf('OCP\AppFramework\Http\RedirectResponse', $response); - $this->assertEquals('redirect.url', $response->getRedirectURL()); - } - public function testShowFileRouteWithTrashedFile() { $this->appManager->expects($this->once()) ->method('isEnabledForUser') @@ -356,7 +217,7 @@ class ViewControllerTest extends TestCase { $baseFolderFiles = $this->getMockBuilder(Folder::class)->getMock(); $baseFolderTrash = $this->getMockBuilder(Folder::class)->getMock(); - $this->rootFolder->expects($this->once()) + $this->rootFolder->expects($this->any()) ->method('getUserFolder') ->with('testuser1') ->willReturn($baseFolderFiles); @@ -365,7 +226,7 @@ class ViewControllerTest extends TestCase { ->with('testuser1/files_trashbin/files/') ->willReturn($baseFolderTrash); - $baseFolderFiles->expects($this->once()) + $baseFolderFiles->expects($this->any()) ->method('getById') ->with(123) ->willReturn([]); @@ -374,9 +235,6 @@ class ViewControllerTest extends TestCase { $node->expects($this->once()) ->method('getParent') ->willReturn($parentNode); - $node->expects($this->once()) - ->method('getName') - ->willReturn('somefile.txt'); $baseFolderTrash->expects($this->once()) ->method('getById') @@ -390,10 +248,10 @@ class ViewControllerTest extends TestCase { $this->urlGenerator ->expects($this->once()) ->method('linkToRoute') - ->with('files.view.index', ['view' => 'trashbin', 'dir' => '/test.d1462861890/sub', 'scrollto' => 'somefile.txt']) - ->willReturn('/apps/files/?view=trashbin&dir=/test.d1462861890/sub&scrollto=somefile.txt'); + ->with('files.view.indexViewFileid', ['view' => 'trashbin', 'dir' => '/test.d1462861890/sub', 'fileid' => '123']) + ->willReturn('/apps/files/trashbin/123?dir=/test.d1462861890/sub'); - $expected = new Http\RedirectResponse('/apps/files/?view=trashbin&dir=/test.d1462861890/sub&scrollto=somefile.txt'); + $expected = new Http\RedirectResponse('/apps/files/trashbin/123?dir=/test.d1462861890/sub'); $this->assertEquals($expected, $this->viewController->index('', '', '123')); } } diff --git a/apps/files_external/l10n/sr.js b/apps/files_external/l10n/sr.js index 925e2910325..1476adfb42b 100644 --- a/apps/files_external/l10n/sr.js +++ b/apps/files_external/l10n/sr.js @@ -104,8 +104,19 @@ OC.L10N.register( "External storage support" : "Подршка за спољашње складиште", "Adds basic external storage support" : "Додаје основу подршку за спољна складишта", "This application enables administrators to configure connections to external storage providers, such as FTP servers, S3 or SWIFT object stores, other Nextcloud servers, WebDAV servers, and more. Administrators can choose which types of storage to enable and can mount these storage locations for a user, a group, or the entire system. Users will see a new folder appear in their root Nextcloud directory, which they can access and use like any other Nextcloud folder. External storage also allows users to share files stored in these external locations. In these cases, the credentials for the owner of the file are used when the recipient requests the file from external storage, thereby ensuring that the recipient can access the shared file.\n\nExternal storage can be configured using the GUI or at the command line. This second option provides the advanced user with more flexibility for configuring bulk external storage mounts and setting mount priorities. More information is available in the external storage GUI documentation and the external storage Configuration File documentation." : "Ова апликација омогућава администраторима да подесе конекције на спољашња складишта, као што су FTP сервери, S3 или SWIFT објектна складишта, други Некстклауд сервери, WebDAV сервери и још много других. Администратори могу да одаберу које типове складишта желе да омогуће и могу да монтирају локације ових складишта посебно за корисника, за групу или за цео систем. Корисници ће видети нову фасциклу која ће се појавити у кореном директоријуму, којој могу да приступају и да је користе као и било коју другу Некстклауд фасциклу. Спољашња складишта такође омогућавају корисницима и да деле фајлове смештене на овим спољашњим локацијама. У овим случајевима, када неко затражи приступ фајлу из спољашњег складишта користе се акредитиви власника фајла, омогућавајући тако да прималац може да приступи дељеном фајлу.\n\nСпољашње складиште се може конфигурисати графички или командном линијом. Друга опција пружа више флексибилности напредним корисницима када треба монтирати велики број складишта и подесити велики број приоритета монтирања. Више информација је доступно у GUI документацији спољашњег складишта и у документацији Конфигурационог Фајла спољашњег складишта.", + "Enter missing credentials" : "Унесите корисничке акредитиве који недостају", + "Unable to update this external storage config. {statusMessage}" : "Не може да се ажурира конфигурација овог спољног складишта. {statusMessage}", + "New configuration successfully saved" : "Нова конфигурација је успешно сачувана", + "There was an error with this external storage." : "Дошло је до грешке у вези са овим спољним складиштем.", + "We were unable to check the external storage {basename}" : "Нисмо успели да проверимо спољно складиште {basename}", + "Examine this faulty external storage configuration" : "Испитајте ову неисправну конфигурацију спољног складишта", "Open in files" : "Отвори у фајловима", + "There was an error with this external storage. Do you want to review this mount point config in the settings page?" : "Дошло је до грешке у вези са овим спољним складиштем. Желите ли да преиспитате конфигурацију ове тачке монтирања на страници подешавања?", "External mount error" : "Спољна грешка при монтирању", + "List of external storage." : "Листа спољних складишта.", + "There is no external storage configured. You can configure them in your Personal settings." : "Није конфигурисано ниједно спољно складиште. Можете да их подесите у својим Личним подешавањима.", + "There is no external storage configured and you don't have the permission to configure them." : "Није конфигурисано ниједно спољашње складиште и немате потребне дозволе да их конфигуришете.", + "No external storage" : "Нема ниједног спољашњег складишта", "Storage type" : "Тип складишта", "Unknown" : "Непознато", "Scope" : "Опсег", diff --git a/apps/files_external/l10n/sr.json b/apps/files_external/l10n/sr.json index 5b37f4c06e6..5c71fdf905b 100644 --- a/apps/files_external/l10n/sr.json +++ b/apps/files_external/l10n/sr.json @@ -102,8 +102,19 @@ "External storage support" : "Подршка за спољашње складиште", "Adds basic external storage support" : "Додаје основу подршку за спољна складишта", "This application enables administrators to configure connections to external storage providers, such as FTP servers, S3 or SWIFT object stores, other Nextcloud servers, WebDAV servers, and more. Administrators can choose which types of storage to enable and can mount these storage locations for a user, a group, or the entire system. Users will see a new folder appear in their root Nextcloud directory, which they can access and use like any other Nextcloud folder. External storage also allows users to share files stored in these external locations. In these cases, the credentials for the owner of the file are used when the recipient requests the file from external storage, thereby ensuring that the recipient can access the shared file.\n\nExternal storage can be configured using the GUI or at the command line. This second option provides the advanced user with more flexibility for configuring bulk external storage mounts and setting mount priorities. More information is available in the external storage GUI documentation and the external storage Configuration File documentation." : "Ова апликација омогућава администраторима да подесе конекције на спољашња складишта, као што су FTP сервери, S3 или SWIFT објектна складишта, други Некстклауд сервери, WebDAV сервери и још много других. Администратори могу да одаберу које типове складишта желе да омогуће и могу да монтирају локације ових складишта посебно за корисника, за групу или за цео систем. Корисници ће видети нову фасциклу која ће се појавити у кореном директоријуму, којој могу да приступају и да је користе као и било коју другу Некстклауд фасциклу. Спољашња складишта такође омогућавају корисницима и да деле фајлове смештене на овим спољашњим локацијама. У овим случајевима, када неко затражи приступ фајлу из спољашњег складишта користе се акредитиви власника фајла, омогућавајући тако да прималац може да приступи дељеном фајлу.\n\nСпољашње складиште се може конфигурисати графички или командном линијом. Друга опција пружа више флексибилности напредним корисницима када треба монтирати велики број складишта и подесити велики број приоритета монтирања. Више информација је доступно у GUI документацији спољашњег складишта и у документацији Конфигурационог Фајла спољашњег складишта.", + "Enter missing credentials" : "Унесите корисничке акредитиве који недостају", + "Unable to update this external storage config. {statusMessage}" : "Не може да се ажурира конфигурација овог спољног складишта. {statusMessage}", + "New configuration successfully saved" : "Нова конфигурација је успешно сачувана", + "There was an error with this external storage." : "Дошло је до грешке у вези са овим спољним складиштем.", + "We were unable to check the external storage {basename}" : "Нисмо успели да проверимо спољно складиште {basename}", + "Examine this faulty external storage configuration" : "Испитајте ову неисправну конфигурацију спољног складишта", "Open in files" : "Отвори у фајловима", + "There was an error with this external storage. Do you want to review this mount point config in the settings page?" : "Дошло је до грешке у вези са овим спољним складиштем. Желите ли да преиспитате конфигурацију ове тачке монтирања на страници подешавања?", "External mount error" : "Спољна грешка при монтирању", + "List of external storage." : "Листа спољних складишта.", + "There is no external storage configured. You can configure them in your Personal settings." : "Није конфигурисано ниједно спољно складиште. Можете да их подесите у својим Личним подешавањима.", + "There is no external storage configured and you don't have the permission to configure them." : "Није конфигурисано ниједно спољашње складиште и немате потребне дозволе да их конфигуришете.", + "No external storage" : "Нема ниједног спољашњег складишта", "Storage type" : "Тип складишта", "Unknown" : "Непознато", "Scope" : "Опсег", diff --git a/apps/files_external/src/main.ts b/apps/files_external/src/main.ts index e72cb8673d0..250ad51e38f 100644 --- a/apps/files_external/src/main.ts +++ b/apps/files_external/src/main.ts @@ -19,8 +19,7 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. * */ -import type NavigationService from '../../files/src/services/Navigation' -import type { Navigation } from '../../files/src/services/Navigation' +import type { NavigationService, Navigation } from '../../files/src/services/Navigation' import { translate as t } from '@nextcloud/l10n' import { loadState } from '@nextcloud/initial-state' diff --git a/apps/files_reminders/l10n/cs.js b/apps/files_reminders/l10n/cs.js new file mode 100644 index 00000000000..073ddbe340e --- /dev/null +++ b/apps/files_reminders/l10n/cs.js @@ -0,0 +1,29 @@ +OC.L10N.register( + "files_reminders", + { + "File reminders" : "Připomínky souborů", + "Reminder for {name}" : "Připomínka ohledně {name}", + "View file" : "Zobrazit soubor", + "View folder" : "Zobrazit složku", + "Set file reminders" : "Nastavit připomínky souborů", + "**📣 File reminders**\n\nSet file reminders." : "**📣 Připomínky souborů**\n\nNastavte připomínky souborů.", + "Back" : "Zpět", + "Clear reminder" : "Vyčistit připomínku", + "Set custom reminder" : "Nastavit uživatelsky určenou připomínku", + "Later today" : "Později dnes", + "Set reminder for later today" : "Nastavit připomínku na později dnes", + "Tomorrow" : "Zítra", + "Set reminder for tomorrow" : "Nastavit připomínku na zítra", + "This weekend" : "Tento víkend", + "Set reminder for this weekend" : "Nastavit připomínku na tento víkend", + "Next week" : "Příští týden", + "Set reminder for next week" : "Nastavit připomínku pro příští týden", + "Set reminder at custom date & time" : "Nastavit připomínku na uživatelsky určené datum a čas", + "Reminder set for \"{fileName}\"" : "Nastavena připomínka ohledně „{fileName}“", + "Failed to set reminder" : "Připomínku se nepodařilo nastavit", + "Please choose a valid date & time" : "Zvolte platný datum a čas", + "Reminder cleared" : "Připomínka vyčištěna", + "Failed to clear reminder" : "Připomínku se nepodařilo vyčistit", + "Failed to load reminder" : "Připomínku se nepodařilo načíst" +}, +"nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n <= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;"); diff --git a/apps/files_reminders/l10n/cs.json b/apps/files_reminders/l10n/cs.json new file mode 100644 index 00000000000..abbcb30aede --- /dev/null +++ b/apps/files_reminders/l10n/cs.json @@ -0,0 +1,27 @@ +{ "translations": { + "File reminders" : "Připomínky souborů", + "Reminder for {name}" : "Připomínka ohledně {name}", + "View file" : "Zobrazit soubor", + "View folder" : "Zobrazit složku", + "Set file reminders" : "Nastavit připomínky souborů", + "**📣 File reminders**\n\nSet file reminders." : "**📣 Připomínky souborů**\n\nNastavte připomínky souborů.", + "Back" : "Zpět", + "Clear reminder" : "Vyčistit připomínku", + "Set custom reminder" : "Nastavit uživatelsky určenou připomínku", + "Later today" : "Později dnes", + "Set reminder for later today" : "Nastavit připomínku na později dnes", + "Tomorrow" : "Zítra", + "Set reminder for tomorrow" : "Nastavit připomínku na zítra", + "This weekend" : "Tento víkend", + "Set reminder for this weekend" : "Nastavit připomínku na tento víkend", + "Next week" : "Příští týden", + "Set reminder for next week" : "Nastavit připomínku pro příští týden", + "Set reminder at custom date & time" : "Nastavit připomínku na uživatelsky určené datum a čas", + "Reminder set for \"{fileName}\"" : "Nastavena připomínka ohledně „{fileName}“", + "Failed to set reminder" : "Připomínku se nepodařilo nastavit", + "Please choose a valid date & time" : "Zvolte platný datum a čas", + "Reminder cleared" : "Připomínka vyčištěna", + "Failed to clear reminder" : "Připomínku se nepodařilo vyčistit", + "Failed to load reminder" : "Připomínku se nepodařilo načíst" +},"pluralForm" :"nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n <= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;" +}
\ No newline at end of file diff --git a/apps/files_reminders/l10n/de_DE.js b/apps/files_reminders/l10n/de_DE.js index 0b339ba43fc..a98df1b0676 100644 --- a/apps/files_reminders/l10n/de_DE.js +++ b/apps/files_reminders/l10n/de_DE.js @@ -10,18 +10,18 @@ OC.L10N.register( "Back" : "Zurück", "Clear reminder" : "Erinnerung löschen", "Set custom reminder" : "Benutzerdefinierte Erinnerung erstellen", - "Later today" : "Später am Tage", - "Set reminder for later today" : "Erinnerung für später am Tage erstellen", + "Later today" : "Später heute", + "Set reminder for later today" : "Erinnerung für später heute erstellen", "Tomorrow" : "Morgen", "Set reminder for tomorrow" : "Erinnerung für morgen erstellen", "This weekend" : "Dieses Wochenende", "Set reminder for this weekend" : "Erinnerung für kommendes Wochenende erstellen", "Next week" : "Nächste Woche", "Set reminder for next week" : "Erinnerung für nächste Woche erstellen", - "Set reminder at custom date & time" : "Erinnerung für benutzerdefinierten Zeitpunkt & Tag setzen", + "Set reminder at custom date & time" : "Erinnerung für benutzerdefinierten Zeitpunkt und Tag erstellen", "Reminder set for \"{fileName}\"" : "Erinnerung für \"{filename}\" gesetzt", "Failed to set reminder" : "Fehler beim Setzen der Erinnerung", - "Please choose a valid date & time" : "Bitte einen gültigen Zeitpunkt & Tag setzen", + "Please choose a valid date & time" : "Bitte gültiges Datum und Uhrzeit wählen", "Reminder cleared" : "Erinnerung gelöscht", "Failed to clear reminder" : "Fehler beim Löschen der Erinnerung", "Failed to load reminder" : "Fehler beim Laden der Erinnerung" diff --git a/apps/files_reminders/l10n/de_DE.json b/apps/files_reminders/l10n/de_DE.json index 7ee4d14a943..e9dd9093595 100644 --- a/apps/files_reminders/l10n/de_DE.json +++ b/apps/files_reminders/l10n/de_DE.json @@ -8,18 +8,18 @@ "Back" : "Zurück", "Clear reminder" : "Erinnerung löschen", "Set custom reminder" : "Benutzerdefinierte Erinnerung erstellen", - "Later today" : "Später am Tage", - "Set reminder for later today" : "Erinnerung für später am Tage erstellen", + "Later today" : "Später heute", + "Set reminder for later today" : "Erinnerung für später heute erstellen", "Tomorrow" : "Morgen", "Set reminder for tomorrow" : "Erinnerung für morgen erstellen", "This weekend" : "Dieses Wochenende", "Set reminder for this weekend" : "Erinnerung für kommendes Wochenende erstellen", "Next week" : "Nächste Woche", "Set reminder for next week" : "Erinnerung für nächste Woche erstellen", - "Set reminder at custom date & time" : "Erinnerung für benutzerdefinierten Zeitpunkt & Tag setzen", + "Set reminder at custom date & time" : "Erinnerung für benutzerdefinierten Zeitpunkt und Tag erstellen", "Reminder set for \"{fileName}\"" : "Erinnerung für \"{filename}\" gesetzt", "Failed to set reminder" : "Fehler beim Setzen der Erinnerung", - "Please choose a valid date & time" : "Bitte einen gültigen Zeitpunkt & Tag setzen", + "Please choose a valid date & time" : "Bitte gültiges Datum und Uhrzeit wählen", "Reminder cleared" : "Erinnerung gelöscht", "Failed to clear reminder" : "Fehler beim Löschen der Erinnerung", "Failed to load reminder" : "Fehler beim Laden der Erinnerung" diff --git a/apps/files_reminders/l10n/el.js b/apps/files_reminders/l10n/el.js new file mode 100644 index 00000000000..1f4d4351192 --- /dev/null +++ b/apps/files_reminders/l10n/el.js @@ -0,0 +1,29 @@ +OC.L10N.register( + "files_reminders", + { + "File reminders" : "Υπενθυμίσεις αρχείων", + "Reminder for {name}" : "Υπενθύμιση για {name}", + "View file" : "Προβολή αρχείου", + "View folder" : "Προβολή φακέλου", + "Set file reminders" : "Ορίστε υπενθυμίσεις αρχείων", + "**📣 File reminders**\n\nSet file reminders." : "**📣 Υπενθυμίσεις αρχείων**\n\nΟρίστε υπενθυμίσεις αρχείων.", + "Back" : "Επιστροφή", + "Clear reminder" : "Εκκαθάριση υπενθύμισης", + "Set custom reminder" : "Ορισμός προσαρμοσμένης υπενθύμισης", + "Later today" : "Αργότερα σήμερα", + "Set reminder for later today" : "Ορισμός υπενθύμισης για αργότερα σήμερα", + "Tomorrow" : "Αύριο", + "Set reminder for tomorrow" : "Ορισμός υπενθύμισης για αύριο", + "This weekend" : "Αυτό το Σαββατοκύριακο", + "Set reminder for this weekend" : "Ορίστε υπενθύμιση για αυτό το Σαββατοκύριακο", + "Next week" : "Επόμενη εβδομάδα", + "Set reminder for next week" : "Ορίστε υπενθύμιση για την επόμενη εβδομάδα", + "Set reminder at custom date & time" : "Ορίστε την υπενθύμιση σε προσαρμοσμένη ημερομηνία και ώρα", + "Reminder set for \"{fileName}\"" : "Ορίστηκε υπενθύμιση για \"{fileName}\"", + "Failed to set reminder" : "Αποτυχία ορισμού υπενθύμισης", + "Please choose a valid date & time" : "Επιλέξτε μια έγκυρη ημερομηνία και ώρα", + "Reminder cleared" : "Η υπενθύμιση διαγράφηκε", + "Failed to clear reminder" : "Αποτυχία εκκαθάρισης της υπενθύμισης", + "Failed to load reminder" : "Η φόρτωση της υπενθύμισης απέτυχε" +}, +"nplurals=2; plural=(n != 1);"); diff --git a/apps/files_reminders/l10n/el.json b/apps/files_reminders/l10n/el.json new file mode 100644 index 00000000000..26affab05ca --- /dev/null +++ b/apps/files_reminders/l10n/el.json @@ -0,0 +1,27 @@ +{ "translations": { + "File reminders" : "Υπενθυμίσεις αρχείων", + "Reminder for {name}" : "Υπενθύμιση για {name}", + "View file" : "Προβολή αρχείου", + "View folder" : "Προβολή φακέλου", + "Set file reminders" : "Ορίστε υπενθυμίσεις αρχείων", + "**📣 File reminders**\n\nSet file reminders." : "**📣 Υπενθυμίσεις αρχείων**\n\nΟρίστε υπενθυμίσεις αρχείων.", + "Back" : "Επιστροφή", + "Clear reminder" : "Εκκαθάριση υπενθύμισης", + "Set custom reminder" : "Ορισμός προσαρμοσμένης υπενθύμισης", + "Later today" : "Αργότερα σήμερα", + "Set reminder for later today" : "Ορισμός υπενθύμισης για αργότερα σήμερα", + "Tomorrow" : "Αύριο", + "Set reminder for tomorrow" : "Ορισμός υπενθύμισης για αύριο", + "This weekend" : "Αυτό το Σαββατοκύριακο", + "Set reminder for this weekend" : "Ορίστε υπενθύμιση για αυτό το Σαββατοκύριακο", + "Next week" : "Επόμενη εβδομάδα", + "Set reminder for next week" : "Ορίστε υπενθύμιση για την επόμενη εβδομάδα", + "Set reminder at custom date & time" : "Ορίστε την υπενθύμιση σε προσαρμοσμένη ημερομηνία και ώρα", + "Reminder set for \"{fileName}\"" : "Ορίστηκε υπενθύμιση για \"{fileName}\"", + "Failed to set reminder" : "Αποτυχία ορισμού υπενθύμισης", + "Please choose a valid date & time" : "Επιλέξτε μια έγκυρη ημερομηνία και ώρα", + "Reminder cleared" : "Η υπενθύμιση διαγράφηκε", + "Failed to clear reminder" : "Αποτυχία εκκαθάρισης της υπενθύμισης", + "Failed to load reminder" : "Η φόρτωση της υπενθύμισης απέτυχε" +},"pluralForm" :"nplurals=2; plural=(n != 1);" +}
\ No newline at end of file diff --git a/apps/files_reminders/l10n/en_GB.js b/apps/files_reminders/l10n/en_GB.js new file mode 100644 index 00000000000..0c8420db0c9 --- /dev/null +++ b/apps/files_reminders/l10n/en_GB.js @@ -0,0 +1,29 @@ +OC.L10N.register( + "files_reminders", + { + "File reminders" : "File reminders", + "Reminder for {name}" : "Reminder for {name}", + "View file" : "View file", + "View folder" : "View folder", + "Set file reminders" : "Set file reminders", + "**📣 File reminders**\n\nSet file reminders." : "**📣 File reminders**\n\nSet file reminders.", + "Back" : "Back", + "Clear reminder" : "Clear reminder", + "Set custom reminder" : "Set custom reminder", + "Later today" : "Later today", + "Set reminder for later today" : "Set reminder for later today", + "Tomorrow" : "Tomorrow", + "Set reminder for tomorrow" : "Set reminder for tomorrow", + "This weekend" : "This weekend", + "Set reminder for this weekend" : "Set reminder for this weekend", + "Next week" : "Next week", + "Set reminder for next week" : "Set reminder for next week", + "Set reminder at custom date & time" : "Set reminder at custom date & time", + "Reminder set for \"{fileName}\"" : "Reminder set for \"{fileName}\"", + "Failed to set reminder" : "Failed to set reminder", + "Please choose a valid date & time" : "Please choose a valid date & time", + "Reminder cleared" : "Reminder cleared", + "Failed to clear reminder" : "Failed to clear reminder", + "Failed to load reminder" : "Failed to load reminder" +}, +"nplurals=2; plural=(n != 1);"); diff --git a/apps/files_reminders/l10n/en_GB.json b/apps/files_reminders/l10n/en_GB.json new file mode 100644 index 00000000000..fae0dd9302d --- /dev/null +++ b/apps/files_reminders/l10n/en_GB.json @@ -0,0 +1,27 @@ +{ "translations": { + "File reminders" : "File reminders", + "Reminder for {name}" : "Reminder for {name}", + "View file" : "View file", + "View folder" : "View folder", + "Set file reminders" : "Set file reminders", + "**📣 File reminders**\n\nSet file reminders." : "**📣 File reminders**\n\nSet file reminders.", + "Back" : "Back", + "Clear reminder" : "Clear reminder", + "Set custom reminder" : "Set custom reminder", + "Later today" : "Later today", + "Set reminder for later today" : "Set reminder for later today", + "Tomorrow" : "Tomorrow", + "Set reminder for tomorrow" : "Set reminder for tomorrow", + "This weekend" : "This weekend", + "Set reminder for this weekend" : "Set reminder for this weekend", + "Next week" : "Next week", + "Set reminder for next week" : "Set reminder for next week", + "Set reminder at custom date & time" : "Set reminder at custom date & time", + "Reminder set for \"{fileName}\"" : "Reminder set for \"{fileName}\"", + "Failed to set reminder" : "Failed to set reminder", + "Please choose a valid date & time" : "Please choose a valid date & time", + "Reminder cleared" : "Reminder cleared", + "Failed to clear reminder" : "Failed to clear reminder", + "Failed to load reminder" : "Failed to load reminder" +},"pluralForm" :"nplurals=2; plural=(n != 1);" +}
\ No newline at end of file diff --git a/apps/files_reminders/l10n/sv.js b/apps/files_reminders/l10n/sv.js new file mode 100644 index 00000000000..eace66bc11c --- /dev/null +++ b/apps/files_reminders/l10n/sv.js @@ -0,0 +1,29 @@ +OC.L10N.register( + "files_reminders", + { + "File reminders" : "Filpåminnelser", + "Reminder for {name}" : "Påminnelse för {name}", + "View file" : "Visa fil", + "View folder" : "Visa mapp", + "Set file reminders" : "Ställ in filpåminnelser", + "**📣 File reminders**\n\nSet file reminders." : "**📣 Filpåminnelser**\n\nStäll in filpåminnelser.", + "Back" : "Tillbaka", + "Clear reminder" : "Rensa påminnelse", + "Set custom reminder" : "Ställ in anpassad påminnelse", + "Later today" : "Senare idag", + "Set reminder for later today" : "Ställ in påminnelse för senare idag", + "Tomorrow" : "I morgon", + "Set reminder for tomorrow" : "Ställ in påminnelse för imorgon", + "This weekend" : "Denna helgen", + "Set reminder for this weekend" : "Ställ in påminnelse för denna helg", + "Next week" : "Nästa vecka", + "Set reminder for next week" : "Ställ in påminnelse för nästa vecka", + "Set reminder at custom date & time" : "Ställ in påminnelse vid anpassat datum och tid", + "Reminder set for \"{fileName}\"" : "Påminnelse inställd för \"{fileName}\"", + "Failed to set reminder" : "Kunde inte ställa in påminnelsen", + "Please choose a valid date & time" : "Välj ett giltigt datum och tid", + "Reminder cleared" : "Påminnelsen rensad", + "Failed to clear reminder" : "Kunde inte rensa påminnelsen", + "Failed to load reminder" : "Kunde inte läsa in påminnelsen" +}, +"nplurals=2; plural=(n != 1);"); diff --git a/apps/files_reminders/l10n/sv.json b/apps/files_reminders/l10n/sv.json new file mode 100644 index 00000000000..01acd1e2935 --- /dev/null +++ b/apps/files_reminders/l10n/sv.json @@ -0,0 +1,27 @@ +{ "translations": { + "File reminders" : "Filpåminnelser", + "Reminder for {name}" : "Påminnelse för {name}", + "View file" : "Visa fil", + "View folder" : "Visa mapp", + "Set file reminders" : "Ställ in filpåminnelser", + "**📣 File reminders**\n\nSet file reminders." : "**📣 Filpåminnelser**\n\nStäll in filpåminnelser.", + "Back" : "Tillbaka", + "Clear reminder" : "Rensa påminnelse", + "Set custom reminder" : "Ställ in anpassad påminnelse", + "Later today" : "Senare idag", + "Set reminder for later today" : "Ställ in påminnelse för senare idag", + "Tomorrow" : "I morgon", + "Set reminder for tomorrow" : "Ställ in påminnelse för imorgon", + "This weekend" : "Denna helgen", + "Set reminder for this weekend" : "Ställ in påminnelse för denna helg", + "Next week" : "Nästa vecka", + "Set reminder for next week" : "Ställ in påminnelse för nästa vecka", + "Set reminder at custom date & time" : "Ställ in påminnelse vid anpassat datum och tid", + "Reminder set for \"{fileName}\"" : "Påminnelse inställd för \"{fileName}\"", + "Failed to set reminder" : "Kunde inte ställa in påminnelsen", + "Please choose a valid date & time" : "Välj ett giltigt datum och tid", + "Reminder cleared" : "Påminnelsen rensad", + "Failed to clear reminder" : "Kunde inte rensa påminnelsen", + "Failed to load reminder" : "Kunde inte läsa in påminnelsen" +},"pluralForm" :"nplurals=2; plural=(n != 1);" +}
\ No newline at end of file diff --git a/apps/files_reminders/l10n/zh_HK.js b/apps/files_reminders/l10n/zh_HK.js new file mode 100644 index 00000000000..9c41ded1700 --- /dev/null +++ b/apps/files_reminders/l10n/zh_HK.js @@ -0,0 +1,29 @@ +OC.L10N.register( + "files_reminders", + { + "File reminders" : "檔案提醒", + "Reminder for {name}" : "{name} 的提醒", + "View file" : "檢視檔案", + "View folder" : "檢視資料夾", + "Set file reminders" : "設定檔案提醒", + "**📣 File reminders**\n\nSet file reminders." : "**📣 檔案提醒**\n\n設定檔案提醒。", + "Back" : "上星期", + "Clear reminder" : "清除提醒", + "Set custom reminder" : "設定自訂提醒", + "Later today" : "今日稍後", + "Set reminder for later today" : "設定今天稍後的提醒", + "Tomorrow" : "明日", + "Set reminder for tomorrow" : "設定明天的提醒", + "This weekend" : "本週末", + "Set reminder for this weekend" : "設定本週末的提醒", + "Next week" : "下星期", + "Set reminder for next week" : "設定下星期的提醒", + "Set reminder at custom date & time" : "設定自訂日期與時間的提醒", + "Reminder set for \"{fileName}\"" : "「{fileName}」的提醒設定", + "Failed to set reminder" : "設定提醒失敗", + "Please choose a valid date & time" : "請選擇有效的日期與時間", + "Reminder cleared" : "提醒已清除", + "Failed to clear reminder" : "清除提醒失敗", + "Failed to load reminder" : "載入提醒失敗" +}, +"nplurals=1; plural=0;"); diff --git a/apps/files_reminders/l10n/zh_HK.json b/apps/files_reminders/l10n/zh_HK.json new file mode 100644 index 00000000000..3859fb992d4 --- /dev/null +++ b/apps/files_reminders/l10n/zh_HK.json @@ -0,0 +1,27 @@ +{ "translations": { + "File reminders" : "檔案提醒", + "Reminder for {name}" : "{name} 的提醒", + "View file" : "檢視檔案", + "View folder" : "檢視資料夾", + "Set file reminders" : "設定檔案提醒", + "**📣 File reminders**\n\nSet file reminders." : "**📣 檔案提醒**\n\n設定檔案提醒。", + "Back" : "上星期", + "Clear reminder" : "清除提醒", + "Set custom reminder" : "設定自訂提醒", + "Later today" : "今日稍後", + "Set reminder for later today" : "設定今天稍後的提醒", + "Tomorrow" : "明日", + "Set reminder for tomorrow" : "設定明天的提醒", + "This weekend" : "本週末", + "Set reminder for this weekend" : "設定本週末的提醒", + "Next week" : "下星期", + "Set reminder for next week" : "設定下星期的提醒", + "Set reminder at custom date & time" : "設定自訂日期與時間的提醒", + "Reminder set for \"{fileName}\"" : "「{fileName}」的提醒設定", + "Failed to set reminder" : "設定提醒失敗", + "Please choose a valid date & time" : "請選擇有效的日期與時間", + "Reminder cleared" : "提醒已清除", + "Failed to clear reminder" : "清除提醒失敗", + "Failed to load reminder" : "載入提醒失敗" +},"pluralForm" :"nplurals=1; plural=0;" +}
\ No newline at end of file diff --git a/apps/files_reminders/l10n/zh_TW.js b/apps/files_reminders/l10n/zh_TW.js new file mode 100644 index 00000000000..88b23dfd1ba --- /dev/null +++ b/apps/files_reminders/l10n/zh_TW.js @@ -0,0 +1,29 @@ +OC.L10N.register( + "files_reminders", + { + "File reminders" : "檔案提醒", + "Reminder for {name}" : "{name} 的提醒", + "View file" : "檢視檔案", + "View folder" : "檢視資料夾", + "Set file reminders" : "設定檔案提醒", + "**📣 File reminders**\n\nSet file reminders." : "**📣 檔案提醒**\n\n設定檔案提醒。", + "Back" : "返回", + "Clear reminder" : "清除提醒", + "Set custom reminder" : "設定自訂提醒", + "Later today" : "今天稍後", + "Set reminder for later today" : "設定今天稍後的提醒", + "Tomorrow" : "明天", + "Set reminder for tomorrow" : "設定明天的提醒", + "This weekend" : "本週末", + "Set reminder for this weekend" : "設定本週末的提醒", + "Next week" : "下週", + "Set reminder for next week" : "設定下週的提醒", + "Set reminder at custom date & time" : "設定自訂日期與時間的提醒", + "Reminder set for \"{fileName}\"" : "「{fileName}」的提醒設定", + "Failed to set reminder" : "設定提醒失敗", + "Please choose a valid date & time" : "請選擇有效的日期與時間", + "Reminder cleared" : "提醒已清除", + "Failed to clear reminder" : "清除提醒失敗", + "Failed to load reminder" : "載入提醒失敗" +}, +"nplurals=1; plural=0;"); diff --git a/apps/files_reminders/l10n/zh_TW.json b/apps/files_reminders/l10n/zh_TW.json new file mode 100644 index 00000000000..e3f8ca92465 --- /dev/null +++ b/apps/files_reminders/l10n/zh_TW.json @@ -0,0 +1,27 @@ +{ "translations": { + "File reminders" : "檔案提醒", + "Reminder for {name}" : "{name} 的提醒", + "View file" : "檢視檔案", + "View folder" : "檢視資料夾", + "Set file reminders" : "設定檔案提醒", + "**📣 File reminders**\n\nSet file reminders." : "**📣 檔案提醒**\n\n設定檔案提醒。", + "Back" : "返回", + "Clear reminder" : "清除提醒", + "Set custom reminder" : "設定自訂提醒", + "Later today" : "今天稍後", + "Set reminder for later today" : "設定今天稍後的提醒", + "Tomorrow" : "明天", + "Set reminder for tomorrow" : "設定明天的提醒", + "This weekend" : "本週末", + "Set reminder for this weekend" : "設定本週末的提醒", + "Next week" : "下週", + "Set reminder for next week" : "設定下週的提醒", + "Set reminder at custom date & time" : "設定自訂日期與時間的提醒", + "Reminder set for \"{fileName}\"" : "「{fileName}」的提醒設定", + "Failed to set reminder" : "設定提醒失敗", + "Please choose a valid date & time" : "請選擇有效的日期與時間", + "Reminder cleared" : "提醒已清除", + "Failed to clear reminder" : "清除提醒失敗", + "Failed to load reminder" : "載入提醒失敗" +},"pluralForm" :"nplurals=1; plural=0;" +}
\ No newline at end of file diff --git a/apps/files_reminders/lib/Command/ListCommand.php b/apps/files_reminders/lib/Command/ListCommand.php index 3f3ce13b857..f9113e15605 100644 --- a/apps/files_reminders/lib/Command/ListCommand.php +++ b/apps/files_reminders/lib/Command/ListCommand.php @@ -77,10 +77,6 @@ class ListCommand extends Base { } $reminders = $this->reminderService->getAll($user ?? null); - if (empty($reminders)) { - $io->text('No reminders'); - return 0; - } $outputOption = $input->getOption('output'); switch ($outputOption) { @@ -97,6 +93,11 @@ class ListCommand extends Base { ); return 0; default: + if (empty($reminders)) { + $io->text('No reminders'); + return 0; + } + $io->table( ['User Id', 'File Id', 'Path', 'Due Date', 'Updated At', 'Created At', 'Notified'], array_map( diff --git a/apps/files_reminders/lib/Controller/ApiController.php b/apps/files_reminders/lib/Controller/ApiController.php index 873088177c1..ed23ee032ba 100644 --- a/apps/files_reminders/lib/Controller/ApiController.php +++ b/apps/files_reminders/lib/Controller/ApiController.php @@ -34,6 +34,7 @@ use OCA\FilesReminders\Exception\NodeNotFoundException; use OCA\FilesReminders\Service\ReminderService; use OCP\AppFramework\Db\DoesNotExistException; use OCP\AppFramework\Http; +use OCP\AppFramework\Http\Attribute\NoAdminRequired; use OCP\AppFramework\Http\DataResponse; use OCP\AppFramework\OCSController; use OCP\IRequest; @@ -54,6 +55,7 @@ class ApiController extends OCSController { /** * Get a reminder */ + #[NoAdminRequired] public function get(int $fileId): DataResponse { $user = $this->userSession->getUser(); if ($user === null) { @@ -79,6 +81,7 @@ class ApiController extends OCSController { * * @param string $dueDate ISO 8601 formatted date time string */ + #[NoAdminRequired] public function set(int $fileId, string $dueDate): DataResponse { try { $dueDate = (new DateTime($dueDate))->setTimezone(new DateTimeZone('UTC')); @@ -106,6 +109,7 @@ class ApiController extends OCSController { /** * Remove a reminder */ + #[NoAdminRequired] public function remove(int $fileId): DataResponse { $user = $this->userSession->getUser(); if ($user === null) { diff --git a/apps/files_reminders/lib/Db/ReminderMapper.php b/apps/files_reminders/lib/Db/ReminderMapper.php index 1a8f05a3db9..3f7fc04b2f0 100644 --- a/apps/files_reminders/lib/Db/ReminderMapper.php +++ b/apps/files_reminders/lib/Db/ReminderMapper.php @@ -31,6 +31,7 @@ use OCP\AppFramework\Db\DoesNotExistException; use OCP\AppFramework\Db\QBMapper; use OCP\DB\QueryBuilder\IQueryBuilder; use OCP\Files\Node; +use OCP\Files\NotFoundException; use OCP\IDBConnection; use OCP\IUser; @@ -111,11 +112,17 @@ class ReminderMapper extends QBMapper { * @return Reminder[] */ public function findAllForNode(Node $node) { + try { + $nodeId = $node->getId(); + } catch (NotFoundException $e) { + return []; + } + $qb = $this->db->getQueryBuilder(); $qb->select('id', 'user_id', 'file_id', 'due_date', 'updated_at', 'created_at', 'notified') ->from($this->getTableName()) - ->where($qb->expr()->eq('file_id', $qb->createNamedParameter($node->getId(), IQueryBuilder::PARAM_INT))) + ->where($qb->expr()->eq('file_id', $qb->createNamedParameter($nodeId, IQueryBuilder::PARAM_INT))) ->orderBy('due_date', 'ASC'); return $this->findEntities($qb); diff --git a/apps/files_reminders/lib/Listener/NodeDeletedListener.php b/apps/files_reminders/lib/Listener/NodeDeletedListener.php index 460ddfd4abe..88aed08bba8 100644 --- a/apps/files_reminders/lib/Listener/NodeDeletedListener.php +++ b/apps/files_reminders/lib/Listener/NodeDeletedListener.php @@ -26,8 +26,6 @@ declare(strict_types=1); namespace OCA\FilesReminders\Listener; -use OC\Files\Node\NonExistingFile; -use OC\Files\Node\NonExistingFolder; use OCA\FilesReminders\Service\ReminderService; use OCP\EventDispatcher\Event; use OCP\EventDispatcher\IEventListener; @@ -44,10 +42,6 @@ class NodeDeletedListener implements IEventListener { } $node = $event->getNode(); - if ($node instanceof NonExistingFile || $node instanceof NonExistingFolder) { - return; - } - $this->reminderService->removeAllForNode($node); } } diff --git a/apps/files_sharing/l10n/sr.js b/apps/files_sharing/l10n/sr.js index 7f70beaaa24..57d702f06bb 100644 --- a/apps/files_sharing/l10n/sr.js +++ b/apps/files_sharing/l10n/sr.js @@ -211,6 +211,7 @@ OC.L10N.register( "this share just expired." : "ово дељење је управо истекло.", "Shared with you by {owner}" : "{owner} је поделио са Вама", "_Accept share_::_Accept shares_" : ["Прихвати дељење","Прихвати дељењa","Прихвати дељењa"], + "Open in Files" : "Отвори у Фајловима", "_Reject share_::_Reject shares_" : ["Одбиј дељење","Одбиј дељења","Одбиј дељења"], "_Restore share_::_Restore shares_" : ["Обнови дељење","Обнови дељења","Обнови дељења"], "Link to a file" : "Веза ка фајлу", @@ -234,20 +235,27 @@ OC.L10N.register( "Shares" : "Дељења", "Overview of shared files." : "Преглед дељених фајлова.", "No shares" : "Нема дељења", + "Files and folders you shared or have been shared with you will show up here" : "Овде ће се појавити фајлови и фолдери које сте ви поделили или које други деле са вама", "Shared with you" : "Дељено са вама", "List of files that are shared with you." : "Листа фајлова који су подељени са вама.", "Nothing shared with you yet" : "Још увек се ништа не дели са Вама", + "Files and folders others shared with you will show up here" : "Овде ће се појавити фајлови и фолдери које су други поделили са вама", "Shared with others" : "Дељено са осталима", "List of files that you shared with others." : "Листа фајлова које сте поделили другима.", "Nothing shared yet" : "Још се ништа не дели", + "Files and folders you shared will show up here" : "Овде ће се појавити фајлови и фолдери које сте поделили", "Shared by link" : "Дељено путем везе", "List of files that are shared by link." : "Листа фајлова који су подељени линком.", "No shared links" : "Нема веза за дељење", + "Files and folders you shared by link will show up here" : "Овде ће се појавити фајлови и фолдери које сте поделили линком", "Deleted shares" : "Обрисана дељења", + "List of shares you left." : "Листа дељења која сте напустили.", "No deleted shares" : "Нема обрисаних дељења", + "Shares you have left will show up here" : "Овде ће се појавити дељења која сте напустили", "Pending shares" : "Дељења на чекању", "List of unapproved shares." : "Листа дељења која нису одобрена.", "No pending shares" : "Нема дељења на чекању", + "Shares you have received but not approved will show up here" : "Овде ће се појавити дељења која сте прилмили, али нисте одобрили", "No entries found in this folder" : "Нема ничега у овој фасцикли", "Name" : "Назив", "Share time" : "Време дељења", diff --git a/apps/files_sharing/l10n/sr.json b/apps/files_sharing/l10n/sr.json index 48d8b3f8cf9..ce75d670e0c 100644 --- a/apps/files_sharing/l10n/sr.json +++ b/apps/files_sharing/l10n/sr.json @@ -209,6 +209,7 @@ "this share just expired." : "ово дељење је управо истекло.", "Shared with you by {owner}" : "{owner} је поделио са Вама", "_Accept share_::_Accept shares_" : ["Прихвати дељење","Прихвати дељењa","Прихвати дељењa"], + "Open in Files" : "Отвори у Фајловима", "_Reject share_::_Reject shares_" : ["Одбиј дељење","Одбиј дељења","Одбиј дељења"], "_Restore share_::_Restore shares_" : ["Обнови дељење","Обнови дељења","Обнови дељења"], "Link to a file" : "Веза ка фајлу", @@ -232,20 +233,27 @@ "Shares" : "Дељења", "Overview of shared files." : "Преглед дељених фајлова.", "No shares" : "Нема дељења", + "Files and folders you shared or have been shared with you will show up here" : "Овде ће се појавити фајлови и фолдери које сте ви поделили или које други деле са вама", "Shared with you" : "Дељено са вама", "List of files that are shared with you." : "Листа фајлова који су подељени са вама.", "Nothing shared with you yet" : "Још увек се ништа не дели са Вама", + "Files and folders others shared with you will show up here" : "Овде ће се појавити фајлови и фолдери које су други поделили са вама", "Shared with others" : "Дељено са осталима", "List of files that you shared with others." : "Листа фајлова које сте поделили другима.", "Nothing shared yet" : "Још се ништа не дели", + "Files and folders you shared will show up here" : "Овде ће се појавити фајлови и фолдери које сте поделили", "Shared by link" : "Дељено путем везе", "List of files that are shared by link." : "Листа фајлова који су подељени линком.", "No shared links" : "Нема веза за дељење", + "Files and folders you shared by link will show up here" : "Овде ће се појавити фајлови и фолдери које сте поделили линком", "Deleted shares" : "Обрисана дељења", + "List of shares you left." : "Листа дељења која сте напустили.", "No deleted shares" : "Нема обрисаних дељења", + "Shares you have left will show up here" : "Овде ће се појавити дељења која сте напустили", "Pending shares" : "Дељења на чекању", "List of unapproved shares." : "Листа дељења која нису одобрена.", "No pending shares" : "Нема дељења на чекању", + "Shares you have received but not approved will show up here" : "Овде ће се појавити дељења која сте прилмили, али нисте одобрили", "No entries found in this folder" : "Нема ничега у овој фасцикли", "Name" : "Назив", "Share time" : "Време дељења", diff --git a/apps/files_sharing/l10n/uk.js b/apps/files_sharing/l10n/uk.js index 829a529412d..1c829a35371 100644 --- a/apps/files_sharing/l10n/uk.js +++ b/apps/files_sharing/l10n/uk.js @@ -65,7 +65,7 @@ OC.L10N.register( "{actor} shared {file} with {user}" : "{actor} надав(-ла) доступ {user} до файлу {file}", "{actor} removed {user} from {file}" : "{actor} вилучив(-ла) {user} з {file}", "{actor} shared {file} with you" : "{actor} надав(-ла) вам доступ до спільного ресурсу {file}", - "{actor} removed you from the share named {file}" : "{actor} скасував вам доступ до спільного ресурсу {file}", + "{actor} removed you from the share named {file}" : "{actor} скасував(-ла) вам доступ до спільного ресурсу {file}", "Share for file {file} with {user} expired" : "Термін дії доступу {user} до спільного ресурсу {file} вичерпано", "Share for file {file} expired" : "Термін дії спільного доступу до {file} вичерпано", "A file or folder shared by mail or by public link was <strong>downloaded</strong>" : "Файл або каталог, яким поділилився через ел.пошту або публічне посилання було <strong>звантажено</strong>", diff --git a/apps/files_sharing/l10n/uk.json b/apps/files_sharing/l10n/uk.json index aa3322a3679..b0071773d57 100644 --- a/apps/files_sharing/l10n/uk.json +++ b/apps/files_sharing/l10n/uk.json @@ -63,7 +63,7 @@ "{actor} shared {file} with {user}" : "{actor} надав(-ла) доступ {user} до файлу {file}", "{actor} removed {user} from {file}" : "{actor} вилучив(-ла) {user} з {file}", "{actor} shared {file} with you" : "{actor} надав(-ла) вам доступ до спільного ресурсу {file}", - "{actor} removed you from the share named {file}" : "{actor} скасував вам доступ до спільного ресурсу {file}", + "{actor} removed you from the share named {file}" : "{actor} скасував(-ла) вам доступ до спільного ресурсу {file}", "Share for file {file} with {user} expired" : "Термін дії доступу {user} до спільного ресурсу {file} вичерпано", "Share for file {file} expired" : "Термін дії спільного доступу до {file} вичерпано", "A file or folder shared by mail or by public link was <strong>downloaded</strong>" : "Файл або каталог, яким поділилився через ел.пошту або публічне посилання було <strong>звантажено</strong>", diff --git a/apps/files_sharing/src/actions/openInFilesAction.spec.ts b/apps/files_sharing/src/actions/openInFilesAction.spec.ts index 8920204ae3f..49d4e192d39 100644 --- a/apps/files_sharing/src/actions/openInFilesAction.spec.ts +++ b/apps/files_sharing/src/actions/openInFilesAction.spec.ts @@ -19,14 +19,14 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. * */ -import { action } from './openInFilesAction' +import type { Navigation } from '../../../files/src/services/Navigation' + import { expect } from '@jest/globals' import { File, Permission } from '@nextcloud/files' -import { DefaultType, FileAction } from '../../../files/src/services/FileAction' -import * as eventBus from '@nextcloud/event-bus' -import axios from '@nextcloud/axios' -import type { Navigation } from '../../../files/src/services/Navigation' + import '../main' +import { action } from './openInFilesAction' +import { DefaultType, FileAction } from '../../../files/src/services/FileAction' import { deletedSharesViewId, pendingSharesViewId, sharedWithOthersViewId, sharedWithYouViewId, sharesViewId, sharingByLinksViewId } from '../views/shares' const view = { @@ -92,6 +92,6 @@ describe('Open in files action execute tests', () => { // Silent action expect(exec).toBe(null) expect(goToRouteMock).toBeCalledTimes(1) - expect(goToRouteMock).toBeCalledWith(null, { fileid: 1, view: 'files' }, { fileid: 1, dir: '/Foo' }) + expect(goToRouteMock).toBeCalledWith(null, { fileid: 1, view: 'files' }, { dir: '/Foo' }) }) }) diff --git a/apps/files_sharing/src/actions/openInFilesAction.ts b/apps/files_sharing/src/actions/openInFilesAction.ts index bd9791e85a5..ff7ccde2f36 100644 --- a/apps/files_sharing/src/actions/openInFilesAction.ts +++ b/apps/files_sharing/src/actions/openInFilesAction.ts @@ -43,7 +43,7 @@ export const action = new FileAction({ window.OCP.Files.Router.goToRoute( null, // use default route { view: 'files', fileid: node.fileid }, - { dir: node.dirname, fileid: node.fileid }, + { dir: node.dirname }, ) return null }, diff --git a/apps/files_sharing/src/views/shares.spec.ts b/apps/files_sharing/src/views/shares.spec.ts index e5c7e6853c6..424d3680411 100644 --- a/apps/files_sharing/src/views/shares.spec.ts +++ b/apps/files_sharing/src/views/shares.spec.ts @@ -25,7 +25,7 @@ import axios from '@nextcloud/axios' import { type Navigation } from '../../../files/src/services/Navigation' import { type OCSResponse } from '../services/SharingService' -import NavigationService from '../../../files/src/services/Navigation' +import { NavigationService } from '../../../files/src/services/Navigation' import registerSharingViews from './shares' import '../main' diff --git a/apps/files_sharing/src/views/shares.ts b/apps/files_sharing/src/views/shares.ts index ff37983813e..74be9e7a503 100644 --- a/apps/files_sharing/src/views/shares.ts +++ b/apps/files_sharing/src/views/shares.ts @@ -19,8 +19,7 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. * */ -import type NavigationService from '../../../files/src/services/Navigation' -import type { Navigation } from '../../../files/src/services/Navigation' +import type { NavigationService, Navigation } from '../../../files/src/services/Navigation' import { translate as t } from '@nextcloud/l10n' import AccountClockSvg from '@mdi/svg/svg/account-clock.svg?raw' diff --git a/apps/files_trashbin/l10n/ja.js b/apps/files_trashbin/l10n/ja.js index 558855eb873..f1471207f76 100644 --- a/apps/files_trashbin/l10n/ja.js +++ b/apps/files_trashbin/l10n/ja.js @@ -7,7 +7,9 @@ OC.L10N.register( "This application enables users to restore files that were deleted from the system." : "このアプリケーションを使用すると、ユーザーはシステムから削除されたファイルを復元できます。", "This application enables users to restore files that were deleted from the system. It displays a list of deleted files in the web interface, and has options to restore those deleted files back to the users file directories or remove them permanently from the system. Restoring a file also restores related file versions, if the versions application is enabled. When a file is deleted from a share, it can be restored in the same manner, though it is no longer shared. By default, these files remain in the trash bin for 30 days.\nTo prevent a user from running out of disk space, the Deleted files app will not utilize more than 50% of the currently available free quota for deleted files. If the deleted files exceed this limit, the app deletes the oldest files until it gets below this limit. More information is available in the Deleted Files documentation." : "このアプリケーションを使用すると、システムから削除されたファイルを復元できます。削除されたファイルのリストがWebインターフェイスに表示され、削除されたファイルをユーザーのファイルディレクトリに復元するか、システムから完全に削除するかを選択できます。バージョン管理アプリが有効になっている場合、ファイルを復元すると、関連するファイルバージョンも復元されます。共有から削除されたファイルは、共有されなくなりますが、同じ方法で復元できます。デフォルトでは、ファイルは30日間ごみ箱に残ります。\nディスク領域圧迫を防ぐため、 「削除済みファイル」 アプリでは、削除済みファイルに現在使用可能な割当て容量の50%を超える容量は使用されません。削除されたファイルがこの制限を超えると、この制限を下回るまで最も古いファイルが削除されます。詳細については、削除済みファイルのマニュアルを参照してください。", "Restore" : "復元", + "List of files that have been deleted." : "削除されたファイルのリスト", "No deleted files" : "削除されたファイルはありません", + "Files and folders you have deleted will show up here" : "削除したファイルとフォルダーがここに表示されます", "Deleted" : "削除日時", "You will be able to recover deleted files from here" : "ここから削除されたファイルを元に戻すことができます。", "No entries found in this folder" : "このフォルダーにはエントリーがありません", diff --git a/apps/files_trashbin/l10n/ja.json b/apps/files_trashbin/l10n/ja.json index 8345cfdeff7..fee33f9c1ea 100644 --- a/apps/files_trashbin/l10n/ja.json +++ b/apps/files_trashbin/l10n/ja.json @@ -5,7 +5,9 @@ "This application enables users to restore files that were deleted from the system." : "このアプリケーションを使用すると、ユーザーはシステムから削除されたファイルを復元できます。", "This application enables users to restore files that were deleted from the system. It displays a list of deleted files in the web interface, and has options to restore those deleted files back to the users file directories or remove them permanently from the system. Restoring a file also restores related file versions, if the versions application is enabled. When a file is deleted from a share, it can be restored in the same manner, though it is no longer shared. By default, these files remain in the trash bin for 30 days.\nTo prevent a user from running out of disk space, the Deleted files app will not utilize more than 50% of the currently available free quota for deleted files. If the deleted files exceed this limit, the app deletes the oldest files until it gets below this limit. More information is available in the Deleted Files documentation." : "このアプリケーションを使用すると、システムから削除されたファイルを復元できます。削除されたファイルのリストがWebインターフェイスに表示され、削除されたファイルをユーザーのファイルディレクトリに復元するか、システムから完全に削除するかを選択できます。バージョン管理アプリが有効になっている場合、ファイルを復元すると、関連するファイルバージョンも復元されます。共有から削除されたファイルは、共有されなくなりますが、同じ方法で復元できます。デフォルトでは、ファイルは30日間ごみ箱に残ります。\nディスク領域圧迫を防ぐため、 「削除済みファイル」 アプリでは、削除済みファイルに現在使用可能な割当て容量の50%を超える容量は使用されません。削除されたファイルがこの制限を超えると、この制限を下回るまで最も古いファイルが削除されます。詳細については、削除済みファイルのマニュアルを参照してください。", "Restore" : "復元", + "List of files that have been deleted." : "削除されたファイルのリスト", "No deleted files" : "削除されたファイルはありません", + "Files and folders you have deleted will show up here" : "削除したファイルとフォルダーがここに表示されます", "Deleted" : "削除日時", "You will be able to recover deleted files from here" : "ここから削除されたファイルを元に戻すことができます。", "No entries found in this folder" : "このフォルダーにはエントリーがありません", diff --git a/apps/files_trashbin/src/main.ts b/apps/files_trashbin/src/main.ts index eb235f34c8d..cf5a95bb1d8 100644 --- a/apps/files_trashbin/src/main.ts +++ b/apps/files_trashbin/src/main.ts @@ -19,8 +19,7 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. * */ -import type NavigationService from '../../files/src/services/Navigation' -import type { Navigation } from '../../files/src/services/Navigation' +import type { NavigationService, Navigation } from '../../files/src/services/Navigation' import { translate as t, translate } from '@nextcloud/l10n' import DeleteSvg from '@mdi/svg/svg/delete.svg?raw' diff --git a/apps/files_trashbin/src/services/trashbin.ts b/apps/files_trashbin/src/services/trashbin.ts index a1608f6e19f..bc52100a492 100644 --- a/apps/files_trashbin/src/services/trashbin.ts +++ b/apps/files_trashbin/src/services/trashbin.ts @@ -21,7 +21,7 @@ */ /* eslint-disable */ import { getCurrentUser } from '@nextcloud/auth' -import { File, Folder, parseWebdavPermissions } from '@nextcloud/files' +import { File, Folder, davParsePermissions } from '@nextcloud/files' import { generateRemoteUrl, generateUrl } from '@nextcloud/router' import type { FileStat, ResponseDataDetailed } from 'webdav' @@ -43,7 +43,7 @@ const data = `<?xml version="1.0"?> const resultToNode = function(node: FileStat): File | Folder { - const permissions = parseWebdavPermissions(node.props?.permissions) + const permissions = davParsePermissions(node.props?.permissions) const owner = getCurrentUser()?.uid as string const previewUrl = generateUrl('/apps/files_trashbin/preview?fileId={fileid}&x=32&y=32', node.props) diff --git a/apps/files_versions/l10n/cs.js b/apps/files_versions/l10n/cs.js index 46771857572..44ce483ee09 100644 --- a/apps/files_versions/l10n/cs.js +++ b/apps/files_versions/l10n/cs.js @@ -6,6 +6,7 @@ OC.L10N.register( "This application automatically maintains older versions of files that are changed. When enabled, a hidden versions folder is provisioned in every user's directory and is used to store old file versions. A user can revert to an older version through the web interface at any time, with the replaced file becoming a version. The app automatically manages the versions folder to ensure the user does not run out of Quota because of versions.\n\t\tIn addition to the expiry of versions, the versions app makes certain never to use more than 50% of the user's currently available free space. If stored versions exceed this limit, the app will delete the oldest versions first until it meets this limit. More information is available in the Versions documentation." : "Tato aplikace automaticky uchovává starší verze souborů, které se změnily. Když je zapnutá, je ve složce každého uživatele vytvořena skrytá složka pro verze a do ní jsou ukládány staré verze souborů. Uživatel se (prostřednictvím webového rozhraní) kdykoli může vrátit ke starší verzi s tím, že sám nahrazovaný nejnovější soubor se tak stane verzí. Aplikace automaticky spravuje složku s verzemi tak, aby bylo zajištěno, že uživatel kvůli starým verzím nevyčerpá přidělenou kvótu.\n\t\tKrom konců platností verzí, aplikace Verze zajišťuje, že nikdy nepoužije více než 50% právě dostupného volného prostoru, který má uživatel k dispozici. Pokud uložené verze přesáhnou tento limit, aplikace smaže ty nejstarší, aby se do tohoto limitu vešla. Podrobnosti naleznete v dokumentaci k aplikaci Verze.", "Name this version" : "Nazvat tuto verzi", "Edit version name" : "Upravit název verze", + "Compare to current version" : "Porovnat se stávající verzí", "Restore version" : "Obnovit verzi", "Download version" : "Stáhnout si verzi", "Delete version" : "Smazat verzi", diff --git a/apps/files_versions/l10n/cs.json b/apps/files_versions/l10n/cs.json index 510c61f0aba..6bb6a6098c8 100644 --- a/apps/files_versions/l10n/cs.json +++ b/apps/files_versions/l10n/cs.json @@ -4,6 +4,7 @@ "This application automatically maintains older versions of files that are changed. When enabled, a hidden versions folder is provisioned in every user's directory and is used to store old file versions. A user can revert to an older version through the web interface at any time, with the replaced file becoming a version. The app automatically manages the versions folder to ensure the user does not run out of Quota because of versions.\n\t\tIn addition to the expiry of versions, the versions app makes certain never to use more than 50% of the user's currently available free space. If stored versions exceed this limit, the app will delete the oldest versions first until it meets this limit. More information is available in the Versions documentation." : "Tato aplikace automaticky uchovává starší verze souborů, které se změnily. Když je zapnutá, je ve složce každého uživatele vytvořena skrytá složka pro verze a do ní jsou ukládány staré verze souborů. Uživatel se (prostřednictvím webového rozhraní) kdykoli může vrátit ke starší verzi s tím, že sám nahrazovaný nejnovější soubor se tak stane verzí. Aplikace automaticky spravuje složku s verzemi tak, aby bylo zajištěno, že uživatel kvůli starým verzím nevyčerpá přidělenou kvótu.\n\t\tKrom konců platností verzí, aplikace Verze zajišťuje, že nikdy nepoužije více než 50% právě dostupného volného prostoru, který má uživatel k dispozici. Pokud uložené verze přesáhnou tento limit, aplikace smaže ty nejstarší, aby se do tohoto limitu vešla. Podrobnosti naleznete v dokumentaci k aplikaci Verze.", "Name this version" : "Nazvat tuto verzi", "Edit version name" : "Upravit název verze", + "Compare to current version" : "Porovnat se stávající verzí", "Restore version" : "Obnovit verzi", "Download version" : "Stáhnout si verzi", "Delete version" : "Smazat verzi", diff --git a/apps/files_versions/l10n/ja.js b/apps/files_versions/l10n/ja.js index 04b0e135726..45e94560233 100644 --- a/apps/files_versions/l10n/ja.js +++ b/apps/files_versions/l10n/ja.js @@ -4,8 +4,22 @@ OC.L10N.register( "Versions" : "バージョン", "This application automatically maintains older versions of files that are changed." : "このアプリケーションは、変更された古いバージョンのファイルを自動的に維持します。", "This application automatically maintains older versions of files that are changed. When enabled, a hidden versions folder is provisioned in every user's directory and is used to store old file versions. A user can revert to an older version through the web interface at any time, with the replaced file becoming a version. The app automatically manages the versions folder to ensure the user does not run out of Quota because of versions.\n\t\tIn addition to the expiry of versions, the versions app makes certain never to use more than 50% of the user's currently available free space. If stored versions exceed this limit, the app will delete the oldest versions first until it meets this limit. More information is available in the Versions documentation." : "このアプリケーションは、変更された古いバージョンのファイルを自動的に維持します。 有効にすると、隠れバージョンフォルダーはすべてのユーザーのディレクトリにプロビジョニングされ、古いファイルバージョンを格納するために使用されます。 ユーザーはいつでもWebインターフェイスから古いバージョンに戻すことができ、置き換えられたファイルはバージョン管理されます。 バージョン管理のためにクオータが足りなくなっていないことを保証するために、バージョンフォルダーを自動的に管理します。\n\t\tバージョンの有効期限に加えて、バージョン管理アプリは、ユーザーが現在利用可能な空き容量の50%以上利用しないように維持します。 保存されたバージョンがこの制限を超えた場合、アプリはこの制限を満たすまで、最も古いバージョンを最初に削除します。 詳細は、バージョンのドキュメントを参照してください。", - "Version" : "バージョン", - "This application automatically maintains older versions of files that are changed. When enabled, a hidden versions folder is provisioned in every user’s directory and is used to store old file versions. A user can revert to an older version through the web interface at any time, with the replaced file becoming a version. The app automatically manages the versions folder to ensure the user doesn’t run out of Quota because of versions.\n\t\tIn addition to the expiry of versions, the versions app makes certain never to use more than 50% of the user’s currently available free space. If stored versions exceed this limit, the app will delete the oldest versions first until it meets this limit. More information is available in the Versions documentation." : "このアプリケーションは、変更された古いバージョンのファイルを自動的に維持します。 有効にすると、隠れバージョンフォルダーはすべてのユーザーのディレクトリにプロビジョニングされ、古いファイルバージョンを格納するために使用されます。 ユーザーはいつでもWebインターフェイスから古いバージョンに戻すことができ、置き換えられたファイルはバージョン管理されます。 バージョン管理のためにクオータが足りなくなっていないことを保証するために、バージョンフォルダーを自動的に管理します。バージョンの有効期限に加えて、バージョン管理アプリは、ユーザーが現在利用可能な空き容量の50%以上利用しないように維持します。 保存されたバージョンがこの制限を超えた場合、アプリはこの制限を満たすまで、最も古いバージョンを最初に削除します。 詳細は、バージョンのドキュメントを参照してください。", + "Name this version" : "このバージョンに名前を付けます", + "Edit version name" : "バージョン名の編集", + "Compare to current version" : "現在のバージョンと比較", + "Restore version" : "このバージョンを復元する", + "Download version" : "このバージョンをダウンロード", + "Delete version" : "このバージョンを削除", + "Version name" : "名前付きバージョン", + "Named versions are persisted, and excluded from automatic cleanups when your storage quota is full." : "名前付きバージョンは永続化され、ストレージクォータがいっぱいになっていても自動クリーンアップから除外されます。", + "Remove version name" : "バージョン名を削除", + "Save version name" : "バージョン名を保存", + "Initial version restored" : "初期バージョンを復旧", + "Version restored" : "指定のバージョンが復旧されました", + "Could not restore version" : "このバージョンを復旧できません", + "Could not set version name" : "バージョン名を設定できませんでした", + "Could not delete version" : "指定のバージョンを削除できませんでした", + "${version.label} restored" : "${version.label} が復旧されました", "Failed to revert {file} to revision {timestamp}." : "{file} を {timestamp} のリビジョンに戻すことができません。", "_%n byte_::_%n bytes_" : ["%n バイト"], "Restore" : "復元", diff --git a/apps/files_versions/l10n/ja.json b/apps/files_versions/l10n/ja.json index 0078117dbcb..43b068f84b4 100644 --- a/apps/files_versions/l10n/ja.json +++ b/apps/files_versions/l10n/ja.json @@ -2,8 +2,22 @@ "Versions" : "バージョン", "This application automatically maintains older versions of files that are changed." : "このアプリケーションは、変更された古いバージョンのファイルを自動的に維持します。", "This application automatically maintains older versions of files that are changed. When enabled, a hidden versions folder is provisioned in every user's directory and is used to store old file versions. A user can revert to an older version through the web interface at any time, with the replaced file becoming a version. The app automatically manages the versions folder to ensure the user does not run out of Quota because of versions.\n\t\tIn addition to the expiry of versions, the versions app makes certain never to use more than 50% of the user's currently available free space. If stored versions exceed this limit, the app will delete the oldest versions first until it meets this limit. More information is available in the Versions documentation." : "このアプリケーションは、変更された古いバージョンのファイルを自動的に維持します。 有効にすると、隠れバージョンフォルダーはすべてのユーザーのディレクトリにプロビジョニングされ、古いファイルバージョンを格納するために使用されます。 ユーザーはいつでもWebインターフェイスから古いバージョンに戻すことができ、置き換えられたファイルはバージョン管理されます。 バージョン管理のためにクオータが足りなくなっていないことを保証するために、バージョンフォルダーを自動的に管理します。\n\t\tバージョンの有効期限に加えて、バージョン管理アプリは、ユーザーが現在利用可能な空き容量の50%以上利用しないように維持します。 保存されたバージョンがこの制限を超えた場合、アプリはこの制限を満たすまで、最も古いバージョンを最初に削除します。 詳細は、バージョンのドキュメントを参照してください。", - "Version" : "バージョン", - "This application automatically maintains older versions of files that are changed. When enabled, a hidden versions folder is provisioned in every user’s directory and is used to store old file versions. A user can revert to an older version through the web interface at any time, with the replaced file becoming a version. The app automatically manages the versions folder to ensure the user doesn’t run out of Quota because of versions.\n\t\tIn addition to the expiry of versions, the versions app makes certain never to use more than 50% of the user’s currently available free space. If stored versions exceed this limit, the app will delete the oldest versions first until it meets this limit. More information is available in the Versions documentation." : "このアプリケーションは、変更された古いバージョンのファイルを自動的に維持します。 有効にすると、隠れバージョンフォルダーはすべてのユーザーのディレクトリにプロビジョニングされ、古いファイルバージョンを格納するために使用されます。 ユーザーはいつでもWebインターフェイスから古いバージョンに戻すことができ、置き換えられたファイルはバージョン管理されます。 バージョン管理のためにクオータが足りなくなっていないことを保証するために、バージョンフォルダーを自動的に管理します。バージョンの有効期限に加えて、バージョン管理アプリは、ユーザーが現在利用可能な空き容量の50%以上利用しないように維持します。 保存されたバージョンがこの制限を超えた場合、アプリはこの制限を満たすまで、最も古いバージョンを最初に削除します。 詳細は、バージョンのドキュメントを参照してください。", + "Name this version" : "このバージョンに名前を付けます", + "Edit version name" : "バージョン名の編集", + "Compare to current version" : "現在のバージョンと比較", + "Restore version" : "このバージョンを復元する", + "Download version" : "このバージョンをダウンロード", + "Delete version" : "このバージョンを削除", + "Version name" : "名前付きバージョン", + "Named versions are persisted, and excluded from automatic cleanups when your storage quota is full." : "名前付きバージョンは永続化され、ストレージクォータがいっぱいになっていても自動クリーンアップから除外されます。", + "Remove version name" : "バージョン名を削除", + "Save version name" : "バージョン名を保存", + "Initial version restored" : "初期バージョンを復旧", + "Version restored" : "指定のバージョンが復旧されました", + "Could not restore version" : "このバージョンを復旧できません", + "Could not set version name" : "バージョン名を設定できませんでした", + "Could not delete version" : "指定のバージョンを削除できませんでした", + "${version.label} restored" : "${version.label} が復旧されました", "Failed to revert {file} to revision {timestamp}." : "{file} を {timestamp} のリビジョンに戻すことができません。", "_%n byte_::_%n bytes_" : ["%n バイト"], "Restore" : "復元", diff --git a/apps/files_versions/src/files_versions_tab.js b/apps/files_versions/src/files_versions_tab.js index 8b816746401..a341b9009c3 100644 --- a/apps/files_versions/src/files_versions_tab.js +++ b/apps/files_versions/src/files_versions_tab.js @@ -60,6 +60,9 @@ window.addEventListener('DOMContentLoaded', function() { TabInstance.update(fileInfo) }, setIsActive(isActive) { + if (!TabInstance) { + return + } TabInstance.setIsActive(isActive) }, destroy() { diff --git a/apps/settings/l10n/cs.js b/apps/settings/l10n/cs.js index 065ce9adc57..52dd7530d6f 100644 --- a/apps/settings/l10n/cs.js +++ b/apps/settings/l10n/cs.js @@ -471,6 +471,7 @@ OC.L10N.register( "Show to logged in users only" : "Ukázat pouze přihlášeným uživatelům", "Hide" : "Skrýt", "Download and enable" : "Stáhnout a zapnout", + "Allow untested app" : "Umožnit nevyzkoušenou aplikaci", "The app will be downloaded from the App Store" : "Aplikace bude stažena z katalogu aplikací", "This app is not marked as compatible with your Nextcloud version. If you continue you will still be able to install the app. Note that the app might not work as expected." : "Tato aplikace není označena jako kompatibilní s vámi používanou verzí Nexcloud. Pokud budete pokračovat, pořád budete moci aplikaci nainstalovat. Uvědomte si ale, že aplikace nemusí fungovat, jak je očekáváno.", "Never" : "Nikdy", diff --git a/apps/settings/l10n/cs.json b/apps/settings/l10n/cs.json index b4f7373b25e..0117e821015 100644 --- a/apps/settings/l10n/cs.json +++ b/apps/settings/l10n/cs.json @@ -469,6 +469,7 @@ "Show to logged in users only" : "Ukázat pouze přihlášeným uživatelům", "Hide" : "Skrýt", "Download and enable" : "Stáhnout a zapnout", + "Allow untested app" : "Umožnit nevyzkoušenou aplikaci", "The app will be downloaded from the App Store" : "Aplikace bude stažena z katalogu aplikací", "This app is not marked as compatible with your Nextcloud version. If you continue you will still be able to install the app. Note that the app might not work as expected." : "Tato aplikace není označena jako kompatibilní s vámi používanou verzí Nexcloud. Pokud budete pokračovat, pořád budete moci aplikaci nainstalovat. Uvědomte si ale, že aplikace nemusí fungovat, jak je očekáváno.", "Never" : "Nikdy", diff --git a/apps/settings/l10n/el.js b/apps/settings/l10n/el.js index d5a6fae14d5..19cb4f6fe7f 100644 --- a/apps/settings/l10n/el.js +++ b/apps/settings/l10n/el.js @@ -106,6 +106,7 @@ OC.L10N.register( "Personal" : "Προσωπικά", "Administration" : "Διαχείριση", "Additional settings" : "Επιπρόσθετες ρυθμίσεις", + "Artificial Intelligence" : "Τεχνητή νοημοσύνη", "Administration privileges" : "Προνόμια διαχειριστή", "Groupware" : "Ομαδικό", "Overview" : "Επισκόπηση", diff --git a/apps/settings/l10n/el.json b/apps/settings/l10n/el.json index a6b709aba7d..6c9be415e0c 100644 --- a/apps/settings/l10n/el.json +++ b/apps/settings/l10n/el.json @@ -104,6 +104,7 @@ "Personal" : "Προσωπικά", "Administration" : "Διαχείριση", "Additional settings" : "Επιπρόσθετες ρυθμίσεις", + "Artificial Intelligence" : "Τεχνητή νοημοσύνη", "Administration privileges" : "Προνόμια διαχειριστή", "Groupware" : "Ομαδικό", "Overview" : "Επισκόπηση", diff --git a/apps/settings/l10n/sr.js b/apps/settings/l10n/sr.js index efdb974db20..eb82544d455 100644 --- a/apps/settings/l10n/sr.js +++ b/apps/settings/l10n/sr.js @@ -120,6 +120,7 @@ OC.L10N.register( "Personal" : "Лично", "Administration" : "Администрација", "Additional settings" : "Додатне поставке", + "Artificial Intelligence" : "Вештачка интелигенција", "Administration privileges" : "Привилегије за администрацију", "Groupware" : "Радни тимови", "Overview" : "Преглед", @@ -148,6 +149,15 @@ OC.L10N.register( "Profile information" : "Информације о профилу", "Profile picture, full name, email, phone number, address, website, Twitter, organisation, role, headline, biography, and whether your profile is enabled" : "Слика профила, пуно име, и-мејл, број телефона, адреса, веб сајт, Tweeter, организација, улога, насловна линија, биографија и то да ли је ваш профил укључен", "Nextcloud settings" : "Некстклауд поставке", + "Machine translation" : "Машинско превођење", + "Machine translation can be implemented by different apps. Here you can define the precedence of the machine translation apps you have installed at the moment." : "Машинско превођење могу да имплементирају разне апликације. Овде можете да дефинишете приоритет апликација машинског превођења које сте тренутно инсталирали.", + "Speech-To-Text" : "Говор-у-текст", + "Speech-To-Text can be implemented by different apps. Here you can set which app should be used." : "Говор-у-текст могу да имплементирају разне апликације. Овде можете да подесите која ће се користити.", + "None of your currently installed apps provide Speech-To-Text functionality" : "Ниједна од ваших тренутно инсталираних апликација не пружа услуагу претварања Говора-у-текст", + "Text processing" : "Обрада текста", + "Text processing tasks can be implemented by different apps. Here you can set which app should be used for which task." : "Задатке обраде текста могу да имплементирају разне апликације. Овде можете да подесите која ће се користити за који задатак.", + "Task:" : "Задатак:", + "None of your currently installed apps provide Text processing functionality" : "Ниједна од ваших тренутно инсталираних апликација не пружа функционалност обраде текста", "Here you can decide which group can access certain sections of the administration settings." : "Овде можете да одлучите која група може да приступи одређеним деловима административних подешавања.", "None" : "Ништа", "Unable to modify setting" : "Подешавање не може да се измени", @@ -242,6 +252,7 @@ OC.L10N.register( "Cron (Recommended)" : "Cron (Препоручено)", "Use system cron service to call the cron.php file every 5 minutes." : "Користите системски крон сервис за позивање cron.php фајла сваких 5 минута.", "The cron.php needs to be executed by the system user \"{user}\"." : "cron.php мора да изврши системски корисник „{user}.", + "The PHP POSIX extension is required. See {linkstart}PHP documentation{linkend} for more details." : "Потребна је PHP POSIX екстензија. Погледајте {linkstart}PHP документацију{linkend} за више детаља.", "Unable to update background job mode" : "Режим позадинског посла не може да се ажурира", "Profile" : "Профил", "Enable or disable profile by default for new users." : "Профил нових корисника се подразумевано укључује или искључује.", @@ -335,6 +346,7 @@ OC.L10N.register( "Add" : "Додај", "No users" : "Нема корисника", "Loading users …" : "Учитавају се корисници...", + "List of users. This list is not fully rendered for performance reasons. The users will be rendered as you navigate through the list." : "Листа корисника. Услед разлога везаних за перформансе, ова листа се не приказује у потпуности. Корисници ће се приказивати како се будете кретали кроз листу.", "Default language" : "Подразумевани језик", "Common languages" : "Најкоришћенији језици", "Other languages" : "Остали језици", @@ -387,6 +399,7 @@ OC.L10N.register( "Remote wipe of devices" : "Удаљено брисање уређаја", "Wipe {userid}'s devices" : "Обриши уређај од корисника {userid}", "Wiped {userid}'s devices" : "Обрисани уређаји корисника {userid}", + "Failed to update user manager" : "Није успело ажурирање управљача корисницима", "Fully delete {userid}'s account including all their personal files, app data, etc." : "Комплетно брисање уређаја са налога корисника {userid} укључујући све личне фајлове, апликативне податке, итд.", "Account deletion" : "Брисање налога", "Delete {userid}'s account" : "Обриши налог корисника {userid}", @@ -396,11 +409,14 @@ OC.L10N.register( "Welcome mail sent!" : "Е-пошта добродошлице послата!", "Toggle user actions menu" : "Укључи/искључи мени корисничких радњи", "Edit" : "Измени", + "User management settings" : "Подешавања управљања корисницима", "Visibility" : "Видљивост", + "Show language" : "Прикажи језик", "Show user backend" : "Прикажи позадину за кориснике", "Show storage path" : "Прикажи путању до складишта", "Show last login" : "Прикажи последњу пријаву", "Send email" : "Пошаљи е-пошту", + "Send welcome email to new users" : "Пошаљи новим корисницима е-мејл добродошлице", "Defaults" : "Пордазумеване", "Default quota" : "Подразумевана квота", "Select default quota" : "Одаберите подразумевану квоту", @@ -450,10 +466,12 @@ OC.L10N.register( "Updates" : "Ажурирања", "App bundles" : "Пакети апликација", "Featured apps" : "Препоручене апликације", + "Supported apps" : "Подржане апликације", "Show to everyone" : "Прикажи свима", "Show to logged in users only" : "Прикажи само пријављеним корисницима", "Hide" : "Сакриј", "Download and enable" : "Скини и укључи", + "Allow untested app" : "Дозволи нетестиране апликације", "The app will be downloaded from the App Store" : "Апликација ће се преузети са Продавнице апликација", "This app is not marked as compatible with your Nextcloud version. If you continue you will still be able to install the app. Note that the app might not work as expected." : "Ова апликација није означена као компатибилна са Вашом верзијом Некстклауда. Ако наставите, моћи ћете свеједно да инсталирате апликацију. Врло је могуће да апликација неће радити како је планирано.", "Never" : "Никад", diff --git a/apps/settings/l10n/sr.json b/apps/settings/l10n/sr.json index e83ad9da48a..f9fe469848c 100644 --- a/apps/settings/l10n/sr.json +++ b/apps/settings/l10n/sr.json @@ -118,6 +118,7 @@ "Personal" : "Лично", "Administration" : "Администрација", "Additional settings" : "Додатне поставке", + "Artificial Intelligence" : "Вештачка интелигенција", "Administration privileges" : "Привилегије за администрацију", "Groupware" : "Радни тимови", "Overview" : "Преглед", @@ -146,6 +147,15 @@ "Profile information" : "Информације о профилу", "Profile picture, full name, email, phone number, address, website, Twitter, organisation, role, headline, biography, and whether your profile is enabled" : "Слика профила, пуно име, и-мејл, број телефона, адреса, веб сајт, Tweeter, организација, улога, насловна линија, биографија и то да ли је ваш профил укључен", "Nextcloud settings" : "Некстклауд поставке", + "Machine translation" : "Машинско превођење", + "Machine translation can be implemented by different apps. Here you can define the precedence of the machine translation apps you have installed at the moment." : "Машинско превођење могу да имплементирају разне апликације. Овде можете да дефинишете приоритет апликација машинског превођења које сте тренутно инсталирали.", + "Speech-To-Text" : "Говор-у-текст", + "Speech-To-Text can be implemented by different apps. Here you can set which app should be used." : "Говор-у-текст могу да имплементирају разне апликације. Овде можете да подесите која ће се користити.", + "None of your currently installed apps provide Speech-To-Text functionality" : "Ниједна од ваших тренутно инсталираних апликација не пружа услуагу претварања Говора-у-текст", + "Text processing" : "Обрада текста", + "Text processing tasks can be implemented by different apps. Here you can set which app should be used for which task." : "Задатке обраде текста могу да имплементирају разне апликације. Овде можете да подесите која ће се користити за који задатак.", + "Task:" : "Задатак:", + "None of your currently installed apps provide Text processing functionality" : "Ниједна од ваших тренутно инсталираних апликација не пружа функционалност обраде текста", "Here you can decide which group can access certain sections of the administration settings." : "Овде можете да одлучите која група може да приступи одређеним деловима административних подешавања.", "None" : "Ништа", "Unable to modify setting" : "Подешавање не може да се измени", @@ -240,6 +250,7 @@ "Cron (Recommended)" : "Cron (Препоручено)", "Use system cron service to call the cron.php file every 5 minutes." : "Користите системски крон сервис за позивање cron.php фајла сваких 5 минута.", "The cron.php needs to be executed by the system user \"{user}\"." : "cron.php мора да изврши системски корисник „{user}.", + "The PHP POSIX extension is required. See {linkstart}PHP documentation{linkend} for more details." : "Потребна је PHP POSIX екстензија. Погледајте {linkstart}PHP документацију{linkend} за више детаља.", "Unable to update background job mode" : "Режим позадинског посла не може да се ажурира", "Profile" : "Профил", "Enable or disable profile by default for new users." : "Профил нових корисника се подразумевано укључује или искључује.", @@ -333,6 +344,7 @@ "Add" : "Додај", "No users" : "Нема корисника", "Loading users …" : "Учитавају се корисници...", + "List of users. This list is not fully rendered for performance reasons. The users will be rendered as you navigate through the list." : "Листа корисника. Услед разлога везаних за перформансе, ова листа се не приказује у потпуности. Корисници ће се приказивати како се будете кретали кроз листу.", "Default language" : "Подразумевани језик", "Common languages" : "Најкоришћенији језици", "Other languages" : "Остали језици", @@ -385,6 +397,7 @@ "Remote wipe of devices" : "Удаљено брисање уређаја", "Wipe {userid}'s devices" : "Обриши уређај од корисника {userid}", "Wiped {userid}'s devices" : "Обрисани уређаји корисника {userid}", + "Failed to update user manager" : "Није успело ажурирање управљача корисницима", "Fully delete {userid}'s account including all their personal files, app data, etc." : "Комплетно брисање уређаја са налога корисника {userid} укључујући све личне фајлове, апликативне податке, итд.", "Account deletion" : "Брисање налога", "Delete {userid}'s account" : "Обриши налог корисника {userid}", @@ -394,11 +407,14 @@ "Welcome mail sent!" : "Е-пошта добродошлице послата!", "Toggle user actions menu" : "Укључи/искључи мени корисничких радњи", "Edit" : "Измени", + "User management settings" : "Подешавања управљања корисницима", "Visibility" : "Видљивост", + "Show language" : "Прикажи језик", "Show user backend" : "Прикажи позадину за кориснике", "Show storage path" : "Прикажи путању до складишта", "Show last login" : "Прикажи последњу пријаву", "Send email" : "Пошаљи е-пошту", + "Send welcome email to new users" : "Пошаљи новим корисницима е-мејл добродошлице", "Defaults" : "Пордазумеване", "Default quota" : "Подразумевана квота", "Select default quota" : "Одаберите подразумевану квоту", @@ -448,10 +464,12 @@ "Updates" : "Ажурирања", "App bundles" : "Пакети апликација", "Featured apps" : "Препоручене апликације", + "Supported apps" : "Подржане апликације", "Show to everyone" : "Прикажи свима", "Show to logged in users only" : "Прикажи само пријављеним корисницима", "Hide" : "Сакриј", "Download and enable" : "Скини и укључи", + "Allow untested app" : "Дозволи нетестиране апликације", "The app will be downloaded from the App Store" : "Апликација ће се преузети са Продавнице апликација", "This app is not marked as compatible with your Nextcloud version. If you continue you will still be able to install the app. Note that the app might not work as expected." : "Ова апликација није означена као компатибилна са Вашом верзијом Некстклауда. Ако наставите, моћи ћете свеједно да инсталирате апликацију. Врло је могуће да апликација неће радити како је планирано.", "Never" : "Никад", diff --git a/apps/settings/lib/Controller/CheckSetupController.php b/apps/settings/lib/Controller/CheckSetupController.php index 4a1913cedfe..0353862bab0 100644 --- a/apps/settings/lib/Controller/CheckSetupController.php +++ b/apps/settings/lib/Controller/CheckSetupController.php @@ -370,7 +370,8 @@ class CheckSetupController extends Controller { * @return bool */ private function isCorrectMemcachedPHPModuleInstalled() { - if ($this->config->getSystemValue('memcache.distributed', null) !== '\OC\Memcache\Memcached') { + $memcacheDistributedClass = $this->config->getSystemValue('memcache.distributed', null); + if ($memcacheDistributedClass === null || ltrim($memcacheDistributedClass, '\\') !== \OC\Memcache\Memcached::class) { return true; } diff --git a/apps/settings/src/components/Users/UserListHeader.vue b/apps/settings/src/components/Users/UserListHeader.vue index c81534ceac9..e600862a873 100644 --- a/apps/settings/src/components/Users/UserListHeader.vue +++ b/apps/settings/src/components/Users/UserListHeader.vue @@ -127,6 +127,7 @@ export default Vue.extend({ passwordLabel(): string { if (this.hasObfuscated) { + // TRANSLATORS This string is for a column header labelling either a password or a message that the current user has insufficient permissions return t('settings', 'Password or insufficient permissions message') } return t('settings', 'Password') diff --git a/apps/settings/src/components/Users/UserRow.vue b/apps/settings/src/components/Users/UserRow.vue index aee7c506052..40e130732d8 100644 --- a/apps/settings/src/components/Users/UserRow.vue +++ b/apps/settings/src/components/Users/UserRow.vue @@ -133,7 +133,7 @@ </label> <NcSelect :input-id="'groups' + uniqueId" :close-on-select="false" - :disabled="idState.loading.groups || isLoadingField" + :disabled="isLoadingField" :loading="idState.loading.groups" :multiple="true" :options="availableGroups" @@ -163,7 +163,7 @@ </label> <NcSelect :id="'subadmins' + uniqueId" :close-on-select="false" - :disabled="idState.loading.subadmins || isLoadingField" + :disabled="isLoadingField" :loading="idState.loading.subadmins" label="name" :multiple="true" @@ -190,7 +190,7 @@ <NcSelect v-model="editedUserQuota" :close-on-select="true" :create-option="validateQuota" - :disabled="idState.loading.quota || isLoadingField" + :disabled="isLoadingField" :loading="idState.loading.quota" :clearable="false" :input-id="'quota' + uniqueId" @@ -221,7 +221,7 @@ </label> <NcSelect :id="'language' + uniqueId" :allow-empty="false" - :disabled="idState.loading.languages || isLoadingField" + :disabled="isLoadingField" :loading="idState.loading.languages" :clearable="false" :options="availableLanguages" @@ -264,7 +264,7 @@ <NcSelect v-model="idState.currentManager" :input-id="'manager' + uniqueId" :close-on-select="true" - :disabled="idState.loading.manager || isLoadingField" + :disabled="isLoadingField" :loading="idState.loading.manager" label="displayname" :options="idState.possibleManagers" @@ -394,12 +394,15 @@ export default { editedDisplayName: this.user.displayname, editedPassword: '', editedMail: this.user.email ?? '', - // TRANSLATORS This string describes a manager in the context of an organization - managerLabel: t('settings', 'Set user manager'), } }, computed: { + managerLabel() { + // TRANSLATORS This string describes a manager in the context of an organization + return t('settings', 'Set user manager') + }, + isObfuscated() { return isObfuscated(this.user) }, @@ -568,13 +571,13 @@ export default { }) }, - updateUserManager(manager) { + async updateUserManager(manager) { if (manager === null) { this.idState.currentManager = '' } this.idState.loading.manager = true try { - this.$store.dispatch('setUserData', { + await this.$store.dispatch('setUserData', { userid: this.user.id, key: 'manager', value: this.idState.currentManager ? this.idState.currentManager.id : '', diff --git a/apps/settings/templates/settings/admin/overview.php b/apps/settings/templates/settings/admin/overview.php index c42e1e4efb8..5a53b5f68ad 100644 --- a/apps/settings/templates/settings/admin/overview.php +++ b/apps/settings/templates/settings/admin/overview.php @@ -68,7 +68,7 @@ <!-- should be the last part, so Updater can follow if enabled (it has no heading therefore). --> <h2><?php p($l->t('Version'));?></h2> <?php if ($theme->getTitle() === 'Nextcloud'): ?> - <p><strong><a href="<?php print_unescaped($theme->getBaseUrl()); ?>" rel="noreferrer noopener" target="_blank">Nextcloud Hub 5</a> (<?php p(OC_Util::getHumanVersion()) ?>)</strong></p> + <p><strong><a href="<?php print_unescaped($theme->getBaseUrl()); ?>" rel="noreferrer noopener" target="_blank">Nextcloud Hub 6</a> (<?php p(OC_Util::getHumanVersion()) ?>)</strong></p> <?php else: ?> <p><strong><a href="<?php print_unescaped($theme->getBaseUrl()); ?>" rel="noreferrer noopener" target="_blank"><?php p($theme->getTitle()); ?></a> <?php p(OC_Util::getHumanVersion()) ?></strong></p> <?php endif; ?> diff --git a/apps/theming/tests/UtilTest.php b/apps/theming/tests/UtilTest.php index febf6c0a79e..0d986a2b112 100644 --- a/apps/theming/tests/UtilTest.php +++ b/apps/theming/tests/UtilTest.php @@ -202,8 +202,8 @@ class UtilTest extends TestCase { public function dataGetAppImage() { return [ ['core', 'logo/logo.svg', \OC::$SERVERROOT . '/core/img/logo/logo.svg'], - ['files', 'external', \OC::$SERVERROOT . '/apps/files/img/external.svg'], - ['files', 'external.svg', \OC::$SERVERROOT . '/apps/files/img/external.svg'], + ['files', 'folder', \OC::$SERVERROOT . '/apps/files/img/folder.svg'], + ['files', 'folder.svg', \OC::$SERVERROOT . '/apps/files/img/folder.svg'], ['noapplikethis', 'foobar.svg', false], ]; } diff --git a/apps/updatenotification/src/components/UpdateNotification.vue b/apps/updatenotification/src/components/UpdateNotification.vue index e93b03850cc..b5f6ddc74b0 100644 --- a/apps/updatenotification/src/components/UpdateNotification.vue +++ b/apps/updatenotification/src/components/UpdateNotification.vue @@ -482,9 +482,6 @@ export default { cursor: pointer; } } - &:first-of-type { - margin-top: 0; - } } h4 { margin-block-end: 0.7rem; @@ -510,6 +507,9 @@ export default { cursor: pointer; margin-left: 3px; display: inline-block; + padding: 10px; + border-radius: 10px; + border: 2px solid var(--color-border-dark); .icon-update-menu { cursor: inherit; .icon-triangle-s { diff --git a/apps/user_status/src/components/OnlineStatusSelect.vue b/apps/user_status/src/components/OnlineStatusSelect.vue index 64f0b8e02df..934adf18d5e 100644 --- a/apps/user_status/src/components/OnlineStatusSelect.vue +++ b/apps/user_status/src/components/OnlineStatusSelect.vue @@ -109,14 +109,13 @@ $label-padding: 8px; } } - &__input:checked + &__label, - &__input:focus + &__label, - &__label:hover { - border-color: var(--color-primary-element); + &__input:checked + &__label { + outline: 2px solid var(--color-main-text); + box-shadow: 0 0 0 4px var(--color-main-background); } - &__label:active { - border-color: var(--color-border-dark); + &__input:focus-visible + &__label { + outline: 2px solid var(--color-primary-element) !important; } &__subline { |