aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
m---------3rdparty0
-rw-r--r--apps/comments/lib/Activity/Provider.php9
-rw-r--r--apps/dav/l10n/sr.js1
-rw-r--r--apps/dav/l10n/sr.json1
-rw-r--r--apps/dav/lib/CalDAV/Activity/Provider/Calendar.php7
-rw-r--r--apps/dav/lib/CalDAV/Activity/Provider/Event.php7
-rw-r--r--apps/dav/lib/CalDAV/Activity/Provider/Todo.php7
-rw-r--r--apps/dav/lib/CardDAV/Activity/Provider/Addressbook.php7
-rw-r--r--apps/dav/lib/CardDAV/Activity/Provider/Card.php7
-rw-r--r--apps/dav/lib/Connector/Sabre/File.php14
-rw-r--r--apps/dav/lib/SetupChecks/WebdavEndpoint.php2
-rw-r--r--apps/dav/lib/Storage/PublicOwnerWrapper.php12
-rw-r--r--apps/dav/tests/unit/Connector/Sabre/FileTest.php14
-rw-r--r--apps/dav/tests/unit/Connector/Sabre/NodeTest.php8
-rw-r--r--apps/encryption/l10n/hu.js1
-rw-r--r--apps/encryption/l10n/hu.json1
-rw-r--r--apps/encryption/tests/Crypto/EncryptionTest.php8
-rw-r--r--apps/encryption/tests/KeyManagerTest.php4
-rw-r--r--apps/encryption/tests/UtilTest.php4
-rw-r--r--apps/files/l10n/hu.js8
-rw-r--r--apps/files/l10n/hu.json8
-rw-r--r--apps/files/l10n/sl.js21
-rw-r--r--apps/files/l10n/sl.json21
-rw-r--r--apps/files/l10n/sr.js8
-rw-r--r--apps/files/l10n/sr.json8
-rw-r--r--apps/files/lib/Activity/FavoriteProvider.php5
-rw-r--r--apps/files/lib/Activity/Provider.php5
-rw-r--r--apps/files_external/l10n/ar.js2
-rw-r--r--apps/files_external/l10n/ar.json2
-rw-r--r--apps/files_external/l10n/de_DE.js2
-rw-r--r--apps/files_external/l10n/de_DE.json2
-rw-r--r--apps/files_external/l10n/en_GB.js4
-rw-r--r--apps/files_external/l10n/en_GB.json4
-rw-r--r--apps/files_external/l10n/ga.js2
-rw-r--r--apps/files_external/l10n/ga.json2
-rw-r--r--apps/files_external/l10n/gl.js2
-rw-r--r--apps/files_external/l10n/gl.json2
-rw-r--r--apps/files_external/l10n/pt_BR.js2
-rw-r--r--apps/files_external/l10n/pt_BR.json2
-rw-r--r--apps/files_external/l10n/sr.js5
-rw-r--r--apps/files_external/l10n/sr.json5
-rw-r--r--apps/files_external/l10n/sv.js4
-rw-r--r--apps/files_external/l10n/sv.json4
-rw-r--r--apps/files_external/l10n/tr.js2
-rw-r--r--apps/files_external/l10n/tr.json2
-rw-r--r--apps/files_external/l10n/zh_HK.js2
-rw-r--r--apps/files_external/l10n/zh_HK.json2
-rw-r--r--apps/files_external/lib/Config/ConfigAdapter.php20
-rw-r--r--apps/files_external/lib/Lib/Auth/Password/SessionCredentials.php4
-rw-r--r--apps/files_external/lib/Lib/StorageModifierTrait.php12
-rw-r--r--apps/files_reminders/l10n/hu.js4
-rw-r--r--apps/files_reminders/l10n/hu.json4
-rw-r--r--apps/files_sharing/l10n/hu.js2
-rw-r--r--apps/files_sharing/l10n/hu.json2
-rw-r--r--apps/files_sharing/l10n/sr.js16
-rw-r--r--apps/files_sharing/l10n/sr.json16
-rw-r--r--apps/files_sharing/lib/Activity/Providers/Base.php5
-rw-r--r--apps/files_sharing/lib/External/Storage.php8
-rw-r--r--apps/files_sharing/lib/SharedStorage.php25
-rw-r--r--apps/files_sharing/tests/Controller/ShareAPIControllerTest.php32
-rw-r--r--apps/files_sharing/tests/SharedStorageTest.php6
-rw-r--r--apps/files_trashbin/lib/Trashbin.php12
-rw-r--r--apps/files_versions/lib/Versions/LegacyVersionsBackend.php4
-rw-r--r--apps/oauth2/l10n/sr.js1
-rw-r--r--apps/oauth2/l10n/sr.json1
-rw-r--r--apps/settings/composer/composer/autoload_classmap.php1
-rw-r--r--apps/settings/composer/composer/autoload_static.php1
-rw-r--r--apps/settings/l10n/ar.js7
-rw-r--r--apps/settings/l10n/ar.json7
-rw-r--r--apps/settings/l10n/ast.js2
-rw-r--r--apps/settings/l10n/ast.json2
-rw-r--r--apps/settings/l10n/cs.js1
-rw-r--r--apps/settings/l10n/cs.json1
-rw-r--r--apps/settings/l10n/da.js4
-rw-r--r--apps/settings/l10n/da.json4
-rw-r--r--apps/settings/l10n/de.js7
-rw-r--r--apps/settings/l10n/de.json7
-rw-r--r--apps/settings/l10n/de_DE.js7
-rw-r--r--apps/settings/l10n/de_DE.json7
-rw-r--r--apps/settings/l10n/en_GB.js7
-rw-r--r--apps/settings/l10n/en_GB.json7
-rw-r--r--apps/settings/l10n/es.js7
-rw-r--r--apps/settings/l10n/es.json7
-rw-r--r--apps/settings/l10n/es_MX.js2
-rw-r--r--apps/settings/l10n/es_MX.json2
-rw-r--r--apps/settings/l10n/eu.js7
-rw-r--r--apps/settings/l10n/eu.json7
-rw-r--r--apps/settings/l10n/fi.js1
-rw-r--r--apps/settings/l10n/fi.json1
-rw-r--r--apps/settings/l10n/fr.js7
-rw-r--r--apps/settings/l10n/fr.json7
-rw-r--r--apps/settings/l10n/ga.js7
-rw-r--r--apps/settings/l10n/ga.json7
-rw-r--r--apps/settings/l10n/gl.js7
-rw-r--r--apps/settings/l10n/gl.json7
-rw-r--r--apps/settings/l10n/ja.js7
-rw-r--r--apps/settings/l10n/ja.json7
-rw-r--r--apps/settings/l10n/nb.js7
-rw-r--r--apps/settings/l10n/nb.json7
-rw-r--r--apps/settings/l10n/pl.js2
-rw-r--r--apps/settings/l10n/pl.json2
-rw-r--r--apps/settings/l10n/pt_BR.js7
-rw-r--r--apps/settings/l10n/pt_BR.json7
-rw-r--r--apps/settings/l10n/ru.js7
-rw-r--r--apps/settings/l10n/ru.json7
-rw-r--r--apps/settings/l10n/sk.js7
-rw-r--r--apps/settings/l10n/sk.json7
-rw-r--r--apps/settings/l10n/sl.js5
-rw-r--r--apps/settings/l10n/sl.json5
-rw-r--r--apps/settings/l10n/sr.js11
-rw-r--r--apps/settings/l10n/sr.json11
-rw-r--r--apps/settings/l10n/tr.js7
-rw-r--r--apps/settings/l10n/tr.json7
-rw-r--r--apps/settings/l10n/zh_CN.js3
-rw-r--r--apps/settings/l10n/zh_CN.json3
-rw-r--r--apps/settings/l10n/zh_HK.js7
-rw-r--r--apps/settings/l10n/zh_HK.json7
-rw-r--r--apps/settings/l10n/zh_TW.js7
-rw-r--r--apps/settings/l10n/zh_TW.json7
-rw-r--r--apps/settings/lib/Activity/GroupProvider.php6
-rw-r--r--apps/settings/lib/Activity/Provider.php7
-rw-r--r--apps/settings/lib/Activity/SecurityProvider.php6
-rw-r--r--apps/settings/lib/Controller/AdminSettingsController.php36
-rw-r--r--apps/settings/lib/Controller/CommonSettingsTrait.php2
-rw-r--r--apps/settings/lib/Controller/PersonalSettingsController.php34
-rw-r--r--apps/settings/lib/Settings/Admin/Mail.php3
-rw-r--r--apps/settings/lib/SetupChecks/DataDirectoryProtected.php1
-rw-r--r--apps/settings/lib/SetupChecks/JavaScriptModules.php3
-rw-r--r--apps/settings/lib/SetupChecks/JavaScriptSourceMaps.php3
-rw-r--r--apps/settings/lib/SetupChecks/OcxProviders.php1
-rw-r--r--apps/settings/lib/SetupChecks/SecurityHeaders.php5
-rw-r--r--apps/settings/lib/SetupChecks/WellKnownUrls.php1
-rw-r--r--apps/settings/lib/SetupChecks/Woff2Loading.php3
-rw-r--r--apps/settings/src/router/routes.ts6
-rw-r--r--apps/settings/src/views/AppStoreNavigation.vue3
-rw-r--r--apps/settings/tests/Settings/Admin/MailTest.php3
-rw-r--r--apps/sharebymail/lib/Activity.php5
-rw-r--r--apps/systemtags/lib/Activity/Provider.php5
-rw-r--r--apps/twofactor_backupcodes/lib/Activity/Provider.php6
-rw-r--r--apps/user_ldap/l10n/ar.js4
-rw-r--r--apps/user_ldap/l10n/ar.json4
-rw-r--r--apps/user_ldap/l10n/de.js4
-rw-r--r--apps/user_ldap/l10n/de.json4
-rw-r--r--apps/user_ldap/l10n/de_DE.js4
-rw-r--r--apps/user_ldap/l10n/de_DE.json4
-rw-r--r--apps/user_ldap/l10n/en_GB.js4
-rw-r--r--apps/user_ldap/l10n/en_GB.json4
-rw-r--r--apps/user_ldap/l10n/es.js4
-rw-r--r--apps/user_ldap/l10n/es.json4
-rw-r--r--apps/user_ldap/l10n/es_MX.js4
-rw-r--r--apps/user_ldap/l10n/es_MX.json4
-rw-r--r--apps/user_ldap/l10n/eu.js4
-rw-r--r--apps/user_ldap/l10n/eu.json4
-rw-r--r--apps/user_ldap/l10n/fr.js4
-rw-r--r--apps/user_ldap/l10n/fr.json4
-rw-r--r--apps/user_ldap/l10n/ga.js4
-rw-r--r--apps/user_ldap/l10n/ga.json4
-rw-r--r--apps/user_ldap/l10n/gl.js4
-rw-r--r--apps/user_ldap/l10n/gl.json4
-rw-r--r--apps/user_ldap/l10n/ja.js4
-rw-r--r--apps/user_ldap/l10n/ja.json4
-rw-r--r--apps/user_ldap/l10n/nb.js4
-rw-r--r--apps/user_ldap/l10n/nb.json4
-rw-r--r--apps/user_ldap/l10n/pt_BR.js4
-rw-r--r--apps/user_ldap/l10n/pt_BR.json4
-rw-r--r--apps/user_ldap/l10n/sk.js4
-rw-r--r--apps/user_ldap/l10n/sk.json4
-rw-r--r--apps/user_ldap/l10n/sr.js4
-rw-r--r--apps/user_ldap/l10n/sr.json4
-rw-r--r--apps/user_ldap/l10n/sv.js4
-rw-r--r--apps/user_ldap/l10n/sv.json4
-rw-r--r--apps/user_ldap/l10n/tr.js4
-rw-r--r--apps/user_ldap/l10n/tr.json4
-rw-r--r--apps/user_ldap/l10n/zh_HK.js4
-rw-r--r--apps/user_ldap/l10n/zh_HK.json4
-rw-r--r--apps/user_ldap/l10n/zh_TW.js4
-rw-r--r--apps/user_ldap/l10n/zh_TW.json4
-rw-r--r--apps/workflowengine/l10n/sl.js1
-rw-r--r--apps/workflowengine/l10n/sl.json1
-rw-r--r--build/psalm-baseline.xml14
-rw-r--r--core/js/mimetypelist.js43
-rw-r--r--core/l10n/hu.js6
-rw-r--r--core/l10n/hu.json6
-rw-r--r--core/l10n/sl.js5
-rw-r--r--core/l10n/sl.json5
-rw-r--r--core/l10n/sr.js5
-rw-r--r--core/l10n/sr.json5
-rw-r--r--dist/settings-apps-view-4529.js4
-rw-r--r--dist/settings-apps-view-4529.js.map2
-rw-r--r--dist/settings-vue-settings-apps-users-management.js4
-rw-r--r--dist/settings-vue-settings-apps-users-management.js.map2
-rw-r--r--lib/composer/composer/autoload_classmap.php2
-rw-r--r--lib/composer/composer/autoload_static.php2
-rw-r--r--lib/l10n/ar.js1
-rw-r--r--lib/l10n/ar.json1
-rw-r--r--lib/l10n/da.js1
-rw-r--r--lib/l10n/da.json1
-rw-r--r--lib/l10n/de.js1
-rw-r--r--lib/l10n/de.json1
-rw-r--r--lib/l10n/de_DE.js1
-rw-r--r--lib/l10n/de_DE.json1
-rw-r--r--lib/l10n/en_GB.js1
-rw-r--r--lib/l10n/en_GB.json1
-rw-r--r--lib/l10n/es.js1
-rw-r--r--lib/l10n/es.json1
-rw-r--r--lib/l10n/eu.js1
-rw-r--r--lib/l10n/eu.json1
-rw-r--r--lib/l10n/fr.js1
-rw-r--r--lib/l10n/fr.json1
-rw-r--r--lib/l10n/ga.js1
-rw-r--r--lib/l10n/ga.json1
-rw-r--r--lib/l10n/gl.js1
-rw-r--r--lib/l10n/gl.json1
-rw-r--r--lib/l10n/ja.js1
-rw-r--r--lib/l10n/ja.json1
-rw-r--r--lib/l10n/nb.js1
-rw-r--r--lib/l10n/nb.json1
-rw-r--r--lib/l10n/pt_BR.js1
-rw-r--r--lib/l10n/pt_BR.json1
-rw-r--r--lib/l10n/ru.js1
-rw-r--r--lib/l10n/ru.json1
-rw-r--r--lib/l10n/sk.js1
-rw-r--r--lib/l10n/sk.json1
-rw-r--r--lib/l10n/sl.js1
-rw-r--r--lib/l10n/sl.json1
-rw-r--r--lib/l10n/sr.js42
-rw-r--r--lib/l10n/sr.json42
-rw-r--r--lib/l10n/tr.js1
-rw-r--r--lib/l10n/tr.json1
-rw-r--r--lib/l10n/zh_HK.js1
-rw-r--r--lib/l10n/zh_HK.json1
-rw-r--r--lib/l10n/zh_TW.js1
-rw-r--r--lib/l10n/zh_TW.json1
-rw-r--r--lib/private/App/AppStore/Fetcher/AppFetcher.php9
-rw-r--r--lib/private/App/AppStore/Fetcher/Fetcher.php1
-rw-r--r--lib/private/Config.php18
-rw-r--r--lib/private/Files/Cache/Scanner.php13
-rw-r--r--lib/private/Files/Node/Folder.php2
-rw-r--r--lib/private/Files/Node/Root.php19
-rw-r--r--lib/private/Files/ObjectStore/HomeObjectStoreStorage.php8
-rw-r--r--lib/private/Files/ObjectStore/ObjectStoreStorage.php5
-rw-r--r--lib/private/Files/Storage/Common.php73
-rw-r--r--lib/private/Files/Storage/Home.php16
-rw-r--r--lib/private/Files/Storage/Local.php5
-rw-r--r--lib/private/Files/Storage/Storage.php77
-rw-r--r--lib/private/Files/Storage/StorageFactory.php11
-rw-r--r--lib/private/Files/Storage/Temporary.php2
-rw-r--r--lib/private/Files/Storage/Wrapper/Availability.php6
-rw-r--r--lib/private/Files/Storage/Wrapper/Encoding.php24
-rw-r--r--lib/private/Files/Storage/Wrapper/Jail.php48
-rw-r--r--lib/private/Files/Storage/Wrapper/PermissionsMask.php7
-rw-r--r--lib/private/Files/Storage/Wrapper/Wrapper.php59
-rw-r--r--lib/private/Files/View.php44
-rw-r--r--lib/private/FilesMetadata/FilesMetadataManager.php2
-rw-r--r--lib/private/Lockdown/Filesystem/NullStorage.php4
-rw-r--r--lib/private/Mail/Mailer.php5
-rw-r--r--lib/private/Repair.php9
-rw-r--r--lib/private/Repair/RepairMimeTypes.php102
-rw-r--r--lib/private/Server.php131
-rw-r--r--lib/private/Settings/Manager.php18
-rw-r--r--lib/private/legacy/OC_App.php32
-rw-r--r--lib/private/legacy/OC_Helper.php3
-rw-r--r--lib/private/legacy/template/functions.php7
-rw-r--r--lib/public/Files/Storage.php445
-rw-r--r--lib/public/Files/Storage/IStorage.php9
-rw-r--r--lib/public/Files/Storage/IStorageFactory.php4
-rw-r--r--lib/public/SetupCheck/CheckServerResponseTrait.php (renamed from apps/settings/lib/SetupChecks/CheckServerResponseTrait.php)59
-rw-r--r--resources/config/mimetypealiases.dist.json43
-rw-r--r--resources/config/mimetypemapping.dist.json3
-rw-r--r--tests/data/integritycheck/mimetypeListModified/core/js/mimetypelist.js41
-rw-r--r--tests/data/integritycheck/mimetypeListModified/core/signature.json4
-rw-r--r--tests/lib/ConfigTest.php7
-rw-r--r--tests/lib/Encryption/DecryptAllTest.php6
-rw-r--r--tests/lib/Encryption/EncryptionWrapperTest.php7
-rw-r--r--tests/lib/Files/Mount/MountPointTest.php4
-rw-r--r--tests/lib/Files/Node/FolderTest.php18
-rw-r--r--tests/lib/Files/Node/NodeTest.php4
-rw-r--r--tests/lib/Files/Storage/Storage.php3
-rw-r--r--tests/lib/Files/Storage/StorageFactoryTest.php2
-rw-r--r--tests/lib/Lockdown/Filesystem/NullStorageTest.php8
-rw-r--r--tests/lib/Mail/MailerTest.php3
-rw-r--r--tests/lib/SetupCheck/CheckServerResponseTraitImplementation.php (renamed from apps/settings/tests/SetupChecks/CheckServerResponseTraitImplementation.php)5
-rw-r--r--tests/lib/SetupCheck/CheckServerResponseTraitTest.php (renamed from apps/settings/tests/SetupChecks/CheckServerResponseTraitTest.php)2
-rw-r--r--tests/lib/Share20/ManagerTest.php26
284 files changed, 969 insertions, 1742 deletions
diff --git a/3rdparty b/3rdparty
-Subproject 9e4e23d28d717e08f2b14ac6aa19d0bec25f6be
+Subproject 1a2aa63f6522fadc18f266f3806e06788f63ee1
diff --git a/apps/comments/lib/Activity/Provider.php b/apps/comments/lib/Activity/Provider.php
index e537070a552..4fb0c8d58be 100644
--- a/apps/comments/lib/Activity/Provider.php
+++ b/apps/comments/lib/Activity/Provider.php
@@ -5,6 +5,7 @@
*/
namespace OCA\Comments\Activity;
+use OCP\Activity\Exceptions\UnknownActivityException;
use OCP\Activity\IEvent;
use OCP\Activity\IManager;
use OCP\Activity\IProvider;
@@ -32,12 +33,12 @@ class Provider implements IProvider {
* @param IEvent $event
* @param IEvent|null $previousEvent
* @return IEvent
- * @throws \InvalidArgumentException
+ * @throws UnknownActivityException
* @since 11.0.0
*/
public function parse($language, IEvent $event, ?IEvent $previousEvent = null): IEvent {
if ($event->getApp() !== 'comments') {
- throw new \InvalidArgumentException();
+ throw new UnknownActivityException();
}
$this->l = $this->languageFactory->get('comments', $language);
@@ -59,9 +60,9 @@ class Provider implements IProvider {
}
return $this->parseLongVersion($event);
- } else {
- throw new \InvalidArgumentException();
}
+ throw new UnknownActivityException();
+
}
/**
diff --git a/apps/dav/l10n/sr.js b/apps/dav/l10n/sr.js
index 5840e71817f..2359f1b7ee8 100644
--- a/apps/dav/l10n/sr.js
+++ b/apps/dav/l10n/sr.js
@@ -212,6 +212,7 @@ OC.L10N.register(
"Failed to unlink: %1$s" : "Није успело уклањање линка: %1$s",
"Failed to write file contents: %1$s" : "Није успело уписивање садржаја фајла: %1$s",
"File not found: %1$s" : "Фајл не може да се пронађе: %1$s",
+ "Invalid target path" : "Неисправна путања циља",
"System is in maintenance mode." : "Систем је у режиму одржавања.",
"Upgrade needed" : "Потребна надградња",
"Your %s needs to be configured to use HTTPS in order to use CalDAV and CardDAV with iOS/macOS." : "%s мора да буде подешен да користи HTTPS да бисте користи CalDAV и CardDAV са iOS/macOS-ом.",
diff --git a/apps/dav/l10n/sr.json b/apps/dav/l10n/sr.json
index 3d40364654a..e2e9e6f8787 100644
--- a/apps/dav/l10n/sr.json
+++ b/apps/dav/l10n/sr.json
@@ -210,6 +210,7 @@
"Failed to unlink: %1$s" : "Није успело уклањање линка: %1$s",
"Failed to write file contents: %1$s" : "Није успело уписивање садржаја фајла: %1$s",
"File not found: %1$s" : "Фајл не може да се пронађе: %1$s",
+ "Invalid target path" : "Неисправна путања циља",
"System is in maintenance mode." : "Систем је у режиму одржавања.",
"Upgrade needed" : "Потребна надградња",
"Your %s needs to be configured to use HTTPS in order to use CalDAV and CardDAV with iOS/macOS." : "%s мора да буде подешен да користи HTTPS да бисте користи CalDAV и CardDAV са iOS/macOS-ом.",
diff --git a/apps/dav/lib/CalDAV/Activity/Provider/Calendar.php b/apps/dav/lib/CalDAV/Activity/Provider/Calendar.php
index a7509831f29..25d3260c7a6 100644
--- a/apps/dav/lib/CalDAV/Activity/Provider/Calendar.php
+++ b/apps/dav/lib/CalDAV/Activity/Provider/Calendar.php
@@ -5,6 +5,7 @@
*/
namespace OCA\DAV\CalDAV\Activity\Provider;
+use OCP\Activity\Exceptions\UnknownActivityException;
use OCP\Activity\IEvent;
use OCP\Activity\IEventMerger;
use OCP\Activity\IManager;
@@ -59,12 +60,12 @@ class Calendar extends Base {
* @param IEvent $event
* @param IEvent|null $previousEvent
* @return IEvent
- * @throws \InvalidArgumentException
+ * @throws UnknownActivityException
* @since 11.0.0
*/
public function parse($language, IEvent $event, ?IEvent $previousEvent = null) {
if ($event->getApp() !== 'dav' || $event->getType() !== 'calendar') {
- throw new \InvalidArgumentException();
+ throw new UnknownActivityException();
}
$this->l = $this->languageFactory->get('dav', $language);
@@ -122,7 +123,7 @@ class Calendar extends Base {
} elseif ($event->getSubject() === self::SUBJECT_UNSHARE_GROUP . '_by') {
$subject = $this->l->t('{actor} unshared calendar {calendar} from group {group}');
} else {
- throw new \InvalidArgumentException();
+ throw new UnknownActivityException();
}
$parsedParameters = $this->getParameters($event);
diff --git a/apps/dav/lib/CalDAV/Activity/Provider/Event.php b/apps/dav/lib/CalDAV/Activity/Provider/Event.php
index 959c0a815dd..26bf69aecdd 100644
--- a/apps/dav/lib/CalDAV/Activity/Provider/Event.php
+++ b/apps/dav/lib/CalDAV/Activity/Provider/Event.php
@@ -6,6 +6,7 @@
namespace OCA\DAV\CalDAV\Activity\Provider;
use OC_App;
+use OCP\Activity\Exceptions\UnknownActivityException;
use OCP\Activity\IEvent;
use OCP\Activity\IEventMerger;
use OCP\Activity\IManager;
@@ -106,12 +107,12 @@ class Event extends Base {
* @param IEvent $event
* @param IEvent|null $previousEvent
* @return IEvent
- * @throws \InvalidArgumentException
+ * @throws UnknownActivityException
* @since 11.0.0
*/
public function parse($language, IEvent $event, ?IEvent $previousEvent = null) {
if ($event->getApp() !== 'dav' || $event->getType() !== 'calendar_event') {
- throw new \InvalidArgumentException();
+ throw new UnknownActivityException();
}
$this->l = $this->languageFactory->get('dav', $language);
@@ -147,7 +148,7 @@ class Event extends Base {
} elseif ($event->getSubject() === self::SUBJECT_OBJECT_RESTORE . '_event_self') {
$subject = $this->l->t('You restored event {event} of calendar {calendar}');
} else {
- throw new \InvalidArgumentException();
+ throw new UnknownActivityException();
}
$parsedParameters = $this->getParameters($event);
diff --git a/apps/dav/lib/CalDAV/Activity/Provider/Todo.php b/apps/dav/lib/CalDAV/Activity/Provider/Todo.php
index 68a95341ff2..1e817663439 100644
--- a/apps/dav/lib/CalDAV/Activity/Provider/Todo.php
+++ b/apps/dav/lib/CalDAV/Activity/Provider/Todo.php
@@ -5,6 +5,7 @@
*/
namespace OCA\DAV\CalDAV\Activity\Provider;
+use OCP\Activity\Exceptions\UnknownActivityException;
use OCP\Activity\IEvent;
class Todo extends Event {
@@ -14,12 +15,12 @@ class Todo extends Event {
* @param IEvent $event
* @param IEvent|null $previousEvent
* @return IEvent
- * @throws \InvalidArgumentException
+ * @throws UnknownActivityException
* @since 11.0.0
*/
public function parse($language, IEvent $event, ?IEvent $previousEvent = null) {
if ($event->getApp() !== 'dav' || $event->getType() !== 'calendar_todo') {
- throw new \InvalidArgumentException();
+ throw new UnknownActivityException();
}
$this->l = $this->languageFactory->get('dav', $language);
@@ -55,7 +56,7 @@ class Todo extends Event {
} elseif ($event->getSubject() === self::SUBJECT_OBJECT_MOVE . '_todo_self') {
$subject = $this->l->t('You moved to-do {todo} from list {sourceCalendar} to list {targetCalendar}');
} else {
- throw new \InvalidArgumentException();
+ throw new UnknownActivityException();
}
$parsedParameters = $this->getParameters($event);
diff --git a/apps/dav/lib/CardDAV/Activity/Provider/Addressbook.php b/apps/dav/lib/CardDAV/Activity/Provider/Addressbook.php
index 189c6a8e9ed..31f26554d67 100644
--- a/apps/dav/lib/CardDAV/Activity/Provider/Addressbook.php
+++ b/apps/dav/lib/CardDAV/Activity/Provider/Addressbook.php
@@ -8,6 +8,7 @@ declare(strict_types=1);
*/
namespace OCA\DAV\CardDAV\Activity\Provider;
+use OCP\Activity\Exceptions\UnknownActivityException;
use OCP\Activity\IEvent;
use OCP\Activity\IEventMerger;
use OCP\Activity\IManager;
@@ -52,11 +53,11 @@ class Addressbook extends Base {
* @param IEvent $event
* @param IEvent|null $previousEvent
* @return IEvent
- * @throws \InvalidArgumentException
+ * @throws UnknownActivityException
*/
public function parse($language, IEvent $event, ?IEvent $previousEvent = null): IEvent {
if ($event->getApp() !== 'dav' || $event->getType() !== 'contacts') {
- throw new \InvalidArgumentException();
+ throw new UnknownActivityException();
}
$l = $this->languageFactory->get('dav', $language);
@@ -102,7 +103,7 @@ class Addressbook extends Base {
} elseif ($event->getSubject() === self::SUBJECT_UNSHARE_GROUP . '_by') {
$subject = $l->t('{actor} unshared address book {addressbook} from group {group}');
} else {
- throw new \InvalidArgumentException();
+ throw new UnknownActivityException();
}
$parsedParameters = $this->getParameters($event, $l);
diff --git a/apps/dav/lib/CardDAV/Activity/Provider/Card.php b/apps/dav/lib/CardDAV/Activity/Provider/Card.php
index 7e8bf9b0d4d..aa821f592d9 100644
--- a/apps/dav/lib/CardDAV/Activity/Provider/Card.php
+++ b/apps/dav/lib/CardDAV/Activity/Provider/Card.php
@@ -8,6 +8,7 @@ declare(strict_types=1);
*/
namespace OCA\DAV\CardDAV\Activity\Provider;
+use OCP\Activity\Exceptions\UnknownActivityException;
use OCP\Activity\IEvent;
use OCP\Activity\IEventMerger;
use OCP\Activity\IManager;
@@ -54,11 +55,11 @@ class Card extends Base {
* @param IEvent $event
* @param IEvent|null $previousEvent
* @return IEvent
- * @throws \InvalidArgumentException
+ * @throws UnknownActivityException
*/
public function parse($language, IEvent $event, ?IEvent $previousEvent = null): IEvent {
if ($event->getApp() !== 'dav' || $event->getType() !== 'contacts') {
- throw new \InvalidArgumentException();
+ throw new UnknownActivityException();
}
$l = $this->languageFactory->get('dav', $language);
@@ -82,7 +83,7 @@ class Card extends Base {
} elseif ($event->getSubject() === self::SUBJECT_UPDATE . '_self') {
$subject = $l->t('You updated contact {card} in address book {addressbook}');
} else {
- throw new \InvalidArgumentException();
+ throw new UnknownActivityException();
}
$parsedParameters = $this->getParameters($event, $l);
diff --git a/apps/dav/lib/Connector/Sabre/File.php b/apps/dav/lib/Connector/Sabre/File.php
index 0b9199492fe..34cc2b77b37 100644
--- a/apps/dav/lib/Connector/Sabre/File.php
+++ b/apps/dav/lib/Connector/Sabre/File.php
@@ -28,7 +28,7 @@ use OCP\Files\InvalidPathException;
use OCP\Files\LockNotAcquiredException;
use OCP\Files\NotFoundException;
use OCP\Files\NotPermittedException;
-use OCP\Files\Storage;
+use OCP\Files\Storage\IWriteStreamStorage;
use OCP\Files\StorageNotAvailableException;
use OCP\IL10N;
use OCP\IRequest;
@@ -117,8 +117,10 @@ class File extends Node implements IFile {
// verify path of the target
$this->verifyPath();
- /** @var Storage $partStorage */
[$partStorage] = $this->fileView->resolvePath($this->path);
+ if ($partStorage === null) {
+ throw new ServiceUnavailable($this->l10n->t('Failed to get storage for file'));
+ }
$needsPartFile = $partStorage->needsPartFile() && (strlen($this->path) > 1);
$view = \OC\Files\Filesystem::getView();
@@ -141,10 +143,11 @@ class File extends Node implements IFile {
}
// the part file and target file might be on a different storage in case of a single file storage (e.g. single file share)
- /** @var \OC\Files\Storage\Storage $partStorage */
[$partStorage, $internalPartPath] = $this->fileView->resolvePath($partFilePath);
- /** @var \OC\Files\Storage\Storage $storage */
[$storage, $internalPath] = $this->fileView->resolvePath($this->path);
+ if ($partStorage === null || $storage === null) {
+ throw new ServiceUnavailable($this->l10n->t('Failed to get storage for file'));
+ }
try {
if (!$needsPartFile) {
try {
@@ -196,7 +199,7 @@ class File extends Node implements IFile {
}
}
- if ($partStorage->instanceOfStorage(Storage\IWriteStreamStorage::class)) {
+ if ($partStorage->instanceOfStorage(IWriteStreamStorage::class)) {
$isEOF = false;
$wrappedData = CallbackWrapper::wrap($data, null, null, null, null, function ($stream) use (&$isEOF) {
$isEOF = feof($stream);
@@ -535,7 +538,6 @@ class File extends Node implements IFile {
if (\OCP\Server::get(\OCP\App\IAppManager::class)->isEnabledForUser('encryption')) {
return [];
}
- /** @var \OCP\Files\Storage $storage */
[$storage, $internalPath] = $this->fileView->resolvePath($this->path);
if (is_null($storage)) {
return [];
diff --git a/apps/dav/lib/SetupChecks/WebdavEndpoint.php b/apps/dav/lib/SetupChecks/WebdavEndpoint.php
index f5a387836fb..c2574202fcd 100644
--- a/apps/dav/lib/SetupChecks/WebdavEndpoint.php
+++ b/apps/dav/lib/SetupChecks/WebdavEndpoint.php
@@ -9,11 +9,11 @@ declare(strict_types=1);
namespace OCA\DAV\SetupChecks;
-use OCA\Settings\SetupChecks\CheckServerResponseTrait;
use OCP\Http\Client\IClientService;
use OCP\IConfig;
use OCP\IL10N;
use OCP\IURLGenerator;
+use OCP\SetupCheck\CheckServerResponseTrait;
use OCP\SetupCheck\ISetupCheck;
use OCP\SetupCheck\SetupResult;
use Psr\Log\LoggerInterface;
diff --git a/apps/dav/lib/Storage/PublicOwnerWrapper.php b/apps/dav/lib/Storage/PublicOwnerWrapper.php
index 6523c4c7cad..91c1916dc39 100644
--- a/apps/dav/lib/Storage/PublicOwnerWrapper.php
+++ b/apps/dav/lib/Storage/PublicOwnerWrapper.php
@@ -12,8 +12,7 @@ use OC\Files\Storage\Wrapper\Wrapper;
class PublicOwnerWrapper extends Wrapper {
- /** @var string */
- private $owner;
+ private string $owner;
/**
* @param array $arguments ['storage' => $storage, 'owner' => $owner]
@@ -26,13 +25,12 @@ class PublicOwnerWrapper extends Wrapper {
$this->owner = $arguments['owner'];
}
- public function getOwner($path) {
+ public function getOwner($path): string|false {
$owner = parent::getOwner($path);
-
- if ($owner === null || $owner === false) {
- return $this->owner;
+ if ($owner !== false) {
+ return $owner;
}
- return $owner;
+ return $this->owner;
}
}
diff --git a/apps/dav/tests/unit/Connector/Sabre/FileTest.php b/apps/dav/tests/unit/Connector/Sabre/FileTest.php
index 6f9a214fab9..55a6783225d 100644
--- a/apps/dav/tests/unit/Connector/Sabre/FileTest.php
+++ b/apps/dav/tests/unit/Connector/Sabre/FileTest.php
@@ -17,7 +17,7 @@ use OCA\DAV\Connector\Sabre\File;
use OCP\Constants;
use OCP\Files\FileInfo;
use OCP\Files\ForbiddenException;
-use OCP\Files\Storage;
+use OCP\Files\Storage\IStorage;
use OCP\IConfig;
use OCP\IRequestId;
use OCP\ITempManager;
@@ -72,11 +72,8 @@ class FileTest extends TestCase {
parent::tearDown();
}
- /**
- * @return MockObject|Storage
- */
- private function getMockStorage() {
- $storage = $this->getMockBuilder(Storage::class)
+ private function getMockStorage(): MockObject&IStorage {
+ $storage = $this->getMockBuilder(IStorage::class)
->disableOriginalConstructor()
->getMock();
$storage->method('getId')
@@ -84,10 +81,7 @@ class FileTest extends TestCase {
return $storage;
}
- /**
- * @param string $string
- */
- private function getStream($string) {
+ private function getStream(string $string) {
$stream = fopen('php://temp', 'r+');
fwrite($stream, $string);
fseek($stream, 0);
diff --git a/apps/dav/tests/unit/Connector/Sabre/NodeTest.php b/apps/dav/tests/unit/Connector/Sabre/NodeTest.php
index 83f4139a2d9..c5e2b03d8b4 100644
--- a/apps/dav/tests/unit/Connector/Sabre/NodeTest.php
+++ b/apps/dav/tests/unit/Connector/Sabre/NodeTest.php
@@ -18,7 +18,7 @@ use OCA\Files_Sharing\SharedStorage;
use OCP\Constants;
use OCP\Files\Cache\ICacheEntry;
use OCP\Files\Mount\IMountPoint;
-use OCP\Files\Storage;
+use OCP\Files\Storage\IStorage;
use OCP\ICache;
use OCP\Share\IManager;
use OCP\Share\IShare;
@@ -75,7 +75,7 @@ class NodeTest extends \Test\TestCase {
return $this->createMock(MountPoint::class);
}
});
- $storage = $this->createMock(Storage\IStorage::class);
+ $storage = $this->createMock(IStorage::class);
if ($shared) {
$storage->method('instanceOfStorage')
->willReturn(true);
@@ -145,7 +145,7 @@ class NodeTest extends \Test\TestCase {
* @dataProvider sharePermissionsProvider
*/
public function testSharePermissions($type, $user, $permissions, $expected): void {
- $storage = $this->getMockBuilder(Storage::class)
+ $storage = $this->getMockBuilder(IStorage::class)
->disableOriginalConstructor()
->getMock();
$storage->method('getPermissions')->willReturn($permissions);
@@ -223,7 +223,7 @@ class NodeTest extends \Test\TestCase {
}
public function testShareAttributesNonShare(): void {
- $storage = $this->getMockBuilder(Storage::class)
+ $storage = $this->getMockBuilder(IStorage::class)
->disableOriginalConstructor()
->getMock();
diff --git a/apps/encryption/l10n/hu.js b/apps/encryption/l10n/hu.js
index 4ae0c08fdcb..e4c7647116a 100644
--- a/apps/encryption/l10n/hu.js
+++ b/apps/encryption/l10n/hu.js
@@ -42,6 +42,7 @@ OC.L10N.register(
"Enabling this option encrypts all files stored on the main storage, otherwise only files on external storage will be encrypted" : "A lehetőség engedélyezésekor minden fájlt titkosít a fő tárolóban, egyébként csak a külső tárolókon lévő fájlok lesznek titkosítva",
"Enable recovery key" : "Helyreállítási kulcs engedélyezése",
"Disable recovery key" : "Helyreállítási kulcs letiltása",
+ "The recovery key is an additional encryption key used to encrypt files. It is used to recover files from an account if the password is forgotten." : "A helyreállítási kulcs egy további titkosítási kulcs fájlok titkosításához. Arra szolgál, hogy egy fiókból vissza lehessen állítani a fájlokat, ha a jelszót elfelejtették.",
"Recovery key password" : "Helyreállítási kulcs jelszava",
"Repeat recovery key password" : "Ismételje meg a heylreállítási kulcs jelszavát",
"Change recovery key password:" : "Helyreállítási kulcs jelszavának módosítása:",
diff --git a/apps/encryption/l10n/hu.json b/apps/encryption/l10n/hu.json
index ebdb124c381..796fb819245 100644
--- a/apps/encryption/l10n/hu.json
+++ b/apps/encryption/l10n/hu.json
@@ -40,6 +40,7 @@
"Enabling this option encrypts all files stored on the main storage, otherwise only files on external storage will be encrypted" : "A lehetőség engedélyezésekor minden fájlt titkosít a fő tárolóban, egyébként csak a külső tárolókon lévő fájlok lesznek titkosítva",
"Enable recovery key" : "Helyreállítási kulcs engedélyezése",
"Disable recovery key" : "Helyreállítási kulcs letiltása",
+ "The recovery key is an additional encryption key used to encrypt files. It is used to recover files from an account if the password is forgotten." : "A helyreállítási kulcs egy további titkosítási kulcs fájlok titkosításához. Arra szolgál, hogy egy fiókból vissza lehessen állítani a fájlokat, ha a jelszót elfelejtették.",
"Recovery key password" : "Helyreállítási kulcs jelszava",
"Repeat recovery key password" : "Ismételje meg a heylreállítási kulcs jelszavát",
"Change recovery key password:" : "Helyreállítási kulcs jelszavának módosítása:",
diff --git a/apps/encryption/tests/Crypto/EncryptionTest.php b/apps/encryption/tests/Crypto/EncryptionTest.php
index b07bd0a6b25..10f85f7e74e 100644
--- a/apps/encryption/tests/Crypto/EncryptionTest.php
+++ b/apps/encryption/tests/Crypto/EncryptionTest.php
@@ -15,8 +15,9 @@ use OCA\Encryption\Exceptions\PublicKeyMissingException;
use OCA\Encryption\KeyManager;
use OCA\Encryption\Session;
use OCA\Encryption\Util;
-use OCP\Files\Storage;
+use OCP\Files\Storage\IStorage;
use OCP\IL10N;
+use PHPUnit\Framework\MockObject\MockObject;
use Psr\Log\LoggerInterface;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
@@ -50,13 +51,12 @@ class EncryptionTest extends TestCase {
/** @var \OCP\IL10N|\PHPUnit\Framework\MockObject\MockObject */
private $l10nMock;
- /** @var \OCP\Files\Storage|\PHPUnit\Framework\MockObject\MockObject */
- private $storageMock;
+ private IStorage&MockObject $storageMock;
protected function setUp(): void {
parent::setUp();
- $this->storageMock = $this->getMockBuilder(Storage::class)
+ $this->storageMock = $this->getMockBuilder(IStorage::class)
->disableOriginalConstructor()->getMock();
$this->cryptMock = $this->getMockBuilder(Crypt::class)
->disableOriginalConstructor()
diff --git a/apps/encryption/tests/KeyManagerTest.php b/apps/encryption/tests/KeyManagerTest.php
index a9919e8eab4..869e5e2cf96 100644
--- a/apps/encryption/tests/KeyManagerTest.php
+++ b/apps/encryption/tests/KeyManagerTest.php
@@ -15,7 +15,7 @@ use OCA\Encryption\Session;
use OCA\Encryption\Util;
use OCP\Encryption\Keys\IStorage;
use OCP\Files\Cache\ICache;
-use OCP\Files\Storage;
+use OCP\Files\Storage\IStorage as FilesIStorage;
use OCP\IConfig;
use OCP\IUserSession;
use OCP\Lock\ILockingProvider;
@@ -687,7 +687,7 @@ class KeyManagerTest extends TestCase {
$cache->expects($this->once())
->method('update')
->with(123, ['encrypted' => 5, 'encryptedVersion' => 5]);
- $storage = $this->getMockBuilder(Storage::class)
+ $storage = $this->getMockBuilder(FilesIStorage::class)
->disableOriginalConstructor()->getMock();
$storage->expects($this->once())
->method('getCache')
diff --git a/apps/encryption/tests/UtilTest.php b/apps/encryption/tests/UtilTest.php
index 6f2eec1ebf4..f2e6f406c35 100644
--- a/apps/encryption/tests/UtilTest.php
+++ b/apps/encryption/tests/UtilTest.php
@@ -11,7 +11,7 @@ use OC\Files\View;
use OCA\Encryption\Crypto\Crypt;
use OCA\Encryption\Util;
use OCP\Files\Mount\IMountPoint;
-use OCP\Files\Storage;
+use OCP\Files\Storage\IStorage;
use OCP\IConfig;
use OCP\IUser;
use OCP\IUserManager;
@@ -181,7 +181,7 @@ class UtilTest extends TestCase {
}
public function testGetStorage(): void {
- $return = $this->getMockBuilder(Storage::class)
+ $return = $this->getMockBuilder(IStorage::class)
->disableOriginalConstructor()
->getMock();
diff --git a/apps/files/l10n/hu.js b/apps/files/l10n/hu.js
index 83b89c239bd..17a4767acbf 100644
--- a/apps/files/l10n/hu.js
+++ b/apps/files/l10n/hu.js
@@ -189,6 +189,8 @@ OC.L10N.register(
"\"{displayName}\" action failed" : "A(z) „{displayName}” művelet sikertelen",
"Toggle selection for file \"{displayName}\"" : "„{displayName}” fájl kijelölésének átváltása",
"Toggle selection for folder \"{displayName}\"" : "„{displayName}” mappa kijelölésének átváltása",
+ "File is loading" : "A fájl épp betöltődik",
+ "Folder is loading" : "A mappa épp betöltődik",
"Rename file" : "Fájl átnevezése",
"Filename" : "Fájlnév",
"Folder name" : "Mappanév",
@@ -205,6 +207,7 @@ OC.L10N.register(
"Remove filter" : "Szűrő eltávolítása",
"Total rows summary" : "Összes sor összegzése",
"Toggle selection for all files and folders" : "Minden fájl és mappa kijelölésének átváltása",
+ "(selected)" : "(kijelölt)",
"\"{displayName}\" failed on some elements " : "A(z) „{displayName}” sikertelen volt néhány elemen",
"\"{displayName}\" batch action executed successfully" : "A(z) „{displayName}” tömeges művelet sikeresen végrehajtva",
"{count} selected" : "{count}kiválasztva",
@@ -323,6 +326,7 @@ OC.L10N.register(
"PDFs" : "PDF-ek",
"Folders" : "Mappák",
"Audio" : "Hangok",
+ "Photos and images" : "Fényképek és képek",
"Videos" : "Videók",
"New folder creation cancelled" : "Az új mappa létrehozása megszakítva",
"Created new folder \"{name}\"" : "Új „{name}” mappa létrehozva",
@@ -378,6 +382,10 @@ OC.L10N.register(
"Copy direct link (only works for users who have access to this file/folder)" : "Közvetlen hivatkozás másolása (csak azoknál a felhasználóknál működik, akiknek hozzáférése van a fájlhoz/mappához)",
"\"remote user\"" : "„távoli felhasználó”",
"{newName} already exists." : "A(z) {newName} már létezik.",
+ "\"{segment}\" is not allowed inside a filename." : "Nem szerepelhet fájlnévben: „{segment}”.",
+ "\"{segment}\" is a forbidden file or folder name." : "Tiltott fájl- vagy mappanév: „{segment}”.",
+ "\"{segment}\" is not an allowed filetype." : "Nem engedélyezett fájltípus: „{segment}”.",
+ "Filenames must not end with \"{segment}\"." : "Fájlnév nem végződhet így: „{extension}”.",
"Name cannot be empty" : "A név nem lehet üres",
"Another entry with the same name already exists" : "Már létezik ilyen nevű bejegyzés",
"Storage informations" : "Tárhely-információk",
diff --git a/apps/files/l10n/hu.json b/apps/files/l10n/hu.json
index 0f435ae5771..f8defc124f7 100644
--- a/apps/files/l10n/hu.json
+++ b/apps/files/l10n/hu.json
@@ -187,6 +187,8 @@
"\"{displayName}\" action failed" : "A(z) „{displayName}” művelet sikertelen",
"Toggle selection for file \"{displayName}\"" : "„{displayName}” fájl kijelölésének átváltása",
"Toggle selection for folder \"{displayName}\"" : "„{displayName}” mappa kijelölésének átváltása",
+ "File is loading" : "A fájl épp betöltődik",
+ "Folder is loading" : "A mappa épp betöltődik",
"Rename file" : "Fájl átnevezése",
"Filename" : "Fájlnév",
"Folder name" : "Mappanév",
@@ -203,6 +205,7 @@
"Remove filter" : "Szűrő eltávolítása",
"Total rows summary" : "Összes sor összegzése",
"Toggle selection for all files and folders" : "Minden fájl és mappa kijelölésének átváltása",
+ "(selected)" : "(kijelölt)",
"\"{displayName}\" failed on some elements " : "A(z) „{displayName}” sikertelen volt néhány elemen",
"\"{displayName}\" batch action executed successfully" : "A(z) „{displayName}” tömeges művelet sikeresen végrehajtva",
"{count} selected" : "{count}kiválasztva",
@@ -321,6 +324,7 @@
"PDFs" : "PDF-ek",
"Folders" : "Mappák",
"Audio" : "Hangok",
+ "Photos and images" : "Fényképek és képek",
"Videos" : "Videók",
"New folder creation cancelled" : "Az új mappa létrehozása megszakítva",
"Created new folder \"{name}\"" : "Új „{name}” mappa létrehozva",
@@ -376,6 +380,10 @@
"Copy direct link (only works for users who have access to this file/folder)" : "Közvetlen hivatkozás másolása (csak azoknál a felhasználóknál működik, akiknek hozzáférése van a fájlhoz/mappához)",
"\"remote user\"" : "„távoli felhasználó”",
"{newName} already exists." : "A(z) {newName} már létezik.",
+ "\"{segment}\" is not allowed inside a filename." : "Nem szerepelhet fájlnévben: „{segment}”.",
+ "\"{segment}\" is a forbidden file or folder name." : "Tiltott fájl- vagy mappanév: „{segment}”.",
+ "\"{segment}\" is not an allowed filetype." : "Nem engedélyezett fájltípus: „{segment}”.",
+ "Filenames must not end with \"{segment}\"." : "Fájlnév nem végződhet így: „{extension}”.",
"Name cannot be empty" : "A név nem lehet üres",
"Another entry with the same name already exists" : "Már létezik ilyen nevű bejegyzés",
"Storage informations" : "Tárhely-információk",
diff --git a/apps/files/l10n/sl.js b/apps/files/l10n/sl.js
index f14eeb9ded0..7dd230dc55e 100644
--- a/apps/files/l10n/sl.js
+++ b/apps/files/l10n/sl.js
@@ -156,6 +156,9 @@ OC.L10N.register(
"A file has been added to or removed from your <strong>favorites</strong>" : "Datoteka je bila, ali dodana ali umaknjena iz <strong>priljubljenih</strong>",
"A file or folder has been <strong>changed</strong>" : "<strong>Spremenjena</strong> je bila datoteka ali mapa",
"A favorite file or folder has been <strong>changed</strong>" : "<strong>Spremenjena</strong> je bila priljubljena datoteka ali mapa",
+ "Failed to authorize" : "Overitev je spodletela",
+ "Invalid folder path" : "Neveljavna pot mape",
+ "Folder not found" : "Mape ni mogoče najti",
"Upload (max. %s)" : "Pošiljanje (omejitev %s)",
"Files compatibility" : "Skladnost datotek",
"Enforce Windows compatibility" : "Vsili skladnost s sistemom Windows",
@@ -179,10 +182,13 @@ OC.L10N.register(
"You don’t have permission to upload or create files here" : "Ni ustreznih dovoljenj za pošiljanje in ustvarjanje datotek na tem mestu.",
"\"{displayName}\" action executed successfully" : "Dejanje »{displayName}« je uspešno izvedeno",
"\"{displayName}\" action failed" : "Dejanje »{displayName}« je spodletelo",
+ "File is loading" : "Poteka nalaganje datoteke",
+ "Folder is loading" : "mape",
"Rename file" : "Preimenuj datoteke",
"Filename" : "Ime datoteke",
"Folder name" : "Ime mape",
"This node is unavailable" : "To vozlišče ni na voljo.",
+ "Invalid filename." : "Neveljavno ime datoteke",
"Renamed \"{oldName}\" to \"{newName}\"" : "Preimenuj »{oldName}« to »{newName}«",
"Could not rename \"{oldName}\", it does not exist any more" : "Datoteke »{oldName}« ni mogoče preimenovati, ker ne obstaja več.",
"The name \"{newName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Ime »{newtName}« je v mapi »{dir}« že v uporabi. Izbrati je treba drugačno ime.",
@@ -190,18 +196,25 @@ OC.L10N.register(
"Clear filter" : "Počisti filter",
"Type" : "Vrsta",
"Active filters" : "Dejavni filtri",
+ "Remove filter" : "Odstrani filter",
"Total rows summary" : "Skupni povzetek vrstic",
+ "(selected)" : "(izbrano)",
"\"{displayName}\" failed on some elements " : "Dejanje »{displayName}« je pri nekaterih predmetih spodletelo",
"\"{displayName}\" batch action executed successfully" : "Paketno dejanje »{displayName}« je uspešno izvedeno",
"{count} selected" : "{count} izbranih",
"List of files and folders." : "Seznam datotek in map",
"This list is not fully rendered for performance 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 med brskanjem.",
"File not found" : "Datoteke ni mogoče najti",
+ "Storage information" : "Podrobnosti shrambe",
+ "Storage quota" : "Omejitev shrambe",
"{usedQuotaByte} used" : "Zasedeno {usedQuotaByte}",
"{relative}% used" : "Zasedeno {relative} %",
"Could not refresh storage stats" : "Ni mogoče osvežiti podatkov shrambe",
"Your storage is full, files can not be updated or synced anymore!" : "Shramba je povsem napolnjena. Datotek ni več mogoče posodabljati in usklajevati!",
"Create" : "Ustvari",
+ "This name is already in use." : "Vpisano uporabniško ime je že v uporabi",
+ "Fill template fields" : "Zapolni polja predloge",
+ "Submitting fields…" : "Poteka objavljanje vsebine polj ...",
"Submit" : "Pošlji",
"Transfer ownership of a file or folder" : "Prenos lastništva datoteke ali mape",
"Choose file or folder to transfer" : "Izbor datoteke ali mape za prenos",
@@ -227,6 +240,8 @@ OC.L10N.register(
"Shared" : "V souporabi",
"Switch to list view" : "Preklopi na seznamski pogled",
"Switch to grid view" : "Preklopi na mrežni pogled",
+ "Upload was cancelled by user" : "Uporabnik je pošiljanje preklical",
+ "Filter filenames…" : "Filtriraj imena datotek ...",
"Views" : "Pogledi",
"Files settings" : "Nastavitve datotek",
"File cannot be accessed" : "Do datoteke dostop ni mogoč",
@@ -261,6 +276,7 @@ OC.L10N.register(
"Delete folders" : "Izbriši mape",
"Confirm deletion" : "Potrdi brisanje",
"Cancel" : "Prekliči",
+ "Edit file locally" : "Uredi datoteko krajevno",
"Destination is not a folder" : "Ciljno mesto ni mapa",
"This file/folder is already in that directory" : "Ta datoteka oziroma mapa je že v določeni mapi",
"You cannot move a file/folder onto itself or into a subfolder of itself" : "Mape ali datoteke ni mogoče premakniti samo vase oziroma v podmapo same sebe",
@@ -280,13 +296,18 @@ OC.L10N.register(
"Last 7 days" : "Zadnjih 7 dni",
"Last 30 days" : "Zadnjih 30 dni",
"Documents" : "Dokumenti",
+ "Spreadsheets" : "Preglednice",
+ "Presentations" : "Predstavitve",
+ "PDFs" : "Dokumenti PDF",
"Folders" : "Mape",
"Audio" : "Zvočni posnetek",
+ "Photos and images" : "Slike in fotografije",
"Videos" : "Video posnetki",
"Created new folder \"{name}\"" : "Ustvarjena je nova mapa »{name}«.",
"Unable to initialize the templates directory" : "Ni mogoče začeti mape predlog",
"Templates" : "Predloge",
"New template folder" : "Nova mapa predlog",
+ "In folder" : "V mapi",
"Files uploaded successfully" : "Datoteke so uspešno poslane v oblak",
"Some files could not be moved" : "Nekaterih datotek ni mogoče premakniti",
"Files copied successfully" : "Datoteke so uspešno kopirane",
diff --git a/apps/files/l10n/sl.json b/apps/files/l10n/sl.json
index 1008dd0c789..62891be65c5 100644
--- a/apps/files/l10n/sl.json
+++ b/apps/files/l10n/sl.json
@@ -154,6 +154,9 @@
"A file has been added to or removed from your <strong>favorites</strong>" : "Datoteka je bila, ali dodana ali umaknjena iz <strong>priljubljenih</strong>",
"A file or folder has been <strong>changed</strong>" : "<strong>Spremenjena</strong> je bila datoteka ali mapa",
"A favorite file or folder has been <strong>changed</strong>" : "<strong>Spremenjena</strong> je bila priljubljena datoteka ali mapa",
+ "Failed to authorize" : "Overitev je spodletela",
+ "Invalid folder path" : "Neveljavna pot mape",
+ "Folder not found" : "Mape ni mogoče najti",
"Upload (max. %s)" : "Pošiljanje (omejitev %s)",
"Files compatibility" : "Skladnost datotek",
"Enforce Windows compatibility" : "Vsili skladnost s sistemom Windows",
@@ -177,10 +180,13 @@
"You don’t have permission to upload or create files here" : "Ni ustreznih dovoljenj za pošiljanje in ustvarjanje datotek na tem mestu.",
"\"{displayName}\" action executed successfully" : "Dejanje »{displayName}« je uspešno izvedeno",
"\"{displayName}\" action failed" : "Dejanje »{displayName}« je spodletelo",
+ "File is loading" : "Poteka nalaganje datoteke",
+ "Folder is loading" : "mape",
"Rename file" : "Preimenuj datoteke",
"Filename" : "Ime datoteke",
"Folder name" : "Ime mape",
"This node is unavailable" : "To vozlišče ni na voljo.",
+ "Invalid filename." : "Neveljavno ime datoteke",
"Renamed \"{oldName}\" to \"{newName}\"" : "Preimenuj »{oldName}« to »{newName}«",
"Could not rename \"{oldName}\", it does not exist any more" : "Datoteke »{oldName}« ni mogoče preimenovati, ker ne obstaja več.",
"The name \"{newName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Ime »{newtName}« je v mapi »{dir}« že v uporabi. Izbrati je treba drugačno ime.",
@@ -188,18 +194,25 @@
"Clear filter" : "Počisti filter",
"Type" : "Vrsta",
"Active filters" : "Dejavni filtri",
+ "Remove filter" : "Odstrani filter",
"Total rows summary" : "Skupni povzetek vrstic",
+ "(selected)" : "(izbrano)",
"\"{displayName}\" failed on some elements " : "Dejanje »{displayName}« je pri nekaterih predmetih spodletelo",
"\"{displayName}\" batch action executed successfully" : "Paketno dejanje »{displayName}« je uspešno izvedeno",
"{count} selected" : "{count} izbranih",
"List of files and folders." : "Seznam datotek in map",
"This list is not fully rendered for performance 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 med brskanjem.",
"File not found" : "Datoteke ni mogoče najti",
+ "Storage information" : "Podrobnosti shrambe",
+ "Storage quota" : "Omejitev shrambe",
"{usedQuotaByte} used" : "Zasedeno {usedQuotaByte}",
"{relative}% used" : "Zasedeno {relative} %",
"Could not refresh storage stats" : "Ni mogoče osvežiti podatkov shrambe",
"Your storage is full, files can not be updated or synced anymore!" : "Shramba je povsem napolnjena. Datotek ni več mogoče posodabljati in usklajevati!",
"Create" : "Ustvari",
+ "This name is already in use." : "Vpisano uporabniško ime je že v uporabi",
+ "Fill template fields" : "Zapolni polja predloge",
+ "Submitting fields…" : "Poteka objavljanje vsebine polj ...",
"Submit" : "Pošlji",
"Transfer ownership of a file or folder" : "Prenos lastništva datoteke ali mape",
"Choose file or folder to transfer" : "Izbor datoteke ali mape za prenos",
@@ -225,6 +238,8 @@
"Shared" : "V souporabi",
"Switch to list view" : "Preklopi na seznamski pogled",
"Switch to grid view" : "Preklopi na mrežni pogled",
+ "Upload was cancelled by user" : "Uporabnik je pošiljanje preklical",
+ "Filter filenames…" : "Filtriraj imena datotek ...",
"Views" : "Pogledi",
"Files settings" : "Nastavitve datotek",
"File cannot be accessed" : "Do datoteke dostop ni mogoč",
@@ -259,6 +274,7 @@
"Delete folders" : "Izbriši mape",
"Confirm deletion" : "Potrdi brisanje",
"Cancel" : "Prekliči",
+ "Edit file locally" : "Uredi datoteko krajevno",
"Destination is not a folder" : "Ciljno mesto ni mapa",
"This file/folder is already in that directory" : "Ta datoteka oziroma mapa je že v določeni mapi",
"You cannot move a file/folder onto itself or into a subfolder of itself" : "Mape ali datoteke ni mogoče premakniti samo vase oziroma v podmapo same sebe",
@@ -278,13 +294,18 @@
"Last 7 days" : "Zadnjih 7 dni",
"Last 30 days" : "Zadnjih 30 dni",
"Documents" : "Dokumenti",
+ "Spreadsheets" : "Preglednice",
+ "Presentations" : "Predstavitve",
+ "PDFs" : "Dokumenti PDF",
"Folders" : "Mape",
"Audio" : "Zvočni posnetek",
+ "Photos and images" : "Slike in fotografije",
"Videos" : "Video posnetki",
"Created new folder \"{name}\"" : "Ustvarjena je nova mapa »{name}«.",
"Unable to initialize the templates directory" : "Ni mogoče začeti mape predlog",
"Templates" : "Predloge",
"New template folder" : "Nova mapa predlog",
+ "In folder" : "V mapi",
"Files uploaded successfully" : "Datoteke so uspešno poslane v oblak",
"Some files could not be moved" : "Nekaterih datotek ni mogoče premakniti",
"Files copied successfully" : "Datoteke so uspešno kopirane",
diff --git a/apps/files/l10n/sr.js b/apps/files/l10n/sr.js
index bee70d182f6..443b608f8bb 100644
--- a/apps/files/l10n/sr.js
+++ b/apps/files/l10n/sr.js
@@ -189,6 +189,8 @@ OC.L10N.register(
"\"{displayName}\" action failed" : "Акција „{displayName}” није успела",
"Toggle selection for file \"{displayName}\"" : "Укљ./искљ. избор за фајл „{displayName}”",
"Toggle selection for folder \"{displayName}\"" : "Укљ./искљ. избор за фолдер „{displayName}”",
+ "File is loading" : "Фајл се учитава",
+ "Folder is loading" : "Фолдер се учитава",
"Rename file" : "Промени назив фајла",
"Filename" : "Назив фајла",
"Folder name" : "Назив фасцикле",
@@ -205,6 +207,7 @@ OC.L10N.register(
"Remove filter" : "Уклони филтер",
"Total rows summary" : "Резиме укупног броја редова",
"Toggle selection for all files and folders" : "Укљ./искљ. избор за све фајлове и фолдере",
+ "(selected)" : "(изабрано)",
"\"{displayName}\" failed on some elements " : "„{displayName}” није успело на неким елементима",
"\"{displayName}\" batch action executed successfully" : "Пакетна акција „{displayName}” се успешно извршила",
"{count} selected" : "{count} изабрано",
@@ -323,6 +326,7 @@ OC.L10N.register(
"PDFs" : "PDF фајлови",
"Folders" : "Фолдери",
"Audio" : "Звук",
+ "Photos and images" : "Фотографије и слике",
"Videos" : "Видео снимци",
"New folder creation cancelled" : "Отказане је креирање новог фолдера",
"Created new folder \"{name}\"" : "Креиран је нови фолдер „{name}”",
@@ -378,6 +382,10 @@ OC.L10N.register(
"Copy direct link (only works for users who have access to this file/folder)" : "Копирај директну везу (ради само за кориснике који имају приступ овом фајлу/фасциклу)",
"\"remote user\"" : "„удаљени корисник“",
"{newName} already exists." : "{newName} већ постоји.",
+ "\"{segment}\" is not allowed inside a filename." : "„{segment}” није дозвољено у имену фајла.",
+ "\"{segment}\" is a forbidden file or folder name." : "„{segment}” је забрањено име фајла или фолдера.",
+ "\"{segment}\" is not an allowed filetype." : "„{segment}” није дозвољени тип фајла.",
+ "Filenames must not end with \"{segment}\"." : "Имена фајлова не смеју да се завршавају са „{segment}”.",
"Name cannot be empty" : "Назив не може бити празан",
"Another entry with the same name already exists" : "Већ постоји ставка са истим именом.",
"Storage informations" : "Информације о складишту",
diff --git a/apps/files/l10n/sr.json b/apps/files/l10n/sr.json
index b6ec700cbe2..4025f29447c 100644
--- a/apps/files/l10n/sr.json
+++ b/apps/files/l10n/sr.json
@@ -187,6 +187,8 @@
"\"{displayName}\" action failed" : "Акција „{displayName}” није успела",
"Toggle selection for file \"{displayName}\"" : "Укљ./искљ. избор за фајл „{displayName}”",
"Toggle selection for folder \"{displayName}\"" : "Укљ./искљ. избор за фолдер „{displayName}”",
+ "File is loading" : "Фајл се учитава",
+ "Folder is loading" : "Фолдер се учитава",
"Rename file" : "Промени назив фајла",
"Filename" : "Назив фајла",
"Folder name" : "Назив фасцикле",
@@ -203,6 +205,7 @@
"Remove filter" : "Уклони филтер",
"Total rows summary" : "Резиме укупног броја редова",
"Toggle selection for all files and folders" : "Укљ./искљ. избор за све фајлове и фолдере",
+ "(selected)" : "(изабрано)",
"\"{displayName}\" failed on some elements " : "„{displayName}” није успело на неким елементима",
"\"{displayName}\" batch action executed successfully" : "Пакетна акција „{displayName}” се успешно извршила",
"{count} selected" : "{count} изабрано",
@@ -321,6 +324,7 @@
"PDFs" : "PDF фајлови",
"Folders" : "Фолдери",
"Audio" : "Звук",
+ "Photos and images" : "Фотографије и слике",
"Videos" : "Видео снимци",
"New folder creation cancelled" : "Отказане је креирање новог фолдера",
"Created new folder \"{name}\"" : "Креиран је нови фолдер „{name}”",
@@ -376,6 +380,10 @@
"Copy direct link (only works for users who have access to this file/folder)" : "Копирај директну везу (ради само за кориснике који имају приступ овом фајлу/фасциклу)",
"\"remote user\"" : "„удаљени корисник“",
"{newName} already exists." : "{newName} већ постоји.",
+ "\"{segment}\" is not allowed inside a filename." : "„{segment}” није дозвољено у имену фајла.",
+ "\"{segment}\" is a forbidden file or folder name." : "„{segment}” је забрањено име фајла или фолдера.",
+ "\"{segment}\" is not an allowed filetype." : "„{segment}” није дозвољени тип фајла.",
+ "Filenames must not end with \"{segment}\"." : "Имена фајлова не смеју да се завршавају са „{segment}”.",
"Name cannot be empty" : "Назив не може бити празан",
"Another entry with the same name already exists" : "Већ постоји ставка са истим именом.",
"Storage informations" : "Информације о складишту",
diff --git a/apps/files/lib/Activity/FavoriteProvider.php b/apps/files/lib/Activity/FavoriteProvider.php
index 00f1387df94..8cfc1a83798 100644
--- a/apps/files/lib/Activity/FavoriteProvider.php
+++ b/apps/files/lib/Activity/FavoriteProvider.php
@@ -5,6 +5,7 @@
*/
namespace OCA\Files\Activity;
+use OCP\Activity\Exceptions\UnknownActivityException;
use OCP\Activity\IEvent;
use OCP\Activity\IEventMerger;
use OCP\Activity\IManager;
@@ -50,12 +51,12 @@ class FavoriteProvider implements IProvider {
* @param IEvent $event
* @param IEvent|null $previousEvent
* @return IEvent
- * @throws \InvalidArgumentException
+ * @throws UnknownActivityException
* @since 11.0.0
*/
public function parse($language, IEvent $event, ?IEvent $previousEvent = null) {
if ($event->getApp() !== 'files' || $event->getType() !== 'favorite') {
- throw new \InvalidArgumentException();
+ throw new UnknownActivityException();
}
$this->l = $this->languageFactory->get('files', $language);
diff --git a/apps/files/lib/Activity/Provider.php b/apps/files/lib/Activity/Provider.php
index aa3ef062a16..f777d11c02e 100644
--- a/apps/files/lib/Activity/Provider.php
+++ b/apps/files/lib/Activity/Provider.php
@@ -5,6 +5,7 @@
*/
namespace OCA\Files\Activity;
+use OCP\Activity\Exceptions\UnknownActivityException;
use OCP\Activity\IEvent;
use OCP\Activity\IEventMerger;
use OCP\Activity\IManager;
@@ -79,12 +80,12 @@ class Provider implements IProvider {
* @param IEvent $event
* @param IEvent|null $previousEvent
* @return IEvent
- * @throws \InvalidArgumentException
+ * @throws UnknownActivityException
* @since 11.0.0
*/
public function parse($language, IEvent $event, ?IEvent $previousEvent = null) {
if ($event->getApp() !== 'files') {
- throw new \InvalidArgumentException();
+ throw new UnknownActivityException();
}
$this->l = $this->languageFactory->get('files', $language);
diff --git a/apps/files_external/l10n/ar.js b/apps/files_external/l10n/ar.js
index 2705bfbeaa6..385c214f635 100644
--- a/apps/files_external/l10n/ar.js
+++ b/apps/files_external/l10n/ar.js
@@ -116,7 +116,6 @@ OC.L10N.register(
"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. Administration can choose which types of storage to enable and can mount these storage locations for an account, 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 people 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 administration 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 و غيرها. يمكن للمشرفين اختيار أنواع التخزين التي يرغبون في تمكينها، ويمكنهم إمطاء mountg مواقع التخزين هذه لمستخدمٍ أو لمجموعة مستخدمين أو للنظام بأكمله. سيرى المستخدمون مُجلّدًا جديدًا يظهر في دليل نكست كلاود الجذري الخاص بهم والذي يمكنهم الوصول إليه واستخدامه مثل أي مجلد آخر من نكست كلاود. \nتتيح وحدة التخزين الخارجية أيضًا للمستخدمين مشاركة الملفات المُخزّنة في هذه المواقع الخارجية. في هذه الحالة، يتم استخدام حيثيات الدخول لمالك الملف عندما يطلب المستلم الملف من وحدة التخزين الخارجية؛ ممّا يضمن إمكانية وصول المستلم إلى الملف المشترك. \nيمكن تكوين التخزين الخارجي عن طريق واجهة المستخدم الرسومية أو عن طريق سطر الأوامر. يوفر الخيار الثاني للمستخدم المتقدم مزيدًا من المرونة لتكوين ممتطيات mounts لوحدات التخزين الخارجية بالجملة و تحديد أولويات الامتطاء. \nللمزيد من المعلومات، أنظر في توثيق واجهة المستخدم الرسومية للتخزين الخارجي، و توثيق تكوين وحدة التخزين الخارجية لتطبيق الملفات Files .",
"Storage credentials" : "حيثيّات وحدة التخزين",
- "To access the storage, you need to provide the authentification informations." : "للوصول إلى وحدة التخزين، يتوجب عليك إعطاء بيانات التصديق.",
"Enter the storage login" : "التسجيل للدخول إلى وحدة التخزين",
"Enter the storage password" : "أدخِل كلمة المرور لوحدة التخزين",
"Submit" : "إرسال ",
@@ -159,6 +158,7 @@ OC.L10N.register(
"Check the ACL's of each file or folder inside a directory to filter out items where the user has no read permissions, comes with a performance penalty" : "التحقّق من قوائم صلاحيات الوصول ACL لكل ملف أو مجلد داخل دليل لغرض تصفية العناصر التي لا يمتلك المستخدم أذونات لقراءتها. مع العلم أن هذا سيؤثر على أداء النظام.",
"Username as share" : "اسم المستخدم كمُشاركةٍ",
"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 و غيرها. يمكن للمشرفين اختيار أنواع التخزين التي يرغبون في تمكينها، ويمكنهم إمطاء mountg مواقع التخزين هذه لمستخدمٍ أو لمجموعة مستخدمين أو للنظام بأكمله. سيرى المستخدمون مُجلّدًا جديدًا يظهر في دليل نكست كلاود الجذري الخاص بهم والذي يمكنهم الوصول إليه واستخدامه مثل أي مجلد آخر من نكست كلاود. \nتتيح وحدة التخزين الخارجية أيضًا للمستخدمين مشاركة الملفات المُخزّنة في هذه المواقع الخارجية. في هذه الحالة، يتم استخدام حيثيات الدخول لمالك الملف عندما يطلب المستلم الملف من وحدة التخزين الخارجية؛ ممّا يضمن إمكانية وصول المستلم إلى الملف المشترك. \nيمكن تكوين التخزين الخارجي عن طريق واجهة المستخدم الرسومية أو عن طريق سطر الأوامر. يوفر الخيار الثاني للمستخدم المتقدم مزيدًا من المرونة لتكوين ممتطيات mounts لوحدات التخزين الخارجية بالجملة و تحديد أولويات الامتطاء. \nللمزيد من المعلومات، أنظر في توثيق واجهة المستخدم الرسومية للتخزين الخارجي، و توثيق تكوين وحدة التخزين الخارجية لتطبيق الملفات Files .",
+ "To access the storage, you need to provide the authentification informations." : "للوصول إلى وحدة التخزين، يتوجب عليك إعطاء بيانات التصديق.",
"External storage enables you to mount external storage services and devices as secondary Nextcloud storage devices. You may also allow users to mount their own external storage services." : "تتيح لك وحدة التخزين الخارجية امتطاء mount خدمات وأجهزة التخزين الخارجية كأجهزة تخزين ثانوية لنكست كلاود. يمكنك السماح كذلك للمستخدمين بامتطاء خدمات التخزين الخارجية الخاصة بهم.",
"All users" : "كُلّ المستخدمين",
"Allow users to mount external storage" : "السماح للمستخدمين بامتطاء mount وحدات تخزين خارجية"
diff --git a/apps/files_external/l10n/ar.json b/apps/files_external/l10n/ar.json
index e13d35f1187..3662bbf3b58 100644
--- a/apps/files_external/l10n/ar.json
+++ b/apps/files_external/l10n/ar.json
@@ -114,7 +114,6 @@
"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. Administration can choose which types of storage to enable and can mount these storage locations for an account, 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 people 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 administration 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 و غيرها. يمكن للمشرفين اختيار أنواع التخزين التي يرغبون في تمكينها، ويمكنهم إمطاء mountg مواقع التخزين هذه لمستخدمٍ أو لمجموعة مستخدمين أو للنظام بأكمله. سيرى المستخدمون مُجلّدًا جديدًا يظهر في دليل نكست كلاود الجذري الخاص بهم والذي يمكنهم الوصول إليه واستخدامه مثل أي مجلد آخر من نكست كلاود. \nتتيح وحدة التخزين الخارجية أيضًا للمستخدمين مشاركة الملفات المُخزّنة في هذه المواقع الخارجية. في هذه الحالة، يتم استخدام حيثيات الدخول لمالك الملف عندما يطلب المستلم الملف من وحدة التخزين الخارجية؛ ممّا يضمن إمكانية وصول المستلم إلى الملف المشترك. \nيمكن تكوين التخزين الخارجي عن طريق واجهة المستخدم الرسومية أو عن طريق سطر الأوامر. يوفر الخيار الثاني للمستخدم المتقدم مزيدًا من المرونة لتكوين ممتطيات mounts لوحدات التخزين الخارجية بالجملة و تحديد أولويات الامتطاء. \nللمزيد من المعلومات، أنظر في توثيق واجهة المستخدم الرسومية للتخزين الخارجي، و توثيق تكوين وحدة التخزين الخارجية لتطبيق الملفات Files .",
"Storage credentials" : "حيثيّات وحدة التخزين",
- "To access the storage, you need to provide the authentification informations." : "للوصول إلى وحدة التخزين، يتوجب عليك إعطاء بيانات التصديق.",
"Enter the storage login" : "التسجيل للدخول إلى وحدة التخزين",
"Enter the storage password" : "أدخِل كلمة المرور لوحدة التخزين",
"Submit" : "إرسال ",
@@ -157,6 +156,7 @@
"Check the ACL's of each file or folder inside a directory to filter out items where the user has no read permissions, comes with a performance penalty" : "التحقّق من قوائم صلاحيات الوصول ACL لكل ملف أو مجلد داخل دليل لغرض تصفية العناصر التي لا يمتلك المستخدم أذونات لقراءتها. مع العلم أن هذا سيؤثر على أداء النظام.",
"Username as share" : "اسم المستخدم كمُشاركةٍ",
"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 و غيرها. يمكن للمشرفين اختيار أنواع التخزين التي يرغبون في تمكينها، ويمكنهم إمطاء mountg مواقع التخزين هذه لمستخدمٍ أو لمجموعة مستخدمين أو للنظام بأكمله. سيرى المستخدمون مُجلّدًا جديدًا يظهر في دليل نكست كلاود الجذري الخاص بهم والذي يمكنهم الوصول إليه واستخدامه مثل أي مجلد آخر من نكست كلاود. \nتتيح وحدة التخزين الخارجية أيضًا للمستخدمين مشاركة الملفات المُخزّنة في هذه المواقع الخارجية. في هذه الحالة، يتم استخدام حيثيات الدخول لمالك الملف عندما يطلب المستلم الملف من وحدة التخزين الخارجية؛ ممّا يضمن إمكانية وصول المستلم إلى الملف المشترك. \nيمكن تكوين التخزين الخارجي عن طريق واجهة المستخدم الرسومية أو عن طريق سطر الأوامر. يوفر الخيار الثاني للمستخدم المتقدم مزيدًا من المرونة لتكوين ممتطيات mounts لوحدات التخزين الخارجية بالجملة و تحديد أولويات الامتطاء. \nللمزيد من المعلومات، أنظر في توثيق واجهة المستخدم الرسومية للتخزين الخارجي، و توثيق تكوين وحدة التخزين الخارجية لتطبيق الملفات Files .",
+ "To access the storage, you need to provide the authentification informations." : "للوصول إلى وحدة التخزين، يتوجب عليك إعطاء بيانات التصديق.",
"External storage enables you to mount external storage services and devices as secondary Nextcloud storage devices. You may also allow users to mount their own external storage services." : "تتيح لك وحدة التخزين الخارجية امتطاء mount خدمات وأجهزة التخزين الخارجية كأجهزة تخزين ثانوية لنكست كلاود. يمكنك السماح كذلك للمستخدمين بامتطاء خدمات التخزين الخارجية الخاصة بهم.",
"All users" : "كُلّ المستخدمين",
"Allow users to mount external storage" : "السماح للمستخدمين بامتطاء mount وحدات تخزين خارجية"
diff --git a/apps/files_external/l10n/de_DE.js b/apps/files_external/l10n/de_DE.js
index ddf3cfbba1e..8fbede19cca 100644
--- a/apps/files_external/l10n/de_DE.js
+++ b/apps/files_external/l10n/de_DE.js
@@ -116,7 +116,6 @@ OC.L10N.register(
"Adds basic external storage support" : "Fügt grundlegende Unterstützung für externen Speicher hinzu",
"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. Administration can choose which types of storage to enable and can mount these storage locations for an account, 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 people 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 administration 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." : "Diese Anwendung ermöglicht es Administratoren, Verbindungen zu externen Speicheranbietern wie FTP-Servern, S3- oder SWIFT-Objektspeichern, anderen Nextcloud-Servern, WebDAV-Servern und weiteren zu konfigurieren. Die Administration kann auswählen, welche Arten von Speicherorten aktiviert werden sollen, und kann diese Speicherorte für ein Konto, eine Gruppe oder das gesamte System einbinden. Benutzer sehen einen neuen Ordner in ihrem Nextcloud-Root-Verzeichnis, auf den sie wie auf jeden anderen Nextcloud-Ordner zugreifen und ihn verwenden können. Externer Speicher ermöglicht es Personen auch, Dateien, die in diesen externen Speicherorten gespeichert sind, freizugeben. In diesen Fällen werden die Anmeldeinformationen des Dateibesitzers verwendet, wenn der Empfänger die Datei aus dem externen Speicher anfordert, um sicherzustellen, dass der Empfänger auf die freigegebene Datei zugreifen kann.\n\nExterner Speicher kann über die grafische Benutzeroberfläche oder über die Befehlszeile konfiguriert werden. Diese zweite Option bietet der Administration mehr Flexibilität bei der Konfiguration von Massenspeicher-Einhängepunkten und der Festlegung von Einhängeprioritäten. Weitere Informationen finden Sie in der Dokumentation zur externen Speicher-GUI und der Dokumentation zur externen Speicher-Konfigurationsdatei.",
"Storage credentials" : "Speicheranmeldeinformationen",
- "To access the storage, you need to provide the authentification informations." : "Um auf den Speicher zuzugreifen, müssen Sie die Authentifizierungsinformationen eingeben.",
"Enter the storage login" : "Speicher-Login eingeben",
"Enter the storage password" : "Speicher-Passwort eingeben",
"Submit" : "Übermitteln",
@@ -159,6 +158,7 @@ OC.L10N.register(
"Check the ACL's of each file or folder inside a directory to filter out items where the user has no read permissions, comes with a performance penalty" : "Überprüft die ACLs jeder Datei oder jedes Ordners in einem Verzeichnis, um Elemente herauszufiltern, für die der Benutzer keine Leseberechtigung hat. Dies führt zu Leistungseinbußen",
"Username as share" : "Benutzername als Freigabe",
"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." : "DIese App ermöglicht es Administratoren, Verbindungen zu externen Speicherorten wie FTP-Servern, S3 oder SWIFT object stores, anderen Nextcloud-Servern, WebDAV-Servern usw. herzustellen. Administratoren können auswählen, welche Arten von Speicherorten zulässig sind, und können diese Speicherorte für Benutzer, Gruppen oder das gesamte System einbinden. Benutzer sehen dann einen neuen Ordner in ihrem Nextcloud-Root-Verzeichnis, auf den sie wie auf jeden anderen Nextcloud-Ordner zugreifen können. Externer Speicher ermöglicht es den Benutzern auch, dort gespeicherte Dateien freizugeben. In diesem Fall werden die Zugangsdaten des Dateibesitzers angefordert, wenn der externe Empfänger der Freigabe auf die extern gespeicherten Dateien zugreift, um sicherzustellen, dass der Zugriff auf die Freigabe möglich ist.\n\nExterne Speicherorte können über die grafische Benutzeroberfläche oder über die Kommandozeile eingerichtet werden. Letztere Option ermöglicht es fortgeschrittenen Benutzern, einfacher mehrere Einhängepunkte und Einstellungen gleichzeitig zu setzen und zu konfigurieren. Weitere Informationen können in der Dokumentation für Externen Speicher in der grafischen Oberfläche und der Dokumentationsdatei für die Konfiguration von Externem Speicher abgerufen werden.",
+ "To access the storage, you need to provide the authentification informations." : "Um auf den Speicher zuzugreifen, müssen Sie die Authentifizierungsinformationen eingeben.",
"External storage enables you to mount external storage services and devices as secondary Nextcloud storage devices. You may also allow users to mount their own external storage services." : "Externer Speicher erlaubt es, externe Speicherdienste und Geräte als Zweitspeicher-Geräte in Nextcloud einzubinden. Es kann Benutzern erlaubt werden eigene externe Speicherdienste einzubinden.",
"All users" : "Alle Benutzer",
"Allow users to mount external storage" : "Benutzern erlauben, externen Speicher einzubinden"
diff --git a/apps/files_external/l10n/de_DE.json b/apps/files_external/l10n/de_DE.json
index bc3b8ed657d..5d47ff6c0b3 100644
--- a/apps/files_external/l10n/de_DE.json
+++ b/apps/files_external/l10n/de_DE.json
@@ -114,7 +114,6 @@
"Adds basic external storage support" : "Fügt grundlegende Unterstützung für externen Speicher hinzu",
"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. Administration can choose which types of storage to enable and can mount these storage locations for an account, 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 people 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 administration 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." : "Diese Anwendung ermöglicht es Administratoren, Verbindungen zu externen Speicheranbietern wie FTP-Servern, S3- oder SWIFT-Objektspeichern, anderen Nextcloud-Servern, WebDAV-Servern und weiteren zu konfigurieren. Die Administration kann auswählen, welche Arten von Speicherorten aktiviert werden sollen, und kann diese Speicherorte für ein Konto, eine Gruppe oder das gesamte System einbinden. Benutzer sehen einen neuen Ordner in ihrem Nextcloud-Root-Verzeichnis, auf den sie wie auf jeden anderen Nextcloud-Ordner zugreifen und ihn verwenden können. Externer Speicher ermöglicht es Personen auch, Dateien, die in diesen externen Speicherorten gespeichert sind, freizugeben. In diesen Fällen werden die Anmeldeinformationen des Dateibesitzers verwendet, wenn der Empfänger die Datei aus dem externen Speicher anfordert, um sicherzustellen, dass der Empfänger auf die freigegebene Datei zugreifen kann.\n\nExterner Speicher kann über die grafische Benutzeroberfläche oder über die Befehlszeile konfiguriert werden. Diese zweite Option bietet der Administration mehr Flexibilität bei der Konfiguration von Massenspeicher-Einhängepunkten und der Festlegung von Einhängeprioritäten. Weitere Informationen finden Sie in der Dokumentation zur externen Speicher-GUI und der Dokumentation zur externen Speicher-Konfigurationsdatei.",
"Storage credentials" : "Speicheranmeldeinformationen",
- "To access the storage, you need to provide the authentification informations." : "Um auf den Speicher zuzugreifen, müssen Sie die Authentifizierungsinformationen eingeben.",
"Enter the storage login" : "Speicher-Login eingeben",
"Enter the storage password" : "Speicher-Passwort eingeben",
"Submit" : "Übermitteln",
@@ -157,6 +156,7 @@
"Check the ACL's of each file or folder inside a directory to filter out items where the user has no read permissions, comes with a performance penalty" : "Überprüft die ACLs jeder Datei oder jedes Ordners in einem Verzeichnis, um Elemente herauszufiltern, für die der Benutzer keine Leseberechtigung hat. Dies führt zu Leistungseinbußen",
"Username as share" : "Benutzername als Freigabe",
"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." : "DIese App ermöglicht es Administratoren, Verbindungen zu externen Speicherorten wie FTP-Servern, S3 oder SWIFT object stores, anderen Nextcloud-Servern, WebDAV-Servern usw. herzustellen. Administratoren können auswählen, welche Arten von Speicherorten zulässig sind, und können diese Speicherorte für Benutzer, Gruppen oder das gesamte System einbinden. Benutzer sehen dann einen neuen Ordner in ihrem Nextcloud-Root-Verzeichnis, auf den sie wie auf jeden anderen Nextcloud-Ordner zugreifen können. Externer Speicher ermöglicht es den Benutzern auch, dort gespeicherte Dateien freizugeben. In diesem Fall werden die Zugangsdaten des Dateibesitzers angefordert, wenn der externe Empfänger der Freigabe auf die extern gespeicherten Dateien zugreift, um sicherzustellen, dass der Zugriff auf die Freigabe möglich ist.\n\nExterne Speicherorte können über die grafische Benutzeroberfläche oder über die Kommandozeile eingerichtet werden. Letztere Option ermöglicht es fortgeschrittenen Benutzern, einfacher mehrere Einhängepunkte und Einstellungen gleichzeitig zu setzen und zu konfigurieren. Weitere Informationen können in der Dokumentation für Externen Speicher in der grafischen Oberfläche und der Dokumentationsdatei für die Konfiguration von Externem Speicher abgerufen werden.",
+ "To access the storage, you need to provide the authentification informations." : "Um auf den Speicher zuzugreifen, müssen Sie die Authentifizierungsinformationen eingeben.",
"External storage enables you to mount external storage services and devices as secondary Nextcloud storage devices. You may also allow users to mount their own external storage services." : "Externer Speicher erlaubt es, externe Speicherdienste und Geräte als Zweitspeicher-Geräte in Nextcloud einzubinden. Es kann Benutzern erlaubt werden eigene externe Speicherdienste einzubinden.",
"All users" : "Alle Benutzer",
"Allow users to mount external storage" : "Benutzern erlauben, externen Speicher einzubinden"
diff --git a/apps/files_external/l10n/en_GB.js b/apps/files_external/l10n/en_GB.js
index d3f96e53be8..20ae2c85ea0 100644
--- a/apps/files_external/l10n/en_GB.js
+++ b/apps/files_external/l10n/en_GB.js
@@ -115,6 +115,9 @@ OC.L10N.register(
"External storage support" : "External storage support",
"Adds basic 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. Administration can choose which types of storage to enable and can mount these storage locations for an account, 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 people 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 administration 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." : "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. Administration can choose which types of storage to enable and can mount these storage locations for an account, 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 people 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 administration 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.",
+ "Storage credentials" : "Storage credentials",
+ "Enter the storage login" : "Enter the storage login",
+ "Enter the storage password" : "Enter the storage password",
"Submit" : "Submit",
"Unable to update this external storage config. {statusMessage}" : "Unable to update this external storage config. {statusMessage}",
"New configuration successfully saved" : "New configuration successfully saved",
@@ -155,6 +158,7 @@ OC.L10N.register(
"Check the ACL's of each file or folder inside a directory to filter out items where the user has no read permissions, comes with a performance penalty" : "Check the ACL's of each file or folder inside a directory to filter out items where the user has no read permissions, comes with a performance penalty",
"Username as share" : "Username as share",
"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." : "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.",
+ "To access the storage, you need to provide the authentification informations." : "To access the storage, you need to provide the authentification informations.",
"External storage enables you to mount external storage services and devices as secondary Nextcloud storage devices. You may also allow users to mount their own external storage services." : "External storage enables you to mount external storage services and devices as secondary Nextcloud storage devices. You may also allow users to mount their own external storage services.",
"All users" : "All users",
"Allow users to mount external storage" : "Allow users to mount external storage"
diff --git a/apps/files_external/l10n/en_GB.json b/apps/files_external/l10n/en_GB.json
index 257373d31ef..3fcdc787aa1 100644
--- a/apps/files_external/l10n/en_GB.json
+++ b/apps/files_external/l10n/en_GB.json
@@ -113,6 +113,9 @@
"External storage support" : "External storage support",
"Adds basic 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. Administration can choose which types of storage to enable and can mount these storage locations for an account, 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 people 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 administration 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." : "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. Administration can choose which types of storage to enable and can mount these storage locations for an account, 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 people 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 administration 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.",
+ "Storage credentials" : "Storage credentials",
+ "Enter the storage login" : "Enter the storage login",
+ "Enter the storage password" : "Enter the storage password",
"Submit" : "Submit",
"Unable to update this external storage config. {statusMessage}" : "Unable to update this external storage config. {statusMessage}",
"New configuration successfully saved" : "New configuration successfully saved",
@@ -153,6 +156,7 @@
"Check the ACL's of each file or folder inside a directory to filter out items where the user has no read permissions, comes with a performance penalty" : "Check the ACL's of each file or folder inside a directory to filter out items where the user has no read permissions, comes with a performance penalty",
"Username as share" : "Username as share",
"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." : "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.",
+ "To access the storage, you need to provide the authentification informations." : "To access the storage, you need to provide the authentification informations.",
"External storage enables you to mount external storage services and devices as secondary Nextcloud storage devices. You may also allow users to mount their own external storage services." : "External storage enables you to mount external storage services and devices as secondary Nextcloud storage devices. You may also allow users to mount their own external storage services.",
"All users" : "All users",
"Allow users to mount external storage" : "Allow users to mount external storage"
diff --git a/apps/files_external/l10n/ga.js b/apps/files_external/l10n/ga.js
index 2b2b34d4c04..25f09f6e4f1 100644
--- a/apps/files_external/l10n/ga.js
+++ b/apps/files_external/l10n/ga.js
@@ -116,7 +116,6 @@ OC.L10N.register(
"Adds basic external storage support" : "Cuireann sé tacaíocht bhunúsach stórála seachtrach leis",
"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. Administration can choose which types of storage to enable and can mount these storage locations for an account, 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 people 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 administration 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." : "Cuireann an feidhmchlár seo ar chumas riarthóirí naisc a chumrú le soláthraithe stórála seachtracha, mar fhreastalaithe FTP, stórais réad S3 nó SWIFT, freastalaithe Nextcloud eile, freastalaithe WebDAV, agus go leor eile. Is féidir le lucht riaracháin na cineálacha stórála a roghnú le cumasú agus is féidir leo na láithreacha stórála seo a shuiteáil do chuntas, do ghrúpa nó don chóras iomlán. Feicfidh úsáideoirí fillteán nua le feiceáil ina n-eolaire root Nextcloud, ar féidir leo rochtain a fháil air agus a úsáid mar aon fhillteán Nextcloud eile. Ligeann stóráil sheachtrach do dhaoine comhaid atá stóráilte sna láithreacha seachtracha seo a roinnt. Sna cásanna seo, úsáidtear dintiúir úinéir an chomhaid nuair a iarrann an faighteoir an comhad ó stóráil sheachtrach, rud a chinntíonn go bhféadfaidh an faighteoir rochtain a fháil ar an gcomhad roinnte.\n\nIs féidir stóráil sheachtrach a chumrú trí úsáid a bhaint as an GUI nó ag an líne ordaithe. Tugann an dara rogha seo níos mó solúbthachta don riarachán maidir le gléasanna stórála seachtracha mórchóir a chumrú agus chun tosaíochtaí gléasta a shocrú. Tá tuilleadh faisnéise ar fáil sna doiciméid GUI stórála seachtracha agus sa doiciméadú Comhad Cumraíochta stórála seachtraí.",
"Storage credentials" : "Dintiúir stórála",
- "To access the storage, you need to provide the authentification informations." : "Chun rochtain a fháil ar an stóras, ní mór duit an fhaisnéis fíordheimhnithe a sholáthar.",
"Enter the storage login" : "Cuir isteach an logáil isteach stórála",
"Enter the storage password" : "Cuir isteach an focal faire stórála",
"Submit" : "Cuir isteach",
@@ -159,6 +158,7 @@ OC.L10N.register(
"Check the ACL's of each file or folder inside a directory to filter out items where the user has no read permissions, comes with a performance penalty" : "Seiceáil ACL gach comhad nó fillteán laistigh d'eolaire chun míreanna nach bhfuil cead léite ag an úsáideoir a scagadh amach, tagann pionós feidhmíochta leis",
"Username as share" : "Ainm úsáideora mar scair",
"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." : "Cuireann an feidhmchlár seo ar chumas riarthóirí naisc a chumrú le soláthraithe stórála seachtracha, mar fhreastalaithe FTP, stórais réad S3 nó SWIFT, freastalaithe Nextcloud eile, freastalaithe WebDAV, agus go leor eile. Is féidir le riarthóirí na cineálacha stórála a roghnú le cumasú agus is féidir leo na láithreacha stórála seo a fheistiú d'úsáideoir, do ghrúpa nó don chóras iomlán. Feicfidh úsáideoirí fillteán nua le feiceáil ina n-eolaire root Nextcloud, ar féidir leo rochtain a fháil air agus a úsáid mar aon fhillteán Nextcloud eile. Ligeann stóráil sheachtrach freisin d’úsáideoirí comhaid atá stóráilte sna suíomhanna seachtracha seo a roinnt. Sna cásanna seo, úsáidtear dintiúir úinéir an chomhaid nuair a iarrann an faighteoir an comhad ó stóráil sheachtrach, rud a chinntíonn go bhféadfaidh an faighteoir rochtain a fháil ar an gcomhad roinnte.\n\nIs féidir stóráil sheachtrach a chumrú trí úsáid a bhaint as an GUI nó ag an líne ordaithe. Tugann an dara rogha seo níos mó solúbthachta don ardúsáideoir maidir le gléasanna stórála seachtracha mórchóir a chumrú agus tosaíochtaí gléasta a shocrú. Tá tuilleadh faisnéise ar fáil sna doiciméid GUI stórála seachtracha agus sa doiciméadú Comhad Cumraíochta stórála seachtraí.",
+ "To access the storage, you need to provide the authentification informations." : "Chun rochtain a fháil ar an stóras, ní mór duit an fhaisnéis fíordheimhnithe a sholáthar.",
"External storage enables you to mount external storage services and devices as secondary Nextcloud storage devices. You may also allow users to mount their own external storage services." : "Cuireann stóráil sheachtrach ar do chumas seirbhísí agus gléasanna stórála seachtracha a fheistiú mar ghléasanna stórála tánaisteacha Nextcloud. Is féidir leat ligean d'úsáideoirí a gcuid seirbhísí stórála seachtracha féin a shuiteáil.",
"All users" : "Gach úsáideoir",
"Allow users to mount external storage" : "Lig d'úsáideoirí stóráil sheachtrach a shuiteáil"
diff --git a/apps/files_external/l10n/ga.json b/apps/files_external/l10n/ga.json
index c5d5bc5bb8f..6de7216c296 100644
--- a/apps/files_external/l10n/ga.json
+++ b/apps/files_external/l10n/ga.json
@@ -114,7 +114,6 @@
"Adds basic external storage support" : "Cuireann sé tacaíocht bhunúsach stórála seachtrach leis",
"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. Administration can choose which types of storage to enable and can mount these storage locations for an account, 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 people 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 administration 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." : "Cuireann an feidhmchlár seo ar chumas riarthóirí naisc a chumrú le soláthraithe stórála seachtracha, mar fhreastalaithe FTP, stórais réad S3 nó SWIFT, freastalaithe Nextcloud eile, freastalaithe WebDAV, agus go leor eile. Is féidir le lucht riaracháin na cineálacha stórála a roghnú le cumasú agus is féidir leo na láithreacha stórála seo a shuiteáil do chuntas, do ghrúpa nó don chóras iomlán. Feicfidh úsáideoirí fillteán nua le feiceáil ina n-eolaire root Nextcloud, ar féidir leo rochtain a fháil air agus a úsáid mar aon fhillteán Nextcloud eile. Ligeann stóráil sheachtrach do dhaoine comhaid atá stóráilte sna láithreacha seachtracha seo a roinnt. Sna cásanna seo, úsáidtear dintiúir úinéir an chomhaid nuair a iarrann an faighteoir an comhad ó stóráil sheachtrach, rud a chinntíonn go bhféadfaidh an faighteoir rochtain a fháil ar an gcomhad roinnte.\n\nIs féidir stóráil sheachtrach a chumrú trí úsáid a bhaint as an GUI nó ag an líne ordaithe. Tugann an dara rogha seo níos mó solúbthachta don riarachán maidir le gléasanna stórála seachtracha mórchóir a chumrú agus chun tosaíochtaí gléasta a shocrú. Tá tuilleadh faisnéise ar fáil sna doiciméid GUI stórála seachtracha agus sa doiciméadú Comhad Cumraíochta stórála seachtraí.",
"Storage credentials" : "Dintiúir stórála",
- "To access the storage, you need to provide the authentification informations." : "Chun rochtain a fháil ar an stóras, ní mór duit an fhaisnéis fíordheimhnithe a sholáthar.",
"Enter the storage login" : "Cuir isteach an logáil isteach stórála",
"Enter the storage password" : "Cuir isteach an focal faire stórála",
"Submit" : "Cuir isteach",
@@ -157,6 +156,7 @@
"Check the ACL's of each file or folder inside a directory to filter out items where the user has no read permissions, comes with a performance penalty" : "Seiceáil ACL gach comhad nó fillteán laistigh d'eolaire chun míreanna nach bhfuil cead léite ag an úsáideoir a scagadh amach, tagann pionós feidhmíochta leis",
"Username as share" : "Ainm úsáideora mar scair",
"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." : "Cuireann an feidhmchlár seo ar chumas riarthóirí naisc a chumrú le soláthraithe stórála seachtracha, mar fhreastalaithe FTP, stórais réad S3 nó SWIFT, freastalaithe Nextcloud eile, freastalaithe WebDAV, agus go leor eile. Is féidir le riarthóirí na cineálacha stórála a roghnú le cumasú agus is féidir leo na láithreacha stórála seo a fheistiú d'úsáideoir, do ghrúpa nó don chóras iomlán. Feicfidh úsáideoirí fillteán nua le feiceáil ina n-eolaire root Nextcloud, ar féidir leo rochtain a fháil air agus a úsáid mar aon fhillteán Nextcloud eile. Ligeann stóráil sheachtrach freisin d’úsáideoirí comhaid atá stóráilte sna suíomhanna seachtracha seo a roinnt. Sna cásanna seo, úsáidtear dintiúir úinéir an chomhaid nuair a iarrann an faighteoir an comhad ó stóráil sheachtrach, rud a chinntíonn go bhféadfaidh an faighteoir rochtain a fháil ar an gcomhad roinnte.\n\nIs féidir stóráil sheachtrach a chumrú trí úsáid a bhaint as an GUI nó ag an líne ordaithe. Tugann an dara rogha seo níos mó solúbthachta don ardúsáideoir maidir le gléasanna stórála seachtracha mórchóir a chumrú agus tosaíochtaí gléasta a shocrú. Tá tuilleadh faisnéise ar fáil sna doiciméid GUI stórála seachtracha agus sa doiciméadú Comhad Cumraíochta stórála seachtraí.",
+ "To access the storage, you need to provide the authentification informations." : "Chun rochtain a fháil ar an stóras, ní mór duit an fhaisnéis fíordheimhnithe a sholáthar.",
"External storage enables you to mount external storage services and devices as secondary Nextcloud storage devices. You may also allow users to mount their own external storage services." : "Cuireann stóráil sheachtrach ar do chumas seirbhísí agus gléasanna stórála seachtracha a fheistiú mar ghléasanna stórála tánaisteacha Nextcloud. Is féidir leat ligean d'úsáideoirí a gcuid seirbhísí stórála seachtracha féin a shuiteáil.",
"All users" : "Gach úsáideoir",
"Allow users to mount external storage" : "Lig d'úsáideoirí stóráil sheachtrach a shuiteáil"
diff --git a/apps/files_external/l10n/gl.js b/apps/files_external/l10n/gl.js
index 3127a51ae4b..7fbe58c35e5 100644
--- a/apps/files_external/l10n/gl.js
+++ b/apps/files_external/l10n/gl.js
@@ -116,7 +116,6 @@ OC.L10N.register(
"Adds basic external storage support" : "Engade compatibilidade básica de almacenamento externo",
"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. Administration can choose which types of storage to enable and can mount these storage locations for an account, 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 people 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 administration 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." : "Esta aplicación permítelle á administración da instancia configurar conexións a provedores externos de almacenamento, como servidores FTP, almacenamento de obxectos S3 ou SWIFT, outros servidores Nextcloud, servidores WebDAV e máis. A administración da instancia pode escoller que tipos de almacenamento activar e pode montar estas localizacións de almacenamento para unha conta, un grupo ou o todo o sistema. Os usuarios verán aparecer un novo cartafol no seu directorio raíz de Nextcloud, ao que poden acceder e que poden usar como calquera outro cartafol de Nextcloud. Almacenamento externo tamén lle permite á xente compartir os ficheiros almacenados nestas localizacións externas. Nestes casos, úsanse as credenciais para o propietario dos ficheiros cando o receptor solicita o ficheiro do almacenamento externo, asegurando así que o receptor poida acceder ao ficheiro compartido.\n\nAlmacenamento externo pódese configurar usando a GUI ou coa liña de ordes. A segunda opción fornece ao usuario avanzado máis flexibilidade para configurar montaxes de almacenamento externo en bloque e para configurar prioridades de montaxe. Ten dispoñíbel máis información na documentación da GUI do almacenamento externo e na documentación do ficheiro de configuración do almacenamento externo.",
"Storage credentials" : "Credenciais de almacenamento",
- "To access the storage, you need to provide the authentification informations." : "Para acceder ao almacenamento, cómpre fornecer a información de autenticación.",
"Enter the storage login" : "Introduza o acceso ao almacenamento",
"Enter the storage password" : "Introduza o contrasinal do almacenamento",
"Submit" : "Enviar",
@@ -159,6 +158,7 @@ OC.L10N.register(
"Check the ACL's of each file or folder inside a directory to filter out items where the user has no read permissions, comes with a performance penalty" : "Comprobar as listas de control de acceso (ACL) de cada ficheiro ou cartafol dentro dun directorio para filtrar os elementos onde o usuario non ten permisos de lectura, ten unha penalización de rendemento.",
"Username as share" : "Nome de usuario como compartición",
"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." : "Esta aplicación permítelle á administración da instancia configurar conexións a provedores externos de almacenamento, como servidores FTP, almacenamento de obxectos S3 ou SWIFT, outros servidores Nextcloud, servidores WebDAV e máis. A administración da instancia pode escoller que tipos de almacenamento activar e pode montar estas localizacións de almacenamento para un usuario, un grupo ou o sistema enteiro. Os usuarios verán aparecer un novo cartafol no seu directorio raíz de Nextcloud, ao que poden acceder e que poden usar como calquera outro cartafol. Almacenamento externo tamén permite aos usuarios compartir os ficheiros almacenados nestas localizacións externas. Nestes casos, úsanse as credenciais para o dono dos ficheiros cando o receptor solicita o ficheiro de almacenamento externo, asegurando así que o receptor poida acceder ao ficheiro compartido.\n\nAlmacenamento externo pódese configurar usando a GUI ou coa liña de ordes. A segunda opción fornece ao usuario avanzado máis flexibilidade para configurar montaxes de almacenamento externo en bloque e para configurar prioridades de montaxe. Ten dispoñíbel máis información na documentación da GUI do almacenamento externo e na documentación do ficheiro de configuración do almacenamento externo.",
+ "To access the storage, you need to provide the authentification informations." : "Para acceder ao almacenamento, cómpre fornecer a información de autenticación.",
"External storage enables you to mount external storage services and devices as secondary Nextcloud storage devices. You may also allow users to mount their own external storage services." : "A aplicación Almacenamento externo permítelle montar servizos e dispositivos de almacenamento externo como dispositivos de almacenamento secundarios de Nextcloud. Tamén pode permitirlle que os usuarios monten os seus propios servizos de almacenamento externo.",
"All users" : "Todos os usuarios",
"Allow users to mount external storage" : "Permitirlle aos usuarios montar almacenamento externo"
diff --git a/apps/files_external/l10n/gl.json b/apps/files_external/l10n/gl.json
index 361548dab1a..6406680ca22 100644
--- a/apps/files_external/l10n/gl.json
+++ b/apps/files_external/l10n/gl.json
@@ -114,7 +114,6 @@
"Adds basic external storage support" : "Engade compatibilidade básica de almacenamento externo",
"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. Administration can choose which types of storage to enable and can mount these storage locations for an account, 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 people 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 administration 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." : "Esta aplicación permítelle á administración da instancia configurar conexións a provedores externos de almacenamento, como servidores FTP, almacenamento de obxectos S3 ou SWIFT, outros servidores Nextcloud, servidores WebDAV e máis. A administración da instancia pode escoller que tipos de almacenamento activar e pode montar estas localizacións de almacenamento para unha conta, un grupo ou o todo o sistema. Os usuarios verán aparecer un novo cartafol no seu directorio raíz de Nextcloud, ao que poden acceder e que poden usar como calquera outro cartafol de Nextcloud. Almacenamento externo tamén lle permite á xente compartir os ficheiros almacenados nestas localizacións externas. Nestes casos, úsanse as credenciais para o propietario dos ficheiros cando o receptor solicita o ficheiro do almacenamento externo, asegurando así que o receptor poida acceder ao ficheiro compartido.\n\nAlmacenamento externo pódese configurar usando a GUI ou coa liña de ordes. A segunda opción fornece ao usuario avanzado máis flexibilidade para configurar montaxes de almacenamento externo en bloque e para configurar prioridades de montaxe. Ten dispoñíbel máis información na documentación da GUI do almacenamento externo e na documentación do ficheiro de configuración do almacenamento externo.",
"Storage credentials" : "Credenciais de almacenamento",
- "To access the storage, you need to provide the authentification informations." : "Para acceder ao almacenamento, cómpre fornecer a información de autenticación.",
"Enter the storage login" : "Introduza o acceso ao almacenamento",
"Enter the storage password" : "Introduza o contrasinal do almacenamento",
"Submit" : "Enviar",
@@ -157,6 +156,7 @@
"Check the ACL's of each file or folder inside a directory to filter out items where the user has no read permissions, comes with a performance penalty" : "Comprobar as listas de control de acceso (ACL) de cada ficheiro ou cartafol dentro dun directorio para filtrar os elementos onde o usuario non ten permisos de lectura, ten unha penalización de rendemento.",
"Username as share" : "Nome de usuario como compartición",
"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." : "Esta aplicación permítelle á administración da instancia configurar conexións a provedores externos de almacenamento, como servidores FTP, almacenamento de obxectos S3 ou SWIFT, outros servidores Nextcloud, servidores WebDAV e máis. A administración da instancia pode escoller que tipos de almacenamento activar e pode montar estas localizacións de almacenamento para un usuario, un grupo ou o sistema enteiro. Os usuarios verán aparecer un novo cartafol no seu directorio raíz de Nextcloud, ao que poden acceder e que poden usar como calquera outro cartafol. Almacenamento externo tamén permite aos usuarios compartir os ficheiros almacenados nestas localizacións externas. Nestes casos, úsanse as credenciais para o dono dos ficheiros cando o receptor solicita o ficheiro de almacenamento externo, asegurando así que o receptor poida acceder ao ficheiro compartido.\n\nAlmacenamento externo pódese configurar usando a GUI ou coa liña de ordes. A segunda opción fornece ao usuario avanzado máis flexibilidade para configurar montaxes de almacenamento externo en bloque e para configurar prioridades de montaxe. Ten dispoñíbel máis información na documentación da GUI do almacenamento externo e na documentación do ficheiro de configuración do almacenamento externo.",
+ "To access the storage, you need to provide the authentification informations." : "Para acceder ao almacenamento, cómpre fornecer a información de autenticación.",
"External storage enables you to mount external storage services and devices as secondary Nextcloud storage devices. You may also allow users to mount their own external storage services." : "A aplicación Almacenamento externo permítelle montar servizos e dispositivos de almacenamento externo como dispositivos de almacenamento secundarios de Nextcloud. Tamén pode permitirlle que os usuarios monten os seus propios servizos de almacenamento externo.",
"All users" : "Todos os usuarios",
"Allow users to mount external storage" : "Permitirlle aos usuarios montar almacenamento externo"
diff --git a/apps/files_external/l10n/pt_BR.js b/apps/files_external/l10n/pt_BR.js
index 7a2dd264462..374518ed392 100644
--- a/apps/files_external/l10n/pt_BR.js
+++ b/apps/files_external/l10n/pt_BR.js
@@ -116,7 +116,6 @@ OC.L10N.register(
"Adds basic external storage support" : "Adiciona suporte básico para armazenamento externo",
"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. Administration can choose which types of storage to enable and can mount these storage locations for an account, 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 people 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 administration 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." : "Este aplicativo permite que os administradores configurem conexões com provedores de armazenamento externos, como servidores FTP, armazenamentos de objetos S3 ou SWIFT, outros servidores Nextcloud, servidores WebDAV e muito mais. A administração pode escolher quais tipos de armazenamento ativar e pode montar esses locais de armazenamento para uma conta, um grupo ou todo o sistema. Os usuários verão uma nova pasta aparecer em seu diretório raiz Nextcloud, que eles podem acessar e usar como qualquer outra pasta Nextcloud. O armazenamento externo também permite que as pessoas compartilhem arquivos armazenados nesses locais externos. Nesses casos, as credenciais do proprietário do arquivo são usadas quando o destinatário solicita o arquivo do armazenamento externo, garantindo assim que o destinatário possa acessar o arquivo compartilhado. \n\nO armazenamento externo pode ser configurado usando a GUI ou na linha de comando. Esta segunda opção fornece à administração mais flexibilidade para configurar montagens de armazenamento externo em massa e definir prioridades de montagem. Mais informações estão disponíveis na documentação da GUI de armazenamento externo e na documentação do arquivo de configuração de armazenamento externo.",
"Storage credentials" : "Credenciais de armazenamento",
- "To access the storage, you need to provide the authentification informations." : "Para acessar o armazenamento, você precisa fornecer as informações de autenticação.",
"Enter the storage login" : "Digite o login de armazenamento",
"Enter the storage password" : "Digite a senha de armazenamento",
"Submit" : "Enviar",
@@ -159,6 +158,7 @@ OC.L10N.register(
"Check the ACL's of each file or folder inside a directory to filter out items where the user has no read permissions, comes with a performance penalty" : "Verifique as ACLs de cada arquivo ou pasta dentro de um diretório para filtrar itens nos quais o usuário não tem permissão de leitura. Vem com uma penalidade de desempenho",
"Username as share" : "Nome de usuário como compartilhamento",
"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." : "Esse aplicativo permite que os administradores configurem conexões com provedores de armazenamento externos, como servidores FTP, armazenamentos de objetos S3 ou SWIFT, outros servidores Nextcloud, servidores WebDAV e muito mais. Os administradores podem escolher quais tipos de armazenamento serão habilitados e podem montar esses locais de armazenamento para um usuário, um grupo ou todo o sistema. Os usuários verão uma nova pasta aparecer no diretório raiz do Nextcloud, que eles podem acessar e usar como qualquer outra pasta. O armazenamento externo também permite que os usuários compartilhem arquivos armazenados nesses locais externos. Nesses casos, as credenciais do proprietário do arquivo são usadas quando o destinatário solicita o arquivo do armazenamento externo, garantindo, assim, que o destinatário possa acessar o arquivo compartilhado.\n\nO armazenamento externo pode ser configurado usando a GUI ou pela linha de comando. Essa segunda opção fornece ao usuário avançado mais flexibilidade para configurar montagens em massa e definir prioridades de montagem. Mais informações estão disponíveis na documentação da GUI de armazenamento externo e na documentação do Arquivo de Configuração de armazenamento externo.",
+ "To access the storage, you need to provide the authentification informations." : "Para acessar o armazenamento, você precisa fornecer as informações de autenticação.",
"External storage enables you to mount external storage services and devices as secondary Nextcloud storage devices. You may also allow users to mount their own external storage services." : "O armazenamento externo permite que você monte serviços e dispositivos como dispositivos de armazenamento secundários Nextcloud. Você também pode permitir que os usuários montem seus próprios serviços de armazenamento externo.",
"All users" : "Todos os usuários",
"Allow users to mount external storage" : "Permitir que usuários montem armazenamento externo"
diff --git a/apps/files_external/l10n/pt_BR.json b/apps/files_external/l10n/pt_BR.json
index b8e266e3ffd..0b048e980b2 100644
--- a/apps/files_external/l10n/pt_BR.json
+++ b/apps/files_external/l10n/pt_BR.json
@@ -114,7 +114,6 @@
"Adds basic external storage support" : "Adiciona suporte básico para armazenamento externo",
"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. Administration can choose which types of storage to enable and can mount these storage locations for an account, 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 people 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 administration 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." : "Este aplicativo permite que os administradores configurem conexões com provedores de armazenamento externos, como servidores FTP, armazenamentos de objetos S3 ou SWIFT, outros servidores Nextcloud, servidores WebDAV e muito mais. A administração pode escolher quais tipos de armazenamento ativar e pode montar esses locais de armazenamento para uma conta, um grupo ou todo o sistema. Os usuários verão uma nova pasta aparecer em seu diretório raiz Nextcloud, que eles podem acessar e usar como qualquer outra pasta Nextcloud. O armazenamento externo também permite que as pessoas compartilhem arquivos armazenados nesses locais externos. Nesses casos, as credenciais do proprietário do arquivo são usadas quando o destinatário solicita o arquivo do armazenamento externo, garantindo assim que o destinatário possa acessar o arquivo compartilhado. \n\nO armazenamento externo pode ser configurado usando a GUI ou na linha de comando. Esta segunda opção fornece à administração mais flexibilidade para configurar montagens de armazenamento externo em massa e definir prioridades de montagem. Mais informações estão disponíveis na documentação da GUI de armazenamento externo e na documentação do arquivo de configuração de armazenamento externo.",
"Storage credentials" : "Credenciais de armazenamento",
- "To access the storage, you need to provide the authentification informations." : "Para acessar o armazenamento, você precisa fornecer as informações de autenticação.",
"Enter the storage login" : "Digite o login de armazenamento",
"Enter the storage password" : "Digite a senha de armazenamento",
"Submit" : "Enviar",
@@ -157,6 +156,7 @@
"Check the ACL's of each file or folder inside a directory to filter out items where the user has no read permissions, comes with a performance penalty" : "Verifique as ACLs de cada arquivo ou pasta dentro de um diretório para filtrar itens nos quais o usuário não tem permissão de leitura. Vem com uma penalidade de desempenho",
"Username as share" : "Nome de usuário como compartilhamento",
"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." : "Esse aplicativo permite que os administradores configurem conexões com provedores de armazenamento externos, como servidores FTP, armazenamentos de objetos S3 ou SWIFT, outros servidores Nextcloud, servidores WebDAV e muito mais. Os administradores podem escolher quais tipos de armazenamento serão habilitados e podem montar esses locais de armazenamento para um usuário, um grupo ou todo o sistema. Os usuários verão uma nova pasta aparecer no diretório raiz do Nextcloud, que eles podem acessar e usar como qualquer outra pasta. O armazenamento externo também permite que os usuários compartilhem arquivos armazenados nesses locais externos. Nesses casos, as credenciais do proprietário do arquivo são usadas quando o destinatário solicita o arquivo do armazenamento externo, garantindo, assim, que o destinatário possa acessar o arquivo compartilhado.\n\nO armazenamento externo pode ser configurado usando a GUI ou pela linha de comando. Essa segunda opção fornece ao usuário avançado mais flexibilidade para configurar montagens em massa e definir prioridades de montagem. Mais informações estão disponíveis na documentação da GUI de armazenamento externo e na documentação do Arquivo de Configuração de armazenamento externo.",
+ "To access the storage, you need to provide the authentification informations." : "Para acessar o armazenamento, você precisa fornecer as informações de autenticação.",
"External storage enables you to mount external storage services and devices as secondary Nextcloud storage devices. You may also allow users to mount their own external storage services." : "O armazenamento externo permite que você monte serviços e dispositivos como dispositivos de armazenamento secundários Nextcloud. Você também pode permitir que os usuários montem seus próprios serviços de armazenamento externo.",
"All users" : "Todos os usuários",
"Allow users to mount external storage" : "Permitir que usuários montem armazenamento externo"
diff --git a/apps/files_external/l10n/sr.js b/apps/files_external/l10n/sr.js
index c95fb3d50b7..2e6d64127e3 100644
--- a/apps/files_external/l10n/sr.js
+++ b/apps/files_external/l10n/sr.js
@@ -18,6 +18,7 @@ OC.L10N.register(
"Once every direct access" : "Једном при сваком директном приступу",
"Read only" : "Само за читање",
"Disconnect" : "Раскачи се",
+ "Unknown backend: {backendName}" : "Непознат позадински механизам: {backendName}",
"Admin defined" : "Дефинисао администратор",
"Automatic status checking is disabled due to the large number of configured storages, click to check status" : "Аутоматска провера статуса је искључена због превеликог броја конфигурисаних складишта, кликните да проверите статус",
"Are you sure you want to disconnect this external storage? It will make the storage unavailable in Nextcloud and will lead to a deletion of these files and folders on any sync client that is currently connected but will not delete any files and folders on the external storage itself." : "Да ли сте сигурни да желите да искључите ово спољно складиште? Nextcloud неће моћи више да га користи, па ће се ови фајлови и фолдери обрисати на било ком синхронизационом клијенту који је тренутно повезан, мада се неће обрисати ниједан фајл или фолдер на самом спољном складишту.",
@@ -114,6 +115,9 @@ 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. Administration can choose which types of storage to enable and can mount these storage locations for an account, 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 people 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 administration 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 објектна складишта, други Nextcloud сервери, WebDAV сервери и још много других. Администрација може да одабере које типове складишта жели да се омогући и може да монтира локације ових складишта посебно за налог, за групу или за цео систем. Корисници ће видети нову фасциклу која ће се појавити у кореном директоријуму, којој могу да приступају и да је користе као и било коју другу Nextcloud фасциклу. Спољашња складишта такође омогућавају особама и да деле фајлове смештене на овим спољашњим локацијама. У овим случајевима, када неко затражи приступ фајлу из спољашњег складишта користе се акредитиви власника фајла, омогућавајући тако да прималац може да приступи дељеном фајлу.\n\nСпољашње складиште се може конфигурисати графичким интерфејсом или командном линијом. Друга опција администрацији пружа више флексибилности када треба монтирати велики број складишта и подесити велики број приоритета монтирања. Више информација је доступно у ГКИ документацији спољашњег складишта и у документацији Конфигурационог Фајла спољашњег складишта.",
+ "Storage credentials" : "Акредитиви складишта",
+ "Enter the storage login" : "Унесите име за пријаву на складиште",
+ "Enter the storage password" : "Унесите лозинку за складиште",
"Submit" : "Пошаљи",
"Unable to update this external storage config. {statusMessage}" : "Не може да се ажурира конфигурација овог спољног складишта. {statusMessage}",
"New configuration successfully saved" : "Нова конфигурација је успешно сачувана",
@@ -154,6 +158,7 @@ OC.L10N.register(
"Check the ACL's of each file or folder inside a directory to filter out items where the user has no read permissions, comes with a performance penalty" : "Провери ACL (листу контроле приступа) сваког фајла или фасцикле унутар директоријума да исфилтрираш ставке где корисник нема право читања, али уз удар на перформансе",
"Username as share" : "Корисничко име као дељење",
"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 документацији спољашњег складишта и у документацији Конфигурационог Фајла спољашњег складишта.",
+ "To access the storage, you need to provide the authentification informations." : "Да бисте приступили складишту, потребно је да наведете информације за потврду идентитета",
"External storage enables you to mount external storage services and devices as secondary Nextcloud storage devices. You may also allow users to mount their own external storage services." : "Спољно складиште Вам омогућава да монтирате сервисе и уређаје који нуде спољна складишта, и да се виде као Некстклауд уређају за складиштење. Такође можете дозволити корисницима да сами монтирају њихова сопствене сервисе спољних складишта.",
"All users" : "Сви корисници",
"Allow users to mount external storage" : "Дозволи корисницима да монтирају спољашња складишта"
diff --git a/apps/files_external/l10n/sr.json b/apps/files_external/l10n/sr.json
index dce03efa58b..64cbbbf0fa4 100644
--- a/apps/files_external/l10n/sr.json
+++ b/apps/files_external/l10n/sr.json
@@ -16,6 +16,7 @@
"Once every direct access" : "Једном при сваком директном приступу",
"Read only" : "Само за читање",
"Disconnect" : "Раскачи се",
+ "Unknown backend: {backendName}" : "Непознат позадински механизам: {backendName}",
"Admin defined" : "Дефинисао администратор",
"Automatic status checking is disabled due to the large number of configured storages, click to check status" : "Аутоматска провера статуса је искључена због превеликог броја конфигурисаних складишта, кликните да проверите статус",
"Are you sure you want to disconnect this external storage? It will make the storage unavailable in Nextcloud and will lead to a deletion of these files and folders on any sync client that is currently connected but will not delete any files and folders on the external storage itself." : "Да ли сте сигурни да желите да искључите ово спољно складиште? Nextcloud неће моћи више да га користи, па ће се ови фајлови и фолдери обрисати на било ком синхронизационом клијенту који је тренутно повезан, мада се неће обрисати ниједан фајл или фолдер на самом спољном складишту.",
@@ -112,6 +113,9 @@
"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. Administration can choose which types of storage to enable and can mount these storage locations for an account, 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 people 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 administration 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 објектна складишта, други Nextcloud сервери, WebDAV сервери и још много других. Администрација може да одабере које типове складишта жели да се омогући и може да монтира локације ових складишта посебно за налог, за групу или за цео систем. Корисници ће видети нову фасциклу која ће се појавити у кореном директоријуму, којој могу да приступају и да је користе као и било коју другу Nextcloud фасциклу. Спољашња складишта такође омогућавају особама и да деле фајлове смештене на овим спољашњим локацијама. У овим случајевима, када неко затражи приступ фајлу из спољашњег складишта користе се акредитиви власника фајла, омогућавајући тако да прималац може да приступи дељеном фајлу.\n\nСпољашње складиште се може конфигурисати графичким интерфејсом или командном линијом. Друга опција администрацији пружа више флексибилности када треба монтирати велики број складишта и подесити велики број приоритета монтирања. Више информација је доступно у ГКИ документацији спољашњег складишта и у документацији Конфигурационог Фајла спољашњег складишта.",
+ "Storage credentials" : "Акредитиви складишта",
+ "Enter the storage login" : "Унесите име за пријаву на складиште",
+ "Enter the storage password" : "Унесите лозинку за складиште",
"Submit" : "Пошаљи",
"Unable to update this external storage config. {statusMessage}" : "Не може да се ажурира конфигурација овог спољног складишта. {statusMessage}",
"New configuration successfully saved" : "Нова конфигурација је успешно сачувана",
@@ -152,6 +156,7 @@
"Check the ACL's of each file or folder inside a directory to filter out items where the user has no read permissions, comes with a performance penalty" : "Провери ACL (листу контроле приступа) сваког фајла или фасцикле унутар директоријума да исфилтрираш ставке где корисник нема право читања, али уз удар на перформансе",
"Username as share" : "Корисничко име као дељење",
"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 документацији спољашњег складишта и у документацији Конфигурационог Фајла спољашњег складишта.",
+ "To access the storage, you need to provide the authentification informations." : "Да бисте приступили складишту, потребно је да наведете информације за потврду идентитета",
"External storage enables you to mount external storage services and devices as secondary Nextcloud storage devices. You may also allow users to mount their own external storage services." : "Спољно складиште Вам омогућава да монтирате сервисе и уређаје који нуде спољна складишта, и да се виде као Некстклауд уређају за складиштење. Такође можете дозволити корисницима да сами монтирају њихова сопствене сервисе спољних складишта.",
"All users" : "Сви корисници",
"Allow users to mount external storage" : "Дозволи корисницима да монтирају спољашња складишта"
diff --git a/apps/files_external/l10n/sv.js b/apps/files_external/l10n/sv.js
index aceaa76c8e0..eb47c8b8660 100644
--- a/apps/files_external/l10n/sv.js
+++ b/apps/files_external/l10n/sv.js
@@ -115,6 +115,9 @@ OC.L10N.register(
"External storage support" : "Stöd för extern lagring",
"Adds basic external storage support" : "Lägger till grundläggande stöd för extern lagring",
"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. Administration can choose which types of storage to enable and can mount these storage locations for an account, 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 people 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 administration 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." : "Denna applikation tillåter serveradministratörer konfigurera anslutningar till externa lagringsleverantörer, så som FTP-servrar, S3 eller SWIFT -servrar, andra Nextcloud-servrar, WebDAV-servrar, med flera. Administrationen kan välja vilka typer av lagring som är aktiverade och kan montera dessa lagringsplatser för ett konto, en grupp eller för hela servern. Användare kommer se en ny mapp dyka upp i deras dokument-rot, vilken de kan använda som en vanlig mapp. Extern lagring tillåter också delning av filer lagrade i dessa externa platser. I de fallen används fil-ägarens uppgifter när mottagaren begär filen från den externa lagringen, vilket på så vis garanterar att mottagaren får tillgång till den delade filen.\n\nExtern lagring kan konfigureras genom det grafiska gränssnittet eller kommandoraden. Det sistnämnda alternativet erbjuder administrationen mer flexibilitet vid konfigurering av flertalet lagringsplatser samt monteringsprioriteter. Mer information finns tillgänglig i dokumentationen för användargränssnittet samt för konfigurationsfilen.",
+ "Storage credentials" : "Uppgifter för lagring",
+ "Enter the storage login" : "Ange inloggning för lagringen",
+ "Enter the storage password" : "Ange lösenord för lagringen",
"Submit" : "Skicka",
"Unable to update this external storage config. {statusMessage}" : "Det gick inte att uppdatera denna externa lagringskonfiguration. {statusMessage}",
"New configuration successfully saved" : "Ny konfiguration har sparats",
@@ -155,6 +158,7 @@ OC.L10N.register(
"Check the ACL's of each file or folder inside a directory to filter out items where the user has no read permissions, comes with a performance penalty" : "Kontrollera ACL:er för varje fil eller mapp inuti en sökväg för att filtrera bort element för vilka användaren saknar läsbehörighet, innebär en viss prestandaminskning.",
"Username as share" : "Användarnamn till utdelning",
"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." : "Appen ger administratörer möjlighet att konfigurera kopplingar till extern lagring, ftp-servrar, S3- eller SWIFT-objektlager, andra Nextcloud-servrar, WebDAV-servrar, eller andra typer. Administratörerna kan välja vilka typer av lagring som ska tillåtas, för en användare, en grupp, eller hela systemet. Användare kommer att se en ny folder i sin Nextcloud-rotkatalog. den kan användas precis som andra foldrar. Extern lagring ger också möjlighet att dela filerna på den externa lagringen. Då används den lokala användarens användaruppgifter när de filerna används av externa användare.\n\nExtern lagring kan konfigureras i GUI:t eller på kommandoraden. Det senare alternativet ger mer flexibilitet för monteringspunkter för bulk-lagring. Mer information finns i GUI-dokumentationen och i dokumentationen för extern lagrings-konfigurationsfilen.",
+ "To access the storage, you need to provide the authentification informations." : "För att komma åt lagringen måste du tillhandahålla autentiseringsinformationen.",
"External storage enables you to mount external storage services and devices as secondary Nextcloud storage devices. You may also allow users to mount their own external storage services." : "Externt lagringsutrymme gör det möjligt att montera externa lagringstjänster och enheter som sekundära Nextcloud-lagringsenheter. Du kan också tillåta användare att montera sina egna externa lagringstjänster.",
"All users" : "Alla användare",
"Allow users to mount external storage" : "Tillåt användare att montera extern lagring"
diff --git a/apps/files_external/l10n/sv.json b/apps/files_external/l10n/sv.json
index 8770c22d81f..508cbc859d3 100644
--- a/apps/files_external/l10n/sv.json
+++ b/apps/files_external/l10n/sv.json
@@ -113,6 +113,9 @@
"External storage support" : "Stöd för extern lagring",
"Adds basic external storage support" : "Lägger till grundläggande stöd för extern lagring",
"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. Administration can choose which types of storage to enable and can mount these storage locations for an account, 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 people 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 administration 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." : "Denna applikation tillåter serveradministratörer konfigurera anslutningar till externa lagringsleverantörer, så som FTP-servrar, S3 eller SWIFT -servrar, andra Nextcloud-servrar, WebDAV-servrar, med flera. Administrationen kan välja vilka typer av lagring som är aktiverade och kan montera dessa lagringsplatser för ett konto, en grupp eller för hela servern. Användare kommer se en ny mapp dyka upp i deras dokument-rot, vilken de kan använda som en vanlig mapp. Extern lagring tillåter också delning av filer lagrade i dessa externa platser. I de fallen används fil-ägarens uppgifter när mottagaren begär filen från den externa lagringen, vilket på så vis garanterar att mottagaren får tillgång till den delade filen.\n\nExtern lagring kan konfigureras genom det grafiska gränssnittet eller kommandoraden. Det sistnämnda alternativet erbjuder administrationen mer flexibilitet vid konfigurering av flertalet lagringsplatser samt monteringsprioriteter. Mer information finns tillgänglig i dokumentationen för användargränssnittet samt för konfigurationsfilen.",
+ "Storage credentials" : "Uppgifter för lagring",
+ "Enter the storage login" : "Ange inloggning för lagringen",
+ "Enter the storage password" : "Ange lösenord för lagringen",
"Submit" : "Skicka",
"Unable to update this external storage config. {statusMessage}" : "Det gick inte att uppdatera denna externa lagringskonfiguration. {statusMessage}",
"New configuration successfully saved" : "Ny konfiguration har sparats",
@@ -153,6 +156,7 @@
"Check the ACL's of each file or folder inside a directory to filter out items where the user has no read permissions, comes with a performance penalty" : "Kontrollera ACL:er för varje fil eller mapp inuti en sökväg för att filtrera bort element för vilka användaren saknar läsbehörighet, innebär en viss prestandaminskning.",
"Username as share" : "Användarnamn till utdelning",
"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." : "Appen ger administratörer möjlighet att konfigurera kopplingar till extern lagring, ftp-servrar, S3- eller SWIFT-objektlager, andra Nextcloud-servrar, WebDAV-servrar, eller andra typer. Administratörerna kan välja vilka typer av lagring som ska tillåtas, för en användare, en grupp, eller hela systemet. Användare kommer att se en ny folder i sin Nextcloud-rotkatalog. den kan användas precis som andra foldrar. Extern lagring ger också möjlighet att dela filerna på den externa lagringen. Då används den lokala användarens användaruppgifter när de filerna används av externa användare.\n\nExtern lagring kan konfigureras i GUI:t eller på kommandoraden. Det senare alternativet ger mer flexibilitet för monteringspunkter för bulk-lagring. Mer information finns i GUI-dokumentationen och i dokumentationen för extern lagrings-konfigurationsfilen.",
+ "To access the storage, you need to provide the authentification informations." : "För att komma åt lagringen måste du tillhandahålla autentiseringsinformationen.",
"External storage enables you to mount external storage services and devices as secondary Nextcloud storage devices. You may also allow users to mount their own external storage services." : "Externt lagringsutrymme gör det möjligt att montera externa lagringstjänster och enheter som sekundära Nextcloud-lagringsenheter. Du kan också tillåta användare att montera sina egna externa lagringstjänster.",
"All users" : "Alla användare",
"Allow users to mount external storage" : "Tillåt användare att montera extern lagring"
diff --git a/apps/files_external/l10n/tr.js b/apps/files_external/l10n/tr.js
index b566570aa0c..020096e330a 100644
--- a/apps/files_external/l10n/tr.js
+++ b/apps/files_external/l10n/tr.js
@@ -116,7 +116,6 @@ OC.L10N.register(
"Adds basic external storage support" : "Temel dış depolama desteği ekler",
"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. Administration can choose which types of storage to enable and can mount these storage locations for an account, 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 people 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 administration 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." : "Bu uygulama yöneticilerin FTP sunucular, S3 ya da SWIFT nesne mağazaları, diğer Nextcloud sunucuları ve WebDAV sunucuları gibi çeşitli dış depolama hizmeti sağlayıcıları ile bağlantı kurmasını sağlar. Yöneticiler, etkinleştirmek istedikleri depolama türünü seçebilir ve bu depolama konumlarını belirli bir hesap, bir grup ya da tüm sistem için ekleyebilir. Kullanıcılar bağlanan depolamayı kök Nextcloud klasörü altında yeni bir klasör olarak görebilir ve diğer Nextcloud klasörleri gibi erişebilir. Dış depolama, bu konumlarda depolanan dosyaların kişiler tarafından paylaşılmasına da izin verir. Bu durumda alıcıların dış dosyaya erişebileceğinden emin olmak için yapılan dosya erişimi isteklerinde, dosya sahibinin kimlik doğrulama bilgileri kullanılır.\n\nDış depolama yapılandırması grafik arayüzden ya da komut satırından yapılabilir. Komut satırı seçeneğinde, yöneticiler için toplu dış depolama bağlama ve bağlama noktası öncelikleri gibi esnek yapılandırma seçenekleri bulunur. Ayrıntılı bilgi almak için dış depolama grafik arayüzü belgeleri ile dış depolama yapılandırma dosyası belgelerine bakabilirsiniz.",
"Storage credentials" : "Depolama alanı kimlik doğrulama bilgileri",
- "To access the storage, you need to provide the authentification informations." : "Depolama alanına erişebilmek için kimlik doğrulama bilgilerini vermeniz gerekir.",
"Enter the storage login" : "Depolama alanı kullanıcı adını yazın",
"Enter the storage password" : "Depolama alanı parolasını yazın",
"Submit" : "Gönder",
@@ -159,6 +158,7 @@ OC.L10N.register(
"Check the ACL's of each file or folder inside a directory to filter out items where the user has no read permissions, comes with a performance penalty" : "Tüm dosya ve klasörler için Erişim Denetimi Listesine bakılarak kullanıcının okuma yetkisi olmayan ögeler görüntülenmez. Bu özelliğin kullanılması başarımı düşürür",
"Username as share" : "Paylaşım olarak kullanıcı adı",
"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." : "Bu uygulama yöneticilerin FTP sunucular, S3 ya da SWIFT nesne mağazaları, diğer Nextcloud sunucuları ve WebDAV sunucuları gibi çeşitli dış depolama hizmeti sağlayıcıları ile bağlantı kurmasını sağlar. Yöneticiler etkinleştirmek istedikleri depolama türünü seçebilir ve bu depolama konumlarını belirli bir kullanıcı, bir grup ya da tüm sistem için ekleyebilir. Kullanıcılar bağlanan depolamayı kök Nextcloud klasörü altında yeni bir klasör olarak görebilir ve diğer Nextcloud klasörleri gibi erişebilir. Dış depolama, bu konumlarda depolanan dosyaların kullanıcılar tarafından paylaşılmasına da izin verir. Bu durumda alıcıların dış dosyaya erişebileceğinden emin olmak için yapılan dosya erişimi isteklerinde, dosya sahibinin kimlik doğrulama bilgileri kullanılır.\n\nDış depolama yapılandırması grafik arayüzden ya da komut satırından yapılabilir. Komut satırı seçeneğinde, uzman kullanıcılar için toplu dış depolama bağlama ve bağlama noktası öncelikleri gibi esnek yapılandırma seçenekleri bulunur. Ayrıntılı bilgi almak için dış depolama grafik arayüzü belgeleri ile dış depolama yapılandırma dosyası belgelerine bakabilirsiniz.",
+ "To access the storage, you need to provide the authentification informations." : "Depolama alanına erişebilmek için kimlik doğrulama bilgilerini vermeniz gerekir.",
"External storage enables you to mount external storage services and devices as secondary Nextcloud storage devices. You may also allow users to mount their own external storage services." : "Dış depolama özelliği, dış depolama hizmet ve aygıtlarını ikincil Nextcloud depolama aygıtları olarak ekleyebilmenizi sağlar. Ayrıca kullanıcıların kendi dış depolama aygıtlarını ekleyebilmesine izin verebilirsiniz.",
"All users" : "Tüm kullanıcılar",
"Allow users to mount external storage" : "Kullanıcılar dış depolama bağlayabilsin"
diff --git a/apps/files_external/l10n/tr.json b/apps/files_external/l10n/tr.json
index 1541a4d0526..f8c3b964d08 100644
--- a/apps/files_external/l10n/tr.json
+++ b/apps/files_external/l10n/tr.json
@@ -114,7 +114,6 @@
"Adds basic external storage support" : "Temel dış depolama desteği ekler",
"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. Administration can choose which types of storage to enable and can mount these storage locations for an account, 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 people 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 administration 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." : "Bu uygulama yöneticilerin FTP sunucular, S3 ya da SWIFT nesne mağazaları, diğer Nextcloud sunucuları ve WebDAV sunucuları gibi çeşitli dış depolama hizmeti sağlayıcıları ile bağlantı kurmasını sağlar. Yöneticiler, etkinleştirmek istedikleri depolama türünü seçebilir ve bu depolama konumlarını belirli bir hesap, bir grup ya da tüm sistem için ekleyebilir. Kullanıcılar bağlanan depolamayı kök Nextcloud klasörü altında yeni bir klasör olarak görebilir ve diğer Nextcloud klasörleri gibi erişebilir. Dış depolama, bu konumlarda depolanan dosyaların kişiler tarafından paylaşılmasına da izin verir. Bu durumda alıcıların dış dosyaya erişebileceğinden emin olmak için yapılan dosya erişimi isteklerinde, dosya sahibinin kimlik doğrulama bilgileri kullanılır.\n\nDış depolama yapılandırması grafik arayüzden ya da komut satırından yapılabilir. Komut satırı seçeneğinde, yöneticiler için toplu dış depolama bağlama ve bağlama noktası öncelikleri gibi esnek yapılandırma seçenekleri bulunur. Ayrıntılı bilgi almak için dış depolama grafik arayüzü belgeleri ile dış depolama yapılandırma dosyası belgelerine bakabilirsiniz.",
"Storage credentials" : "Depolama alanı kimlik doğrulama bilgileri",
- "To access the storage, you need to provide the authentification informations." : "Depolama alanına erişebilmek için kimlik doğrulama bilgilerini vermeniz gerekir.",
"Enter the storage login" : "Depolama alanı kullanıcı adını yazın",
"Enter the storage password" : "Depolama alanı parolasını yazın",
"Submit" : "Gönder",
@@ -157,6 +156,7 @@
"Check the ACL's of each file or folder inside a directory to filter out items where the user has no read permissions, comes with a performance penalty" : "Tüm dosya ve klasörler için Erişim Denetimi Listesine bakılarak kullanıcının okuma yetkisi olmayan ögeler görüntülenmez. Bu özelliğin kullanılması başarımı düşürür",
"Username as share" : "Paylaşım olarak kullanıcı adı",
"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." : "Bu uygulama yöneticilerin FTP sunucular, S3 ya da SWIFT nesne mağazaları, diğer Nextcloud sunucuları ve WebDAV sunucuları gibi çeşitli dış depolama hizmeti sağlayıcıları ile bağlantı kurmasını sağlar. Yöneticiler etkinleştirmek istedikleri depolama türünü seçebilir ve bu depolama konumlarını belirli bir kullanıcı, bir grup ya da tüm sistem için ekleyebilir. Kullanıcılar bağlanan depolamayı kök Nextcloud klasörü altında yeni bir klasör olarak görebilir ve diğer Nextcloud klasörleri gibi erişebilir. Dış depolama, bu konumlarda depolanan dosyaların kullanıcılar tarafından paylaşılmasına da izin verir. Bu durumda alıcıların dış dosyaya erişebileceğinden emin olmak için yapılan dosya erişimi isteklerinde, dosya sahibinin kimlik doğrulama bilgileri kullanılır.\n\nDış depolama yapılandırması grafik arayüzden ya da komut satırından yapılabilir. Komut satırı seçeneğinde, uzman kullanıcılar için toplu dış depolama bağlama ve bağlama noktası öncelikleri gibi esnek yapılandırma seçenekleri bulunur. Ayrıntılı bilgi almak için dış depolama grafik arayüzü belgeleri ile dış depolama yapılandırma dosyası belgelerine bakabilirsiniz.",
+ "To access the storage, you need to provide the authentification informations." : "Depolama alanına erişebilmek için kimlik doğrulama bilgilerini vermeniz gerekir.",
"External storage enables you to mount external storage services and devices as secondary Nextcloud storage devices. You may also allow users to mount their own external storage services." : "Dış depolama özelliği, dış depolama hizmet ve aygıtlarını ikincil Nextcloud depolama aygıtları olarak ekleyebilmenizi sağlar. Ayrıca kullanıcıların kendi dış depolama aygıtlarını ekleyebilmesine izin verebilirsiniz.",
"All users" : "Tüm kullanıcılar",
"Allow users to mount external storage" : "Kullanıcılar dış depolama bağlayabilsin"
diff --git a/apps/files_external/l10n/zh_HK.js b/apps/files_external/l10n/zh_HK.js
index 6619ec72a44..6022285e3f6 100644
--- a/apps/files_external/l10n/zh_HK.js
+++ b/apps/files_external/l10n/zh_HK.js
@@ -116,7 +116,6 @@ OC.L10N.register(
"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. Administration can choose which types of storage to enable and can mount these storage locations for an account, 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 people 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 administration 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 物件儲存、其他 Nextcloud 伺服器、WebDAV 伺服器與更多。管理員可以選擇要啟用的儲存空間類型,並可以為使用者、群組或整個系統掛載這些儲存位置。使用者將會在他們的 Nextcloud 根目錄看到一個新的資料夾,他們可以像其他 Nextcloud 資料夾那樣存取並使用該資料夾。外部儲存空間也允許使用者分享儲存在這些外部空間的檔案。在這種情況下,當收件者從外部儲存空間請求檔案時,將使用檔案擁有者的憑證來確保收件者可以存取被分享的檔案。\n\n可以使用圖形使用者介面或命令列設定外部儲存空間。後者提供了管理員更大的彈性,可用於設定大容量儲存空間的掛載並設定掛載屬性。更多資訊可在外部儲存空間圖形化使用者介面的文件與外部儲存空間設定檔文件中檢視。",
"Storage credentials" : "儲存身份驗證",
- "To access the storage, you need to provide the authentification informations." : "要存取存儲,您需要提供身份驗證資訊。",
"Enter the storage login" : "輸入儲存登入帳號",
"Enter the storage password" : "輸入儲存密碼",
"Submit" : "遞交",
@@ -159,6 +158,7 @@ OC.L10N.register(
"Check the ACL's of each file or folder inside a directory to filter out items where the user has no read permissions, comes with a performance penalty" : "檢查目錄中每個檔案或資料夾的ACL,以過濾掉用戶沒有讀取權限的項目,但這會帶來性能損失。",
"Username as share" : "以用戶名稱分享",
"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對象存儲,其他 Nextcloud 伺服器,WebDAV 伺服器等。管理員可以選擇要啟用的存儲類型,並可以為用戶,群組或整個系統安裝這些存儲位置。用戶將看到一個新資料夾出現在其根 Nextcloud 目錄中,他們可以像存取其他 Nextcloud 資料夾一樣存取和使用該資料夾。外部存儲還允許用戶共享存儲在這些外部位置中的檔案。在這些情況下,當收件人從外部存儲設備索取檔案時,將使用檔案所有者的憑據,從而確保收件人可以訪問共享文件。\n\n可以使用 GUI 或在命令行中配置外部存儲。第二個選項為高級用戶提供了更大的靈活性,用於配置大容量外部存儲安裝和設置安裝優先級。外部存儲 GUI 文檔和外部存儲配置文檔中提供了更多信息。",
+ "To access the storage, you need to provide the authentification informations." : "要存取存儲,您需要提供身份驗證資訊。",
"External storage enables you to mount external storage services and devices as secondary Nextcloud storage devices. You may also allow users to mount their own external storage services." : "外部存儲使您可以將外部存儲服務和設備掛載為次要的Nextcloud存儲設備。您還可以允許用戶安裝他們自己的外部存儲服務。",
"All users" : "所有用戶",
"Allow users to mount external storage" : "允許用戶能自行掛載外部儲存"
diff --git a/apps/files_external/l10n/zh_HK.json b/apps/files_external/l10n/zh_HK.json
index 07589d70337..0b462306193 100644
--- a/apps/files_external/l10n/zh_HK.json
+++ b/apps/files_external/l10n/zh_HK.json
@@ -114,7 +114,6 @@
"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. Administration can choose which types of storage to enable and can mount these storage locations for an account, 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 people 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 administration 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 物件儲存、其他 Nextcloud 伺服器、WebDAV 伺服器與更多。管理員可以選擇要啟用的儲存空間類型,並可以為使用者、群組或整個系統掛載這些儲存位置。使用者將會在他們的 Nextcloud 根目錄看到一個新的資料夾,他們可以像其他 Nextcloud 資料夾那樣存取並使用該資料夾。外部儲存空間也允許使用者分享儲存在這些外部空間的檔案。在這種情況下,當收件者從外部儲存空間請求檔案時,將使用檔案擁有者的憑證來確保收件者可以存取被分享的檔案。\n\n可以使用圖形使用者介面或命令列設定外部儲存空間。後者提供了管理員更大的彈性,可用於設定大容量儲存空間的掛載並設定掛載屬性。更多資訊可在外部儲存空間圖形化使用者介面的文件與外部儲存空間設定檔文件中檢視。",
"Storage credentials" : "儲存身份驗證",
- "To access the storage, you need to provide the authentification informations." : "要存取存儲,您需要提供身份驗證資訊。",
"Enter the storage login" : "輸入儲存登入帳號",
"Enter the storage password" : "輸入儲存密碼",
"Submit" : "遞交",
@@ -157,6 +156,7 @@
"Check the ACL's of each file or folder inside a directory to filter out items where the user has no read permissions, comes with a performance penalty" : "檢查目錄中每個檔案或資料夾的ACL,以過濾掉用戶沒有讀取權限的項目,但這會帶來性能損失。",
"Username as share" : "以用戶名稱分享",
"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對象存儲,其他 Nextcloud 伺服器,WebDAV 伺服器等。管理員可以選擇要啟用的存儲類型,並可以為用戶,群組或整個系統安裝這些存儲位置。用戶將看到一個新資料夾出現在其根 Nextcloud 目錄中,他們可以像存取其他 Nextcloud 資料夾一樣存取和使用該資料夾。外部存儲還允許用戶共享存儲在這些外部位置中的檔案。在這些情況下,當收件人從外部存儲設備索取檔案時,將使用檔案所有者的憑據,從而確保收件人可以訪問共享文件。\n\n可以使用 GUI 或在命令行中配置外部存儲。第二個選項為高級用戶提供了更大的靈活性,用於配置大容量外部存儲安裝和設置安裝優先級。外部存儲 GUI 文檔和外部存儲配置文檔中提供了更多信息。",
+ "To access the storage, you need to provide the authentification informations." : "要存取存儲,您需要提供身份驗證資訊。",
"External storage enables you to mount external storage services and devices as secondary Nextcloud storage devices. You may also allow users to mount their own external storage services." : "外部存儲使您可以將外部存儲服務和設備掛載為次要的Nextcloud存儲設備。您還可以允許用戶安裝他們自己的外部存儲服務。",
"All users" : "所有用戶",
"Allow users to mount external storage" : "允許用戶能自行掛載外部儲存"
diff --git a/apps/files_external/lib/Config/ConfigAdapter.php b/apps/files_external/lib/Config/ConfigAdapter.php
index 97bc4f78142..d0437432427 100644
--- a/apps/files_external/lib/Config/ConfigAdapter.php
+++ b/apps/files_external/lib/Config/ConfigAdapter.php
@@ -14,7 +14,8 @@ use OCA\Files_External\Lib\StorageConfig;
use OCA\Files_External\Service\UserGlobalStoragesService;
use OCA\Files_External\Service\UserStoragesService;
use OCP\Files\Config\IMountProvider;
-use OCP\Files\Storage;
+use OCP\Files\ObjectStore\IObjectStore;
+use OCP\Files\Storage\IStorage;
use OCP\Files\Storage\IStorageFactory;
use OCP\Files\StorageNotAvailableException;
use OCP\IUser;
@@ -34,11 +35,9 @@ class ConfigAdapter implements IMountProvider {
/**
* Process storage ready for mounting
*
- * @param StorageConfig $storage
- * @param IUser $user
* @throws \OCP\AppFramework\QueryException
*/
- private function prepareStorageConfig(StorageConfig &$storage, IUser $user) {
+ private function prepareStorageConfig(StorageConfig &$storage, IUser $user): void {
foreach ($storage->getBackendOptions() as $option => $value) {
$storage->setBackendOption($option, \OCA\Files_External\MountConfig::substitutePlaceholdersInConfig($value, $user->getUID()));
}
@@ -46,7 +45,7 @@ class ConfigAdapter implements IMountProvider {
$objectStore = $storage->getBackendOption('objectstore');
if ($objectStore) {
$objectClass = $objectStore['class'];
- if (!is_subclass_of($objectClass, '\OCP\Files\ObjectStore\IObjectStore')) {
+ if (!is_subclass_of($objectClass, IObjectStore::class)) {
throw new \InvalidArgumentException('Invalid object store');
}
$storage->setBackendOption('objectstore', new $objectClass($objectStore));
@@ -60,9 +59,8 @@ class ConfigAdapter implements IMountProvider {
* Construct the storage implementation
*
* @param StorageConfig $storageConfig
- * @return Storage
*/
- private function constructStorage(StorageConfig $storageConfig) {
+ private function constructStorage(StorageConfig $storageConfig): IStorage {
$class = $storageConfig->getBackend()->getStorageClass();
$storage = new $class($storageConfig->getBackendOptions());
@@ -76,8 +74,6 @@ class ConfigAdapter implements IMountProvider {
/**
* Get all mountpoints applicable for the user
*
- * @param \OCP\IUser $user
- * @param \OCP\Files\Storage\IStorageFactory $loader
* @return \OCP\Files\Mount\IMountPoint[]
*/
public function getMountsForUser(IUser $user, IStorageFactory $loader) {
@@ -97,11 +93,11 @@ class ConfigAdapter implements IMountProvider {
}, $storageConfigs);
- \OC\Files\Cache\Storage::getGlobalCache()->loadForStorageIds(array_map(function (Storage\IStorage $storage) {
+ \OC\Files\Cache\Storage::getGlobalCache()->loadForStorageIds(array_map(function (IStorage $storage) {
return $storage->getId();
}, $storages));
- $availableStorages = array_map(function (Storage\IStorage $storage, StorageConfig $storageConfig) {
+ $availableStorages = array_map(function (IStorage $storage, StorageConfig $storageConfig): IStorage {
try {
$availability = $storage->getAvailability();
if (!$availability['available'] && !Availability::shouldRecheck($availability)) {
@@ -116,7 +112,7 @@ class ConfigAdapter implements IMountProvider {
return $storage;
}, $storages, $storageConfigs);
- $mounts = array_map(function (StorageConfig $storageConfig, Storage\IStorage $storage) use ($user, $loader) {
+ $mounts = array_map(function (StorageConfig $storageConfig, IStorage $storage) use ($user, $loader) {
$storage->setOwner($user->getUID());
if ($storageConfig->getType() === StorageConfig::MOUNT_TYPE_PERSONAL) {
return new PersonalMount(
diff --git a/apps/files_external/lib/Lib/Auth/Password/SessionCredentials.php b/apps/files_external/lib/Lib/Auth/Password/SessionCredentials.php
index d81c73ca13f..314ab82385e 100644
--- a/apps/files_external/lib/Lib/Auth/Password/SessionCredentials.php
+++ b/apps/files_external/lib/Lib/Auth/Password/SessionCredentials.php
@@ -12,7 +12,7 @@ use OCA\Files_External\Lib\SessionStorageWrapper;
use OCA\Files_External\Lib\StorageConfig;
use OCP\Authentication\Exceptions\CredentialsUnavailableException;
use OCP\Authentication\LoginCredentials\IStore as CredentialsStore;
-use OCP\Files\Storage;
+use OCP\Files\Storage\IStorage;
use OCP\Files\StorageAuthException;
use OCP\IL10N;
use OCP\IUser;
@@ -56,7 +56,7 @@ class SessionCredentials extends AuthMechanism {
$storage->setBackendOption('password', $credentials->getPassword());
}
- public function wrapStorage(Storage $storage) {
+ public function wrapStorage(IStorage $storage): IStorage {
return new SessionStorageWrapper(['storage' => $storage]);
}
}
diff --git a/apps/files_external/lib/Lib/StorageModifierTrait.php b/apps/files_external/lib/Lib/StorageModifierTrait.php
index 7cc7a15605c..4b9264f4223 100644
--- a/apps/files_external/lib/Lib/StorageModifierTrait.php
+++ b/apps/files_external/lib/Lib/StorageModifierTrait.php
@@ -6,7 +6,7 @@
*/
namespace OCA\Files_External\Lib;
-use OCP\Files\Storage;
+use OCP\Files\Storage\IStorage;
use OCP\Files\StorageNotAvailableException;
use OCP\IUser;
@@ -28,8 +28,8 @@ trait StorageModifierTrait {
/**
* Modify a StorageConfig parameters
*
- * @param StorageConfig $storage
- * @param IUser $user User the storage is being used as
+ * @param StorageConfig &$storage
+ * @param ?IUser $user User the storage is being used as
* @return void
* @throws InsufficientDataForMeaningfulAnswerException
* @throws StorageNotAvailableException
@@ -38,14 +38,12 @@ trait StorageModifierTrait {
}
/**
- * Wrap a Storage if necessary
+ * Wrap a storage if necessary
*
- * @param Storage $storage
- * @return Storage
* @throws InsufficientDataForMeaningfulAnswerException
* @throws StorageNotAvailableException
*/
- public function wrapStorage(Storage $storage) {
+ public function wrapStorage(IStorage $storage): IStorage {
return $storage;
}
}
diff --git a/apps/files_reminders/l10n/hu.js b/apps/files_reminders/l10n/hu.js
index d1d016440c3..b285746a855 100644
--- a/apps/files_reminders/l10n/hu.js
+++ b/apps/files_reminders/l10n/hu.js
@@ -7,14 +7,18 @@ OC.L10N.register(
"View folder" : "Mappa megtekintése",
"Set file reminders" : "Fájl emlékeztetők beállítása",
"**📣 File reminders**\n\nSet file reminders." : "**📣 Fájl emlékeztetők**\n\nFájl emlékeztetők beállítása.",
+ "We will remind you of this file" : "Emlékeztetni fogjuk Önt erre a fájlra",
"Please choose a valid date & time" : "Adjon meg egy érvényes dátumot és időt",
"Cancel" : "Mégse",
"Clear reminder" : "Emlékeztető törlése",
"Set reminder" : "Emlékeztető beállítása",
+ "Set reminder for \"{fileName}\"" : "Emlékeztető beállítása a következőhöz: „{fileName}”",
"Set reminder at custom date & time" : "Emlékeztető beállítása tetszőleges időpontra",
"Reminder set for \"{fileName}\"" : "Emlékeztető beállítva a következőhöz: {name}",
"Failed to set reminder" : "Nem sikerült beállítani az emlékeztetőt",
+ "Reminder cleared for \"{fileName}\"" : "Emlékeztető törlése a következőhöz: „{fileName}”",
"Failed to clear reminder" : "Nem sikerült törölni az emlékeztetőt",
+ "Reminder set" : "Emlékeztető beállítása",
"Set custom reminder" : "Egyéni emlékeztető beállítása",
"Later today" : "Mai nap később",
"Set reminder for later today" : "Emlékeztető beállítása a mai napon későbbre",
diff --git a/apps/files_reminders/l10n/hu.json b/apps/files_reminders/l10n/hu.json
index 3a7eaf2a586..c87b9d5f4cd 100644
--- a/apps/files_reminders/l10n/hu.json
+++ b/apps/files_reminders/l10n/hu.json
@@ -5,14 +5,18 @@
"View folder" : "Mappa megtekintése",
"Set file reminders" : "Fájl emlékeztetők beállítása",
"**📣 File reminders**\n\nSet file reminders." : "**📣 Fájl emlékeztetők**\n\nFájl emlékeztetők beállítása.",
+ "We will remind you of this file" : "Emlékeztetni fogjuk Önt erre a fájlra",
"Please choose a valid date & time" : "Adjon meg egy érvényes dátumot és időt",
"Cancel" : "Mégse",
"Clear reminder" : "Emlékeztető törlése",
"Set reminder" : "Emlékeztető beállítása",
+ "Set reminder for \"{fileName}\"" : "Emlékeztető beállítása a következőhöz: „{fileName}”",
"Set reminder at custom date & time" : "Emlékeztető beállítása tetszőleges időpontra",
"Reminder set for \"{fileName}\"" : "Emlékeztető beállítva a következőhöz: {name}",
"Failed to set reminder" : "Nem sikerült beállítani az emlékeztetőt",
+ "Reminder cleared for \"{fileName}\"" : "Emlékeztető törlése a következőhöz: „{fileName}”",
"Failed to clear reminder" : "Nem sikerült törölni az emlékeztetőt",
+ "Reminder set" : "Emlékeztető beállítása",
"Set custom reminder" : "Egyéni emlékeztető beállítása",
"Later today" : "Mai nap később",
"Set reminder for later today" : "Emlékeztető beállítása a mai napon későbbre",
diff --git a/apps/files_sharing/l10n/hu.js b/apps/files_sharing/l10n/hu.js
index cbd01137970..bd3018e5a72 100644
--- a/apps/files_sharing/l10n/hu.js
+++ b/apps/files_sharing/l10n/hu.js
@@ -66,6 +66,7 @@ OC.L10N.register(
"Could not create share" : "A megosztás nem hozható létre",
"Invalid permissions" : "Érvénytelen jogosultságok",
"Invalid date, date format must be YYYY-MM-DD" : "Érvénytelen dátum, a dátumnak YYYY-MM-DD formátumúnak kell lennie",
+ "Please specify a valid account to share with" : "Adjon meg egy érvényes fiókot a megosztáshoz",
"Group sharing is disabled by the administrator" : "A csoportos megosztást letiltotta a rendszergazda",
"Please specify a valid group" : "Adjon meg egy érvényes csoportot",
"Public link sharing is disabled by the administrator" : "A nyilvános hivatkozással történő megosztást letiltotta a rendszergazda",
@@ -76,6 +77,7 @@ OC.L10N.register(
"Sharing %1$s failed because the back end does not allow shares from type %2$s" : "A(z) %1$s megosztása sikertelen, mert a háttérprogram nem engedélyezi a(z) %2$s típusú megosztást",
"Please specify a valid federated account ID" : "Adjon meg egy érvényes föderált fiókazonosítót",
"Please specify a valid federated group ID" : "Adjon meg egy érvényes föderált csoportazonosítót",
+ "You cannot share to a Team if the app is not enabled" : "Nem tudja megosztani egy Csapat számára, ha az alkalmazás nem engedélyezett",
"Please specify a valid team" : "Adjon meg egy érvényes csapatot",
"Sharing %s failed because the back end does not support room shares" : "A(z) %s megosztása sikertelen, mert a háttérprogram nem támogatja a szobamegosztásokat",
"Sharing %s failed because the back end does not support ScienceMesh shares" : "A(z) %s megosztása sikertelen, mert a háttérprogram nem támogatja a ScienceMesh megosztásokat",
diff --git a/apps/files_sharing/l10n/hu.json b/apps/files_sharing/l10n/hu.json
index be3c256f32a..79426157c47 100644
--- a/apps/files_sharing/l10n/hu.json
+++ b/apps/files_sharing/l10n/hu.json
@@ -64,6 +64,7 @@
"Could not create share" : "A megosztás nem hozható létre",
"Invalid permissions" : "Érvénytelen jogosultságok",
"Invalid date, date format must be YYYY-MM-DD" : "Érvénytelen dátum, a dátumnak YYYY-MM-DD formátumúnak kell lennie",
+ "Please specify a valid account to share with" : "Adjon meg egy érvényes fiókot a megosztáshoz",
"Group sharing is disabled by the administrator" : "A csoportos megosztást letiltotta a rendszergazda",
"Please specify a valid group" : "Adjon meg egy érvényes csoportot",
"Public link sharing is disabled by the administrator" : "A nyilvános hivatkozással történő megosztást letiltotta a rendszergazda",
@@ -74,6 +75,7 @@
"Sharing %1$s failed because the back end does not allow shares from type %2$s" : "A(z) %1$s megosztása sikertelen, mert a háttérprogram nem engedélyezi a(z) %2$s típusú megosztást",
"Please specify a valid federated account ID" : "Adjon meg egy érvényes föderált fiókazonosítót",
"Please specify a valid federated group ID" : "Adjon meg egy érvényes föderált csoportazonosítót",
+ "You cannot share to a Team if the app is not enabled" : "Nem tudja megosztani egy Csapat számára, ha az alkalmazás nem engedélyezett",
"Please specify a valid team" : "Adjon meg egy érvényes csapatot",
"Sharing %s failed because the back end does not support room shares" : "A(z) %s megosztása sikertelen, mert a háttérprogram nem támogatja a szobamegosztásokat",
"Sharing %s failed because the back end does not support ScienceMesh shares" : "A(z) %s megosztása sikertelen, mert a háttérprogram nem támogatja a ScienceMesh megosztásokat",
diff --git a/apps/files_sharing/l10n/sr.js b/apps/files_sharing/l10n/sr.js
index 7157f9619bb..fe79bc5a7cd 100644
--- a/apps/files_sharing/l10n/sr.js
+++ b/apps/files_sharing/l10n/sr.js
@@ -113,6 +113,9 @@ OC.L10N.register(
"You received {share} to group {group} as a share by {user}" : "Примили сте {share} за групу {group} као дељење од {user}",
"Accept" : "Прихвати",
"Decline" : "Одбиј",
+ "Remember to upload the files to %s" : "Не заборавите да отпремите фајлове на %s",
+ "We would like to kindly remind you that you have not yet uploaded any files to the shared folder." : "Подсећамо вас да још увек нисте отпремили ниједан фајл у дељени фолдер.",
+ "Open \"%s\"" : "Отвори „%s”",
"This application enables people to share files within Nextcloud. If enabled, the admin can choose which groups can share files. The applicable people can then share files and folders with other accounts and groups within Nextcloud. In addition, if the admin enables the share link feature, an external link can be used to share files with other people outside of Nextcloud. Admins can also enforce passwords, expirations dates, and enable server to server sharing via share links, as well as sharing from mobile devices.\nTurning the feature off removes shared files and folders on the server for all share recipients, and also on the sync clients and mobile apps. More information is available in the Nextcloud Documentation." : "Ова апликација омогућава људима да деле фајлове унутар Nextcloud инстанце. Када се укључи, админ може да одабере које групе могу да деле фајлове. Ти људи затим могу да деле фолдере и фајлове са осталим налозима и групама унутар Nextcloud инстанце. Уз то, ако админ укључи и могућност дељења линка, за дељење са корисницима ван Nextcloud инстанце може да се употреби спољни линк. Админи такође могу да форсирају лозинке, датум истека и да омогуће дељење између сервера преко линкова дељења, као и дељење са мобилних уређаја.\nИскључивањем ове могућности искључује се дељење фајлова и фолдера и на серверу са свим примаоцима дељења, као и на клијентима за синхорнизацију и мобилним апликацијама. Више информација можете наћи у Nextcloud документацији.",
"People" : "Људи",
"Filter accounts" : "Филтрирај налоге",
@@ -244,9 +247,14 @@ OC.L10N.register(
"Note from" : "Напомена од",
"Note:" : "Белешка:",
"File drop" : "Место за упуштање фајлова",
+ "Upload files to {foldername}." : "Отпреми фајлове у {foldername}.",
+ "By uploading files, you agree to the terms of service." : "Отпремањем фајлова, слажете се са условима коришћења.",
+ "View terms of service" : "Прикажи услове коришћења",
"Terms of service" : "Услови коришћења",
"{ownerDisplayName} shared a folder with you." : "{ownerDisplayName} је са вама поделио фолдер.",
"To upload files, you need to provide your name first." : "Да бисте могли да отпремите фајлове, најпре наведите своје име.",
+ "Nickname" : "Надимак",
+ "Enter your nickname" : "Унесите свој надимак",
"Upload files to {folder}" : "Отпреми фајлове у {folder}",
"Submit name" : "Поднеси име",
"Allow upload and editing" : "Дозволи отпремање и уређивање",
@@ -283,6 +291,7 @@ OC.L10N.register(
"Toggle list of others with access to this directory" : "Укључи/искључи списак осталих са приступом овом директоријуму",
"Toggle list of others with access to this file" : "Укључи/искључи списак осталих са приступом овом фајлу",
"Unable to fetch inherited shares" : "Не могу да дохватим наслеђена дељења",
+ "Link shares" : "Дељења линком",
"Shares" : "Дељења",
"Unable to load the shares list" : "Неуспело учитавање листе дељења",
"Expires {relativetime}" : "Истиче {relativetime}",
@@ -300,8 +309,15 @@ OC.L10N.register(
"Show sharing options" : "Прикажи опције дељења",
"Shared with others" : "Дељено са осталима",
"Create file request" : "Креирај захтев за фајл",
+ "Upload files to {foldername}" : "Отпреми фајлове у {foldername}",
+ "Public file share" : "Јавно дељење фајла",
+ "Public shared file." : "Јавно подељени фајл.",
"No file" : "Нема фајла",
+ "The file shared with you will show up here" : "Овде ће се појавити фајл који је подељен са вама",
"Public share" : "Јавни дељење",
+ "Public shared files." : "Јавно подељени фајлови.",
+ "No files" : "Нема фајлова",
+ "Files and folders shared with you will show up here" : "Овде ће се појавити фајлови и фолдери које су подељени са вама",
"Overview of shared files." : "Преглед дељених фајлова.",
"No shares" : "Нема дељења",
"Files and folders you shared or have been shared with you will show up here" : "Овде ће се појавити фајлови и фолдери које сте ви поделили или које други деле са вама",
diff --git a/apps/files_sharing/l10n/sr.json b/apps/files_sharing/l10n/sr.json
index f5261eb0c50..5132059e854 100644
--- a/apps/files_sharing/l10n/sr.json
+++ b/apps/files_sharing/l10n/sr.json
@@ -111,6 +111,9 @@
"You received {share} to group {group} as a share by {user}" : "Примили сте {share} за групу {group} као дељење од {user}",
"Accept" : "Прихвати",
"Decline" : "Одбиј",
+ "Remember to upload the files to %s" : "Не заборавите да отпремите фајлове на %s",
+ "We would like to kindly remind you that you have not yet uploaded any files to the shared folder." : "Подсећамо вас да још увек нисте отпремили ниједан фајл у дељени фолдер.",
+ "Open \"%s\"" : "Отвори „%s”",
"This application enables people to share files within Nextcloud. If enabled, the admin can choose which groups can share files. The applicable people can then share files and folders with other accounts and groups within Nextcloud. In addition, if the admin enables the share link feature, an external link can be used to share files with other people outside of Nextcloud. Admins can also enforce passwords, expirations dates, and enable server to server sharing via share links, as well as sharing from mobile devices.\nTurning the feature off removes shared files and folders on the server for all share recipients, and also on the sync clients and mobile apps. More information is available in the Nextcloud Documentation." : "Ова апликација омогућава људима да деле фајлове унутар Nextcloud инстанце. Када се укључи, админ може да одабере које групе могу да деле фајлове. Ти људи затим могу да деле фолдере и фајлове са осталим налозима и групама унутар Nextcloud инстанце. Уз то, ако админ укључи и могућност дељења линка, за дељење са корисницима ван Nextcloud инстанце може да се употреби спољни линк. Админи такође могу да форсирају лозинке, датум истека и да омогуће дељење између сервера преко линкова дељења, као и дељење са мобилних уређаја.\nИскључивањем ове могућности искључује се дељење фајлова и фолдера и на серверу са свим примаоцима дељења, као и на клијентима за синхорнизацију и мобилним апликацијама. Више информација можете наћи у Nextcloud документацији.",
"People" : "Људи",
"Filter accounts" : "Филтрирај налоге",
@@ -242,9 +245,14 @@
"Note from" : "Напомена од",
"Note:" : "Белешка:",
"File drop" : "Место за упуштање фајлова",
+ "Upload files to {foldername}." : "Отпреми фајлове у {foldername}.",
+ "By uploading files, you agree to the terms of service." : "Отпремањем фајлова, слажете се са условима коришћења.",
+ "View terms of service" : "Прикажи услове коришћења",
"Terms of service" : "Услови коришћења",
"{ownerDisplayName} shared a folder with you." : "{ownerDisplayName} је са вама поделио фолдер.",
"To upload files, you need to provide your name first." : "Да бисте могли да отпремите фајлове, најпре наведите своје име.",
+ "Nickname" : "Надимак",
+ "Enter your nickname" : "Унесите свој надимак",
"Upload files to {folder}" : "Отпреми фајлове у {folder}",
"Submit name" : "Поднеси име",
"Allow upload and editing" : "Дозволи отпремање и уређивање",
@@ -281,6 +289,7 @@
"Toggle list of others with access to this directory" : "Укључи/искључи списак осталих са приступом овом директоријуму",
"Toggle list of others with access to this file" : "Укључи/искључи списак осталих са приступом овом фајлу",
"Unable to fetch inherited shares" : "Не могу да дохватим наслеђена дељења",
+ "Link shares" : "Дељења линком",
"Shares" : "Дељења",
"Unable to load the shares list" : "Неуспело учитавање листе дељења",
"Expires {relativetime}" : "Истиче {relativetime}",
@@ -298,8 +307,15 @@
"Show sharing options" : "Прикажи опције дељења",
"Shared with others" : "Дељено са осталима",
"Create file request" : "Креирај захтев за фајл",
+ "Upload files to {foldername}" : "Отпреми фајлове у {foldername}",
+ "Public file share" : "Јавно дељење фајла",
+ "Public shared file." : "Јавно подељени фајл.",
"No file" : "Нема фајла",
+ "The file shared with you will show up here" : "Овде ће се појавити фајл који је подељен са вама",
"Public share" : "Јавни дељење",
+ "Public shared files." : "Јавно подељени фајлови.",
+ "No files" : "Нема фајлова",
+ "Files and folders shared with you will show up here" : "Овде ће се појавити фајлови и фолдери које су подељени са вама",
"Overview of shared files." : "Преглед дељених фајлова.",
"No shares" : "Нема дељења",
"Files and folders you shared or have been shared with you will show up here" : "Овде ће се појавити фајлови и фолдери које сте ви поделили или које други деле са вама",
diff --git a/apps/files_sharing/lib/Activity/Providers/Base.php b/apps/files_sharing/lib/Activity/Providers/Base.php
index 5bf63b7e2af..13bf3fea0e7 100644
--- a/apps/files_sharing/lib/Activity/Providers/Base.php
+++ b/apps/files_sharing/lib/Activity/Providers/Base.php
@@ -5,6 +5,7 @@
*/
namespace OCA\Files_Sharing\Activity\Providers;
+use OCP\Activity\Exceptions\UnknownActivityException;
use OCP\Activity\IEvent;
use OCP\Activity\IEventMerger;
use OCP\Activity\IManager;
@@ -65,12 +66,12 @@ abstract class Base implements IProvider {
* @param IEvent $event
* @param IEvent|null $previousEvent
* @return IEvent
- * @throws \InvalidArgumentException
+ * @throws UnknownActivityException
* @since 11.0.0
*/
public function parse($language, IEvent $event, ?IEvent $previousEvent = null) {
if ($event->getApp() !== 'files_sharing') {
- throw new \InvalidArgumentException();
+ throw new UnknownActivityException();
}
$this->l = $this->languageFactory->get('files_sharing', $language);
diff --git a/apps/files_sharing/lib/External/Storage.php b/apps/files_sharing/lib/External/Storage.php
index 36f4c0b8859..bfaf9a99442 100644
--- a/apps/files_sharing/lib/External/Storage.php
+++ b/apps/files_sharing/lib/External/Storage.php
@@ -137,11 +137,6 @@ class Storage extends DAV implements ISharedStorage, IDisableEncryptionStorage,
return $this->cache;
}
- /**
- * @param string $path
- * @param \OC\Files\Storage\Storage $storage
- * @return \OCA\Files_Sharing\External\Scanner
- */
public function getScanner($path = '', $storage = null) {
if (!$storage) {
$storage = $this;
@@ -149,6 +144,7 @@ class Storage extends DAV implements ISharedStorage, IDisableEncryptionStorage,
if (!isset($this->scanner)) {
$this->scanner = new Scanner($storage);
}
+ /** @var \OCA\Files_Sharing\External\Scanner */
return $this->scanner;
}
@@ -344,7 +340,7 @@ class Storage extends DAV implements ISharedStorage, IDisableEncryptionStorage,
return json_decode($response->getBody(), true);
}
- public function getOwner($path) {
+ public function getOwner($path): string|false {
return $this->cloudId->getDisplayId();
}
diff --git a/apps/files_sharing/lib/SharedStorage.php b/apps/files_sharing/lib/SharedStorage.php
index 00f757d4734..0a6a068c441 100644
--- a/apps/files_sharing/lib/SharedStorage.php
+++ b/apps/files_sharing/lib/SharedStorage.php
@@ -27,6 +27,7 @@ use OCP\Files\IHomeStorage;
use OCP\Files\IRootFolder;
use OCP\Files\NotFoundException;
use OCP\Files\Storage\IDisableEncryptionStorage;
+use OCP\Files\Storage\ILockingStorage;
use OCP\Files\Storage\ISharedStorage;
use OCP\Files\Storage\IStorage;
use OCP\Lock\ILockingProvider;
@@ -445,7 +446,7 @@ class SharedStorage extends \OC\Files\Storage\Wrapper\Jail implements LegacyISha
return new \OCA\Files_Sharing\Scanner($storage);
}
- public function getOwner($path): string {
+ public function getOwner($path): string|false {
return $this->superShare->getShareOwner();
}
@@ -487,14 +488,8 @@ class SharedStorage extends \OC\Files\Storage\Wrapper\Jail implements LegacyISha
return true;
}
- /**
- * @param string $path
- * @param int $type \OCP\Lock\ILockingProvider::LOCK_SHARED or \OCP\Lock\ILockingProvider::LOCK_EXCLUSIVE
- * @param \OCP\Lock\ILockingProvider $provider
- * @throws \OCP\Lock\LockedException
- */
public function acquireLock($path, $type, ILockingProvider $provider) {
- /** @var \OCP\Files\Storage $targetStorage */
+ /** @var ILockingStorage $targetStorage */
[$targetStorage, $targetInternalPath] = $this->resolvePath($path);
$targetStorage->acquireLock($targetInternalPath, $type, $provider);
// lock the parent folders of the owner when locking the share as recipient
@@ -504,13 +499,8 @@ class SharedStorage extends \OC\Files\Storage\Wrapper\Jail implements LegacyISha
}
}
- /**
- * @param string $path
- * @param int $type \OCP\Lock\ILockingProvider::LOCK_SHARED or \OCP\Lock\ILockingProvider::LOCK_EXCLUSIVE
- * @param \OCP\Lock\ILockingProvider $provider
- */
public function releaseLock($path, $type, ILockingProvider $provider) {
- /** @var \OCP\Files\Storage $targetStorage */
+ /** @var ILockingStorage $targetStorage */
[$targetStorage, $targetInternalPath] = $this->resolvePath($path);
$targetStorage->releaseLock($targetInternalPath, $type, $provider);
// unlock the parent folders of the owner when unlocking the share as recipient
@@ -520,13 +510,8 @@ class SharedStorage extends \OC\Files\Storage\Wrapper\Jail implements LegacyISha
}
}
- /**
- * @param string $path
- * @param int $type \OCP\Lock\ILockingProvider::LOCK_SHARED or \OCP\Lock\ILockingProvider::LOCK_EXCLUSIVE
- * @param \OCP\Lock\ILockingProvider $provider
- */
public function changeLock($path, $type, ILockingProvider $provider) {
- /** @var \OCP\Files\Storage $targetStorage */
+ /** @var ILockingStorage $targetStorage */
[$targetStorage, $targetInternalPath] = $this->resolvePath($path);
$targetStorage->changeLock($targetInternalPath, $type, $provider);
}
diff --git a/apps/files_sharing/tests/Controller/ShareAPIControllerTest.php b/apps/files_sharing/tests/Controller/ShareAPIControllerTest.php
index f28302b4ccd..36ac04714b7 100644
--- a/apps/files_sharing/tests/Controller/ShareAPIControllerTest.php
+++ b/apps/files_sharing/tests/Controller/ShareAPIControllerTest.php
@@ -16,7 +16,7 @@ use OCP\Files\Folder;
use OCP\Files\IRootFolder;
use OCP\Files\Mount\IMountPoint;
use OCP\Files\NotFoundException;
-use OCP\Files\Storage;
+use OCP\Files\Storage\IStorage;
use OCP\IConfig;
use OCP\IDateTimeZone;
use OCP\IGroup;
@@ -526,7 +526,7 @@ class ShareAPIControllerTest extends TestCase {
->getMock();
$cache->method('getNumericStorageId')->willReturn(101);
- $storage = $this->getMockBuilder(Storage::class)
+ $storage = $this->getMockBuilder(IStorage::class)
->disableOriginalConstructor()
->getMock();
$storage->method('getId')->willReturn('STORAGE');
@@ -1923,7 +1923,7 @@ class ShareAPIControllerTest extends TestCase {
$path = $this->getMockBuilder(Folder::class)->getMock();
$path->method('getId')->willReturn(42);
- $storage = $this->createMock(Storage::class);
+ $storage = $this->createMock(IStorage::class);
$storage->method('instanceOfStorage')
->willReturnMap([
['OCA\Files_Sharing\External\Storage', false],
@@ -1947,7 +1947,7 @@ class ShareAPIControllerTest extends TestCase {
$path = $this->getMockBuilder(Folder::class)->getMock();
$path->method('getId')->willReturn(42);
- $storage = $this->createMock(Storage::class);
+ $storage = $this->createMock(IStorage::class);
$storage->method('instanceOfStorage')
->willReturnMap([
['OCA\Files_Sharing\External\Storage', false],
@@ -1972,7 +1972,7 @@ class ShareAPIControllerTest extends TestCase {
$path = $this->getMockBuilder(File::class)->getMock();
$path->method('getId')->willReturn(42);
- $storage = $this->createMock(Storage::class);
+ $storage = $this->createMock(IStorage::class);
$storage->method('instanceOfStorage')
->willReturnMap([
['OCA\Files_Sharing\External\Storage', false],
@@ -1996,7 +1996,7 @@ class ShareAPIControllerTest extends TestCase {
$path = $this->getMockBuilder(Folder::class)->getMock();
$path->method('getId')->willReturn(1);
- $storage = $this->createMock(Storage::class);
+ $storage = $this->createMock(IStorage::class);
$storage->method('instanceOfStorage')
->willReturnMap([
['OCA\Files_Sharing\External\Storage', false],
@@ -2035,7 +2035,7 @@ class ShareAPIControllerTest extends TestCase {
$path = $this->getMockBuilder(Folder::class)->getMock();
$path->method('getId')->willReturn(42);
- $storage = $this->createMock(Storage::class);
+ $storage = $this->createMock(IStorage::class);
$storage->method('instanceOfStorage')
->willReturnMap([
['OCA\Files_Sharing\External\Storage', false],
@@ -2074,7 +2074,7 @@ class ShareAPIControllerTest extends TestCase {
$path = $this->getMockBuilder(Folder::class)->getMock();
$path->method('getId')->willReturn(42);
- $storage = $this->createMock(Storage::class);
+ $storage = $this->createMock(IStorage::class);
$storage->method('instanceOfStorage')
->willReturnMap([
['OCA\Files_Sharing\External\Storage', false],
@@ -2120,7 +2120,7 @@ class ShareAPIControllerTest extends TestCase {
$path = $this->getMockBuilder(Folder::class)->getMock();
$path->method('getId')->willReturn(42);
- $storage = $this->createMock(Storage::class);
+ $storage = $this->createMock(IStorage::class);
$storage->method('instanceOfStorage')
->willReturnMap([
['OCA\Files_Sharing\External\Storage', false],
@@ -2159,7 +2159,7 @@ class ShareAPIControllerTest extends TestCase {
$path = $this->getMockBuilder(Folder::class)->getMock();
$path->method('getId')->willReturn(42);
- $storage = $this->createMock(Storage::class);
+ $storage = $this->createMock(IStorage::class);
$storage->method('instanceOfStorage')
->willReturnMap([
['OCA\Files_Sharing\External\Storage', false],
@@ -2205,7 +2205,7 @@ class ShareAPIControllerTest extends TestCase {
$path = $this->getMockBuilder(Folder::class)->getMock();
$path->method('getId')->willReturn(42);
- $storage = $this->createMock(Storage::class);
+ $storage = $this->createMock(IStorage::class);
$storage->method('instanceOfStorage')
->willReturnMap([
['OCA\Files_Sharing\External\Storage', false],
@@ -2574,7 +2574,7 @@ class ShareAPIControllerTest extends TestCase {
$path = $this->getMockBuilder(Folder::class)->getMock();
$path->method('getId')->willReturn(42);
- $storage = $this->createMock(Storage::class);
+ $storage = $this->createMock(IStorage::class);
$storage->method('instanceOfStorage')
->willReturnMap([
['OCA\Files_Sharing\External\Storage', true],
@@ -3762,7 +3762,7 @@ class ShareAPIControllerTest extends TestCase {
$cache = $this->getMockBuilder('OCP\Files\Cache\ICache')->getMock();
$cache->method('getNumericStorageId')->willReturn(100);
- $storage = $this->createMock(Storage::class);
+ $storage = $this->createMock(IStorage::class);
$storage->method('getId')->willReturn('storageId');
$storage->method('getCache')->willReturn($cache);
@@ -4759,7 +4759,7 @@ class ShareAPIControllerTest extends TestCase {
$cache = $this->getMockBuilder('OCP\Files\Cache\ICache')->getMock();
$cache->method('getNumericStorageId')->willReturn(100);
- $storage = $this->createMock(Storage::class);
+ $storage = $this->createMock(IStorage::class);
$storage->method('getId')->willReturn('storageId');
$storage->method('getCache')->willReturn($cache);
@@ -4923,7 +4923,7 @@ class ShareAPIControllerTest extends TestCase {
private function getNonSharedUserFolder(): array {
$node = $this->getMockBuilder(Folder::class)->getMock();
$userFolder = $this->getMockBuilder(Folder::class)->getMock();
- $storage = $this->createMock(Storage::class);
+ $storage = $this->createMock(IStorage::class);
$storage->method('instanceOfStorage')
->willReturnMap([
['OCA\Files_Sharing\External\Storage', false],
@@ -4938,7 +4938,7 @@ class ShareAPIControllerTest extends TestCase {
private function getNonSharedUserFile(): array {
$node = $this->getMockBuilder(File::class)->getMock();
$userFolder = $this->getMockBuilder(Folder::class)->getMock();
- $storage = $this->createMock(Storage::class);
+ $storage = $this->createMock(IStorage::class);
$storage->method('instanceOfStorage')
->willReturnMap([
['OCA\Files_Sharing\External\Storage', false],
diff --git a/apps/files_sharing/tests/SharedStorageTest.php b/apps/files_sharing/tests/SharedStorageTest.php
index 5f907ad8de3..49ff97c053a 100644
--- a/apps/files_sharing/tests/SharedStorageTest.php
+++ b/apps/files_sharing/tests/SharedStorageTest.php
@@ -416,9 +416,6 @@ class SharedStorageTest extends TestCase {
$view = new \OC\Files\View('/' . self::TEST_FILES_SHARING_API_USER2 . '/files');
$this->assertTrue($view->file_exists($this->folder));
- /**
- * @var \OCP\Files\Storage $sharedStorage
- */
[$sharedStorage,] = $view->resolvePath($this->folder);
$this->assertTrue($sharedStorage->instanceOfStorage('OCA\Files_Sharing\ISharedStorage'));
@@ -449,9 +446,6 @@ class SharedStorageTest extends TestCase {
$view = new \OC\Files\View('/' . self::TEST_FILES_SHARING_API_USER2 . '/files');
$this->assertTrue($view->file_exists($this->folder));
- /**
- * @var \OCP\Files\Storage $sharedStorage
- */
[$sharedStorage,] = $view->resolvePath($this->folder);
$this->assertTrue($sharedStorage->instanceOfStorage('OCA\Files_Sharing\ISharedStorage'));
diff --git a/apps/files_trashbin/lib/Trashbin.php b/apps/files_trashbin/lib/Trashbin.php
index c9863241045..544bc877d70 100644
--- a/apps/files_trashbin/lib/Trashbin.php
+++ b/apps/files_trashbin/lib/Trashbin.php
@@ -29,6 +29,7 @@ use OCP\Files\IRootFolder;
use OCP\Files\Node;
use OCP\Files\NotFoundException;
use OCP\Files\NotPermittedException;
+use OCP\Files\Storage\ILockingStorage;
use OCP\FilesMetadata\IFilesMetadataManager;
use OCP\IConfig;
use OCP\IDBConnection;
@@ -118,7 +119,7 @@ class Trashbin {
* @param string $user
* @param string $filename
* @param string $timestamp
- * @return string original location
+ * @return string|false original location
*/
public static function getLocation($user, $filename, $timestamp) {
$query = \OC::$server->getDatabaseConnection()->getQueryBuilder();
@@ -139,7 +140,8 @@ class Trashbin {
}
}
- private static function setUpTrash($user) {
+ /** @param string $user */
+ private static function setUpTrash($user): void {
$view = new View('/' . $user);
if (!$view->is_dir('files_trashbin')) {
$view->mkdir('files_trashbin');
@@ -162,10 +164,10 @@ class Trashbin {
* @param string $sourcePath
* @param string $owner
* @param string $targetPath
- * @param $user
+ * @param string $user
* @param int $timestamp
*/
- private static function copyFilesToUser($sourcePath, $owner, $targetPath, $user, $timestamp) {
+ private static function copyFilesToUser($sourcePath, $owner, $targetPath, $user, $timestamp): void {
self::setUpTrash($owner);
$targetFilename = basename($targetPath);
@@ -256,7 +258,7 @@ class Trashbin {
while (!$gotLock) {
try {
- /** @var \OC\Files\Storage\Storage $trashStorage */
+ /** @var ILockingStorage $trashStorage */
[$trashStorage, $trashInternalPath] = $ownerView->resolvePath($trashPath);
$trashStorage->acquireLock($trashInternalPath, ILockingProvider::LOCK_EXCLUSIVE, $lockingProvider);
diff --git a/apps/files_versions/lib/Versions/LegacyVersionsBackend.php b/apps/files_versions/lib/Versions/LegacyVersionsBackend.php
index fc37ecead95..bc46da85752 100644
--- a/apps/files_versions/lib/Versions/LegacyVersionsBackend.php
+++ b/apps/files_versions/lib/Versions/LegacyVersionsBackend.php
@@ -49,6 +49,10 @@ class LegacyVersionsBackend implements IVersionBackend, IDeletableVersionBackend
if ($storage->instanceOfStorage(ISharedStorage::class)) {
$owner = $storage->getOwner('');
+ if ($owner === false) {
+ throw new NotFoundException('No owner for ' . $file->getPath());
+ }
+
$user = $this->userManager->get($owner);
$fileId = $file->getId();
diff --git a/apps/oauth2/l10n/sr.js b/apps/oauth2/l10n/sr.js
index b0de2662833..a626c9e7f15 100644
--- a/apps/oauth2/l10n/sr.js
+++ b/apps/oauth2/l10n/sr.js
@@ -13,6 +13,7 @@ OC.L10N.register(
"Client Identifier" : "Идентификација клијента",
"Secret key" : "Тајни кључ ",
"Delete client" : "Обриши клијента",
+ "Make sure you store the secret key, it cannot be recovered." : "Сачувајте тајни кључ, нећете моћи поново да му приступите.",
"Add client" : "Додај клијента",
"Add" : "Додај",
"Delete" : "Обриши",
diff --git a/apps/oauth2/l10n/sr.json b/apps/oauth2/l10n/sr.json
index 8cc3b0b6793..08211bfdf2b 100644
--- a/apps/oauth2/l10n/sr.json
+++ b/apps/oauth2/l10n/sr.json
@@ -11,6 +11,7 @@
"Client Identifier" : "Идентификација клијента",
"Secret key" : "Тајни кључ ",
"Delete client" : "Обриши клијента",
+ "Make sure you store the secret key, it cannot be recovered." : "Сачувајте тајни кључ, нећете моћи поново да му приступите.",
"Add client" : "Додај клијента",
"Add" : "Додај",
"Delete" : "Обриши",
diff --git a/apps/settings/composer/composer/autoload_classmap.php b/apps/settings/composer/composer/autoload_classmap.php
index 7a3618ecb51..1b3c4c25552 100644
--- a/apps/settings/composer/composer/autoload_classmap.php
+++ b/apps/settings/composer/composer/autoload_classmap.php
@@ -82,7 +82,6 @@ return array(
'OCA\\Settings\\SetupChecks\\AllowedAdminRanges' => $baseDir . '/../lib/SetupChecks/AllowedAdminRanges.php',
'OCA\\Settings\\SetupChecks\\AppDirsWithDifferentOwner' => $baseDir . '/../lib/SetupChecks/AppDirsWithDifferentOwner.php',
'OCA\\Settings\\SetupChecks\\BruteForceThrottler' => $baseDir . '/../lib/SetupChecks/BruteForceThrottler.php',
- 'OCA\\Settings\\SetupChecks\\CheckServerResponseTrait' => $baseDir . '/../lib/SetupChecks/CheckServerResponseTrait.php',
'OCA\\Settings\\SetupChecks\\CheckUserCertificates' => $baseDir . '/../lib/SetupChecks/CheckUserCertificates.php',
'OCA\\Settings\\SetupChecks\\CodeIntegrity' => $baseDir . '/../lib/SetupChecks/CodeIntegrity.php',
'OCA\\Settings\\SetupChecks\\CronErrors' => $baseDir . '/../lib/SetupChecks/CronErrors.php',
diff --git a/apps/settings/composer/composer/autoload_static.php b/apps/settings/composer/composer/autoload_static.php
index 18882ed9fc2..5de0bb31fd6 100644
--- a/apps/settings/composer/composer/autoload_static.php
+++ b/apps/settings/composer/composer/autoload_static.php
@@ -97,7 +97,6 @@ class ComposerStaticInitSettings
'OCA\\Settings\\SetupChecks\\AllowedAdminRanges' => __DIR__ . '/..' . '/../lib/SetupChecks/AllowedAdminRanges.php',
'OCA\\Settings\\SetupChecks\\AppDirsWithDifferentOwner' => __DIR__ . '/..' . '/../lib/SetupChecks/AppDirsWithDifferentOwner.php',
'OCA\\Settings\\SetupChecks\\BruteForceThrottler' => __DIR__ . '/..' . '/../lib/SetupChecks/BruteForceThrottler.php',
- 'OCA\\Settings\\SetupChecks\\CheckServerResponseTrait' => __DIR__ . '/..' . '/../lib/SetupChecks/CheckServerResponseTrait.php',
'OCA\\Settings\\SetupChecks\\CheckUserCertificates' => __DIR__ . '/..' . '/../lib/SetupChecks/CheckUserCertificates.php',
'OCA\\Settings\\SetupChecks\\CodeIntegrity' => __DIR__ . '/..' . '/../lib/SetupChecks/CodeIntegrity.php',
'OCA\\Settings\\SetupChecks\\CronErrors' => __DIR__ . '/..' . '/../lib/SetupChecks/CronErrors.php',
diff --git a/apps/settings/l10n/ar.js b/apps/settings/l10n/ar.js
index af16dd8d311..06b5abe2cb8 100644
--- a/apps/settings/l10n/ar.js
+++ b/apps/settings/l10n/ar.js
@@ -137,7 +137,6 @@ OC.L10N.register(
"Your remote address could not be determined." : "تعذّر تحديد عنوانك البعيد.",
"Your remote address was identified as \"%s\" and is brute-force throttled at the moment slowing down the performance of various requests. If the remote address is not your address this can be an indication that a proxy is not configured correctly." : "تم التعرُّف على عنوانك البعيد على أنه \"%s\" و يتم تقييده حاليّاً ضمن إجراءات مكافحة هجمات القوة الكاسحة؛ مما يؤدي إلى إبطاء أداء الطلبات المختلفة. إذا لم يكن العنوان البعيد هو عنوانك، فقد يكون ذلك إشارة إلى أنه لم يتم تكوين الوكيل بشكل صحيح.",
"Your remote address \"%s\" is not brute-force throttled." : "عنوانك البعيد \"%s\" لم يتم تقييده ضمن إجراءات مكافحة هجمات القوة الكاسحة brute-force throttled.",
- "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "للسماح بتشغيل هذا الفحص، عليك التأكد من أن خادوم الويب خاصّتك يمكنه الاتصال بنفسه. لذلك، يجب أن يكون قادراً على حل المشكلة والاتصال بواحد على الأقل من \"النطاقات_الموثوقة\" أو \"overwrite.cli.url\". قد يكون هذا الفشل نتيجة لعدم تطابق DNS من جانب الخادوم أو قاعدة صادرة لجدار الحماية.",
"Old administration imported certificates" : "شهادات مستوردة من قِيل الإدارة القديمة",
"A background job is pending that checks for administration imported SSL certificates. Please check back later." : "هناك مهمة في الخلفية معلقة تقوم بالتحقق من شهادات SSL المستوردة من قبل الإدارة. يرجى التحقق مرة أخرى في وقت لاحق.",
"There are some administration imported SSL certificates present, that are not used anymore with Nextcloud 21. They can be imported on the command line via \"occ security:certificates:import\" command. Their paths inside the data directory are shown below." : "توجد بعض شهادات SSL المستوردة من الإدارة، والتي لم تعد تُستخدم مع نكست كلاود 21. و يمكن استيرادها عبر الأمر السطري: \n\"occ Security:certificates:import\". مساراتها في دليل البيانات معروضة أدناه.",
@@ -314,9 +313,6 @@ OC.L10N.register(
"Could not check that your web server serves `.well-known` correctly. Please check manually." : "تعذّر التحقّق من أن خادوم الوب عندك \"معروف\" `.well-known` بالشكل الصحيح. لذا، ستحتاج إلى التحقق منه يدوياً. ",
"Your web server is not properly set up to resolve `.well-known` URLs, failed on:\n`%s`" : "خادوم الوب عندك لم يتم إعداده بالشكل الصحيح لتحليل العناوين \"المعروفة\" `.well-known`. الإخفاق في: \n`%s`",
"Your server is correctly configured to serve `.well-known` URLs." : "خادومك تم إعداده بالشكل الصحيح للتعرف على عناوين URL \"المعروفة\" `.well-known` .",
- "WOFF2 file loading" : "تحميل ملف WOFF2 ",
- "Could not check for WOFF2 loading support. Please check manually if your webserver serves `.woff2` files." : "يتعذّر التأكد من دعم تحميل WOFF2. لذا يُرجى التأكد يدويّاً مما إذا كان خادوم الوب عندك يخدم الملفات `.woff2` .",
- "Your web server is not properly set up to deliver .woff2 files. This is typically an issue with the Nginx configuration. For Nextcloud 15 it needs an adjustement to also deliver .woff2 files. Compare your Nginx configuration to the recommended configuration in our documentation." : "لم يتم إعداد خادوم الويب عندك بشكل صحيح لتسليم ملفات .woff2. عادةً ما تكون هذه مشكلة في تكوين Nginx. بالنسبة إلى الإصدار 15 من نكست كلاود، فإنه يحتاج إلى ضبط لتسليم ملفات .woff2 أيضًا. قارن إعدادات Nginx بالإعدادات الموصى بها في وثائقنا.",
"Profile information" : "معلومات الملف الشخصي",
"Profile picture, full name, email, phone number, address, website, Twitter, organisation, role, headline, biography, and whether your profile is enabled" : "صورة الملف الشخصي، و الاسم الكامل، و الإيميل، و رقم الهاتف، و صفحة الوب، و حساب تويتر، و المؤسسة، و الوظيفة، و الترويسة، و السيرة الذاتية، و هل أن ملفك الشخصي مُفعّل",
"Nextcloud settings" : "إعدادات نكست كلاود",
@@ -881,6 +877,7 @@ OC.L10N.register(
"SMTP Username" : "اسم مستخدم الـ SMTP",
"To allow this check to run you have to make sure that your webserver can connect to itself. Therefor it must be able to resolve and connect to at least one its `trusted_domains` or the `overwrite.cli.url`." : "للسماح بتشغيل هذا الفحص، عليك التأكد من أن خادوم الويب عندك يمكنه الاتصال بنفسه. ولذلك، يجب أن يكون قادراً على حل المشكلة والاتصال بنطاق واحد على الأقل من \"النطاقات_الموثوقة\" أو 'overwrite.cli.url'.",
"Could not check for JavaScript support via any of your `trusted_domains` nor `overwrite.cli.url`. This may be the result of a server-side DNS mismatch or outbound firewall rule. Please check manually if your webserver serves `.mjs` files using the JavaScript MIME type." : "تعذر التحقُّق من دعم JavaScript عبر أيٍّ من \"النطاقات_الموثوقة\" أو \"overwrite.cli.url\". قد يكون هذا نتيجة عدم تطابق DNS من جانب الخادوم أو بسبب إحدى سياسات إدارة الحركة الصادرة في جدار الحماية. يرجى التحقق يدويًا مما إذا كان خادوم الويب عندك يقدم ملفات `.mjs` باستخدام نوع JavaScript MIME.",
- "Active accounts" : "حسابات نشطة"
+ "Active accounts" : "حسابات نشطة",
+ "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "للسماح بتشغيل هذا الفحص، عليك التأكد من أن خادوم الويب خاصّتك يمكنه الاتصال بنفسه. لذلك، يجب أن يكون قادراً على حل المشكلة والاتصال بواحد على الأقل من \"النطاقات_الموثوقة\" أو \"overwrite.cli.url\". قد يكون هذا الفشل نتيجة لعدم تطابق DNS من جانب الخادوم أو قاعدة صادرة لجدار الحماية."
},
"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/settings/l10n/ar.json b/apps/settings/l10n/ar.json
index 1028c3aec17..20ec97cc92e 100644
--- a/apps/settings/l10n/ar.json
+++ b/apps/settings/l10n/ar.json
@@ -135,7 +135,6 @@
"Your remote address could not be determined." : "تعذّر تحديد عنوانك البعيد.",
"Your remote address was identified as \"%s\" and is brute-force throttled at the moment slowing down the performance of various requests. If the remote address is not your address this can be an indication that a proxy is not configured correctly." : "تم التعرُّف على عنوانك البعيد على أنه \"%s\" و يتم تقييده حاليّاً ضمن إجراءات مكافحة هجمات القوة الكاسحة؛ مما يؤدي إلى إبطاء أداء الطلبات المختلفة. إذا لم يكن العنوان البعيد هو عنوانك، فقد يكون ذلك إشارة إلى أنه لم يتم تكوين الوكيل بشكل صحيح.",
"Your remote address \"%s\" is not brute-force throttled." : "عنوانك البعيد \"%s\" لم يتم تقييده ضمن إجراءات مكافحة هجمات القوة الكاسحة brute-force throttled.",
- "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "للسماح بتشغيل هذا الفحص، عليك التأكد من أن خادوم الويب خاصّتك يمكنه الاتصال بنفسه. لذلك، يجب أن يكون قادراً على حل المشكلة والاتصال بواحد على الأقل من \"النطاقات_الموثوقة\" أو \"overwrite.cli.url\". قد يكون هذا الفشل نتيجة لعدم تطابق DNS من جانب الخادوم أو قاعدة صادرة لجدار الحماية.",
"Old administration imported certificates" : "شهادات مستوردة من قِيل الإدارة القديمة",
"A background job is pending that checks for administration imported SSL certificates. Please check back later." : "هناك مهمة في الخلفية معلقة تقوم بالتحقق من شهادات SSL المستوردة من قبل الإدارة. يرجى التحقق مرة أخرى في وقت لاحق.",
"There are some administration imported SSL certificates present, that are not used anymore with Nextcloud 21. They can be imported on the command line via \"occ security:certificates:import\" command. Their paths inside the data directory are shown below." : "توجد بعض شهادات SSL المستوردة من الإدارة، والتي لم تعد تُستخدم مع نكست كلاود 21. و يمكن استيرادها عبر الأمر السطري: \n\"occ Security:certificates:import\". مساراتها في دليل البيانات معروضة أدناه.",
@@ -312,9 +311,6 @@
"Could not check that your web server serves `.well-known` correctly. Please check manually." : "تعذّر التحقّق من أن خادوم الوب عندك \"معروف\" `.well-known` بالشكل الصحيح. لذا، ستحتاج إلى التحقق منه يدوياً. ",
"Your web server is not properly set up to resolve `.well-known` URLs, failed on:\n`%s`" : "خادوم الوب عندك لم يتم إعداده بالشكل الصحيح لتحليل العناوين \"المعروفة\" `.well-known`. الإخفاق في: \n`%s`",
"Your server is correctly configured to serve `.well-known` URLs." : "خادومك تم إعداده بالشكل الصحيح للتعرف على عناوين URL \"المعروفة\" `.well-known` .",
- "WOFF2 file loading" : "تحميل ملف WOFF2 ",
- "Could not check for WOFF2 loading support. Please check manually if your webserver serves `.woff2` files." : "يتعذّر التأكد من دعم تحميل WOFF2. لذا يُرجى التأكد يدويّاً مما إذا كان خادوم الوب عندك يخدم الملفات `.woff2` .",
- "Your web server is not properly set up to deliver .woff2 files. This is typically an issue with the Nginx configuration. For Nextcloud 15 it needs an adjustement to also deliver .woff2 files. Compare your Nginx configuration to the recommended configuration in our documentation." : "لم يتم إعداد خادوم الويب عندك بشكل صحيح لتسليم ملفات .woff2. عادةً ما تكون هذه مشكلة في تكوين Nginx. بالنسبة إلى الإصدار 15 من نكست كلاود، فإنه يحتاج إلى ضبط لتسليم ملفات .woff2 أيضًا. قارن إعدادات Nginx بالإعدادات الموصى بها في وثائقنا.",
"Profile information" : "معلومات الملف الشخصي",
"Profile picture, full name, email, phone number, address, website, Twitter, organisation, role, headline, biography, and whether your profile is enabled" : "صورة الملف الشخصي، و الاسم الكامل، و الإيميل، و رقم الهاتف، و صفحة الوب، و حساب تويتر، و المؤسسة، و الوظيفة، و الترويسة، و السيرة الذاتية، و هل أن ملفك الشخصي مُفعّل",
"Nextcloud settings" : "إعدادات نكست كلاود",
@@ -879,6 +875,7 @@
"SMTP Username" : "اسم مستخدم الـ SMTP",
"To allow this check to run you have to make sure that your webserver can connect to itself. Therefor it must be able to resolve and connect to at least one its `trusted_domains` or the `overwrite.cli.url`." : "للسماح بتشغيل هذا الفحص، عليك التأكد من أن خادوم الويب عندك يمكنه الاتصال بنفسه. ولذلك، يجب أن يكون قادراً على حل المشكلة والاتصال بنطاق واحد على الأقل من \"النطاقات_الموثوقة\" أو 'overwrite.cli.url'.",
"Could not check for JavaScript support via any of your `trusted_domains` nor `overwrite.cli.url`. This may be the result of a server-side DNS mismatch or outbound firewall rule. Please check manually if your webserver serves `.mjs` files using the JavaScript MIME type." : "تعذر التحقُّق من دعم JavaScript عبر أيٍّ من \"النطاقات_الموثوقة\" أو \"overwrite.cli.url\". قد يكون هذا نتيجة عدم تطابق DNS من جانب الخادوم أو بسبب إحدى سياسات إدارة الحركة الصادرة في جدار الحماية. يرجى التحقق يدويًا مما إذا كان خادوم الويب عندك يقدم ملفات `.mjs` باستخدام نوع JavaScript MIME.",
- "Active accounts" : "حسابات نشطة"
+ "Active accounts" : "حسابات نشطة",
+ "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "للسماح بتشغيل هذا الفحص، عليك التأكد من أن خادوم الويب خاصّتك يمكنه الاتصال بنفسه. لذلك، يجب أن يكون قادراً على حل المشكلة والاتصال بواحد على الأقل من \"النطاقات_الموثوقة\" أو \"overwrite.cli.url\". قد يكون هذا الفشل نتيجة لعدم تطابق DNS من جانب الخادوم أو قاعدة صادرة لجدار الحماية."
},"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/settings/l10n/ast.js b/apps/settings/l10n/ast.js
index 120934efa1b..df8f6c56326 100644
--- a/apps/settings/l10n/ast.js
+++ b/apps/settings/l10n/ast.js
@@ -204,8 +204,6 @@ OC.L10N.register(
"64-bit" : "64 bits",
"Temporary space available" : "Espaciu temporal disponible",
"Your database does not run with \"READ COMMITTED\" transaction isolation level. This can cause problems when multiple actions are executed in parallel." : "La base de datos nun s'executa col nivel d'aislamientu de transaiciones «READ COMMITTED». Esta transaición pue causar problemes cuando s'executen múltiples aiciones en paralelo.",
- "WOFF2 file loading" : "Carga de ficheros WOFF2",
- "Could not check for WOFF2 loading support. Please check manually if your webserver serves `.woff2` files." : "Nun se pudo comprobar la comptibilidá cola carga de ficheros WOFF2. Comprueba manualmente si'l sirvidor web sirve ficheros «.woff2».",
"Profile information" : "Información del perfil",
"Nextcloud settings" : "Configuración de Nextcloud",
"Task:" : "Xera:",
diff --git a/apps/settings/l10n/ast.json b/apps/settings/l10n/ast.json
index bb9e0060c5e..ce76cef842b 100644
--- a/apps/settings/l10n/ast.json
+++ b/apps/settings/l10n/ast.json
@@ -202,8 +202,6 @@
"64-bit" : "64 bits",
"Temporary space available" : "Espaciu temporal disponible",
"Your database does not run with \"READ COMMITTED\" transaction isolation level. This can cause problems when multiple actions are executed in parallel." : "La base de datos nun s'executa col nivel d'aislamientu de transaiciones «READ COMMITTED». Esta transaición pue causar problemes cuando s'executen múltiples aiciones en paralelo.",
- "WOFF2 file loading" : "Carga de ficheros WOFF2",
- "Could not check for WOFF2 loading support. Please check manually if your webserver serves `.woff2` files." : "Nun se pudo comprobar la comptibilidá cola carga de ficheros WOFF2. Comprueba manualmente si'l sirvidor web sirve ficheros «.woff2».",
"Profile information" : "Información del perfil",
"Nextcloud settings" : "Configuración de Nextcloud",
"Task:" : "Xera:",
diff --git a/apps/settings/l10n/cs.js b/apps/settings/l10n/cs.js
index f3433d18ab4..21cf5f57ce1 100644
--- a/apps/settings/l10n/cs.js
+++ b/apps/settings/l10n/cs.js
@@ -261,7 +261,6 @@ OC.L10N.register(
"Your database does not run with \"READ COMMITTED\" transaction isolation level. This can cause problems when multiple actions are executed in parallel." : "Vaše databáze není spuštěná s úrovní izolace transakcí „READ COMMITTED“. Toto může způsobit problémy při paralelním spouštění více akcí současně.",
"Was not able to get transaction isolation level: %s" : "Nebylo možné získat stupeň izolace databázových transakcí: %s",
"Your web server is not properly set up to resolve `.well-known` URLs, failed on:\n`%s`" : "Tento webový server není správně nastaven pro překlad \"well-known\" URL adres. Chybující URL je \"%s\".",
- "WOFF2 file loading" : "Načítání WOFF2 souboru",
"Profile information" : "Informace o profilu",
"Profile picture, full name, email, phone number, address, website, Twitter, organisation, role, headline, biography, and whether your profile is enabled" : "Profilový obrázek, celé jméno, e-mailová adresa, telefonní číslo, adresa, webové stránky, Twitter, organizace, role, úvod, životopis a to, zda je profil zapnutý",
"Nextcloud settings" : "Nastavení Nextcloud",
diff --git a/apps/settings/l10n/cs.json b/apps/settings/l10n/cs.json
index a12b8028438..8af68386b82 100644
--- a/apps/settings/l10n/cs.json
+++ b/apps/settings/l10n/cs.json
@@ -259,7 +259,6 @@
"Your database does not run with \"READ COMMITTED\" transaction isolation level. This can cause problems when multiple actions are executed in parallel." : "Vaše databáze není spuštěná s úrovní izolace transakcí „READ COMMITTED“. Toto může způsobit problémy při paralelním spouštění více akcí současně.",
"Was not able to get transaction isolation level: %s" : "Nebylo možné získat stupeň izolace databázových transakcí: %s",
"Your web server is not properly set up to resolve `.well-known` URLs, failed on:\n`%s`" : "Tento webový server není správně nastaven pro překlad \"well-known\" URL adres. Chybující URL je \"%s\".",
- "WOFF2 file loading" : "Načítání WOFF2 souboru",
"Profile information" : "Informace o profilu",
"Profile picture, full name, email, phone number, address, website, Twitter, organisation, role, headline, biography, and whether your profile is enabled" : "Profilový obrázek, celé jméno, e-mailová adresa, telefonní číslo, adresa, webové stránky, Twitter, organizace, role, úvod, životopis a to, zda je profil zapnutý",
"Nextcloud settings" : "Nastavení Nextcloud",
diff --git a/apps/settings/l10n/da.js b/apps/settings/l10n/da.js
index 7de96de69ef..4e7755519c4 100644
--- a/apps/settings/l10n/da.js
+++ b/apps/settings/l10n/da.js
@@ -137,7 +137,6 @@ OC.L10N.register(
"Your remote address could not be determined." : "Din fjern-adresse kunne ikke bestemmes.",
"Your remote address was identified as \"%s\" and is brute-force throttled at the moment slowing down the performance of various requests. If the remote address is not your address this can be an indication that a proxy is not configured correctly." : "Din fjern-adresse blev bestemt som \"%s\" og bliver brute-force droslet på nuværende tidspunkt, hvilket nedsætter hastigheden af forskellige forespørgsler. Hvis fjern-adressen ikke er din adresse, så kan dette være en indikation af at en proxy ikke er konfigureret korrekt.",
"Your remote address \"%s\" is not brute-force throttled." : "Din fjern-adresse \"%s\" er ikke brute-force droslet.",
- "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "For at tillade at denne kontrol køres så skal du sikre dig at din webserver kan forbinde til sig selv. Derfor skal den kunne opløse og forbinde til mindst en af dets `trusted_domains` eller `overwrite.cli.url`. Denne fejl kan være resultatet af en server-side DNS mismatch eller udadgående firewall regel.",
"Old administration imported certificates" : "Gamle administrations importerede certifikater",
"A background job is pending that checks for administration imported SSL certificates. Please check back later." : "Et baggrundsjob afventer, som kontrollerer for administrations importerede SSL certifikater. Vend venligst tilbage senere.",
"There are some administration imported SSL certificates present, that are not used anymore with Nextcloud 21. They can be imported on the command line via \"occ security:certificates:import\" command. Their paths inside the data directory are shown below." : "Der er nogle administrations importerede SSL certifikater tilstede, som ikke anvendes mere i Nextcloud 21. De kan importeres via kommandolinjen via \"occ security:certificates:import\" kommandoen. Deres stier indeni datamappen vises nedenfor.",
@@ -611,6 +610,7 @@ OC.L10N.register(
"Not available as publishing user specific data to the lookup server is not allowed, contact your system administrator if you have any questions" : "Ikke tilgængelig, da udgivelse af brugerspecifikke data til opslagsserveren ikke er tilladt. Kontakt din systemadministrator, hvis du har spørgsmål",
"Show to logged in users only" : "Vis kun til loggede brugere",
"Nextcloud help resources" : "Nextcloud hjælperessourcer",
- "SMTP Username" : "SMTP Brugernavn"
+ "SMTP Username" : "SMTP Brugernavn",
+ "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "For at tillade at denne kontrol køres så skal du sikre dig at din webserver kan forbinde til sig selv. Derfor skal den kunne opløse og forbinde til mindst en af dets `trusted_domains` eller `overwrite.cli.url`. Denne fejl kan være resultatet af en server-side DNS mismatch eller udadgående firewall regel."
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/settings/l10n/da.json b/apps/settings/l10n/da.json
index f8932094319..41cbfc8a120 100644
--- a/apps/settings/l10n/da.json
+++ b/apps/settings/l10n/da.json
@@ -135,7 +135,6 @@
"Your remote address could not be determined." : "Din fjern-adresse kunne ikke bestemmes.",
"Your remote address was identified as \"%s\" and is brute-force throttled at the moment slowing down the performance of various requests. If the remote address is not your address this can be an indication that a proxy is not configured correctly." : "Din fjern-adresse blev bestemt som \"%s\" og bliver brute-force droslet på nuværende tidspunkt, hvilket nedsætter hastigheden af forskellige forespørgsler. Hvis fjern-adressen ikke er din adresse, så kan dette være en indikation af at en proxy ikke er konfigureret korrekt.",
"Your remote address \"%s\" is not brute-force throttled." : "Din fjern-adresse \"%s\" er ikke brute-force droslet.",
- "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "For at tillade at denne kontrol køres så skal du sikre dig at din webserver kan forbinde til sig selv. Derfor skal den kunne opløse og forbinde til mindst en af dets `trusted_domains` eller `overwrite.cli.url`. Denne fejl kan være resultatet af en server-side DNS mismatch eller udadgående firewall regel.",
"Old administration imported certificates" : "Gamle administrations importerede certifikater",
"A background job is pending that checks for administration imported SSL certificates. Please check back later." : "Et baggrundsjob afventer, som kontrollerer for administrations importerede SSL certifikater. Vend venligst tilbage senere.",
"There are some administration imported SSL certificates present, that are not used anymore with Nextcloud 21. They can be imported on the command line via \"occ security:certificates:import\" command. Their paths inside the data directory are shown below." : "Der er nogle administrations importerede SSL certifikater tilstede, som ikke anvendes mere i Nextcloud 21. De kan importeres via kommandolinjen via \"occ security:certificates:import\" kommandoen. Deres stier indeni datamappen vises nedenfor.",
@@ -609,6 +608,7 @@
"Not available as publishing user specific data to the lookup server is not allowed, contact your system administrator if you have any questions" : "Ikke tilgængelig, da udgivelse af brugerspecifikke data til opslagsserveren ikke er tilladt. Kontakt din systemadministrator, hvis du har spørgsmål",
"Show to logged in users only" : "Vis kun til loggede brugere",
"Nextcloud help resources" : "Nextcloud hjælperessourcer",
- "SMTP Username" : "SMTP Brugernavn"
+ "SMTP Username" : "SMTP Brugernavn",
+ "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "For at tillade at denne kontrol køres så skal du sikre dig at din webserver kan forbinde til sig selv. Derfor skal den kunne opløse og forbinde til mindst en af dets `trusted_domains` eller `overwrite.cli.url`. Denne fejl kan være resultatet af en server-side DNS mismatch eller udadgående firewall regel."
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/settings/l10n/de.js b/apps/settings/l10n/de.js
index 87eef7d9297..eb9abea75ef 100644
--- a/apps/settings/l10n/de.js
+++ b/apps/settings/l10n/de.js
@@ -137,7 +137,6 @@ OC.L10N.register(
"Your remote address could not be determined." : "Deine Remote-Adresse konnte nicht ermittelt werden.",
"Your remote address was identified as \"%s\" and is brute-force throttled at the moment slowing down the performance of various requests. If the remote address is not your address this can be an indication that a proxy is not configured correctly." : "Deine Remote-Adresse wurde als \"%s\" erkannt und wird derzeit durch die Brute-Force-Erkennung gedrosselt, was die Leistung verschiedener Anfragen verlangsamt. Wenn die Remote-Adresse nicht deine Adresse ist, kann dies ein Hinweis darauf sein, dass ein Proxy nicht richtig konfiguriert ist.",
"Your remote address \"%s\" is not brute-force throttled." : "Deine Remote-Adresse \"%s\" ist nicht durch die Brute-Force-Erkennung gedrosselt.",
- "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "Damit diese Prüfung ausgeführt werden kann, musst du sicherstellen, dass dein Webserver eine Verbindung zu sich selbst herstellen kann. Daher muss er in der Lage sein, mindestens eine seiner `trusted_domains` oder `overwrite.cli.url` aufzulösen und eine Verbindung zu ihnen herzustellen. Dieser Fehler kann das Ergebnis einer serverseitigen DNS-Nichtübereinstimmung oder einer ausgehenden Firewall-Regel sein.",
"Old administration imported certificates" : "Alte, von der Adminstration importierte Zertifikate",
"A background job is pending that checks for administration imported SSL certificates. Please check back later." : "Eine Hintergrundaufgabe, die nach, von der Adminstration importierten SSL-Zertifikaten sucht, läuft noch. Bitte später erneut versuchen.",
"There are some administration imported SSL certificates present, that are not used anymore with Nextcloud 21. They can be imported on the command line via \"occ security:certificates:import\" command. Their paths inside the data directory are shown below." : "Es sind einige, von der Administration importierte SSL-Zertifikate vorhanden, die von Nextcloud 21 nicht mehr verwendet werden. Du kannst diese über den Befehl \"occ security:certificates:import\" in der Befehlszeile importieren. Ihre Pfade innerhalb des Datenverzeichnisses werden unten angezeigt.",
@@ -314,9 +313,6 @@ OC.L10N.register(
"Could not check that your web server serves `.well-known` correctly. Please check manually." : "Es konnte nicht überprüft werden, ob dein Webserver `.well-known` korrekt bereitstellt. Bitte überprüfe dies manuell.",
"Your web server is not properly set up to resolve `.well-known` URLs, failed on:\n`%s`" : "Dein Webserver ist nicht ordnungsgemäß für die Auflösung von `.well-known`-URLs eingerichtet. Fehler bei: `%s`",
"Your server is correctly configured to serve `.well-known` URLs." : "Dein Server ist korrekt für die Bereitstellung von `.well-known`-URLs konfiguriert.",
- "WOFF2 file loading" : "WOFF2-Datei laden",
- "Could not check for WOFF2 loading support. Please check manually if your webserver serves `.woff2` files." : "Konnte die Prüfung der WOFF2-Ladeunterstützung nicht durchführen. Bitte überprüfe manuell, ob dein Webserver `.woff2`-Dateien bereitstellt.",
- "Your web server is not properly set up to deliver .woff2 files. This is typically an issue with the Nginx configuration. For Nextcloud 15 it needs an adjustement to also deliver .woff2 files. Compare your Nginx configuration to the recommended configuration in our documentation." : "Dein Web-Server ist nicht richtig eingerichtet um .woff2-Dateien auszuliefern. Dies liegt meist an der Nginx-Konfiguration. Für Nextcloud 15 wird eine Anpassung für die Auslieferung von .woff2-Dateien benötigt. Vergleiche deine Nginx-Konfiguration mit der empfohlenen Nginx-Konfiguration in unserer Dokumentation.",
"Profile information" : "Profilinformation",
"Profile picture, full name, email, phone number, address, website, Twitter, organisation, role, headline, biography, and whether your profile is enabled" : "Profilbild, vollständiger Name, E-Mail-Adresse, Telefonnummer, Adresse, Webseite, X, Organisation, Rolle, Überschrift, Biografie und ob dein Profil aktiviert ist",
"Nextcloud settings" : "Nextcloud-Einstellungen",
@@ -881,6 +877,7 @@ OC.L10N.register(
"SMTP Username" : "SMTP-Benutzername",
"To allow this check to run you have to make sure that your webserver can connect to itself. Therefor it must be able to resolve and connect to at least one its `trusted_domains` or the `overwrite.cli.url`." : "Um diese Prüfung auszuführen, musst du sicherstellen, dass dein Webserver eine Verbindung zu sich selbst herstellen kann. Dafür muss dieser in der Lage sein, sich mit mindestens einer seiner \"trusted_domains\" oder der \"overwrite.cli.url\" zu verbinden und diese aufzulösen.",
"Could not check for JavaScript support via any of your `trusted_domains` nor `overwrite.cli.url`. This may be the result of a server-side DNS mismatch or outbound firewall rule. Please check manually if your webserver serves `.mjs` files using the JavaScript MIME type." : "Es konnte weder über Ihre `trusted_domains` noch über `overwrite.cli.url` nach JavaScript-Unterstützung gesucht werden. Dies kann auf eine serverseitige DNS-Nichtübereinstimmung oder eine ausgehende Firewall-Regel zurückzuführen sein. Bitte überprüfe manuell, ob dein Webserver `.mjs`-Dateien mit dem JavaScript-MIME-Typ bereitstellt.",
- "Active accounts" : "Aktive Konten"
+ "Active accounts" : "Aktive Konten",
+ "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "Damit diese Prüfung ausgeführt werden kann, musst du sicherstellen, dass dein Webserver eine Verbindung zu sich selbst herstellen kann. Daher muss er in der Lage sein, mindestens eine seiner `trusted_domains` oder `overwrite.cli.url` aufzulösen und eine Verbindung zu ihnen herzustellen. Dieser Fehler kann das Ergebnis einer serverseitigen DNS-Nichtübereinstimmung oder einer ausgehenden Firewall-Regel sein."
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/settings/l10n/de.json b/apps/settings/l10n/de.json
index df0a11efcf3..f09fafb9a16 100644
--- a/apps/settings/l10n/de.json
+++ b/apps/settings/l10n/de.json
@@ -135,7 +135,6 @@
"Your remote address could not be determined." : "Deine Remote-Adresse konnte nicht ermittelt werden.",
"Your remote address was identified as \"%s\" and is brute-force throttled at the moment slowing down the performance of various requests. If the remote address is not your address this can be an indication that a proxy is not configured correctly." : "Deine Remote-Adresse wurde als \"%s\" erkannt und wird derzeit durch die Brute-Force-Erkennung gedrosselt, was die Leistung verschiedener Anfragen verlangsamt. Wenn die Remote-Adresse nicht deine Adresse ist, kann dies ein Hinweis darauf sein, dass ein Proxy nicht richtig konfiguriert ist.",
"Your remote address \"%s\" is not brute-force throttled." : "Deine Remote-Adresse \"%s\" ist nicht durch die Brute-Force-Erkennung gedrosselt.",
- "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "Damit diese Prüfung ausgeführt werden kann, musst du sicherstellen, dass dein Webserver eine Verbindung zu sich selbst herstellen kann. Daher muss er in der Lage sein, mindestens eine seiner `trusted_domains` oder `overwrite.cli.url` aufzulösen und eine Verbindung zu ihnen herzustellen. Dieser Fehler kann das Ergebnis einer serverseitigen DNS-Nichtübereinstimmung oder einer ausgehenden Firewall-Regel sein.",
"Old administration imported certificates" : "Alte, von der Adminstration importierte Zertifikate",
"A background job is pending that checks for administration imported SSL certificates. Please check back later." : "Eine Hintergrundaufgabe, die nach, von der Adminstration importierten SSL-Zertifikaten sucht, läuft noch. Bitte später erneut versuchen.",
"There are some administration imported SSL certificates present, that are not used anymore with Nextcloud 21. They can be imported on the command line via \"occ security:certificates:import\" command. Their paths inside the data directory are shown below." : "Es sind einige, von der Administration importierte SSL-Zertifikate vorhanden, die von Nextcloud 21 nicht mehr verwendet werden. Du kannst diese über den Befehl \"occ security:certificates:import\" in der Befehlszeile importieren. Ihre Pfade innerhalb des Datenverzeichnisses werden unten angezeigt.",
@@ -312,9 +311,6 @@
"Could not check that your web server serves `.well-known` correctly. Please check manually." : "Es konnte nicht überprüft werden, ob dein Webserver `.well-known` korrekt bereitstellt. Bitte überprüfe dies manuell.",
"Your web server is not properly set up to resolve `.well-known` URLs, failed on:\n`%s`" : "Dein Webserver ist nicht ordnungsgemäß für die Auflösung von `.well-known`-URLs eingerichtet. Fehler bei: `%s`",
"Your server is correctly configured to serve `.well-known` URLs." : "Dein Server ist korrekt für die Bereitstellung von `.well-known`-URLs konfiguriert.",
- "WOFF2 file loading" : "WOFF2-Datei laden",
- "Could not check for WOFF2 loading support. Please check manually if your webserver serves `.woff2` files." : "Konnte die Prüfung der WOFF2-Ladeunterstützung nicht durchführen. Bitte überprüfe manuell, ob dein Webserver `.woff2`-Dateien bereitstellt.",
- "Your web server is not properly set up to deliver .woff2 files. This is typically an issue with the Nginx configuration. For Nextcloud 15 it needs an adjustement to also deliver .woff2 files. Compare your Nginx configuration to the recommended configuration in our documentation." : "Dein Web-Server ist nicht richtig eingerichtet um .woff2-Dateien auszuliefern. Dies liegt meist an der Nginx-Konfiguration. Für Nextcloud 15 wird eine Anpassung für die Auslieferung von .woff2-Dateien benötigt. Vergleiche deine Nginx-Konfiguration mit der empfohlenen Nginx-Konfiguration in unserer Dokumentation.",
"Profile information" : "Profilinformation",
"Profile picture, full name, email, phone number, address, website, Twitter, organisation, role, headline, biography, and whether your profile is enabled" : "Profilbild, vollständiger Name, E-Mail-Adresse, Telefonnummer, Adresse, Webseite, X, Organisation, Rolle, Überschrift, Biografie und ob dein Profil aktiviert ist",
"Nextcloud settings" : "Nextcloud-Einstellungen",
@@ -879,6 +875,7 @@
"SMTP Username" : "SMTP-Benutzername",
"To allow this check to run you have to make sure that your webserver can connect to itself. Therefor it must be able to resolve and connect to at least one its `trusted_domains` or the `overwrite.cli.url`." : "Um diese Prüfung auszuführen, musst du sicherstellen, dass dein Webserver eine Verbindung zu sich selbst herstellen kann. Dafür muss dieser in der Lage sein, sich mit mindestens einer seiner \"trusted_domains\" oder der \"overwrite.cli.url\" zu verbinden und diese aufzulösen.",
"Could not check for JavaScript support via any of your `trusted_domains` nor `overwrite.cli.url`. This may be the result of a server-side DNS mismatch or outbound firewall rule. Please check manually if your webserver serves `.mjs` files using the JavaScript MIME type." : "Es konnte weder über Ihre `trusted_domains` noch über `overwrite.cli.url` nach JavaScript-Unterstützung gesucht werden. Dies kann auf eine serverseitige DNS-Nichtübereinstimmung oder eine ausgehende Firewall-Regel zurückzuführen sein. Bitte überprüfe manuell, ob dein Webserver `.mjs`-Dateien mit dem JavaScript-MIME-Typ bereitstellt.",
- "Active accounts" : "Aktive Konten"
+ "Active accounts" : "Aktive Konten",
+ "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "Damit diese Prüfung ausgeführt werden kann, musst du sicherstellen, dass dein Webserver eine Verbindung zu sich selbst herstellen kann. Daher muss er in der Lage sein, mindestens eine seiner `trusted_domains` oder `overwrite.cli.url` aufzulösen und eine Verbindung zu ihnen herzustellen. Dieser Fehler kann das Ergebnis einer serverseitigen DNS-Nichtübereinstimmung oder einer ausgehenden Firewall-Regel sein."
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/settings/l10n/de_DE.js b/apps/settings/l10n/de_DE.js
index c83a24bbaab..686d4a3ee22 100644
--- a/apps/settings/l10n/de_DE.js
+++ b/apps/settings/l10n/de_DE.js
@@ -137,7 +137,6 @@ OC.L10N.register(
"Your remote address could not be determined." : "Ihre Remote-Adresse konnte nicht ermittelt werden.",
"Your remote address was identified as \"%s\" and is brute-force throttled at the moment slowing down the performance of various requests. If the remote address is not your address this can be an indication that a proxy is not configured correctly." : "Ihre Remote-Adresse wurde als „%s“ erkannt und wird derzeit durch die Brute-Force-Erkennung gedrosselt, was die Leistung verschiedener Anfragen verlangsamt. Wenn die Remote-Adresse nicht Ihre Adresse ist, kann dies ein Hinweis darauf sein, dass ein Proxy nicht richtig konfiguriert ist.",
"Your remote address \"%s\" is not brute-force throttled." : "Ihre Remote-Adresse \"%s\" ist nicht durch die Brute-Force-Erkennung gedrosselt.",
- "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "Damit diese Prüfung ausgeführt werden kann, müssen Sie sicherstellen, dass Ihr Webserver eine Verbindung zu sich selbst herstellen kann. Daher muss er in der Lage sein, mindestens eine seiner `trusted_domains` oder `overwrite.cli.url` aufzulösen und eine Verbindung zu ihnen herzustellen. Dieser Fehler kann das Ergebnis einer serverseitigen DNS-Nichtübereinstimmung oder einer ausgehenden Firewall-Regel sein.",
"Old administration imported certificates" : "Alte, von der Adminstration importierte Zertifikate",
"A background job is pending that checks for administration imported SSL certificates. Please check back later." : "Eine Hintergrundaufgabe, die nach, von der Adminstration importierten SSL-Zertifikaten sucht, läuft noch. Bitte später erneut versuchen.",
"There are some administration imported SSL certificates present, that are not used anymore with Nextcloud 21. They can be imported on the command line via \"occ security:certificates:import\" command. Their paths inside the data directory are shown below." : "Es sind einige, von der Administration importierte SSL-Zertifikate vorhanden, die von Nextcloud 21 nicht mehr verwendet werden. Sie können über den Befehl \"occ security:certificates:import\" in der Befehlszeile importiert werden. Ihre Pfade innerhalb des Datenverzeichnisses werden unten angezeigt.",
@@ -314,9 +313,6 @@ OC.L10N.register(
"Could not check that your web server serves `.well-known` correctly. Please check manually." : "Es konnte nicht überprüft werden, ob Ihr Webserver `.well-known` korrekt bereitstellt. Bitte überprüfen Sie dies manuell.",
"Your web server is not properly set up to resolve `.well-known` URLs, failed on:\n`%s`" : "Ihr Webserver ist nicht ordnungsgemäß für die Auflösung von `.well-known`-URLs eingerichtet. Fehler bei: `%s`",
"Your server is correctly configured to serve `.well-known` URLs." : "Ihr Server ist korrekt für die Bereitstellung von `.well-known`-URLs konfiguriert.",
- "WOFF2 file loading" : "WOFF2-Datei laden",
- "Could not check for WOFF2 loading support. Please check manually if your webserver serves `.woff2` files." : "Konnte die Prüfung der WOFF2-Ladeunterstützung nicht durchführen. Bitte überprüfen Sie manuell, ob Ihr Webserver `.woff2`-Dateien bereitstellt.",
- "Your web server is not properly set up to deliver .woff2 files. This is typically an issue with the Nginx configuration. For Nextcloud 15 it needs an adjustement to also deliver .woff2 files. Compare your Nginx configuration to the recommended configuration in our documentation." : "Ihr Web-Server ist nicht richtig eingerichtet um .woff2-Dateien auszuliefern. Dies liegt meist an der Nginx-Konfiguration. Für Nextcloud 15 wird eine Anpassung für die Auslieferung von .woff2-Dateien benötigt. Vergleichen Sie Ihre Nginx-Konfiguration mit der empfohlenen Nginx-Konfiguration in unserer Dokumentation.",
"Profile information" : "Profilinformation",
"Profile picture, full name, email, phone number, address, website, Twitter, organisation, role, headline, biography, and whether your profile is enabled" : "Profilbild, vollständiger Name, E-Mail-Adresse, Telefonnummer, Adresse, Webseite, Twitter, Organisation, Rolle, Überschrift, Biografie und ob Ihr Profil aktiviert ist",
"Nextcloud settings" : "Nextcloud-Einstellungen",
@@ -881,6 +877,7 @@ OC.L10N.register(
"SMTP Username" : "SMTP-Kontenname",
"To allow this check to run you have to make sure that your webserver can connect to itself. Therefor it must be able to resolve and connect to at least one its `trusted_domains` or the `overwrite.cli.url`." : "Um diese Prüfung auszuführen, müssen Sie sicherstellen, dass Ihr Webserver eine Verbindung zu sich selbst herstellen kann. Dafür muss er in der Lage sein, sich mit mindestens einer seiner \"trusted_domains\" oder der \"overwrite.cli.url\" zu verbinden und diese aufzulösen.",
"Could not check for JavaScript support via any of your `trusted_domains` nor `overwrite.cli.url`. This may be the result of a server-side DNS mismatch or outbound firewall rule. Please check manually if your webserver serves `.mjs` files using the JavaScript MIME type." : "Es konnte weder über Ihre `trusted_domains` noch über `overwrite.cli.url` nach JavaScript-Unterstützung gesucht werden. Dies kann auf eine serverseitige DNS-Nichtübereinstimmung oder eine ausgehende Firewall-Regel zurückzuführen sein. Bitte überprüfen Sie manuell, ob Ihr Webserver `.mjs`-Dateien mit dem JavaScript-MIME-Typ bereitstellt.",
- "Active accounts" : "Aktive Konten"
+ "Active accounts" : "Aktive Konten",
+ "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "Damit diese Prüfung ausgeführt werden kann, müssen Sie sicherstellen, dass Ihr Webserver eine Verbindung zu sich selbst herstellen kann. Daher muss er in der Lage sein, mindestens eine seiner `trusted_domains` oder `overwrite.cli.url` aufzulösen und eine Verbindung zu ihnen herzustellen. Dieser Fehler kann das Ergebnis einer serverseitigen DNS-Nichtübereinstimmung oder einer ausgehenden Firewall-Regel sein."
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/settings/l10n/de_DE.json b/apps/settings/l10n/de_DE.json
index 0f370cb1e04..351baff3d9c 100644
--- a/apps/settings/l10n/de_DE.json
+++ b/apps/settings/l10n/de_DE.json
@@ -135,7 +135,6 @@
"Your remote address could not be determined." : "Ihre Remote-Adresse konnte nicht ermittelt werden.",
"Your remote address was identified as \"%s\" and is brute-force throttled at the moment slowing down the performance of various requests. If the remote address is not your address this can be an indication that a proxy is not configured correctly." : "Ihre Remote-Adresse wurde als „%s“ erkannt und wird derzeit durch die Brute-Force-Erkennung gedrosselt, was die Leistung verschiedener Anfragen verlangsamt. Wenn die Remote-Adresse nicht Ihre Adresse ist, kann dies ein Hinweis darauf sein, dass ein Proxy nicht richtig konfiguriert ist.",
"Your remote address \"%s\" is not brute-force throttled." : "Ihre Remote-Adresse \"%s\" ist nicht durch die Brute-Force-Erkennung gedrosselt.",
- "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "Damit diese Prüfung ausgeführt werden kann, müssen Sie sicherstellen, dass Ihr Webserver eine Verbindung zu sich selbst herstellen kann. Daher muss er in der Lage sein, mindestens eine seiner `trusted_domains` oder `overwrite.cli.url` aufzulösen und eine Verbindung zu ihnen herzustellen. Dieser Fehler kann das Ergebnis einer serverseitigen DNS-Nichtübereinstimmung oder einer ausgehenden Firewall-Regel sein.",
"Old administration imported certificates" : "Alte, von der Adminstration importierte Zertifikate",
"A background job is pending that checks for administration imported SSL certificates. Please check back later." : "Eine Hintergrundaufgabe, die nach, von der Adminstration importierten SSL-Zertifikaten sucht, läuft noch. Bitte später erneut versuchen.",
"There are some administration imported SSL certificates present, that are not used anymore with Nextcloud 21. They can be imported on the command line via \"occ security:certificates:import\" command. Their paths inside the data directory are shown below." : "Es sind einige, von der Administration importierte SSL-Zertifikate vorhanden, die von Nextcloud 21 nicht mehr verwendet werden. Sie können über den Befehl \"occ security:certificates:import\" in der Befehlszeile importiert werden. Ihre Pfade innerhalb des Datenverzeichnisses werden unten angezeigt.",
@@ -312,9 +311,6 @@
"Could not check that your web server serves `.well-known` correctly. Please check manually." : "Es konnte nicht überprüft werden, ob Ihr Webserver `.well-known` korrekt bereitstellt. Bitte überprüfen Sie dies manuell.",
"Your web server is not properly set up to resolve `.well-known` URLs, failed on:\n`%s`" : "Ihr Webserver ist nicht ordnungsgemäß für die Auflösung von `.well-known`-URLs eingerichtet. Fehler bei: `%s`",
"Your server is correctly configured to serve `.well-known` URLs." : "Ihr Server ist korrekt für die Bereitstellung von `.well-known`-URLs konfiguriert.",
- "WOFF2 file loading" : "WOFF2-Datei laden",
- "Could not check for WOFF2 loading support. Please check manually if your webserver serves `.woff2` files." : "Konnte die Prüfung der WOFF2-Ladeunterstützung nicht durchführen. Bitte überprüfen Sie manuell, ob Ihr Webserver `.woff2`-Dateien bereitstellt.",
- "Your web server is not properly set up to deliver .woff2 files. This is typically an issue with the Nginx configuration. For Nextcloud 15 it needs an adjustement to also deliver .woff2 files. Compare your Nginx configuration to the recommended configuration in our documentation." : "Ihr Web-Server ist nicht richtig eingerichtet um .woff2-Dateien auszuliefern. Dies liegt meist an der Nginx-Konfiguration. Für Nextcloud 15 wird eine Anpassung für die Auslieferung von .woff2-Dateien benötigt. Vergleichen Sie Ihre Nginx-Konfiguration mit der empfohlenen Nginx-Konfiguration in unserer Dokumentation.",
"Profile information" : "Profilinformation",
"Profile picture, full name, email, phone number, address, website, Twitter, organisation, role, headline, biography, and whether your profile is enabled" : "Profilbild, vollständiger Name, E-Mail-Adresse, Telefonnummer, Adresse, Webseite, Twitter, Organisation, Rolle, Überschrift, Biografie und ob Ihr Profil aktiviert ist",
"Nextcloud settings" : "Nextcloud-Einstellungen",
@@ -879,6 +875,7 @@
"SMTP Username" : "SMTP-Kontenname",
"To allow this check to run you have to make sure that your webserver can connect to itself. Therefor it must be able to resolve and connect to at least one its `trusted_domains` or the `overwrite.cli.url`." : "Um diese Prüfung auszuführen, müssen Sie sicherstellen, dass Ihr Webserver eine Verbindung zu sich selbst herstellen kann. Dafür muss er in der Lage sein, sich mit mindestens einer seiner \"trusted_domains\" oder der \"overwrite.cli.url\" zu verbinden und diese aufzulösen.",
"Could not check for JavaScript support via any of your `trusted_domains` nor `overwrite.cli.url`. This may be the result of a server-side DNS mismatch or outbound firewall rule. Please check manually if your webserver serves `.mjs` files using the JavaScript MIME type." : "Es konnte weder über Ihre `trusted_domains` noch über `overwrite.cli.url` nach JavaScript-Unterstützung gesucht werden. Dies kann auf eine serverseitige DNS-Nichtübereinstimmung oder eine ausgehende Firewall-Regel zurückzuführen sein. Bitte überprüfen Sie manuell, ob Ihr Webserver `.mjs`-Dateien mit dem JavaScript-MIME-Typ bereitstellt.",
- "Active accounts" : "Aktive Konten"
+ "Active accounts" : "Aktive Konten",
+ "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "Damit diese Prüfung ausgeführt werden kann, müssen Sie sicherstellen, dass Ihr Webserver eine Verbindung zu sich selbst herstellen kann. Daher muss er in der Lage sein, mindestens eine seiner `trusted_domains` oder `overwrite.cli.url` aufzulösen und eine Verbindung zu ihnen herzustellen. Dieser Fehler kann das Ergebnis einer serverseitigen DNS-Nichtübereinstimmung oder einer ausgehenden Firewall-Regel sein."
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/settings/l10n/en_GB.js b/apps/settings/l10n/en_GB.js
index 83611953a30..bc923386c5e 100644
--- a/apps/settings/l10n/en_GB.js
+++ b/apps/settings/l10n/en_GB.js
@@ -137,7 +137,6 @@ OC.L10N.register(
"Your remote address could not be determined." : "Your remote address could not be determined.",
"Your remote address was identified as \"%s\" and is brute-force throttled at the moment slowing down the performance of various requests. If the remote address is not your address this can be an indication that a proxy is not configured correctly." : "Your remote address was identified as \"%s\" and is brute-force throttled at the moment slowing down the performance of various requests. If the remote address is not your address this can be an indication that a proxy is not configured correctly.",
"Your remote address \"%s\" is not brute-force throttled." : "Your remote address \"%s\" is not brute-force throttled.",
- "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule.",
"Old administration imported certificates" : "Old administration imported certificates",
"A background job is pending that checks for administration imported SSL certificates. Please check back later." : "A background job is pending that checks for administration imported SSL certificates. Please check back later.",
"There are some administration imported SSL certificates present, that are not used anymore with Nextcloud 21. They can be imported on the command line via \"occ security:certificates:import\" command. Their paths inside the data directory are shown below." : "There are some administration imported SSL certificates present, that are not used anymore with Nextcloud 21. They can be imported on the command line via \"occ security:certificates:import\" command. Their paths inside the data directory are shown below.",
@@ -314,9 +313,6 @@ OC.L10N.register(
"Could not check that your web server serves `.well-known` correctly. Please check manually." : "Could not check that your web server serves `.well-known` correctly. Please check manually.",
"Your web server is not properly set up to resolve `.well-known` URLs, failed on:\n`%s`" : "Your web server is not properly set up to resolve `.well-known` URLs, failed on:\n`%s`",
"Your server is correctly configured to serve `.well-known` URLs." : "Your server is correctly configured to serve `.well-known` URLs.",
- "WOFF2 file loading" : "WOFF2 file loading",
- "Could not check for WOFF2 loading support. Please check manually if your webserver serves `.woff2` files." : "Could not check for WOFF2 loading support. Please check manually if your webserver serves `.woff2` files.",
- "Your web server is not properly set up to deliver .woff2 files. This is typically an issue with the Nginx configuration. For Nextcloud 15 it needs an adjustement to also deliver .woff2 files. Compare your Nginx configuration to the recommended configuration in our documentation." : "Your web server is not properly set up to deliver .woff2 files. This is typically an issue with the Nginx configuration. For Nextcloud 15 it needs an adjustement to also deliver .woff2 files. Compare your Nginx configuration to the recommended configuration in our documentation.",
"Profile information" : "Profile information",
"Profile picture, full name, email, phone number, address, website, Twitter, organisation, role, headline, biography, and whether your profile is enabled" : "Profile picture, full name, email, phone number, address, website, Twitter, organisation, role, headline, biography, and whether your profile is enabled",
"Nextcloud settings" : "Nextcloud settings",
@@ -881,6 +877,7 @@ OC.L10N.register(
"SMTP Username" : "SMTP Username",
"To allow this check to run you have to make sure that your webserver can connect to itself. Therefor it must be able to resolve and connect to at least one its `trusted_domains` or the `overwrite.cli.url`." : "To allow this check to run you have to make sure that your webserver can connect to itself. Therefor it must be able to resolve and connect to at least one its `trusted_domains` or the `overwrite.cli.url`.",
"Could not check for JavaScript support via any of your `trusted_domains` nor `overwrite.cli.url`. This may be the result of a server-side DNS mismatch or outbound firewall rule. Please check manually if your webserver serves `.mjs` files using the JavaScript MIME type." : "Could not check for JavaScript support via any of your `trusted_domains` nor `overwrite.cli.url`. This may be the result of a server-side DNS mismatch or outbound firewall rule. Please check manually if your webserver serves `.mjs` files using the JavaScript MIME type.",
- "Active accounts" : "Active accounts"
+ "Active accounts" : "Active accounts",
+ "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule."
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/settings/l10n/en_GB.json b/apps/settings/l10n/en_GB.json
index 2915d208a02..11fc7559064 100644
--- a/apps/settings/l10n/en_GB.json
+++ b/apps/settings/l10n/en_GB.json
@@ -135,7 +135,6 @@
"Your remote address could not be determined." : "Your remote address could not be determined.",
"Your remote address was identified as \"%s\" and is brute-force throttled at the moment slowing down the performance of various requests. If the remote address is not your address this can be an indication that a proxy is not configured correctly." : "Your remote address was identified as \"%s\" and is brute-force throttled at the moment slowing down the performance of various requests. If the remote address is not your address this can be an indication that a proxy is not configured correctly.",
"Your remote address \"%s\" is not brute-force throttled." : "Your remote address \"%s\" is not brute-force throttled.",
- "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule.",
"Old administration imported certificates" : "Old administration imported certificates",
"A background job is pending that checks for administration imported SSL certificates. Please check back later." : "A background job is pending that checks for administration imported SSL certificates. Please check back later.",
"There are some administration imported SSL certificates present, that are not used anymore with Nextcloud 21. They can be imported on the command line via \"occ security:certificates:import\" command. Their paths inside the data directory are shown below." : "There are some administration imported SSL certificates present, that are not used anymore with Nextcloud 21. They can be imported on the command line via \"occ security:certificates:import\" command. Their paths inside the data directory are shown below.",
@@ -312,9 +311,6 @@
"Could not check that your web server serves `.well-known` correctly. Please check manually." : "Could not check that your web server serves `.well-known` correctly. Please check manually.",
"Your web server is not properly set up to resolve `.well-known` URLs, failed on:\n`%s`" : "Your web server is not properly set up to resolve `.well-known` URLs, failed on:\n`%s`",
"Your server is correctly configured to serve `.well-known` URLs." : "Your server is correctly configured to serve `.well-known` URLs.",
- "WOFF2 file loading" : "WOFF2 file loading",
- "Could not check for WOFF2 loading support. Please check manually if your webserver serves `.woff2` files." : "Could not check for WOFF2 loading support. Please check manually if your webserver serves `.woff2` files.",
- "Your web server is not properly set up to deliver .woff2 files. This is typically an issue with the Nginx configuration. For Nextcloud 15 it needs an adjustement to also deliver .woff2 files. Compare your Nginx configuration to the recommended configuration in our documentation." : "Your web server is not properly set up to deliver .woff2 files. This is typically an issue with the Nginx configuration. For Nextcloud 15 it needs an adjustement to also deliver .woff2 files. Compare your Nginx configuration to the recommended configuration in our documentation.",
"Profile information" : "Profile information",
"Profile picture, full name, email, phone number, address, website, Twitter, organisation, role, headline, biography, and whether your profile is enabled" : "Profile picture, full name, email, phone number, address, website, Twitter, organisation, role, headline, biography, and whether your profile is enabled",
"Nextcloud settings" : "Nextcloud settings",
@@ -879,6 +875,7 @@
"SMTP Username" : "SMTP Username",
"To allow this check to run you have to make sure that your webserver can connect to itself. Therefor it must be able to resolve and connect to at least one its `trusted_domains` or the `overwrite.cli.url`." : "To allow this check to run you have to make sure that your webserver can connect to itself. Therefor it must be able to resolve and connect to at least one its `trusted_domains` or the `overwrite.cli.url`.",
"Could not check for JavaScript support via any of your `trusted_domains` nor `overwrite.cli.url`. This may be the result of a server-side DNS mismatch or outbound firewall rule. Please check manually if your webserver serves `.mjs` files using the JavaScript MIME type." : "Could not check for JavaScript support via any of your `trusted_domains` nor `overwrite.cli.url`. This may be the result of a server-side DNS mismatch or outbound firewall rule. Please check manually if your webserver serves `.mjs` files using the JavaScript MIME type.",
- "Active accounts" : "Active accounts"
+ "Active accounts" : "Active accounts",
+ "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule."
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/settings/l10n/es.js b/apps/settings/l10n/es.js
index 080fa1f2042..0de092bd294 100644
--- a/apps/settings/l10n/es.js
+++ b/apps/settings/l10n/es.js
@@ -137,7 +137,6 @@ OC.L10N.register(
"Your remote address could not be determined." : "No se pudo determinar su dirección remota.",
"Your remote address was identified as \"%s\" and is brute-force throttled at the moment slowing down the performance of various requests. If the remote address is not your address this can be an indication that a proxy is not configured correctly." : "Su dirección remota se ha identificado como \"%s\" y está siendo ralentizada mediante fuerza bruta, disminuyendo el rendimiento de varias solicitudes. Si la dirección remota no es su dirección, esto puede ser una señal de que un proxy no se ha configurado correctamente.",
"Your remote address \"%s\" is not brute-force throttled." : "Su dirección remota \"%s\" no está limitada por fuerza bruta.",
- "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "Para permitir que este chequeo se lleve a cabo, debe asegurarse que su servidor pueda conectarse a sí mismo. Por tanto, este debe poder resolver y conectarse a alguno de sus `trusted_domains` o al url definido en `overwrite.cli.url`. Este fallo puede ser resultado de una inconsistencia DNS del lado del servidor o una regla de salida del cortafuegos.",
"Old administration imported certificates" : "Certificados de administración antiguos importados",
"A background job is pending that checks for administration imported SSL certificates. Please check back later." : "Está pendiente una tarea en segundo plano que comprueba los certificados SSL de administración importados. Por favor, vuelva a verificar más tarde.",
"There are some administration imported SSL certificates present, that are not used anymore with Nextcloud 21. They can be imported on the command line via \"occ security:certificates:import\" command. Their paths inside the data directory are shown below." : "Están presentes algunos certificados SSL de administración importados, que, ya no se utilizan con Nextcloud 21. Pueden ser importados usando la línea de comandos con \"occ security:certificates:import\". Sus rutas dentro del directorio de datos se muestran a continuación.",
@@ -311,9 +310,6 @@ OC.L10N.register(
"Could not check that your web server serves `.well-known` correctly. Please check manually." : "No se pudo verificar que su servidor web sirve correctamente `.well-known`. Por favor, revise manualmente.",
"Your web server is not properly set up to resolve `.well-known` URLs, failed on:\n`%s`" : "Su servidor web no está configurado apropiadamente para resolver URLs `.well-known`, falló en:\n`%s`",
"Your server is correctly configured to serve `.well-known` URLs." : "Su servidor está correctamente configurado para servir URLs `.well-known`.",
- "WOFF2 file loading" : "Cargando archivo WOFF2",
- "Could not check for WOFF2 loading support. Please check manually if your webserver serves `.woff2` files." : "No se pudo verificar la compatibilidad con la carga de WOFF2. Verifique manualmente si su servidor web admite archivos `.woff2`.",
- "Your web server is not properly set up to deliver .woff2 files. This is typically an issue with the Nginx configuration. For Nextcloud 15 it needs an adjustement to also deliver .woff2 files. Compare your Nginx configuration to the recommended configuration in our documentation." : "Su servidor web no está configurado correctamente para entregar archivos .woff2. Esto es típicamente un problema con la configuración de Nginx. Para Nextcloud 15 necesita un ajuste para entregar también archivos .woff2. Compare su configuración Nginx con la configuración recomendada en nuestra documentación.",
"Profile information" : "Información del perfil",
"Profile picture, full name, email, phone number, address, website, Twitter, organisation, role, headline, biography, and whether your profile is enabled" : "Foto del perfil, nombre completo, correo electrónico, número de teléfono, dirección, sitio web, Twitter, organización, función, titular, biografía y si su perfil está habilitado",
"Nextcloud settings" : "Ajustes de Nextcloud",
@@ -853,6 +849,7 @@ OC.L10N.register(
"SMTP Username" : "Nombre de usuario SMTP",
"To allow this check to run you have to make sure that your webserver can connect to itself. Therefor it must be able to resolve and connect to at least one its `trusted_domains` or the `overwrite.cli.url`." : "Para permitir que este chequeo se lleve a cabo, debe asegurarse que su servidor pueda conectarse a sí mismo. Por tanto, este debe poder resolver y conectarse a alguno de sus `trusted_domains` o al url definido en `overwrite.cli.url`",
"Could not check for JavaScript support via any of your `trusted_domains` nor `overwrite.cli.url`. This may be the result of a server-side DNS mismatch or outbound firewall rule. Please check manually if your webserver serves `.mjs` files using the JavaScript MIME type." : "No se ha podido comprobar la compatibilidad con JavaScript a través de ninguno de sus `trusted_domains` ni `overwrite.cli.url`. Esto puede deberse a un error de DNS en el servidor o a una regla del cortafuegos de salida. Compruebe manualmente si su servidor web sirve archivos `.mjs` utilizando el tipo MIME JavaScript.",
- "Active accounts" : "Cuentas activas"
+ "Active accounts" : "Cuentas activas",
+ "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "Para permitir que este chequeo se lleve a cabo, debe asegurarse que su servidor pueda conectarse a sí mismo. Por tanto, este debe poder resolver y conectarse a alguno de sus `trusted_domains` o al url definido en `overwrite.cli.url`. Este fallo puede ser resultado de una inconsistencia DNS del lado del servidor o una regla de salida del cortafuegos."
},
"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;");
diff --git a/apps/settings/l10n/es.json b/apps/settings/l10n/es.json
index 2d931e5b67a..d3e543690ed 100644
--- a/apps/settings/l10n/es.json
+++ b/apps/settings/l10n/es.json
@@ -135,7 +135,6 @@
"Your remote address could not be determined." : "No se pudo determinar su dirección remota.",
"Your remote address was identified as \"%s\" and is brute-force throttled at the moment slowing down the performance of various requests. If the remote address is not your address this can be an indication that a proxy is not configured correctly." : "Su dirección remota se ha identificado como \"%s\" y está siendo ralentizada mediante fuerza bruta, disminuyendo el rendimiento de varias solicitudes. Si la dirección remota no es su dirección, esto puede ser una señal de que un proxy no se ha configurado correctamente.",
"Your remote address \"%s\" is not brute-force throttled." : "Su dirección remota \"%s\" no está limitada por fuerza bruta.",
- "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "Para permitir que este chequeo se lleve a cabo, debe asegurarse que su servidor pueda conectarse a sí mismo. Por tanto, este debe poder resolver y conectarse a alguno de sus `trusted_domains` o al url definido en `overwrite.cli.url`. Este fallo puede ser resultado de una inconsistencia DNS del lado del servidor o una regla de salida del cortafuegos.",
"Old administration imported certificates" : "Certificados de administración antiguos importados",
"A background job is pending that checks for administration imported SSL certificates. Please check back later." : "Está pendiente una tarea en segundo plano que comprueba los certificados SSL de administración importados. Por favor, vuelva a verificar más tarde.",
"There are some administration imported SSL certificates present, that are not used anymore with Nextcloud 21. They can be imported on the command line via \"occ security:certificates:import\" command. Their paths inside the data directory are shown below." : "Están presentes algunos certificados SSL de administración importados, que, ya no se utilizan con Nextcloud 21. Pueden ser importados usando la línea de comandos con \"occ security:certificates:import\". Sus rutas dentro del directorio de datos se muestran a continuación.",
@@ -309,9 +308,6 @@
"Could not check that your web server serves `.well-known` correctly. Please check manually." : "No se pudo verificar que su servidor web sirve correctamente `.well-known`. Por favor, revise manualmente.",
"Your web server is not properly set up to resolve `.well-known` URLs, failed on:\n`%s`" : "Su servidor web no está configurado apropiadamente para resolver URLs `.well-known`, falló en:\n`%s`",
"Your server is correctly configured to serve `.well-known` URLs." : "Su servidor está correctamente configurado para servir URLs `.well-known`.",
- "WOFF2 file loading" : "Cargando archivo WOFF2",
- "Could not check for WOFF2 loading support. Please check manually if your webserver serves `.woff2` files." : "No se pudo verificar la compatibilidad con la carga de WOFF2. Verifique manualmente si su servidor web admite archivos `.woff2`.",
- "Your web server is not properly set up to deliver .woff2 files. This is typically an issue with the Nginx configuration. For Nextcloud 15 it needs an adjustement to also deliver .woff2 files. Compare your Nginx configuration to the recommended configuration in our documentation." : "Su servidor web no está configurado correctamente para entregar archivos .woff2. Esto es típicamente un problema con la configuración de Nginx. Para Nextcloud 15 necesita un ajuste para entregar también archivos .woff2. Compare su configuración Nginx con la configuración recomendada en nuestra documentación.",
"Profile information" : "Información del perfil",
"Profile picture, full name, email, phone number, address, website, Twitter, organisation, role, headline, biography, and whether your profile is enabled" : "Foto del perfil, nombre completo, correo electrónico, número de teléfono, dirección, sitio web, Twitter, organización, función, titular, biografía y si su perfil está habilitado",
"Nextcloud settings" : "Ajustes de Nextcloud",
@@ -851,6 +847,7 @@
"SMTP Username" : "Nombre de usuario SMTP",
"To allow this check to run you have to make sure that your webserver can connect to itself. Therefor it must be able to resolve and connect to at least one its `trusted_domains` or the `overwrite.cli.url`." : "Para permitir que este chequeo se lleve a cabo, debe asegurarse que su servidor pueda conectarse a sí mismo. Por tanto, este debe poder resolver y conectarse a alguno de sus `trusted_domains` o al url definido en `overwrite.cli.url`",
"Could not check for JavaScript support via any of your `trusted_domains` nor `overwrite.cli.url`. This may be the result of a server-side DNS mismatch or outbound firewall rule. Please check manually if your webserver serves `.mjs` files using the JavaScript MIME type." : "No se ha podido comprobar la compatibilidad con JavaScript a través de ninguno de sus `trusted_domains` ni `overwrite.cli.url`. Esto puede deberse a un error de DNS en el servidor o a una regla del cortafuegos de salida. Compruebe manualmente si su servidor web sirve archivos `.mjs` utilizando el tipo MIME JavaScript.",
- "Active accounts" : "Cuentas activas"
+ "Active accounts" : "Cuentas activas",
+ "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "Para permitir que este chequeo se lleve a cabo, debe asegurarse que su servidor pueda conectarse a sí mismo. Por tanto, este debe poder resolver y conectarse a alguno de sus `trusted_domains` o al url definido en `overwrite.cli.url`. Este fallo puede ser resultado de una inconsistencia DNS del lado del servidor o una regla de salida del cortafuegos."
},"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"
} \ No newline at end of file
diff --git a/apps/settings/l10n/es_MX.js b/apps/settings/l10n/es_MX.js
index d8db6b81bbc..342fd690350 100644
--- a/apps/settings/l10n/es_MX.js
+++ b/apps/settings/l10n/es_MX.js
@@ -254,8 +254,6 @@ OC.L10N.register(
"Could not check that your web server serves `.well-known` correctly. Please check manually." : "No se pudo revisar si su servidor web sirve correctamente `.well-known`. Por favor, revise manualmente.",
"Your web server is not properly set up to resolve `.well-known` URLs, failed on:\n`%s`" : "Su servidor web no está configurado apropiadamente para resolver URLs `.well-known`, falló en:\n`%s`",
"Your server is correctly configured to serve `.well-known` URLs." : "Su servidor está correctamente configurado para servir URLs `.well-known`.",
- "WOFF2 file loading" : "Cargando archivo WOFF2",
- "Could not check for WOFF2 loading support. Please check manually if your webserver serves `.woff2` files." : "No se pudo verificar el soporte de carga WOFF2. Por favor, verifique manualmente si su servidor web sirve archivos `.woff2`.",
"Profile information" : "Información del perfil",
"Profile picture, full name, email, phone number, address, website, Twitter, organisation, role, headline, biography, and whether your profile is enabled" : "Foto de perfil, nombre completo, correo electrónico, número de teléfono, dirección, sitio web, Twitter, organización, cargo, titular, biografía y si su perfil está habilitado",
"Nextcloud settings" : "Configuración de Nextcloud",
diff --git a/apps/settings/l10n/es_MX.json b/apps/settings/l10n/es_MX.json
index 40e64d2d285..41b190c5527 100644
--- a/apps/settings/l10n/es_MX.json
+++ b/apps/settings/l10n/es_MX.json
@@ -252,8 +252,6 @@
"Could not check that your web server serves `.well-known` correctly. Please check manually." : "No se pudo revisar si su servidor web sirve correctamente `.well-known`. Por favor, revise manualmente.",
"Your web server is not properly set up to resolve `.well-known` URLs, failed on:\n`%s`" : "Su servidor web no está configurado apropiadamente para resolver URLs `.well-known`, falló en:\n`%s`",
"Your server is correctly configured to serve `.well-known` URLs." : "Su servidor está correctamente configurado para servir URLs `.well-known`.",
- "WOFF2 file loading" : "Cargando archivo WOFF2",
- "Could not check for WOFF2 loading support. Please check manually if your webserver serves `.woff2` files." : "No se pudo verificar el soporte de carga WOFF2. Por favor, verifique manualmente si su servidor web sirve archivos `.woff2`.",
"Profile information" : "Información del perfil",
"Profile picture, full name, email, phone number, address, website, Twitter, organisation, role, headline, biography, and whether your profile is enabled" : "Foto de perfil, nombre completo, correo electrónico, número de teléfono, dirección, sitio web, Twitter, organización, cargo, titular, biografía y si su perfil está habilitado",
"Nextcloud settings" : "Configuración de Nextcloud",
diff --git a/apps/settings/l10n/eu.js b/apps/settings/l10n/eu.js
index 14ebdc89dfe..b49a14fc3cb 100644
--- a/apps/settings/l10n/eu.js
+++ b/apps/settings/l10n/eu.js
@@ -137,7 +137,6 @@ OC.L10N.register(
"Your remote address could not be determined." : "Ezin izan da zure urruneko helbidea zehaztu.",
"Your remote address was identified as \"%s\" and is brute-force throttled at the moment slowing down the performance of various requests. If the remote address is not your address this can be an indication that a proxy is not configured correctly." : "Zure urruneko helbidea \"%s\" gisa identifikatua izan da, eta brute-force mugatzea dauka une honetan eskaera batzuen errendimendua gutxituz. Urruneko helbidea zure helbidea ez bada, proxy bat ondo konfiguratu ez dela adierazi dezake horrek.",
"Your remote address \"%s\" is not brute-force throttled." : "Zure urruneko \"%s\" helbideak ez du brute-force mugarik.",
- "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "Egiaztapen hau exekuta dadin ziurtatu behar duzu zure web zerbitzaria bere buruarekin konektatu daitekeela. Hori dela eta, bere `trusted_domains` edo `overwrite.cli.url`ra gutxienez ebatzi eta konektatzeko gai izan behar du. Baliteke hutsegite hau zerbitzariaren aldeko DNS ez bat etortzea edo irteerako suebakiaren arauaren ondorioa izatea.",
"Old administration imported certificates" : "Administrazio zaharretik inportaturiko ziurtagiriak",
"A background job is pending that checks for administration imported SSL certificates. Please check back later." : "Administratzaileek inportaturiko SSL ziurtagiriak egiaztatzen dituen atzeko planoko lan bat dago egiteke. Egiaztatu berriro geroago.",
"There are some administration imported SSL certificates present, that are not used anymore with Nextcloud 21. They can be imported on the command line via \"occ security:certificates:import\" command. Their paths inside the data directory are shown below." : "Badira administratzaileek inportatutako zenbait erabiltzaile SSL ziurtagiri, jada erabiltzen ez direnak Nextcloud 21-ekin. Komando-lerroan inportatu daitezke \"occ security:certificates: import\" komandoaren bidez. Behean erakusten da datu direktorioko bideak.",
@@ -311,9 +310,6 @@ OC.L10N.register(
"Could not check that your web server serves `.well-known` correctly. Please check manually." : "Ezin izan da egiaztatu zure web zerbitzariak `.well-known` behar bezala zerbitzatzen duen. Mesedez, egiaztatu ezazu eskuz.",
"Your web server is not properly set up to resolve `.well-known` URLs, failed on:\n`%s`" : "Zure web zerbitzaria ez dago behar bezala konfiguratuta `.well-known` URLak ebazteko, huts egin du:\n`%s`",
"Your server is correctly configured to serve `.well-known` URLs." : "Zure zerbitzaria behar bezala konfiguratuta dago `.well-known` URLak hornitzeko.",
- "WOFF2 file loading" : "WOFF2 fitxategien karga",
- "Could not check for WOFF2 loading support. Please check manually if your webserver serves `.woff2` files." : "Ezin izan da egiaztatu WOFF2 kargatzeko euskarria. Mesedez, egiaztatu eskuz zure web zerbitzariak `.woff2` fitxategiak zerbitzatzen dituen.",
- "Your web server is not properly set up to deliver .woff2 files. This is typically an issue with the Nginx configuration. For Nextcloud 15 it needs an adjustement to also deliver .woff2 files. Compare your Nginx configuration to the recommended configuration in our documentation." : "Zure web zerbitzaria ez dago behar bezala konfiguratuta .woff2 fitxategiak entregatzeko. Hau Nginx-en konfigurazioaren ohiko arazo bat da. Nextcloud 15ean doikuntza bat beharrezkoa da .woff2 fitxategiak bidaltzeko. Konparatu zure Nginx konfigurazioa gure dokumentazioan gomendatutakoarekin.",
"Profile information" : "Profilaren informazioa",
"Profile picture, full name, email, phone number, address, website, Twitter, organisation, role, headline, biography, and whether your profile is enabled" : "Profileko argazkia, izen osoa, helbide elektronikoa, telefono zenbakia, helbidea, webgunea, Twitter, erakundea, rola, izenburua, biografia eta zure profila gaituta dagoen ala ez",
"Nextcloud settings" : "Nextcloud ezarpenak",
@@ -877,6 +873,7 @@ OC.L10N.register(
"SMTP Username" : "SMTP erabiltzaile-izena",
"To allow this check to run you have to make sure that your webserver can connect to itself. Therefor it must be able to resolve and connect to at least one its `trusted_domains` or the `overwrite.cli.url`." : "Egiaztapen hau exekuta dadin zure web zerbitzaria bere buruarekin konektatu daitekeela ziurtatu behar duzu. Hori dela eta, gutxienez bere `trusted_domains` edo `overwrite.cli.url` batera konektatzeko gai izan behar da.",
"Could not check for JavaScript support via any of your `trusted_domains` nor `overwrite.cli.url`. This may be the result of a server-side DNS mismatch or outbound firewall rule. Please check manually if your webserver serves `.mjs` files using the JavaScript MIME type." : "Ezin izan da egiaztatu JavaScript onartzen baden zure `trusted_domains` edo `overwrite.cli.url` bidez. Baliteke zerbitzariaren DNS bat ez datozenen edo irteerako suebakiaren arauaren ondorioa izatea. Mesedez, egiaztatu eskuz zure web zerbitzariak `.mjs` fitxategiak hornitzen dituen JavaScript MIME mota erabiliz.",
- "Active accounts" : "Kontu gaituak"
+ "Active accounts" : "Kontu gaituak",
+ "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "Egiaztapen hau exekuta dadin ziurtatu behar duzu zure web zerbitzaria bere buruarekin konektatu daitekeela. Hori dela eta, bere `trusted_domains` edo `overwrite.cli.url`ra gutxienez ebatzi eta konektatzeko gai izan behar du. Baliteke hutsegite hau zerbitzariaren aldeko DNS ez bat etortzea edo irteerako suebakiaren arauaren ondorioa izatea."
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/settings/l10n/eu.json b/apps/settings/l10n/eu.json
index 36ce808c671..9fd245c4842 100644
--- a/apps/settings/l10n/eu.json
+++ b/apps/settings/l10n/eu.json
@@ -135,7 +135,6 @@
"Your remote address could not be determined." : "Ezin izan da zure urruneko helbidea zehaztu.",
"Your remote address was identified as \"%s\" and is brute-force throttled at the moment slowing down the performance of various requests. If the remote address is not your address this can be an indication that a proxy is not configured correctly." : "Zure urruneko helbidea \"%s\" gisa identifikatua izan da, eta brute-force mugatzea dauka une honetan eskaera batzuen errendimendua gutxituz. Urruneko helbidea zure helbidea ez bada, proxy bat ondo konfiguratu ez dela adierazi dezake horrek.",
"Your remote address \"%s\" is not brute-force throttled." : "Zure urruneko \"%s\" helbideak ez du brute-force mugarik.",
- "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "Egiaztapen hau exekuta dadin ziurtatu behar duzu zure web zerbitzaria bere buruarekin konektatu daitekeela. Hori dela eta, bere `trusted_domains` edo `overwrite.cli.url`ra gutxienez ebatzi eta konektatzeko gai izan behar du. Baliteke hutsegite hau zerbitzariaren aldeko DNS ez bat etortzea edo irteerako suebakiaren arauaren ondorioa izatea.",
"Old administration imported certificates" : "Administrazio zaharretik inportaturiko ziurtagiriak",
"A background job is pending that checks for administration imported SSL certificates. Please check back later." : "Administratzaileek inportaturiko SSL ziurtagiriak egiaztatzen dituen atzeko planoko lan bat dago egiteke. Egiaztatu berriro geroago.",
"There are some administration imported SSL certificates present, that are not used anymore with Nextcloud 21. They can be imported on the command line via \"occ security:certificates:import\" command. Their paths inside the data directory are shown below." : "Badira administratzaileek inportatutako zenbait erabiltzaile SSL ziurtagiri, jada erabiltzen ez direnak Nextcloud 21-ekin. Komando-lerroan inportatu daitezke \"occ security:certificates: import\" komandoaren bidez. Behean erakusten da datu direktorioko bideak.",
@@ -309,9 +308,6 @@
"Could not check that your web server serves `.well-known` correctly. Please check manually." : "Ezin izan da egiaztatu zure web zerbitzariak `.well-known` behar bezala zerbitzatzen duen. Mesedez, egiaztatu ezazu eskuz.",
"Your web server is not properly set up to resolve `.well-known` URLs, failed on:\n`%s`" : "Zure web zerbitzaria ez dago behar bezala konfiguratuta `.well-known` URLak ebazteko, huts egin du:\n`%s`",
"Your server is correctly configured to serve `.well-known` URLs." : "Zure zerbitzaria behar bezala konfiguratuta dago `.well-known` URLak hornitzeko.",
- "WOFF2 file loading" : "WOFF2 fitxategien karga",
- "Could not check for WOFF2 loading support. Please check manually if your webserver serves `.woff2` files." : "Ezin izan da egiaztatu WOFF2 kargatzeko euskarria. Mesedez, egiaztatu eskuz zure web zerbitzariak `.woff2` fitxategiak zerbitzatzen dituen.",
- "Your web server is not properly set up to deliver .woff2 files. This is typically an issue with the Nginx configuration. For Nextcloud 15 it needs an adjustement to also deliver .woff2 files. Compare your Nginx configuration to the recommended configuration in our documentation." : "Zure web zerbitzaria ez dago behar bezala konfiguratuta .woff2 fitxategiak entregatzeko. Hau Nginx-en konfigurazioaren ohiko arazo bat da. Nextcloud 15ean doikuntza bat beharrezkoa da .woff2 fitxategiak bidaltzeko. Konparatu zure Nginx konfigurazioa gure dokumentazioan gomendatutakoarekin.",
"Profile information" : "Profilaren informazioa",
"Profile picture, full name, email, phone number, address, website, Twitter, organisation, role, headline, biography, and whether your profile is enabled" : "Profileko argazkia, izen osoa, helbide elektronikoa, telefono zenbakia, helbidea, webgunea, Twitter, erakundea, rola, izenburua, biografia eta zure profila gaituta dagoen ala ez",
"Nextcloud settings" : "Nextcloud ezarpenak",
@@ -875,6 +871,7 @@
"SMTP Username" : "SMTP erabiltzaile-izena",
"To allow this check to run you have to make sure that your webserver can connect to itself. Therefor it must be able to resolve and connect to at least one its `trusted_domains` or the `overwrite.cli.url`." : "Egiaztapen hau exekuta dadin zure web zerbitzaria bere buruarekin konektatu daitekeela ziurtatu behar duzu. Hori dela eta, gutxienez bere `trusted_domains` edo `overwrite.cli.url` batera konektatzeko gai izan behar da.",
"Could not check for JavaScript support via any of your `trusted_domains` nor `overwrite.cli.url`. This may be the result of a server-side DNS mismatch or outbound firewall rule. Please check manually if your webserver serves `.mjs` files using the JavaScript MIME type." : "Ezin izan da egiaztatu JavaScript onartzen baden zure `trusted_domains` edo `overwrite.cli.url` bidez. Baliteke zerbitzariaren DNS bat ez datozenen edo irteerako suebakiaren arauaren ondorioa izatea. Mesedez, egiaztatu eskuz zure web zerbitzariak `.mjs` fitxategiak hornitzen dituen JavaScript MIME mota erabiliz.",
- "Active accounts" : "Kontu gaituak"
+ "Active accounts" : "Kontu gaituak",
+ "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "Egiaztapen hau exekuta dadin ziurtatu behar duzu zure web zerbitzaria bere buruarekin konektatu daitekeela. Hori dela eta, bere `trusted_domains` edo `overwrite.cli.url`ra gutxienez ebatzi eta konektatzeko gai izan behar du. Baliteke hutsegite hau zerbitzariaren aldeko DNS ez bat etortzea edo irteerako suebakiaren arauaren ondorioa izatea."
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/settings/l10n/fi.js b/apps/settings/l10n/fi.js
index 8f83025bb21..f8295b9c881 100644
--- a/apps/settings/l10n/fi.js
+++ b/apps/settings/l10n/fi.js
@@ -152,7 +152,6 @@ OC.L10N.register(
"64-bit" : "64-bit",
"Your database does not run with \"READ COMMITTED\" transaction isolation level. This can cause problems when multiple actions are executed in parallel." : "Tietokantaasi ei suoriteta \"READ COMMITTED\"-transaktioeristystasolla. Tämä saattaa aiheuttaa ongelmia, kun useita toimintoja suoritetaan rinnakkaisesti.",
".well-known URLs" : ".well-known-URL-osoitteet",
- "WOFF2 file loading" : "WOFF2-tiedostolataus",
"Profile information" : "Profiilitiedot",
"Nextcloud settings" : "Nextcloud-asetukset",
"Task:" : "Tehtävä:",
diff --git a/apps/settings/l10n/fi.json b/apps/settings/l10n/fi.json
index 4df2d4e1498..02718bd9238 100644
--- a/apps/settings/l10n/fi.json
+++ b/apps/settings/l10n/fi.json
@@ -150,7 +150,6 @@
"64-bit" : "64-bit",
"Your database does not run with \"READ COMMITTED\" transaction isolation level. This can cause problems when multiple actions are executed in parallel." : "Tietokantaasi ei suoriteta \"READ COMMITTED\"-transaktioeristystasolla. Tämä saattaa aiheuttaa ongelmia, kun useita toimintoja suoritetaan rinnakkaisesti.",
".well-known URLs" : ".well-known-URL-osoitteet",
- "WOFF2 file loading" : "WOFF2-tiedostolataus",
"Profile information" : "Profiilitiedot",
"Nextcloud settings" : "Nextcloud-asetukset",
"Task:" : "Tehtävä:",
diff --git a/apps/settings/l10n/fr.js b/apps/settings/l10n/fr.js
index 817ca3cdbdf..8750d67bd8d 100644
--- a/apps/settings/l10n/fr.js
+++ b/apps/settings/l10n/fr.js
@@ -136,7 +136,6 @@ OC.L10N.register(
"Your remote address could not be determined." : "Votre adresse à distance n'a pas pu être déterminée.",
"Your remote address was identified as \"%s\" and is brute-force throttled at the moment slowing down the performance of various requests. If the remote address is not your address this can be an indication that a proxy is not configured correctly." : "Votre adresse réseau a été identifiée comme « %s » et elle est bridée par le mécanisme anti-intrusion ce qui ralentit la performance de certaines requêtes. Si cette adresse réseau n'est pas la vôtre, cela peut signifier qu'il y a une erreur de configuration d'un proxy.",
"Your remote address \"%s\" is not brute-force throttled." : "Votre adresse distante « %s » n'est pas ralentie par attaque par force brute.",
- "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "Pour autoriser cette vérification, pour devez vous assurer que votre serveur web peut se connecter à lui-même. Il doit donc être capable de résoudre et de se connecter à au moins un de ses `trusted_domains` ou à l'URL `overwrite.cli.url`. Cet échec peut être le résultat d'une erreur de DNS côté serveur ou d'une règle de pare-feu sortante.",
"Old administration imported certificates" : "Anciens certificats d’administration importés",
"A background job is pending that checks for administration imported SSL certificates. Please check back later." : "Une tâche en arrière-plan qui vérifie les certificats SSL importés par l'administration est en attente. Veuillez vérifier plus tard.",
"There are some administration imported SSL certificates present, that are not used anymore with Nextcloud 21. They can be imported on the command line via \"occ security:certificates:import\" command. Their paths inside the data directory are shown below." : "Certains certificats SSL importés par l'administration sont présents et ne sont plus utilisés avec Nextcloud 21. Ils peuvent être importés par l'interface en ligne de commande via la commande « occ security:certificates:import ». Leurs chemins dans le dossier data sont affichés ci-dessous.",
@@ -291,9 +290,6 @@ OC.L10N.register(
"Could not check that your web server serves `.well-known` correctly. Please check manually." : "Impossible de vérifier que votre serveur web serve les entêtes `.well-known` correctement. Veuillez vérifier manuellement.",
"Your web server is not properly set up to resolve `.well-known` URLs, failed on:\n`%s`" : "Votre serveur web n’est pas configuré correctement pour résoudre les URL `.well-known`, a échoué sur :\n`%s`",
"Your server is correctly configured to serve `.well-known` URLs." : "Votre serveur est correctement configuré pour servir les URL `.well-known`.",
- "WOFF2 file loading" : "Chargement du fichier WOFF2",
- "Could not check for WOFF2 loading support. Please check manually if your webserver serves `.woff2` files." : "Impossible de vérifier la prise en charge du chargement WOFF2. Veuillez vérifier manuellement si votre serveur Web sert des fichiers `.woff2`.",
- "Your web server is not properly set up to deliver .woff2 files. This is typically an issue with the Nginx configuration. For Nextcloud 15 it needs an adjustement to also deliver .woff2 files. Compare your Nginx configuration to the recommended configuration in our documentation." : "Votre serveur web n'est pas correctement configuré pour distribuer des fichiers .woff2. C'est une erreur fréquente de configuration Nginx. Pour Nextcloud 15, il est nécessaire de la régler pour les fichiers .woff2. Comparer votre configuration Nginx avec la configuration recommandée dans notre documentation.",
"Profile information" : "Information du profil",
"Profile picture, full name, email, phone number, address, website, Twitter, organisation, role, headline, biography, and whether your profile is enabled" : "Photo de profil, nom complet, adresse e-mail, numéro de téléphone, adresse, site web, Twitter, organisation, fonction, titre, à propos, et si votre profil est activé",
"Nextcloud settings" : "Paramètres Nextcloud",
@@ -853,6 +849,7 @@ OC.L10N.register(
"SMTP Username" : "Nom d’utilisateur SMTP",
"To allow this check to run you have to make sure that your webserver can connect to itself. Therefor it must be able to resolve and connect to at least one its `trusted_domains` or the `overwrite.cli.url`." : "Pour autoriser cette vérification, pour devez vous assurer que votre serveur web peut se connecter à lui-même. Il doit donc être capable de résoudre et de se connecter à au moins un de ses `trusted_domains` ou à l'URL `overwrite.cli.url`.",
"Could not check for JavaScript support via any of your `trusted_domains` nor `overwrite.cli.url`. This may be the result of a server-side DNS mismatch or outbound firewall rule. Please check manually if your webserver serves `.mjs` files using the JavaScript MIME type." : "Impossible de vérifier la prise en charge Javascript via l’un de vos `trusted_domains` ou `overwrite.cli.url`. Cela peut résulter d’une incompatibilité DNS côté serveur ou d’une règle de pare-feu sortante. Veuillez vérifier manuellement si votre serveur web sert des fichiers `.mjs` utilisant le type MIME JavaScript.",
- "Active accounts" : "Comptes actifs"
+ "Active accounts" : "Comptes actifs",
+ "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "Pour autoriser cette vérification, pour devez vous assurer que votre serveur web peut se connecter à lui-même. Il doit donc être capable de résoudre et de se connecter à au moins un de ses `trusted_domains` ou à l'URL `overwrite.cli.url`. Cet échec peut être le résultat d'une erreur de DNS côté serveur ou d'une règle de pare-feu sortante."
},
"nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;");
diff --git a/apps/settings/l10n/fr.json b/apps/settings/l10n/fr.json
index 5afc164135f..a2b399e6fe6 100644
--- a/apps/settings/l10n/fr.json
+++ b/apps/settings/l10n/fr.json
@@ -134,7 +134,6 @@
"Your remote address could not be determined." : "Votre adresse à distance n'a pas pu être déterminée.",
"Your remote address was identified as \"%s\" and is brute-force throttled at the moment slowing down the performance of various requests. If the remote address is not your address this can be an indication that a proxy is not configured correctly." : "Votre adresse réseau a été identifiée comme « %s » et elle est bridée par le mécanisme anti-intrusion ce qui ralentit la performance de certaines requêtes. Si cette adresse réseau n'est pas la vôtre, cela peut signifier qu'il y a une erreur de configuration d'un proxy.",
"Your remote address \"%s\" is not brute-force throttled." : "Votre adresse distante « %s » n'est pas ralentie par attaque par force brute.",
- "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "Pour autoriser cette vérification, pour devez vous assurer que votre serveur web peut se connecter à lui-même. Il doit donc être capable de résoudre et de se connecter à au moins un de ses `trusted_domains` ou à l'URL `overwrite.cli.url`. Cet échec peut être le résultat d'une erreur de DNS côté serveur ou d'une règle de pare-feu sortante.",
"Old administration imported certificates" : "Anciens certificats d’administration importés",
"A background job is pending that checks for administration imported SSL certificates. Please check back later." : "Une tâche en arrière-plan qui vérifie les certificats SSL importés par l'administration est en attente. Veuillez vérifier plus tard.",
"There are some administration imported SSL certificates present, that are not used anymore with Nextcloud 21. They can be imported on the command line via \"occ security:certificates:import\" command. Their paths inside the data directory are shown below." : "Certains certificats SSL importés par l'administration sont présents et ne sont plus utilisés avec Nextcloud 21. Ils peuvent être importés par l'interface en ligne de commande via la commande « occ security:certificates:import ». Leurs chemins dans le dossier data sont affichés ci-dessous.",
@@ -289,9 +288,6 @@
"Could not check that your web server serves `.well-known` correctly. Please check manually." : "Impossible de vérifier que votre serveur web serve les entêtes `.well-known` correctement. Veuillez vérifier manuellement.",
"Your web server is not properly set up to resolve `.well-known` URLs, failed on:\n`%s`" : "Votre serveur web n’est pas configuré correctement pour résoudre les URL `.well-known`, a échoué sur :\n`%s`",
"Your server is correctly configured to serve `.well-known` URLs." : "Votre serveur est correctement configuré pour servir les URL `.well-known`.",
- "WOFF2 file loading" : "Chargement du fichier WOFF2",
- "Could not check for WOFF2 loading support. Please check manually if your webserver serves `.woff2` files." : "Impossible de vérifier la prise en charge du chargement WOFF2. Veuillez vérifier manuellement si votre serveur Web sert des fichiers `.woff2`.",
- "Your web server is not properly set up to deliver .woff2 files. This is typically an issue with the Nginx configuration. For Nextcloud 15 it needs an adjustement to also deliver .woff2 files. Compare your Nginx configuration to the recommended configuration in our documentation." : "Votre serveur web n'est pas correctement configuré pour distribuer des fichiers .woff2. C'est une erreur fréquente de configuration Nginx. Pour Nextcloud 15, il est nécessaire de la régler pour les fichiers .woff2. Comparer votre configuration Nginx avec la configuration recommandée dans notre documentation.",
"Profile information" : "Information du profil",
"Profile picture, full name, email, phone number, address, website, Twitter, organisation, role, headline, biography, and whether your profile is enabled" : "Photo de profil, nom complet, adresse e-mail, numéro de téléphone, adresse, site web, Twitter, organisation, fonction, titre, à propos, et si votre profil est activé",
"Nextcloud settings" : "Paramètres Nextcloud",
@@ -851,6 +847,7 @@
"SMTP Username" : "Nom d’utilisateur SMTP",
"To allow this check to run you have to make sure that your webserver can connect to itself. Therefor it must be able to resolve and connect to at least one its `trusted_domains` or the `overwrite.cli.url`." : "Pour autoriser cette vérification, pour devez vous assurer que votre serveur web peut se connecter à lui-même. Il doit donc être capable de résoudre et de se connecter à au moins un de ses `trusted_domains` ou à l'URL `overwrite.cli.url`.",
"Could not check for JavaScript support via any of your `trusted_domains` nor `overwrite.cli.url`. This may be the result of a server-side DNS mismatch or outbound firewall rule. Please check manually if your webserver serves `.mjs` files using the JavaScript MIME type." : "Impossible de vérifier la prise en charge Javascript via l’un de vos `trusted_domains` ou `overwrite.cli.url`. Cela peut résulter d’une incompatibilité DNS côté serveur ou d’une règle de pare-feu sortante. Veuillez vérifier manuellement si votre serveur web sert des fichiers `.mjs` utilisant le type MIME JavaScript.",
- "Active accounts" : "Comptes actifs"
+ "Active accounts" : "Comptes actifs",
+ "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "Pour autoriser cette vérification, pour devez vous assurer que votre serveur web peut se connecter à lui-même. Il doit donc être capable de résoudre et de se connecter à au moins un de ses `trusted_domains` ou à l'URL `overwrite.cli.url`. Cet échec peut être le résultat d'une erreur de DNS côté serveur ou d'une règle de pare-feu sortante."
},"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/settings/l10n/ga.js b/apps/settings/l10n/ga.js
index ca059d828a7..164e82029dd 100644
--- a/apps/settings/l10n/ga.js
+++ b/apps/settings/l10n/ga.js
@@ -137,7 +137,6 @@ OC.L10N.register(
"Your remote address could not be determined." : "Níorbh fhéidir do sheoladh cianda a chinneadh.",
"Your remote address was identified as \"%s\" and is brute-force throttled at the moment slowing down the performance of various requests. If the remote address is not your address this can be an indication that a proxy is not configured correctly." : "Aithníodh do sheoladh cianda mar \"%s\" agus tá brú brúidiúil air faoi láthair, rud a chuireann moill ar fheidhmiú iarratas éagsúla. Murab é do sheoladh an cianda seoladh is féidir é seo a thabhairt le fios nach bhfuil seachfhreastalaí cumraithe i gceart.",
"Your remote address \"%s\" is not brute-force throttled." : "Níl do sheoladh cianda \"%s\" sníofa.",
- "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "Le gur féidir an tseiceáil seo a rith caithfidh tú a chinntiú gur féidir le do fhreastalaí Gréasáin nascadh leis féin. Mar sin caithfidh sé a bheith in ann réiteach agus ceangal a dhéanamh le ceann amháin ar a laghad dá chuid `fearainn_iontaofa` nó an `overwrite.cli.url`. D'fhéadfadh an teip seo a bheith mar thoradh ar mhímheaitseáil DNS ar thaobh an fhreastalaí nó riail balla dóiteáin amach.",
"Old administration imported certificates" : "Sean-riaracháin teastais iompórtáilte",
"A background job is pending that checks for administration imported SSL certificates. Please check back later." : "Tá post cúlra ar feitheamh a sheiceálann le haghaidh riarachán deimhnithe SSL allmhairithe. Seiceáil ar ais ar ball le do thoil.",
"There are some administration imported SSL certificates present, that are not used anymore with Nextcloud 21. They can be imported on the command line via \"occ security:certificates:import\" command. Their paths inside the data directory are shown below." : "Tá roinnt deimhnithe SSL allmhairithe riaracháin i láthair, nach n-úsáidtear a thuilleadh le Nextcloud 21. Is féidir iad a iompórtáil ar an líne ordaithe trí ordú \"occ security:certificates:import\". Taispeántar thíos a gcuid cosáin taobh istigh den eolaire sonraí.",
@@ -314,9 +313,6 @@ OC.L10N.register(
"Could not check that your web server serves `.well-known` correctly. Please check manually." : "Níorbh fhéidir a sheiceáil go bhfreastalaíonn do fhreastalaí gréasáin `.well-known` i gceart. Seiceáil le do thoil de láimh.",
"Your web server is not properly set up to resolve `.well-known` URLs, failed on:\n`%s`" : "Níl do fhreastalaí gréasáin socraithe i gceart chun URLanna `.well-known` a réiteach, ar theip ar:\n`%s`",
"Your server is correctly configured to serve `.well-known` URLs." : "Tá do fhreastalaí cumraithe i gceart chun URLanna `.well-known` a sheirbheáil.",
- "WOFF2 file loading" : "WOFF2 íoslódáil an comhad",
- "Could not check for WOFF2 loading support. Please check manually if your webserver serves `.woff2` files." : "Níorbh fhéidir tacaíocht lódála WOFF2 a sheiceáil. Seiceáil le do thoil de láimh an bhfreastalaíonn do fhreastalaí gréasáin ar chomhaid `.woff2`.",
- "Your web server is not properly set up to deliver .woff2 files. This is typically an issue with the Nginx configuration. For Nextcloud 15 it needs an adjustement to also deliver .woff2 files. Compare your Nginx configuration to the recommended configuration in our documentation." : "Níl do fhreastalaí gréasáin socraithe i gceart chun comhaid .woff2 a sheachadadh. De ghnáth is saincheist é seo le cumraíocht Nginx. Le haghaidh Nextcloud 15 teastaíonn coigeartú air chun comhaid .woff2 a sheachadadh freisin. Déan do chumraíocht Nginx a chur i gcomparáid leis an gcumraíocht mholta inár gcáipéisíocht.",
"Profile information" : "Eolas próifíle",
"Profile picture, full name, email, phone number, address, website, Twitter, organisation, role, headline, biography, and whether your profile is enabled" : "Pictiúr próifíle, ainm iomlán, ríomhphost, uimhir theileafóin, seoladh, suíomh Gréasáin, Twitter, eagraíocht, ról, ceannlíne, beathaisnéis, agus cibé an bhfuil do phróifíl cumasaithe",
"Nextcloud settings" : "Socruithe Nextcloud",
@@ -881,6 +877,7 @@ OC.L10N.register(
"SMTP Username" : "Ainm Úsáideora SMTP",
"To allow this check to run you have to make sure that your webserver can connect to itself. Therefor it must be able to resolve and connect to at least one its `trusted_domains` or the `overwrite.cli.url`." : "Le gur féidir an tseiceáil seo a rith caithfidh tú a chinntiú gur féidir le do fhreastalaí gréasáin nascadh leis féin. Mar sin caithfidh sé a bheith in ann réiteach agus ceangal a dhéanamh le ceann amháin ar a laghad dá `fearainn_iontaofa` nó don `overwrite.cli.url`.",
"Could not check for JavaScript support via any of your `trusted_domains` nor `overwrite.cli.url`. This may be the result of a server-side DNS mismatch or outbound firewall rule. Please check manually if your webserver serves `.mjs` files using the JavaScript MIME type." : "Níorbh fhéidir tacaíocht JavaScript a fháil trí aon cheann de na `fearainn_ iontaofa` ná `overwrite.cli.url`. D'fhéadfadh sé seo a bheith mar thoradh ar mhímheaitseáil DNS ar thaobh an fhreastalaí nó riail balla dóiteáin amach. Seiceáil le do thoil de láimh an bhfreastalaíonn do fhreastalaí gréasáin ar chomhaid `.mjs` ag baint úsáide as an gcineál JavaScript MIME.",
- "Active accounts" : "Cuntais ghníomhacha"
+ "Active accounts" : "Cuntais ghníomhacha",
+ "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "Le gur féidir an tseiceáil seo a rith caithfidh tú a chinntiú gur féidir le do fhreastalaí Gréasáin nascadh leis féin. Mar sin caithfidh sé a bheith in ann réiteach agus ceangal a dhéanamh le ceann amháin ar a laghad dá chuid `fearainn_iontaofa` nó an `overwrite.cli.url`. D'fhéadfadh an teip seo a bheith mar thoradh ar mhímheaitseáil DNS ar thaobh an fhreastalaí nó riail balla dóiteáin amach."
},
"nplurals=5; plural=(n==1 ? 0 : n==2 ? 1 : n<7 ? 2 : n<11 ? 3 : 4);");
diff --git a/apps/settings/l10n/ga.json b/apps/settings/l10n/ga.json
index e7bda19cacc..c7c49f2e2d5 100644
--- a/apps/settings/l10n/ga.json
+++ b/apps/settings/l10n/ga.json
@@ -135,7 +135,6 @@
"Your remote address could not be determined." : "Níorbh fhéidir do sheoladh cianda a chinneadh.",
"Your remote address was identified as \"%s\" and is brute-force throttled at the moment slowing down the performance of various requests. If the remote address is not your address this can be an indication that a proxy is not configured correctly." : "Aithníodh do sheoladh cianda mar \"%s\" agus tá brú brúidiúil air faoi láthair, rud a chuireann moill ar fheidhmiú iarratas éagsúla. Murab é do sheoladh an cianda seoladh is féidir é seo a thabhairt le fios nach bhfuil seachfhreastalaí cumraithe i gceart.",
"Your remote address \"%s\" is not brute-force throttled." : "Níl do sheoladh cianda \"%s\" sníofa.",
- "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "Le gur féidir an tseiceáil seo a rith caithfidh tú a chinntiú gur féidir le do fhreastalaí Gréasáin nascadh leis féin. Mar sin caithfidh sé a bheith in ann réiteach agus ceangal a dhéanamh le ceann amháin ar a laghad dá chuid `fearainn_iontaofa` nó an `overwrite.cli.url`. D'fhéadfadh an teip seo a bheith mar thoradh ar mhímheaitseáil DNS ar thaobh an fhreastalaí nó riail balla dóiteáin amach.",
"Old administration imported certificates" : "Sean-riaracháin teastais iompórtáilte",
"A background job is pending that checks for administration imported SSL certificates. Please check back later." : "Tá post cúlra ar feitheamh a sheiceálann le haghaidh riarachán deimhnithe SSL allmhairithe. Seiceáil ar ais ar ball le do thoil.",
"There are some administration imported SSL certificates present, that are not used anymore with Nextcloud 21. They can be imported on the command line via \"occ security:certificates:import\" command. Their paths inside the data directory are shown below." : "Tá roinnt deimhnithe SSL allmhairithe riaracháin i láthair, nach n-úsáidtear a thuilleadh le Nextcloud 21. Is féidir iad a iompórtáil ar an líne ordaithe trí ordú \"occ security:certificates:import\". Taispeántar thíos a gcuid cosáin taobh istigh den eolaire sonraí.",
@@ -312,9 +311,6 @@
"Could not check that your web server serves `.well-known` correctly. Please check manually." : "Níorbh fhéidir a sheiceáil go bhfreastalaíonn do fhreastalaí gréasáin `.well-known` i gceart. Seiceáil le do thoil de láimh.",
"Your web server is not properly set up to resolve `.well-known` URLs, failed on:\n`%s`" : "Níl do fhreastalaí gréasáin socraithe i gceart chun URLanna `.well-known` a réiteach, ar theip ar:\n`%s`",
"Your server is correctly configured to serve `.well-known` URLs." : "Tá do fhreastalaí cumraithe i gceart chun URLanna `.well-known` a sheirbheáil.",
- "WOFF2 file loading" : "WOFF2 íoslódáil an comhad",
- "Could not check for WOFF2 loading support. Please check manually if your webserver serves `.woff2` files." : "Níorbh fhéidir tacaíocht lódála WOFF2 a sheiceáil. Seiceáil le do thoil de láimh an bhfreastalaíonn do fhreastalaí gréasáin ar chomhaid `.woff2`.",
- "Your web server is not properly set up to deliver .woff2 files. This is typically an issue with the Nginx configuration. For Nextcloud 15 it needs an adjustement to also deliver .woff2 files. Compare your Nginx configuration to the recommended configuration in our documentation." : "Níl do fhreastalaí gréasáin socraithe i gceart chun comhaid .woff2 a sheachadadh. De ghnáth is saincheist é seo le cumraíocht Nginx. Le haghaidh Nextcloud 15 teastaíonn coigeartú air chun comhaid .woff2 a sheachadadh freisin. Déan do chumraíocht Nginx a chur i gcomparáid leis an gcumraíocht mholta inár gcáipéisíocht.",
"Profile information" : "Eolas próifíle",
"Profile picture, full name, email, phone number, address, website, Twitter, organisation, role, headline, biography, and whether your profile is enabled" : "Pictiúr próifíle, ainm iomlán, ríomhphost, uimhir theileafóin, seoladh, suíomh Gréasáin, Twitter, eagraíocht, ról, ceannlíne, beathaisnéis, agus cibé an bhfuil do phróifíl cumasaithe",
"Nextcloud settings" : "Socruithe Nextcloud",
@@ -879,6 +875,7 @@
"SMTP Username" : "Ainm Úsáideora SMTP",
"To allow this check to run you have to make sure that your webserver can connect to itself. Therefor it must be able to resolve and connect to at least one its `trusted_domains` or the `overwrite.cli.url`." : "Le gur féidir an tseiceáil seo a rith caithfidh tú a chinntiú gur féidir le do fhreastalaí gréasáin nascadh leis féin. Mar sin caithfidh sé a bheith in ann réiteach agus ceangal a dhéanamh le ceann amháin ar a laghad dá `fearainn_iontaofa` nó don `overwrite.cli.url`.",
"Could not check for JavaScript support via any of your `trusted_domains` nor `overwrite.cli.url`. This may be the result of a server-side DNS mismatch or outbound firewall rule. Please check manually if your webserver serves `.mjs` files using the JavaScript MIME type." : "Níorbh fhéidir tacaíocht JavaScript a fháil trí aon cheann de na `fearainn_ iontaofa` ná `overwrite.cli.url`. D'fhéadfadh sé seo a bheith mar thoradh ar mhímheaitseáil DNS ar thaobh an fhreastalaí nó riail balla dóiteáin amach. Seiceáil le do thoil de láimh an bhfreastalaíonn do fhreastalaí gréasáin ar chomhaid `.mjs` ag baint úsáide as an gcineál JavaScript MIME.",
- "Active accounts" : "Cuntais ghníomhacha"
+ "Active accounts" : "Cuntais ghníomhacha",
+ "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "Le gur féidir an tseiceáil seo a rith caithfidh tú a chinntiú gur féidir le do fhreastalaí Gréasáin nascadh leis féin. Mar sin caithfidh sé a bheith in ann réiteach agus ceangal a dhéanamh le ceann amháin ar a laghad dá chuid `fearainn_iontaofa` nó an `overwrite.cli.url`. D'fhéadfadh an teip seo a bheith mar thoradh ar mhímheaitseáil DNS ar thaobh an fhreastalaí nó riail balla dóiteáin amach."
},"pluralForm" :"nplurals=5; plural=(n==1 ? 0 : n==2 ? 1 : n<7 ? 2 : n<11 ? 3 : 4);"
} \ No newline at end of file
diff --git a/apps/settings/l10n/gl.js b/apps/settings/l10n/gl.js
index 9132d9f0247..162935ab1fc 100644
--- a/apps/settings/l10n/gl.js
+++ b/apps/settings/l10n/gl.js
@@ -137,7 +137,6 @@ OC.L10N.register(
"Your remote address could not be determined." : "Non foi posíbel determinar o seu enderezo remoto.",
"Your remote address was identified as \"%s\" and is brute-force throttled at the moment slowing down the performance of various requests. If the remote address is not your address this can be an indication that a proxy is not configured correctly." : "O seu enderezo remoto foi identificado como «%s» e neste momento está estrangulado por forza bruta, o que reduce o rendemento de varias solicitudes. Se o enderezo remoto non é o seu enderezo, isto pode ser unha indicación de que un proxy non está configurado correctamente.",
"Your remote address \"%s\" is not brute-force throttled." : "O seu enderezo remoto «%s» non está estrangulado por forza bruta.",
- "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "Para permitir que esta comprobación se execute, debe asegurarse de que o seu servidor web poida conectarse a si mesmo. Por tanto, debe ser quen de resolver e conectarse a polo menos un dos seus «trusted_domains» ou ao «overwrite.cli.url». Este fallo pode ser o resultado dunha falta de coincidencia de DNS do servidor ou dunha regra da devasa de saída.",
"Old administration imported certificates" : "Certificados antigos importados pola administración",
"A background job is pending that checks for administration imported SSL certificates. Please check back later." : "Está pendente un traballo en segundo plano que comprobe os certificados SSL importados pola administración. Volva comprobalo máis adiante.",
"There are some administration imported SSL certificates present, that are not used anymore with Nextcloud 21. They can be imported on the command line via \"occ security:certificates:import\" command. Their paths inside the data directory are shown below." : "Hai algúns certificados SSL importados pola administración, que xa non se usan con Nextcloud 21. Pódense importar coa liña de ordes mediante a orde «occ security:certificates:import». As súas rutas dentro do directorio de datos amósanse deseguido.",
@@ -314,9 +313,6 @@ OC.L10N.register(
"Could not check that your web server serves `.well-known` correctly. Please check manually." : "Non foi posíbel comprobar que o seu servidor web serve «.well-known» correctamente. Compróbeo manualmente.",
"Your web server is not properly set up to resolve `.well-known` URLs, failed on:\n`%s`" : "O seu servidor web non está configurado correctamente para resolver os URL «.well-known», fallou en:\n«%s»",
"Your server is correctly configured to serve `.well-known` URLs." : "O seu servidor está configurado correctamente para servir os URL «.well-known».",
- "WOFF2 file loading" : "Cargando o ficheiro WOFF2",
- "Could not check for WOFF2 loading support. Please check manually if your webserver serves `.woff2` files." : "Non foi posíbel comprobar a compatibilidade de carga de WOFF2. Comprobe manualmente se o seu servidor web serve ficheiros «.woff2».",
- "Your web server is not properly set up to deliver .woff2 files. This is typically an issue with the Nginx configuration. For Nextcloud 15 it needs an adjustement to also deliver .woff2 files. Compare your Nginx configuration to the recommended configuration in our documentation." : "O servidor web non está configurado correctamente para fornecer ficheiros .woff2. Isto é un incidente frecuente en configuracións de Nginx. Para Nextcloud 15 necesita un axuste para fornecer ficheiros .woff2. Compare a súa configuración do Nginx coa configuración recomendada na nosa documentación.",
"Profile information" : "Información do perfil",
"Profile picture, full name, email, phone number, address, website, Twitter, organisation, role, headline, biography, and whether your profile is enabled" : "Imaxe de perfil, nome completo, correo-e, número de teléfono, enderezo, sitio web, Twitter, organización, función, título, biografía e se o seu perfil está activado",
"Nextcloud settings" : "Axustes de Nextcloud",
@@ -881,6 +877,7 @@ OC.L10N.register(
"SMTP Username" : "Nome de usuario SMTP",
"To allow this check to run you have to make sure that your webserver can connect to itself. Therefor it must be able to resolve and connect to at least one its `trusted_domains` or the `overwrite.cli.url`." : "Para permitir que esta comprobación se execute, debe asegurarse de que o seu servidor web poida conectarse a si mesmo. Por tanto, debe ser quen de resolver e conectarse a polo menos un dos seus «trusted_domains» ou ao «overwrite.cli.url».",
"Could not check for JavaScript support via any of your `trusted_domains` nor `overwrite.cli.url`. This may be the result of a server-side DNS mismatch or outbound firewall rule. Please check manually if your webserver serves `.mjs` files using the JavaScript MIME type." : "Non foi posíbel comprobar a compatibilidade de JavaScript a través de ningún dos seus «trusted_domains» nin «overwrite.cli.url». Isto pode ser o resultado dunha falta de coincidencia de DNS do servidor ou dunha regra da devasa de saída. Comprobe manualmente se o seu servidor web serve ficheiros «.mjs» usando o tipo MIME JavaScript.",
- "Active accounts" : "Contas activas"
+ "Active accounts" : "Contas activas",
+ "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "Para permitir que esta comprobación se execute, debe asegurarse de que o seu servidor web poida conectarse a si mesmo. Por tanto, debe ser quen de resolver e conectarse a polo menos un dos seus «trusted_domains» ou ao «overwrite.cli.url». Este fallo pode ser o resultado dunha falta de coincidencia de DNS do servidor ou dunha regra da devasa de saída."
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/settings/l10n/gl.json b/apps/settings/l10n/gl.json
index 028a9f58de8..7aaec1f9fb7 100644
--- a/apps/settings/l10n/gl.json
+++ b/apps/settings/l10n/gl.json
@@ -135,7 +135,6 @@
"Your remote address could not be determined." : "Non foi posíbel determinar o seu enderezo remoto.",
"Your remote address was identified as \"%s\" and is brute-force throttled at the moment slowing down the performance of various requests. If the remote address is not your address this can be an indication that a proxy is not configured correctly." : "O seu enderezo remoto foi identificado como «%s» e neste momento está estrangulado por forza bruta, o que reduce o rendemento de varias solicitudes. Se o enderezo remoto non é o seu enderezo, isto pode ser unha indicación de que un proxy non está configurado correctamente.",
"Your remote address \"%s\" is not brute-force throttled." : "O seu enderezo remoto «%s» non está estrangulado por forza bruta.",
- "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "Para permitir que esta comprobación se execute, debe asegurarse de que o seu servidor web poida conectarse a si mesmo. Por tanto, debe ser quen de resolver e conectarse a polo menos un dos seus «trusted_domains» ou ao «overwrite.cli.url». Este fallo pode ser o resultado dunha falta de coincidencia de DNS do servidor ou dunha regra da devasa de saída.",
"Old administration imported certificates" : "Certificados antigos importados pola administración",
"A background job is pending that checks for administration imported SSL certificates. Please check back later." : "Está pendente un traballo en segundo plano que comprobe os certificados SSL importados pola administración. Volva comprobalo máis adiante.",
"There are some administration imported SSL certificates present, that are not used anymore with Nextcloud 21. They can be imported on the command line via \"occ security:certificates:import\" command. Their paths inside the data directory are shown below." : "Hai algúns certificados SSL importados pola administración, que xa non se usan con Nextcloud 21. Pódense importar coa liña de ordes mediante a orde «occ security:certificates:import». As súas rutas dentro do directorio de datos amósanse deseguido.",
@@ -312,9 +311,6 @@
"Could not check that your web server serves `.well-known` correctly. Please check manually." : "Non foi posíbel comprobar que o seu servidor web serve «.well-known» correctamente. Compróbeo manualmente.",
"Your web server is not properly set up to resolve `.well-known` URLs, failed on:\n`%s`" : "O seu servidor web non está configurado correctamente para resolver os URL «.well-known», fallou en:\n«%s»",
"Your server is correctly configured to serve `.well-known` URLs." : "O seu servidor está configurado correctamente para servir os URL «.well-known».",
- "WOFF2 file loading" : "Cargando o ficheiro WOFF2",
- "Could not check for WOFF2 loading support. Please check manually if your webserver serves `.woff2` files." : "Non foi posíbel comprobar a compatibilidade de carga de WOFF2. Comprobe manualmente se o seu servidor web serve ficheiros «.woff2».",
- "Your web server is not properly set up to deliver .woff2 files. This is typically an issue with the Nginx configuration. For Nextcloud 15 it needs an adjustement to also deliver .woff2 files. Compare your Nginx configuration to the recommended configuration in our documentation." : "O servidor web non está configurado correctamente para fornecer ficheiros .woff2. Isto é un incidente frecuente en configuracións de Nginx. Para Nextcloud 15 necesita un axuste para fornecer ficheiros .woff2. Compare a súa configuración do Nginx coa configuración recomendada na nosa documentación.",
"Profile information" : "Información do perfil",
"Profile picture, full name, email, phone number, address, website, Twitter, organisation, role, headline, biography, and whether your profile is enabled" : "Imaxe de perfil, nome completo, correo-e, número de teléfono, enderezo, sitio web, Twitter, organización, función, título, biografía e se o seu perfil está activado",
"Nextcloud settings" : "Axustes de Nextcloud",
@@ -879,6 +875,7 @@
"SMTP Username" : "Nome de usuario SMTP",
"To allow this check to run you have to make sure that your webserver can connect to itself. Therefor it must be able to resolve and connect to at least one its `trusted_domains` or the `overwrite.cli.url`." : "Para permitir que esta comprobación se execute, debe asegurarse de que o seu servidor web poida conectarse a si mesmo. Por tanto, debe ser quen de resolver e conectarse a polo menos un dos seus «trusted_domains» ou ao «overwrite.cli.url».",
"Could not check for JavaScript support via any of your `trusted_domains` nor `overwrite.cli.url`. This may be the result of a server-side DNS mismatch or outbound firewall rule. Please check manually if your webserver serves `.mjs` files using the JavaScript MIME type." : "Non foi posíbel comprobar a compatibilidade de JavaScript a través de ningún dos seus «trusted_domains» nin «overwrite.cli.url». Isto pode ser o resultado dunha falta de coincidencia de DNS do servidor ou dunha regra da devasa de saída. Comprobe manualmente se o seu servidor web serve ficheiros «.mjs» usando o tipo MIME JavaScript.",
- "Active accounts" : "Contas activas"
+ "Active accounts" : "Contas activas",
+ "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "Para permitir que esta comprobación se execute, debe asegurarse de que o seu servidor web poida conectarse a si mesmo. Por tanto, debe ser quen de resolver e conectarse a polo menos un dos seus «trusted_domains» ou ao «overwrite.cli.url». Este fallo pode ser o resultado dunha falta de coincidencia de DNS do servidor ou dunha regra da devasa de saída."
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/settings/l10n/ja.js b/apps/settings/l10n/ja.js
index 41f8a25976c..dde1127858d 100644
--- a/apps/settings/l10n/ja.js
+++ b/apps/settings/l10n/ja.js
@@ -137,7 +137,6 @@ OC.L10N.register(
"Your remote address could not be determined." : "リモートアドレスを特定できませんでした。",
"Your remote address was identified as \"%s\" and is brute-force throttled at the moment slowing down the performance of various requests. If the remote address is not your address this can be an indication that a proxy is not configured correctly." : "あなたの接続アドレスが\"%s\"として識別され、現在ブルートフォース対策制限が適用されているため、さまざまなリクエストのパフォーマンスが低下しています。接続アドレスがあなたのアドレスでない場合、プロキシが正しく設定されていない可能性があります。",
"Your remote address \"%s\" is not brute-force throttled." : "リモートアドレス \"%s\" はブルートフォース対策制限がされていません。",
- "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "このチェックを実行させるには、Webサーバーが自分自身に接続できることを確認しなければならない。そのため、少なくとも一つの `trusted_domains` または `overwrite.cli.url` を解決して接続できなければなりません。この失敗は、サーバ側のDNSの不一致やアウトバウンドファイアウォールルールの結果かもしれません。",
"Old administration imported certificates" : "旧管理者がインポートした証明書",
"A background job is pending that checks for administration imported SSL certificates. Please check back later." : "管理者がインポートしたSSL証明書をチェックするバックグラウンドジョブが保留中です。しばらくして再度確認してください。",
"There are some administration imported SSL certificates present, that are not used anymore with Nextcloud 21. They can be imported on the command line via \"occ security:certificates:import\" command. Their paths inside the data directory are shown below." : "管理用にインポートしたSSL証明書がいくつか存在しますが、Nextcloud 21 ではもう使用されていません。これらの証明書は、\"occ security:certificates:import\" コマンドを使用してコマンドラインでインポートすることができます。これらの証明書のデータディレクトリ内のパスは以下のとおりです。",
@@ -314,9 +313,6 @@ OC.L10N.register(
"Could not check that your web server serves `.well-known` correctly. Please check manually." : "ウェブサーバが `.well-known` を正しく提供しているか確認できませんでした。手動で確認してください。",
"Your web server is not properly set up to resolve `.well-known` URLs, failed on:\n`%s`" : "ウェブサーバが `.well-known` URL を正しく解決できるように設定されていません。失敗箇所:\n`%s`",
"Your server is correctly configured to serve `.well-known` URLs." : "サーバーは `.well-known` URL を提供するように正しく構成されています。",
- "WOFF2 file loading" : "WOFF2 ファイルの読み込み",
- "Could not check for WOFF2 loading support. Please check manually if your webserver serves `.woff2` files." : "WOFF2 の読み込みサポートを確認できませんでした。お使いのウェブサーバが .woff2 ファイルを提供しているかどうかを手動で確認してください。",
- "Your web server is not properly set up to deliver .woff2 files. This is typically an issue with the Nginx configuration. For Nextcloud 15 it needs an adjustement to also deliver .woff2 files. Compare your Nginx configuration to the recommended configuration in our documentation." : "お使いのウェブサーバは .woff2 ファイルを正しく配信するように設定されていません。これは通常Nginxの設定に問題があります。Nextcloud 15では、.woff2 ファイルも配信するように調整する必要があります。ドキュメント内の推奨されるNginx設定と比較してください。",
"Profile information" : "プロフィール情報",
"Profile picture, full name, email, phone number, address, website, Twitter, organisation, role, headline, biography, and whether your profile is enabled" : "プロフィール写真、氏名、メールアドレス、電話番号、住所、Webサイト、Twitter、組織、役職、ヘッドライン、自己紹介が有効かどうか",
"Nextcloud settings" : "Nextcloud の設定",
@@ -881,6 +877,7 @@ OC.L10N.register(
"SMTP Username" : "SMTPユーザー名",
"To allow this check to run you have to make sure that your webserver can connect to itself. Therefor it must be able to resolve and connect to at least one its `trusted_domains` or the `overwrite.cli.url`." : "このチェックを実行させるには、ウェブサーバが自分自身に接続できることを確認する必要があります。したがって、少なくとも `trusted_domains` または `overwrite.cli.url` を解決して接続できなければなりません。",
"Could not check for JavaScript support via any of your `trusted_domains` nor `overwrite.cli.url`. This may be the result of a server-side DNS mismatch or outbound firewall rule. Please check manually if your webserver serves `.mjs` files using the JavaScript MIME type." : "`trusted_domains` または `overwrite.cli.url` で JavaScript のサポートを確認できませんでした。これはサーバ側の DNS の不一致か、アウトバウンドファイアウォールルールの結果である可能性があります。お使いのウェブサーバーが JavaScript MIMEタイプを使用して `.mjs` ファイルを提供しているかどうかを手動で確認してください。",
- "Active accounts" : "アクティブなアカウント"
+ "Active accounts" : "アクティブなアカウント",
+ "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "このチェックを実行させるには、Webサーバーが自分自身に接続できることを確認しなければならない。そのため、少なくとも一つの `trusted_domains` または `overwrite.cli.url` を解決して接続できなければなりません。この失敗は、サーバ側のDNSの不一致やアウトバウンドファイアウォールルールの結果かもしれません。"
},
"nplurals=1; plural=0;");
diff --git a/apps/settings/l10n/ja.json b/apps/settings/l10n/ja.json
index 8bd71fa4015..43204f2f4cf 100644
--- a/apps/settings/l10n/ja.json
+++ b/apps/settings/l10n/ja.json
@@ -135,7 +135,6 @@
"Your remote address could not be determined." : "リモートアドレスを特定できませんでした。",
"Your remote address was identified as \"%s\" and is brute-force throttled at the moment slowing down the performance of various requests. If the remote address is not your address this can be an indication that a proxy is not configured correctly." : "あなたの接続アドレスが\"%s\"として識別され、現在ブルートフォース対策制限が適用されているため、さまざまなリクエストのパフォーマンスが低下しています。接続アドレスがあなたのアドレスでない場合、プロキシが正しく設定されていない可能性があります。",
"Your remote address \"%s\" is not brute-force throttled." : "リモートアドレス \"%s\" はブルートフォース対策制限がされていません。",
- "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "このチェックを実行させるには、Webサーバーが自分自身に接続できることを確認しなければならない。そのため、少なくとも一つの `trusted_domains` または `overwrite.cli.url` を解決して接続できなければなりません。この失敗は、サーバ側のDNSの不一致やアウトバウンドファイアウォールルールの結果かもしれません。",
"Old administration imported certificates" : "旧管理者がインポートした証明書",
"A background job is pending that checks for administration imported SSL certificates. Please check back later." : "管理者がインポートしたSSL証明書をチェックするバックグラウンドジョブが保留中です。しばらくして再度確認してください。",
"There are some administration imported SSL certificates present, that are not used anymore with Nextcloud 21. They can be imported on the command line via \"occ security:certificates:import\" command. Their paths inside the data directory are shown below." : "管理用にインポートしたSSL証明書がいくつか存在しますが、Nextcloud 21 ではもう使用されていません。これらの証明書は、\"occ security:certificates:import\" コマンドを使用してコマンドラインでインポートすることができます。これらの証明書のデータディレクトリ内のパスは以下のとおりです。",
@@ -312,9 +311,6 @@
"Could not check that your web server serves `.well-known` correctly. Please check manually." : "ウェブサーバが `.well-known` を正しく提供しているか確認できませんでした。手動で確認してください。",
"Your web server is not properly set up to resolve `.well-known` URLs, failed on:\n`%s`" : "ウェブサーバが `.well-known` URL を正しく解決できるように設定されていません。失敗箇所:\n`%s`",
"Your server is correctly configured to serve `.well-known` URLs." : "サーバーは `.well-known` URL を提供するように正しく構成されています。",
- "WOFF2 file loading" : "WOFF2 ファイルの読み込み",
- "Could not check for WOFF2 loading support. Please check manually if your webserver serves `.woff2` files." : "WOFF2 の読み込みサポートを確認できませんでした。お使いのウェブサーバが .woff2 ファイルを提供しているかどうかを手動で確認してください。",
- "Your web server is not properly set up to deliver .woff2 files. This is typically an issue with the Nginx configuration. For Nextcloud 15 it needs an adjustement to also deliver .woff2 files. Compare your Nginx configuration to the recommended configuration in our documentation." : "お使いのウェブサーバは .woff2 ファイルを正しく配信するように設定されていません。これは通常Nginxの設定に問題があります。Nextcloud 15では、.woff2 ファイルも配信するように調整する必要があります。ドキュメント内の推奨されるNginx設定と比較してください。",
"Profile information" : "プロフィール情報",
"Profile picture, full name, email, phone number, address, website, Twitter, organisation, role, headline, biography, and whether your profile is enabled" : "プロフィール写真、氏名、メールアドレス、電話番号、住所、Webサイト、Twitter、組織、役職、ヘッドライン、自己紹介が有効かどうか",
"Nextcloud settings" : "Nextcloud の設定",
@@ -879,6 +875,7 @@
"SMTP Username" : "SMTPユーザー名",
"To allow this check to run you have to make sure that your webserver can connect to itself. Therefor it must be able to resolve and connect to at least one its `trusted_domains` or the `overwrite.cli.url`." : "このチェックを実行させるには、ウェブサーバが自分自身に接続できることを確認する必要があります。したがって、少なくとも `trusted_domains` または `overwrite.cli.url` を解決して接続できなければなりません。",
"Could not check for JavaScript support via any of your `trusted_domains` nor `overwrite.cli.url`. This may be the result of a server-side DNS mismatch or outbound firewall rule. Please check manually if your webserver serves `.mjs` files using the JavaScript MIME type." : "`trusted_domains` または `overwrite.cli.url` で JavaScript のサポートを確認できませんでした。これはサーバ側の DNS の不一致か、アウトバウンドファイアウォールルールの結果である可能性があります。お使いのウェブサーバーが JavaScript MIMEタイプを使用して `.mjs` ファイルを提供しているかどうかを手動で確認してください。",
- "Active accounts" : "アクティブなアカウント"
+ "Active accounts" : "アクティブなアカウント",
+ "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "このチェックを実行させるには、Webサーバーが自分自身に接続できることを確認しなければならない。そのため、少なくとも一つの `trusted_domains` または `overwrite.cli.url` を解決して接続できなければなりません。この失敗は、サーバ側のDNSの不一致やアウトバウンドファイアウォールルールの結果かもしれません。"
},"pluralForm" :"nplurals=1; plural=0;"
} \ No newline at end of file
diff --git a/apps/settings/l10n/nb.js b/apps/settings/l10n/nb.js
index 50504274f37..11457f54b5e 100644
--- a/apps/settings/l10n/nb.js
+++ b/apps/settings/l10n/nb.js
@@ -137,7 +137,6 @@ OC.L10N.register(
"Your remote address could not be determined." : "Den eksterne adressen din kunne ikke fastslås.",
"Your remote address was identified as \"%s\" and is brute-force throttled at the moment slowing down the performance of various requests. If the remote address is not your address this can be an indication that a proxy is not configured correctly." : "Din eksterne adresse ble identifisert som \"%s\" og er rå makt-strupet for øyeblikket, noe som reduserer ytelsen til forskjellige forespørsler. Hvis den eksterne adressen ikke er adressen din, kan dette være en indikasjon på at en proxy ikke er riktig konfigurert.",
"Your remote address \"%s\" is not brute-force throttled." : "Din eksterne adresse \"%s\" er ikke rå makt-strupet.",
- "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "For å la denne kontrollen kjøre, må du sørge for at webserveren din kan koble til seg selv. Derfor må den kunne løse og koble til minst en dens 'trusted_domains' eller 'overwrite.cli.url'. Denne feilen kan være et resultat av ikke-DNS-samsvar på serversiden eller en regel for utgående brannmur.",
"Old administration imported certificates" : "Gamle administrasjonsimporterte sertifikater",
"A background job is pending that checks for administration imported SSL certificates. Please check back later." : "Det venter en bakgrunnsjobb som ser etter administrasjonsimporterte SSL-sertifikater. Kom tilbake senere.",
"There are some administration imported SSL certificates present, that are not used anymore with Nextcloud 21. They can be imported on the command line via \"occ security:certificates:import\" command. Their paths inside the data directory are shown below." : "Det er noen administrasjonsimporterte SSL-sertifikater til stede, som ikke brukes lenger med Nextcloud 21. De kan importeres på kommandolinjen via kommandoen \"occ security:certificates:import\". Stiene deres i datakatalogen vises nedenfor.",
@@ -314,9 +313,6 @@ OC.L10N.register(
"Could not check that your web server serves `.well-known` correctly. Please check manually." : "Kunne ikke sjekke at webserveren din betjener '.well-known' riktig. Vennligst sjekk manuelt.",
"Your web server is not properly set up to resolve `.well-known` URLs, failed on:\n`%s`" : "Webserveren er ikke riktig konfigurert til å løse problemet `.well-known` URL-er, feilet på:\n`%s`",
"Your server is correctly configured to serve `.well-known` URLs." : "Serveren din er riktig konfigurert til å betjene `.well-known` URL-er.",
- "WOFF2 file loading" : "WOFF2-fillasting",
- "Could not check for WOFF2 loading support. Please check manually if your webserver serves `.woff2` files." : "Kunne ikke se etter WOFF2-lastestøtte. Kontroller manuelt om webserveren din serverer '.woff2'-filer.",
- "Your web server is not properly set up to deliver .woff2 files. This is typically an issue with the Nginx configuration. For Nextcloud 15 it needs an adjustement to also deliver .woff2 files. Compare your Nginx configuration to the recommended configuration in our documentation." : "Nettserveren din er ikke riktig konfigurert til å levere .woff2-filer. Dette er vanligvis et problem med Nginx-konfigurasjonen. For Nextcloud 15 trenger den en justering for også å levere .woff2-filer. Sammenlign Nginx-konfigurasjonen din med den anbefalte konfigurasjonen i dokumentasjonen vår.",
"Profile information" : "Profil-informasjon",
"Profile picture, full name, email, phone number, address, website, Twitter, organisation, role, headline, biography, and whether your profile is enabled" : "Profilbilde, fullt navn, e-post, telefonnummer, adresse, nettsted, Twitter, organisasjon, rolle, overskrift, biografi og om profilen din er aktivert",
"Nextcloud settings" : "Nextcloud innstillinger",
@@ -880,6 +876,7 @@ OC.L10N.register(
"SMTP Username" : "SMTP-brukernavn",
"To allow this check to run you have to make sure that your webserver can connect to itself. Therefor it must be able to resolve and connect to at least one its `trusted_domains` or the `overwrite.cli.url`." : "For å la denne kontrollen kjøre, må du sørge for at webserveren din kan koble til seg selv. Derfor må den kunne løse og koble til minst en sin 'trusted_domains' eller 'overwrite.cli.url'.",
"Could not check for JavaScript support via any of your `trusted_domains` nor `overwrite.cli.url`. This may be the result of a server-side DNS mismatch or outbound firewall rule. Please check manually if your webserver serves `.mjs` files using the JavaScript MIME type." : "Kunne ikke se etter JavaScript-støtte via noen av dine 'trusted_domains' eller 'overwrite.cli.url'. Dette kan være et resultat av DNS-avvik på serversiden eller en regel for utgående brannmur. Kontroller manuelt om webserveren din tjener .mjs-filer ved hjelp av JavaScript MIME-typen.",
- "Active accounts" : "Aktive kontoer"
+ "Active accounts" : "Aktive kontoer",
+ "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "For å la denne kontrollen kjøre, må du sørge for at webserveren din kan koble til seg selv. Derfor må den kunne løse og koble til minst en dens 'trusted_domains' eller 'overwrite.cli.url'. Denne feilen kan være et resultat av ikke-DNS-samsvar på serversiden eller en regel for utgående brannmur."
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/settings/l10n/nb.json b/apps/settings/l10n/nb.json
index 7df48d2c714..eed93c6ce2b 100644
--- a/apps/settings/l10n/nb.json
+++ b/apps/settings/l10n/nb.json
@@ -135,7 +135,6 @@
"Your remote address could not be determined." : "Den eksterne adressen din kunne ikke fastslås.",
"Your remote address was identified as \"%s\" and is brute-force throttled at the moment slowing down the performance of various requests. If the remote address is not your address this can be an indication that a proxy is not configured correctly." : "Din eksterne adresse ble identifisert som \"%s\" og er rå makt-strupet for øyeblikket, noe som reduserer ytelsen til forskjellige forespørsler. Hvis den eksterne adressen ikke er adressen din, kan dette være en indikasjon på at en proxy ikke er riktig konfigurert.",
"Your remote address \"%s\" is not brute-force throttled." : "Din eksterne adresse \"%s\" er ikke rå makt-strupet.",
- "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "For å la denne kontrollen kjøre, må du sørge for at webserveren din kan koble til seg selv. Derfor må den kunne løse og koble til minst en dens 'trusted_domains' eller 'overwrite.cli.url'. Denne feilen kan være et resultat av ikke-DNS-samsvar på serversiden eller en regel for utgående brannmur.",
"Old administration imported certificates" : "Gamle administrasjonsimporterte sertifikater",
"A background job is pending that checks for administration imported SSL certificates. Please check back later." : "Det venter en bakgrunnsjobb som ser etter administrasjonsimporterte SSL-sertifikater. Kom tilbake senere.",
"There are some administration imported SSL certificates present, that are not used anymore with Nextcloud 21. They can be imported on the command line via \"occ security:certificates:import\" command. Their paths inside the data directory are shown below." : "Det er noen administrasjonsimporterte SSL-sertifikater til stede, som ikke brukes lenger med Nextcloud 21. De kan importeres på kommandolinjen via kommandoen \"occ security:certificates:import\". Stiene deres i datakatalogen vises nedenfor.",
@@ -312,9 +311,6 @@
"Could not check that your web server serves `.well-known` correctly. Please check manually." : "Kunne ikke sjekke at webserveren din betjener '.well-known' riktig. Vennligst sjekk manuelt.",
"Your web server is not properly set up to resolve `.well-known` URLs, failed on:\n`%s`" : "Webserveren er ikke riktig konfigurert til å løse problemet `.well-known` URL-er, feilet på:\n`%s`",
"Your server is correctly configured to serve `.well-known` URLs." : "Serveren din er riktig konfigurert til å betjene `.well-known` URL-er.",
- "WOFF2 file loading" : "WOFF2-fillasting",
- "Could not check for WOFF2 loading support. Please check manually if your webserver serves `.woff2` files." : "Kunne ikke se etter WOFF2-lastestøtte. Kontroller manuelt om webserveren din serverer '.woff2'-filer.",
- "Your web server is not properly set up to deliver .woff2 files. This is typically an issue with the Nginx configuration. For Nextcloud 15 it needs an adjustement to also deliver .woff2 files. Compare your Nginx configuration to the recommended configuration in our documentation." : "Nettserveren din er ikke riktig konfigurert til å levere .woff2-filer. Dette er vanligvis et problem med Nginx-konfigurasjonen. For Nextcloud 15 trenger den en justering for også å levere .woff2-filer. Sammenlign Nginx-konfigurasjonen din med den anbefalte konfigurasjonen i dokumentasjonen vår.",
"Profile information" : "Profil-informasjon",
"Profile picture, full name, email, phone number, address, website, Twitter, organisation, role, headline, biography, and whether your profile is enabled" : "Profilbilde, fullt navn, e-post, telefonnummer, adresse, nettsted, Twitter, organisasjon, rolle, overskrift, biografi og om profilen din er aktivert",
"Nextcloud settings" : "Nextcloud innstillinger",
@@ -878,6 +874,7 @@
"SMTP Username" : "SMTP-brukernavn",
"To allow this check to run you have to make sure that your webserver can connect to itself. Therefor it must be able to resolve and connect to at least one its `trusted_domains` or the `overwrite.cli.url`." : "For å la denne kontrollen kjøre, må du sørge for at webserveren din kan koble til seg selv. Derfor må den kunne løse og koble til minst en sin 'trusted_domains' eller 'overwrite.cli.url'.",
"Could not check for JavaScript support via any of your `trusted_domains` nor `overwrite.cli.url`. This may be the result of a server-side DNS mismatch or outbound firewall rule. Please check manually if your webserver serves `.mjs` files using the JavaScript MIME type." : "Kunne ikke se etter JavaScript-støtte via noen av dine 'trusted_domains' eller 'overwrite.cli.url'. Dette kan være et resultat av DNS-avvik på serversiden eller en regel for utgående brannmur. Kontroller manuelt om webserveren din tjener .mjs-filer ved hjelp av JavaScript MIME-typen.",
- "Active accounts" : "Aktive kontoer"
+ "Active accounts" : "Aktive kontoer",
+ "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "For å la denne kontrollen kjøre, må du sørge for at webserveren din kan koble til seg selv. Derfor må den kunne løse og koble til minst en dens 'trusted_domains' eller 'overwrite.cli.url'. Denne feilen kan være et resultat av ikke-DNS-samsvar på serversiden eller en regel for utgående brannmur."
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/settings/l10n/pl.js b/apps/settings/l10n/pl.js
index 281cd6c2495..e1c41b29ad0 100644
--- a/apps/settings/l10n/pl.js
+++ b/apps/settings/l10n/pl.js
@@ -211,8 +211,6 @@ OC.L10N.register(
"Your database does not run with \"READ COMMITTED\" transaction isolation level. This can cause problems when multiple actions are executed in parallel." : "Baza danych nie działa z poziomem izolacji transakcji \"READ COMMITTED\". Może to powodować problemy, gdy wiele akcji jest wykonywanych równolegle.",
"Was not able to get transaction isolation level: %s" : "Nie udało się uzyskać poziomu izolacji transakcji: %s",
"Could not check that your web server serves `.well-known` correctly. Please check manually." : "Nie można sprawdzić, czy Twój serwer WWW poprawnie obsługuje `.well-known`. Sprawdź ręcznie.",
- "Could not check for WOFF2 loading support. Please check manually if your webserver serves `.woff2` files." : "Nie można sprawdzić obsługi wczytywania WOFF2. Sprawdź ręcznie, czy Twój serwer WWW obsługuje pliki `.woff2`.",
- "Your web server is not properly set up to deliver .woff2 files. This is typically an issue with the Nginx configuration. For Nextcloud 15 it needs an adjustement to also deliver .woff2 files. Compare your Nginx configuration to the recommended configuration in our documentation." : "Twój serwer WWW nie został poprawnie skonfigurowany do dostarczania plików .woff2. Zazwyczaj jest to problem z konfiguracją Nginx. Dla Nextcloud 15 wymagane jest dostosowanie jej, aby dostarczać pliki .woff2. Porównaj swoją konfigurację Nginx z zalecaną konfiguracją w naszej dokumentacji.",
"Profile information" : "Informacje o profilu",
"Profile picture, full name, email, phone number, address, website, Twitter, organisation, role, headline, biography, and whether your profile is enabled" : "Zdjęcie profilowe, imię i nazwisko, adres e-mail, numer telefonu, adres, witryna internetowa, Twitter, organizacja, rola, nagłówek, biografia i czy Twój profil jest włączony",
"Nextcloud settings" : "Ustawienia Nextcloud",
diff --git a/apps/settings/l10n/pl.json b/apps/settings/l10n/pl.json
index 40308cc67d1..889adedc551 100644
--- a/apps/settings/l10n/pl.json
+++ b/apps/settings/l10n/pl.json
@@ -209,8 +209,6 @@
"Your database does not run with \"READ COMMITTED\" transaction isolation level. This can cause problems when multiple actions are executed in parallel." : "Baza danych nie działa z poziomem izolacji transakcji \"READ COMMITTED\". Może to powodować problemy, gdy wiele akcji jest wykonywanych równolegle.",
"Was not able to get transaction isolation level: %s" : "Nie udało się uzyskać poziomu izolacji transakcji: %s",
"Could not check that your web server serves `.well-known` correctly. Please check manually." : "Nie można sprawdzić, czy Twój serwer WWW poprawnie obsługuje `.well-known`. Sprawdź ręcznie.",
- "Could not check for WOFF2 loading support. Please check manually if your webserver serves `.woff2` files." : "Nie można sprawdzić obsługi wczytywania WOFF2. Sprawdź ręcznie, czy Twój serwer WWW obsługuje pliki `.woff2`.",
- "Your web server is not properly set up to deliver .woff2 files. This is typically an issue with the Nginx configuration. For Nextcloud 15 it needs an adjustement to also deliver .woff2 files. Compare your Nginx configuration to the recommended configuration in our documentation." : "Twój serwer WWW nie został poprawnie skonfigurowany do dostarczania plików .woff2. Zazwyczaj jest to problem z konfiguracją Nginx. Dla Nextcloud 15 wymagane jest dostosowanie jej, aby dostarczać pliki .woff2. Porównaj swoją konfigurację Nginx z zalecaną konfiguracją w naszej dokumentacji.",
"Profile information" : "Informacje o profilu",
"Profile picture, full name, email, phone number, address, website, Twitter, organisation, role, headline, biography, and whether your profile is enabled" : "Zdjęcie profilowe, imię i nazwisko, adres e-mail, numer telefonu, adres, witryna internetowa, Twitter, organizacja, rola, nagłówek, biografia i czy Twój profil jest włączony",
"Nextcloud settings" : "Ustawienia Nextcloud",
diff --git a/apps/settings/l10n/pt_BR.js b/apps/settings/l10n/pt_BR.js
index ff011f733a0..4c562227f3c 100644
--- a/apps/settings/l10n/pt_BR.js
+++ b/apps/settings/l10n/pt_BR.js
@@ -137,7 +137,6 @@ OC.L10N.register(
"Your remote address could not be determined." : "Seu endereço remoto não pode ser determinado.",
"Your remote address was identified as \"%s\" and is brute-force throttled at the moment slowing down the performance of various requests. If the remote address is not your address this can be an indication that a proxy is not configured correctly." : "Seu endereço remoto foi identificado como \"%s\" e está sendo limitado por força bruta no momento, diminuindo o desempenho de diversas solicitações. Se o endereço remoto não for o seu, isso pode ser uma indicação de que um proxy não está configurado corretamente.",
"Your remote address \"%s\" is not brute-force throttled." : "Seu endereço remoto \"%s\" não é limitado por força bruta.",
- "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "Para permitir que esta verificação seja executada, você deve certificar-se de que seu servidor Web pode se conectar a si mesmo. Portanto, ele deve ser capaz de resolver e conectar-se a pelo menos um de seus `trusted_domains` ou `overwrite.cli.url`. Essa falha pode ser o resultado de uma incompatibilidade de DNS no servidor ou de uma regra de firewall de saída.",
"Old administration imported certificates" : "Certificados importados da administração antiga",
"A background job is pending that checks for administration imported SSL certificates. Please check back later." : "Há um trabalho em segundo plano pendente que verifica os certificados SSL importados para administração. Por favor, verifique novamente mais tarde.",
"There are some administration imported SSL certificates present, that are not used anymore with Nextcloud 21. They can be imported on the command line via \"occ security:certificates:import\" command. Their paths inside the data directory are shown below." : "Existem alguns certificados SSL importados de administração presentes, que não são mais usados no Nextcloud 21. Eles podem ser importados na linha de comando via comando \"occ security:certificates:import\". Seus caminhos dentro do diretório de dados são mostrados abaixo.",
@@ -314,9 +313,6 @@ OC.L10N.register(
"Could not check that your web server serves `.well-known` correctly. Please check manually." : "Não foi possível verificar se o seu servidor web serve `.well-known` corretamente. Verifique manualmente.",
"Your web server is not properly set up to resolve `.well-known` URLs, failed on:\n`%s`" : "Seu servidor web não está configurado corretamente para resolver URLs `.well-known`, falhou em:\n`%s`",
"Your server is correctly configured to serve `.well-known` URLs." : "Seu servidor está configurado corretamente para servir URLs `.bem conhecidos`.",
- "WOFF2 file loading" : "Carregando arquivo WOFF2",
- "Could not check for WOFF2 loading support. Please check manually if your webserver serves `.woff2` files." : "Não foi possível verificar o suporte de carregamento do WOFF2. Por favor, verifique manualmente se o seu servidor web serve arquivos `.woff2`.",
- "Your web server is not properly set up to deliver .woff2 files. This is typically an issue with the Nginx configuration. For Nextcloud 15 it needs an adjustement to also deliver .woff2 files. Compare your Nginx configuration to the recommended configuration in our documentation." : "Seu servidor web não está configurado corretamente para entregar arquivos .woff2. Normalmente, isso é um problema com a configuração do Nginx. Para Nextcloud 15 é necessário um ajuste para entregar também arquivos .woff2. Compare sua configuração do Nginx com a configuração recomendada em nossa documentação.",
"Profile information" : "Informação do Perfil",
"Profile picture, full name, email, phone number, address, website, Twitter, organisation, role, headline, biography, and whether your profile is enabled" : "Foto do perfil, nome completo, e-mail, número de telefone, endereço, site, Twitter, organização, função, título, biografia e se seu perfil está ativado",
"Nextcloud settings" : "Configurações Nextcloud",
@@ -881,6 +877,7 @@ OC.L10N.register(
"SMTP Username" : "Nome do Usuário SMTP",
"To allow this check to run you have to make sure that your webserver can connect to itself. Therefor it must be able to resolve and connect to at least one its `trusted_domains` or the `overwrite.cli.url`." : "Para permitir que esta verificação seja executada, você deve garantir que seu servidor web possa se conectar a si mesmo. Portanto, ele deve ser capaz de resolver e se conectar a pelo menos um de seus `trusted_domains` ou ao `overwrite.cli.url`.",
"Could not check for JavaScript support via any of your `trusted_domains` nor `overwrite.cli.url`. This may be the result of a server-side DNS mismatch or outbound firewall rule. Please check manually if your webserver serves `.mjs` files using the JavaScript MIME type." : "Não foi possível verificar o suporte a JavaScript por meio de nenhum dos seus `trusted_domains` nem `overwrite.cli.url`. Isso pode ser o resultado de uma incompatibilidade de DNS no servidor ou de uma regra de firewall de saída. Verifique manualmente se o seu servidor web serve arquivos `.mjs` usando o tipo JavaScript MIME.",
- "Active accounts" : "Contas ativas"
+ "Active accounts" : "Contas ativas",
+ "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "Para permitir que esta verificação seja executada, você deve certificar-se de que seu servidor Web pode se conectar a si mesmo. Portanto, ele deve ser capaz de resolver e conectar-se a pelo menos um de seus `trusted_domains` ou `overwrite.cli.url`. Essa falha pode ser o resultado de uma incompatibilidade de DNS no servidor ou de uma regra de firewall de saída."
},
"nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;");
diff --git a/apps/settings/l10n/pt_BR.json b/apps/settings/l10n/pt_BR.json
index c6dbca7bd3d..46e46d7a719 100644
--- a/apps/settings/l10n/pt_BR.json
+++ b/apps/settings/l10n/pt_BR.json
@@ -135,7 +135,6 @@
"Your remote address could not be determined." : "Seu endereço remoto não pode ser determinado.",
"Your remote address was identified as \"%s\" and is brute-force throttled at the moment slowing down the performance of various requests. If the remote address is not your address this can be an indication that a proxy is not configured correctly." : "Seu endereço remoto foi identificado como \"%s\" e está sendo limitado por força bruta no momento, diminuindo o desempenho de diversas solicitações. Se o endereço remoto não for o seu, isso pode ser uma indicação de que um proxy não está configurado corretamente.",
"Your remote address \"%s\" is not brute-force throttled." : "Seu endereço remoto \"%s\" não é limitado por força bruta.",
- "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "Para permitir que esta verificação seja executada, você deve certificar-se de que seu servidor Web pode se conectar a si mesmo. Portanto, ele deve ser capaz de resolver e conectar-se a pelo menos um de seus `trusted_domains` ou `overwrite.cli.url`. Essa falha pode ser o resultado de uma incompatibilidade de DNS no servidor ou de uma regra de firewall de saída.",
"Old administration imported certificates" : "Certificados importados da administração antiga",
"A background job is pending that checks for administration imported SSL certificates. Please check back later." : "Há um trabalho em segundo plano pendente que verifica os certificados SSL importados para administração. Por favor, verifique novamente mais tarde.",
"There are some administration imported SSL certificates present, that are not used anymore with Nextcloud 21. They can be imported on the command line via \"occ security:certificates:import\" command. Their paths inside the data directory are shown below." : "Existem alguns certificados SSL importados de administração presentes, que não são mais usados no Nextcloud 21. Eles podem ser importados na linha de comando via comando \"occ security:certificates:import\". Seus caminhos dentro do diretório de dados são mostrados abaixo.",
@@ -312,9 +311,6 @@
"Could not check that your web server serves `.well-known` correctly. Please check manually." : "Não foi possível verificar se o seu servidor web serve `.well-known` corretamente. Verifique manualmente.",
"Your web server is not properly set up to resolve `.well-known` URLs, failed on:\n`%s`" : "Seu servidor web não está configurado corretamente para resolver URLs `.well-known`, falhou em:\n`%s`",
"Your server is correctly configured to serve `.well-known` URLs." : "Seu servidor está configurado corretamente para servir URLs `.bem conhecidos`.",
- "WOFF2 file loading" : "Carregando arquivo WOFF2",
- "Could not check for WOFF2 loading support. Please check manually if your webserver serves `.woff2` files." : "Não foi possível verificar o suporte de carregamento do WOFF2. Por favor, verifique manualmente se o seu servidor web serve arquivos `.woff2`.",
- "Your web server is not properly set up to deliver .woff2 files. This is typically an issue with the Nginx configuration. For Nextcloud 15 it needs an adjustement to also deliver .woff2 files. Compare your Nginx configuration to the recommended configuration in our documentation." : "Seu servidor web não está configurado corretamente para entregar arquivos .woff2. Normalmente, isso é um problema com a configuração do Nginx. Para Nextcloud 15 é necessário um ajuste para entregar também arquivos .woff2. Compare sua configuração do Nginx com a configuração recomendada em nossa documentação.",
"Profile information" : "Informação do Perfil",
"Profile picture, full name, email, phone number, address, website, Twitter, organisation, role, headline, biography, and whether your profile is enabled" : "Foto do perfil, nome completo, e-mail, número de telefone, endereço, site, Twitter, organização, função, título, biografia e se seu perfil está ativado",
"Nextcloud settings" : "Configurações Nextcloud",
@@ -879,6 +875,7 @@
"SMTP Username" : "Nome do Usuário SMTP",
"To allow this check to run you have to make sure that your webserver can connect to itself. Therefor it must be able to resolve and connect to at least one its `trusted_domains` or the `overwrite.cli.url`." : "Para permitir que esta verificação seja executada, você deve garantir que seu servidor web possa se conectar a si mesmo. Portanto, ele deve ser capaz de resolver e se conectar a pelo menos um de seus `trusted_domains` ou ao `overwrite.cli.url`.",
"Could not check for JavaScript support via any of your `trusted_domains` nor `overwrite.cli.url`. This may be the result of a server-side DNS mismatch or outbound firewall rule. Please check manually if your webserver serves `.mjs` files using the JavaScript MIME type." : "Não foi possível verificar o suporte a JavaScript por meio de nenhum dos seus `trusted_domains` nem `overwrite.cli.url`. Isso pode ser o resultado de uma incompatibilidade de DNS no servidor ou de uma regra de firewall de saída. Verifique manualmente se o seu servidor web serve arquivos `.mjs` usando o tipo JavaScript MIME.",
- "Active accounts" : "Contas ativas"
+ "Active accounts" : "Contas ativas",
+ "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "Para permitir que esta verificação seja executada, você deve certificar-se de que seu servidor Web pode se conectar a si mesmo. Portanto, ele deve ser capaz de resolver e conectar-se a pelo menos um de seus `trusted_domains` ou `overwrite.cli.url`. Essa falha pode ser o resultado de uma incompatibilidade de DNS no servidor ou de uma regra de firewall de saída."
},"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/settings/l10n/ru.js b/apps/settings/l10n/ru.js
index 5164443758f..0662f590d5d 100644
--- a/apps/settings/l10n/ru.js
+++ b/apps/settings/l10n/ru.js
@@ -137,7 +137,6 @@ OC.L10N.register(
"Your remote address could not be determined." : "Не удалось определить ваш сетевой адрес.",
"Your remote address was identified as \"%s\" and is brute-force throttled at the moment slowing down the performance of various requests. If the remote address is not your address this can be an indication that a proxy is not configured correctly." : "Ваш IP-адрес был определён как «%s» и в данный момент заблокирован защитой от перебора, что замедляет выполнение различных запросов. Если удаленный адрес не является вашим адресом, это может свидетельствовать о том, что прокси-сервер настроен неправильно.",
"Your remote address \"%s\" is not brute-force throttled." : "Ваш сетевой адрес «%s» не имеет ограничений по частоте ввода паролей.",
- "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "Чтобы разрешить эту проверку, вам нужно убедиться, что ваш веб-сервер может подключаться к себе. Поэтому он должен иметь возможность разрешать и подключаться по крайней мере к одному из своих `trusted_domains` или `overwrite.cli.url`. Эта ошибка может быть результатом несоответствия DNS на стороне сервера или исходящего правила брандмауэра.",
"Old administration imported certificates" : "Сертификаты, импортированные старым пользователем",
"A background job is pending that checks for administration imported SSL certificates. Please check back later." : "Запланировано фоновое задание проверки пользовательских SSL-сертификатов. Пожалуйста, проверьте позже.",
"There are some administration imported SSL certificates present, that are not used anymore with Nextcloud 21. They can be imported on the command line via \"occ security:certificates:import\" command. Their paths inside the data directory are shown below." : "Имеются некоторые импортированные SSL-сертификаты администратора, которые больше не используются в Nextcloud 21. Их можно импортировать в командной строке с помощью команды \"occ security:certificates:import\". Их пути внутри каталога данных показаны ниже.",
@@ -314,9 +313,6 @@ OC.L10N.register(
"Could not check that your web server serves `.well-known` correctly. Please check manually." : "Не удалось проверить, работает ли ваш веб-сервер `.well-known` правильно. Пожалуйста, проверьте вручную.",
"Your web server is not properly set up to resolve `.well-known` URLs, failed on:\n`%s`" : "Ваш веб-сервер неправильно настроен для решения `.well-known` URL-адреса, сбой при:\n`%s`",
"Your server is correctly configured to serve `.well-known` URLs." : "Ваш сервер правильно настроен для обслуживания `.well-known` URL-адреса.",
- "WOFF2 file loading" : "Загрузка файлов WOFF2",
- "Could not check for WOFF2 loading support. Please check manually if your webserver serves `.woff2` files." : "Не удалось проверить, поддерживаются ли файлы формата WOFF2. Проверьте, что веб-сервер обрабатывает файлы с расширением «.woff2».",
- "Your web server is not properly set up to deliver .woff2 files. This is typically an issue with the Nginx configuration. For Nextcloud 15 it needs an adjustement to also deliver .woff2 files. Compare your Nginx configuration to the recommended configuration in our documentation." : "Веб-сервер не настроен должным образом для передачи файлов шрифтов в формате .woff2, что необходимо для правильной работы Nextcloud версии 15. Как правило, это связано с конфигурацией веб-сервера Nginx. Сравните используемую конфигурацию с рекомендуемой конфигурацией из документации.",
"Profile information" : "Сведения о профиле",
"Profile picture, full name, email, phone number, address, website, Twitter, organisation, role, headline, biography, and whether your profile is enabled" : "Изображение профиля, полное имя, адрес электронной почты, номер телефона, адрес, веб-сайт, Twitter, организация, роль, заголовок, биография и сведения том, активен ли профиль",
"Nextcloud settings" : "Параметры Nextcloud",
@@ -880,6 +876,7 @@ OC.L10N.register(
"SMTP Username" : "Пользователь SMTP",
"To allow this check to run you have to make sure that your webserver can connect to itself. Therefor it must be able to resolve and connect to at least one its `trusted_domains` or the `overwrite.cli.url`." : "Чтобы разрешить выполнение этой проверки, вы должны убедиться, что ваш веб-сервер может подключаться к самому себе. Для этого он должен иметь возможность разрешать и подключаться по крайней мере к одному из своих `trusted_domains\" или \"overwrite.cli.url\".",
"Could not check for JavaScript support via any of your `trusted_domains` nor `overwrite.cli.url`. This may be the result of a server-side DNS mismatch or outbound firewall rule. Please check manually if your webserver serves `.mjs` files using the JavaScript MIME type." : "Не удалось проверить поддержку JavaScript ни в одном из ваших `trusted_domains`, ни в `overwrite.cli.url`. Это может быть результатом несоответствия DNS на стороне сервера или правила исходящего брандмауэра. Пожалуйста, проверьте вручную, обслуживает ли ваш веб-сервер файлы `.mjs`, используя MIME-тип JavaScript.",
- "Active accounts" : "Активные учётные записи"
+ "Active accounts" : "Активные учётные записи",
+ "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "Чтобы разрешить эту проверку, вам нужно убедиться, что ваш веб-сервер может подключаться к себе. Поэтому он должен иметь возможность разрешать и подключаться по крайней мере к одному из своих `trusted_domains` или `overwrite.cli.url`. Эта ошибка может быть результатом несоответствия DNS на стороне сервера или исходящего правила брандмауэра."
},
"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/settings/l10n/ru.json b/apps/settings/l10n/ru.json
index c8a19aff24f..a00c874270d 100644
--- a/apps/settings/l10n/ru.json
+++ b/apps/settings/l10n/ru.json
@@ -135,7 +135,6 @@
"Your remote address could not be determined." : "Не удалось определить ваш сетевой адрес.",
"Your remote address was identified as \"%s\" and is brute-force throttled at the moment slowing down the performance of various requests. If the remote address is not your address this can be an indication that a proxy is not configured correctly." : "Ваш IP-адрес был определён как «%s» и в данный момент заблокирован защитой от перебора, что замедляет выполнение различных запросов. Если удаленный адрес не является вашим адресом, это может свидетельствовать о том, что прокси-сервер настроен неправильно.",
"Your remote address \"%s\" is not brute-force throttled." : "Ваш сетевой адрес «%s» не имеет ограничений по частоте ввода паролей.",
- "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "Чтобы разрешить эту проверку, вам нужно убедиться, что ваш веб-сервер может подключаться к себе. Поэтому он должен иметь возможность разрешать и подключаться по крайней мере к одному из своих `trusted_domains` или `overwrite.cli.url`. Эта ошибка может быть результатом несоответствия DNS на стороне сервера или исходящего правила брандмауэра.",
"Old administration imported certificates" : "Сертификаты, импортированные старым пользователем",
"A background job is pending that checks for administration imported SSL certificates. Please check back later." : "Запланировано фоновое задание проверки пользовательских SSL-сертификатов. Пожалуйста, проверьте позже.",
"There are some administration imported SSL certificates present, that are not used anymore with Nextcloud 21. They can be imported on the command line via \"occ security:certificates:import\" command. Their paths inside the data directory are shown below." : "Имеются некоторые импортированные SSL-сертификаты администратора, которые больше не используются в Nextcloud 21. Их можно импортировать в командной строке с помощью команды \"occ security:certificates:import\". Их пути внутри каталога данных показаны ниже.",
@@ -312,9 +311,6 @@
"Could not check that your web server serves `.well-known` correctly. Please check manually." : "Не удалось проверить, работает ли ваш веб-сервер `.well-known` правильно. Пожалуйста, проверьте вручную.",
"Your web server is not properly set up to resolve `.well-known` URLs, failed on:\n`%s`" : "Ваш веб-сервер неправильно настроен для решения `.well-known` URL-адреса, сбой при:\n`%s`",
"Your server is correctly configured to serve `.well-known` URLs." : "Ваш сервер правильно настроен для обслуживания `.well-known` URL-адреса.",
- "WOFF2 file loading" : "Загрузка файлов WOFF2",
- "Could not check for WOFF2 loading support. Please check manually if your webserver serves `.woff2` files." : "Не удалось проверить, поддерживаются ли файлы формата WOFF2. Проверьте, что веб-сервер обрабатывает файлы с расширением «.woff2».",
- "Your web server is not properly set up to deliver .woff2 files. This is typically an issue with the Nginx configuration. For Nextcloud 15 it needs an adjustement to also deliver .woff2 files. Compare your Nginx configuration to the recommended configuration in our documentation." : "Веб-сервер не настроен должным образом для передачи файлов шрифтов в формате .woff2, что необходимо для правильной работы Nextcloud версии 15. Как правило, это связано с конфигурацией веб-сервера Nginx. Сравните используемую конфигурацию с рекомендуемой конфигурацией из документации.",
"Profile information" : "Сведения о профиле",
"Profile picture, full name, email, phone number, address, website, Twitter, organisation, role, headline, biography, and whether your profile is enabled" : "Изображение профиля, полное имя, адрес электронной почты, номер телефона, адрес, веб-сайт, Twitter, организация, роль, заголовок, биография и сведения том, активен ли профиль",
"Nextcloud settings" : "Параметры Nextcloud",
@@ -878,6 +874,7 @@
"SMTP Username" : "Пользователь SMTP",
"To allow this check to run you have to make sure that your webserver can connect to itself. Therefor it must be able to resolve and connect to at least one its `trusted_domains` or the `overwrite.cli.url`." : "Чтобы разрешить выполнение этой проверки, вы должны убедиться, что ваш веб-сервер может подключаться к самому себе. Для этого он должен иметь возможность разрешать и подключаться по крайней мере к одному из своих `trusted_domains\" или \"overwrite.cli.url\".",
"Could not check for JavaScript support via any of your `trusted_domains` nor `overwrite.cli.url`. This may be the result of a server-side DNS mismatch or outbound firewall rule. Please check manually if your webserver serves `.mjs` files using the JavaScript MIME type." : "Не удалось проверить поддержку JavaScript ни в одном из ваших `trusted_domains`, ни в `overwrite.cli.url`. Это может быть результатом несоответствия DNS на стороне сервера или правила исходящего брандмауэра. Пожалуйста, проверьте вручную, обслуживает ли ваш веб-сервер файлы `.mjs`, используя MIME-тип JavaScript.",
- "Active accounts" : "Активные учётные записи"
+ "Active accounts" : "Активные учётные записи",
+ "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "Чтобы разрешить эту проверку, вам нужно убедиться, что ваш веб-сервер может подключаться к себе. Поэтому он должен иметь возможность разрешать и подключаться по крайней мере к одному из своих `trusted_domains` или `overwrite.cli.url`. Эта ошибка может быть результатом несоответствия DNS на стороне сервера или исходящего правила брандмауэра."
},"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/settings/l10n/sk.js b/apps/settings/l10n/sk.js
index 0d015681076..abf2ba93200 100644
--- a/apps/settings/l10n/sk.js
+++ b/apps/settings/l10n/sk.js
@@ -137,7 +137,6 @@ OC.L10N.register(
"Your remote address could not be determined." : "Váša vzdialená adresa sa nedala určiť.",
"Your remote address was identified as \"%s\" and is brute-force throttled at the moment slowing down the performance of various requests. If the remote address is not your address this can be an indication that a proxy is not configured correctly." : "Váš vzdialený adresár bol identifikovaný ako \"%s\" a momentálne súčasťou potlačovania útoku hrubou silou, čo spomaľuje výkon rôznych požiadaviek. Ak vzdialená adresa nie je vaša adresa, môže to naznačovať, že proxy nie je správne nakonfigurovaná.",
"Your remote address \"%s\" is not brute-force throttled." : "Váš vzdialený adresár \"%s\" nie je obmedzený pre útok hrubou silou.",
- "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "Ak chcete povoliť spustenie tejto kontroly, musíte sa uistiť, že váš webový server sa môže pripojiť sám k sebe. Preto musí byť schopný rozpoznať a pripojiť sa aspoň k jednej zo svojich `trusted_domains` alebo `overwrite.cli.url`. Výsledkom nesprávneho nastavenia môže byť nesúlad DNS na strane servera alebo pravidla brány firewall pre výstup.",
"Old administration imported certificates" : "Importované certifikáty starej administrácie",
"A background job is pending that checks for administration imported SSL certificates. Please check back later." : "Úloha na pozadí čaká na kontrolu administrácie importovaných SSL certifikátov. Skúste to znova neskôr.",
"There are some administration imported SSL certificates present, that are not used anymore with Nextcloud 21. They can be imported on the command line via \"occ security:certificates:import\" command. Their paths inside the data directory are shown below." : "Našlo sa niekoľko administratívnych importovaných SSL certifikátov, ktoré sa už v NextCloud 21 nepoužívajú. Môžu byť importované z príkazového riadku pomocou \"occ security:certificates:import\". Ich cesty vo vnútri dátového adresára sú uvedené nižšie.",
@@ -312,9 +311,6 @@ OC.L10N.register(
"Could not check that your web server serves `.well-known` correctly. Please check manually." : "Nemohol som overiť, či váš webový server správne poskytuje `.well-known`. Prosím, skontrolujte to manuálne.",
"Your web server is not properly set up to resolve `.well-known` URLs, failed on:\n`%s`" : "Váš webový server nie je správne nastavený na poskytovanie URL adries `.well-known`, zlyhalo na:\n`%s`",
"Your server is correctly configured to serve `.well-known` URLs." : "Váš server je správne nakonfigurovaný na poskytovanie URL adries `.well-known`.",
- "WOFF2 file loading" : "načítavanie súborov WOFF2",
- "Could not check for WOFF2 loading support. Please check manually if your webserver serves `.woff2` files." : "Nepodarilo sa overiť podporu načítania WOFF2. Prosím, skontrolujte manuálne, či váš webserver poskytuje súbory `.woff2`.",
- "Your web server is not properly set up to deliver .woff2 files. This is typically an issue with the Nginx configuration. For Nextcloud 15 it needs an adjustement to also deliver .woff2 files. Compare your Nginx configuration to the recommended configuration in our documentation." : "Váš server nie je správne nastavený tak, aby doručoval súbory .woff2. Toto je typicky problém s nastavením Nginx. Pre Nextcloud 15 je potrebné ho upraviť, aby tieto súbory doručoval. Porovnajte nastavenie svojho Nginx s tým, ktorý je odporúčaný v našej dokumentácii.",
"Profile information" : "Informácie o profile",
"Profile picture, full name, email, phone number, address, website, Twitter, organisation, role, headline, biography, and whether your profile is enabled" : "Profilový obrázok, celé meno, e-mail, telefónne číslo, adresa, webová stránka, Twitter, organizácia, rola, titul, životopis a či je váš profil povolený",
"Nextcloud settings" : "Nastavenia Nextcloud",
@@ -878,6 +874,7 @@ OC.L10N.register(
"SMTP Username" : "SMTP používateľské meno",
"To allow this check to run you have to make sure that your webserver can connect to itself. Therefor it must be able to resolve and connect to at least one its `trusted_domains` or the `overwrite.cli.url`." : "Pre povolenie tejto kontroly musíte zabezpečiť, aby sa váš webový server mohol pripojiť sám k sebe. Preto musí byť schopný rozpoznať a pripojiť sa aspoň k jednému z jeho \"trusted_domains\" alebo \"overwrite.cli.url\".",
"Could not check for JavaScript support via any of your `trusted_domains` nor `overwrite.cli.url`. This may be the result of a server-side DNS mismatch or outbound firewall rule. Please check manually if your webserver serves `.mjs` files using the JavaScript MIME type." : "Nepodarilo sa skontrolovať podporu JavaScriptu prostredníctvom žiadnej z vašich domén `trusted_domains` ani `overwrite.cli.url`. Môže to byť výsledkom nesúladu DNS na strane servera alebo pravidla brány firewall pre výstup. Skontrolujte prosím manuálne, či váš webový server poskytuje súbory `.mjs` pomocou typu JavaScript MIME.",
- "Active accounts" : "Aktívne účty"
+ "Active accounts" : "Aktívne účty",
+ "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "Ak chcete povoliť spustenie tejto kontroly, musíte sa uistiť, že váš webový server sa môže pripojiť sám k sebe. Preto musí byť schopný rozpoznať a pripojiť sa aspoň k jednej zo svojich `trusted_domains` alebo `overwrite.cli.url`. Výsledkom nesprávneho nastavenia môže byť nesúlad DNS na strane servera alebo pravidla brány firewall pre výstup."
},
"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/settings/l10n/sk.json b/apps/settings/l10n/sk.json
index 4a934d87779..a9d3c5429ee 100644
--- a/apps/settings/l10n/sk.json
+++ b/apps/settings/l10n/sk.json
@@ -135,7 +135,6 @@
"Your remote address could not be determined." : "Váša vzdialená adresa sa nedala určiť.",
"Your remote address was identified as \"%s\" and is brute-force throttled at the moment slowing down the performance of various requests. If the remote address is not your address this can be an indication that a proxy is not configured correctly." : "Váš vzdialený adresár bol identifikovaný ako \"%s\" a momentálne súčasťou potlačovania útoku hrubou silou, čo spomaľuje výkon rôznych požiadaviek. Ak vzdialená adresa nie je vaša adresa, môže to naznačovať, že proxy nie je správne nakonfigurovaná.",
"Your remote address \"%s\" is not brute-force throttled." : "Váš vzdialený adresár \"%s\" nie je obmedzený pre útok hrubou silou.",
- "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "Ak chcete povoliť spustenie tejto kontroly, musíte sa uistiť, že váš webový server sa môže pripojiť sám k sebe. Preto musí byť schopný rozpoznať a pripojiť sa aspoň k jednej zo svojich `trusted_domains` alebo `overwrite.cli.url`. Výsledkom nesprávneho nastavenia môže byť nesúlad DNS na strane servera alebo pravidla brány firewall pre výstup.",
"Old administration imported certificates" : "Importované certifikáty starej administrácie",
"A background job is pending that checks for administration imported SSL certificates. Please check back later." : "Úloha na pozadí čaká na kontrolu administrácie importovaných SSL certifikátov. Skúste to znova neskôr.",
"There are some administration imported SSL certificates present, that are not used anymore with Nextcloud 21. They can be imported on the command line via \"occ security:certificates:import\" command. Their paths inside the data directory are shown below." : "Našlo sa niekoľko administratívnych importovaných SSL certifikátov, ktoré sa už v NextCloud 21 nepoužívajú. Môžu byť importované z príkazového riadku pomocou \"occ security:certificates:import\". Ich cesty vo vnútri dátového adresára sú uvedené nižšie.",
@@ -310,9 +309,6 @@
"Could not check that your web server serves `.well-known` correctly. Please check manually." : "Nemohol som overiť, či váš webový server správne poskytuje `.well-known`. Prosím, skontrolujte to manuálne.",
"Your web server is not properly set up to resolve `.well-known` URLs, failed on:\n`%s`" : "Váš webový server nie je správne nastavený na poskytovanie URL adries `.well-known`, zlyhalo na:\n`%s`",
"Your server is correctly configured to serve `.well-known` URLs." : "Váš server je správne nakonfigurovaný na poskytovanie URL adries `.well-known`.",
- "WOFF2 file loading" : "načítavanie súborov WOFF2",
- "Could not check for WOFF2 loading support. Please check manually if your webserver serves `.woff2` files." : "Nepodarilo sa overiť podporu načítania WOFF2. Prosím, skontrolujte manuálne, či váš webserver poskytuje súbory `.woff2`.",
- "Your web server is not properly set up to deliver .woff2 files. This is typically an issue with the Nginx configuration. For Nextcloud 15 it needs an adjustement to also deliver .woff2 files. Compare your Nginx configuration to the recommended configuration in our documentation." : "Váš server nie je správne nastavený tak, aby doručoval súbory .woff2. Toto je typicky problém s nastavením Nginx. Pre Nextcloud 15 je potrebné ho upraviť, aby tieto súbory doručoval. Porovnajte nastavenie svojho Nginx s tým, ktorý je odporúčaný v našej dokumentácii.",
"Profile information" : "Informácie o profile",
"Profile picture, full name, email, phone number, address, website, Twitter, organisation, role, headline, biography, and whether your profile is enabled" : "Profilový obrázok, celé meno, e-mail, telefónne číslo, adresa, webová stránka, Twitter, organizácia, rola, titul, životopis a či je váš profil povolený",
"Nextcloud settings" : "Nastavenia Nextcloud",
@@ -876,6 +872,7 @@
"SMTP Username" : "SMTP používateľské meno",
"To allow this check to run you have to make sure that your webserver can connect to itself. Therefor it must be able to resolve and connect to at least one its `trusted_domains` or the `overwrite.cli.url`." : "Pre povolenie tejto kontroly musíte zabezpečiť, aby sa váš webový server mohol pripojiť sám k sebe. Preto musí byť schopný rozpoznať a pripojiť sa aspoň k jednému z jeho \"trusted_domains\" alebo \"overwrite.cli.url\".",
"Could not check for JavaScript support via any of your `trusted_domains` nor `overwrite.cli.url`. This may be the result of a server-side DNS mismatch or outbound firewall rule. Please check manually if your webserver serves `.mjs` files using the JavaScript MIME type." : "Nepodarilo sa skontrolovať podporu JavaScriptu prostredníctvom žiadnej z vašich domén `trusted_domains` ani `overwrite.cli.url`. Môže to byť výsledkom nesúladu DNS na strane servera alebo pravidla brány firewall pre výstup. Skontrolujte prosím manuálne, či váš webový server poskytuje súbory `.mjs` pomocou typu JavaScript MIME.",
- "Active accounts" : "Aktívne účty"
+ "Active accounts" : "Aktívne účty",
+ "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "Ak chcete povoliť spustenie tejto kontroly, musíte sa uistiť, že váš webový server sa môže pripojiť sám k sebe. Preto musí byť schopný rozpoznať a pripojiť sa aspoň k jednej zo svojich `trusted_domains` alebo `overwrite.cli.url`. Výsledkom nesprávneho nastavenia môže byť nesúlad DNS na strane servera alebo pravidla brány firewall pre výstup."
},"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/settings/l10n/sl.js b/apps/settings/l10n/sl.js
index 49fec6b976a..46af3577d22 100644
--- a/apps/settings/l10n/sl.js
+++ b/apps/settings/l10n/sl.js
@@ -137,7 +137,6 @@ OC.L10N.register(
"Your remote address could not be determined." : "Oddaljenega naslova naprave ni mogoče določiti.",
"Your remote address was identified as \"%s\" and is brute-force throttled at the moment slowing down the performance of various requests. If the remote address is not your address this can be an indication that a proxy is not configured correctly." : "Oddaljeni naslov je bil prepoznan kot »%s« in je trenutno zaščiten pred vdorom z grobo silo, kar upočasnjuje izvajanje različnih nalog. Če oddaljeni naslov ni vaš naslov, je to lahko znak, da posredniški strežnik ni pravilno nastavljen.",
"Your remote address \"%s\" is not brute-force throttled." : "Oddaljeni naslov »%s« ni omejen z zaščito pred vdorom z grobo silo.",
- "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "Če želite omogočiti izvajanje tega preverjanja, je treba zagotoviti, da se spletni strežnik lahko poveže sam s seboj. Zato mora biti nastavljen za povezovanje z vsaj eno od določenih »varnih domen« (trusted_domains) ali naslovov za prepis »vmesnika ukazne vrstice« (overwrite.cli.url). Spodletelo preverjanje je lahko posledica neujemanja imen DNS na strani strežnika oziroma pravila požarnega zidu.",
"Old administration imported certificates" : "Uvožena stara uporabniška potrdila",
"A background job is pending that checks for administration imported SSL certificates. Please check back later." : "Na čakanju je ozadnje opravilo, ki preverja obstoj skrbniško uvožena potrdila SSL. Nastavitve preverite kasneje.",
"There are some administration imported SSL certificates present, that are not used anymore with Nextcloud 21. They can be imported on the command line via \"occ security:certificates:import\" command. Their paths inside the data directory are shown below." : "Shranjenih je nekaj potrdil SSL, ki z različico Nextcloud 21 ne bodo več v uporabi. Potrdila je mogoče uvoziti z ukazom »occ security:certificates:import«. Zabeležene poti v podatkovnem imeniku so izpisane spodaj.",
@@ -246,7 +245,6 @@ OC.L10N.register(
"Temporary space available" : "Razpoložljivost začasnega prostora",
"Your database does not run with \"READ COMMITTED\" transaction isolation level. This can cause problems when multiple actions are executed in parallel." : "Podatkovna zbirka ni zagnana na ravni »READ COMMITTED«. To lahko povzroči težave pri vzporednem izvajanju dejanj.",
".well-known URLs" : "Naslovi .well-known URL",
- "WOFF2 file loading" : "Nalaganje datotek WOFF2",
"Profile information" : "Podrobnosti profila",
"Profile picture, full name, email, phone number, address, website, Twitter, organisation, role, headline, biography, and whether your profile is enabled" : "Slika profila, polno ime, elektronski naslov, telefonska številka, naslov, spletna stran, račun Twitter, ustanova, vloga, naslov, biografija in ali je profil omogočen.",
"Nextcloud settings" : "Nastavitve Nextcloud",
@@ -749,6 +747,7 @@ OC.L10N.register(
"Show to logged in users only" : "Pokaži le prijavljenim uporabnikom",
"Nextcloud help resources" : "Viri pomoči za okolje Nextcloud",
"SMTP Username" : "Uporabniško ime SMTP",
- "Active accounts" : "Dejavni računi"
+ "Active accounts" : "Dejavni računi",
+ "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "Če želite omogočiti izvajanje tega preverjanja, je treba zagotoviti, da se spletni strežnik lahko poveže sam s seboj. Zato mora biti nastavljen za povezovanje z vsaj eno od določenih »varnih domen« (trusted_domains) ali naslovov za prepis »vmesnika ukazne vrstice« (overwrite.cli.url). Spodletelo preverjanje je lahko posledica neujemanja imen DNS na strani strežnika oziroma pravila požarnega zidu."
},
"nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);");
diff --git a/apps/settings/l10n/sl.json b/apps/settings/l10n/sl.json
index cdb872b8290..9921bf29f56 100644
--- a/apps/settings/l10n/sl.json
+++ b/apps/settings/l10n/sl.json
@@ -135,7 +135,6 @@
"Your remote address could not be determined." : "Oddaljenega naslova naprave ni mogoče določiti.",
"Your remote address was identified as \"%s\" and is brute-force throttled at the moment slowing down the performance of various requests. If the remote address is not your address this can be an indication that a proxy is not configured correctly." : "Oddaljeni naslov je bil prepoznan kot »%s« in je trenutno zaščiten pred vdorom z grobo silo, kar upočasnjuje izvajanje različnih nalog. Če oddaljeni naslov ni vaš naslov, je to lahko znak, da posredniški strežnik ni pravilno nastavljen.",
"Your remote address \"%s\" is not brute-force throttled." : "Oddaljeni naslov »%s« ni omejen z zaščito pred vdorom z grobo silo.",
- "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "Če želite omogočiti izvajanje tega preverjanja, je treba zagotoviti, da se spletni strežnik lahko poveže sam s seboj. Zato mora biti nastavljen za povezovanje z vsaj eno od določenih »varnih domen« (trusted_domains) ali naslovov za prepis »vmesnika ukazne vrstice« (overwrite.cli.url). Spodletelo preverjanje je lahko posledica neujemanja imen DNS na strani strežnika oziroma pravila požarnega zidu.",
"Old administration imported certificates" : "Uvožena stara uporabniška potrdila",
"A background job is pending that checks for administration imported SSL certificates. Please check back later." : "Na čakanju je ozadnje opravilo, ki preverja obstoj skrbniško uvožena potrdila SSL. Nastavitve preverite kasneje.",
"There are some administration imported SSL certificates present, that are not used anymore with Nextcloud 21. They can be imported on the command line via \"occ security:certificates:import\" command. Their paths inside the data directory are shown below." : "Shranjenih je nekaj potrdil SSL, ki z različico Nextcloud 21 ne bodo več v uporabi. Potrdila je mogoče uvoziti z ukazom »occ security:certificates:import«. Zabeležene poti v podatkovnem imeniku so izpisane spodaj.",
@@ -244,7 +243,6 @@
"Temporary space available" : "Razpoložljivost začasnega prostora",
"Your database does not run with \"READ COMMITTED\" transaction isolation level. This can cause problems when multiple actions are executed in parallel." : "Podatkovna zbirka ni zagnana na ravni »READ COMMITTED«. To lahko povzroči težave pri vzporednem izvajanju dejanj.",
".well-known URLs" : "Naslovi .well-known URL",
- "WOFF2 file loading" : "Nalaganje datotek WOFF2",
"Profile information" : "Podrobnosti profila",
"Profile picture, full name, email, phone number, address, website, Twitter, organisation, role, headline, biography, and whether your profile is enabled" : "Slika profila, polno ime, elektronski naslov, telefonska številka, naslov, spletna stran, račun Twitter, ustanova, vloga, naslov, biografija in ali je profil omogočen.",
"Nextcloud settings" : "Nastavitve Nextcloud",
@@ -747,6 +745,7 @@
"Show to logged in users only" : "Pokaži le prijavljenim uporabnikom",
"Nextcloud help resources" : "Viri pomoči za okolje Nextcloud",
"SMTP Username" : "Uporabniško ime SMTP",
- "Active accounts" : "Dejavni računi"
+ "Active accounts" : "Dejavni računi",
+ "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "Če želite omogočiti izvajanje tega preverjanja, je treba zagotoviti, da se spletni strežnik lahko poveže sam s seboj. Zato mora biti nastavljen za povezovanje z vsaj eno od določenih »varnih domen« (trusted_domains) ali naslovov za prepis »vmesnika ukazne vrstice« (overwrite.cli.url). Spodletelo preverjanje je lahko posledica neujemanja imen DNS na strani strežnika oziroma pravila požarnega zidu."
},"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/settings/l10n/sr.js b/apps/settings/l10n/sr.js
index b50467c4706..ee56e60c3a5 100644
--- a/apps/settings/l10n/sr.js
+++ b/apps/settings/l10n/sr.js
@@ -137,7 +137,6 @@ OC.L10N.register(
"Your remote address could not be determined." : "Не може да се одреди ваша удаљена адреса.",
"Your remote address was identified as \"%s\" and is brute-force throttled at the moment slowing down the performance of various requests. If the remote address is not your address this can be an indication that a proxy is not configured correctly." : "Ваша удаљена адреса је идентификована као „%s” и тренутно је пригушена због напада грубом силом чиме се успоравају перформансе разних захтева. Ако удаљена адреса није ваша, ово може бити знак да прокси није исправно подешен. ",
"Your remote address \"%s\" is not brute-force throttled." : "Ваша удаљена адреса „%s” није пригушена због напада грубом силом.",
- "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "Ако желите да се ова провера изврши, морате обезбедити да ваш веб сервер може да се повеже на самог себе. То значи да мора бити у стању да разреши и да се повеже барем на један од својих `trusted_domains` или `overwrite.cli.url`. Ова грешка може да буде резултат DNS неподударања на страни сервера или одлазно правило заштитног зида.",
"Old administration imported certificates" : "Стари сертификати које је увезла администрација",
"A background job is pending that checks for administration imported SSL certificates. Please check back later." : "Позадински посао за проверу SSL сертификата које је увезла администрација је на чекању. Молимо вас да проверите касније.",
"There are some administration imported SSL certificates present, that are not used anymore with Nextcloud 21. They can be imported on the command line via \"occ security:certificates:import\" command. Their paths inside the data directory are shown below." : "Присутни су неки SSL сертификати које је увезла администрација и који се више не користе у Nextcloud 21. Могу да се увезу из командне линије извршавањем команде „occ security:certificates:import”. Њихове путање унутар директоријума са подацима су приказане испод.",
@@ -221,6 +220,9 @@ OC.L10N.register(
"The \"overwrite.cli.url\" option in your config.php is correctly set to \"%s\"." : "„overwrite.cli.url” опција у вашем config.php је исправно постављена на „%s”.",
"The \"overwrite.cli.url\" option in your config.php is set to \"%s\" which is a correct URL. Suggested URL is \"%s\"." : "„overwrite.cli.url” опција у вашем config.php је исправно постављена на „%s” и то је исправни URL. Препоручени URL. је „%s”.",
"Please make sure to set the \"overwrite.cli.url\" option in your config.php file to the URL that your users mainly use to access this Nextcloud. Suggestion: \"%s\". Otherwise there might be problems with the URL generation via cron. (It is possible though that the suggested URL is not the URL that your users mainly use to access this Nextcloud. Best is to double check this in any case.)" : "Молимо вас да обезбедите да је опција „overwrite.cli.url” у config.php фајлу постављена на URL који ваши корисници углавном користе за приступ овој Nextcloud инстанци. Предлог: „%s”. У супротном може доћи до проблема са генерисањем URL преко cron. (Мада је могуће да предложени URL није URL који ваши корисници углавном користе да приступе овој Nextcloud инстанци. У сваком случају је најбоље да се ово провери.)",
+ "PHP APCu configuration" : "PHP APCu конфигурација",
+ "Your APCu cache has been running full, consider increasing the apc.shm_size php setting." : "Ваш APCu кеш је пун, покушајте да увећате вредност apc.shm_size php подешавања.",
+ "Your APCu cache is almost full at %s%%, consider increasing the apc.shm_size php setting." : "Ваш APCu кеш је скоро пун на %s%%, покушајте да увећате apc.shm_size php подешавање.",
"PHP default charset" : "Подразумевани PHP скуп знакова",
"PHP configuration option \"default_charset\" should be UTF-8" : "PHP кофигурациона опција „default_charset би требало да има вредност UTF-8",
"PHP set_time_limit" : "PHP set_time_limit",
@@ -311,9 +313,6 @@ OC.L10N.register(
"Could not check that your web server serves `.well-known` correctly. Please check manually." : "Није могло да се провери да ли ваш веб сервер исправно сервира `.well-known`. Молимо вас да проверите ручно.",
"Your web server is not properly set up to resolve `.well-known` URLs, failed on:\n`%s`" : "Ваш веб сервер није исправно подешен и не може да разрешава `.well-known` URL адресе, није успео на адреси:\n`%s`",
"Your server is correctly configured to serve `.well-known` URLs." : "Ваш сервер је исправно подешен за сервирање `.well-known` URL адреса.",
- "WOFF2 file loading" : "Учитавање WOFF2 фајла",
- "Could not check for WOFF2 loading support. Please check manually if your webserver serves `.woff2` files." : "Није могла да се провери подршка за учитавање WOFF2 фајлова. Молимо вас да ручно проверите да ли ваш веб сервер сервира `.woff2` фајлове.",
- "Your web server is not properly set up to deliver .woff2 files. This is typically an issue with the Nginx configuration. For Nextcloud 15 it needs an adjustement to also deliver .woff2 files. Compare your Nginx configuration to the recommended configuration in our documentation." : "Ваш веб сервер није исправно подешен да испоручи .woff2 фајлове. Ово је обично проблем са Nginx конфигурацијом. За Nextcloud 15 је неопходно да се направе измене у конфигурацији како би могли да се испоруче и .woff2 фајлови. Упоредите своју Nginx конфигурацију са препорученом конфигурацијом у нашој документацији.",
"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" : "Nextcloud подешавања",
@@ -328,6 +327,7 @@ OC.L10N.register(
"None of your currently installed apps provide image generation functionality" : "Ниједна од ваших тренутно инсталираних апликација не пружа функционалност генерисања слике",
"Text processing" : "Обрада текста",
"Text processing tasks can be implemented by different apps. Here you can set which app should be used for which task." : "Задатке обраде текста могу да имплементирају разне апликације. Овде можете да подесите која ће се користити за који задатак.",
+ "None of your currently installed apps provide text processing functionality using the Text Processing API." : "Ниједна од ваших тренутно инсталираних апликација не пружа функционалност обраде текста употребом API за обраду текста.",
"Here you can decide which group can access certain sections of the administration settings." : "Овде можете да одлучите која група може да приступи одређеним деловима административних подешавања.",
"None" : "Ништа",
"Unable to modify setting" : "Подешавање не може да се измени",
@@ -877,6 +877,7 @@ OC.L10N.register(
"SMTP Username" : "SMTP корисничко име",
"To allow this check to run you have to make sure that your webserver can connect to itself. Therefor it must be able to resolve and connect to at least one its `trusted_domains` or the `overwrite.cli.url`." : "Ако желите да се ова провера изврши, морате обезбедити да ваш веб сервер може да се повеже на самог себе. То значи да мора бити у стању да разреши и да се повеже барем на један од својих `trusted_domains` или `overwrite.cli.url`.",
"Could not check for JavaScript support via any of your `trusted_domains` nor `overwrite.cli.url`. This may be the result of a server-side DNS mismatch or outbound firewall rule. Please check manually if your webserver serves `.mjs` files using the JavaScript MIME type." : "Није могла да се провери JavaScript подршка преко било ког од ваших `trusted_domains` нити преко `overwrite.cli.url`. То је можда услед DNS неслагања са стране сервера или одлазно правило заштитног зида. Молимо вас да ручно проверите да ли ваш сервер служи `.mjs` фајлове користећи JavaScript MIME тип.",
- "Active accounts" : "Активни налози"
+ "Active accounts" : "Активни налози",
+ "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "Ако желите да се ова провера изврши, морате обезбедити да ваш веб сервер може да се повеже на самог себе. То значи да мора бити у стању да разреши и да се повеже барем на један од својих `trusted_domains` или `overwrite.cli.url`. Ова грешка може да буде резултат DNS неподударања на страни сервера или одлазно правило заштитног зида."
},
"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/settings/l10n/sr.json b/apps/settings/l10n/sr.json
index 2f06f9f355f..532b37985aa 100644
--- a/apps/settings/l10n/sr.json
+++ b/apps/settings/l10n/sr.json
@@ -135,7 +135,6 @@
"Your remote address could not be determined." : "Не може да се одреди ваша удаљена адреса.",
"Your remote address was identified as \"%s\" and is brute-force throttled at the moment slowing down the performance of various requests. If the remote address is not your address this can be an indication that a proxy is not configured correctly." : "Ваша удаљена адреса је идентификована као „%s” и тренутно је пригушена због напада грубом силом чиме се успоравају перформансе разних захтева. Ако удаљена адреса није ваша, ово може бити знак да прокси није исправно подешен. ",
"Your remote address \"%s\" is not brute-force throttled." : "Ваша удаљена адреса „%s” није пригушена због напада грубом силом.",
- "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "Ако желите да се ова провера изврши, морате обезбедити да ваш веб сервер може да се повеже на самог себе. То значи да мора бити у стању да разреши и да се повеже барем на један од својих `trusted_domains` или `overwrite.cli.url`. Ова грешка може да буде резултат DNS неподударања на страни сервера или одлазно правило заштитног зида.",
"Old administration imported certificates" : "Стари сертификати које је увезла администрација",
"A background job is pending that checks for administration imported SSL certificates. Please check back later." : "Позадински посао за проверу SSL сертификата које је увезла администрација је на чекању. Молимо вас да проверите касније.",
"There are some administration imported SSL certificates present, that are not used anymore with Nextcloud 21. They can be imported on the command line via \"occ security:certificates:import\" command. Their paths inside the data directory are shown below." : "Присутни су неки SSL сертификати које је увезла администрација и који се више не користе у Nextcloud 21. Могу да се увезу из командне линије извршавањем команде „occ security:certificates:import”. Њихове путање унутар директоријума са подацима су приказане испод.",
@@ -219,6 +218,9 @@
"The \"overwrite.cli.url\" option in your config.php is correctly set to \"%s\"." : "„overwrite.cli.url” опција у вашем config.php је исправно постављена на „%s”.",
"The \"overwrite.cli.url\" option in your config.php is set to \"%s\" which is a correct URL. Suggested URL is \"%s\"." : "„overwrite.cli.url” опција у вашем config.php је исправно постављена на „%s” и то је исправни URL. Препоручени URL. је „%s”.",
"Please make sure to set the \"overwrite.cli.url\" option in your config.php file to the URL that your users mainly use to access this Nextcloud. Suggestion: \"%s\". Otherwise there might be problems with the URL generation via cron. (It is possible though that the suggested URL is not the URL that your users mainly use to access this Nextcloud. Best is to double check this in any case.)" : "Молимо вас да обезбедите да је опција „overwrite.cli.url” у config.php фајлу постављена на URL који ваши корисници углавном користе за приступ овој Nextcloud инстанци. Предлог: „%s”. У супротном може доћи до проблема са генерисањем URL преко cron. (Мада је могуће да предложени URL није URL који ваши корисници углавном користе да приступе овој Nextcloud инстанци. У сваком случају је најбоље да се ово провери.)",
+ "PHP APCu configuration" : "PHP APCu конфигурација",
+ "Your APCu cache has been running full, consider increasing the apc.shm_size php setting." : "Ваш APCu кеш је пун, покушајте да увећате вредност apc.shm_size php подешавања.",
+ "Your APCu cache is almost full at %s%%, consider increasing the apc.shm_size php setting." : "Ваш APCu кеш је скоро пун на %s%%, покушајте да увећате apc.shm_size php подешавање.",
"PHP default charset" : "Подразумевани PHP скуп знакова",
"PHP configuration option \"default_charset\" should be UTF-8" : "PHP кофигурациона опција „default_charset би требало да има вредност UTF-8",
"PHP set_time_limit" : "PHP set_time_limit",
@@ -309,9 +311,6 @@
"Could not check that your web server serves `.well-known` correctly. Please check manually." : "Није могло да се провери да ли ваш веб сервер исправно сервира `.well-known`. Молимо вас да проверите ручно.",
"Your web server is not properly set up to resolve `.well-known` URLs, failed on:\n`%s`" : "Ваш веб сервер није исправно подешен и не може да разрешава `.well-known` URL адресе, није успео на адреси:\n`%s`",
"Your server is correctly configured to serve `.well-known` URLs." : "Ваш сервер је исправно подешен за сервирање `.well-known` URL адреса.",
- "WOFF2 file loading" : "Учитавање WOFF2 фајла",
- "Could not check for WOFF2 loading support. Please check manually if your webserver serves `.woff2` files." : "Није могла да се провери подршка за учитавање WOFF2 фајлова. Молимо вас да ручно проверите да ли ваш веб сервер сервира `.woff2` фајлове.",
- "Your web server is not properly set up to deliver .woff2 files. This is typically an issue with the Nginx configuration. For Nextcloud 15 it needs an adjustement to also deliver .woff2 files. Compare your Nginx configuration to the recommended configuration in our documentation." : "Ваш веб сервер није исправно подешен да испоручи .woff2 фајлове. Ово је обично проблем са Nginx конфигурацијом. За Nextcloud 15 је неопходно да се направе измене у конфигурацији како би могли да се испоруче и .woff2 фајлови. Упоредите своју Nginx конфигурацију са препорученом конфигурацијом у нашој документацији.",
"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" : "Nextcloud подешавања",
@@ -326,6 +325,7 @@
"None of your currently installed apps provide image generation functionality" : "Ниједна од ваших тренутно инсталираних апликација не пружа функционалност генерисања слике",
"Text processing" : "Обрада текста",
"Text processing tasks can be implemented by different apps. Here you can set which app should be used for which task." : "Задатке обраде текста могу да имплементирају разне апликације. Овде можете да подесите која ће се користити за који задатак.",
+ "None of your currently installed apps provide text processing functionality using the Text Processing API." : "Ниједна од ваших тренутно инсталираних апликација не пружа функционалност обраде текста употребом API за обраду текста.",
"Here you can decide which group can access certain sections of the administration settings." : "Овде можете да одлучите која група може да приступи одређеним деловима административних подешавања.",
"None" : "Ништа",
"Unable to modify setting" : "Подешавање не може да се измени",
@@ -875,6 +875,7 @@
"SMTP Username" : "SMTP корисничко име",
"To allow this check to run you have to make sure that your webserver can connect to itself. Therefor it must be able to resolve and connect to at least one its `trusted_domains` or the `overwrite.cli.url`." : "Ако желите да се ова провера изврши, морате обезбедити да ваш веб сервер може да се повеже на самог себе. То значи да мора бити у стању да разреши и да се повеже барем на један од својих `trusted_domains` или `overwrite.cli.url`.",
"Could not check for JavaScript support via any of your `trusted_domains` nor `overwrite.cli.url`. This may be the result of a server-side DNS mismatch or outbound firewall rule. Please check manually if your webserver serves `.mjs` files using the JavaScript MIME type." : "Није могла да се провери JavaScript подршка преко било ког од ваших `trusted_domains` нити преко `overwrite.cli.url`. То је можда услед DNS неслагања са стране сервера или одлазно правило заштитног зида. Молимо вас да ручно проверите да ли ваш сервер служи `.mjs` фајлове користећи JavaScript MIME тип.",
- "Active accounts" : "Активни налози"
+ "Active accounts" : "Активни налози",
+ "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "Ако желите да се ова провера изврши, морате обезбедити да ваш веб сервер може да се повеже на самог себе. То значи да мора бити у стању да разреши и да се повеже барем на један од својих `trusted_domains` или `overwrite.cli.url`. Ова грешка може да буде резултат DNS неподударања на страни сервера или одлазно правило заштитног зида."
},"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/settings/l10n/tr.js b/apps/settings/l10n/tr.js
index 8b3b8f12d7c..0faac8dac3a 100644
--- a/apps/settings/l10n/tr.js
+++ b/apps/settings/l10n/tr.js
@@ -137,7 +137,6 @@ OC.L10N.register(
"Your remote address could not be determined." : "Uzak adresiniz belirlenemedi.",
"Your remote address was identified as \"%s\" and is brute-force throttled at the moment slowing down the performance of various requests. If the remote address is not your address this can be an indication that a proxy is not configured correctly." : "Uzak adresiniz \"%s\" olarak belirlendi ve şu anda çeşitli isteklerin yerine getirilmesini yavaşlatacak şekilde kaba kuvvet saldırısı nedeniyle kısıtlanıyor. Uzak adres sizin adresiniz değilse bu, vekil sunucusunun doğru şekilde yapılandırılmadığını gösteriyor olabilir.",
"Your remote address \"%s\" is not brute-force throttled." : "\"%s\" uzak adresinize kaba kuvvet sınırlaması uygulanmıyor.",
- "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "Bu denetimi çalıştırabilmek için site sunucunuzun kendisine bağlanabildiğinden emin olmanız gerekir. Bu nedenle, `trusted_domains` ya da `overwrite.cli.url` değerlerinden en az birini çözümleyebilmeli ve bunlara bağlanabilmelidir. Bu sorun, sunucu tarafındaki bir DNS uyumsuzluğunun veya giden güvenlik duvarı kuralının sonucu olabilir.",
"Old administration imported certificates" : "Eski yönetimin içe aktarılmış sertifikaları",
"A background job is pending that checks for administration imported SSL certificates. Please check back later." : "Yönetim tarafından içe aktarılmış SSL sertifikalarını denetleyen bir arka plan görevi bekliyor. Lütfen bir süre sonra yeniden denetleyin.",
"There are some administration imported SSL certificates present, that are not used anymore with Nextcloud 21. They can be imported on the command line via \"occ security:certificates:import\" command. Their paths inside the data directory are shown below." : "Yönetim tarafından içe aktarılmış ancak artık Nextcloud 21 ile kullanılmayan bazı SSL sertifikaları var. Bunlar, komut satırından \"occ security:certificates:import\" komutu ile içe aktarılabilir. Veri klasörü içindeki yollarını aşağıda görebilirsiniz.",
@@ -314,9 +313,6 @@ OC.L10N.register(
"Could not check that your web server serves `.well-known` correctly. Please check manually." : "Site sunucunuzun `.well.known` bilgisini doğru şekilde sunup sunmadığı denetlenemedi. Lütfen el ile denetleyin.",
"Your web server is not properly set up to resolve `.well-known` URLs, failed on:\n`%s`" : "Site sunucunuz `.well.known` adresleri çözümlemek için doğru şekilde kurulmamış. Şurada sorun çıktı: `%s`",
"Your server is correctly configured to serve `.well-known` URLs." : "Sunucunuz, `.well.known` adresleri sunmak üzere doğru şekilde yapılandırılmış.",
- "WOFF2 file loading" : "WOFF2 dosya yüklemesi",
- "Could not check for WOFF2 loading support. Please check manually if your webserver serves `.woff2` files." : "WOFF2 yükleme desteği denetlenemedi. Lütfen site sunucunuzun `.woff2` dosyalarını sunup sunmadığını el ile denetleyin.",
- "Your web server is not properly set up to deliver .woff2 files. This is typically an issue with the Nginx configuration. For Nextcloud 15 it needs an adjustement to also deliver .woff2 files. Compare your Nginx configuration to the recommended configuration in our documentation." : "Site sunucunuz .woff2 dosyalarını aktaracak şekilde yapılandırılmamış. Bu sık karşılaşılan bir Nginx yapılandırma sorunudur. Nextcloud 15 için .woff2 dosyalarını da aktaracak ek bir ayar yapılması gereklidir. Kullandığınız Nginx yapılandırmasını belgeler bölümünde bulunan önerilen yapılandırma dosyası ile karşılaştırın.",
"Profile information" : "Profil bilgileri",
"Profile picture, full name, email, phone number, address, website, Twitter, organisation, role, headline, biography, and whether your profile is enabled" : "Profil görseli, tam ad, e-posta adresi, telefon numarası, adres, site, Twitter, kuruluş, rol, başlık, özgeçmiş ve profilde etkinleştirilmiş diğer bilgiler",
"Nextcloud settings" : "Nextcloud ayarları",
@@ -881,6 +877,7 @@ OC.L10N.register(
"SMTP Username" : "SMTP kullanıcı adı",
"To allow this check to run you have to make sure that your webserver can connect to itself. Therefor it must be able to resolve and connect to at least one its `trusted_domains` or the `overwrite.cli.url`." : "Bu denetimi çalıştırabilmek için site sunucunuzun kendisine bağlanabildiğinden emin olmanız gerekir. Bu nedenle, `trusted_domains` ya da `overwrite.cli.url` değerlerinden en az birini çözümleyebilmeli ve bunlara bağlanabilmelidir.",
"Could not check for JavaScript support via any of your `trusted_domains` nor `overwrite.cli.url`. This may be the result of a server-side DNS mismatch or outbound firewall rule. Please check manually if your webserver serves `.mjs` files using the JavaScript MIME type." : "`trusted_domains` ya da `overwrite.cli.url` değerlerinden biri ile JavaScript desteği olup olmadığ denetlenemedi. Bu durum, sunucu tarafı DNS uyuşmazlığından ya da giden güvenlik duvarı kuralından kaynaklanıyor olabilir. Lütfen site sunucunuzun JavaScript MIME türünü kullanarak `.mjs` dosyalarını sunup sunmadığını el ile denetleyin.",
- "Active accounts" : "Etkin hesaplar"
+ "Active accounts" : "Etkin hesaplar",
+ "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "Bu denetimi çalıştırabilmek için site sunucunuzun kendisine bağlanabildiğinden emin olmanız gerekir. Bu nedenle, `trusted_domains` ya da `overwrite.cli.url` değerlerinden en az birini çözümleyebilmeli ve bunlara bağlanabilmelidir. Bu sorun, sunucu tarafındaki bir DNS uyumsuzluğunun veya giden güvenlik duvarı kuralının sonucu olabilir."
},
"nplurals=2; plural=(n > 1);");
diff --git a/apps/settings/l10n/tr.json b/apps/settings/l10n/tr.json
index eac186592f1..cb2dd53074e 100644
--- a/apps/settings/l10n/tr.json
+++ b/apps/settings/l10n/tr.json
@@ -135,7 +135,6 @@
"Your remote address could not be determined." : "Uzak adresiniz belirlenemedi.",
"Your remote address was identified as \"%s\" and is brute-force throttled at the moment slowing down the performance of various requests. If the remote address is not your address this can be an indication that a proxy is not configured correctly." : "Uzak adresiniz \"%s\" olarak belirlendi ve şu anda çeşitli isteklerin yerine getirilmesini yavaşlatacak şekilde kaba kuvvet saldırısı nedeniyle kısıtlanıyor. Uzak adres sizin adresiniz değilse bu, vekil sunucusunun doğru şekilde yapılandırılmadığını gösteriyor olabilir.",
"Your remote address \"%s\" is not brute-force throttled." : "\"%s\" uzak adresinize kaba kuvvet sınırlaması uygulanmıyor.",
- "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "Bu denetimi çalıştırabilmek için site sunucunuzun kendisine bağlanabildiğinden emin olmanız gerekir. Bu nedenle, `trusted_domains` ya da `overwrite.cli.url` değerlerinden en az birini çözümleyebilmeli ve bunlara bağlanabilmelidir. Bu sorun, sunucu tarafındaki bir DNS uyumsuzluğunun veya giden güvenlik duvarı kuralının sonucu olabilir.",
"Old administration imported certificates" : "Eski yönetimin içe aktarılmış sertifikaları",
"A background job is pending that checks for administration imported SSL certificates. Please check back later." : "Yönetim tarafından içe aktarılmış SSL sertifikalarını denetleyen bir arka plan görevi bekliyor. Lütfen bir süre sonra yeniden denetleyin.",
"There are some administration imported SSL certificates present, that are not used anymore with Nextcloud 21. They can be imported on the command line via \"occ security:certificates:import\" command. Their paths inside the data directory are shown below." : "Yönetim tarafından içe aktarılmış ancak artık Nextcloud 21 ile kullanılmayan bazı SSL sertifikaları var. Bunlar, komut satırından \"occ security:certificates:import\" komutu ile içe aktarılabilir. Veri klasörü içindeki yollarını aşağıda görebilirsiniz.",
@@ -312,9 +311,6 @@
"Could not check that your web server serves `.well-known` correctly. Please check manually." : "Site sunucunuzun `.well.known` bilgisini doğru şekilde sunup sunmadığı denetlenemedi. Lütfen el ile denetleyin.",
"Your web server is not properly set up to resolve `.well-known` URLs, failed on:\n`%s`" : "Site sunucunuz `.well.known` adresleri çözümlemek için doğru şekilde kurulmamış. Şurada sorun çıktı: `%s`",
"Your server is correctly configured to serve `.well-known` URLs." : "Sunucunuz, `.well.known` adresleri sunmak üzere doğru şekilde yapılandırılmış.",
- "WOFF2 file loading" : "WOFF2 dosya yüklemesi",
- "Could not check for WOFF2 loading support. Please check manually if your webserver serves `.woff2` files." : "WOFF2 yükleme desteği denetlenemedi. Lütfen site sunucunuzun `.woff2` dosyalarını sunup sunmadığını el ile denetleyin.",
- "Your web server is not properly set up to deliver .woff2 files. This is typically an issue with the Nginx configuration. For Nextcloud 15 it needs an adjustement to also deliver .woff2 files. Compare your Nginx configuration to the recommended configuration in our documentation." : "Site sunucunuz .woff2 dosyalarını aktaracak şekilde yapılandırılmamış. Bu sık karşılaşılan bir Nginx yapılandırma sorunudur. Nextcloud 15 için .woff2 dosyalarını da aktaracak ek bir ayar yapılması gereklidir. Kullandığınız Nginx yapılandırmasını belgeler bölümünde bulunan önerilen yapılandırma dosyası ile karşılaştırın.",
"Profile information" : "Profil bilgileri",
"Profile picture, full name, email, phone number, address, website, Twitter, organisation, role, headline, biography, and whether your profile is enabled" : "Profil görseli, tam ad, e-posta adresi, telefon numarası, adres, site, Twitter, kuruluş, rol, başlık, özgeçmiş ve profilde etkinleştirilmiş diğer bilgiler",
"Nextcloud settings" : "Nextcloud ayarları",
@@ -879,6 +875,7 @@
"SMTP Username" : "SMTP kullanıcı adı",
"To allow this check to run you have to make sure that your webserver can connect to itself. Therefor it must be able to resolve and connect to at least one its `trusted_domains` or the `overwrite.cli.url`." : "Bu denetimi çalıştırabilmek için site sunucunuzun kendisine bağlanabildiğinden emin olmanız gerekir. Bu nedenle, `trusted_domains` ya da `overwrite.cli.url` değerlerinden en az birini çözümleyebilmeli ve bunlara bağlanabilmelidir.",
"Could not check for JavaScript support via any of your `trusted_domains` nor `overwrite.cli.url`. This may be the result of a server-side DNS mismatch or outbound firewall rule. Please check manually if your webserver serves `.mjs` files using the JavaScript MIME type." : "`trusted_domains` ya da `overwrite.cli.url` değerlerinden biri ile JavaScript desteği olup olmadığ denetlenemedi. Bu durum, sunucu tarafı DNS uyuşmazlığından ya da giden güvenlik duvarı kuralından kaynaklanıyor olabilir. Lütfen site sunucunuzun JavaScript MIME türünü kullanarak `.mjs` dosyalarını sunup sunmadığını el ile denetleyin.",
- "Active accounts" : "Etkin hesaplar"
+ "Active accounts" : "Etkin hesaplar",
+ "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "Bu denetimi çalıştırabilmek için site sunucunuzun kendisine bağlanabildiğinden emin olmanız gerekir. Bu nedenle, `trusted_domains` ya da `overwrite.cli.url` değerlerinden en az birini çözümleyebilmeli ve bunlara bağlanabilmelidir. Bu sorun, sunucu tarafındaki bir DNS uyumsuzluğunun veya giden güvenlik duvarı kuralının sonucu olabilir."
},"pluralForm" :"nplurals=2; plural=(n > 1);"
} \ No newline at end of file
diff --git a/apps/settings/l10n/zh_CN.js b/apps/settings/l10n/zh_CN.js
index 8f16097d805..e2b2bc4955f 100644
--- a/apps/settings/l10n/zh_CN.js
+++ b/apps/settings/l10n/zh_CN.js
@@ -266,9 +266,6 @@ OC.L10N.register(
"Could not check that your web server serves `.well-known` correctly. Please check manually." : "无法检查您的网络服务器是否正确服务 `.well-known`。 请手动检查。",
"Your web server is not properly set up to resolve `.well-known` URLs, failed on:\n`%s`" : "您的网络服务器未正确设置来解析 `.wellknown` URL,失败于:\n`%s`",
"Your server is correctly configured to serve `.well-known` URLs." : "您的服务器已正确配置为提供 `.well-known` URL。",
- "WOFF2 file loading" : "WOFF2 文件加载",
- "Could not check for WOFF2 loading support. Please check manually if your webserver serves `.woff2` files." : "无法检查 WOFF2 加载支持。 请手动检查您的网络服务器是否提供 `.woff2` 文件。",
- "Your web server is not properly set up to deliver .woff2 files. This is typically an issue with the Nginx configuration. For Nextcloud 15 it needs an adjustement to also deliver .woff2 files. Compare your Nginx configuration to the recommended configuration in our documentation." : "您的 Web 服务器未正确设置以传送 .woff2 文件。 这通常是 Nginx 配置的问题。 对于 Nextcloud 15,它需要进行调整才能提供 .woff2 文件。 将您的 Nginx 配置与我们文档中推荐的配置进行比较。",
"Profile information" : "个人信息",
"Profile picture, full name, email, phone number, address, website, Twitter, organisation, role, headline, biography, and whether your profile is enabled" : "个人资料图片、全名、电子邮件、电话号码、地址、网站、Twitter、组织、角色、标题、个人简介以及您的个人资料是否启用",
"Nextcloud settings" : "Nextcloud 设置",
diff --git a/apps/settings/l10n/zh_CN.json b/apps/settings/l10n/zh_CN.json
index 7c066bdc608..675bbfbfd46 100644
--- a/apps/settings/l10n/zh_CN.json
+++ b/apps/settings/l10n/zh_CN.json
@@ -264,9 +264,6 @@
"Could not check that your web server serves `.well-known` correctly. Please check manually." : "无法检查您的网络服务器是否正确服务 `.well-known`。 请手动检查。",
"Your web server is not properly set up to resolve `.well-known` URLs, failed on:\n`%s`" : "您的网络服务器未正确设置来解析 `.wellknown` URL,失败于:\n`%s`",
"Your server is correctly configured to serve `.well-known` URLs." : "您的服务器已正确配置为提供 `.well-known` URL。",
- "WOFF2 file loading" : "WOFF2 文件加载",
- "Could not check for WOFF2 loading support. Please check manually if your webserver serves `.woff2` files." : "无法检查 WOFF2 加载支持。 请手动检查您的网络服务器是否提供 `.woff2` 文件。",
- "Your web server is not properly set up to deliver .woff2 files. This is typically an issue with the Nginx configuration. For Nextcloud 15 it needs an adjustement to also deliver .woff2 files. Compare your Nginx configuration to the recommended configuration in our documentation." : "您的 Web 服务器未正确设置以传送 .woff2 文件。 这通常是 Nginx 配置的问题。 对于 Nextcloud 15,它需要进行调整才能提供 .woff2 文件。 将您的 Nginx 配置与我们文档中推荐的配置进行比较。",
"Profile information" : "个人信息",
"Profile picture, full name, email, phone number, address, website, Twitter, organisation, role, headline, biography, and whether your profile is enabled" : "个人资料图片、全名、电子邮件、电话号码、地址、网站、Twitter、组织、角色、标题、个人简介以及您的个人资料是否启用",
"Nextcloud settings" : "Nextcloud 设置",
diff --git a/apps/settings/l10n/zh_HK.js b/apps/settings/l10n/zh_HK.js
index 65c9e3b61f2..2b2a6ffacb2 100644
--- a/apps/settings/l10n/zh_HK.js
+++ b/apps/settings/l10n/zh_HK.js
@@ -137,7 +137,6 @@ OC.L10N.register(
"Your remote address could not be determined." : "無法確定您的遠端位址。",
"Your remote address was identified as \"%s\" and is brute-force throttled at the moment slowing down the performance of various requests. If the remote address is not your address this can be an indication that a proxy is not configured correctly." : "您的遠端地址被識別為「%s」,且目前正受到強力限制,導致降低了各種請求的效能。若遠端地址不是您的地址,可能代表代理伺服器設定不正確。",
"Your remote address \"%s\" is not brute-force throttled." : "您的遠端位址「%s」並未受到暴力攻擊限制。",
- "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "若要允許執行此檢查,您必須確保您的網路伺服器可以連線到其自身。因此,其必須可以解析並連線到 `trusted_domains` 或 `overwrite.cli.url` 至少其中一個。此失敗可能是因為伺服器端 DNS 不符或連出防火牆規則造成的。",
"Old administration imported certificates" : "舊的管理員匯入憑證",
"A background job is pending that checks for administration imported SSL certificates. Please check back later." : "背景作業正在檢查管理員匯入的 SSL 憑證。請稍後再檢查。",
"There are some administration imported SSL certificates present, that are not used anymore with Nextcloud 21. They can be imported on the command line via \"occ security:certificates:import\" command. Their paths inside the data directory are shown below." : "有一些管理員匯入的 SSL 憑證,這些在 Nextcloud 21 不再能運作。它們可以透過命令列執行「occ security:certificates:import」命令來匯入。它們在資料目錄中的路徑如下所示。",
@@ -314,9 +313,6 @@ OC.L10N.register(
"Could not check that your web server serves `.well-known` correctly. Please check manually." : "無法檢查您的網頁伺服器是否正確服務“.well-known”。 請手動檢查。",
"Your web server is not properly set up to resolve `.well-known` URLs, failed on:\n`%s`" : "您的網絡伺服器未正確設置以解析`.well-known`的URL,無法在以下位置解決:\n`%s`",
"Your server is correctly configured to serve `.well-known` URLs." : "您的伺服器已正确配置以提供“.well-known” URL。",
- "WOFF2 file loading" : "正在加載 WOFF2 檔案",
- "Could not check for WOFF2 loading support. Please check manually if your webserver serves `.woff2` files." : "無法檢查 WOFF2 載入支援。請手動檢查您的網路伺服器是否可服務 `.woff2` 檔案。",
- "Your web server is not properly set up to deliver .woff2 files. This is typically an issue with the Nginx configuration. For Nextcloud 15 it needs an adjustement to also deliver .woff2 files. Compare your Nginx configuration to the recommended configuration in our documentation." : "您的伺服器並未正確的設定,因此無法傳遞 .woff2 的檔案。這通常是因為 Nginx 的設定問題所導致。在 Nextcloud 15 中,需要一些調整才能一並傳遞 .woff2 的檔案。請檢查您的 Nginx 設定,和 Nextcloud 說明文件中提到的建議設定。",
"Profile information" : "簡介資訊",
"Profile picture, full name, email, phone number, address, website, Twitter, organisation, role, headline, biography, and whether your profile is enabled" : "個人資料圖片、全名、電郵地址、電話號碼、地址、網站、Twitter、組織、角色、標題、傳記以及您的個人資料是否已啟用",
"Nextcloud settings" : "Nextcloud 設定",
@@ -881,6 +877,7 @@ OC.L10N.register(
"SMTP Username" : "SMTP 用戶名稱",
"To allow this check to run you have to make sure that your webserver can connect to itself. Therefor it must be able to resolve and connect to at least one its `trusted_domains` or the `overwrite.cli.url`." : "要執行此檢查,您必須確保您的網路伺服器可以連線到其自身。因此,其必須至少能解析並連線至 `trusted_domains` 或 `overwrite.cli.url` 其中一個。",
"Could not check for JavaScript support via any of your `trusted_domains` nor `overwrite.cli.url`. This may be the result of a server-side DNS mismatch or outbound firewall rule. Please check manually if your webserver serves `.mjs` files using the JavaScript MIME type." : "無法透過您的任何「trusted_domains」或「overwrite.cli.url」檢查 JavaScript 支援。這可能是伺服器端 DNS 不符或連出防火牆規則造成的。請手動檢查您的網頁伺服器是否使用 JavaScript MIME 類型提供「.mjs」檔案。",
- "Active accounts" : "活躍帳戶"
+ "Active accounts" : "活躍帳戶",
+ "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "若要允許執行此檢查,您必須確保您的網路伺服器可以連線到其自身。因此,其必須可以解析並連線到 `trusted_domains` 或 `overwrite.cli.url` 至少其中一個。此失敗可能是因為伺服器端 DNS 不符或連出防火牆規則造成的。"
},
"nplurals=1; plural=0;");
diff --git a/apps/settings/l10n/zh_HK.json b/apps/settings/l10n/zh_HK.json
index 10000e9c032..4cc3ed2b385 100644
--- a/apps/settings/l10n/zh_HK.json
+++ b/apps/settings/l10n/zh_HK.json
@@ -135,7 +135,6 @@
"Your remote address could not be determined." : "無法確定您的遠端位址。",
"Your remote address was identified as \"%s\" and is brute-force throttled at the moment slowing down the performance of various requests. If the remote address is not your address this can be an indication that a proxy is not configured correctly." : "您的遠端地址被識別為「%s」,且目前正受到強力限制,導致降低了各種請求的效能。若遠端地址不是您的地址,可能代表代理伺服器設定不正確。",
"Your remote address \"%s\" is not brute-force throttled." : "您的遠端位址「%s」並未受到暴力攻擊限制。",
- "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "若要允許執行此檢查,您必須確保您的網路伺服器可以連線到其自身。因此,其必須可以解析並連線到 `trusted_domains` 或 `overwrite.cli.url` 至少其中一個。此失敗可能是因為伺服器端 DNS 不符或連出防火牆規則造成的。",
"Old administration imported certificates" : "舊的管理員匯入憑證",
"A background job is pending that checks for administration imported SSL certificates. Please check back later." : "背景作業正在檢查管理員匯入的 SSL 憑證。請稍後再檢查。",
"There are some administration imported SSL certificates present, that are not used anymore with Nextcloud 21. They can be imported on the command line via \"occ security:certificates:import\" command. Their paths inside the data directory are shown below." : "有一些管理員匯入的 SSL 憑證,這些在 Nextcloud 21 不再能運作。它們可以透過命令列執行「occ security:certificates:import」命令來匯入。它們在資料目錄中的路徑如下所示。",
@@ -312,9 +311,6 @@
"Could not check that your web server serves `.well-known` correctly. Please check manually." : "無法檢查您的網頁伺服器是否正確服務“.well-known”。 請手動檢查。",
"Your web server is not properly set up to resolve `.well-known` URLs, failed on:\n`%s`" : "您的網絡伺服器未正確設置以解析`.well-known`的URL,無法在以下位置解決:\n`%s`",
"Your server is correctly configured to serve `.well-known` URLs." : "您的伺服器已正确配置以提供“.well-known” URL。",
- "WOFF2 file loading" : "正在加載 WOFF2 檔案",
- "Could not check for WOFF2 loading support. Please check manually if your webserver serves `.woff2` files." : "無法檢查 WOFF2 載入支援。請手動檢查您的網路伺服器是否可服務 `.woff2` 檔案。",
- "Your web server is not properly set up to deliver .woff2 files. This is typically an issue with the Nginx configuration. For Nextcloud 15 it needs an adjustement to also deliver .woff2 files. Compare your Nginx configuration to the recommended configuration in our documentation." : "您的伺服器並未正確的設定,因此無法傳遞 .woff2 的檔案。這通常是因為 Nginx 的設定問題所導致。在 Nextcloud 15 中,需要一些調整才能一並傳遞 .woff2 的檔案。請檢查您的 Nginx 設定,和 Nextcloud 說明文件中提到的建議設定。",
"Profile information" : "簡介資訊",
"Profile picture, full name, email, phone number, address, website, Twitter, organisation, role, headline, biography, and whether your profile is enabled" : "個人資料圖片、全名、電郵地址、電話號碼、地址、網站、Twitter、組織、角色、標題、傳記以及您的個人資料是否已啟用",
"Nextcloud settings" : "Nextcloud 設定",
@@ -879,6 +875,7 @@
"SMTP Username" : "SMTP 用戶名稱",
"To allow this check to run you have to make sure that your webserver can connect to itself. Therefor it must be able to resolve and connect to at least one its `trusted_domains` or the `overwrite.cli.url`." : "要執行此檢查,您必須確保您的網路伺服器可以連線到其自身。因此,其必須至少能解析並連線至 `trusted_domains` 或 `overwrite.cli.url` 其中一個。",
"Could not check for JavaScript support via any of your `trusted_domains` nor `overwrite.cli.url`. This may be the result of a server-side DNS mismatch or outbound firewall rule. Please check manually if your webserver serves `.mjs` files using the JavaScript MIME type." : "無法透過您的任何「trusted_domains」或「overwrite.cli.url」檢查 JavaScript 支援。這可能是伺服器端 DNS 不符或連出防火牆規則造成的。請手動檢查您的網頁伺服器是否使用 JavaScript MIME 類型提供「.mjs」檔案。",
- "Active accounts" : "活躍帳戶"
+ "Active accounts" : "活躍帳戶",
+ "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "若要允許執行此檢查,您必須確保您的網路伺服器可以連線到其自身。因此,其必須可以解析並連線到 `trusted_domains` 或 `overwrite.cli.url` 至少其中一個。此失敗可能是因為伺服器端 DNS 不符或連出防火牆規則造成的。"
},"pluralForm" :"nplurals=1; plural=0;"
} \ No newline at end of file
diff --git a/apps/settings/l10n/zh_TW.js b/apps/settings/l10n/zh_TW.js
index e751427112e..2bfe32e1b10 100644
--- a/apps/settings/l10n/zh_TW.js
+++ b/apps/settings/l10n/zh_TW.js
@@ -137,7 +137,6 @@ OC.L10N.register(
"Your remote address could not be determined." : "無法確定您的遠端位址。",
"Your remote address was identified as \"%s\" and is brute-force throttled at the moment slowing down the performance of various requests. If the remote address is not your address this can be an indication that a proxy is not configured correctly." : "您的遠端地址被識別為「%s」,且目前正受到強力限制,導致降低了各種請求的效能。若遠端地址不是您的地址,可能代表代理伺服器設定不正確。",
"Your remote address \"%s\" is not brute-force throttled." : "您的遠端位址「%s」並未受到暴力攻擊限制。",
- "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "若要允許執行此檢查,您必須確保您的網路伺服器可以連線到其自身。因此,其必須可以解析並連線到 `trusted_domains` 或 `overwrite.cli.url` 至少其中一個。此失敗可能是因為伺服器端 DNS 不符或連出防火牆規則造成的。",
"Old administration imported certificates" : "舊的管理員匯入憑證",
"A background job is pending that checks for administration imported SSL certificates. Please check back later." : "背景作業正在檢查管理員匯入的 SSL 憑證。請稍後再檢查。",
"There are some administration imported SSL certificates present, that are not used anymore with Nextcloud 21. They can be imported on the command line via \"occ security:certificates:import\" command. Their paths inside the data directory are shown below." : "有一些管理員匯入的 SSL 憑證,這些在 Nextcloud 21 不再能運作。它們可以透過命令列執行「occ security:certificates:import」命令來匯入。它們在資料目錄中的路徑如下所示。",
@@ -314,9 +313,6 @@ OC.L10N.register(
"Could not check that your web server serves `.well-known` correctly. Please check manually." : "無法檢查您的網路伺服器是否正確提供 `.well-known`。請手動檢查。",
"Your web server is not properly set up to resolve `.well-known` URLs, failed on:\n`%s`" : "您的網路伺服器並未正確設定以解析 `.well-known` 的 URL,失敗於:\n`%s`",
"Your server is correctly configured to serve `.well-known` URLs." : "您的伺服器已正確設定以提供`.well-known` URL。",
- "WOFF2 file loading" : "正在載入 WOFF2 檔案",
- "Could not check for WOFF2 loading support. Please check manually if your webserver serves `.woff2` files." : "無法檢查 WOFF2 載入支援。請手動檢查您的網路伺服器是否可服務 `.woff2` 檔案。",
- "Your web server is not properly set up to deliver .woff2 files. This is typically an issue with the Nginx configuration. For Nextcloud 15 it needs an adjustement to also deliver .woff2 files. Compare your Nginx configuration to the recommended configuration in our documentation." : "您的伺服器並未正確的設定,因此無法傳遞 .woff2 的檔案。這通常是因為 Nginx 的設定問題所導致。在 Nextcloud 15 中,需要一些調整才能一併傳遞 .woff2 的檔案。請檢查您的 Nginx 設定,和 Nextcloud 說明文件中提到的建議設定。",
"Profile information" : "個人檔案資訊",
"Profile picture, full name, email, phone number, address, website, Twitter, organisation, role, headline, biography, and whether your profile is enabled" : "個人檔案圖片、全名、電子郵件、電話號碼、地址、網站、Twitter、組織、角色、標題、自傳以及您的個人資料是否已啟用",
"Nextcloud settings" : "Nextcloud 設定",
@@ -881,6 +877,7 @@ OC.L10N.register(
"SMTP Username" : "SMTP 使用者名稱",
"To allow this check to run you have to make sure that your webserver can connect to itself. Therefor it must be able to resolve and connect to at least one its `trusted_domains` or the `overwrite.cli.url`." : "要執行此檢查,您必須確保您的網路伺服器可以連線到其自身。因此,其必須至少能解析並連線至 `trusted_domains` 或 `overwrite.cli.url` 其中一個。",
"Could not check for JavaScript support via any of your `trusted_domains` nor `overwrite.cli.url`. This may be the result of a server-side DNS mismatch or outbound firewall rule. Please check manually if your webserver serves `.mjs` files using the JavaScript MIME type." : "無法透過您的任何「trusted_domains」或「overwrite.cli.url」檢查 JavaScript 支援。這可能是伺服器端 DNS 不符或連出防火牆規則造成的。請手動檢查您的網頁伺服器是否使用 JavaScript MIME 類型提供「.mjs」檔案。",
- "Active accounts" : "活躍帳號"
+ "Active accounts" : "活躍帳號",
+ "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "若要允許執行此檢查,您必須確保您的網路伺服器可以連線到其自身。因此,其必須可以解析並連線到 `trusted_domains` 或 `overwrite.cli.url` 至少其中一個。此失敗可能是因為伺服器端 DNS 不符或連出防火牆規則造成的。"
},
"nplurals=1; plural=0;");
diff --git a/apps/settings/l10n/zh_TW.json b/apps/settings/l10n/zh_TW.json
index 91b5ff49f06..3e3b7ace8d7 100644
--- a/apps/settings/l10n/zh_TW.json
+++ b/apps/settings/l10n/zh_TW.json
@@ -135,7 +135,6 @@
"Your remote address could not be determined." : "無法確定您的遠端位址。",
"Your remote address was identified as \"%s\" and is brute-force throttled at the moment slowing down the performance of various requests. If the remote address is not your address this can be an indication that a proxy is not configured correctly." : "您的遠端地址被識別為「%s」,且目前正受到強力限制,導致降低了各種請求的效能。若遠端地址不是您的地址,可能代表代理伺服器設定不正確。",
"Your remote address \"%s\" is not brute-force throttled." : "您的遠端位址「%s」並未受到暴力攻擊限制。",
- "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "若要允許執行此檢查,您必須確保您的網路伺服器可以連線到其自身。因此,其必須可以解析並連線到 `trusted_domains` 或 `overwrite.cli.url` 至少其中一個。此失敗可能是因為伺服器端 DNS 不符或連出防火牆規則造成的。",
"Old administration imported certificates" : "舊的管理員匯入憑證",
"A background job is pending that checks for administration imported SSL certificates. Please check back later." : "背景作業正在檢查管理員匯入的 SSL 憑證。請稍後再檢查。",
"There are some administration imported SSL certificates present, that are not used anymore with Nextcloud 21. They can be imported on the command line via \"occ security:certificates:import\" command. Their paths inside the data directory are shown below." : "有一些管理員匯入的 SSL 憑證,這些在 Nextcloud 21 不再能運作。它們可以透過命令列執行「occ security:certificates:import」命令來匯入。它們在資料目錄中的路徑如下所示。",
@@ -312,9 +311,6 @@
"Could not check that your web server serves `.well-known` correctly. Please check manually." : "無法檢查您的網路伺服器是否正確提供 `.well-known`。請手動檢查。",
"Your web server is not properly set up to resolve `.well-known` URLs, failed on:\n`%s`" : "您的網路伺服器並未正確設定以解析 `.well-known` 的 URL,失敗於:\n`%s`",
"Your server is correctly configured to serve `.well-known` URLs." : "您的伺服器已正確設定以提供`.well-known` URL。",
- "WOFF2 file loading" : "正在載入 WOFF2 檔案",
- "Could not check for WOFF2 loading support. Please check manually if your webserver serves `.woff2` files." : "無法檢查 WOFF2 載入支援。請手動檢查您的網路伺服器是否可服務 `.woff2` 檔案。",
- "Your web server is not properly set up to deliver .woff2 files. This is typically an issue with the Nginx configuration. For Nextcloud 15 it needs an adjustement to also deliver .woff2 files. Compare your Nginx configuration to the recommended configuration in our documentation." : "您的伺服器並未正確的設定,因此無法傳遞 .woff2 的檔案。這通常是因為 Nginx 的設定問題所導致。在 Nextcloud 15 中,需要一些調整才能一併傳遞 .woff2 的檔案。請檢查您的 Nginx 設定,和 Nextcloud 說明文件中提到的建議設定。",
"Profile information" : "個人檔案資訊",
"Profile picture, full name, email, phone number, address, website, Twitter, organisation, role, headline, biography, and whether your profile is enabled" : "個人檔案圖片、全名、電子郵件、電話號碼、地址、網站、Twitter、組織、角色、標題、自傳以及您的個人資料是否已啟用",
"Nextcloud settings" : "Nextcloud 設定",
@@ -879,6 +875,7 @@
"SMTP Username" : "SMTP 使用者名稱",
"To allow this check to run you have to make sure that your webserver can connect to itself. Therefor it must be able to resolve and connect to at least one its `trusted_domains` or the `overwrite.cli.url`." : "要執行此檢查,您必須確保您的網路伺服器可以連線到其自身。因此,其必須至少能解析並連線至 `trusted_domains` 或 `overwrite.cli.url` 其中一個。",
"Could not check for JavaScript support via any of your `trusted_domains` nor `overwrite.cli.url`. This may be the result of a server-side DNS mismatch or outbound firewall rule. Please check manually if your webserver serves `.mjs` files using the JavaScript MIME type." : "無法透過您的任何「trusted_domains」或「overwrite.cli.url」檢查 JavaScript 支援。這可能是伺服器端 DNS 不符或連出防火牆規則造成的。請手動檢查您的網頁伺服器是否使用 JavaScript MIME 類型提供「.mjs」檔案。",
- "Active accounts" : "活躍帳號"
+ "Active accounts" : "活躍帳號",
+ "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "若要允許執行此檢查,您必須確保您的網路伺服器可以連線到其自身。因此,其必須可以解析並連線到 `trusted_domains` 或 `overwrite.cli.url` 至少其中一個。此失敗可能是因為伺服器端 DNS 不符或連出防火牆規則造成的。"
},"pluralForm" :"nplurals=1; plural=0;"
} \ No newline at end of file
diff --git a/apps/settings/lib/Activity/GroupProvider.php b/apps/settings/lib/Activity/GroupProvider.php
index bad2c0c7a35..fc7189c774d 100644
--- a/apps/settings/lib/Activity/GroupProvider.php
+++ b/apps/settings/lib/Activity/GroupProvider.php
@@ -5,7 +5,7 @@
*/
namespace OCA\Settings\Activity;
-use InvalidArgumentException;
+use OCP\Activity\Exceptions\UnknownActivityException;
use OCP\Activity\IEvent;
use OCP\Activity\IManager;
use OCP\Activity\IProvider;
@@ -48,7 +48,7 @@ class GroupProvider implements IProvider {
public function parse($language, IEvent $event, ?IEvent $previousEvent = null) {
if ($event->getType() !== 'group_settings') {
- throw new InvalidArgumentException();
+ throw new UnknownActivityException();
}
$l = $this->l10n->get('settings', $language);
@@ -95,7 +95,7 @@ class GroupProvider implements IProvider {
}
break;
default:
- throw new InvalidArgumentException();
+ throw new UnknownActivityException();
}
$this->setSubjects($event, $subject, $parsedParameters);
diff --git a/apps/settings/lib/Activity/Provider.php b/apps/settings/lib/Activity/Provider.php
index ab9a8e3c85c..8d726c8da22 100644
--- a/apps/settings/lib/Activity/Provider.php
+++ b/apps/settings/lib/Activity/Provider.php
@@ -8,6 +8,7 @@ declare(strict_types=1);
*/
namespace OCA\Settings\Activity;
+use OCP\Activity\Exceptions\UnknownActivityException;
use OCP\Activity\IEvent;
use OCP\Activity\IManager;
use OCP\Activity\IProvider;
@@ -60,12 +61,12 @@ class Provider implements IProvider {
* @param IEvent $event
* @param IEvent|null $previousEvent
* @return IEvent
- * @throws \InvalidArgumentException
+ * @throws UnknownActivityException
* @since 11.0.0
*/
public function parse($language, IEvent $event, ?IEvent $previousEvent = null): IEvent {
if ($event->getApp() !== 'settings') {
- throw new \InvalidArgumentException('Unknown app');
+ throw new UnknownActivityException('Unknown app');
}
$this->l = $this->languageFactory->get('settings', $language);
@@ -105,7 +106,7 @@ class Provider implements IProvider {
} elseif ($event->getSubject() === self::APP_TOKEN_FILESYSTEM_REVOKED) {
$subject = $this->l->t('You revoked filesystem access from app password "{token}"');
} else {
- throw new \InvalidArgumentException('Unknown subject');
+ throw new UnknownActivityException('Unknown subject');
}
$parsedParameters = $this->getParameters($event);
diff --git a/apps/settings/lib/Activity/SecurityProvider.php b/apps/settings/lib/Activity/SecurityProvider.php
index a67b9cf365e..8e2b4f8f45a 100644
--- a/apps/settings/lib/Activity/SecurityProvider.php
+++ b/apps/settings/lib/Activity/SecurityProvider.php
@@ -8,7 +8,7 @@ declare(strict_types=1);
*/
namespace OCA\Settings\Activity;
-use InvalidArgumentException;
+use OCP\Activity\Exceptions\UnknownActivityException;
use OCP\Activity\IEvent;
use OCP\Activity\IManager;
use OCP\Activity\IProvider;
@@ -34,7 +34,7 @@ class SecurityProvider implements IProvider {
public function parse($language, IEvent $event, ?IEvent $previousEvent = null) {
if ($event->getType() !== 'security') {
- throw new InvalidArgumentException();
+ throw new UnknownActivityException();
}
$l = $this->l10n->get('settings', $language);
@@ -85,7 +85,7 @@ class SecurityProvider implements IProvider {
}
break;
default:
- throw new InvalidArgumentException();
+ throw new UnknownActivityException();
}
return $event;
}
diff --git a/apps/settings/lib/Controller/AdminSettingsController.php b/apps/settings/lib/Controller/AdminSettingsController.php
index 9ba1892afaf..25338f64326 100644
--- a/apps/settings/lib/Controller/AdminSettingsController.php
+++ b/apps/settings/lib/Controller/AdminSettingsController.php
@@ -20,7 +20,6 @@ use OCP\IUser;
use OCP\IUserSession;
use OCP\Settings\IDeclarativeManager;
use OCP\Settings\IManager as ISettingsManager;
-use OCP\Template;
#[OpenAPI(scope: OpenAPI::SCOPE_IGNORE)]
class AdminSettingsController extends Controller {
@@ -65,47 +64,12 @@ class AdminSettingsController extends Controller {
protected function getSettings($section) {
/** @var IUser $user */
$user = $this->userSession->getUser();
- $isSubAdmin = !$this->groupManager->isAdmin($user->getUID()) && $this->subAdmin->isSubAdmin($user);
$settings = $this->settingsManager->getAllowedAdminSettings($section, $user);
$declarativeFormIDs = $this->declarativeSettingsManager->getFormIDs($user, 'admin', $section);
if (empty($settings) && empty($declarativeFormIDs)) {
throw new NotAdminException("Logged in user doesn't have permission to access these settings.");
}
$formatted = $this->formatSettings($settings);
- // Do not show legacy forms for sub admins
- if ($section === 'additional' && !$isSubAdmin) {
- $formatted['content'] .= $this->getLegacyForms();
- }
return $formatted;
}
-
- /**
- * @return bool|string
- */
- private function getLegacyForms() {
- $forms = \OC_App::getForms('admin');
-
- $forms = array_map(function ($form) {
- if (preg_match('%(<h2(?P<class>[^>]*)>.*?</h2>)%i', $form, $regs)) {
- $sectionName = str_replace('<h2' . $regs['class'] . '>', '', $regs[0]);
- $sectionName = str_replace('</h2>', '', $sectionName);
- $anchor = strtolower($sectionName);
- $anchor = str_replace(' ', '-', $anchor);
-
- return [
- 'anchor' => $anchor,
- 'section-name' => $sectionName,
- 'form' => $form
- ];
- }
- return [
- 'form' => $form
- ];
- }, $forms);
-
- $out = new Template('settings', 'settings/additional');
- $out->assign('forms', $forms);
-
- return $out->fetchPage();
- }
}
diff --git a/apps/settings/lib/Controller/CommonSettingsTrait.php b/apps/settings/lib/Controller/CommonSettingsTrait.php
index eaf8e6c3774..dd307b67fab 100644
--- a/apps/settings/lib/Controller/CommonSettingsTrait.php
+++ b/apps/settings/lib/Controller/CommonSettingsTrait.php
@@ -75,7 +75,7 @@ trait CommonSettingsTrait {
/** @psalm-suppress PossiblyNullArgument */
$declarativeFormIDs = $this->declarativeSettingsManager->getFormIDs($this->userSession->getUser(), $type, $section->getID());
- if (empty($settings) && empty($declarativeFormIDs) && !($section->getID() === 'additional' && count(\OC_App::getForms('admin')) > 0)) {
+ if (empty($settings) && empty($declarativeFormIDs)) {
continue;
}
diff --git a/apps/settings/lib/Controller/PersonalSettingsController.php b/apps/settings/lib/Controller/PersonalSettingsController.php
index db74d26e1f6..1a31a20eb04 100644
--- a/apps/settings/lib/Controller/PersonalSettingsController.php
+++ b/apps/settings/lib/Controller/PersonalSettingsController.php
@@ -18,7 +18,6 @@ use OCP\IRequest;
use OCP\IUserSession;
use OCP\Settings\IDeclarativeManager;
use OCP\Settings\IManager as ISettingsManager;
-use OCP\Template;
#[OpenAPI(scope: OpenAPI::SCOPE_IGNORE)]
class PersonalSettingsController extends Controller {
@@ -61,39 +60,6 @@ class PersonalSettingsController extends Controller {
protected function getSettings($section) {
$settings = $this->settingsManager->getPersonalSettings($section);
$formatted = $this->formatSettings($settings);
- if ($section === 'additional') {
- $formatted['content'] .= $this->getLegacyForms();
- }
return $formatted;
}
-
- /**
- * @return bool|string
- */
- private function getLegacyForms() {
- $forms = \OC_App::getForms('personal');
-
- $forms = array_map(function ($form) {
- if (preg_match('%(<h2(?P<class>[^>]*)>.*?</h2>)%i', $form, $regs)) {
- $sectionName = str_replace('<h2' . $regs['class'] . '>', '', $regs[0]);
- $sectionName = str_replace('</h2>', '', $sectionName);
- $anchor = strtolower($sectionName);
- $anchor = str_replace(' ', '-', $anchor);
-
- return [
- 'anchor' => $anchor,
- 'section-name' => $sectionName,
- 'form' => $form
- ];
- }
- return [
- 'form' => $form
- ];
- }, $forms);
-
- $out = new Template('settings', 'settings/additional');
- $out->assign('forms', $forms);
-
- return $out->fetchPage();
- }
}
diff --git a/apps/settings/lib/Settings/Admin/Mail.php b/apps/settings/lib/Settings/Admin/Mail.php
index 0775b50aaa1..a94e3da18fe 100644
--- a/apps/settings/lib/Settings/Admin/Mail.php
+++ b/apps/settings/lib/Settings/Admin/Mail.php
@@ -6,6 +6,7 @@
namespace OCA\Settings\Settings\Admin;
use OCP\AppFramework\Http\TemplateResponse;
+use OCP\IBinaryFinder;
use OCP\IConfig;
use OCP\IL10N;
use OCP\Settings\IDelegatedSettings;
@@ -32,7 +33,7 @@ class Mail implements IDelegatedSettings {
public function getForm() {
$parameters = [
// Mail
- 'sendmail_is_available' => (bool)\OC_Helper::findBinaryPath('sendmail'),
+ 'sendmail_is_available' => (bool)\OCP\Server::get(IBinaryFinder::class)->findBinaryPath('sendmail'),
'mail_domain' => $this->config->getSystemValue('mail_domain', ''),
'mail_from_address' => $this->config->getSystemValue('mail_from_address', ''),
'mail_smtpmode' => $this->config->getSystemValue('mail_smtpmode', ''),
diff --git a/apps/settings/lib/SetupChecks/DataDirectoryProtected.php b/apps/settings/lib/SetupChecks/DataDirectoryProtected.php
index 051494adb62..4280457ced0 100644
--- a/apps/settings/lib/SetupChecks/DataDirectoryProtected.php
+++ b/apps/settings/lib/SetupChecks/DataDirectoryProtected.php
@@ -12,6 +12,7 @@ use OCP\Http\Client\IClientService;
use OCP\IConfig;
use OCP\IL10N;
use OCP\IURLGenerator;
+use OCP\SetupCheck\CheckServerResponseTrait;
use OCP\SetupCheck\ISetupCheck;
use OCP\SetupCheck\SetupResult;
use Psr\Log\LoggerInterface;
diff --git a/apps/settings/lib/SetupChecks/JavaScriptModules.php b/apps/settings/lib/SetupChecks/JavaScriptModules.php
index ae19eacec7b..e09dc459dc8 100644
--- a/apps/settings/lib/SetupChecks/JavaScriptModules.php
+++ b/apps/settings/lib/SetupChecks/JavaScriptModules.php
@@ -12,6 +12,7 @@ use OCP\Http\Client\IClientService;
use OCP\IConfig;
use OCP\IL10N;
use OCP\IURLGenerator;
+use OCP\SetupCheck\CheckServerResponseTrait;
use OCP\SetupCheck\ISetupCheck;
use OCP\SetupCheck\SetupResult;
use Psr\Log\LoggerInterface;
@@ -43,7 +44,7 @@ class JavaScriptModules implements ISetupCheck {
$testFile = $this->urlGenerator->linkTo('settings', 'js/esm-test.mjs');
$noResponse = true;
- foreach ($this->runHEAD($testFile) as $response) {
+ foreach ($this->runRequest('HEAD', $testFile) as $response) {
$noResponse = false;
if (preg_match('/(text|application)\/javascript/i', $response->getHeader('Content-Type'))) {
return SetupResult::success();
diff --git a/apps/settings/lib/SetupChecks/JavaScriptSourceMaps.php b/apps/settings/lib/SetupChecks/JavaScriptSourceMaps.php
index 85cbe872339..dcfc40192b9 100644
--- a/apps/settings/lib/SetupChecks/JavaScriptSourceMaps.php
+++ b/apps/settings/lib/SetupChecks/JavaScriptSourceMaps.php
@@ -12,6 +12,7 @@ use OCP\Http\Client\IClientService;
use OCP\IConfig;
use OCP\IL10N;
use OCP\IURLGenerator;
+use OCP\SetupCheck\CheckServerResponseTrait;
use OCP\SetupCheck\ISetupCheck;
use OCP\SetupCheck\SetupResult;
use Psr\Log\LoggerInterface;
@@ -42,7 +43,7 @@ class JavaScriptSourceMaps implements ISetupCheck {
public function run(): SetupResult {
$testFile = $this->urlGenerator->linkTo('settings', 'js/map-test.js.map');
- foreach ($this->runHEAD($testFile) as $response) {
+ foreach ($this->runRequest('HEAD', $testFile) as $response) {
return SetupResult::success();
}
diff --git a/apps/settings/lib/SetupChecks/OcxProviders.php b/apps/settings/lib/SetupChecks/OcxProviders.php
index 84da99dbfb0..191341b0ee4 100644
--- a/apps/settings/lib/SetupChecks/OcxProviders.php
+++ b/apps/settings/lib/SetupChecks/OcxProviders.php
@@ -12,6 +12,7 @@ use OCP\Http\Client\IClientService;
use OCP\IConfig;
use OCP\IL10N;
use OCP\IURLGenerator;
+use OCP\SetupCheck\CheckServerResponseTrait;
use OCP\SetupCheck\ISetupCheck;
use OCP\SetupCheck\SetupResult;
use Psr\Log\LoggerInterface;
diff --git a/apps/settings/lib/SetupChecks/SecurityHeaders.php b/apps/settings/lib/SetupChecks/SecurityHeaders.php
index a6dbc631b5c..b85ab9b4018 100644
--- a/apps/settings/lib/SetupChecks/SecurityHeaders.php
+++ b/apps/settings/lib/SetupChecks/SecurityHeaders.php
@@ -13,6 +13,7 @@ use OCP\Http\Client\IClientService;
use OCP\IConfig;
use OCP\IL10N;
use OCP\IURLGenerator;
+use OCP\SetupCheck\CheckServerResponseTrait;
use OCP\SetupCheck\ISetupCheck;
use OCP\SetupCheck\SetupResult;
use Psr\Log\LoggerInterface;
@@ -71,8 +72,8 @@ class SecurityHeaders implements ISetupCheck {
}
}
- $xssfields = array_map('trim', explode(';', $response->getHeader('X-XSS-Protection')));
- if (!in_array('1', $xssfields) || !in_array('mode=block', $xssfields)) {
+ $xssFields = array_map('trim', explode(';', $response->getHeader('X-XSS-Protection')));
+ if (!in_array('1', $xssFields) || !in_array('mode=block', $xssFields)) {
$msg .= $this->l10n->t('- The `%1$s` HTTP header does not contain `%2$s`. This is a potential security or privacy risk, as it is recommended to adjust this setting accordingly.', ['X-XSS-Protection', '1; mode=block'])."\n";
}
diff --git a/apps/settings/lib/SetupChecks/WellKnownUrls.php b/apps/settings/lib/SetupChecks/WellKnownUrls.php
index 623b9fae90c..9fdaca996b8 100644
--- a/apps/settings/lib/SetupChecks/WellKnownUrls.php
+++ b/apps/settings/lib/SetupChecks/WellKnownUrls.php
@@ -13,6 +13,7 @@ use OCP\Http\Client\IClientService;
use OCP\IConfig;
use OCP\IL10N;
use OCP\IURLGenerator;
+use OCP\SetupCheck\CheckServerResponseTrait;
use OCP\SetupCheck\ISetupCheck;
use OCP\SetupCheck\SetupResult;
use Psr\Log\LoggerInterface;
diff --git a/apps/settings/lib/SetupChecks/Woff2Loading.php b/apps/settings/lib/SetupChecks/Woff2Loading.php
index 769653c4618..27aff4ea999 100644
--- a/apps/settings/lib/SetupChecks/Woff2Loading.php
+++ b/apps/settings/lib/SetupChecks/Woff2Loading.php
@@ -12,6 +12,7 @@ use OCP\Http\Client\IClientService;
use OCP\IConfig;
use OCP\IL10N;
use OCP\IURLGenerator;
+use OCP\SetupCheck\CheckServerResponseTrait;
use OCP\SetupCheck\ISetupCheck;
use OCP\SetupCheck\SetupResult;
use Psr\Log\LoggerInterface;
@@ -49,7 +50,7 @@ class Woff2Loading implements ISetupCheck {
protected function checkFont(string $fileExtension, string $url): SetupResult {
$noResponse = true;
- $responses = $this->runHEAD($url);
+ $responses = $this->runRequest('HEAD', $url);
foreach ($responses as $response) {
$noResponse = false;
if ($response->getStatusCode() === 200) {
diff --git a/apps/settings/src/router/routes.ts b/apps/settings/src/router/routes.ts
index 7182a606309..35b3b1306d5 100644
--- a/apps/settings/src/router/routes.ts
+++ b/apps/settings/src/router/routes.ts
@@ -3,6 +3,9 @@
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
import type { RouteConfig } from 'vue-router'
+import { loadState } from '@nextcloud/initial-state'
+
+const appstoreEnabled = loadState<boolean>('settings', 'appstoreEnabled', true)
// Dynamic loading
const AppStore = () => import(/* webpackChunkName: 'settings-apps-view' */'../views/AppStore.vue')
@@ -31,11 +34,10 @@ const routes: RouteConfig[] = [
{
path: '/:index(index.php/)?settings/apps',
name: 'apps',
- // redirect to our default route - the app discover section
redirect: {
name: 'apps-category',
params: {
- category: 'discover',
+ category: appstoreEnabled ? 'discover' : 'installed',
},
},
components: {
diff --git a/apps/settings/src/views/AppStoreNavigation.vue b/apps/settings/src/views/AppStoreNavigation.vue
index 98aee80a802..b7ba24c3e4b 100644
--- a/apps/settings/src/views/AppStoreNavigation.vue
+++ b/apps/settings/src/views/AppStoreNavigation.vue
@@ -6,7 +6,8 @@
<!-- Categories & filters -->
<NcAppNavigation :aria-label="t('settings', 'Apps')">
<template #list>
- <NcAppNavigationItem id="app-category-discover"
+ <NcAppNavigationItem v-if="appstoreEnabled"
+ id="app-category-discover"
:to="{ name: 'apps-category', params: { category: 'discover'} }"
:name="APPS_SECTION_ENUM.discover">
<template #icon>
diff --git a/apps/settings/tests/Settings/Admin/MailTest.php b/apps/settings/tests/Settings/Admin/MailTest.php
index 021dbac241b..8ea0ea9bb0c 100644
--- a/apps/settings/tests/Settings/Admin/MailTest.php
+++ b/apps/settings/tests/Settings/Admin/MailTest.php
@@ -7,6 +7,7 @@ namespace OCA\Settings\Tests\Settings\Admin;
use OCA\Settings\Settings\Admin\Mail;
use OCP\AppFramework\Http\TemplateResponse;
+use OCP\IBinaryFinder;
use OCP\IConfig;
use OCP\IL10N;
use Test\TestCase;
@@ -51,7 +52,7 @@ class MailTest extends TestCase {
'settings',
'settings/admin/additional-mail',
[
- 'sendmail_is_available' => (bool)\OC_Helper::findBinaryPath('sendmail'),
+ 'sendmail_is_available' => (bool)\OCP\Server::get(IBinaryFinder::class)->findBinaryPath('sendmail'),
'mail_domain' => 'mx.nextcloud.com',
'mail_from_address' => 'no-reply@nextcloud.com',
'mail_smtpmode' => 'smtp',
diff --git a/apps/sharebymail/lib/Activity.php b/apps/sharebymail/lib/Activity.php
index bee75c48264..be9deeb7290 100644
--- a/apps/sharebymail/lib/Activity.php
+++ b/apps/sharebymail/lib/Activity.php
@@ -5,6 +5,7 @@
*/
namespace OCA\ShareByMail;
+use OCP\Activity\Exceptions\UnknownActivityException;
use OCP\Activity\IEvent;
use OCP\Activity\IManager;
use OCP\Activity\IProvider;
@@ -62,12 +63,12 @@ class Activity implements IProvider {
* @param IEvent $event
* @param IEvent|null $previousEvent
* @return IEvent
- * @throws \InvalidArgumentException
+ * @throws UnknownActivityException
* @since 11.0.0
*/
public function parse($language, IEvent $event, ?IEvent $previousEvent = null) {
if ($event->getApp() !== 'sharebymail') {
- throw new \InvalidArgumentException();
+ throw new UnknownActivityException();
}
$this->l = $this->languageFactory->get('sharebymail', $language);
diff --git a/apps/systemtags/lib/Activity/Provider.php b/apps/systemtags/lib/Activity/Provider.php
index b3685990ffd..ba24dff31a8 100644
--- a/apps/systemtags/lib/Activity/Provider.php
+++ b/apps/systemtags/lib/Activity/Provider.php
@@ -5,6 +5,7 @@
*/
namespace OCA\SystemTags\Activity;
+use OCP\Activity\Exceptions\UnknownActivityException;
use OCP\Activity\IEvent;
use OCP\Activity\IManager;
use OCP\Activity\IProvider;
@@ -54,12 +55,12 @@ class Provider implements IProvider {
* @param IEvent $event
* @param IEvent|null $previousEvent
* @return IEvent
- * @throws \InvalidArgumentException
+ * @throws UnknownActivityException
* @since 11.0.0
*/
public function parse($language, IEvent $event, ?IEvent $previousEvent = null) {
if ($event->getApp() !== 'systemtags') {
- throw new \InvalidArgumentException();
+ throw new UnknownActivityException();
}
$this->l = $this->languageFactory->get('systemtags', $language);
diff --git a/apps/twofactor_backupcodes/lib/Activity/Provider.php b/apps/twofactor_backupcodes/lib/Activity/Provider.php
index 567d2c4995c..7bf0db04e77 100644
--- a/apps/twofactor_backupcodes/lib/Activity/Provider.php
+++ b/apps/twofactor_backupcodes/lib/Activity/Provider.php
@@ -8,7 +8,7 @@ declare(strict_types=1);
*/
namespace OCA\TwoFactorBackupCodes\Activity;
-use InvalidArgumentException;
+use OCP\Activity\Exceptions\UnknownActivityException;
use OCP\Activity\IEvent;
use OCP\Activity\IManager;
use OCP\Activity\IProvider;
@@ -39,7 +39,7 @@ class Provider implements IProvider {
public function parse($language, IEvent $event, ?IEvent $previousEvent = null): IEvent {
if ($event->getApp() !== 'twofactor_backupcodes') {
- throw new InvalidArgumentException();
+ throw new UnknownActivityException();
}
$l = $this->l10n->get('twofactor_backupcodes', $language);
@@ -55,7 +55,7 @@ class Provider implements IProvider {
}
break;
default:
- throw new InvalidArgumentException();
+ throw new UnknownActivityException();
}
return $event;
}
diff --git a/apps/user_ldap/l10n/ar.js b/apps/user_ldap/l10n/ar.js
index 7f37a0df580..b94b6e9882c 100644
--- a/apps/user_ldap/l10n/ar.js
+++ b/apps/user_ldap/l10n/ar.js
@@ -62,10 +62,6 @@ OC.L10N.register(
"_Your password will expire within %n day._::_Your password will expire within %n days._" : ["سوف تنتهي صلاحية كلمة المرور الخاصة بك خلال %n أيام.","سوف تنتهي صلاحية كلمة المرور الخاصة بك خلال %nيوم.","سوف تنتهي صلاحية كلمة المرور الخاصة بك خلال %nأيام.","سوف تنتهي صلاحية كلمة المرور الخاصة بك خلال %nأيام.","سوف تنتهي صلاحية كلمة المرور الخاصة بك خلال %nأيام.","سوف تنتهي صلاحية كلمة المرور الخاصة بك خلال %nأيام."],
"LDAP/AD integration" : "مُكاملة LDAP/AD ",
"LDAP Connection" : "الاتصال بدليل المستخدِمين LDAP ",
- "_Binding failed for this LDAP configuration: %s_::_Binding failed for these LDAP configurations: %s_" : ["تعذّر االارتباط مع تكوينات LDAP هذه: %s","تعذّر الارتباط مع تكوينات LDAP هذه: %s","تعذّر الارتباط مع تكوينات LDAP هذه: %s","تعذّر الارتباط مع تكوينات LDAP هذه: %s","تعذّر الارتباط مع تكوينات LDAP هذه: %s","تعذّر الارتباط مع تكوينات LDAP هذه: %s"],
- "_Searching failed for this LDAP configuration: %s_::_Searching failed for these LDAP configurations: %s_" : ["فشل البحث في تكوينات LDAP هذه: %s","فشل البحث في تكوينات LDAP هذه: %s","فشل البحث في تكوينات LDAP هذه: %s","فشل البحث في تكوينات LDAP هذه: %s","فشل البحث في تكوينات LDAP هذه:%s","فشل البحث في تكوينات LDAP هذه: %s"],
- "_There is an inactive LDAP configuration: %s_::_There are inactive LDAP configurations: %s_" : ["هنالك تكوينات LDAP غير نشطة: %s","هنالك تكوينات LDAP غير نشطة: %s","هنالك تكوينات LDAP غير نشطة: %s","هنالك تكوينات LDAP غير نشطة: %s","هنالك تكوينات LDAP غير نشطة: %s","هنالك تكوينات LDAP غير نشطة: %s"],
- "_Binding and searching works on the configured LDAP connection (%s)_::_Binding and searching works on all of the configured LDAP connections (%s)_" : ["الارتباط و البحث يعمل بشكل جيد على كل اتصالات LDAP التي تمّ تكوينها (%s)","الارتباط و البحث يعمل بشكل جيد على كل اتصالات LDAP التي تمّ تكوينها (%s)","الارتباط و البحث يعمل بشكل جيد على كل اتصالات LDAP التي تمّ تكوينها (%s)","الارتباط و البحث يعمل بشكل جيد على كل اتصالات LDAP التي تمّ تكوينها (%s)","الارتباط و البحث يعمل بشكل جيد على كل اتصالات LDAP التي تمّ تكوينها (%s)","الارتباط و البحث يعمل بشكل جيد على كل اتصالات LDAP التي تمّ تكوينها (%s)"],
"Invalid LDAP UUIDs" : "مُعرِّفات UUID الخاصة بـ LDAP غير صحيحة",
"None found" : "لم يُمكن العثور على أي شيء",
"Invalid UUIDs of LDAP accounts or groups have been found. Please review your \"Override UUID detection\" settings in the Expert part of the LDAP configuration and use \"occ ldap:update-uuid\" to update them." : "تم العثور على مُعرِّفات UUID غير صالحة لحسابات أو مجموعات LDAP. الرجاء مراجعة الإعداد \"تجاوز اكتشاف UUID ـ Override UUID detection\" في الجزء الخبير من تكوين LDAP ثم اعطِ الأمر السطري: \"occ ldap:update-uuid\" لتحديثها",
diff --git a/apps/user_ldap/l10n/ar.json b/apps/user_ldap/l10n/ar.json
index d1362674293..d68124f4986 100644
--- a/apps/user_ldap/l10n/ar.json
+++ b/apps/user_ldap/l10n/ar.json
@@ -60,10 +60,6 @@
"_Your password will expire within %n day._::_Your password will expire within %n days._" : ["سوف تنتهي صلاحية كلمة المرور الخاصة بك خلال %n أيام.","سوف تنتهي صلاحية كلمة المرور الخاصة بك خلال %nيوم.","سوف تنتهي صلاحية كلمة المرور الخاصة بك خلال %nأيام.","سوف تنتهي صلاحية كلمة المرور الخاصة بك خلال %nأيام.","سوف تنتهي صلاحية كلمة المرور الخاصة بك خلال %nأيام.","سوف تنتهي صلاحية كلمة المرور الخاصة بك خلال %nأيام."],
"LDAP/AD integration" : "مُكاملة LDAP/AD ",
"LDAP Connection" : "الاتصال بدليل المستخدِمين LDAP ",
- "_Binding failed for this LDAP configuration: %s_::_Binding failed for these LDAP configurations: %s_" : ["تعذّر االارتباط مع تكوينات LDAP هذه: %s","تعذّر الارتباط مع تكوينات LDAP هذه: %s","تعذّر الارتباط مع تكوينات LDAP هذه: %s","تعذّر الارتباط مع تكوينات LDAP هذه: %s","تعذّر الارتباط مع تكوينات LDAP هذه: %s","تعذّر الارتباط مع تكوينات LDAP هذه: %s"],
- "_Searching failed for this LDAP configuration: %s_::_Searching failed for these LDAP configurations: %s_" : ["فشل البحث في تكوينات LDAP هذه: %s","فشل البحث في تكوينات LDAP هذه: %s","فشل البحث في تكوينات LDAP هذه: %s","فشل البحث في تكوينات LDAP هذه: %s","فشل البحث في تكوينات LDAP هذه:%s","فشل البحث في تكوينات LDAP هذه: %s"],
- "_There is an inactive LDAP configuration: %s_::_There are inactive LDAP configurations: %s_" : ["هنالك تكوينات LDAP غير نشطة: %s","هنالك تكوينات LDAP غير نشطة: %s","هنالك تكوينات LDAP غير نشطة: %s","هنالك تكوينات LDAP غير نشطة: %s","هنالك تكوينات LDAP غير نشطة: %s","هنالك تكوينات LDAP غير نشطة: %s"],
- "_Binding and searching works on the configured LDAP connection (%s)_::_Binding and searching works on all of the configured LDAP connections (%s)_" : ["الارتباط و البحث يعمل بشكل جيد على كل اتصالات LDAP التي تمّ تكوينها (%s)","الارتباط و البحث يعمل بشكل جيد على كل اتصالات LDAP التي تمّ تكوينها (%s)","الارتباط و البحث يعمل بشكل جيد على كل اتصالات LDAP التي تمّ تكوينها (%s)","الارتباط و البحث يعمل بشكل جيد على كل اتصالات LDAP التي تمّ تكوينها (%s)","الارتباط و البحث يعمل بشكل جيد على كل اتصالات LDAP التي تمّ تكوينها (%s)","الارتباط و البحث يعمل بشكل جيد على كل اتصالات LDAP التي تمّ تكوينها (%s)"],
"Invalid LDAP UUIDs" : "مُعرِّفات UUID الخاصة بـ LDAP غير صحيحة",
"None found" : "لم يُمكن العثور على أي شيء",
"Invalid UUIDs of LDAP accounts or groups have been found. Please review your \"Override UUID detection\" settings in the Expert part of the LDAP configuration and use \"occ ldap:update-uuid\" to update them." : "تم العثور على مُعرِّفات UUID غير صالحة لحسابات أو مجموعات LDAP. الرجاء مراجعة الإعداد \"تجاوز اكتشاف UUID ـ Override UUID detection\" في الجزء الخبير من تكوين LDAP ثم اعطِ الأمر السطري: \"occ ldap:update-uuid\" لتحديثها",
diff --git a/apps/user_ldap/l10n/de.js b/apps/user_ldap/l10n/de.js
index 9e402a7bb25..36a24ce8f61 100644
--- a/apps/user_ldap/l10n/de.js
+++ b/apps/user_ldap/l10n/de.js
@@ -62,10 +62,6 @@ OC.L10N.register(
"_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Dein Passwort läuft in %n Tag ab","Dein Passwort läuft in %n Tagen ab"],
"LDAP/AD integration" : "LDAP/AD-Integration",
"LDAP Connection" : "LDAP-Verbindung",
- "_Binding failed for this LDAP configuration: %s_::_Binding failed for these LDAP configurations: %s_" : ["Die Anbindung ist für folgende LDAP-Konfiguration fehlgeschlagen: %s","Die Anbindung ist für folgende LDAP-Konfigurationen fehlgeschlagen: %s"],
- "_Searching failed for this LDAP configuration: %s_::_Searching failed for these LDAP configurations: %s_" : ["Die Suche nach dieser LDAP-Konfiguration ist fehlgeschlagen: %s","Die Suche nach diesen LDAP-Konfigurationen ist fehlgeschlagen: %s"],
- "_There is an inactive LDAP configuration: %s_::_There are inactive LDAP configurations: %s_" : ["Es gibt eine inaktiv LDAP-Konfiguration: %s","Es gibt inaktive LDAP-Konfigurationen: %s"],
- "_Binding and searching works on the configured LDAP connection (%s)_::_Binding and searching works on all of the configured LDAP connections (%s)_" : ["Anbindung und Suche funktionieren mit der eingerichteten LDAP-Verbindung (%s)","Anbindung und Suche funktionieren mit allen eingerichteten LDAP-Verbindungen (%s)"],
"Invalid LDAP UUIDs" : "Ungültige LDAP-UUIDs",
"None found" : "Keine gefunden",
"Invalid UUIDs of LDAP accounts or groups have been found. Please review your \"Override UUID detection\" settings in the Expert part of the LDAP configuration and use \"occ ldap:update-uuid\" to update them." : "Es wurden ungültige UUIDs von LDAP-Konten oder -Gruppen gefunden. Bitte überprüfe deine „UUID-Erkennung überschreiben“-Einstellungen im Expertenteil der LDAP-Konfiguration und verwende „occ ldap:update-uuid“, um sie zu aktualisieren.",
diff --git a/apps/user_ldap/l10n/de.json b/apps/user_ldap/l10n/de.json
index 81fc75fff5e..63e8e120c4b 100644
--- a/apps/user_ldap/l10n/de.json
+++ b/apps/user_ldap/l10n/de.json
@@ -60,10 +60,6 @@
"_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Dein Passwort läuft in %n Tag ab","Dein Passwort läuft in %n Tagen ab"],
"LDAP/AD integration" : "LDAP/AD-Integration",
"LDAP Connection" : "LDAP-Verbindung",
- "_Binding failed for this LDAP configuration: %s_::_Binding failed for these LDAP configurations: %s_" : ["Die Anbindung ist für folgende LDAP-Konfiguration fehlgeschlagen: %s","Die Anbindung ist für folgende LDAP-Konfigurationen fehlgeschlagen: %s"],
- "_Searching failed for this LDAP configuration: %s_::_Searching failed for these LDAP configurations: %s_" : ["Die Suche nach dieser LDAP-Konfiguration ist fehlgeschlagen: %s","Die Suche nach diesen LDAP-Konfigurationen ist fehlgeschlagen: %s"],
- "_There is an inactive LDAP configuration: %s_::_There are inactive LDAP configurations: %s_" : ["Es gibt eine inaktiv LDAP-Konfiguration: %s","Es gibt inaktive LDAP-Konfigurationen: %s"],
- "_Binding and searching works on the configured LDAP connection (%s)_::_Binding and searching works on all of the configured LDAP connections (%s)_" : ["Anbindung und Suche funktionieren mit der eingerichteten LDAP-Verbindung (%s)","Anbindung und Suche funktionieren mit allen eingerichteten LDAP-Verbindungen (%s)"],
"Invalid LDAP UUIDs" : "Ungültige LDAP-UUIDs",
"None found" : "Keine gefunden",
"Invalid UUIDs of LDAP accounts or groups have been found. Please review your \"Override UUID detection\" settings in the Expert part of the LDAP configuration and use \"occ ldap:update-uuid\" to update them." : "Es wurden ungültige UUIDs von LDAP-Konten oder -Gruppen gefunden. Bitte überprüfe deine „UUID-Erkennung überschreiben“-Einstellungen im Expertenteil der LDAP-Konfiguration und verwende „occ ldap:update-uuid“, um sie zu aktualisieren.",
diff --git a/apps/user_ldap/l10n/de_DE.js b/apps/user_ldap/l10n/de_DE.js
index 2962769871a..8d18c4a8824 100644
--- a/apps/user_ldap/l10n/de_DE.js
+++ b/apps/user_ldap/l10n/de_DE.js
@@ -62,10 +62,6 @@ OC.L10N.register(
"_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Ihr Passwort läuft in %n Tag ab.","Ihr Passwort läuft in %n Tagen ab."],
"LDAP/AD integration" : "LDAP/AD-Integration",
"LDAP Connection" : "LDAP-Verbindung",
- "_Binding failed for this LDAP configuration: %s_::_Binding failed for these LDAP configurations: %s_" : ["Die Anbindung ist für folgende LDAP-Konfiguration fehlgeschlagen: %s","Die Anbindung ist für folgende LDAP-Konfigurationen fehlgeschlagen: %s"],
- "_Searching failed for this LDAP configuration: %s_::_Searching failed for these LDAP configurations: %s_" : ["Die Suche nach dieser LDAP-Konfiguration ist fehlgeschlagen: %s","Die Suche nach diesen LDAP-Konfigurationen ist fehlgeschlagen: %s"],
- "_There is an inactive LDAP configuration: %s_::_There are inactive LDAP configurations: %s_" : ["Es gibt eine inaktiv LDAP-Konfiguration: %s","Es gibt inaktive LDAP-Konfigurationen: %s"],
- "_Binding and searching works on the configured LDAP connection (%s)_::_Binding and searching works on all of the configured LDAP connections (%s)_" : ["Anbindung und Suche funktionieren mit der eingerichteten LDAP-Verbindung (%s)","Anbindung und Suche funktionieren mit allen eingerichteten LDAP-Verbindungen (%s)"],
"Invalid LDAP UUIDs" : "Ungültige LDAP-UUIDs",
"None found" : "Keine gefunden",
"Invalid UUIDs of LDAP accounts or groups have been found. Please review your \"Override UUID detection\" settings in the Expert part of the LDAP configuration and use \"occ ldap:update-uuid\" to update them." : "Es wurden ungültige UUIDs von LDAP-Konten oder -Gruppen gefunden. Bitte überprüfen Sie Ihre „UUID-Erkennung überschreiben“-Einstellungen im Expertenteil der LDAP-Konfiguration und verwenden Sie „occ ldap:update-uuid“, um sie zu aktualisieren.",
diff --git a/apps/user_ldap/l10n/de_DE.json b/apps/user_ldap/l10n/de_DE.json
index 3b248293b8a..992ad96a031 100644
--- a/apps/user_ldap/l10n/de_DE.json
+++ b/apps/user_ldap/l10n/de_DE.json
@@ -60,10 +60,6 @@
"_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Ihr Passwort läuft in %n Tag ab.","Ihr Passwort läuft in %n Tagen ab."],
"LDAP/AD integration" : "LDAP/AD-Integration",
"LDAP Connection" : "LDAP-Verbindung",
- "_Binding failed for this LDAP configuration: %s_::_Binding failed for these LDAP configurations: %s_" : ["Die Anbindung ist für folgende LDAP-Konfiguration fehlgeschlagen: %s","Die Anbindung ist für folgende LDAP-Konfigurationen fehlgeschlagen: %s"],
- "_Searching failed for this LDAP configuration: %s_::_Searching failed for these LDAP configurations: %s_" : ["Die Suche nach dieser LDAP-Konfiguration ist fehlgeschlagen: %s","Die Suche nach diesen LDAP-Konfigurationen ist fehlgeschlagen: %s"],
- "_There is an inactive LDAP configuration: %s_::_There are inactive LDAP configurations: %s_" : ["Es gibt eine inaktiv LDAP-Konfiguration: %s","Es gibt inaktive LDAP-Konfigurationen: %s"],
- "_Binding and searching works on the configured LDAP connection (%s)_::_Binding and searching works on all of the configured LDAP connections (%s)_" : ["Anbindung und Suche funktionieren mit der eingerichteten LDAP-Verbindung (%s)","Anbindung und Suche funktionieren mit allen eingerichteten LDAP-Verbindungen (%s)"],
"Invalid LDAP UUIDs" : "Ungültige LDAP-UUIDs",
"None found" : "Keine gefunden",
"Invalid UUIDs of LDAP accounts or groups have been found. Please review your \"Override UUID detection\" settings in the Expert part of the LDAP configuration and use \"occ ldap:update-uuid\" to update them." : "Es wurden ungültige UUIDs von LDAP-Konten oder -Gruppen gefunden. Bitte überprüfen Sie Ihre „UUID-Erkennung überschreiben“-Einstellungen im Expertenteil der LDAP-Konfiguration und verwenden Sie „occ ldap:update-uuid“, um sie zu aktualisieren.",
diff --git a/apps/user_ldap/l10n/en_GB.js b/apps/user_ldap/l10n/en_GB.js
index 3b8c700c0d1..b008d4f8a55 100644
--- a/apps/user_ldap/l10n/en_GB.js
+++ b/apps/user_ldap/l10n/en_GB.js
@@ -62,10 +62,6 @@ OC.L10N.register(
"_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Your password will expire within %n day.","Your password will expire within %n days."],
"LDAP/AD integration" : "LDAP/AD integration",
"LDAP Connection" : "Подключение LDAP",
- "_Binding failed for this LDAP configuration: %s_::_Binding failed for these LDAP configurations: %s_" : ["Binding failed for this LDAP configuration: %s","Binding failed for these LDAP configurations: %s"],
- "_Searching failed for this LDAP configuration: %s_::_Searching failed for these LDAP configurations: %s_" : ["Searching failed for this LDAP configuration: %s","Searching failed for these LDAP configurations: %s"],
- "_There is an inactive LDAP configuration: %s_::_There are inactive LDAP configurations: %s_" : ["There is an inactive LDAP configuration: %s","There are inactive LDAP configurations: %s"],
- "_Binding and searching works on the configured LDAP connection (%s)_::_Binding and searching works on all of the configured LDAP connections (%s)_" : ["Binding and searching works on the configured LDAP connection (%s)","Binding and searching works on all of the configured LDAP connections (%s)"],
"Invalid LDAP UUIDs" : "Invalid LDAP UUIDs",
"None found" : "None found",
"Invalid UUIDs of LDAP accounts or groups have been found. Please review your \"Override UUID detection\" settings in the Expert part of the LDAP configuration and use \"occ ldap:update-uuid\" to update them." : "Invalid UUIDs of LDAP accounts or groups have been found. Please review your \"Override UUID detection\" settings in the Expert part of the LDAP configuration and use \"occ ldap:update-uuid\" to update them.",
diff --git a/apps/user_ldap/l10n/en_GB.json b/apps/user_ldap/l10n/en_GB.json
index 3a4682cde5c..2c7ed14b435 100644
--- a/apps/user_ldap/l10n/en_GB.json
+++ b/apps/user_ldap/l10n/en_GB.json
@@ -60,10 +60,6 @@
"_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Your password will expire within %n day.","Your password will expire within %n days."],
"LDAP/AD integration" : "LDAP/AD integration",
"LDAP Connection" : "Подключение LDAP",
- "_Binding failed for this LDAP configuration: %s_::_Binding failed for these LDAP configurations: %s_" : ["Binding failed for this LDAP configuration: %s","Binding failed for these LDAP configurations: %s"],
- "_Searching failed for this LDAP configuration: %s_::_Searching failed for these LDAP configurations: %s_" : ["Searching failed for this LDAP configuration: %s","Searching failed for these LDAP configurations: %s"],
- "_There is an inactive LDAP configuration: %s_::_There are inactive LDAP configurations: %s_" : ["There is an inactive LDAP configuration: %s","There are inactive LDAP configurations: %s"],
- "_Binding and searching works on the configured LDAP connection (%s)_::_Binding and searching works on all of the configured LDAP connections (%s)_" : ["Binding and searching works on the configured LDAP connection (%s)","Binding and searching works on all of the configured LDAP connections (%s)"],
"Invalid LDAP UUIDs" : "Invalid LDAP UUIDs",
"None found" : "None found",
"Invalid UUIDs of LDAP accounts or groups have been found. Please review your \"Override UUID detection\" settings in the Expert part of the LDAP configuration and use \"occ ldap:update-uuid\" to update them." : "Invalid UUIDs of LDAP accounts or groups have been found. Please review your \"Override UUID detection\" settings in the Expert part of the LDAP configuration and use \"occ ldap:update-uuid\" to update them.",
diff --git a/apps/user_ldap/l10n/es.js b/apps/user_ldap/l10n/es.js
index 46b7c8c794c..bcfde403a41 100644
--- a/apps/user_ldap/l10n/es.js
+++ b/apps/user_ldap/l10n/es.js
@@ -62,10 +62,6 @@ OC.L10N.register(
"_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Tu contraseña caducará dentro de %n día.","Tu contraseña caducará dentro de %n días.","Tu contraseña caducará dentro de %n días."],
"LDAP/AD integration" : "Integración LDAP/AD",
"LDAP Connection" : "Conexión LDAP",
- "_Binding failed for this LDAP configuration: %s_::_Binding failed for these LDAP configurations: %s_" : ["El inicio de sesión falló para esta configuración de LDAP: %s","El inicio de sesión falló para estas configuraciones de LDAP: %s","El inicio de sesión falló para estas configuraciones de LDAP: %s"],
- "_Searching failed for this LDAP configuration: %s_::_Searching failed for these LDAP configurations: %s_" : ["La búsqueda falló para esta configuración de LDAP: %s","La búsqueda falló para estas configuraciones de LDAP: %s","La búsqueda falló para estas configuraciones de LDAP: %s"],
- "_There is an inactive LDAP configuration: %s_::_There are inactive LDAP configurations: %s_" : ["Hay una configuración LDAP inactiva: %s","Hay configuraciones de LDAP inactivas: %s","Hay configuraciones de LDAP inactivas: %s"],
- "_Binding and searching works on the configured LDAP connection (%s)_::_Binding and searching works on all of the configured LDAP connections (%s)_" : ["El inicio de sesión y búsqueda funciona para la conexión de LDAP configurada (%s)","El inicio de sesión y búsqueda funcionan para todas las conexiones de LDAP configuradas (%s)","El inicio de sesión y búsqueda funcionan para todas las conexiones de LDAP configuradas (%s)"],
"Invalid LDAP UUIDs" : "UUIDs LDAP inválidas",
"None found" : "Ninguno encontrado",
"Invalid UUIDs of LDAP accounts or groups have been found. Please review your \"Override UUID detection\" settings in the Expert part of the LDAP configuration and use \"occ ldap:update-uuid\" to update them." : "Se han encontrado UUIDs no válidos de cuentas o grupos LDAP. Por favor, compruebe la configuración de \"Anular detección de UUID\" en la sección de Experto de la configuración LDAP y use \"occ ldap:update-uuid\" para actualizarlos.",
diff --git a/apps/user_ldap/l10n/es.json b/apps/user_ldap/l10n/es.json
index 17351635c6b..de13cebcb9c 100644
--- a/apps/user_ldap/l10n/es.json
+++ b/apps/user_ldap/l10n/es.json
@@ -60,10 +60,6 @@
"_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Tu contraseña caducará dentro de %n día.","Tu contraseña caducará dentro de %n días.","Tu contraseña caducará dentro de %n días."],
"LDAP/AD integration" : "Integración LDAP/AD",
"LDAP Connection" : "Conexión LDAP",
- "_Binding failed for this LDAP configuration: %s_::_Binding failed for these LDAP configurations: %s_" : ["El inicio de sesión falló para esta configuración de LDAP: %s","El inicio de sesión falló para estas configuraciones de LDAP: %s","El inicio de sesión falló para estas configuraciones de LDAP: %s"],
- "_Searching failed for this LDAP configuration: %s_::_Searching failed for these LDAP configurations: %s_" : ["La búsqueda falló para esta configuración de LDAP: %s","La búsqueda falló para estas configuraciones de LDAP: %s","La búsqueda falló para estas configuraciones de LDAP: %s"],
- "_There is an inactive LDAP configuration: %s_::_There are inactive LDAP configurations: %s_" : ["Hay una configuración LDAP inactiva: %s","Hay configuraciones de LDAP inactivas: %s","Hay configuraciones de LDAP inactivas: %s"],
- "_Binding and searching works on the configured LDAP connection (%s)_::_Binding and searching works on all of the configured LDAP connections (%s)_" : ["El inicio de sesión y búsqueda funciona para la conexión de LDAP configurada (%s)","El inicio de sesión y búsqueda funcionan para todas las conexiones de LDAP configuradas (%s)","El inicio de sesión y búsqueda funcionan para todas las conexiones de LDAP configuradas (%s)"],
"Invalid LDAP UUIDs" : "UUIDs LDAP inválidas",
"None found" : "Ninguno encontrado",
"Invalid UUIDs of LDAP accounts or groups have been found. Please review your \"Override UUID detection\" settings in the Expert part of the LDAP configuration and use \"occ ldap:update-uuid\" to update them." : "Se han encontrado UUIDs no válidos de cuentas o grupos LDAP. Por favor, compruebe la configuración de \"Anular detección de UUID\" en la sección de Experto de la configuración LDAP y use \"occ ldap:update-uuid\" para actualizarlos.",
diff --git a/apps/user_ldap/l10n/es_MX.js b/apps/user_ldap/l10n/es_MX.js
index 01c4da35dc6..081c3fbb237 100644
--- a/apps/user_ldap/l10n/es_MX.js
+++ b/apps/user_ldap/l10n/es_MX.js
@@ -62,10 +62,6 @@ OC.L10N.register(
"_Your password will expire within %n day._::_Your password will expire within %n days._" : ["La contraseña expirará dentro de %n día. ","La contraseña expirará dentro de %n días. ","La contraseña expirará dentro de %n días. "],
"LDAP/AD integration" : "Integración LDAP/AD",
"LDAP Connection" : "Conexión LDAP",
- "_Binding failed for this LDAP configuration: %s_::_Binding failed for these LDAP configurations: %s_" : ["El enlace falló para las siguiente configuración de LDAP: %s","El enlace falló para las siguientes configuraciones de LDAP: %s","El enlace falló para las siguientes configuraciones de LDAP: %s"],
- "_Searching failed for this LDAP configuration: %s_::_Searching failed for these LDAP configurations: %s_" : ["La búsqueda falló para las siguiente configuración de LDAP: %s","La búsqueda falló para las siguientes configuraciones de LDAP: %s","La búsqueda falló para las siguientes configuraciones de LDAP: %s"],
- "_There is an inactive LDAP configuration: %s_::_There are inactive LDAP configurations: %s_" : ["Hay una configuración de LDAP inactiva: %s","Hay configuraciones de LDAP inactivas: %s","Hay configuraciones de LDAP inactivas: %s"],
- "_Binding and searching works on the configured LDAP connection (%s)_::_Binding and searching works on all of the configured LDAP connections (%s)_" : ["El enlace y búsqueda funcionan para las conexión de LDAP configurada (%s)","El enlace y búsqueda funcionan para todas las conexiones de LDAP configuradas (%s)","El enlace y búsqueda funcionan para todas las conexiones de LDAP configuradas (%s)"],
"Invalid LDAP UUIDs" : "UUIDs de LDAP inválidas",
"None found" : "Ninguno encontrado",
"_%n group found_::_%n groups found_" : ["%n grupo encontrado","%n grupos encontrados","%n grupos encontrados"],
diff --git a/apps/user_ldap/l10n/es_MX.json b/apps/user_ldap/l10n/es_MX.json
index 2c062dca9fb..bb6e41047d3 100644
--- a/apps/user_ldap/l10n/es_MX.json
+++ b/apps/user_ldap/l10n/es_MX.json
@@ -60,10 +60,6 @@
"_Your password will expire within %n day._::_Your password will expire within %n days._" : ["La contraseña expirará dentro de %n día. ","La contraseña expirará dentro de %n días. ","La contraseña expirará dentro de %n días. "],
"LDAP/AD integration" : "Integración LDAP/AD",
"LDAP Connection" : "Conexión LDAP",
- "_Binding failed for this LDAP configuration: %s_::_Binding failed for these LDAP configurations: %s_" : ["El enlace falló para las siguiente configuración de LDAP: %s","El enlace falló para las siguientes configuraciones de LDAP: %s","El enlace falló para las siguientes configuraciones de LDAP: %s"],
- "_Searching failed for this LDAP configuration: %s_::_Searching failed for these LDAP configurations: %s_" : ["La búsqueda falló para las siguiente configuración de LDAP: %s","La búsqueda falló para las siguientes configuraciones de LDAP: %s","La búsqueda falló para las siguientes configuraciones de LDAP: %s"],
- "_There is an inactive LDAP configuration: %s_::_There are inactive LDAP configurations: %s_" : ["Hay una configuración de LDAP inactiva: %s","Hay configuraciones de LDAP inactivas: %s","Hay configuraciones de LDAP inactivas: %s"],
- "_Binding and searching works on the configured LDAP connection (%s)_::_Binding and searching works on all of the configured LDAP connections (%s)_" : ["El enlace y búsqueda funcionan para las conexión de LDAP configurada (%s)","El enlace y búsqueda funcionan para todas las conexiones de LDAP configuradas (%s)","El enlace y búsqueda funcionan para todas las conexiones de LDAP configuradas (%s)"],
"Invalid LDAP UUIDs" : "UUIDs de LDAP inválidas",
"None found" : "Ninguno encontrado",
"_%n group found_::_%n groups found_" : ["%n grupo encontrado","%n grupos encontrados","%n grupos encontrados"],
diff --git a/apps/user_ldap/l10n/eu.js b/apps/user_ldap/l10n/eu.js
index 79037ffa8b4..830d5f88959 100644
--- a/apps/user_ldap/l10n/eu.js
+++ b/apps/user_ldap/l10n/eu.js
@@ -62,10 +62,6 @@ OC.L10N.register(
"_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Zure pasahitza egun %nean iraungiko da.","Zure pasahitza %n egunetan iraungiko da."],
"LDAP/AD integration" : "LDAP/AD integrazioa",
"LDAP Connection" : "LDAP konexioa",
- "_Binding failed for this LDAP configuration: %s_::_Binding failed for these LDAP configurations: %s_" : ["Lotura egiteak huts egin du LDAP konfigurazio honentzat: %s","Lotura egiteak huts egin du LDAP konfigurazio hauentzat: %s"],
- "_Searching failed for this LDAP configuration: %s_::_Searching failed for these LDAP configurations: %s_" : ["Bilaketak huts egin du LDAP konfigurazio honentzat: %s","Bilaketak huts egin du LDAP konfigurazio hauentzat: %s"],
- "_There is an inactive LDAP configuration: %s_::_There are inactive LDAP configurations: %s_" : ["Honako LDAP konfigurazioa inaktibo dago: %s","Honako LDAP konfigurazioak inaktibo daude: %s"],
- "_Binding and searching works on the configured LDAP connection (%s)_::_Binding and searching works on all of the configured LDAP connections (%s)_" : ["Loturak eta bilaketak konfiguratutako LDAP konexioanfuntzionatzen du (%s)","Loturak eta bilaketak konfiguratutako LDAP konexio guztietan funtzionatzen du (%s)"],
"Invalid LDAP UUIDs" : "Baliogabeko LDAP UUIDak",
"None found" : "Ez da batere aurkitu",
"Invalid UUIDs of LDAP accounts or groups have been found. Please review your \"Override UUID detection\" settings in the Expert part of the LDAP configuration and use \"occ ldap:update-uuid\" to update them." : "LDAP kontu edo taldeen UUID baliogabeak aurkitu dira. Mesedez, errebisatu zure \"Gainidatzi UUID antzematea\" ezarpena, adituentzako LDAP konfigurazioan, eta erabili \"occ ldap:update-uuid\" eguneratu daitezen.",
diff --git a/apps/user_ldap/l10n/eu.json b/apps/user_ldap/l10n/eu.json
index e6fbcaa9fe8..8eac2792ce7 100644
--- a/apps/user_ldap/l10n/eu.json
+++ b/apps/user_ldap/l10n/eu.json
@@ -60,10 +60,6 @@
"_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Zure pasahitza egun %nean iraungiko da.","Zure pasahitza %n egunetan iraungiko da."],
"LDAP/AD integration" : "LDAP/AD integrazioa",
"LDAP Connection" : "LDAP konexioa",
- "_Binding failed for this LDAP configuration: %s_::_Binding failed for these LDAP configurations: %s_" : ["Lotura egiteak huts egin du LDAP konfigurazio honentzat: %s","Lotura egiteak huts egin du LDAP konfigurazio hauentzat: %s"],
- "_Searching failed for this LDAP configuration: %s_::_Searching failed for these LDAP configurations: %s_" : ["Bilaketak huts egin du LDAP konfigurazio honentzat: %s","Bilaketak huts egin du LDAP konfigurazio hauentzat: %s"],
- "_There is an inactive LDAP configuration: %s_::_There are inactive LDAP configurations: %s_" : ["Honako LDAP konfigurazioa inaktibo dago: %s","Honako LDAP konfigurazioak inaktibo daude: %s"],
- "_Binding and searching works on the configured LDAP connection (%s)_::_Binding and searching works on all of the configured LDAP connections (%s)_" : ["Loturak eta bilaketak konfiguratutako LDAP konexioanfuntzionatzen du (%s)","Loturak eta bilaketak konfiguratutako LDAP konexio guztietan funtzionatzen du (%s)"],
"Invalid LDAP UUIDs" : "Baliogabeko LDAP UUIDak",
"None found" : "Ez da batere aurkitu",
"Invalid UUIDs of LDAP accounts or groups have been found. Please review your \"Override UUID detection\" settings in the Expert part of the LDAP configuration and use \"occ ldap:update-uuid\" to update them." : "LDAP kontu edo taldeen UUID baliogabeak aurkitu dira. Mesedez, errebisatu zure \"Gainidatzi UUID antzematea\" ezarpena, adituentzako LDAP konfigurazioan, eta erabili \"occ ldap:update-uuid\" eguneratu daitezen.",
diff --git a/apps/user_ldap/l10n/fr.js b/apps/user_ldap/l10n/fr.js
index a86c0ab858c..bc47995aeef 100644
--- a/apps/user_ldap/l10n/fr.js
+++ b/apps/user_ldap/l10n/fr.js
@@ -62,10 +62,6 @@ OC.L10N.register(
"_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Votre mot de passe va expirer dans %n jour.","Votre mot de passe va expirer dans %n jours.","Votre mot de passe va expirer dans %n jours."],
"LDAP/AD integration" : "Intégration LDAP/AD",
"LDAP Connection" : "Connexion LDAP",
- "_Binding failed for this LDAP configuration: %s_::_Binding failed for these LDAP configurations: %s_" : ["La liaison a échoué pour cette configurations LDAP : %s","La liaison a échoué pour ces configurations LDAP : %s","La liaison a échoué pour ces configurations LDAP : %s"],
- "_Searching failed for this LDAP configuration: %s_::_Searching failed for these LDAP configurations: %s_" : ["La recherche a échoué pour cette configurations LDAP : %s","La recherche a échoué pour ces configurations LDAP : %s","La recherche a échoué pour ces configurations LDAP : %s"],
- "_There is an inactive LDAP configuration: %s_::_There are inactive LDAP configurations: %s_" : ["Il y a une configuration LDAP inactive : %s","Il y a des configurations LDAP inactives : %s","Il y a des configurations LDAP inactives : %s"],
- "_Binding and searching works on the configured LDAP connection (%s)_::_Binding and searching works on all of the configured LDAP connections (%s)_" : ["La liaison et la recherche fonctionnent sur la connexion LDAP configurée (%s)","La liaison et la recherche fonctionnent sur toutes les connexions LDAP configurées (%s)","La liaison et la recherche fonctionnent sur toutes les connexions LDAP configurées (%s)"],
"Invalid LDAP UUIDs" : "UUID LDAP invalides",
"None found" : "Aucun trouvé",
"Invalid UUIDs of LDAP accounts or groups have been found. Please review your \"Override UUID detection\" settings in the Expert part of the LDAP configuration and use \"occ ldap:update-uuid\" to update them." : "Des UUID invalides pour les comptes LDAP ont été trouvés. Merci de vérifier votre paramètre « Passer outre la détection des UUID » dans la partie Expert de la configuration LDAP puis utiliser « occ ldap:update-uuid » pour les mettre à jour.",
diff --git a/apps/user_ldap/l10n/fr.json b/apps/user_ldap/l10n/fr.json
index 2993d746061..f3b8fe00289 100644
--- a/apps/user_ldap/l10n/fr.json
+++ b/apps/user_ldap/l10n/fr.json
@@ -60,10 +60,6 @@
"_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Votre mot de passe va expirer dans %n jour.","Votre mot de passe va expirer dans %n jours.","Votre mot de passe va expirer dans %n jours."],
"LDAP/AD integration" : "Intégration LDAP/AD",
"LDAP Connection" : "Connexion LDAP",
- "_Binding failed for this LDAP configuration: %s_::_Binding failed for these LDAP configurations: %s_" : ["La liaison a échoué pour cette configurations LDAP : %s","La liaison a échoué pour ces configurations LDAP : %s","La liaison a échoué pour ces configurations LDAP : %s"],
- "_Searching failed for this LDAP configuration: %s_::_Searching failed for these LDAP configurations: %s_" : ["La recherche a échoué pour cette configurations LDAP : %s","La recherche a échoué pour ces configurations LDAP : %s","La recherche a échoué pour ces configurations LDAP : %s"],
- "_There is an inactive LDAP configuration: %s_::_There are inactive LDAP configurations: %s_" : ["Il y a une configuration LDAP inactive : %s","Il y a des configurations LDAP inactives : %s","Il y a des configurations LDAP inactives : %s"],
- "_Binding and searching works on the configured LDAP connection (%s)_::_Binding and searching works on all of the configured LDAP connections (%s)_" : ["La liaison et la recherche fonctionnent sur la connexion LDAP configurée (%s)","La liaison et la recherche fonctionnent sur toutes les connexions LDAP configurées (%s)","La liaison et la recherche fonctionnent sur toutes les connexions LDAP configurées (%s)"],
"Invalid LDAP UUIDs" : "UUID LDAP invalides",
"None found" : "Aucun trouvé",
"Invalid UUIDs of LDAP accounts or groups have been found. Please review your \"Override UUID detection\" settings in the Expert part of the LDAP configuration and use \"occ ldap:update-uuid\" to update them." : "Des UUID invalides pour les comptes LDAP ont été trouvés. Merci de vérifier votre paramètre « Passer outre la détection des UUID » dans la partie Expert de la configuration LDAP puis utiliser « occ ldap:update-uuid » pour les mettre à jour.",
diff --git a/apps/user_ldap/l10n/ga.js b/apps/user_ldap/l10n/ga.js
index 6a65bdf4b1f..e9e617c3ed9 100644
--- a/apps/user_ldap/l10n/ga.js
+++ b/apps/user_ldap/l10n/ga.js
@@ -62,10 +62,6 @@ OC.L10N.register(
"_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Rachaidh do phasfhocal in éag laistigh de %n lá.","Rachaidh do phasfhocal in éag laistigh de %n lá.","Rachaidh do phasfhocal in éag laistigh de %n lá.","Rachaidh do phasfhocal in éag laistigh de %n lá.","Rachaidh do phasfhocal in éag laistigh de %n lá."],
"LDAP/AD integration" : "Comhtháthú LDAP/AD",
"LDAP Connection" : "Ceangal LDAP",
- "_Binding failed for this LDAP configuration: %s_::_Binding failed for these LDAP configurations: %s_" : ["Theip ar cheangal don chumraíocht LDAP seo:%s","Theip ar cheangal na bhfoirmíochtaí LDAP seo: %s","Theip ar cheangal na bhfoirmíochtaí LDAP seo: %s","Theip ar cheangal na bhfoirmíochtaí LDAP seo: %s","Theip ar cheangal na bhfoirmíochtaí LDAP seo: %s"],
- "_Searching failed for this LDAP configuration: %s_::_Searching failed for these LDAP configurations: %s_" : ["Theip ar chuardach don chumraíocht LDAP seo: %s","Theip ar chuardach na gcumraíocht LDAP seo: %s","Theip ar chuardach na gcumraíocht LDAP seo: %s","Theip ar chuardach na gcumraíocht LDAP seo: %s","Theip ar chuardach na gcumraíocht LDAP seo: %s"],
- "_There is an inactive LDAP configuration: %s_::_There are inactive LDAP configurations: %s_" : ["Tá cumraíocht LDAP neamhghníomhach ann: %s","Tá cumraíochtaí LDAP neamhghníomhacha ann: %s","Tá cumraíochtaí LDAP neamhghníomhacha ann: %s","Tá cumraíochtaí LDAP neamhghníomhacha ann: %s","Tá cumraíochtaí LDAP neamhghníomhacha ann: %s"],
- "_Binding and searching works on the configured LDAP connection (%s)_::_Binding and searching works on all of the configured LDAP connections (%s)_" : ["Oibríonn ceangal agus cuardach ar an nasc LDAP cumraithe (%s)","Oibríonn nascadh agus cuardach ar na naisc LDAP cumraithe go léir (%s)","Oibríonn nascadh agus cuardach ar na naisc LDAP cumraithe go léir (%s)","Oibríonn nascadh agus cuardach ar na naisc LDAP cumraithe go léir (%s)","Oibríonn nascadh agus cuardach ar na naisc LDAP cumraithe go léir (%s)"],
"Invalid LDAP UUIDs" : "UUIDanna LDAP neamhbhailí",
"None found" : "Níor aimsíodh aon cheann",
"Invalid UUIDs of LDAP accounts or groups have been found. Please review your \"Override UUID detection\" settings in the Expert part of the LDAP configuration and use \"occ ldap:update-uuid\" to update them." : "Fuarthas UUIDanna neamhbhailí de chuntais nó de ghrúpaí LDAP. Athbhreithnigh do shocruithe \"Sáraigh braite UUID\" sa chuid Saineolaithe de chumraíocht LDAP agus úsáid \"occ ldap:update-uuid\" chun iad a nuashonrú le do thoil.",
diff --git a/apps/user_ldap/l10n/ga.json b/apps/user_ldap/l10n/ga.json
index fcc185a4246..733374594c8 100644
--- a/apps/user_ldap/l10n/ga.json
+++ b/apps/user_ldap/l10n/ga.json
@@ -60,10 +60,6 @@
"_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Rachaidh do phasfhocal in éag laistigh de %n lá.","Rachaidh do phasfhocal in éag laistigh de %n lá.","Rachaidh do phasfhocal in éag laistigh de %n lá.","Rachaidh do phasfhocal in éag laistigh de %n lá.","Rachaidh do phasfhocal in éag laistigh de %n lá."],
"LDAP/AD integration" : "Comhtháthú LDAP/AD",
"LDAP Connection" : "Ceangal LDAP",
- "_Binding failed for this LDAP configuration: %s_::_Binding failed for these LDAP configurations: %s_" : ["Theip ar cheangal don chumraíocht LDAP seo:%s","Theip ar cheangal na bhfoirmíochtaí LDAP seo: %s","Theip ar cheangal na bhfoirmíochtaí LDAP seo: %s","Theip ar cheangal na bhfoirmíochtaí LDAP seo: %s","Theip ar cheangal na bhfoirmíochtaí LDAP seo: %s"],
- "_Searching failed for this LDAP configuration: %s_::_Searching failed for these LDAP configurations: %s_" : ["Theip ar chuardach don chumraíocht LDAP seo: %s","Theip ar chuardach na gcumraíocht LDAP seo: %s","Theip ar chuardach na gcumraíocht LDAP seo: %s","Theip ar chuardach na gcumraíocht LDAP seo: %s","Theip ar chuardach na gcumraíocht LDAP seo: %s"],
- "_There is an inactive LDAP configuration: %s_::_There are inactive LDAP configurations: %s_" : ["Tá cumraíocht LDAP neamhghníomhach ann: %s","Tá cumraíochtaí LDAP neamhghníomhacha ann: %s","Tá cumraíochtaí LDAP neamhghníomhacha ann: %s","Tá cumraíochtaí LDAP neamhghníomhacha ann: %s","Tá cumraíochtaí LDAP neamhghníomhacha ann: %s"],
- "_Binding and searching works on the configured LDAP connection (%s)_::_Binding and searching works on all of the configured LDAP connections (%s)_" : ["Oibríonn ceangal agus cuardach ar an nasc LDAP cumraithe (%s)","Oibríonn nascadh agus cuardach ar na naisc LDAP cumraithe go léir (%s)","Oibríonn nascadh agus cuardach ar na naisc LDAP cumraithe go léir (%s)","Oibríonn nascadh agus cuardach ar na naisc LDAP cumraithe go léir (%s)","Oibríonn nascadh agus cuardach ar na naisc LDAP cumraithe go léir (%s)"],
"Invalid LDAP UUIDs" : "UUIDanna LDAP neamhbhailí",
"None found" : "Níor aimsíodh aon cheann",
"Invalid UUIDs of LDAP accounts or groups have been found. Please review your \"Override UUID detection\" settings in the Expert part of the LDAP configuration and use \"occ ldap:update-uuid\" to update them." : "Fuarthas UUIDanna neamhbhailí de chuntais nó de ghrúpaí LDAP. Athbhreithnigh do shocruithe \"Sáraigh braite UUID\" sa chuid Saineolaithe de chumraíocht LDAP agus úsáid \"occ ldap:update-uuid\" chun iad a nuashonrú le do thoil.",
diff --git a/apps/user_ldap/l10n/gl.js b/apps/user_ldap/l10n/gl.js
index 40c9d2684cb..b7788f1c988 100644
--- a/apps/user_ldap/l10n/gl.js
+++ b/apps/user_ldap/l10n/gl.js
@@ -62,10 +62,6 @@ OC.L10N.register(
"_Your password will expire within %n day._::_Your password will expire within %n days._" : ["O seu contrasinal caducará en %n día.","O seu contrasinal caducará en %n días."],
"LDAP/AD integration" : "Integración de LDAP/AD",
"LDAP Connection" : "Conexión LDAP",
- "_Binding failed for this LDAP configuration: %s_::_Binding failed for these LDAP configurations: %s_" : ["Produciuse un fallo na vinculación desta configuración LDAP: %s","Produciuse un fallo na vinculación destas configuracións LDAP: %s"],
- "_Searching failed for this LDAP configuration: %s_::_Searching failed for these LDAP configurations: %s_" : ["Produciuse un fallo ao buscar esta configuración LDAP: %s","Produciuse un fallo ao buscar estas configuracións LDAP: %s"],
- "_There is an inactive LDAP configuration: %s_::_There are inactive LDAP configurations: %s_" : ["Hai unha configuración LDAP inactiva: %s","Hai configuracións LDAP inactivas: %s"],
- "_Binding and searching works on the configured LDAP connection (%s)_::_Binding and searching works on all of the configured LDAP connections (%s)_" : ["A vinculación e a busca funcionan na conexión LDAP configurada (%s)","A vinculación e a busca funcionan en todas as conexións LDAP configuradas (%s)"],
"Invalid LDAP UUIDs" : "UUID de LDAP incorrectos",
"None found" : "Non se atopou ningún",
"Invalid UUIDs of LDAP accounts or groups have been found. Please review your \"Override UUID detection\" settings in the Expert part of the LDAP configuration and use \"occ ldap:update-uuid\" to update them." : "Atopáronse UUID incorrectos de contas ou grupos LDAP. Revise a súa configuración de «Anular a detección de UUID» na parte Experto da configuración LDAP e utilice «occ ldap:update-uuid» para actualizalos.",
diff --git a/apps/user_ldap/l10n/gl.json b/apps/user_ldap/l10n/gl.json
index 26edba82241..1241930fdde 100644
--- a/apps/user_ldap/l10n/gl.json
+++ b/apps/user_ldap/l10n/gl.json
@@ -60,10 +60,6 @@
"_Your password will expire within %n day._::_Your password will expire within %n days._" : ["O seu contrasinal caducará en %n día.","O seu contrasinal caducará en %n días."],
"LDAP/AD integration" : "Integración de LDAP/AD",
"LDAP Connection" : "Conexión LDAP",
- "_Binding failed for this LDAP configuration: %s_::_Binding failed for these LDAP configurations: %s_" : ["Produciuse un fallo na vinculación desta configuración LDAP: %s","Produciuse un fallo na vinculación destas configuracións LDAP: %s"],
- "_Searching failed for this LDAP configuration: %s_::_Searching failed for these LDAP configurations: %s_" : ["Produciuse un fallo ao buscar esta configuración LDAP: %s","Produciuse un fallo ao buscar estas configuracións LDAP: %s"],
- "_There is an inactive LDAP configuration: %s_::_There are inactive LDAP configurations: %s_" : ["Hai unha configuración LDAP inactiva: %s","Hai configuracións LDAP inactivas: %s"],
- "_Binding and searching works on the configured LDAP connection (%s)_::_Binding and searching works on all of the configured LDAP connections (%s)_" : ["A vinculación e a busca funcionan na conexión LDAP configurada (%s)","A vinculación e a busca funcionan en todas as conexións LDAP configuradas (%s)"],
"Invalid LDAP UUIDs" : "UUID de LDAP incorrectos",
"None found" : "Non se atopou ningún",
"Invalid UUIDs of LDAP accounts or groups have been found. Please review your \"Override UUID detection\" settings in the Expert part of the LDAP configuration and use \"occ ldap:update-uuid\" to update them." : "Atopáronse UUID incorrectos de contas ou grupos LDAP. Revise a súa configuración de «Anular a detección de UUID» na parte Experto da configuración LDAP e utilice «occ ldap:update-uuid» para actualizalos.",
diff --git a/apps/user_ldap/l10n/ja.js b/apps/user_ldap/l10n/ja.js
index 8b6606d8c3d..51bef03a56d 100644
--- a/apps/user_ldap/l10n/ja.js
+++ b/apps/user_ldap/l10n/ja.js
@@ -62,10 +62,6 @@ OC.L10N.register(
"_Your password will expire within %n day._::_Your password will expire within %n days._" : ["パスワードがあと %n日で期限切れになります。"],
"LDAP/AD integration" : "LDAP/AD統合",
"LDAP Connection" : "LDAP接続",
- "_Binding failed for this LDAP configuration: %s_::_Binding failed for these LDAP configurations: %s_" : ["これらのLDAP構成のバインドに失敗しました: %s"],
- "_Searching failed for this LDAP configuration: %s_::_Searching failed for these LDAP configurations: %s_" : ["これらのLDAP設定の検索に失敗しました: %s"],
- "_There is an inactive LDAP configuration: %s_::_There are inactive LDAP configurations: %s_" : ["非アクティブなLDAP設定があります: %s"],
- "_Binding and searching works on the configured LDAP connection (%s)_::_Binding and searching works on all of the configured LDAP connections (%s)_" : ["バインドと検索は、設定されているすべてのLDAP接続(%s)で動作します"],
"Invalid LDAP UUIDs" : "無効な LDAP UUID",
"None found" : "該当なし",
"Invalid UUIDs of LDAP accounts or groups have been found. Please review your \"Override UUID detection\" settings in the Expert part of the LDAP configuration and use \"occ ldap:update-uuid\" to update them." : "LDAPアカウントまたはグループの無効なUUIDが見つかりました。LDAP設定のエキスパート部分にある \"Override UUID detection\" の設定を見直して、\"occ ldap:update-uuid\"を使ってアップデートしてください。",
diff --git a/apps/user_ldap/l10n/ja.json b/apps/user_ldap/l10n/ja.json
index f6737db8ed3..3013276db69 100644
--- a/apps/user_ldap/l10n/ja.json
+++ b/apps/user_ldap/l10n/ja.json
@@ -60,10 +60,6 @@
"_Your password will expire within %n day._::_Your password will expire within %n days._" : ["パスワードがあと %n日で期限切れになります。"],
"LDAP/AD integration" : "LDAP/AD統合",
"LDAP Connection" : "LDAP接続",
- "_Binding failed for this LDAP configuration: %s_::_Binding failed for these LDAP configurations: %s_" : ["これらのLDAP構成のバインドに失敗しました: %s"],
- "_Searching failed for this LDAP configuration: %s_::_Searching failed for these LDAP configurations: %s_" : ["これらのLDAP設定の検索に失敗しました: %s"],
- "_There is an inactive LDAP configuration: %s_::_There are inactive LDAP configurations: %s_" : ["非アクティブなLDAP設定があります: %s"],
- "_Binding and searching works on the configured LDAP connection (%s)_::_Binding and searching works on all of the configured LDAP connections (%s)_" : ["バインドと検索は、設定されているすべてのLDAP接続(%s)で動作します"],
"Invalid LDAP UUIDs" : "無効な LDAP UUID",
"None found" : "該当なし",
"Invalid UUIDs of LDAP accounts or groups have been found. Please review your \"Override UUID detection\" settings in the Expert part of the LDAP configuration and use \"occ ldap:update-uuid\" to update them." : "LDAPアカウントまたはグループの無効なUUIDが見つかりました。LDAP設定のエキスパート部分にある \"Override UUID detection\" の設定を見直して、\"occ ldap:update-uuid\"を使ってアップデートしてください。",
diff --git a/apps/user_ldap/l10n/nb.js b/apps/user_ldap/l10n/nb.js
index 0c2fec821ee..0dbabe56a78 100644
--- a/apps/user_ldap/l10n/nb.js
+++ b/apps/user_ldap/l10n/nb.js
@@ -62,10 +62,6 @@ OC.L10N.register(
"_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Passordet ditt utløper om %n dag.","Passordet ditt utløper om %n dager."],
"LDAP/AD integration" : "LDAP/AD-integrasjon",
"LDAP Connection" : "LDAP-forbindelse",
- "_Binding failed for this LDAP configuration: %s_::_Binding failed for these LDAP configurations: %s_" : ["Binding mislyktes for denne LDAP-konfigurasjonen: %s","Binding mislyktes for disse LDAP-konfigurasjonene: %s"],
- "_Searching failed for this LDAP configuration: %s_::_Searching failed for these LDAP configurations: %s_" : ["Søking mislyktes for denne LDAP-konfigurasjonen: %s","Søking mislyktes for disse LDAP-konfigurasjonene: %s"],
- "_There is an inactive LDAP configuration: %s_::_There are inactive LDAP configurations: %s_" : ["Det finnes en inaktiv LDAP-konfigurasjon: %s","Det finnes inaktive LDAP-konfigurasjoner: %s"],
- "_Binding and searching works on the configured LDAP connection (%s)_::_Binding and searching works on all of the configured LDAP connections (%s)_" : ["Binding og søking fungerer på den konfigurerte LDAP-tilkoblingen (%s)","Binding og søking fungerer på alle de konfigurerte LDAP-forbindelsene (%s)"],
"Invalid LDAP UUIDs" : "Ugyldige LDAP UUID-er",
"None found" : "Ingen funnet",
"Invalid UUIDs of LDAP accounts or groups have been found. Please review your \"Override UUID detection\" settings in the Expert part of the LDAP configuration and use \"occ ldap:update-uuid\" to update them." : "Det er funnet ugyldige UUID-er for LDAP-brukere eller -grupper. Gå gjennom innstillingene for «Overstyr UUID-deteksjon» i Ekspert-delen av LDAP-konfigurasjonen, og bruk «occ ldap:update-uuid» for å oppdatere dem.",
diff --git a/apps/user_ldap/l10n/nb.json b/apps/user_ldap/l10n/nb.json
index 9ff5b438ac2..759f496b5e2 100644
--- a/apps/user_ldap/l10n/nb.json
+++ b/apps/user_ldap/l10n/nb.json
@@ -60,10 +60,6 @@
"_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Passordet ditt utløper om %n dag.","Passordet ditt utløper om %n dager."],
"LDAP/AD integration" : "LDAP/AD-integrasjon",
"LDAP Connection" : "LDAP-forbindelse",
- "_Binding failed for this LDAP configuration: %s_::_Binding failed for these LDAP configurations: %s_" : ["Binding mislyktes for denne LDAP-konfigurasjonen: %s","Binding mislyktes for disse LDAP-konfigurasjonene: %s"],
- "_Searching failed for this LDAP configuration: %s_::_Searching failed for these LDAP configurations: %s_" : ["Søking mislyktes for denne LDAP-konfigurasjonen: %s","Søking mislyktes for disse LDAP-konfigurasjonene: %s"],
- "_There is an inactive LDAP configuration: %s_::_There are inactive LDAP configurations: %s_" : ["Det finnes en inaktiv LDAP-konfigurasjon: %s","Det finnes inaktive LDAP-konfigurasjoner: %s"],
- "_Binding and searching works on the configured LDAP connection (%s)_::_Binding and searching works on all of the configured LDAP connections (%s)_" : ["Binding og søking fungerer på den konfigurerte LDAP-tilkoblingen (%s)","Binding og søking fungerer på alle de konfigurerte LDAP-forbindelsene (%s)"],
"Invalid LDAP UUIDs" : "Ugyldige LDAP UUID-er",
"None found" : "Ingen funnet",
"Invalid UUIDs of LDAP accounts or groups have been found. Please review your \"Override UUID detection\" settings in the Expert part of the LDAP configuration and use \"occ ldap:update-uuid\" to update them." : "Det er funnet ugyldige UUID-er for LDAP-brukere eller -grupper. Gå gjennom innstillingene for «Overstyr UUID-deteksjon» i Ekspert-delen av LDAP-konfigurasjonen, og bruk «occ ldap:update-uuid» for å oppdatere dem.",
diff --git a/apps/user_ldap/l10n/pt_BR.js b/apps/user_ldap/l10n/pt_BR.js
index 4d06acd5e9f..23450805ed7 100644
--- a/apps/user_ldap/l10n/pt_BR.js
+++ b/apps/user_ldap/l10n/pt_BR.js
@@ -62,10 +62,6 @@ OC.L10N.register(
"_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Sua senha vai expirar dentro de%n dia.","Sua senha vai expirar dentro de%ndias.","Sua senha vai expirar dentro de%ndias."],
"LDAP/AD integration" : "LDAP/AD integração",
"LDAP Connection" : "Conexão LDAP",
- "_Binding failed for this LDAP configuration: %s_::_Binding failed for these LDAP configurations: %s_" : ["Falha na ligação para estas configurações LDAP: %s","Falha na ligação para estas configurações LDAP: %s","Falha na ligação para estas configurações LDAP: %s"],
- "_Searching failed for this LDAP configuration: %s_::_Searching failed for these LDAP configurations: %s_" : ["Falha na pesquisa destas configurações LDAP: %s","Falha na pesquisa destas configurações LDAP: %s","Falha na pesquisa destas configurações LDAP: %s"],
- "_There is an inactive LDAP configuration: %s_::_There are inactive LDAP configurations: %s_" : ["Existem configurações LDAP inativas: %s","Existem configurações LDAP inativas: %s","Existem configurações LDAP inativas: %s"],
- "_Binding and searching works on the configured LDAP connection (%s)_::_Binding and searching works on all of the configured LDAP connections (%s)_" : ["A vinculação e a pesquisa funcionam em todas as conexões LDAP configuradas (%s)","A vinculação e a pesquisa funcionam em todas as conexões LDAP configuradas (%s)","A vinculação e a pesquisa funcionam em todas as conexões LDAP configuradas (%s)"],
"Invalid LDAP UUIDs" : "UUIDs LDAP inválidos",
"None found" : "Nenhum encontrado",
"Invalid UUIDs of LDAP accounts or groups have been found. Please review your \"Override UUID detection\" settings in the Expert part of the LDAP configuration and use \"occ ldap:update-uuid\" to update them." : "Foram encontrados UUIDs inválidos de contas ou grupos LDAP. Revise as configurações de \"Substituir detecção de UUID\" na parte Especialista da configuração LDAP e use \"occ ldap:update-uuid\" para atualizá-las.",
diff --git a/apps/user_ldap/l10n/pt_BR.json b/apps/user_ldap/l10n/pt_BR.json
index df2268091a3..1ffde39bbc8 100644
--- a/apps/user_ldap/l10n/pt_BR.json
+++ b/apps/user_ldap/l10n/pt_BR.json
@@ -60,10 +60,6 @@
"_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Sua senha vai expirar dentro de%n dia.","Sua senha vai expirar dentro de%ndias.","Sua senha vai expirar dentro de%ndias."],
"LDAP/AD integration" : "LDAP/AD integração",
"LDAP Connection" : "Conexão LDAP",
- "_Binding failed for this LDAP configuration: %s_::_Binding failed for these LDAP configurations: %s_" : ["Falha na ligação para estas configurações LDAP: %s","Falha na ligação para estas configurações LDAP: %s","Falha na ligação para estas configurações LDAP: %s"],
- "_Searching failed for this LDAP configuration: %s_::_Searching failed for these LDAP configurations: %s_" : ["Falha na pesquisa destas configurações LDAP: %s","Falha na pesquisa destas configurações LDAP: %s","Falha na pesquisa destas configurações LDAP: %s"],
- "_There is an inactive LDAP configuration: %s_::_There are inactive LDAP configurations: %s_" : ["Existem configurações LDAP inativas: %s","Existem configurações LDAP inativas: %s","Existem configurações LDAP inativas: %s"],
- "_Binding and searching works on the configured LDAP connection (%s)_::_Binding and searching works on all of the configured LDAP connections (%s)_" : ["A vinculação e a pesquisa funcionam em todas as conexões LDAP configuradas (%s)","A vinculação e a pesquisa funcionam em todas as conexões LDAP configuradas (%s)","A vinculação e a pesquisa funcionam em todas as conexões LDAP configuradas (%s)"],
"Invalid LDAP UUIDs" : "UUIDs LDAP inválidos",
"None found" : "Nenhum encontrado",
"Invalid UUIDs of LDAP accounts or groups have been found. Please review your \"Override UUID detection\" settings in the Expert part of the LDAP configuration and use \"occ ldap:update-uuid\" to update them." : "Foram encontrados UUIDs inválidos de contas ou grupos LDAP. Revise as configurações de \"Substituir detecção de UUID\" na parte Especialista da configuração LDAP e use \"occ ldap:update-uuid\" para atualizá-las.",
diff --git a/apps/user_ldap/l10n/sk.js b/apps/user_ldap/l10n/sk.js
index 77a5e8197d5..25cccb62ad6 100644
--- a/apps/user_ldap/l10n/sk.js
+++ b/apps/user_ldap/l10n/sk.js
@@ -62,10 +62,6 @@ OC.L10N.register(
"_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Vaše heslo expiruje o %n deň.","Vaše heslo expiruje o %n dni.","Vaše heslo expiruje o %n dní.","Vaše heslo expiruje o %n dní."],
"LDAP/AD integration" : "Integrácia s LDAP/AD",
"LDAP Connection" : "Pripojenie LDAP",
- "_Binding failed for this LDAP configuration: %s_::_Binding failed for these LDAP configurations: %s_" : ["Pripojenie zlyhalo pre túto konfiguráciu LDAP: %s","Pripojenie zlyhalo pre tieto konfigurácie LDAP: %s","Pripojenie zlyhalo pre tieto konfigurácie LDAP: %s","Pripojenie zlyhalo pre tieto konfigurácie LDAP: %s"],
- "_Searching failed for this LDAP configuration: %s_::_Searching failed for these LDAP configurations: %s_" : ["Vyhľadávanie zlyhalo pre túto konfiguráciu LDAP: %s","Vyhľadávanie zlyhalo pre tieto konfigurácie LDAP: %s","Vyhľadávanie zlyhalo pre tieto konfigurácie LDAP: %s","Vyhľadávanie zlyhalo pre tieto konfigurácie LDAP: %s"],
- "_There is an inactive LDAP configuration: %s_::_There are inactive LDAP configurations: %s_" : ["Existuje neaktívna konfigurácia LDAP: %s","Existujú neaktívne konfigurácie LDAP: %s","Existujú neaktívne konfigurácie LDAP: %s","Existujú neaktívne konfigurácie LDAP: %s"],
- "_Binding and searching works on the configured LDAP connection (%s)_::_Binding and searching works on all of the configured LDAP connections (%s)_" : ["Pripojenie a vyhľadávanie funguje na nakonfigurovanom LDAP pripojení (%s)","Pripojenie a vyhľadávanie funguje na všetkých nakonfigurovaných LDAP pripojeniach (%s)","Pripojenie a vyhľadávanie funguje na všetkých nakonfigurovaných LDAP pripojeniach (%s)","Pripojenie a vyhľadávanie funguje na všetkých nakonfigurovaných LDAP pripojeniach (%s)"],
"Invalid LDAP UUIDs" : "Neplatné LDAP UUIDs",
"None found" : "Nenájdené",
"Invalid UUIDs of LDAP accounts or groups have been found. Please review your \"Override UUID detection\" settings in the Expert part of the LDAP configuration and use \"occ ldap:update-uuid\" to update them." : "Boli nájdené neplatné UUID účtov alebo skupín LDAP. Skontrolujte svoje nastavenia „Prepísať detekciu UUID“ v expertnej časti konfigurácie LDAP a použite „occ ldap:update-uuid“ na ich aktualizáciu.",
diff --git a/apps/user_ldap/l10n/sk.json b/apps/user_ldap/l10n/sk.json
index 052b7dc3642..d9e9a3aee80 100644
--- a/apps/user_ldap/l10n/sk.json
+++ b/apps/user_ldap/l10n/sk.json
@@ -60,10 +60,6 @@
"_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Vaše heslo expiruje o %n deň.","Vaše heslo expiruje o %n dni.","Vaše heslo expiruje o %n dní.","Vaše heslo expiruje o %n dní."],
"LDAP/AD integration" : "Integrácia s LDAP/AD",
"LDAP Connection" : "Pripojenie LDAP",
- "_Binding failed for this LDAP configuration: %s_::_Binding failed for these LDAP configurations: %s_" : ["Pripojenie zlyhalo pre túto konfiguráciu LDAP: %s","Pripojenie zlyhalo pre tieto konfigurácie LDAP: %s","Pripojenie zlyhalo pre tieto konfigurácie LDAP: %s","Pripojenie zlyhalo pre tieto konfigurácie LDAP: %s"],
- "_Searching failed for this LDAP configuration: %s_::_Searching failed for these LDAP configurations: %s_" : ["Vyhľadávanie zlyhalo pre túto konfiguráciu LDAP: %s","Vyhľadávanie zlyhalo pre tieto konfigurácie LDAP: %s","Vyhľadávanie zlyhalo pre tieto konfigurácie LDAP: %s","Vyhľadávanie zlyhalo pre tieto konfigurácie LDAP: %s"],
- "_There is an inactive LDAP configuration: %s_::_There are inactive LDAP configurations: %s_" : ["Existuje neaktívna konfigurácia LDAP: %s","Existujú neaktívne konfigurácie LDAP: %s","Existujú neaktívne konfigurácie LDAP: %s","Existujú neaktívne konfigurácie LDAP: %s"],
- "_Binding and searching works on the configured LDAP connection (%s)_::_Binding and searching works on all of the configured LDAP connections (%s)_" : ["Pripojenie a vyhľadávanie funguje na nakonfigurovanom LDAP pripojení (%s)","Pripojenie a vyhľadávanie funguje na všetkých nakonfigurovaných LDAP pripojeniach (%s)","Pripojenie a vyhľadávanie funguje na všetkých nakonfigurovaných LDAP pripojeniach (%s)","Pripojenie a vyhľadávanie funguje na všetkých nakonfigurovaných LDAP pripojeniach (%s)"],
"Invalid LDAP UUIDs" : "Neplatné LDAP UUIDs",
"None found" : "Nenájdené",
"Invalid UUIDs of LDAP accounts or groups have been found. Please review your \"Override UUID detection\" settings in the Expert part of the LDAP configuration and use \"occ ldap:update-uuid\" to update them." : "Boli nájdené neplatné UUID účtov alebo skupín LDAP. Skontrolujte svoje nastavenia „Prepísať detekciu UUID“ v expertnej časti konfigurácie LDAP a použite „occ ldap:update-uuid“ na ich aktualizáciu.",
diff --git a/apps/user_ldap/l10n/sr.js b/apps/user_ldap/l10n/sr.js
index e3748783f93..3f47a527d3a 100644
--- a/apps/user_ldap/l10n/sr.js
+++ b/apps/user_ldap/l10n/sr.js
@@ -62,10 +62,6 @@ OC.L10N.register(
"_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Ваша лозинка ће истећи за %n дан.","Ваша лозинка ће истећи за %n дана.","Ваша лозинка ће истећи за %n дана."],
"LDAP/AD integration" : "LDAP/AD интеграција",
"LDAP Connection" : "LDAP веза",
- "_Binding failed for this LDAP configuration: %s_::_Binding failed for these LDAP configurations: %s_" : ["Није успело везивање за ову LDAP конфигурацију: %s","Није успело везивање за ове LDAP конфигурације: %s","Није успело везивање за ове LDAP конфигурације: %s"],
- "_Searching failed for this LDAP configuration: %s_::_Searching failed for these LDAP configurations: %s_" : ["Није успела претрага за ову LDAP конфигурацију: %s","Није успела претрага за ове LDAP конфигурације: %s","Није успела претрага за ове LDAP конфигурације: %s"],
- "_There is an inactive LDAP configuration: %s_::_There are inactive LDAP configurations: %s_" : ["Постоји неактивна LDAP конфигурација: %s","Постоје неактивне LDAP конфигурације: %s","Постоје неактивне LDAP конфигурације: %s"],
- "_Binding and searching works on the configured LDAP connection (%s)_::_Binding and searching works on all of the configured LDAP connections (%s)_" : ["Везивање и претрага функционишу на конфигурисаној LDAP вези (%s)","Везивање и претрага функционишу на свим конфигурисаним LDAP везама (%s)","Везивање и претрага функционишу на свим конфигурисаним LDAP везама (%s)"],
"Invalid LDAP UUIDs" : "Неисправни LDAP UUID идентификатори",
"None found" : "Није пронађен ниједан",
"Invalid UUIDs of LDAP accounts or groups have been found. Please review your \"Override UUID detection\" settings in the Expert part of the LDAP configuration and use \"occ ldap:update-uuid\" to update them." : "Пронађени су неисправни UUID бројеви LDAP налога или група. Молимо вас да ревидирате своја „Премости UUID детекцију\" подешавања у Експерт делу LDAP конфигурације и употребите „occ ldap:update-uuid” да их ажурирате.",
diff --git a/apps/user_ldap/l10n/sr.json b/apps/user_ldap/l10n/sr.json
index 7ce5563883b..cbc54ae9128 100644
--- a/apps/user_ldap/l10n/sr.json
+++ b/apps/user_ldap/l10n/sr.json
@@ -60,10 +60,6 @@
"_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Ваша лозинка ће истећи за %n дан.","Ваша лозинка ће истећи за %n дана.","Ваша лозинка ће истећи за %n дана."],
"LDAP/AD integration" : "LDAP/AD интеграција",
"LDAP Connection" : "LDAP веза",
- "_Binding failed for this LDAP configuration: %s_::_Binding failed for these LDAP configurations: %s_" : ["Није успело везивање за ову LDAP конфигурацију: %s","Није успело везивање за ове LDAP конфигурације: %s","Није успело везивање за ове LDAP конфигурације: %s"],
- "_Searching failed for this LDAP configuration: %s_::_Searching failed for these LDAP configurations: %s_" : ["Није успела претрага за ову LDAP конфигурацију: %s","Није успела претрага за ове LDAP конфигурације: %s","Није успела претрага за ове LDAP конфигурације: %s"],
- "_There is an inactive LDAP configuration: %s_::_There are inactive LDAP configurations: %s_" : ["Постоји неактивна LDAP конфигурација: %s","Постоје неактивне LDAP конфигурације: %s","Постоје неактивне LDAP конфигурације: %s"],
- "_Binding and searching works on the configured LDAP connection (%s)_::_Binding and searching works on all of the configured LDAP connections (%s)_" : ["Везивање и претрага функционишу на конфигурисаној LDAP вези (%s)","Везивање и претрага функционишу на свим конфигурисаним LDAP везама (%s)","Везивање и претрага функционишу на свим конфигурисаним LDAP везама (%s)"],
"Invalid LDAP UUIDs" : "Неисправни LDAP UUID идентификатори",
"None found" : "Није пронађен ниједан",
"Invalid UUIDs of LDAP accounts or groups have been found. Please review your \"Override UUID detection\" settings in the Expert part of the LDAP configuration and use \"occ ldap:update-uuid\" to update them." : "Пронађени су неисправни UUID бројеви LDAP налога или група. Молимо вас да ревидирате своја „Премости UUID детекцију\" подешавања у Експерт делу LDAP конфигурације и употребите „occ ldap:update-uuid” да их ажурирате.",
diff --git a/apps/user_ldap/l10n/sv.js b/apps/user_ldap/l10n/sv.js
index a3ab4669fc7..134e830de60 100644
--- a/apps/user_ldap/l10n/sv.js
+++ b/apps/user_ldap/l10n/sv.js
@@ -62,10 +62,6 @@ OC.L10N.register(
"_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Ditt lösenord kommer gå ut inom %n dag.","Ditt lösenord kommer gå ut inom %n dagar."],
"LDAP/AD integration" : "LDAP/AD-integration",
"LDAP Connection" : "LDAP-anslutning",
- "_Binding failed for this LDAP configuration: %s_::_Binding failed for these LDAP configurations: %s_" : ["Bindning misslyckades för denna LDAP-konfiguration: %s","Bindning misslyckades för dessa LDAP-konfigurationer: %s"],
- "_Searching failed for this LDAP configuration: %s_::_Searching failed for these LDAP configurations: %s_" : ["Sökning misslyckades för denna LDAP-konfiguration: %s","Sökning misslyckades för dessa LDAP-konfigurationer: %s"],
- "_There is an inactive LDAP configuration: %s_::_There are inactive LDAP configurations: %s_" : ["Det finns en inaktiv LDAP-konfiguration: %s","Det finns inaktiva LDAP-konfigurationer: %s"],
- "_Binding and searching works on the configured LDAP connection (%s)_::_Binding and searching works on all of the configured LDAP connections (%s)_" : ["Bindning och sökning fungerar på den konfigurerade LDAP-anslutningen (%s)","Bindning och sökning fungerar på alla konfigurerade LDAP-anslutningar (%s)"],
"Invalid LDAP UUIDs" : "Ogiltiga LDAP UUIDs",
"None found" : "Ingen hittades",
"Invalid UUIDs of LDAP accounts or groups have been found. Please review your \"Override UUID detection\" settings in the Expert part of the LDAP configuration and use \"occ ldap:update-uuid\" to update them." : "Ogiltiga UUID för LDAP-användare eller -grupper har hittats. Granska dina \"Åsidosätt UUID-detektering\"-inställningar i expertdelen av LDAP-konfigurationen och använd \"occ ldap:update-uuid\" för att uppdatera dem.",
diff --git a/apps/user_ldap/l10n/sv.json b/apps/user_ldap/l10n/sv.json
index 7ece64d8c4d..124b5f546d9 100644
--- a/apps/user_ldap/l10n/sv.json
+++ b/apps/user_ldap/l10n/sv.json
@@ -60,10 +60,6 @@
"_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Ditt lösenord kommer gå ut inom %n dag.","Ditt lösenord kommer gå ut inom %n dagar."],
"LDAP/AD integration" : "LDAP/AD-integration",
"LDAP Connection" : "LDAP-anslutning",
- "_Binding failed for this LDAP configuration: %s_::_Binding failed for these LDAP configurations: %s_" : ["Bindning misslyckades för denna LDAP-konfiguration: %s","Bindning misslyckades för dessa LDAP-konfigurationer: %s"],
- "_Searching failed for this LDAP configuration: %s_::_Searching failed for these LDAP configurations: %s_" : ["Sökning misslyckades för denna LDAP-konfiguration: %s","Sökning misslyckades för dessa LDAP-konfigurationer: %s"],
- "_There is an inactive LDAP configuration: %s_::_There are inactive LDAP configurations: %s_" : ["Det finns en inaktiv LDAP-konfiguration: %s","Det finns inaktiva LDAP-konfigurationer: %s"],
- "_Binding and searching works on the configured LDAP connection (%s)_::_Binding and searching works on all of the configured LDAP connections (%s)_" : ["Bindning och sökning fungerar på den konfigurerade LDAP-anslutningen (%s)","Bindning och sökning fungerar på alla konfigurerade LDAP-anslutningar (%s)"],
"Invalid LDAP UUIDs" : "Ogiltiga LDAP UUIDs",
"None found" : "Ingen hittades",
"Invalid UUIDs of LDAP accounts or groups have been found. Please review your \"Override UUID detection\" settings in the Expert part of the LDAP configuration and use \"occ ldap:update-uuid\" to update them." : "Ogiltiga UUID för LDAP-användare eller -grupper har hittats. Granska dina \"Åsidosätt UUID-detektering\"-inställningar i expertdelen av LDAP-konfigurationen och använd \"occ ldap:update-uuid\" för att uppdatera dem.",
diff --git a/apps/user_ldap/l10n/tr.js b/apps/user_ldap/l10n/tr.js
index a61ee3ab2fc..349c5ef63f6 100644
--- a/apps/user_ldap/l10n/tr.js
+++ b/apps/user_ldap/l10n/tr.js
@@ -62,10 +62,6 @@ OC.L10N.register(
"_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Parolanızın süresi %n gün içinde dolacak.","Parolanızın geçerlilik süresi %n gün içinde dolacak."],
"LDAP/AD integration" : "LDAP/AD bütünleştirmesi",
"LDAP Connection" : "LDAP bağlantısı",
- "_Binding failed for this LDAP configuration: %s_::_Binding failed for these LDAP configurations: %s_" : ["Şu LDAP yapılandırması için bağlantı kurulamadı: %s","Şu LDAP yapılandırmaları için bağlantı kurulamadı: %s"],
- "_Searching failed for this LDAP configuration: %s_::_Searching failed for these LDAP configurations: %s_" : ["Şu LDAP yapılandırması için arama tamamlanamadı: %s","Şu LDAP yapılandırmaları için arama tamamlanamadı: %s"],
- "_There is an inactive LDAP configuration: %s_::_There are inactive LDAP configurations: %s_" : ["Etkin olmayan LDAP yapılandırması var: %s","Etkin olmayan LDAP yapılandırmaları var: %s"],
- "_Binding and searching works on the configured LDAP connection (%s)_::_Binding and searching works on all of the configured LDAP connections (%s)_" : ["Yapılandırılmış LDAP bağlantısında (%s) bağlantı ve arama çalışıyor","Tüm yapılandırılmış LDAP bağlantılarında (%s) bağlantı ve arama çalışıyor"],
"Invalid LDAP UUIDs" : "LDAP UUID değerleri geçersiz",
"None found" : "Herhangi bir şey bulunamadı",
"Invalid UUIDs of LDAP accounts or groups have been found. Please review your \"Override UUID detection\" settings in the Expert part of the LDAP configuration and use \"occ ldap:update-uuid\" to update them." : "LDAP hesapları ya da grupları için geçersiz UUID değerleri bulundu. Lütfen LDAP yapılandırmasının Uzman bölümündeki \"UUID algılaması değiştirilsin\" seçeneğini gözden geçirin ve bunları güncellemek için \"occ ldap:update-uuid\" komutunu kullanın.",
diff --git a/apps/user_ldap/l10n/tr.json b/apps/user_ldap/l10n/tr.json
index c0839679aa3..dbec31cf411 100644
--- a/apps/user_ldap/l10n/tr.json
+++ b/apps/user_ldap/l10n/tr.json
@@ -60,10 +60,6 @@
"_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Parolanızın süresi %n gün içinde dolacak.","Parolanızın geçerlilik süresi %n gün içinde dolacak."],
"LDAP/AD integration" : "LDAP/AD bütünleştirmesi",
"LDAP Connection" : "LDAP bağlantısı",
- "_Binding failed for this LDAP configuration: %s_::_Binding failed for these LDAP configurations: %s_" : ["Şu LDAP yapılandırması için bağlantı kurulamadı: %s","Şu LDAP yapılandırmaları için bağlantı kurulamadı: %s"],
- "_Searching failed for this LDAP configuration: %s_::_Searching failed for these LDAP configurations: %s_" : ["Şu LDAP yapılandırması için arama tamamlanamadı: %s","Şu LDAP yapılandırmaları için arama tamamlanamadı: %s"],
- "_There is an inactive LDAP configuration: %s_::_There are inactive LDAP configurations: %s_" : ["Etkin olmayan LDAP yapılandırması var: %s","Etkin olmayan LDAP yapılandırmaları var: %s"],
- "_Binding and searching works on the configured LDAP connection (%s)_::_Binding and searching works on all of the configured LDAP connections (%s)_" : ["Yapılandırılmış LDAP bağlantısında (%s) bağlantı ve arama çalışıyor","Tüm yapılandırılmış LDAP bağlantılarında (%s) bağlantı ve arama çalışıyor"],
"Invalid LDAP UUIDs" : "LDAP UUID değerleri geçersiz",
"None found" : "Herhangi bir şey bulunamadı",
"Invalid UUIDs of LDAP accounts or groups have been found. Please review your \"Override UUID detection\" settings in the Expert part of the LDAP configuration and use \"occ ldap:update-uuid\" to update them." : "LDAP hesapları ya da grupları için geçersiz UUID değerleri bulundu. Lütfen LDAP yapılandırmasının Uzman bölümündeki \"UUID algılaması değiştirilsin\" seçeneğini gözden geçirin ve bunları güncellemek için \"occ ldap:update-uuid\" komutunu kullanın.",
diff --git a/apps/user_ldap/l10n/zh_HK.js b/apps/user_ldap/l10n/zh_HK.js
index 587c6930b8f..77ea4d08208 100644
--- a/apps/user_ldap/l10n/zh_HK.js
+++ b/apps/user_ldap/l10n/zh_HK.js
@@ -62,10 +62,6 @@ OC.L10N.register(
"_Your password will expire within %n day._::_Your password will expire within %n days._" : ["您的密碼將於%n天後過期"],
"LDAP/AD integration" : "LDAP /AD 整合",
"LDAP Connection" : "LDAP 連線",
- "_Binding failed for this LDAP configuration: %s_::_Binding failed for these LDAP configurations: %s_" : ["這些 LDAP 配置綁紮失敗:%s"],
- "_Searching failed for this LDAP configuration: %s_::_Searching failed for these LDAP configurations: %s_" : ["這些 LDAP 配置搜尋失敗:%s"],
- "_There is an inactive LDAP configuration: %s_::_There are inactive LDAP configurations: %s_" : ["有不活躍的 LDAP 配置:%s"],
- "_Binding and searching works on the configured LDAP connection (%s)_::_Binding and searching works on all of the configured LDAP connections (%s)_" : ["綁紮與搜尋適用於所有已設定的 LDAP 連線 (%s)"],
"Invalid LDAP UUIDs" : "無效的 LDAP UUID",
"None found" : "未找到",
"Invalid UUIDs of LDAP accounts or groups have been found. Please review your \"Override UUID detection\" settings in the Expert part of the LDAP configuration and use \"occ ldap:update-uuid\" to update them." : "LDAP 帳戶或群組的 UUID 無效。請查看 LDAP 配置專家部分中的“覆蓋 UUID 檢測”設置,並使用“occ ldap:update-uuid”更新它們。",
diff --git a/apps/user_ldap/l10n/zh_HK.json b/apps/user_ldap/l10n/zh_HK.json
index a7983c0ad2c..04d61f291ce 100644
--- a/apps/user_ldap/l10n/zh_HK.json
+++ b/apps/user_ldap/l10n/zh_HK.json
@@ -60,10 +60,6 @@
"_Your password will expire within %n day._::_Your password will expire within %n days._" : ["您的密碼將於%n天後過期"],
"LDAP/AD integration" : "LDAP /AD 整合",
"LDAP Connection" : "LDAP 連線",
- "_Binding failed for this LDAP configuration: %s_::_Binding failed for these LDAP configurations: %s_" : ["這些 LDAP 配置綁紮失敗:%s"],
- "_Searching failed for this LDAP configuration: %s_::_Searching failed for these LDAP configurations: %s_" : ["這些 LDAP 配置搜尋失敗:%s"],
- "_There is an inactive LDAP configuration: %s_::_There are inactive LDAP configurations: %s_" : ["有不活躍的 LDAP 配置:%s"],
- "_Binding and searching works on the configured LDAP connection (%s)_::_Binding and searching works on all of the configured LDAP connections (%s)_" : ["綁紮與搜尋適用於所有已設定的 LDAP 連線 (%s)"],
"Invalid LDAP UUIDs" : "無效的 LDAP UUID",
"None found" : "未找到",
"Invalid UUIDs of LDAP accounts or groups have been found. Please review your \"Override UUID detection\" settings in the Expert part of the LDAP configuration and use \"occ ldap:update-uuid\" to update them." : "LDAP 帳戶或群組的 UUID 無效。請查看 LDAP 配置專家部分中的“覆蓋 UUID 檢測”設置,並使用“occ ldap:update-uuid”更新它們。",
diff --git a/apps/user_ldap/l10n/zh_TW.js b/apps/user_ldap/l10n/zh_TW.js
index cb39b6e2742..338e0bda12d 100644
--- a/apps/user_ldap/l10n/zh_TW.js
+++ b/apps/user_ldap/l10n/zh_TW.js
@@ -62,10 +62,6 @@ OC.L10N.register(
"_Your password will expire within %n day._::_Your password will expire within %n days._" : ["您的密碼將於%n天後到期。"],
"LDAP/AD integration" : "LDAP/AD 整合",
"LDAP Connection" : "LDAP 連線",
- "_Binding failed for this LDAP configuration: %s_::_Binding failed for these LDAP configurations: %s_" : ["這些 LDAP 設定綁紮失敗:%s"],
- "_Searching failed for this LDAP configuration: %s_::_Searching failed for these LDAP configurations: %s_" : ["這些 LDAP 設定搜尋失敗:%s"],
- "_There is an inactive LDAP configuration: %s_::_There are inactive LDAP configurations: %s_" : ["有不活躍的 LDAP 設定:%s"],
- "_Binding and searching works on the configured LDAP connection (%s)_::_Binding and searching works on all of the configured LDAP connections (%s)_" : ["綁紮與搜尋適用於所有已設定的 LDAP 連線 (%s)"],
"Invalid LDAP UUIDs" : "無效的 LDAP UUID",
"None found" : "找不到",
"Invalid UUIDs of LDAP accounts or groups have been found. Please review your \"Override UUID detection\" settings in the Expert part of the LDAP configuration and use \"occ ldap:update-uuid\" to update them." : "找到無效的 LDAP 帳號或群組 UUID。請審閱您在 LDAP 專家設定中的「覆寫 UUID 偵測」設定,並使用「occ ldap:update-uuid」來更新它們。",
diff --git a/apps/user_ldap/l10n/zh_TW.json b/apps/user_ldap/l10n/zh_TW.json
index 3a530460b61..d566b7d794b 100644
--- a/apps/user_ldap/l10n/zh_TW.json
+++ b/apps/user_ldap/l10n/zh_TW.json
@@ -60,10 +60,6 @@
"_Your password will expire within %n day._::_Your password will expire within %n days._" : ["您的密碼將於%n天後到期。"],
"LDAP/AD integration" : "LDAP/AD 整合",
"LDAP Connection" : "LDAP 連線",
- "_Binding failed for this LDAP configuration: %s_::_Binding failed for these LDAP configurations: %s_" : ["這些 LDAP 設定綁紮失敗:%s"],
- "_Searching failed for this LDAP configuration: %s_::_Searching failed for these LDAP configurations: %s_" : ["這些 LDAP 設定搜尋失敗:%s"],
- "_There is an inactive LDAP configuration: %s_::_There are inactive LDAP configurations: %s_" : ["有不活躍的 LDAP 設定:%s"],
- "_Binding and searching works on the configured LDAP connection (%s)_::_Binding and searching works on all of the configured LDAP connections (%s)_" : ["綁紮與搜尋適用於所有已設定的 LDAP 連線 (%s)"],
"Invalid LDAP UUIDs" : "無效的 LDAP UUID",
"None found" : "找不到",
"Invalid UUIDs of LDAP accounts or groups have been found. Please review your \"Override UUID detection\" settings in the Expert part of the LDAP configuration and use \"occ ldap:update-uuid\" to update them." : "找到無效的 LDAP 帳號或群組 UUID。請審閱您在 LDAP 專家設定中的「覆寫 UUID 偵測」設定,並使用「occ ldap:update-uuid」來更新它們。",
diff --git a/apps/workflowengine/l10n/sl.js b/apps/workflowengine/l10n/sl.js
index 9c254bfc569..d297b9208fb 100644
--- a/apps/workflowengine/l10n/sl.js
+++ b/apps/workflowengine/l10n/sl.js
@@ -48,6 +48,7 @@ OC.L10N.register(
"Nextcloud workflow engine" : "Program za koračno avtomatizacijo delovnih nalog",
"Select a filter" : "Izbor filtra",
"Select a comparator" : "Izbor primerjalnika",
+ "Remove filter" : "Odstrani filter",
"Select a file type" : "Izbor vrste datoteke",
"e.g. httpd/unix-directory" : "npr. httpd/unix-directory",
"Folder" : "Mapa",
diff --git a/apps/workflowengine/l10n/sl.json b/apps/workflowengine/l10n/sl.json
index b4f8bfcc236..40aecaa3ff8 100644
--- a/apps/workflowengine/l10n/sl.json
+++ b/apps/workflowengine/l10n/sl.json
@@ -46,6 +46,7 @@
"Nextcloud workflow engine" : "Program za koračno avtomatizacijo delovnih nalog",
"Select a filter" : "Izbor filtra",
"Select a comparator" : "Izbor primerjalnika",
+ "Remove filter" : "Odstrani filter",
"Select a file type" : "Izbor vrste datoteke",
"e.g. httpd/unix-directory" : "npr. httpd/unix-directory",
"Folder" : "Mapa",
diff --git a/build/psalm-baseline.xml b/build/psalm-baseline.xml
index 1555902b9bf..bf6eb530655 100644
--- a/build/psalm-baseline.xml
+++ b/build/psalm-baseline.xml
@@ -996,9 +996,6 @@
</UndefinedInterfaceMethod>
</file>
<file src="apps/files_trashbin/lib/Trashbin.php">
- <FalsableReturnStatement>
- <code><![CDATA[false]]></code>
- </FalsableReturnStatement>
<InvalidArgument>
<code><![CDATA[$timestamp]]></code>
</InvalidArgument>
@@ -2116,14 +2113,8 @@
<code><![CDATA[$this->copyFromStorage($sourceStorage, $sourceInternalPath . '/' . $file, $targetInternalPath . '/' . $file)]]></code>
</InvalidOperand>
<NoInterfaceProperties>
- <code><![CDATA[$storage->cache]]></code>
- <code><![CDATA[$storage->cache]]></code>
- <code><![CDATA[$storage->propagator]]></code>
- <code><![CDATA[$storage->propagator]]></code>
<code><![CDATA[$storage->scanner]]></code>
<code><![CDATA[$storage->scanner]]></code>
- <code><![CDATA[$storage->updater]]></code>
- <code><![CDATA[$storage->updater]]></code>
</NoInterfaceProperties>
</file>
<file src="lib/private/Files/Storage/DAV.php">
@@ -2923,11 +2914,6 @@
<code><![CDATA[\OC_App::getStorage($app)]]></code>
</FalsableReturnStatement>
</file>
- <file src="lib/public/Files/Storage.php">
- <InvalidParamDefault>
- <code><![CDATA[array]]></code>
- </InvalidParamDefault>
- </file>
<file src="lib/public/L10N/ILanguageIterator.php">
<MissingTemplateParam>
<code><![CDATA[\Iterator]]></code>
diff --git a/core/js/mimetypelist.js b/core/js/mimetypelist.js
index 3becf6e37d3..ed861205cf0 100644
--- a/core/js/mimetypelist.js
+++ b/core/js/mimetypelist.js
@@ -15,8 +15,10 @@ OC.MimeTypeList={
"application/gpx+xml": "location",
"application/gzip": "package/x-generic",
"application/illustrator": "image",
+ "application/internet-shortcut": "link",
"application/javascript": "text/code",
"application/json": "text/code",
+ "application/km": "mindmap",
"application/msaccess": "file",
"application/msexcel": "x-office/spreadsheet",
"application/msonenote": "x-office/document",
@@ -27,21 +29,21 @@ OC.MimeTypeList={
"application/rss+xml": "application/xml",
"application/vnd.android.package-archive": "package/x-generic",
"application/vnd.excalidraw+json": "whiteboard",
- "application/vnd.lotus-wordpro": "x-office/document",
"application/vnd.garmin.tcx+xml": "location",
"application/vnd.google-earth.kml+xml": "location",
"application/vnd.google-earth.kmz": "location",
- "application/vnd.ms-excel": "x-office/spreadsheet",
+ "application/vnd.lotus-wordpro": "x-office/document",
"application/vnd.ms-excel.addin.macroEnabled.12": "x-office/spreadsheet",
"application/vnd.ms-excel.sheet.binary.macroEnabled.12": "x-office/spreadsheet",
"application/vnd.ms-excel.sheet.macroEnabled.12": "x-office/spreadsheet",
"application/vnd.ms-excel.template.macroEnabled.12": "x-office/spreadsheet",
+ "application/vnd.ms-excel": "x-office/spreadsheet",
"application/vnd.ms-fontobject": "font",
- "application/vnd.ms-powerpoint": "x-office/presentation",
"application/vnd.ms-powerpoint.addin.macroEnabled.12": "x-office/presentation",
"application/vnd.ms-powerpoint.presentation.macroEnabled.12": "x-office/presentation",
"application/vnd.ms-powerpoint.slideshow.macroEnabled.12": "x-office/presentation",
"application/vnd.ms-powerpoint.template.macroEnabled.12": "x-office/presentation",
+ "application/vnd.ms-powerpoint": "x-office/presentation",
"application/vnd.ms-visio.drawing.macroEnabled.12": "application/vnd.visio",
"application/vnd.ms-visio.drawing": "application/vnd.visio",
"application/vnd.ms-visio.stencil.macroEnabled.12": "application/vnd.visio",
@@ -50,29 +52,32 @@ OC.MimeTypeList={
"application/vnd.ms-visio.template": "application/vnd.visio",
"application/vnd.ms-word.document.macroEnabled.12": "x-office/document",
"application/vnd.ms-word.template.macroEnabled.12": "x-office/document",
- "application/vnd.oasis.opendocument.presentation": "x-office/presentation",
+ "application/vnd.oasis.opendocument.graphics-flat-xml": "x-office/drawing",
+ "application/vnd.oasis.opendocument.graphics-template": "x-office/drawing",
+ "application/vnd.oasis.opendocument.graphics": "x-office/drawing",
+ "application/vnd.oasis.opendocument.presentation-flat-xml": "x-office/presentation",
"application/vnd.oasis.opendocument.presentation-template": "x-office/presentation",
- "application/vnd.oasis.opendocument.spreadsheet": "x-office/spreadsheet",
+ "application/vnd.oasis.opendocument.presentation": "x-office/presentation",
+ "application/vnd.oasis.opendocument.spreadsheet-flat-xml": "x-office/spreadsheet",
"application/vnd.oasis.opendocument.spreadsheet-template": "x-office/spreadsheet",
- "application/vnd.oasis.opendocument.text": "x-office/document",
+ "application/vnd.oasis.opendocument.spreadsheet": "x-office/spreadsheet",
+ "application/vnd.oasis.opendocument.text-flat-xml": "x-office/document",
"application/vnd.oasis.opendocument.text-master": "x-office/document",
"application/vnd.oasis.opendocument.text-template": "x-office/document",
- "application/vnd.oasis.opendocument.graphics": "x-office/drawing",
- "application/vnd.oasis.opendocument.graphics-template": "x-office/drawing",
"application/vnd.oasis.opendocument.text-web": "x-office/document",
- "application/vnd.oasis.opendocument.text-flat-xml": "x-office/document",
- "application/vnd.oasis.opendocument.spreadsheet-flat-xml": "x-office/spreadsheet",
- "application/vnd.oasis.opendocument.graphics-flat-xml": "x-office/drawing",
- "application/vnd.oasis.opendocument.presentation-flat-xml": "x-office/presentation",
+ "application/vnd.oasis.opendocument.text": "x-office/document",
"application/vnd.openxmlformats-officedocument.presentationml.presentation": "x-office/presentation",
"application/vnd.openxmlformats-officedocument.presentationml.slideshow": "x-office/presentation",
"application/vnd.openxmlformats-officedocument.presentationml.template": "x-office/presentation",
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet": "x-office/spreadsheet",
"application/vnd.openxmlformats-officedocument.spreadsheetml.template": "x-office/spreadsheet",
+ "application/vnd.openxmlformats-officedocument.wordprocessingml.document.docxf": "x-office/form-template",
+ "application/vnd.openxmlformats-officedocument.wordprocessingml.document.oform": "x-office/form",
"application/vnd.openxmlformats-officedocument.wordprocessingml.document": "x-office/document",
"application/vnd.openxmlformats-officedocument.wordprocessingml.template": "x-office/document",
"application/vnd.visio": "x-office/document",
"application/vnd.wordperfect": "x-office/document",
+ "application/vnd.xmind.workbook": "mindmap",
"application/x-7z-compressed": "package/x-generic",
"application/x-bzip2": "package/x-generic",
"application/x-cbr": "text",
@@ -81,6 +86,7 @@ OC.MimeTypeList={
"application/x-deb": "package/x-generic",
"application/x-fictionbook+xml": "text",
"application/x-font": "font",
+ "application/x-freemind": "mindmap",
"application/x-gimp": "image",
"application/x-gzip": "application/gzip",
"application/x-iwork-keynote-sffkey": "x-office/presentation",
@@ -96,8 +102,11 @@ OC.MimeTypeList={
"application/xml": "text/html",
"application/yaml": "text/code",
"application/zip": "package/x-generic",
+ "application/zstd": "package/x-generic",
"database": "file",
"httpd/unix-directory": "dir",
+ "image/targa": "image/tga",
+ "image/x-emf": "image/emf",
"text/css": "text/code",
"text/csv": "x-office/spreadsheet",
"text/html": "text/code",
@@ -109,15 +118,7 @@ OC.MimeTypeList={
"text/x-python": "text/code",
"text/x-rst": "text",
"text/x-shellscript": "text/code",
- "web": "text/code",
- "application/internet-shortcut": "link",
- "application/km": "mindmap",
- "application/x-freemind": "mindmap",
- "application/vnd.xmind.workbook": "mindmap",
- "image/targa": "image/tga",
- "application/vnd.openxmlformats-officedocument.wordprocessingml.document.oform": "x-office/form",
- "application/vnd.openxmlformats-officedocument.wordprocessingml.document.docxf": "x-office/form-template",
- "image/x-emf": "image/emf"
+ "web": "text/code"
},
files: [
"application",
diff --git a/core/l10n/hu.js b/core/l10n/hu.js
index 40a1f970d73..3e606750880 100644
--- a/core/l10n/hu.js
+++ b/core/l10n/hu.js
@@ -103,8 +103,14 @@ OC.L10N.register(
"_{count} notification_::_{count} notifications_" : ["{count} értesítés","{count} értesítés"],
"No" : "Nem",
"Yes" : "Igen",
+ "Federated user" : "Föderált felhasználó",
+ "user@your-nextcloud.org" : "felhasználó@az-ön-nextcloudja.org",
"Create share" : "Megosztás létrehozása",
+ "The remote URL must include the user." : "A távoli URL-nek tartalmaznia kell a felhasználót.",
+ "Invalid remote URL." : "Érvénytelen távoli URL.",
"Failed to add the public link to your Nextcloud" : "Nem sikerült hozzáadni a nyilvános hivatkozást a Nexcloudjához",
+ "Direct link copied to clipboard" : "Közvetlen hivatkozás a vágólapra másolva.",
+ "Please copy the link manually:" : "Másolja a hivatkozást manuálisan:",
"Custom date range" : "Egyéni dátumtartomány",
"Pick start date" : "Válasszon kezdési dátumot",
"Pick end date" : "Válasszon befejezési dátumot",
diff --git a/core/l10n/hu.json b/core/l10n/hu.json
index 9fc3e88fe27..ab7b456b483 100644
--- a/core/l10n/hu.json
+++ b/core/l10n/hu.json
@@ -101,8 +101,14 @@
"_{count} notification_::_{count} notifications_" : ["{count} értesítés","{count} értesítés"],
"No" : "Nem",
"Yes" : "Igen",
+ "Federated user" : "Föderált felhasználó",
+ "user@your-nextcloud.org" : "felhasználó@az-ön-nextcloudja.org",
"Create share" : "Megosztás létrehozása",
+ "The remote URL must include the user." : "A távoli URL-nek tartalmaznia kell a felhasználót.",
+ "Invalid remote URL." : "Érvénytelen távoli URL.",
"Failed to add the public link to your Nextcloud" : "Nem sikerült hozzáadni a nyilvános hivatkozást a Nexcloudjához",
+ "Direct link copied to clipboard" : "Közvetlen hivatkozás a vágólapra másolva.",
+ "Please copy the link manually:" : "Másolja a hivatkozást manuálisan:",
"Custom date range" : "Egyéni dátumtartomány",
"Pick start date" : "Válasszon kezdési dátumot",
"Pick end date" : "Válasszon befejezési dátumot",
diff --git a/core/l10n/sl.js b/core/l10n/sl.js
index b12669e8f52..98c43aceb1d 100644
--- a/core/l10n/sl.js
+++ b/core/l10n/sl.js
@@ -104,8 +104,13 @@ OC.L10N.register(
"No" : "Ne",
"Yes" : "Da",
"Federated user" : "Zvezni uporabnik",
+ "user@your-nextcloud.org" : "uporabnik@oblak-nextcloud.org",
"Create share" : "Ustvari predmet souporabe",
+ "The remote URL must include the user." : "Oddaljeni naslov URL mora vključevati uporabniško ime.",
+ "Invalid remote URL." : "Neveljaven oddaljeni naslov URL.",
"Failed to add the public link to your Nextcloud" : "Dodajanje javne povezave v oblak je spodletelo.",
+ "Direct link copied to clipboard" : "Povezava je kopirana v odložišče.",
+ "Please copy the link manually:" : "Povezave je treba kopirati ročno.",
"Custom date range" : "Obseg datuma po meri",
"Pick start date" : "Izbor začetnega datuma",
"Pick end date" : "Izbori končnega datuma",
diff --git a/core/l10n/sl.json b/core/l10n/sl.json
index b35a98a0b3d..ba2893161b8 100644
--- a/core/l10n/sl.json
+++ b/core/l10n/sl.json
@@ -102,8 +102,13 @@
"No" : "Ne",
"Yes" : "Da",
"Federated user" : "Zvezni uporabnik",
+ "user@your-nextcloud.org" : "uporabnik@oblak-nextcloud.org",
"Create share" : "Ustvari predmet souporabe",
+ "The remote URL must include the user." : "Oddaljeni naslov URL mora vključevati uporabniško ime.",
+ "Invalid remote URL." : "Neveljaven oddaljeni naslov URL.",
"Failed to add the public link to your Nextcloud" : "Dodajanje javne povezave v oblak je spodletelo.",
+ "Direct link copied to clipboard" : "Povezava je kopirana v odložišče.",
+ "Please copy the link manually:" : "Povezave je treba kopirati ročno.",
"Custom date range" : "Obseg datuma po meri",
"Pick start date" : "Izbor začetnega datuma",
"Pick end date" : "Izbori končnega datuma",
diff --git a/core/l10n/sr.js b/core/l10n/sr.js
index 07c6cb3eb61..6192a7eab20 100644
--- a/core/l10n/sr.js
+++ b/core/l10n/sr.js
@@ -104,8 +104,13 @@ OC.L10N.register(
"No" : "Не",
"Yes" : "Да",
"Federated user" : "Федерисани корисник",
+ "user@your-nextcloud.org" : "korisnik@vas-nextcloud.org",
"Create share" : "Kreirajte deljenje",
+ "The remote URL must include the user." : "Удаљени URL мора да садржи кориника.",
+ "Invalid remote URL." : "Неисправан удаљени URL.",
"Failed to add the public link to your Nextcloud" : "Неуспело додавање јавне везе ка Вашем Некстклауду",
+ "Direct link copied to clipboard" : "Директни линк је копиран у клипборд",
+ "Please copy the link manually:" : "Молимо вас да ручно корпирате линк:",
"Custom date range" : "Произвољни опсег датума",
"Pick start date" : "Изаберите почетни датум",
"Pick end date" : "Изаберите крајњи датум",
diff --git a/core/l10n/sr.json b/core/l10n/sr.json
index bf28c9d6147..a6a819c23db 100644
--- a/core/l10n/sr.json
+++ b/core/l10n/sr.json
@@ -102,8 +102,13 @@
"No" : "Не",
"Yes" : "Да",
"Federated user" : "Федерисани корисник",
+ "user@your-nextcloud.org" : "korisnik@vas-nextcloud.org",
"Create share" : "Kreirajte deljenje",
+ "The remote URL must include the user." : "Удаљени URL мора да садржи кориника.",
+ "Invalid remote URL." : "Неисправан удаљени URL.",
"Failed to add the public link to your Nextcloud" : "Неуспело додавање јавне везе ка Вашем Некстклауду",
+ "Direct link copied to clipboard" : "Директни линк је копиран у клипборд",
+ "Please copy the link manually:" : "Молимо вас да ручно корпирате линк:",
"Custom date range" : "Произвољни опсег датума",
"Pick start date" : "Изаберите почетни датум",
"Pick end date" : "Изаберите крајњи датум",
diff --git a/dist/settings-apps-view-4529.js b/dist/settings-apps-view-4529.js
index a82345ee218..4e6749873ed 100644
--- a/dist/settings-apps-view-4529.js
+++ b/dist/settings-apps-view-4529.js
@@ -1,2 +1,2 @@
-"use strict";(self.webpackChunknextcloud=self.webpackChunknextcloud||[]).push([[4529],{92973:(t,e,a)=>{a.d(e,{l:()=>i});var n=a(53334);const i=Object.freeze({discover:(0,n.Tl)("settings","Discover"),installed:(0,n.Tl)("settings","Your apps"),enabled:(0,n.Tl)("settings","Active apps"),disabled:(0,n.Tl)("settings","Disabled apps"),updates:(0,n.Tl)("settings","Updates"),"app-bundles":(0,n.Tl)("settings","App bundles"),featured:(0,n.Tl)("settings","Featured apps"),supported:(0,n.Tl)("settings","Supported apps")})},45834:(e,a,n)=>{n.d(a,{A:()=>l});var i=n(85168),s=n(65043),o=n(63814),r=n(61338);const p=()=>s.Ay.get((0,o.KT)("core/navigation",2)+"/apps?format=json").then((t=>{let{data:e}=t;200===e.ocs.meta.statuscode&&((0,r.Ic)("nextcloud:app-menu.refresh",{apps:e.ocs.data}),window.dispatchEvent(new Event("resize")))})),l={computed:{appGroups(){return this.app.groups.map((t=>({id:t,name:t})))},installing(){return this.$store.getters.loading("install")},isLoading(){return this.app&&this.$store.getters.loading(this.app.id)},enableButtonText(){return this.app.needsDownload?t("settings","Download and enable"):t("settings","Enable")},forceEnableButtonText(){return this.app.needsDownload,t("settings","Allow untested app")},enableButtonTooltip(){return this.app.needsDownload?t("settings","The app will be downloaded from the App Store"):null},forceEnableButtonTooltip(){const e=t("settings","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.");return this.app.needsDownload?e+" "+t("settings","The app will be downloaded from the App Store"):e}},data:()=>({groupCheckedAppsData:!1}),mounted(){this.app&&this.app.groups&&this.app.groups.length>0&&(this.groupCheckedAppsData=!0)},methods:{asyncFindGroup(t){return this.$store.dispatch("getGroups",{search:t,limit:5,offset:0})},isLimitedToGroups(t){return!(!this.app.groups.length&&!this.groupCheckedAppsData)},setGroupLimit(){this.groupCheckedAppsData||this.$store.dispatch("enableApp",{appId:this.app.id,groups:[]})},canLimitToGroups:t=>!(t.types&&t.types.includes("filesystem")||t.types.includes("prelogin")||t.types.includes("authentication")||t.types.includes("logging")||t.types.includes("prevent_group_restriction")),addGroupLimitation(t){const e=t.pop(),a=this.app.groups.concat([]).concat([e.id]);this.$store.dispatch("enableApp",{appId:this.app.id,groups:a})},removeGroupLimitation(t){const e=this.app.groups.concat([]),a=e.indexOf(t.id);a>-1&&e.splice(a,1),this.$store.dispatch("enableApp",{appId:this.app.id,groups:e})},forceEnable(t){this.$store.dispatch("forceEnableApp",{appId:t,groups:[]}).then((t=>{p()})).catch((t=>{(0,i.Qg)(t)}))},enable(t){this.$store.dispatch("enableApp",{appId:t,groups:[]}).then((t=>{p()})).catch((t=>{(0,i.Qg)(t)}))},disable(t){this.$store.dispatch("disableApp",{appId:t}).then((t=>{p()})).catch((t=>{(0,i.Qg)(t)}))},remove(t){this.$store.dispatch("uninstallApp",{appId:t}).then((t=>{p()})).catch((t=>{(0,i.Qg)(t)}))},install(t){this.$store.dispatch("enableApp",{appId:t}).then((t=>{p()})).catch((t=>{(0,i.Qg)(t)}))},update(t){this.$store.dispatch("updateApp",{appId:t}).then((t=>{p()})).catch((t=>{(0,i.Qg)(t)}))}}}},86438:(t,e,a)=>{a.d(e,{A:()=>i});var n=a(9165);const i=Object.freeze({discover:n.tZc,installed:n.Gbn,enabled:n.Tfj,disabled:n.hyP,bundles:n.nSK,supported:n.Yk,featured:n.ZL5,updates:n.XCd,auth:n.EYN,customization:n.CZ3,dashboard:n.o7l,files:n.fEr,games:n.FeJ,integration:n.bur,monitoring:n.y48,multimedia:n.WI,office:n.Ku3,organization:n.TO3,search:n.U4M,security:n.JiW,social:n.Krx,tools:n.QKT,workflow:n.Dgm})},846:(t,e,a)=>{a.d(e,{T:()=>A});var n=a(85168),i=a(32981),s=a(53334),o=a(63814),r=a(65899),p=a(65043),l=a(36620),c=a(86438);const d=()=>(0,n.Qg)((0,s.Tl)("settings","An error occurred during the request. Unable to proceed.")),A=(0,r.nY)("settings-apps",{state:()=>({apps:[],categories:[],updateCount:(0,i.C)("settings","appstoreUpdateCount",0),loading:{apps:!1,categories:!1},loadingList:!1,gettingCategoriesPromise:null}),actions:{async loadCategories(){let t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];if(!(this.categories.length>0)||t)try{this.loading.categories=!0;const{data:t}=await p.Ay.get((0,o.Jv)("settings/apps/categories"));for(const e of t)e.icon=c.A[e.id]??"";this.$patch({categories:t})}catch(t){l.A.error(t),d()}finally{this.loading.categories=!1}},async loadApps(){let t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];if(!(this.apps.length>0)||t)try{this.loading.apps=!0;const{data:t}=await p.Ay.get((0,o.Jv)("settings/apps/list"));this.$patch({apps:t.apps})}catch(t){l.A.error(t),d()}finally{this.loading.apps=!1}},getCategoryById(t){return this.categories.find((e=>{let{id:a}=e;return a===t}))??null},getAppById(t){return this.apps.find((e=>{let{id:a}=e;return a===t}))??null}}})},35534:(t,e,a)=>{a.d(e,{A:()=>r});var n=a(71354),i=a.n(n),s=a(76314),o=a.n(s)()(i());o.push([t.id,".apps-list[data-v-5cf3c7a8]{display:flex;flex-wrap:wrap;align-content:flex-start}.apps-list--move[data-v-5cf3c7a8]{transition:transform 1s}.apps-list #app-list-update-all[data-v-5cf3c7a8]{margin-inline-start:10px}.apps-list__toolbar[data-v-5cf3c7a8]{height:60px;padding:8px;padding-inline-start:60px;width:100%;background-color:var(--color-main-background);position:sticky;top:0;z-index:1;display:flex;align-items:center}.apps-list--list-view[data-v-5cf3c7a8]{margin-bottom:100px;position:relative}.apps-list__list-container[data-v-5cf3c7a8]{width:100%}.apps-list__store-container[data-v-5cf3c7a8]{display:flex;flex-wrap:wrap}.apps-list__bundle-heading[data-v-5cf3c7a8]{display:flex;align-items:center;margin-block:20px;margin-inline:0 10px}.apps-list__bundle-header[data-v-5cf3c7a8]{margin-block:0;margin-inline:50px 10px;font-weight:bold;font-size:20px;line-height:30px;color:var(--color-text-light)}#apps-list-search .app-item h2[data-v-5cf3c7a8]{margin-bottom:0}","",{version:3,sources:["webpack://./apps/settings/src/components/AppList.vue"],names:[],mappings:"AAIA,4BACC,YAAA,CACA,cAAA,CACA,wBAAA,CAGA,kCACC,uBAAA,CAGD,iDACC,wBAAA,CAGD,qCACC,WAjBe,CAkBf,WAnBgB,CAqBhB,yBApBe,CAqBf,UAAA,CACA,6CAAA,CACA,eAAA,CACA,KAAA,CACA,SAAA,CACA,YAAA,CACA,kBAAA,CAGD,uCACC,mBAAA,CAEA,iBAAA,CAGD,4CACC,UAAA,CAGD,6CACC,YAAA,CACA,cAAA,CAGD,4CACC,YAAA,CACA,kBAAA,CACA,iBAAA,CACA,oBAAA,CAGD,2CACC,cAAA,CACA,uBAAA,CACA,gBAAA,CACA,cAAA,CACA,gBAAA,CACA,6BAAA,CAMA,gDACC,eAAA",sourcesContent:["\n$toolbar-padding: 8px;\n$toolbar-height: 44px + $toolbar-padding * 2;\n\n.apps-list {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\talign-content: flex-start;\n\n\t// For transition group\n\t&--move {\n\t\ttransition: transform 1s;\n\t}\n\n\t#app-list-update-all {\n\t\tmargin-inline-start: 10px;\n\t}\n\n\t&__toolbar {\n\t\theight: $toolbar-height;\n\t\tpadding: $toolbar-padding;\n\t\t// Leave room for app-navigation-toggle\n\t\tpadding-inline-start: $toolbar-height;\n\t\twidth: 100%;\n\t\tbackground-color: var(--color-main-background);\n\t\tposition: sticky;\n\t\ttop: 0;\n\t\tz-index: 1;\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t}\n\n\t&--list-view {\n\t\tmargin-bottom: 100px;\n\t\t// For positioning link overlay on rows\n\t\tposition: relative;\n\t}\n\n\t&__list-container {\n\t\twidth: 100%;\n\t}\n\n\t&__store-container {\n\t\tdisplay: flex;\n\t\tflex-wrap: wrap;\n\t}\n\n\t&__bundle-heading {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tmargin-block: 20px;\n\t\tmargin-inline: 0 10px;\n\t}\n\n\t&__bundle-header {\n\t\tmargin-block: 0;\n\t\tmargin-inline: 50px 10px;\n\t\tfont-weight: bold;\n\t\tfont-size: 20px;\n\t\tline-height: 30px;\n\t\tcolor: var(--color-text-light);\n\t}\n}\n\n#apps-list-search {\n\t.app-item {\n\t\th2 {\n\t\t\tmargin-bottom: 0;\n\t\t}\n\t}\n}\n"],sourceRoot:""}]);const r=o},89668:(t,e,a)=>{a.d(e,{A:()=>r});var n=a(71354),i=a.n(n),s=a(76314),o=a.n(s)()(i());o.push([t.id,'/*!\n * SPDX-FileCopyrightText: 2018 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */.app-item[data-v-4f1b9f2a]{position:relative}.app-item[data-v-4f1b9f2a]:hover{background-color:var(--color-background-dark)}.app-item--list-view[data-v-4f1b9f2a]{--app-item-padding: calc(var(--default-grid-baseline) * 2);--app-item-height: calc(var(--default-clickable-area) + var(--app-item-padding) * 2)}.app-item--list-view.app-item--selected[data-v-4f1b9f2a]{background-color:var(--color-background-dark)}.app-item--list-view>*[data-v-4f1b9f2a]{vertical-align:middle;border-bottom:1px solid var(--color-border);padding:var(--app-item-padding);height:var(--app-item-height)}.app-item--list-view .app-image[data-v-4f1b9f2a]{width:var(--default-clickable-area);height:auto;text-align:end}.app-item--list-view .app-image-icon svg[data-v-4f1b9f2a],.app-item--list-view .app-image-icon .icon-settings-dark[data-v-4f1b9f2a]{margin-top:5px;width:20px;height:20px;opacity:.5;background-size:cover;display:inline-block}.app-item--list-view .app-name[data-v-4f1b9f2a]{padding:0 var(--app-item-padding)}.app-item--list-view .app-name--link[data-v-4f1b9f2a]{height:var(--app-item-height);display:flex;align-items:center}.app-item--list-view .app-name--link[data-v-4f1b9f2a]::after{content:"";position:absolute;inset-inline:0;height:var(--app-item-height)}.app-item--list-view .app-actions[data-v-4f1b9f2a]{display:flex;gap:var(--app-item-padding);flex-wrap:wrap;justify-content:end}.app-item--list-view .app-actions .icon-loading-small[data-v-4f1b9f2a]{display:inline-block;top:4px;margin-inline-end:10px}@media only screen and (max-width: 900px){.app-item--list-view .app-version[data-v-4f1b9f2a],.app-item--list-view .app-level[data-v-4f1b9f2a]{display:none}}@media only screen and (max-width: 512px){.app-item--list-view .app-actions[data-v-4f1b9f2a]{display:none}}.app-item--store-view[data-v-4f1b9f2a]{padding:30px}.app-item--store-view .app-image-icon .icon-settings-dark[data-v-4f1b9f2a]{width:100%;height:150px;background-size:45px;opacity:.5}.app-item--store-view .app-image-icon svg[data-v-4f1b9f2a]{position:absolute;bottom:43px;width:64px;height:64px;opacity:.1}.app-item--store-view .app-name[data-v-4f1b9f2a]{margin:5px 0}.app-item--store-view .app-name--link[data-v-4f1b9f2a]::after{content:"";position:absolute;inset-block:0;inset-inline:0}.app-item--store-view .app-actions[data-v-4f1b9f2a]{margin:10px 0}@media only screen and (min-width: 1601px){.app-item--store-view[data-v-4f1b9f2a]{width:25%}.app-item--store-view.app-item--with-sidebar[data-v-4f1b9f2a]{width:33%}}@media only screen and (max-width: 1600px){.app-item--store-view[data-v-4f1b9f2a]{width:25%}.app-item--store-view.app-item--with-sidebar[data-v-4f1b9f2a]{width:33%}}@media only screen and (max-width: 1400px){.app-item--store-view[data-v-4f1b9f2a]{width:33%}.app-item--store-view.app-item--with-sidebar[data-v-4f1b9f2a]{width:50%}}@media only screen and (max-width: 900px){.app-item--store-view[data-v-4f1b9f2a]{width:50%}.app-item--store-view.app-item--with-sidebar[data-v-4f1b9f2a]{width:100%}}@media only screen and (max-width: 1024px){.app-item--store-view[data-v-4f1b9f2a]{width:50%}}@media only screen and (max-width: 480px){.app-item--store-view[data-v-4f1b9f2a]{width:100%}}.app-icon[data-v-4f1b9f2a]{filter:var(--background-invert-if-bright)}.app-image[data-v-4f1b9f2a]{position:relative;height:150px;opacity:1;overflow:hidden}.app-image img[data-v-4f1b9f2a]{width:100%}.app-version[data-v-4f1b9f2a]{color:var(--color-text-maxcontrast)}',"",{version:3,sources:["webpack://./core/css/variables.scss","webpack://./apps/settings/src/components/AppList/AppItem.vue"],names:[],mappings:"AAAA;;;EAAA,CCIA,2BACC,iBAAA,CAEA,iCACC,6CAAA,CAGD,sCACC,0DAAA,CACA,oFAAA,CAEA,yDACC,6CAAA,CAGD,wCACC,qBAAA,CACA,2CAAA,CACA,+BAAA,CACA,6BAAA,CAGD,iDACC,mCAAA,CACA,WAAA,CACA,cAAA,CAGD,oIAEC,cAAA,CACA,UAAA,CACA,WAAA,CACA,UAAA,CACA,qBAAA,CACA,oBAAA,CAGD,gDACC,iCAAA,CAGD,sDACC,6BAAA,CACA,YAAA,CACA,kBAAA,CAMD,6DACC,UAAA,CACA,iBAAA,CACA,cAAA,CACA,6BAAA,CAGD,mDACC,YAAA,CACA,2BAAA,CACA,cAAA,CACA,mBAAA,CAEA,uEACC,oBAAA,CACA,OAAA,CACA,sBAAA,CAKF,0CACC,oGAEC,YAAA,CAAA,CAKF,0CACC,mDACC,YAAA,CAAA,CAKH,uCACC,YAAA,CAEA,2EACC,UAAA,CACA,YAAA,CACA,oBAAA,CACA,UAAA,CAGD,2DACC,iBAAA,CACA,WAAA,CAEA,UAAA,CACA,WAAA,CACA,UAAA,CAGD,iDACC,YAAA,CAGD,8DACC,UAAA,CACA,iBAAA,CACA,aAAA,CACA,cAAA,CAGD,oDACC,aAAA,CAGD,2CAlCD,uCAmCE,SAAA,CAEA,8DACC,SAAA,CAAA,CAIF,2CA1CD,uCA2CE,SAAA,CAEA,8DACC,SAAA,CAAA,CAIF,2CAlDD,uCAmDE,SAAA,CAEA,8DACC,SAAA,CAAA,CAIF,0CA1DD,uCA2DE,SAAA,CAEA,8DACC,UAAA,CAAA,CAIF,2CAlED,uCAmEE,SAAA,CAAA,CAGD,0CAtED,uCAuEE,UAAA,CAAA,CAKH,2BACC,yCAAA,CAGD,4BACC,iBAAA,CACA,YAAA,CACA,SAAA,CACA,eAAA,CAEA,gCACC,UAAA,CAIF,8BACC,mCAAA",sourcesContent:['/*!\n * SPDX-FileCopyrightText: 2018 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n// SCSS darken/lighten function override\n@function nc-darken($color, $value) {\n\t@return darken($color, $value);\n}\n\n@function nc-lighten($color, $value) {\n\t@return lighten($color, $value);\n}\n\n// SCSS variables\n// DEPRECATED, please use CSS4 vars\n$color-main-text: #222 !default; // Not #000 for better readability\n$color-main-background: #fff !default;\n$color-main-background-translucent: rgba($color-main-background, .97) !default;\n\n// used for different active/hover/focus/disabled states\n$color-background-hover: nc-darken($color-main-background, 4%) !default;\n$color-background-dark: nc-darken($color-main-background, 7%) !default;\n$color-background-darker: nc-darken($color-main-background, 14%) !default;\n\n$color-placeholder-light: nc-darken($color-main-background, 10%) !default;\n$color-placeholder-dark: nc-darken($color-main-background, 20%) !default;\n\n$color-primary: #0082c9 !default;\n$color-primary-hover: mix($color-primary, $color-main-background, 80%) !default;\n\n$color-primary-light: mix($color-primary, $color-main-background, 10%) !default;\n$color-primary-light-text: $color-primary !default;\n$color-primary-light-hover: mix($color-primary-light, $color-main-text, 95%) !default;\n\n$color-primary-text: #ffffff !default;\n// do not use nc-darken/lighten in case of overriding because\n// primary-text is independent of color-main-text\n$color-primary-element-text-dark: darken($color-primary-text, 7%) !default;\n$color-primary-element: $color-primary !default;\n$color-primary-element-hover: mix($color-primary-element, $color-main-background, 80%) !default;\n$color-primary-element-light: lighten($color-primary-element, 15%) !default;\n\n$color-error: #e9322d;\n$color-error-hover: mix($color-error, $color-main-background, 80%) !default;\n$color-warning: #eca700;\n$color-warning-hover: mix($color-warning, $color-main-background, 80%) !default;\n$color-success: #46ba61;\n$color-success-hover: mix($color-success, $color-main-background, 80%) !default;\n// used for svg\n$color-white: #fff;\n$color-black: #000;\n$color-yellow: #FC0;\n\n// rgb(118, 118, 118) / #767676\n// min. color contrast for normal text on white background according to WCAG AA\n// (Works as well: color: #000; opacity: 0.57;)\n$color-text-maxcontrast: nc-lighten($color-main-text, 33%) !default;\n$color-text-light: $color-main-text !default;\n$color-text-lighter: $color-text-maxcontrast !default;\n\n$image-logo: url(\'../img/logo/logo.svg?v=1\') !default;\n$image-login-background: url(\'../img/background.png?v=2\') !default;\n$image-logoheader: url(\'../img/logo/logo.svg?v=1\') !default;\n$image-favicon: url(\'../img/logo/logo.svg?v=1\') !default;\n\n$color-loading-light: #ccc !default;\n$color-loading-dark: #444 !default;\n\n$color-box-shadow: transparentize(nc-darken($color-main-background, 70%), 0.5) !default;\n\n// light border like file table or app-content list\n$color-border: nc-darken($color-main-background, 7%) !default;\n// darker border like inputs or very visible elements\n$color-border-dark: nc-darken($color-main-background, 14%) !default;\n\n$border-radius: 3px !default;\n$border-radius-large: 10px !default;\n// Pill-style button, value is large so big buttons also have correct roundness\n$border-radius-pill: 100px !default;\n\n$font-face: system-ui, -apple-system, "Segoe UI", Roboto, Oxygen-Sans, Cantarell, Ubuntu, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji" !default;\n$default-font-size: 15px;\n\n$default-line-height: 24px;\n\n$animation-quick: 100ms;\n$animation-slow: 300ms;\n\n// various structure data\n$header-height: 50px;\n$navigation-width: 300px;\n$sidebar-min-width: 300px;\n$sidebar-max-width: 500px;\n$list-min-width: 200px;\n$list-max-width: 300px;\n$header-menu-item-height: 44px;\n$header-menu-profile-item-height: 66px;\n\n// mobile. Keep in sync with core/js/js.js\n$breakpoint-mobile: 1024px;\n',"\n@use '../../../../../core/css/variables.scss' as variables;\n@use 'sass:math';\n\n.app-item {\n\tposition: relative;\n\n\t&:hover {\n\t\tbackground-color: var(--color-background-dark);\n\t}\n\n\t&--list-view {\n\t\t--app-item-padding: calc(var(--default-grid-baseline) * 2);\n\t\t--app-item-height: calc(var(--default-clickable-area) + var(--app-item-padding) * 2);\n\n\t\t&.app-item--selected {\n\t\t\tbackground-color: var(--color-background-dark);\n\t\t}\n\n\t\t> * {\n\t\t\tvertical-align: middle;\n\t\t\tborder-bottom: 1px solid var(--color-border);\n\t\t\tpadding: var(--app-item-padding);\n\t\t\theight: var(--app-item-height);\n\t\t}\n\n\t\t.app-image {\n\t\t\twidth: var(--default-clickable-area);\n\t\t\theight: auto;\n\t\t\ttext-align: end;\n\t\t}\n\n\t\t.app-image-icon svg,\n\t\t.app-image-icon .icon-settings-dark {\n\t\t\tmargin-top: 5px;\n\t\t\twidth: 20px;\n\t\t\theight: 20px;\n\t\t\topacity: .5;\n\t\t\tbackground-size: cover;\n\t\t\tdisplay: inline-block;\n\t\t}\n\n\t\t.app-name {\n\t\t\tpadding: 0 var(--app-item-padding);\n\t\t}\n\n\t\t.app-name--link {\n\t\t\theight: var(--app-item-height);\n\t\t\tdisplay: flex;\n\t\t\talign-items: center;\n\t\t}\n\n\t\t// Note: because of Safari bug, we cannot position link overlay relative to the table row\n\t\t// So we need to manually position it relative to the table container and cell\n\t\t// See: https://bugs.webkit.org/show_bug.cgi?id=240961\n\t\t.app-name--link::after {\n\t\t\tcontent: '';\n\t\t\tposition: absolute;\n\t\t\tinset-inline: 0;\n\t\t\theight: var(--app-item-height);\n\t\t}\n\n\t\t.app-actions {\n\t\t\tdisplay: flex;\n\t\t\tgap: var(--app-item-padding);\n\t\t\tflex-wrap: wrap;\n\t\t\tjustify-content: end;\n\n\t\t\t.icon-loading-small {\n\t\t\t\tdisplay: inline-block;\n\t\t\t\ttop: 4px;\n\t\t\t\tmargin-inline-end: 10px;\n\t\t\t}\n\t\t}\n\n\t\t/* hide app version and level on narrower screens */\n\t\t@media only screen and (max-width: 900px) {\n\t\t\t.app-version,\n\t\t\t.app-level {\n\t\t\t\tdisplay: none;\n\t\t\t}\n\t\t}\n\n\t\t/* Hide actions on a small screen. Click on app opens fill-screen sidebar with the buttons */\n\t\t@media only screen and (max-width: math.div(variables.$breakpoint-mobile, 2)) {\n\t\t\t.app-actions {\n\t\t\t\tdisplay: none;\n\t\t\t}\n\t\t}\n\t}\n\n\t&--store-view {\n\t\tpadding: 30px;\n\n\t\t.app-image-icon .icon-settings-dark {\n\t\t\twidth: 100%;\n\t\t\theight: 150px;\n\t\t\tbackground-size: 45px;\n\t\t\topacity: 0.5;\n\t\t}\n\n\t\t.app-image-icon svg {\n\t\t\tposition: absolute;\n\t\t\tbottom: 43px;\n\t\t\t/* position halfway vertically */\n\t\t\twidth: 64px;\n\t\t\theight: 64px;\n\t\t\topacity: .1;\n\t\t}\n\n\t\t.app-name {\n\t\t\tmargin: 5px 0;\n\t\t}\n\n\t\t.app-name--link::after {\n\t\t\tcontent: '';\n\t\t\tposition: absolute;\n\t\t\tinset-block: 0;\n\t\t\tinset-inline: 0;\n\t\t}\n\n\t\t.app-actions {\n\t\t\tmargin: 10px 0;\n\t\t}\n\n\t\t@media only screen and (min-width: 1601px) {\n\t\t\twidth: 25%;\n\n\t\t\t&.app-item--with-sidebar {\n\t\t\t\twidth: 33%;\n\t\t\t}\n\t\t}\n\n\t\t@media only screen and (max-width: 1600px) {\n\t\t\twidth: 25%;\n\n\t\t\t&.app-item--with-sidebar {\n\t\t\t\twidth: 33%;\n\t\t\t}\n\t\t}\n\n\t\t@media only screen and (max-width: 1400px) {\n\t\t\twidth: 33%;\n\n\t\t\t&.app-item--with-sidebar {\n\t\t\t\twidth: 50%;\n\t\t\t}\n\t\t}\n\n\t\t@media only screen and (max-width: 900px) {\n\t\t\twidth: 50%;\n\n\t\t\t&.app-item--with-sidebar {\n\t\t\t\twidth: 100%;\n\t\t\t}\n\t\t}\n\n\t\t@media only screen and (max-width: variables.$breakpoint-mobile) {\n\t\t\twidth: 50%;\n\t\t}\n\n\t\t@media only screen and (max-width: 480px) {\n\t\t\twidth: 100%;\n\t\t}\n\t}\n}\n\n.app-icon {\n\tfilter: var(--background-invert-if-bright);\n}\n\n.app-image {\n\tposition: relative;\n\theight: 150px;\n\topacity: 1;\n\toverflow: hidden;\n\n\timg {\n\t\twidth: 100%;\n\t}\n}\n\n.app-version {\n\tcolor: var(--color-text-maxcontrast);\n}\n"],sourceRoot:""}]);const r=o},13331:(t,e,a)=>{a.d(e,{A:()=>r});var n=a(71354),i=a.n(n),s=a(76314),o=a.n(s)()(i());o.push([t.id,".app-level-badge[data-v-5ee601b2]{color:var(--color-text-maxcontrast);background-color:rgba(0,0,0,0);border:1px solid var(--color-text-maxcontrast);border-radius:var(--border-radius);display:flex;flex-direction:row;gap:6px;padding:3px 6px;width:fit-content}.app-level-badge--supported[data-v-5ee601b2]{border-color:var(--color-success);color:var(--color-success)}","",{version:3,sources:["webpack://./apps/settings/src/components/AppList/AppLevelBadge.vue"],names:[],mappings:"AACA,kCACC,mCAAA,CACA,8BAAA,CACA,8CAAA,CACA,kCAAA,CAEA,YAAA,CACA,kBAAA,CACA,OAAA,CACA,eAAA,CACA,iBAAA,CAEA,6CACC,iCAAA,CACA,0BAAA",sourcesContent:["\n.app-level-badge {\n\tcolor: var(--color-text-maxcontrast);\n\tbackground-color: transparent;\n\tborder: 1px solid var(--color-text-maxcontrast);\n\tborder-radius: var(--border-radius);\n\n\tdisplay: flex;\n\tflex-direction: row;\n\tgap: 6px;\n\tpadding: 3px 6px;\n\twidth: fit-content;\n\n\t&--supported {\n\t\tborder-color: var(--color-success);\n\t\tcolor: var(--color-success);\n\t}\n}\n"],sourceRoot:""}]);const r=o},63021:(t,e,a)=>{a.d(e,{A:()=>r});var n=a(71354),i=a.n(n),s=a(76314),o=a.n(s)()(i());o.push([t.id,".app-discover[data-v-bb597eea]{max-width:1008px;margin-inline:auto;padding-inline:54px;padding-block-end:var(--default-clickable-area, 44px);display:flex;flex-direction:column;gap:var(--default-clickable-area, 44px)}","",{version:3,sources:["webpack://./apps/settings/src/components/AppStoreDiscover/AppStoreDiscoverSection.vue"],names:[],mappings:"AACA,+BACC,gBAAA,CACA,kBAAA,CACA,mBAAA,CAEA,qDAAA,CAEA,YAAA,CACA,qBAAA,CACA,uCAAA",sourcesContent:["\n.app-discover {\n\tmax-width: 1008px; /* 900px + 2x 54px padding for the carousel controls */\n\tmargin-inline: auto;\n\tpadding-inline: 54px;\n\t/* Padding required to make last element not bound to the bottom */\n\tpadding-block-end: var(--default-clickable-area, 44px);\n\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: var(--default-clickable-area, 44px);\n}\n"],sourceRoot:""}]);const r=o},3007:(t,e,a)=>{a.d(e,{A:()=>r});var n=a(71354),i=a.n(n),s=a(76314),o=a.n(s)()(i());o.push([t.id,".app-description[data-v-cf0a1ae6]{padding:12px}","",{version:3,sources:["webpack://./apps/settings/src/components/AppStoreSidebar/AppDescriptionTab.vue"],names:[],mappings:"AACA,kCACC,YAAA",sourcesContent:["\n.app-description {\n\tpadding: 12px;\n}\n"],sourceRoot:""}]);const r=o},62940:(t,e,a)=>{a.d(e,{A:()=>r});var n=a(71354),i=a.n(n),s=a(76314),o=a.n(s)()(i());o.push([t.id,'.app-details[data-v-533705fa]{padding:20px}.app-details__actions-manage[data-v-533705fa]{display:flex}.app-details__actions-manage input[data-v-533705fa]{flex:0 1 auto;min-width:0;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.app-details__authors[data-v-533705fa]{color:var(--color-text-maxcontrast)}.app-details__section[data-v-533705fa]{margin-top:15px}.app-details__section h4[data-v-533705fa]{font-size:16px;font-weight:bold;margin-block-end:5px}.app-details__interact[data-v-533705fa]{display:flex;flex-direction:row;flex-wrap:wrap;gap:12px}.app-details__documentation a[data-v-533705fa]{text-decoration:underline}.app-details__documentation li[data-v-533705fa]{padding-inline-start:20px}.app-details__documentation li[data-v-533705fa]::before{width:5px;height:5px;border-radius:100%;background-color:var(--color-main-text);content:"";float:inline-start;margin-inline-start:-13px;position:relative;top:10px}.force[data-v-533705fa]{color:var(--color-error);border-color:var(--color-error);background:var(--color-main-background)}.force[data-v-533705fa]:hover,.force[data-v-533705fa]:active{color:var(--color-main-background);border-color:var(--color-error) !important;background:var(--color-error)}.missing-dependencies[data-v-533705fa]{list-style:initial;list-style-type:initial;list-style-position:inside}',"",{version:3,sources:["webpack://./apps/settings/src/components/AppStoreSidebar/AppDetailsTab.vue"],names:[],mappings:"AACA,8BACC,YAAA,CAIC,8CAEC,YAAA,CACA,oDACC,aAAA,CACA,WAAA,CACA,sBAAA,CACA,kBAAA,CACA,eAAA,CAIH,uCACC,mCAAA,CAGD,uCACC,eAAA,CAEA,0CACC,cAAA,CACA,gBAAA,CACA,oBAAA,CAIF,wCACC,YAAA,CACA,kBAAA,CACA,cAAA,CACA,QAAA,CAIA,+CACC,yBAAA,CAED,gDACC,yBAAA,CAEA,wDACC,SAAA,CACA,UAAA,CACA,kBAAA,CACA,uCAAA,CACA,UAAA,CACA,kBAAA,CACA,yBAAA,CACA,iBAAA,CACA,QAAA,CAMJ,wBACC,wBAAA,CACA,+BAAA,CACA,uCAAA,CAED,6DAEC,kCAAA,CACA,0CAAA,CACA,6BAAA,CAGD,uCACC,kBAAA,CACA,uBAAA,CACA,0BAAA",sourcesContent:['\n.app-details {\n\tpadding: 20px;\n\n\t&__actions {\n\t\t// app management\n\t\t&-manage {\n\t\t\t// if too many, shrink them and ellipsis\n\t\t\tdisplay: flex;\n\t\t\tinput {\n\t\t\t\tflex: 0 1 auto;\n\t\t\t\tmin-width: 0;\n\t\t\t\ttext-overflow: ellipsis;\n\t\t\t\twhite-space: nowrap;\n\t\t\t\toverflow: hidden;\n\t\t\t}\n\t\t}\n\t}\n\t&__authors {\n\t\tcolor: var(--color-text-maxcontrast);\n\t}\n\n\t&__section {\n\t\tmargin-top: 15px;\n\n\t\th4 {\n\t\t\tfont-size: 16px;\n\t\t\tfont-weight: bold;\n\t\t\tmargin-block-end: 5px;\n\t\t}\n\t}\n\n\t&__interact {\n\t\tdisplay: flex;\n\t\tflex-direction: row;\n\t\tflex-wrap: wrap;\n\t\tgap: 12px;\n\t}\n\n\t&__documentation {\n\t\ta {\n\t\t\ttext-decoration: underline;\n\t\t}\n\t\tli {\n\t\t\tpadding-inline-start: 20px;\n\n\t\t\t&::before {\n\t\t\t\twidth: 5px;\n\t\t\t\theight: 5px;\n\t\t\t\tborder-radius: 100%;\n\t\t\t\tbackground-color: var(--color-main-text);\n\t\t\t\tcontent: "";\n\t\t\t\tfloat: inline-start;\n\t\t\t\tmargin-inline-start: -13px;\n\t\t\t\tposition: relative;\n\t\t\t\ttop: 10px;\n\t\t\t}\n\t\t}\n\t}\n}\n\n.force {\n\tcolor: var(--color-error);\n\tborder-color: var(--color-error);\n\tbackground: var(--color-main-background);\n}\n.force:hover,\n.force:active {\n\tcolor: var(--color-main-background);\n\tborder-color: var(--color-error) !important;\n\tbackground: var(--color-error);\n}\n\n.missing-dependencies {\n\tlist-style: initial;\n\tlist-style-type: initial;\n\tlist-style-position: inside;\n}\n'],sourceRoot:""}]);const r=o},37925:(t,e,a)=>{a.d(e,{A:()=>r});var n=a(71354),i=a.n(n),s=a(76314),o=a.n(s)()(i());o.push([t.id,".app-sidebar-tabs__release h2[data-v-9c32407e]{border-bottom:1px solid var(--color-border);font-size:24px}.app-sidebar-tabs__release-text[data-v-9c32407e] h3{font-size:20px}.app-sidebar-tabs__release-text[data-v-9c32407e] h4{font-size:17px}","",{version:3,sources:["webpack://./apps/settings/src/components/AppStoreSidebar/AppReleasesTab.vue"],names:[],mappings:"AAEC,+CACC,2CAAA,CACA,cAAA,CAKA,oDACC,cAAA,CAED,oDACC,cAAA",sourcesContent:["\n.app-sidebar-tabs__release {\n\th2 {\n\t\tborder-bottom: 1px solid var(--color-border);\n\t\tfont-size: 24px;\n\t}\n\n\t&-text {\n\t\t// Overwrite changelog heading styles\n\t\t:deep(h3) {\n\t\t\tfont-size: 20px;\n\t\t}\n\t\t:deep(h4) {\n\t\t\tfont-size: 17px;\n\t\t}\n\t}\n}\n"],sourceRoot:""}]);const r=o},95421:(t,e,a)=>{a.d(e,{A:()=>r});var n=a(71354),i=a.n(n),s=a(76314),o=a.n(s)()(i());o.push([t.id,".settings-markdown[data-v-5d3cebad] h1,.settings-markdown[data-v-5d3cebad] h2,.settings-markdown[data-v-5d3cebad] h3,.settings-markdown[data-v-5d3cebad] h4,.settings-markdown[data-v-5d3cebad] h5,.settings-markdown[data-v-5d3cebad] h6{font-weight:600;line-height:120%;margin-top:24px;margin-bottom:12px;color:var(--color-main-text)}.settings-markdown[data-v-5d3cebad] h1{font-size:36px;margin-top:48px}.settings-markdown[data-v-5d3cebad] h2{font-size:28px;margin-top:48px}.settings-markdown[data-v-5d3cebad] h3{font-size:24px}.settings-markdown[data-v-5d3cebad] h4{font-size:21px}.settings-markdown[data-v-5d3cebad] h5{font-size:17px}.settings-markdown[data-v-5d3cebad] h6{font-size:var(--default-font-size)}.settings-markdown[data-v-5d3cebad] pre{white-space:pre;overflow-x:auto;background-color:var(--color-background-dark);border-radius:var(--border-radius);padding:1em 1.3em;margin-bottom:1em}.settings-markdown[data-v-5d3cebad] p code{background-color:var(--color-background-dark);border-radius:var(--border-radius);padding:.1em .3em}.settings-markdown[data-v-5d3cebad] li{position:relative}.settings-markdown[data-v-5d3cebad] ul,.settings-markdown[data-v-5d3cebad] ol{padding-inline-start:10px;margin-inline-start:10px}.settings-markdown[data-v-5d3cebad] ul li{list-style-type:disc}.settings-markdown[data-v-5d3cebad] ul>li>ul>li{list-style-type:circle}.settings-markdown[data-v-5d3cebad] ul>li>ul>li ul li{list-style-type:square}.settings-markdown[data-v-5d3cebad] blockquote{padding-inline-start:1em;border-inline-start:4px solid var(--color-primary-element);color:var(--color-text-maxcontrast);margin-inline:0}","",{version:3,sources:["webpack://./apps/settings/src/components/Markdown.vue"],names:[],mappings:"AAGA,0OAMC,eAAA,CACA,gBAAA,CACA,eAAA,CACA,kBAAA,CACA,4BAAA,CAGD,uCACC,cAAA,CACA,eAAA,CAGD,uCACC,cAAA,CACA,eAAA,CAGD,uCACC,cAAA,CAGD,uCACC,cAAA,CAGD,uCACC,cAAA,CAGD,uCACC,kCAAA,CAGD,wCACC,eAAA,CACA,eAAA,CACA,6CAAA,CACA,kCAAA,CACA,iBAAA,CACA,iBAAA,CAGD,2CACC,6CAAA,CACA,kCAAA,CACA,iBAAA,CAGD,uCACC,iBAAA,CAGD,8EACC,yBAAA,CACA,wBAAA,CAGD,0CACC,oBAAA,CAGD,gDACC,sBAAA,CAGD,sDACC,sBAAA,CAGD,+CACC,wBAAA,CACA,0DAAA,CACA,mCAAA,CACA,eAAA",sourcesContent:["\n.settings-markdown::v-deep {\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6 {\n\tfont-weight: 600;\n\tline-height: 120%;\n\tmargin-top: 24px;\n\tmargin-bottom: 12px;\n\tcolor: var(--color-main-text);\n}\n\nh1 {\n\tfont-size: 36px;\n\tmargin-top: 48px;\n}\n\nh2 {\n\tfont-size: 28px;\n\tmargin-top: 48px;\n}\n\nh3 {\n\tfont-size: 24px;\n}\n\nh4 {\n\tfont-size: 21px;\n}\n\nh5 {\n\tfont-size: 17px;\n}\n\nh6 {\n\tfont-size: var(--default-font-size);\n}\n\npre {\n\twhite-space: pre;\n\toverflow-x: auto;\n\tbackground-color: var(--color-background-dark);\n\tborder-radius: var(--border-radius);\n\tpadding: 1em 1.3em;\n\tmargin-bottom: 1em;\n}\n\np code {\n\tbackground-color: var(--color-background-dark);\n\tborder-radius: var(--border-radius);\n\tpadding: .1em .3em;\n}\n\nli {\n\tposition: relative;\n}\n\nul, ol {\n\tpadding-inline-start: 10px;\n\tmargin-inline-start: 10px;\n}\n\nul li {\n\tlist-style-type: disc;\n}\n\nul > li > ul > li {\n\tlist-style-type: circle;\n}\n\nul > li > ul > li ul li {\n\tlist-style-type: square;\n}\n\nblockquote {\n\tpadding-inline-start: 1em;\n\tborder-inline-start: 4px solid var(--color-primary-element);\n\tcolor: var(--color-text-maxcontrast);\n\tmargin-inline: 0;\n}\n\n}\n"],sourceRoot:""}]);const r=o},17525:(t,e,a)=>{a.d(e,{A:()=>r});var n=a(71354),i=a.n(n),s=a(76314),o=a.n(s)()(i());o.push([t.id,".app-sidebar--with-screenshot[data-v-2f300fa2] .app-sidebar-header__figure{background-size:cover}.app-sidebar__fallback-icon[data-v-2f300fa2]{width:100%;height:100%}.app-sidebar__badges[data-v-2f300fa2]{display:flex;flex-direction:row;gap:12px}.app-sidebar__version[data-v-2f300fa2]{color:var(--color-text-maxcontrast)}","",{version:3,sources:["webpack://./apps/settings/src/views/AppStoreSidebar.vue"],names:[],mappings:"AAIE,2EACC,qBAAA,CAIF,6CAEC,UAAA,CACA,WAAA,CAGD,sCACC,YAAA,CACA,kBAAA,CACA,QAAA,CAGD,uCACC,mCAAA",sourcesContent:["\n.app-sidebar {\n\t// If a screenshot is available it should cover the whole figure\n\t&--with-screenshot {\n\t\t:deep(.app-sidebar-header__figure) {\n\t\t\tbackground-size: cover;\n\t\t}\n\t}\n\n\t&__fallback-icon {\n\t\t// both 100% to center the icon\n\t\twidth: 100%;\n\t\theight: 100%;\n\t}\n\n\t&__badges {\n\t\tdisplay: flex;\n\t\tflex-direction: row;\n\t\tgap: 12px;\n\t}\n\n\t&__version {\n\t\tcolor: var(--color-text-maxcontrast);\n\t}\n}\n"],sourceRoot:""}]);const r=o},96285:(t,e,a)=>{a.d(e,{A:()=>r});var n=a(71354),i=a.n(n),s=a(76314),o=a.n(s)()(i());o.push([t.id,"\n.app-score__wrapper[data-v-2193f4e0] {\n\tdisplay: inline-flex;\n\tcolor: var(--color-favorite, #a08b00);\n> *[data-v-2193f4e0] {\n\t\tvertical-align: text-bottom;\n}\n}\n","",{version:3,sources:["webpack://./apps/settings/src/components/AppList/AppScore.vue"],names:[],mappings:";AA+DA;CACA,oBAAA;CACA,qCAAA;AAEA;EACA,2BAAA;AACA;AACA",sourcesContent:['\x3c!--\n - SPDX-FileCopyrightText: 2018 Nextcloud GmbH and Nextcloud contributors\n - SPDX-License-Identifier: AGPL-3.0-or-later\n--\x3e\n\n<template>\n\t<span role="img"\n\t\t:aria-label="title"\n\t\t:title="title"\n\t\tclass="app-score__wrapper">\n\t\t<NcIconSvgWrapper v-for="index in fullStars"\n\t\t\t:key="`full-star-${index}`"\n\t\t\t:path="mdiStar"\n\t\t\tinline />\n\t\t<NcIconSvgWrapper v-if="hasHalfStar" :path="mdiStarHalfFull" inline />\n\t\t<NcIconSvgWrapper v-for="index in emptyStars"\n\t\t\t:key="`empty-star-${index}`"\n\t\t\t:path="mdiStarOutline"\n\t\t\tinline />\n\t</span>\n</template>\n<script lang="ts">\nimport NcIconSvgWrapper from \'@nextcloud/vue/dist/Components/NcIconSvgWrapper.js\'\nimport { mdiStar, mdiStarHalfFull, mdiStarOutline } from \'@mdi/js\'\nimport { translate as t } from \'@nextcloud/l10n\'\nimport { defineComponent } from \'vue\'\n\nexport default defineComponent({\n\tname: \'AppScore\',\n\tcomponents: {\n\t\tNcIconSvgWrapper,\n\t},\n\tprops: {\n\t\tscore: {\n\t\t\ttype: Number,\n\t\t\trequired: true,\n\t\t},\n\t},\n\tsetup() {\n\t\treturn {\n\t\t\tmdiStar,\n\t\t\tmdiStarHalfFull,\n\t\t\tmdiStarOutline,\n\t\t}\n\t},\n\tcomputed: {\n\t\ttitle() {\n\t\t\tconst appScore = (this.score * 5).toFixed(1)\n\t\t\treturn t(\'settings\', \'Community rating: {score}/5\', { score: appScore })\n\t\t},\n\t\tfullStars() {\n\t\t\treturn Math.floor(this.score * 5 + 0.25)\n\t\t},\n\t\temptyStars() {\n\t\t\treturn Math.min(Math.floor((1 - this.score) * 5 + 0.25), 5 - this.fullStars)\n\t\t},\n\t\thasHalfStar() {\n\t\t\treturn (this.fullStars + this.emptyStars) < 5\n\t\t},\n\t},\n})\n<\/script>\n<style scoped>\n.app-score__wrapper {\n\tdisplay: inline-flex;\n\tcolor: var(--color-favorite, #a08b00);\n\n\t> * {\n\t\tvertical-align: text-bottom;\n\t}\n}\n</style>\n'],sourceRoot:""}]);const r=o},43484:(t,e,a)=>{a.d(e,{A:()=>r});var n=a(71354),i=a.n(n),s=a(76314),o=a.n(s)()(i());o.push([t.id,"\n.empty-content__loading[data-v-f9073bbe] {\n\theight: 100%;\n}\n.app-settings-content__label[data-v-f9073bbe] {\n\tmargin-block-start: var(--app-navigation-padding);\n\tmargin-inline-start: calc(var(--default-clickable-area) + var(--app-navigation-padding) * 2);\n\tmin-height: var(--default-clickable-area);\n\tline-height: var(--default-clickable-area);\n\tvertical-align: center;\n}\n","",{version:3,sources:["webpack://./apps/settings/src/views/AppStore.vue"],names:[],mappings:";AAkEA;CACA,YAAA;AACA;AAEA;CACA,iDAAA;CACA,4FAAA;CACA,yCAAA;CACA,0CAAA;CACA,sBAAA;AACA",sourcesContent:["\x3c!--\n - SPDX-FileCopyrightText: 2018 Nextcloud GmbH and Nextcloud contributors\n - SPDX-License-Identifier: AGPL-3.0-or-later\n--\x3e\n\n<template>\n\t\x3c!-- Apps list --\x3e\n\t<NcAppContent class=\"app-settings-content\"\n\t\t:page-heading=\"appStoreLabel\">\n\t\t<h2 class=\"app-settings-content__label\" v-text=\"viewLabel\" />\n\n\t\t<AppStoreDiscoverSection v-if=\"currentCategory === 'discover'\" />\n\t\t<NcEmptyContent v-else-if=\"isLoading\"\n\t\t\tclass=\"empty-content__loading\"\n\t\t\t:name=\"t('settings', 'Loading app list')\">\n\t\t\t<template #icon>\n\t\t\t\t<NcLoadingIcon :size=\"64\" />\n\t\t\t</template>\n\t\t</NcEmptyContent>\n\t\t<AppList v-else :category=\"currentCategory\" />\n\t</NcAppContent>\n</template>\n\n<script setup lang=\"ts\">\nimport { translate as t } from '@nextcloud/l10n'\nimport { computed, getCurrentInstance, onBeforeMount, watchEffect } from 'vue'\nimport { useRoute } from 'vue-router/composables'\n\nimport { useAppsStore } from '../store/apps-store'\nimport { APPS_SECTION_ENUM } from '../constants/AppsConstants'\n\nimport NcAppContent from '@nextcloud/vue/dist/Components/NcAppContent.js'\nimport NcEmptyContent from '@nextcloud/vue/dist/Components/NcEmptyContent.js'\nimport NcLoadingIcon from '@nextcloud/vue/dist/Components/NcLoadingIcon.js'\nimport AppList from '../components/AppList.vue'\nimport AppStoreDiscoverSection from '../components/AppStoreDiscover/AppStoreDiscoverSection.vue'\n\nconst route = useRoute()\nconst store = useAppsStore()\n\n/**\n * ID of the current active category, default is `discover`\n */\nconst currentCategory = computed(() => route.params?.category ?? 'discover')\n\nconst appStoreLabel = t('settings', 'App Store')\nconst viewLabel = computed(() => APPS_SECTION_ENUM[currentCategory.value] ?? store.getCategoryById(currentCategory.value)?.displayName ?? appStoreLabel)\n\nwatchEffect(() => {\n\twindow.document.title = `${viewLabel.value} - ${appStoreLabel} - Nextcloud`\n})\n\n// TODO this part should be migrated to pinia\nconst instance = getCurrentInstance()\n/** Is the app list loading */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst isLoading = computed(() => (instance?.proxy as any).$store.getters.loading('list'))\nonBeforeMount(() => {\n\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\t(instance?.proxy as any).$store.dispatch('getCategories', { shouldRefetchCategories: true });\n\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\t(instance?.proxy as any).$store.dispatch('getAllApps')\n})\n<\/script>\n\n<style scoped>\n.empty-content__loading {\n\theight: 100%;\n}\n\n.app-settings-content__label {\n\tmargin-block-start: var(--app-navigation-padding);\n\tmargin-inline-start: calc(var(--default-clickable-area) + var(--app-navigation-padding) * 2);\n\tmin-height: var(--default-clickable-area);\n\tline-height: var(--default-clickable-area);\n\tvertical-align: center;\n}\n</style>\n"],sourceRoot:""}]);const r=o},44315:(t,e,a)=>{a.d(e,{A:()=>r});var n=a(71354),i=a.n(n),s=a(76314),o=a.n(s)()(i());o.push([t.id,"\n/* The categories-loading indicator */\n.categories--loading[data-v-1e611b27] {\n\tflex: 1;\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n}\n","",{version:3,sources:["webpack://./apps/settings/src/views/AppStoreNavigation.vue"],names:[],mappings:";AA0IA,qCAAA;AACA;CACA,OAAA;CACA,aAAA;CACA,mBAAA;CACA,uBAAA;AACA",sourcesContent:['\x3c!--\n - SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors\n - SPDX-License-Identifier: AGPL-3.0-or-later\n--\x3e\n<template>\n\t\x3c!-- Categories & filters --\x3e\n\t<NcAppNavigation :aria-label="t(\'settings\', \'Apps\')">\n\t\t<template #list>\n\t\t\t<NcAppNavigationItem id="app-category-discover"\n\t\t\t\t:to="{ name: \'apps-category\', params: { category: \'discover\'} }"\n\t\t\t\t:name="APPS_SECTION_ENUM.discover">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<NcIconSvgWrapper :path="APPSTORE_CATEGORY_ICONS.discover" />\n\t\t\t\t</template>\n\t\t\t</NcAppNavigationItem>\n\t\t\t<NcAppNavigationItem id="app-category-installed"\n\t\t\t\t:to="{ name: \'apps-category\', params: { category: \'installed\'} }"\n\t\t\t\t:name="APPS_SECTION_ENUM.installed">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<NcIconSvgWrapper :path="APPSTORE_CATEGORY_ICONS.installed" />\n\t\t\t\t</template>\n\t\t\t</NcAppNavigationItem>\n\t\t\t<NcAppNavigationItem id="app-category-enabled"\n\t\t\t\t:to="{ name: \'apps-category\', params: { category: \'enabled\' } }"\n\t\t\t\t:name="APPS_SECTION_ENUM.enabled">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<NcIconSvgWrapper :path="APPSTORE_CATEGORY_ICONS.enabled" />\n\t\t\t\t</template>\n\t\t\t</NcAppNavigationItem>\n\t\t\t<NcAppNavigationItem id="app-category-disabled"\n\t\t\t\t:to="{ name: \'apps-category\', params: { category: \'disabled\' } }"\n\t\t\t\t:name="APPS_SECTION_ENUM.disabled">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<NcIconSvgWrapper :path="APPSTORE_CATEGORY_ICONS.disabled" />\n\t\t\t\t</template>\n\t\t\t</NcAppNavigationItem>\n\t\t\t<NcAppNavigationItem v-if="updateCount > 0"\n\t\t\t\tid="app-category-updates"\n\t\t\t\t:to="{ name: \'apps-category\', params: { category: \'updates\' } }"\n\t\t\t\t:name="APPS_SECTION_ENUM.updates">\n\t\t\t\t<template #counter>\n\t\t\t\t\t<NcCounterBubble>{{ updateCount }}</NcCounterBubble>\n\t\t\t\t</template>\n\t\t\t\t<template #icon>\n\t\t\t\t\t<NcIconSvgWrapper :path="APPSTORE_CATEGORY_ICONS.updates" />\n\t\t\t\t</template>\n\t\t\t</NcAppNavigationItem>\n\t\t\t<NcAppNavigationItem id="app-category-your-bundles"\n\t\t\t\t:to="{ name: \'apps-category\', params: { category: \'app-bundles\' } }"\n\t\t\t\t:name="APPS_SECTION_ENUM[\'app-bundles\']">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<NcIconSvgWrapper :path="APPSTORE_CATEGORY_ICONS.bundles" />\n\t\t\t\t</template>\n\t\t\t</NcAppNavigationItem>\n\n\t\t\t<NcAppNavigationSpacer />\n\n\t\t\t\x3c!-- App store categories --\x3e\n\t\t\t<li v-if="appstoreEnabled && categoriesLoading" class="categories--loading">\n\t\t\t\t<NcLoadingIcon :size="20" :aria-label="t(\'settings\', \'Loading categories\')" />\n\t\t\t</li>\n\t\t\t<template v-else-if="appstoreEnabled && !categoriesLoading">\n\t\t\t\t<NcAppNavigationItem v-if="isSubscribed"\n\t\t\t\t\tid="app-category-supported"\n\t\t\t\t\t:to="{ name: \'apps-category\', params: { category: \'supported\' } }"\n\t\t\t\t\t:name="APPS_SECTION_ENUM.supported">\n\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t<NcIconSvgWrapper :path="APPSTORE_CATEGORY_ICONS.supported" />\n\t\t\t\t\t</template>\n\t\t\t\t</NcAppNavigationItem>\n\t\t\t\t<NcAppNavigationItem id="app-category-featured"\n\t\t\t\t\t:to="{ name: \'apps-category\', params: { category: \'featured\' } }"\n\t\t\t\t\t:name="APPS_SECTION_ENUM.featured">\n\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t<NcIconSvgWrapper :path="APPSTORE_CATEGORY_ICONS.featured" />\n\t\t\t\t\t</template>\n\t\t\t\t</NcAppNavigationItem>\n\n\t\t\t\t<NcAppNavigationItem v-for="category in categories"\n\t\t\t\t\t:id="`app-category-${category.id}`"\n\t\t\t\t\t:key="category.id"\n\t\t\t\t\t:name="category.displayName"\n\t\t\t\t\t:to="{\n\t\t\t\t\t\tname: \'apps-category\',\n\t\t\t\t\t\tparams: { category: category.id },\n\t\t\t\t\t}">\n\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t<NcIconSvgWrapper :path="category.icon" />\n\t\t\t\t\t</template>\n\t\t\t\t</NcAppNavigationItem>\n\t\t\t</template>\n\n\t\t\t<NcAppNavigationItem id="app-developer-docs"\n\t\t\t\t:name="t(\'settings\', \'Developer documentation ↗\')"\n\t\t\t\t:href="developerDocsUrl" />\n\t\t</template>\n\t</NcAppNavigation>\n</template>\n\n<script setup lang="ts">\nimport { loadState } from \'@nextcloud/initial-state\'\nimport { translate as t } from \'@nextcloud/l10n\'\nimport { computed, onBeforeMount } from \'vue\'\nimport { APPS_SECTION_ENUM } from \'../constants/AppsConstants\'\nimport { useAppsStore } from \'../store/apps-store\'\n\nimport NcAppNavigation from \'@nextcloud/vue/dist/Components/NcAppNavigation.js\'\nimport NcAppNavigationItem from \'@nextcloud/vue/dist/Components/NcAppNavigationItem.js\'\nimport NcAppNavigationSpacer from \'@nextcloud/vue/dist/Components/NcAppNavigationSpacer.js\'\nimport NcCounterBubble from \'@nextcloud/vue/dist/Components/NcCounterBubble.js\'\nimport NcIconSvgWrapper from \'@nextcloud/vue/dist/Components/NcIconSvgWrapper.js\'\nimport NcLoadingIcon from \'@nextcloud/vue/dist/Components/NcLoadingIcon.js\'\n\nimport APPSTORE_CATEGORY_ICONS from \'../constants/AppstoreCategoryIcons.ts\'\n\nconst updateCount = loadState<number>(\'settings\', \'appstoreUpdateCount\', 0)\nconst appstoreEnabled = loadState<boolean>(\'settings\', \'appstoreEnabled\', true)\nconst developerDocsUrl = loadState<string>(\'settings\', \'appstoreDeveloperDocs\', \'\')\n\nconst store = useAppsStore()\nconst categories = computed(() => store.categories)\nconst categoriesLoading = computed(() => store.loading.categories)\n\n/**\n * Check if the current instance has a support subscription from the Nextcloud GmbH\n *\n * For customers of the Nextcloud GmbH the app level will be set to `300` for apps that are supported in their subscription\n */\nconst isSubscribed = computed(() => store.apps.find(({ level }) => level === 300) !== undefined)\n\n// load categories when component is mounted\nonBeforeMount(() => {\n\tstore.loadCategories()\n\tstore.loadApps()\n})\n<\/script>\n\n<style scoped>\n/* The categories-loading indicator */\n.categories--loading {\n\tflex: 1;\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n}\n</style>\n'],sourceRoot:""}]);const r=o},82692:(t,e,a)=>{a.d(e,{A:()=>S});var n=a(18881),i=a(11516),s=a(45834);const o={name:"SvgFilterMixin",data:()=>({filterId:""}),computed:{filterUrl(){return`url(#${this.filterId})`}},mounted(){this.filterId="invertIconApps-"+Math.random().toString(36).substring(2)}};var r=a(14486);const p=(0,r.A)(o,void 0,void 0,!1,null,null,null).exports;var l=a(18740);const c={name:"AppItem",components:{AppLevelBadge:i.A,AppScore:n.A,NcButton:l.A},mixins:[s.A,p],props:{app:{type:Object,required:!0},category:{type:String,required:!0},listView:{type:Boolean,default:!0},useBundleView:{type:Boolean,default:!1},headers:{type:String,default:null},inline:{type:Boolean,default:!1}},data:()=>({isSelected:!1,scrolled:!1,screenshotLoaded:!1}),computed:{hasRating(){return this.app.appstoreData&&this.app.appstoreData.ratingNumOverall>5},dataItemTag(){return this.listView?"td":"div"},withSidebar(){return!!this.$route.params.id}},watch:{"$route.params.id"(t){this.isSelected=this.app.id===t}},mounted(){if(this.isSelected=this.app.id===this.$route.params.id,this.app.releases&&this.app.screenshot){const t=new Image;t.onload=()=>{this.screenshotLoaded=!0},t.src=this.app.screenshot}},watchers:{},methods:{prefix:(t,e)=>t+"_"+e,getDataItemHeaders(t){return this.useBundleView?[this.headers,t].join(" "):null}}};var d=a(85072),A=a.n(d),u=a(97825),g=a.n(u),m=a(77659),v=a.n(m),h=a(55056),C=a.n(h),f=a(10540),b=a.n(f),_=a(41113),y=a.n(_),x=a(89668),w={};w.styleTagTransform=y(),w.setAttributes=C(),w.insert=v().bind(null,"head"),w.domAPI=g(),w.insertStyleElement=b(),A()(x.A,w),x.A&&x.A.locals&&x.A.locals;const S=(0,r.A)(c,(function(){var t=this,e=t._self._c;return e(t.listView?"tr":t.inline?"article":"li",{tag:"component",staticClass:"app-item",class:{"app-item--list-view":t.listView,"app-item--store-view":!t.listView,"app-item--selected":t.isSelected,"app-item--with-sidebar":t.withSidebar}},[e(t.dataItemTag,{tag:"component",staticClass:"app-image app-image-icon",attrs:{headers:t.getDataItemHeaders("app-table-col-icon")}},[t.listView&&!t.app.preview||!t.listView&&!t.screenshotLoaded?e("div",{staticClass:"icon-settings-dark"}):t.listView&&t.app.preview?e("svg",{attrs:{width:"32",height:"32",viewBox:"0 0 32 32"}},[e("image",{staticClass:"app-icon",attrs:{x:"0",y:"0",width:"32",height:"32",preserveAspectRatio:"xMinYMin meet","xlink:href":t.app.preview}})]):t._e(),t._v(" "),!t.listView&&t.app.screenshot&&t.screenshotLoaded?e("img",{attrs:{src:t.app.screenshot,alt:""}}):t._e()]),t._v(" "),e(t.dataItemTag,{tag:"component",staticClass:"app-name",attrs:{headers:t.getDataItemHeaders("app-table-col-name")}},[e("router-link",{staticClass:"app-name--link",attrs:{to:{name:"apps-details",params:{category:t.category,id:t.app.id}},"aria-label":t.t("settings","Show details for {appName} app",{appName:t.app.name})}},[t._v("\n\t\t\t"+t._s(t.app.name)+"\n\t\t")])],1),t._v(" "),t.listView?t._e():e(t.dataItemTag,{tag:"component",staticClass:"app-summary",attrs:{headers:t.getDataItemHeaders("app-version")}},[t._v("\n\t\t"+t._s(t.app.summary)+"\n\t")]),t._v(" "),t.listView?e(t.dataItemTag,{tag:"component",staticClass:"app-version",attrs:{headers:t.getDataItemHeaders("app-table-col-version")}},[t.app.version?e("span",[t._v(t._s(t.app.version))]):t.app.appstoreData.releases[0].version?e("span",[t._v(t._s(t.app.appstoreData.releases[0].version))]):t._e()]):t._e(),t._v(" "),e(t.dataItemTag,{tag:"component",staticClass:"app-level",attrs:{headers:t.getDataItemHeaders("app-table-col-level")}},[e("AppLevelBadge",{attrs:{level:t.app.level}}),t._v(" "),t.hasRating&&!t.listView?e("AppScore",{attrs:{score:t.app.score}}):t._e()],1),t._v(" "),t.inline?t._e():e(t.dataItemTag,{tag:"component",staticClass:"app-actions",attrs:{headers:t.getDataItemHeaders("app-table-col-actions")}},[t.app.error?e("div",{staticClass:"warning"},[t._v("\n\t\t\t"+t._s(t.app.error)+"\n\t\t")]):t._e(),t._v(" "),t.isLoading?e("div",{staticClass:"icon icon-loading-small"}):t._e(),t._v(" "),t.app.update?e("NcButton",{attrs:{type:"primary",disabled:t.installing||t.isLoading},on:{click:function(e){return e.stopPropagation(),t.update(t.app.id)}}},[t._v("\n\t\t\t"+t._s(t.t("settings","Update to {update}",{update:t.app.update}))+"\n\t\t")]):t._e(),t._v(" "),t.app.canUnInstall?e("NcButton",{staticClass:"uninstall",attrs:{type:"tertiary",disabled:t.installing||t.isLoading},on:{click:function(e){return e.stopPropagation(),t.remove(t.app.id)}}},[t._v("\n\t\t\t"+t._s(t.t("settings","Remove"))+"\n\t\t")]):t._e(),t._v(" "),t.app.active?e("NcButton",{attrs:{disabled:t.installing||t.isLoading},on:{click:function(e){return e.stopPropagation(),t.disable(t.app.id)}}},[t._v("\n\t\t\t"+t._s(t.t("settings","Disable"))+"\n\t\t")]):t._e(),t._v(" "),t.app.active||!t.app.canInstall&&!t.app.isCompatible?t.app.active?t._e():e("NcButton",{attrs:{title:t.forceEnableButtonTooltip,"aria-label":t.forceEnableButtonTooltip,type:"secondary",disabled:t.installing||t.isLoading},on:{click:function(e){return e.stopPropagation(),t.forceEnable(t.app.id)}}},[t._v("\n\t\t\t"+t._s(t.forceEnableButtonText)+"\n\t\t")]):e("NcButton",{attrs:{title:t.enableButtonTooltip,"aria-label":t.enableButtonTooltip,type:"primary",disabled:!t.app.canInstall||t.installing||t.isLoading},on:{click:function(e){return e.stopPropagation(),t.enable(t.app.id)}}},[t._v("\n\t\t\t"+t._s(t.enableButtonText)+"\n\t\t")])],1)],1)}),[],!1,null,"4f1b9f2a",null).exports},11516:(t,e,a)=>{a.d(e,{A:()=>y});var n=a(85471),i=a(6695),s=a(9165),o=a(53334);const r=(0,n.pM)({__name:"AppLevelBadge",props:{level:null},setup(t){const e=t,a=(0,n.EW)((()=>300===e.level)),r=(0,n.EW)((()=>200===e.level)),p=(0,n.EW)((()=>a.value?s.Yk:s.Tfj)),l=(0,n.EW)((()=>a.value?(0,o.Tl)("settings","Supported"):(0,o.Tl)("settings","Featured"))),c=(0,n.EW)((()=>a.value?(0,o.Tl)("settings","This app is supported via your current Nextcloud subscription."):(0,o.Tl)("settings","Featured apps are developed by and within the community. They offer central functionality and are ready for production use.")));return{__sfc:!0,props:e,isSupported:a,isFeatured:r,badgeIcon:p,badgeText:l,badgeTitle:c,NcIconSvgWrapper:i.A}}});var p=a(85072),l=a.n(p),c=a(97825),d=a.n(c),A=a(77659),u=a.n(A),g=a(55056),m=a.n(g),v=a(10540),h=a.n(v),C=a(41113),f=a.n(C),b=a(13331),_={};_.styleTagTransform=f(),_.setAttributes=m(),_.insert=u().bind(null,"head"),_.domAPI=d(),_.insertStyleElement=h(),l()(b.A,_),b.A&&b.A.locals&&b.A.locals;const y=(0,a(14486).A)(r,(function(){var t=this,e=t._self._c,a=t._self._setupProxy;return a.isSupported||a.isFeatured?e("span",{staticClass:"app-level-badge",class:{"app-level-badge--supported":a.isSupported},attrs:{title:a.badgeTitle}},[e(a.NcIconSvgWrapper,{attrs:{path:a.badgeIcon,size:20,inline:""}}),t._v("\n\t"+t._s(a.badgeText)+"\n")],1):t._e()}),[],!1,null,"5ee601b2",null).exports},18881:(t,e,a)=>{a.d(e,{A:()=>_});var n=a(6695),i=a(9165),s=a(53334);const o=(0,a(85471).pM)({name:"AppScore",components:{NcIconSvgWrapper:n.A},props:{score:{type:Number,required:!0}},setup:()=>({mdiStar:i.ZL5,mdiStarHalfFull:i.tdF,mdiStarOutline:i.dF}),computed:{title(){const t=(5*this.score).toFixed(1);return(0,s.Tl)("settings","Community rating: {score}/5",{score:t})},fullStars(){return Math.floor(5*this.score+.25)},emptyStars(){return Math.min(Math.floor(5*(1-this.score)+.25),5-this.fullStars)},hasHalfStar(){return this.fullStars+this.emptyStars<5}}});var r=a(85072),p=a.n(r),l=a(97825),c=a.n(l),d=a(77659),A=a.n(d),u=a(55056),g=a.n(u),m=a(10540),v=a.n(m),h=a(41113),C=a.n(h),f=a(96285),b={};b.styleTagTransform=C(),b.setAttributes=g(),b.insert=A().bind(null,"head"),b.domAPI=c(),b.insertStyleElement=v(),p()(f.A,b),f.A&&f.A.locals&&f.A.locals;const _=(0,a(14486).A)(o,(function(){var t=this,e=t._self._c;return t._self._setupProxy,e("span",{staticClass:"app-score__wrapper",attrs:{role:"img","aria-label":t.title,title:t.title}},[t._l(t.fullStars,(function(a){return e("NcIconSvgWrapper",{key:`full-star-${a}`,attrs:{path:t.mdiStar,inline:""}})})),t._v(" "),t.hasHalfStar?e("NcIconSvgWrapper",{attrs:{path:t.mdiStarHalfFull,inline:""}}):t._e(),t._v(" "),t._l(t.emptyStars,(function(a){return e("NcIconSvgWrapper",{key:`empty-star-${a}`,attrs:{path:t.mdiStarOutline,inline:""}})}))],2)}),[],!1,null,"2193f4e0",null).exports},91114:(e,a,n)=>{n.r(a),n.d(a,{default:()=>ot});var i=n(85471),s=n(53334),o=n(24387),r=n(846),p=n(92973),l=n(18195),c=n(34196),d=n(84237),A=n(61338),u=n(82692);function g(t,e,a){(function(t,e){if(e.has(t))throw new TypeError("Cannot initialize the same private elements twice on an object")})(t,e),e.set(t,a)}function m(t,e,a){return t.set(h(t,e),a),a}function v(t,e){return t.get(h(t,e))}function h(t,e,a){if("function"==typeof t?t===e:t.has(e))return arguments.length<3?e:a;throw new TypeError("Private element is not present on this object")}function C(t,e,a){return(e=function(t){var e=function(t){if("object"!=typeof t||!t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var a=e.call(t,"string");if("object"!=typeof a)return a;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(t);return"symbol"==typeof e?e:e+""}(e))in t?Object.defineProperty(t,e,{value:a,enumerable:!0,configurable:!0,writable:!0}):t[e]=a,t}class f{constructor(t){C(this,"value",void 0),C(this,"next",void 0),this.value=t}}var b=new WeakMap,_=new WeakMap,y=new WeakMap;class x{constructor(){g(this,b,void 0),g(this,_,void 0),g(this,y,void 0),this.clear()}enqueue(t){var e;const a=new f(t);v(b,this)?(v(_,this).next=a,m(_,this,a)):(m(b,this,a),m(_,this,a)),m(y,this,(e=v(y,this),++e))}dequeue(){var t;const e=v(b,this);if(e)return m(b,this,v(b,this).next),m(y,this,(t=v(y,this),--t)),e.value}peek(){if(v(b,this))return v(b,this).value}clear(){m(b,this,void 0),m(_,this,void 0),m(y,this,0)}get size(){return v(y,this)}*[Symbol.iterator](){let t=v(b,this);for(;t;)yield t.value,t=t.next}}function w(t){S(t);const e=new x;let a=0;const n=()=>{a<t&&e.size>0&&(e.dequeue()(),a++)},i=async(t,e,i)=>{const s=(async()=>t(...i))();e(s);try{await s}catch{}a--,n()},s=function(s){for(var o=arguments.length,r=new Array(o>1?o-1:0),p=1;p<o;p++)r[p-1]=arguments[p];return new Promise((o=>{((s,o,r)=>{new Promise((t=>{e.enqueue(t)})).then(i.bind(void 0,s,o,r)),(async()=>{await Promise.resolve(),a<t&&n()})()})(s,o,r)}))};return Object.defineProperties(s,{activeCount:{get:()=>a},pendingCount:{get:()=>e.size},clearQueue:{value(){e.clear()}},concurrency:{get:()=>t,set(i){S(i),t=i,queueMicrotask((()=>{for(;a<t&&e.size>0;)n()}))}}}),s}function S(t){if(!Number.isInteger(t)&&t!==Number.POSITIVE_INFINITY||!(t>0))throw new TypeError("Expected `concurrency` to be a number from 1 and up")}var k=n(18740),N=n(96763);const I={name:"AppList",components:{AppItem:u.A,NcButton:k.A},props:{category:{type:String,required:!0}},data:()=>({search:""}),computed:{counter(){return this.apps.filter((t=>t.update)).length},loading(){return this.$store.getters.loading("list")},hasPendingUpdate(){return this.apps.filter((t=>t.update)).length>0},showUpdateAll(){return this.hasPendingUpdate&&this.useListView},apps(){const t=this.$store.getters.getAllApps.filter((t=>-1!==t.name.toLowerCase().search(this.search.toLowerCase()))).sort((function(t,e){const a=""+(t.active?0:1)+(t.update?0:1)+t.name,n=""+(e.active?0:1)+(e.update?0:1)+e.name;return OC.Util.naturalSortCompare(a,n)}));return"installed"===this.category?t.filter((t=>t.installed)):"enabled"===this.category?t.filter((t=>t.active&&t.installed)):"disabled"===this.category?t.filter((t=>!t.active&&t.installed)):"app-bundles"===this.category?t.filter((t=>t.bundles)):"updates"===this.category?t.filter((t=>t.update)):"supported"===this.category?t.filter((t=>300===t.level)):"featured"===this.category?t.filter((t=>200===t.level)):t.filter((t=>t.appstore&&void 0!==t.category&&(t.category===this.category||t.category.indexOf(this.category)>-1)))},bundles(){return this.$store.getters.getAppBundles.filter((t=>this.bundleApps(t.id).length>0))},bundleApps:()=>function(t){return this.$store.getters.getAllApps.filter((e=>void 0!==e.bundleIds&&e.bundleIds.includes(t)))},searchApps(){return""===this.search?[]:this.$store.getters.getAllApps.filter((t=>-1!==t.name.toLowerCase().search(this.search.toLowerCase())&&!this.apps.find((e=>e.id===t.id))))},useAppStoreView(){return!this.useListView&&!this.useBundleView},useListView(){return"installed"===this.category||"enabled"===this.category||"disabled"===this.category||"updates"===this.category||"featured"===this.category||"supported"===this.category},useBundleView(){return"app-bundles"===this.category},allBundlesEnabled(){return t=>0===this.bundleApps(t).filter((t=>!t.active)).length},bundleToggleText(){return e=>this.allBundlesEnabled(e)?t("settings","Disable all"):t("settings","Download and enable all")}},beforeDestroy(){(0,A.al)("nextcloud:unified-search.search",this.setSearch),(0,A.al)("nextcloud:unified-search.reset",this.resetSearch)},mounted(){(0,A.B1)("nextcloud:unified-search.search",this.setSearch),(0,A.B1)("nextcloud:unified-search.reset",this.resetSearch)},methods:{setSearch(t){let{query:e}=t;this.search=e},resetSearch(){this.search=""},toggleBundle(t){return this.allBundlesEnabled(t)?this.disableBundle(t):this.enableBundle(t)},enableBundle(t){const e=this.bundleApps(t).map((t=>t.id));this.$store.dispatch("enableApp",{appId:e,groups:[]}).catch((t=>{N.error(t),OC.Notification.show(t)}))},disableBundle(t){const e=this.bundleApps(t).map((t=>t.id));this.$store.dispatch("disableApp",{appId:e,groups:[]}).catch((t=>{OC.Notification.show(t)}))},updateAll(){const t=w(1);this.apps.filter((t=>t.update)).map((e=>t((()=>this.$store.dispatch("updateApp",{appId:e.id})))))}}};var T=n(85072),E=n.n(T),D=n(97825),B=n.n(D),$=n(77659),P=n.n($),L=n(55056),O=n.n(L),G=n(10540),R=n.n(G),W=n(41113),U=n.n(W),M=n(35534),z={};z.styleTagTransform=U(),z.setAttributes=O(),z.insert=P().bind(null,"head"),z.domAPI=B(),z.insertStyleElement=R(),E()(M.A,z),M.A&&M.A.locals&&M.A.locals;var F=n(14486);const Y=(0,F.A)(I,(function(){var t=this,e=t._self._c;return e("div",{attrs:{id:"app-content-inner"}},[e("div",{staticClass:"apps-list",class:{"apps-list--list-view":t.useBundleView||t.useListView,"apps-list--store-view":t.useAppStoreView},attrs:{id:"apps-list"}},[t.useListView?[t.showUpdateAll?e("div",{staticClass:"apps-list__toolbar"},[t._v("\n\t\t\t\t"+t._s(t.n("settings","%n app has an update available","%n apps have an update available",t.counter))+"\n\t\t\t\t"),t.showUpdateAll?e("NcButton",{attrs:{id:"app-list-update-all",type:"primary"},on:{click:t.updateAll}},[t._v("\n\t\t\t\t\t"+t._s(t.n("settings","Update","Update all",t.counter))+"\n\t\t\t\t")]):t._e()],1):t._e(),t._v(" "),t.showUpdateAll?t._e():e("div",{staticClass:"apps-list__toolbar"},[t._v("\n\t\t\t\t"+t._s(t.t("settings","All apps are up-to-date."))+"\n\t\t\t")]),t._v(" "),e("TransitionGroup",{staticClass:"apps-list__list-container",attrs:{name:"apps-list",tag:"table"}},[e("tr",{key:"app-list-view-header"},[e("th",[e("span",{staticClass:"hidden-visually"},[t._v(t._s(t.t("settings","Icon")))])]),t._v(" "),e("th",[e("span",{staticClass:"hidden-visually"},[t._v(t._s(t.t("settings","Name")))])]),t._v(" "),e("th",[e("span",{staticClass:"hidden-visually"},[t._v(t._s(t.t("settings","Version")))])]),t._v(" "),e("th",[e("span",{staticClass:"hidden-visually"},[t._v(t._s(t.t("settings","Level")))])]),t._v(" "),e("th",[e("span",{staticClass:"hidden-visually"},[t._v(t._s(t.t("settings","Actions")))])])]),t._v(" "),t._l(t.apps,(function(a){return e("AppItem",{key:a.id,attrs:{app:a,category:t.category}})}))],2)]:t._e(),t._v(" "),t.useBundleView?e("table",{staticClass:"apps-list__list-container"},[e("tr",{key:"app-list-view-header"},[e("th",{attrs:{id:"app-table-col-icon"}},[e("span",{staticClass:"hidden-visually"},[t._v(t._s(t.t("settings","Icon")))])]),t._v(" "),e("th",{attrs:{id:"app-table-col-name"}},[e("span",{staticClass:"hidden-visually"},[t._v(t._s(t.t("settings","Name")))])]),t._v(" "),e("th",{attrs:{id:"app-table-col-version"}},[e("span",{staticClass:"hidden-visually"},[t._v(t._s(t.t("settings","Version")))])]),t._v(" "),e("th",{attrs:{id:"app-table-col-level"}},[e("span",{staticClass:"hidden-visually"},[t._v(t._s(t.t("settings","Level")))])]),t._v(" "),e("th",{attrs:{id:"app-table-col-actions"}},[e("span",{staticClass:"hidden-visually"},[t._v(t._s(t.t("settings","Actions")))])])]),t._v(" "),t._l(t.bundles,(function(a){return[e("tr",{key:a.id},[e("th",{attrs:{id:`app-table-rowgroup-${a.id}`,colspan:"5",scope:"rowgroup"}},[e("div",{staticClass:"apps-list__bundle-heading"},[e("span",{staticClass:"apps-list__bundle-header"},[t._v("\n\t\t\t\t\t\t\t\t"+t._s(a.name)+"\n\t\t\t\t\t\t\t")]),t._v(" "),e("NcButton",{attrs:{type:"secondary"},on:{click:function(e){return t.toggleBundle(a.id)}}},[t._v("\n\t\t\t\t\t\t\t\t"+t._s(t.t("settings",t.bundleToggleText(a.id)))+"\n\t\t\t\t\t\t\t")])],1)])]),t._v(" "),t._l(t.bundleApps(a.id),(function(n){return e("AppItem",{key:a.id+n.id,attrs:{"use-bundle-view":!0,headers:`app-table-rowgroup-${a.id}`,app:n,category:t.category}})}))]}))],2):t._e(),t._v(" "),t.useAppStoreView?e("ul",{staticClass:"apps-list__store-container"},t._l(t.apps,(function(a){return e("AppItem",{key:a.id,attrs:{app:a,category:t.category,"list-view":!1}})})),1):t._e()],2),t._v(" "),e("div",{staticClass:"apps-list apps-list--list-view",attrs:{id:"apps-list-search"}},[e("div",{staticClass:"apps-list__list-container"},[""!==t.search&&t.searchApps.length>0?e("table",{staticClass:"apps-list__list-container"},[e("caption",{staticClass:"apps-list__bundle-header"},[t._v("\n\t\t\t\t\t"+t._s(t.t("settings","Results from other categories"))+"\n\t\t\t\t")]),t._v(" "),e("tr",{key:"app-list-view-header"},[e("th",[e("span",{staticClass:"hidden-visually"},[t._v(t._s(t.t("settings","Icon")))])]),t._v(" "),e("th",[e("span",{staticClass:"hidden-visually"},[t._v(t._s(t.t("settings","Name")))])]),t._v(" "),e("th",[e("span",{staticClass:"hidden-visually"},[t._v(t._s(t.t("settings","Version")))])]),t._v(" "),e("th",[e("span",{staticClass:"hidden-visually"},[t._v(t._s(t.t("settings","Level")))])]),t._v(" "),e("th",[e("span",{staticClass:"hidden-visually"},[t._v(t._s(t.t("settings","Actions")))])])]),t._v(" "),t._l(t.searchApps,(function(a){return e("AppItem",{key:a.id,attrs:{app:a,category:t.category}})}))],2):t._e()])]),t._v(" "),""===t.search||t.loading||0!==t.searchApps.length||0!==t.apps.length?t._e():e("div",{staticClass:"emptycontent emptycontent-search",attrs:{id:"apps-list-empty"}},[e("div",{staticClass:"icon-settings-dark",attrs:{id:"app-list-empty-icon"}}),t._v(" "),e("h2",[t._v(t._s(t.t("settings","No apps found for your version")))])])])}),[],!1,null,"5cf3c7a8",null).exports;var V=n(9165),j=n(85168),q=n(63814),H=n(65043),K=n(6695),Q=n(36620);const X=t=>{const e={...t};if(e.date&&(e.date=Date.parse(e.date)),e.expiryDate&&(e.expiryDate=Date.parse(e.expiryDate)),"post"===e.type)return e;if("showcase"===e.type)return e;if("carousel"===e.type)return e;throw new Error(`Invalid argument, app discover element with type ${t.type??"unknown"} is unknown`)},Z=t=>{const e=Date.now();return!(t.date&&t.date>e||t.expiryDate&&t.expiryDate<e)},J=(0,i.pM)({__name:"AppStoreDiscoverSection",setup(t){const e=(0,i.$V)((()=>n.e(4546).then(n.bind(n,54546)))),a=(0,i.$V)((()=>n.e(9972).then(n.bind(n,79972)))),o=(0,i.$V)((()=>n.e(8737).then(n.bind(n,98737)))),r=(0,i.KR)(!1),p=(0,i.KR)([]),l=t=>{for(let e=t.length-1;e>0;e--){const a=Math.floor(Math.random()*(e+1));[t[e],t[a]]=[t[a],t[e]]}return t};return(0,i.KC)((async()=>{try{const{data:t}=await H.Ay.get((0,q.Jv)("/settings/api/apps/discover"));if(0===t.length)return Q.A.info("No app discover elements available (empty response)"),void(r.value=!0);const e=t.map(X).filter(Z),a=l(e);a.sort(((t,e)=>(t.order??1/0)<(e.order??1/0)?-1:1)),p.value=a}catch(t){r.value=!0,Q.A.error(t),(0,j.Qg)((0,s.Tl)("settings","Could not load app discover section"))}})),{__sfc:!0,PostType:e,CarouselType:a,ShowcaseType:o,hasError:r,elements:p,shuffleArray:l,getComponent:t=>"post"===t?e:"carousel"===t?a:"showcase"===t?o:(0,i.pM)({mounted:()=>Q.A.error("Unknown component requested ",t),render:t=>t("div",(0,s.Tl)("settings","Could not render element"))}),mdiEyeOff:V.Bk0,t:s.Tl,NcEmptyContent:c.A,NcIconSvgWrapper:K.A,NcLoadingIcon:d.A}}});var tt=n(63021),et={};et.styleTagTransform=U(),et.setAttributes=O(),et.insert=P().bind(null,"head"),et.domAPI=B(),et.insertStyleElement=R(),E()(tt.A,et),tt.A&&tt.A.locals&&tt.A.locals;const at=(0,F.A)(J,(function(){var t=this,e=t._self._c,a=t._self._setupProxy;return e("div",{staticClass:"app-discover"},[a.hasError?e(a.NcEmptyContent,{attrs:{name:a.t("settings","Nothing to show"),description:a.t("settings","Could not load section content from app store.")},scopedSlots:t._u([{key:"icon",fn:function(){return[e(a.NcIconSvgWrapper,{attrs:{path:a.mdiEyeOff,size:64}})]},proxy:!0}],null,!1,638098482)}):0===a.elements.length?e(a.NcEmptyContent,{attrs:{name:a.t("settings","Loading"),description:a.t("settings","Fetching the latest news…")},scopedSlots:t._u([{key:"icon",fn:function(){return[e(a.NcLoadingIcon,{attrs:{size:64}})]},proxy:!0}])}):t._l(a.elements,(function(n,i){return e(a.getComponent(n.type),t._b({key:n.id??i,tag:"component"},"component",n,!1))}))],2)}),[],!1,null,"bb597eea",null).exports,nt=(0,i.pM)({__name:"AppStore",setup(t){const e=(0,o.lq)(),a=(0,r.T)(),n=(0,i.EW)((()=>e.params?.category??"discover")),A=(0,s.Tl)("settings","App Store"),u=(0,i.EW)((()=>p.l[n.value]??a.getCategoryById(n.value)?.displayName??A));(0,i.nT)((()=>{window.document.title=`${u.value} - ${A} - Nextcloud`}));const g=(0,i.nI)(),m=(0,i.EW)((()=>(g?.proxy).$store.getters.loading("list")));return(0,i.KC)((()=>{(g?.proxy).$store.dispatch("getCategories",{shouldRefetchCategories:!0}),(g?.proxy).$store.dispatch("getAllApps")})),{__sfc:!0,route:e,store:a,currentCategory:n,appStoreLabel:A,viewLabel:u,instance:g,isLoading:m,t:s.Tl,NcAppContent:l.A,NcEmptyContent:c.A,NcLoadingIcon:d.A,AppList:Y,AppStoreDiscoverSection:at}}});var it=n(43484),st={};st.styleTagTransform=U(),st.setAttributes=O(),st.insert=P().bind(null,"head"),st.domAPI=B(),st.insertStyleElement=R(),E()(it.A,st),it.A&&it.A.locals&&it.A.locals;const ot=(0,F.A)(nt,(function(){var t=this,e=t._self._c,a=t._self._setupProxy;return e(a.NcAppContent,{staticClass:"app-settings-content",attrs:{"page-heading":a.appStoreLabel}},[e("h2",{staticClass:"app-settings-content__label",domProps:{textContent:t._s(a.viewLabel)}}),t._v(" "),"discover"===a.currentCategory?e(a.AppStoreDiscoverSection):a.isLoading?e(a.NcEmptyContent,{staticClass:"empty-content__loading",attrs:{name:a.t("settings","Loading app list")},scopedSlots:t._u([{key:"icon",fn:function(){return[e(a.NcLoadingIcon,{attrs:{size:64}})]},proxy:!0}])}):e(a.AppList,{attrs:{category:a.currentCategory}})],1)}),[],!1,null,"f9073bbe",null).exports},53809:(t,e,a)=>{a.r(e),a.d(e,{default:()=>E});var n=a(85471),i=a(32981),s=a(53334),o=a(92973),r=a(846),p=a(42530),l=a(52439),c=a(66687),d=a(85947),A=a(6695),u=a(84237),g=a(86438);const m=(0,n.pM)({__name:"AppStoreNavigation",setup(t){const e=(0,i.C)("settings","appstoreUpdateCount",0),a=(0,i.C)("settings","appstoreEnabled",!0),m=(0,i.C)("settings","appstoreDeveloperDocs",""),v=(0,r.T)(),h=(0,n.EW)((()=>v.categories)),C=(0,n.EW)((()=>v.loading.categories)),f=(0,n.EW)((()=>void 0!==v.apps.find((t=>{let{level:e}=t;return 300===e}))));return(0,n.KC)((()=>{v.loadCategories(),v.loadApps()})),{__sfc:!0,updateCount:e,appstoreEnabled:a,developerDocsUrl:m,store:v,categories:h,categoriesLoading:C,isSubscribed:f,t:s.Tl,APPS_SECTION_ENUM:o.l,NcAppNavigation:p.A,NcAppNavigationItem:l.A,NcAppNavigationSpacer:c.A,NcCounterBubble:d.A,NcIconSvgWrapper:A.A,NcLoadingIcon:u.A,APPSTORE_CATEGORY_ICONS:g.A}}});var v=a(85072),h=a.n(v),C=a(97825),f=a.n(C),b=a(77659),_=a.n(b),y=a(55056),x=a.n(y),w=a(10540),S=a.n(w),k=a(41113),N=a.n(k),I=a(44315),T={};T.styleTagTransform=N(),T.setAttributes=x(),T.insert=_().bind(null,"head"),T.domAPI=f(),T.insertStyleElement=S(),h()(I.A,T),I.A&&I.A.locals&&I.A.locals;const E=(0,a(14486).A)(m,(function(){var t=this,e=t._self._c,a=t._self._setupProxy;return e(a.NcAppNavigation,{attrs:{"aria-label":a.t("settings","Apps")},scopedSlots:t._u([{key:"list",fn:function(){return[e(a.NcAppNavigationItem,{attrs:{id:"app-category-discover",to:{name:"apps-category",params:{category:"discover"}},name:a.APPS_SECTION_ENUM.discover},scopedSlots:t._u([{key:"icon",fn:function(){return[e(a.NcIconSvgWrapper,{attrs:{path:a.APPSTORE_CATEGORY_ICONS.discover}})]},proxy:!0}])}),t._v(" "),e(a.NcAppNavigationItem,{attrs:{id:"app-category-installed",to:{name:"apps-category",params:{category:"installed"}},name:a.APPS_SECTION_ENUM.installed},scopedSlots:t._u([{key:"icon",fn:function(){return[e(a.NcIconSvgWrapper,{attrs:{path:a.APPSTORE_CATEGORY_ICONS.installed}})]},proxy:!0}])}),t._v(" "),e(a.NcAppNavigationItem,{attrs:{id:"app-category-enabled",to:{name:"apps-category",params:{category:"enabled"}},name:a.APPS_SECTION_ENUM.enabled},scopedSlots:t._u([{key:"icon",fn:function(){return[e(a.NcIconSvgWrapper,{attrs:{path:a.APPSTORE_CATEGORY_ICONS.enabled}})]},proxy:!0}])}),t._v(" "),e(a.NcAppNavigationItem,{attrs:{id:"app-category-disabled",to:{name:"apps-category",params:{category:"disabled"}},name:a.APPS_SECTION_ENUM.disabled},scopedSlots:t._u([{key:"icon",fn:function(){return[e(a.NcIconSvgWrapper,{attrs:{path:a.APPSTORE_CATEGORY_ICONS.disabled}})]},proxy:!0}])}),t._v(" "),a.updateCount>0?e(a.NcAppNavigationItem,{attrs:{id:"app-category-updates",to:{name:"apps-category",params:{category:"updates"}},name:a.APPS_SECTION_ENUM.updates},scopedSlots:t._u([{key:"counter",fn:function(){return[e(a.NcCounterBubble,[t._v(t._s(a.updateCount))])]},proxy:!0},{key:"icon",fn:function(){return[e(a.NcIconSvgWrapper,{attrs:{path:a.APPSTORE_CATEGORY_ICONS.updates}})]},proxy:!0}],null,!1,2824895104)}):t._e(),t._v(" "),e(a.NcAppNavigationItem,{attrs:{id:"app-category-your-bundles",to:{name:"apps-category",params:{category:"app-bundles"}},name:a.APPS_SECTION_ENUM["app-bundles"]},scopedSlots:t._u([{key:"icon",fn:function(){return[e(a.NcIconSvgWrapper,{attrs:{path:a.APPSTORE_CATEGORY_ICONS.bundles}})]},proxy:!0}])}),t._v(" "),e(a.NcAppNavigationSpacer),t._v(" "),a.appstoreEnabled&&a.categoriesLoading?e("li",{staticClass:"categories--loading"},[e(a.NcLoadingIcon,{attrs:{size:20,"aria-label":a.t("settings","Loading categories")}})],1):a.appstoreEnabled&&!a.categoriesLoading?[a.isSubscribed?e(a.NcAppNavigationItem,{attrs:{id:"app-category-supported",to:{name:"apps-category",params:{category:"supported"}},name:a.APPS_SECTION_ENUM.supported},scopedSlots:t._u([{key:"icon",fn:function(){return[e(a.NcIconSvgWrapper,{attrs:{path:a.APPSTORE_CATEGORY_ICONS.supported}})]},proxy:!0}],null,!1,613663011)}):t._e(),t._v(" "),e(a.NcAppNavigationItem,{attrs:{id:"app-category-featured",to:{name:"apps-category",params:{category:"featured"}},name:a.APPS_SECTION_ENUM.featured},scopedSlots:t._u([{key:"icon",fn:function(){return[e(a.NcIconSvgWrapper,{attrs:{path:a.APPSTORE_CATEGORY_ICONS.featured}})]},proxy:!0}])}),t._v(" "),t._l(a.categories,(function(n){return e(a.NcAppNavigationItem,{key:n.id,attrs:{id:`app-category-${n.id}`,name:n.displayName,to:{name:"apps-category",params:{category:n.id}}},scopedSlots:t._u([{key:"icon",fn:function(){return[e(a.NcIconSvgWrapper,{attrs:{path:n.icon}})]},proxy:!0}],null,!0)})}))]:t._e(),t._v(" "),e(a.NcAppNavigationItem,{attrs:{id:"app-developer-docs",name:a.t("settings","Developer documentation ↗"),href:a.developerDocsUrl}})]},proxy:!0}])})}),[],!1,null,"1e611b27",null).exports},36710:(e,a,n)=>{n.r(a),n.d(a,{default:()=>at});var i=n(85471),s=n(53334),o=n(24387),r=n(846),p=n(35190),l=n(6695),c=n(18881),d=n(9165),A=n(46503),u=n(60023),g=n(42838),m=n.n(g);const v={name:"Markdown",props:{text:{type:String,default:""},minHeading:{type:Number,default:1}},computed:{renderMarkdown(){const t=new u.xI.Renderer;return t.link=function(t,e,a){let n;try{n=decodeURIComponent(unescape(t)).replace(/[^\w:]/g,"").toLowerCase()}catch(t){return""}if(0!==n.indexOf("http:")&&0!==n.indexOf("https:"))return"";let i='<a href="'+t+'" rel="noreferrer noopener"';return e&&(i+=' title="'+e+'"'),i+=">"+a+"</a>",i},t.heading=(t,e)=>`<h${e=Math.min(6,e+(this.minHeading-1))}>${t}</h${e}>`,t.image=function(t,e,a){return a||e},t.blockquote=function(t){return t},m().sanitize((0,u.xI)(this.text.trim(),{renderer:t,gfm:!1,highlight:!1,tables:!1,breaks:!1,pedantic:!1,sanitize:!0,smartLists:!0,smartypants:!1}),{SAFE_FOR_JQUERY:!0,ALLOWED_TAGS:["h1","h2","h3","h4","h5","h6","strong","p","a","ul","ol","li","em","del","blockquote"]})}}};var h=n(85072),C=n.n(h),f=n(97825),b=n.n(f),_=n(77659),y=n.n(_),x=n(55056),w=n.n(x),S=n(10540),k=n.n(S),N=n(41113),I=n.n(N),T=n(95421),E={};E.styleTagTransform=I(),E.setAttributes=w(),E.insert=y().bind(null,"head"),E.domAPI=b(),E.insertStyleElement=k(),C()(T.A,E),T.A&&T.A.locals&&T.A.locals;var D=n(14486);const B=(0,D.A)(v,(function(){var t=this;return(0,t._self._c)("div",{staticClass:"settings-markdown",domProps:{innerHTML:t._s(t.renderMarkdown)}})}),[],!1,null,"5d3cebad",null).exports,$=(0,i.pM)({__name:"AppDescriptionTab",props:{app:null},setup:t=>({__sfc:!0,mdiTextShort:d.azb,t:s.Tl,NcAppSidebarTab:A.A,NcIconSvgWrapper:l.A,Markdown:B})});var P=n(3007),L={};L.styleTagTransform=I(),L.setAttributes=w(),L.insert=y().bind(null,"head"),L.domAPI=b(),L.insertStyleElement=k(),C()(P.A,L),P.A&&P.A.locals&&P.A.locals;const O=(0,D.A)($,(function(){var t=this,e=t._self._c,a=t._self._setupProxy;return e(a.NcAppSidebarTab,{attrs:{id:"desc",name:a.t("settings","Description"),order:0},scopedSlots:t._u([{key:"icon",fn:function(){return[e(a.NcIconSvgWrapper,{attrs:{path:a.mdiTextShort}})]},proxy:!0}])},[t._v(" "),e("div",{staticClass:"app-description"},[e(a.Markdown,{attrs:{text:t.app.description,"min-heading":4}})],1)])}),[],!1,null,"cf0a1ae6",null).exports;var G=n(18740),R=n(4604),W=n(67607),U=n(45834),M=n(96763);const z={name:"AppDetailsTab",components:{NcAppSidebarTab:A.A,NcButton:G.A,NcDateTime:R.A,NcIconSvgWrapper:l.A,NcSelect:W.A},mixins:[U.A],props:{app:{type:Object,required:!0}},setup:()=>({store:(0,r.T)(),mdiBug:d.xhV,mdiFeatureSearch:d.NZe,mdiStar:d.ZL5,mdiTextBox:d.n1r,mdiTooltipQuestion:d.iNF}),data:()=>({groupCheckedAppsData:!1}),computed:{lastModified(){return(this.app.appstoreData?.releases??[]).map((t=>{let{lastModified:e}=t;return Date.parse(e)})).sort().at(0)??null},appAuthors(){if(M.warn(this.app),!this.app)return"";const t=t=>t["@value"]?t["@value"]:t;return(Array.isArray(this.app.author)?this.app.author.map(t):[t(this.app.author)]).sort(((t,e)=>t.split(" ").at(-1).localeCompare(e.split(" ").at(-1)))).join(", ")},appstoreUrl(){return`https://apps.nextcloud.com/apps/${this.app.id}`},externalResources(){const e=[];return this.app.internal||e.push({id:"appstore",href:this.appstoreUrl,label:t("settings","View in store")}),this.app.website&&e.push({id:"website",href:this.app.website,label:t("settings","Visit website")}),this.app.documentation&&(this.app.documentation.user&&e.push({id:"doc-user",href:this.app.documentation.user,label:t("settings","Usage documentation")}),this.app.documentation.admin&&e.push({id:"doc-admin",href:this.app.documentation.admin,label:t("settings","Admin documentation")}),this.app.documentation.developer&&e.push({id:"doc-developer",href:this.app.documentation.developer,label:t("settings","Developer documentation")})),e},appCategories(){return[this.app.category].flat().map((t=>this.store.getCategoryById(t)?.displayName??t)).join(", ")},rateAppUrl(){return`${this.appstoreUrl}#comments`},appGroups(){return this.app.groups.map((t=>({id:t,name:t})))},groups(){return this.$store.getters.getGroups.filter((t=>"disabled"!==t.id)).sort(((t,e)=>t.name.localeCompare(e.name)))}},mounted(){this.app.groups.length>0&&(this.groupCheckedAppsData=!0)}};var F=n(62940),Y={};Y.styleTagTransform=I(),Y.setAttributes=w(),Y.insert=y().bind(null,"head"),Y.domAPI=b(),Y.insertStyleElement=k(),C()(F.A,Y),F.A&&F.A.locals&&F.A.locals;const V=(0,D.A)(z,(function(){var t=this,e=t._self._c;return e("NcAppSidebarTab",{attrs:{id:"details",name:t.t("settings","Details"),order:1},scopedSlots:t._u([{key:"icon",fn:function(){return[e("NcIconSvgWrapper",{attrs:{path:t.mdiTextBox}})]},proxy:!0}])},[t._v(" "),e("div",{staticClass:"app-details"},[e("div",{staticClass:"app-details__actions"},[t.app.active&&t.canLimitToGroups(t.app)?e("div",{staticClass:"app-details__actions-groups"},[e("input",{directives:[{name:"model",rawName:"v-model",value:t.groupCheckedAppsData,expression:"groupCheckedAppsData"}],staticClass:"groups-enable__checkbox checkbox",attrs:{id:`groups_enable_${t.app.id}`,type:"checkbox"},domProps:{value:t.app.id,checked:Array.isArray(t.groupCheckedAppsData)?t._i(t.groupCheckedAppsData,t.app.id)>-1:t.groupCheckedAppsData},on:{change:[function(e){var a=t.groupCheckedAppsData,n=e.target,i=!!n.checked;if(Array.isArray(a)){var s=t.app.id,o=t._i(a,s);n.checked?o<0&&(t.groupCheckedAppsData=a.concat([s])):o>-1&&(t.groupCheckedAppsData=a.slice(0,o).concat(a.slice(o+1)))}else t.groupCheckedAppsData=i},t.setGroupLimit]}}),t._v(" "),e("label",{attrs:{for:`groups_enable_${t.app.id}`}},[t._v(t._s(t.t("settings","Limit to groups")))]),t._v(" "),e("input",{staticClass:"group_select",attrs:{type:"hidden",title:t.t("settings","All"),value:""}}),t._v(" "),e("br"),t._v(" "),e("label",{attrs:{for:"limitToGroups"}},[e("span",[t._v(t._s(t.t("settings","Limit app usage to groups")))])]),t._v(" "),t.isLimitedToGroups(t.app)?e("NcSelect",{attrs:{"input-id":"limitToGroups",options:t.groups,value:t.appGroups,limit:5,label:"name",multiple:!0,"close-on-select":!1},on:{"option:selected":t.addGroupLimitation,"option:deselected":t.removeGroupLimitation,search:t.asyncFindGroup}},[e("span",{attrs:{slot:"noResult"},slot:"noResult"},[t._v(t._s(t.t("settings","No results")))])]):t._e()],1):t._e(),t._v(" "),e("div",{staticClass:"app-details__actions-manage"},[t.app.update?e("input",{staticClass:"update primary",attrs:{type:"button",value:t.t("settings","Update to {version}",{version:t.app.update}),disabled:t.installing||t.isLoading},on:{click:function(e){return t.update(t.app.id)}}}):t._e(),t._v(" "),t.app.canUnInstall?e("input",{staticClass:"uninstall",attrs:{type:"button",value:t.t("settings","Remove"),disabled:t.installing||t.isLoading},on:{click:function(e){return t.remove(t.app.id)}}}):t._e(),t._v(" "),t.app.active?e("input",{staticClass:"enable",attrs:{type:"button",value:t.t("settings","Disable"),disabled:t.installing||t.isLoading},on:{click:function(e){return t.disable(t.app.id)}}}):t._e(),t._v(" "),t.app.active||!t.app.canInstall&&!t.app.isCompatible?t.app.active||t.app.canInstall?t._e():e("input",{staticClass:"enable force",attrs:{title:t.forceEnableButtonTooltip,"aria-label":t.forceEnableButtonTooltip,type:"button",value:t.forceEnableButtonText,disabled:t.installing||t.isLoading},on:{click:function(e){return t.forceEnable(t.app.id)}}}):e("input",{staticClass:"enable primary",attrs:{title:t.enableButtonTooltip,"aria-label":t.enableButtonTooltip,type:"button",value:t.enableButtonText,disabled:!t.app.canInstall||t.installing||t.isLoading},on:{click:function(e){return t.enable(t.app.id)}}})])]),t._v(" "),e("ul",{staticClass:"app-details__dependencies"},[t.app.missingMinOwnCloudVersion?e("li",[t._v("\n\t\t\t\t"+t._s(t.t("settings","This app has no minimum Nextcloud version assigned. This will be an error in the future."))+"\n\t\t\t")]):t._e(),t._v(" "),t.app.missingMaxOwnCloudVersion?e("li",[t._v("\n\t\t\t\t"+t._s(t.t("settings","This app has no maximum Nextcloud version assigned. This will be an error in the future."))+"\n\t\t\t")]):t._e(),t._v(" "),t.app.canInstall?t._e():e("li",[t._v("\n\t\t\t\t"+t._s(t.t("settings","This app cannot be installed because the following dependencies are not fulfilled:"))+"\n\t\t\t\t"),e("ul",{staticClass:"missing-dependencies"},t._l(t.app.missingDependencies,(function(a,n){return e("li",{key:n},[t._v("\n\t\t\t\t\t\t"+t._s(a)+"\n\t\t\t\t\t")])})),0)])]),t._v(" "),t.lastModified?e("div",{staticClass:"app-details__section"},[e("h4",[t._v("\n\t\t\t\t"+t._s(t.t("settings","Latest updated"))+"\n\t\t\t")]),t._v(" "),e("NcDateTime",{attrs:{timestamp:t.lastModified}})],1):t._e(),t._v(" "),e("div",{staticClass:"app-details__section"},[e("h4",[t._v("\n\t\t\t\t"+t._s(t.t("settings","Author"))+"\n\t\t\t")]),t._v(" "),e("p",{staticClass:"app-details__authors"},[t._v("\n\t\t\t\t"+t._s(t.appAuthors)+"\n\t\t\t")])]),t._v(" "),e("div",{staticClass:"app-details__section"},[e("h4",[t._v("\n\t\t\t\t"+t._s(t.t("settings","Categories"))+"\n\t\t\t")]),t._v(" "),e("p",[t._v("\n\t\t\t\t"+t._s(t.appCategories)+"\n\t\t\t")])]),t._v(" "),t.externalResources.length>0?e("div",{staticClass:"app-details__section"},[e("h4",[t._v(t._s(t.t("settings","Resources")))]),t._v(" "),e("ul",{staticClass:"app-details__documentation",attrs:{"aria-label":t.t("settings","Documentation")}},t._l(t.externalResources,(function(a){return e("li",{key:a.id},[e("a",{staticClass:"appslink",attrs:{href:a.href,target:"_blank",rel:"noreferrer noopener"}},[t._v("\n\t\t\t\t\t\t"+t._s(a.label)+" ↗\n\t\t\t\t\t")])])})),0)]):t._e(),t._v(" "),e("div",{staticClass:"app-details__section"},[e("h4",[t._v(t._s(t.t("settings","Interact")))]),t._v(" "),e("div",{staticClass:"app-details__interact"},[e("NcButton",{attrs:{disabled:!t.app.bugs,href:t.app.bugs??"#","aria-label":t.t("settings","Report a bug"),title:t.t("settings","Report a bug")},scopedSlots:t._u([{key:"icon",fn:function(){return[e("NcIconSvgWrapper",{attrs:{path:t.mdiBug}})]},proxy:!0}])}),t._v(" "),e("NcButton",{attrs:{disabled:!t.app.bugs,href:t.app.bugs??"#","aria-label":t.t("settings","Request feature"),title:t.t("settings","Request feature")},scopedSlots:t._u([{key:"icon",fn:function(){return[e("NcIconSvgWrapper",{attrs:{path:t.mdiFeatureSearch}})]},proxy:!0}])}),t._v(" "),t.app.appstoreData?.discussion?e("NcButton",{attrs:{href:t.app.appstoreData.discussion,"aria-label":t.t("settings","Ask questions or discuss"),title:t.t("settings","Ask questions or discuss")},scopedSlots:t._u([{key:"icon",fn:function(){return[e("NcIconSvgWrapper",{attrs:{path:t.mdiTooltipQuestion}})]},proxy:!0}],null,!1,1288192462)}):t._e(),t._v(" "),t.app.internal?t._e():e("NcButton",{attrs:{href:t.rateAppUrl,"aria-label":t.t("settings","Rate the app"),title:t.t("settings","Rate")},scopedSlots:t._u([{key:"icon",fn:function(){return[e("NcIconSvgWrapper",{attrs:{path:t.mdiStar}})]},proxy:!0}],null,!1,422450625)})],1)])])])}),[],!1,null,"533705fa",null).exports,j=(0,i.pM)({__name:"AppReleasesTab",props:{app:null},setup(t){const e=t,a=(0,i.EW)((()=>Object.values(e.app.releases?.[0]?.translations??{}).some((t=>{let{changelog:e}=t;return!!e}))));return{__sfc:!0,props:e,hasChangelog:a,createChangelogFromRelease:t=>t.translations?.[(0,s.Z0)()]?.changelog??t.translations?.en?.changelog??"",mdiClockFast:d.NWU,t:s.Tl,NcAppSidebarTab:A.A,NcIconSvgWrapper:l.A,Markdown:B}}});var q=n(37925),H={};H.styleTagTransform=I(),H.setAttributes=w(),H.insert=y().bind(null,"head"),H.domAPI=b(),H.insertStyleElement=k(),C()(q.A,H),q.A&&q.A.locals&&q.A.locals;const K=(0,D.A)(j,(function(){var t=this,e=t._self._c,a=t._self._setupProxy;return a.hasChangelog?e(a.NcAppSidebarTab,{attrs:{id:"changelog",name:a.t("settings","Changelog"),order:2},scopedSlots:t._u([{key:"icon",fn:function(){return[e(a.NcIconSvgWrapper,{attrs:{path:a.mdiClockFast,size:24}})]},proxy:!0}],null,!1,1849836872)},[t._v(" "),t._l(t.app.releases,(function(n){return e("div",{key:n.version,staticClass:"app-sidebar-tabs__release"},[e("h2",[t._v(t._s(n.version))]),t._v(" "),e(a.Markdown,{staticClass:"app-sidebar-tabs__release-text",attrs:{text:a.createChangelogFromRelease(n)}})],1)}))],2):t._e()}),[],!1,null,"9c32407e",null).exports;var Q=n(11516),X=n(86438),Z=n(36620);const J=(0,i.pM)({__name:"AppStoreSidebar",setup(t){const e=(0,o.lq)(),a=(0,o.rd)(),n=(0,r.T)(),A=(0,i.EW)((()=>e.params.id??"")),u=(0,i.EW)((()=>n.getAppById(A.value))),g=(0,i.EW)((()=>u.value.appstoreData?.ratingNumOverall>5)),m=(0,i.EW)((()=>u.value.appstoreData?.ratingNumRecent>5?u.value.appstoreData.ratingRecent:u.value.appstoreData?.ratingOverall??.5)),v=(0,i.EW)((()=>null!==u.value)),{appIcon:h}=function(t){const e=(0,i.KR)(null),a=(0,i.EW)((()=>{const e=[t.value?.category??[]].flat().map((t=>X.A[t])).filter((t=>!!t)).at(0)??d.CZ3;return e?`<svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="${e}" /></svg>`:null}));return(0,i.nT)((async()=>{if(t.value?.preview){e.value=null;try{const a=await window.fetch(t.value.preview),n=await a.blob(),i=await n.text();e.value=i.replaceAll(/fill="#(fff|ffffff)([a-z0-9]{1,2})?"/gi,'fill="currentColor"')}catch(t){e.value=a.value,Z.A.error("Could not load app icon",{error:t})}}else e.value=a.value})),{appIcon:e}}(u),C=(0,i.EW)((()=>u.value?(0,s.Tl)("settings","Version {version}, {license}-licensed",{version:u.value.version,license:u.value.licence.toString().toUpperCase()}):"")),f=(0,i.KR)("details");(0,i.wB)([u],(()=>{f.value="details"}));const b=(0,i.KR)(!1),_=(0,i.EW)((()=>u.value?.screenshot&&b.value)),y=()=>{if(u.value?.releases&&u.value?.screenshot){const t=new Image;t.onload=()=>{b.value=!0},t.src=u.value.screenshot}};return(0,i.wB)([u],y),(0,i.sV)(y),{__sfc:!0,route:e,router:a,store:n,appId:A,app:u,hasRating:g,rating:m,showSidebar:v,appIcon:h,licenseText:C,activeTab:f,hideAppDetails:()=>{a.push({name:"apps-category",params:{category:e.params.category}})},screenshotLoaded:b,hasScreenshot:_,loadScreenshot:y,NcAppSidebar:p.N,NcIconSvgWrapper:l.A,AppScore:c.A,AppDescriptionTab:O,AppDetailsTab:V,AppReleasesTab:K,AppLevelBadge:Q.A}}});var tt=n(17525),et={};et.styleTagTransform=I(),et.setAttributes=w(),et.insert=y().bind(null,"head"),et.domAPI=b(),et.insertStyleElement=k(),C()(tt.A,et),tt.A&&tt.A.locals&&tt.A.locals;const at=(0,D.A)(J,(function(){var t=this,e=t._self._c,a=t._self._setupProxy;return a.showSidebar?e(a.NcAppSidebar,{staticClass:"app-sidebar",class:{"app-sidebar--with-screenshot":a.hasScreenshot},attrs:{active:a.activeTab,background:a.hasScreenshot?a.app.screenshot:void 0,compact:!a.hasScreenshot,name:a.app.name,title:a.app.name,subname:a.licenseText,subtitle:a.licenseText},on:{"update:active":function(t){a.activeTab=t},close:a.hideAppDetails},scopedSlots:t._u([a.hasScreenshot?null:{key:"header",fn:function(){return[e(a.NcIconSvgWrapper,{staticClass:"app-sidebar__fallback-icon",attrs:{svg:a.appIcon??"",size:64}})]},proxy:!0},{key:"description",fn:function(){return[e("div",{staticClass:"app-sidebar__badges"},[e(a.AppLevelBadge,{attrs:{level:a.app.level}}),t._v(" "),a.hasRating?e(a.AppScore,{attrs:{score:a.rating}}):t._e()],1)]},proxy:!0}],null,!0)},[t._v(" "),t._v(" "),e(a.AppDescriptionTab,{attrs:{app:a.app}}),t._v(" "),e(a.AppDetailsTab,{attrs:{app:a.app}}),t._v(" "),e(a.AppReleasesTab,{attrs:{app:a.app}})],1):t._e()}),[],!1,null,"2f300fa2",null).exports}}]);
-//# sourceMappingURL=settings-apps-view-4529.js.map?v=1ff3e764eab81081e54c \ No newline at end of file
+"use strict";(self.webpackChunknextcloud=self.webpackChunknextcloud||[]).push([[4529],{92973:(t,e,a)=>{a.d(e,{l:()=>i});var n=a(53334);const i=Object.freeze({discover:(0,n.Tl)("settings","Discover"),installed:(0,n.Tl)("settings","Your apps"),enabled:(0,n.Tl)("settings","Active apps"),disabled:(0,n.Tl)("settings","Disabled apps"),updates:(0,n.Tl)("settings","Updates"),"app-bundles":(0,n.Tl)("settings","App bundles"),featured:(0,n.Tl)("settings","Featured apps"),supported:(0,n.Tl)("settings","Supported apps")})},45834:(e,a,n)=>{n.d(a,{A:()=>l});var i=n(85168),s=n(65043),o=n(63814),r=n(61338);const p=()=>s.Ay.get((0,o.KT)("core/navigation",2)+"/apps?format=json").then((t=>{let{data:e}=t;200===e.ocs.meta.statuscode&&((0,r.Ic)("nextcloud:app-menu.refresh",{apps:e.ocs.data}),window.dispatchEvent(new Event("resize")))})),l={computed:{appGroups(){return this.app.groups.map((t=>({id:t,name:t})))},installing(){return this.$store.getters.loading("install")},isLoading(){return this.app&&this.$store.getters.loading(this.app.id)},enableButtonText(){return this.app.needsDownload?t("settings","Download and enable"):t("settings","Enable")},forceEnableButtonText(){return this.app.needsDownload,t("settings","Allow untested app")},enableButtonTooltip(){return this.app.needsDownload?t("settings","The app will be downloaded from the App Store"):null},forceEnableButtonTooltip(){const e=t("settings","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.");return this.app.needsDownload?e+" "+t("settings","The app will be downloaded from the App Store"):e}},data:()=>({groupCheckedAppsData:!1}),mounted(){this.app&&this.app.groups&&this.app.groups.length>0&&(this.groupCheckedAppsData=!0)},methods:{asyncFindGroup(t){return this.$store.dispatch("getGroups",{search:t,limit:5,offset:0})},isLimitedToGroups(t){return!(!this.app.groups.length&&!this.groupCheckedAppsData)},setGroupLimit(){this.groupCheckedAppsData||this.$store.dispatch("enableApp",{appId:this.app.id,groups:[]})},canLimitToGroups:t=>!(t.types&&t.types.includes("filesystem")||t.types.includes("prelogin")||t.types.includes("authentication")||t.types.includes("logging")||t.types.includes("prevent_group_restriction")),addGroupLimitation(t){const e=t.pop(),a=this.app.groups.concat([]).concat([e.id]);this.$store.dispatch("enableApp",{appId:this.app.id,groups:a})},removeGroupLimitation(t){const e=this.app.groups.concat([]),a=e.indexOf(t.id);a>-1&&e.splice(a,1),this.$store.dispatch("enableApp",{appId:this.app.id,groups:e})},forceEnable(t){this.$store.dispatch("forceEnableApp",{appId:t,groups:[]}).then((t=>{p()})).catch((t=>{(0,i.Qg)(t)}))},enable(t){this.$store.dispatch("enableApp",{appId:t,groups:[]}).then((t=>{p()})).catch((t=>{(0,i.Qg)(t)}))},disable(t){this.$store.dispatch("disableApp",{appId:t}).then((t=>{p()})).catch((t=>{(0,i.Qg)(t)}))},remove(t){this.$store.dispatch("uninstallApp",{appId:t}).then((t=>{p()})).catch((t=>{(0,i.Qg)(t)}))},install(t){this.$store.dispatch("enableApp",{appId:t}).then((t=>{p()})).catch((t=>{(0,i.Qg)(t)}))},update(t){this.$store.dispatch("updateApp",{appId:t}).then((t=>{p()})).catch((t=>{(0,i.Qg)(t)}))}}}},86438:(t,e,a)=>{a.d(e,{A:()=>i});var n=a(9165);const i=Object.freeze({discover:n.tZc,installed:n.Gbn,enabled:n.Tfj,disabled:n.hyP,bundles:n.nSK,supported:n.Yk,featured:n.ZL5,updates:n.XCd,auth:n.EYN,customization:n.CZ3,dashboard:n.o7l,files:n.fEr,games:n.FeJ,integration:n.bur,monitoring:n.y48,multimedia:n.WI,office:n.Ku3,organization:n.TO3,search:n.U4M,security:n.JiW,social:n.Krx,tools:n.QKT,workflow:n.Dgm})},846:(t,e,a)=>{a.d(e,{T:()=>A});var n=a(85168),i=a(32981),s=a(53334),o=a(63814),r=a(65899),p=a(65043),l=a(36620),c=a(86438);const d=()=>(0,n.Qg)((0,s.Tl)("settings","An error occurred during the request. Unable to proceed.")),A=(0,r.nY)("settings-apps",{state:()=>({apps:[],categories:[],updateCount:(0,i.C)("settings","appstoreUpdateCount",0),loading:{apps:!1,categories:!1},loadingList:!1,gettingCategoriesPromise:null}),actions:{async loadCategories(){let t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];if(!(this.categories.length>0)||t)try{this.loading.categories=!0;const{data:t}=await p.Ay.get((0,o.Jv)("settings/apps/categories"));for(const e of t)e.icon=c.A[e.id]??"";this.$patch({categories:t})}catch(t){l.A.error(t),d()}finally{this.loading.categories=!1}},async loadApps(){let t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];if(!(this.apps.length>0)||t)try{this.loading.apps=!0;const{data:t}=await p.Ay.get((0,o.Jv)("settings/apps/list"));this.$patch({apps:t.apps})}catch(t){l.A.error(t),d()}finally{this.loading.apps=!1}},getCategoryById(t){return this.categories.find((e=>{let{id:a}=e;return a===t}))??null},getAppById(t){return this.apps.find((e=>{let{id:a}=e;return a===t}))??null}}})},35534:(t,e,a)=>{a.d(e,{A:()=>r});var n=a(71354),i=a.n(n),s=a(76314),o=a.n(s)()(i());o.push([t.id,".apps-list[data-v-5cf3c7a8]{display:flex;flex-wrap:wrap;align-content:flex-start}.apps-list--move[data-v-5cf3c7a8]{transition:transform 1s}.apps-list #app-list-update-all[data-v-5cf3c7a8]{margin-inline-start:10px}.apps-list__toolbar[data-v-5cf3c7a8]{height:60px;padding:8px;padding-inline-start:60px;width:100%;background-color:var(--color-main-background);position:sticky;top:0;z-index:1;display:flex;align-items:center}.apps-list--list-view[data-v-5cf3c7a8]{margin-bottom:100px;position:relative}.apps-list__list-container[data-v-5cf3c7a8]{width:100%}.apps-list__store-container[data-v-5cf3c7a8]{display:flex;flex-wrap:wrap}.apps-list__bundle-heading[data-v-5cf3c7a8]{display:flex;align-items:center;margin-block:20px;margin-inline:0 10px}.apps-list__bundle-header[data-v-5cf3c7a8]{margin-block:0;margin-inline:50px 10px;font-weight:bold;font-size:20px;line-height:30px;color:var(--color-text-light)}#apps-list-search .app-item h2[data-v-5cf3c7a8]{margin-bottom:0}","",{version:3,sources:["webpack://./apps/settings/src/components/AppList.vue"],names:[],mappings:"AAIA,4BACC,YAAA,CACA,cAAA,CACA,wBAAA,CAGA,kCACC,uBAAA,CAGD,iDACC,wBAAA,CAGD,qCACC,WAjBe,CAkBf,WAnBgB,CAqBhB,yBApBe,CAqBf,UAAA,CACA,6CAAA,CACA,eAAA,CACA,KAAA,CACA,SAAA,CACA,YAAA,CACA,kBAAA,CAGD,uCACC,mBAAA,CAEA,iBAAA,CAGD,4CACC,UAAA,CAGD,6CACC,YAAA,CACA,cAAA,CAGD,4CACC,YAAA,CACA,kBAAA,CACA,iBAAA,CACA,oBAAA,CAGD,2CACC,cAAA,CACA,uBAAA,CACA,gBAAA,CACA,cAAA,CACA,gBAAA,CACA,6BAAA,CAMA,gDACC,eAAA",sourcesContent:["\n$toolbar-padding: 8px;\n$toolbar-height: 44px + $toolbar-padding * 2;\n\n.apps-list {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\talign-content: flex-start;\n\n\t// For transition group\n\t&--move {\n\t\ttransition: transform 1s;\n\t}\n\n\t#app-list-update-all {\n\t\tmargin-inline-start: 10px;\n\t}\n\n\t&__toolbar {\n\t\theight: $toolbar-height;\n\t\tpadding: $toolbar-padding;\n\t\t// Leave room for app-navigation-toggle\n\t\tpadding-inline-start: $toolbar-height;\n\t\twidth: 100%;\n\t\tbackground-color: var(--color-main-background);\n\t\tposition: sticky;\n\t\ttop: 0;\n\t\tz-index: 1;\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t}\n\n\t&--list-view {\n\t\tmargin-bottom: 100px;\n\t\t// For positioning link overlay on rows\n\t\tposition: relative;\n\t}\n\n\t&__list-container {\n\t\twidth: 100%;\n\t}\n\n\t&__store-container {\n\t\tdisplay: flex;\n\t\tflex-wrap: wrap;\n\t}\n\n\t&__bundle-heading {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tmargin-block: 20px;\n\t\tmargin-inline: 0 10px;\n\t}\n\n\t&__bundle-header {\n\t\tmargin-block: 0;\n\t\tmargin-inline: 50px 10px;\n\t\tfont-weight: bold;\n\t\tfont-size: 20px;\n\t\tline-height: 30px;\n\t\tcolor: var(--color-text-light);\n\t}\n}\n\n#apps-list-search {\n\t.app-item {\n\t\th2 {\n\t\t\tmargin-bottom: 0;\n\t\t}\n\t}\n}\n"],sourceRoot:""}]);const r=o},89668:(t,e,a)=>{a.d(e,{A:()=>r});var n=a(71354),i=a.n(n),s=a(76314),o=a.n(s)()(i());o.push([t.id,'/*!\n * SPDX-FileCopyrightText: 2018 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */.app-item[data-v-4f1b9f2a]{position:relative}.app-item[data-v-4f1b9f2a]:hover{background-color:var(--color-background-dark)}.app-item--list-view[data-v-4f1b9f2a]{--app-item-padding: calc(var(--default-grid-baseline) * 2);--app-item-height: calc(var(--default-clickable-area) + var(--app-item-padding) * 2)}.app-item--list-view.app-item--selected[data-v-4f1b9f2a]{background-color:var(--color-background-dark)}.app-item--list-view>*[data-v-4f1b9f2a]{vertical-align:middle;border-bottom:1px solid var(--color-border);padding:var(--app-item-padding);height:var(--app-item-height)}.app-item--list-view .app-image[data-v-4f1b9f2a]{width:var(--default-clickable-area);height:auto;text-align:end}.app-item--list-view .app-image-icon svg[data-v-4f1b9f2a],.app-item--list-view .app-image-icon .icon-settings-dark[data-v-4f1b9f2a]{margin-top:5px;width:20px;height:20px;opacity:.5;background-size:cover;display:inline-block}.app-item--list-view .app-name[data-v-4f1b9f2a]{padding:0 var(--app-item-padding)}.app-item--list-view .app-name--link[data-v-4f1b9f2a]{height:var(--app-item-height);display:flex;align-items:center}.app-item--list-view .app-name--link[data-v-4f1b9f2a]::after{content:"";position:absolute;inset-inline:0;height:var(--app-item-height)}.app-item--list-view .app-actions[data-v-4f1b9f2a]{display:flex;gap:var(--app-item-padding);flex-wrap:wrap;justify-content:end}.app-item--list-view .app-actions .icon-loading-small[data-v-4f1b9f2a]{display:inline-block;top:4px;margin-inline-end:10px}@media only screen and (max-width: 900px){.app-item--list-view .app-version[data-v-4f1b9f2a],.app-item--list-view .app-level[data-v-4f1b9f2a]{display:none}}@media only screen and (max-width: 512px){.app-item--list-view .app-actions[data-v-4f1b9f2a]{display:none}}.app-item--store-view[data-v-4f1b9f2a]{padding:30px}.app-item--store-view .app-image-icon .icon-settings-dark[data-v-4f1b9f2a]{width:100%;height:150px;background-size:45px;opacity:.5}.app-item--store-view .app-image-icon svg[data-v-4f1b9f2a]{position:absolute;bottom:43px;width:64px;height:64px;opacity:.1}.app-item--store-view .app-name[data-v-4f1b9f2a]{margin:5px 0}.app-item--store-view .app-name--link[data-v-4f1b9f2a]::after{content:"";position:absolute;inset-block:0;inset-inline:0}.app-item--store-view .app-actions[data-v-4f1b9f2a]{margin:10px 0}@media only screen and (min-width: 1601px){.app-item--store-view[data-v-4f1b9f2a]{width:25%}.app-item--store-view.app-item--with-sidebar[data-v-4f1b9f2a]{width:33%}}@media only screen and (max-width: 1600px){.app-item--store-view[data-v-4f1b9f2a]{width:25%}.app-item--store-view.app-item--with-sidebar[data-v-4f1b9f2a]{width:33%}}@media only screen and (max-width: 1400px){.app-item--store-view[data-v-4f1b9f2a]{width:33%}.app-item--store-view.app-item--with-sidebar[data-v-4f1b9f2a]{width:50%}}@media only screen and (max-width: 900px){.app-item--store-view[data-v-4f1b9f2a]{width:50%}.app-item--store-view.app-item--with-sidebar[data-v-4f1b9f2a]{width:100%}}@media only screen and (max-width: 1024px){.app-item--store-view[data-v-4f1b9f2a]{width:50%}}@media only screen and (max-width: 480px){.app-item--store-view[data-v-4f1b9f2a]{width:100%}}.app-icon[data-v-4f1b9f2a]{filter:var(--background-invert-if-bright)}.app-image[data-v-4f1b9f2a]{position:relative;height:150px;opacity:1;overflow:hidden}.app-image img[data-v-4f1b9f2a]{width:100%}.app-version[data-v-4f1b9f2a]{color:var(--color-text-maxcontrast)}',"",{version:3,sources:["webpack://./core/css/variables.scss","webpack://./apps/settings/src/components/AppList/AppItem.vue"],names:[],mappings:"AAAA;;;EAAA,CCIA,2BACC,iBAAA,CAEA,iCACC,6CAAA,CAGD,sCACC,0DAAA,CACA,oFAAA,CAEA,yDACC,6CAAA,CAGD,wCACC,qBAAA,CACA,2CAAA,CACA,+BAAA,CACA,6BAAA,CAGD,iDACC,mCAAA,CACA,WAAA,CACA,cAAA,CAGD,oIAEC,cAAA,CACA,UAAA,CACA,WAAA,CACA,UAAA,CACA,qBAAA,CACA,oBAAA,CAGD,gDACC,iCAAA,CAGD,sDACC,6BAAA,CACA,YAAA,CACA,kBAAA,CAMD,6DACC,UAAA,CACA,iBAAA,CACA,cAAA,CACA,6BAAA,CAGD,mDACC,YAAA,CACA,2BAAA,CACA,cAAA,CACA,mBAAA,CAEA,uEACC,oBAAA,CACA,OAAA,CACA,sBAAA,CAKF,0CACC,oGAEC,YAAA,CAAA,CAKF,0CACC,mDACC,YAAA,CAAA,CAKH,uCACC,YAAA,CAEA,2EACC,UAAA,CACA,YAAA,CACA,oBAAA,CACA,UAAA,CAGD,2DACC,iBAAA,CACA,WAAA,CAEA,UAAA,CACA,WAAA,CACA,UAAA,CAGD,iDACC,YAAA,CAGD,8DACC,UAAA,CACA,iBAAA,CACA,aAAA,CACA,cAAA,CAGD,oDACC,aAAA,CAGD,2CAlCD,uCAmCE,SAAA,CAEA,8DACC,SAAA,CAAA,CAIF,2CA1CD,uCA2CE,SAAA,CAEA,8DACC,SAAA,CAAA,CAIF,2CAlDD,uCAmDE,SAAA,CAEA,8DACC,SAAA,CAAA,CAIF,0CA1DD,uCA2DE,SAAA,CAEA,8DACC,UAAA,CAAA,CAIF,2CAlED,uCAmEE,SAAA,CAAA,CAGD,0CAtED,uCAuEE,UAAA,CAAA,CAKH,2BACC,yCAAA,CAGD,4BACC,iBAAA,CACA,YAAA,CACA,SAAA,CACA,eAAA,CAEA,gCACC,UAAA,CAIF,8BACC,mCAAA",sourcesContent:['/*!\n * SPDX-FileCopyrightText: 2018 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n// SCSS darken/lighten function override\n@function nc-darken($color, $value) {\n\t@return darken($color, $value);\n}\n\n@function nc-lighten($color, $value) {\n\t@return lighten($color, $value);\n}\n\n// SCSS variables\n// DEPRECATED, please use CSS4 vars\n$color-main-text: #222 !default; // Not #000 for better readability\n$color-main-background: #fff !default;\n$color-main-background-translucent: rgba($color-main-background, .97) !default;\n\n// used for different active/hover/focus/disabled states\n$color-background-hover: nc-darken($color-main-background, 4%) !default;\n$color-background-dark: nc-darken($color-main-background, 7%) !default;\n$color-background-darker: nc-darken($color-main-background, 14%) !default;\n\n$color-placeholder-light: nc-darken($color-main-background, 10%) !default;\n$color-placeholder-dark: nc-darken($color-main-background, 20%) !default;\n\n$color-primary: #0082c9 !default;\n$color-primary-hover: mix($color-primary, $color-main-background, 80%) !default;\n\n$color-primary-light: mix($color-primary, $color-main-background, 10%) !default;\n$color-primary-light-text: $color-primary !default;\n$color-primary-light-hover: mix($color-primary-light, $color-main-text, 95%) !default;\n\n$color-primary-text: #ffffff !default;\n// do not use nc-darken/lighten in case of overriding because\n// primary-text is independent of color-main-text\n$color-primary-element-text-dark: darken($color-primary-text, 7%) !default;\n$color-primary-element: $color-primary !default;\n$color-primary-element-hover: mix($color-primary-element, $color-main-background, 80%) !default;\n$color-primary-element-light: lighten($color-primary-element, 15%) !default;\n\n$color-error: #e9322d;\n$color-error-hover: mix($color-error, $color-main-background, 80%) !default;\n$color-warning: #eca700;\n$color-warning-hover: mix($color-warning, $color-main-background, 80%) !default;\n$color-success: #46ba61;\n$color-success-hover: mix($color-success, $color-main-background, 80%) !default;\n// used for svg\n$color-white: #fff;\n$color-black: #000;\n$color-yellow: #FC0;\n\n// rgb(118, 118, 118) / #767676\n// min. color contrast for normal text on white background according to WCAG AA\n// (Works as well: color: #000; opacity: 0.57;)\n$color-text-maxcontrast: nc-lighten($color-main-text, 33%) !default;\n$color-text-light: $color-main-text !default;\n$color-text-lighter: $color-text-maxcontrast !default;\n\n$image-logo: url(\'../img/logo/logo.svg?v=1\') !default;\n$image-login-background: url(\'../img/background.png?v=2\') !default;\n$image-logoheader: url(\'../img/logo/logo.svg?v=1\') !default;\n$image-favicon: url(\'../img/logo/logo.svg?v=1\') !default;\n\n$color-loading-light: #ccc !default;\n$color-loading-dark: #444 !default;\n\n$color-box-shadow: transparentize(nc-darken($color-main-background, 70%), 0.5) !default;\n\n// light border like file table or app-content list\n$color-border: nc-darken($color-main-background, 7%) !default;\n// darker border like inputs or very visible elements\n$color-border-dark: nc-darken($color-main-background, 14%) !default;\n\n$border-radius: 3px !default;\n$border-radius-large: 10px !default;\n// Pill-style button, value is large so big buttons also have correct roundness\n$border-radius-pill: 100px !default;\n\n$font-face: system-ui, -apple-system, "Segoe UI", Roboto, Oxygen-Sans, Cantarell, Ubuntu, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji" !default;\n$default-font-size: 15px;\n\n$default-line-height: 24px;\n\n$animation-quick: 100ms;\n$animation-slow: 300ms;\n\n// various structure data\n$header-height: 50px;\n$navigation-width: 300px;\n$sidebar-min-width: 300px;\n$sidebar-max-width: 500px;\n$list-min-width: 200px;\n$list-max-width: 300px;\n$header-menu-item-height: 44px;\n$header-menu-profile-item-height: 66px;\n\n// mobile. Keep in sync with core/js/js.js\n$breakpoint-mobile: 1024px;\n',"\n@use '../../../../../core/css/variables.scss' as variables;\n@use 'sass:math';\n\n.app-item {\n\tposition: relative;\n\n\t&:hover {\n\t\tbackground-color: var(--color-background-dark);\n\t}\n\n\t&--list-view {\n\t\t--app-item-padding: calc(var(--default-grid-baseline) * 2);\n\t\t--app-item-height: calc(var(--default-clickable-area) + var(--app-item-padding) * 2);\n\n\t\t&.app-item--selected {\n\t\t\tbackground-color: var(--color-background-dark);\n\t\t}\n\n\t\t> * {\n\t\t\tvertical-align: middle;\n\t\t\tborder-bottom: 1px solid var(--color-border);\n\t\t\tpadding: var(--app-item-padding);\n\t\t\theight: var(--app-item-height);\n\t\t}\n\n\t\t.app-image {\n\t\t\twidth: var(--default-clickable-area);\n\t\t\theight: auto;\n\t\t\ttext-align: end;\n\t\t}\n\n\t\t.app-image-icon svg,\n\t\t.app-image-icon .icon-settings-dark {\n\t\t\tmargin-top: 5px;\n\t\t\twidth: 20px;\n\t\t\theight: 20px;\n\t\t\topacity: .5;\n\t\t\tbackground-size: cover;\n\t\t\tdisplay: inline-block;\n\t\t}\n\n\t\t.app-name {\n\t\t\tpadding: 0 var(--app-item-padding);\n\t\t}\n\n\t\t.app-name--link {\n\t\t\theight: var(--app-item-height);\n\t\t\tdisplay: flex;\n\t\t\talign-items: center;\n\t\t}\n\n\t\t// Note: because of Safari bug, we cannot position link overlay relative to the table row\n\t\t// So we need to manually position it relative to the table container and cell\n\t\t// See: https://bugs.webkit.org/show_bug.cgi?id=240961\n\t\t.app-name--link::after {\n\t\t\tcontent: '';\n\t\t\tposition: absolute;\n\t\t\tinset-inline: 0;\n\t\t\theight: var(--app-item-height);\n\t\t}\n\n\t\t.app-actions {\n\t\t\tdisplay: flex;\n\t\t\tgap: var(--app-item-padding);\n\t\t\tflex-wrap: wrap;\n\t\t\tjustify-content: end;\n\n\t\t\t.icon-loading-small {\n\t\t\t\tdisplay: inline-block;\n\t\t\t\ttop: 4px;\n\t\t\t\tmargin-inline-end: 10px;\n\t\t\t}\n\t\t}\n\n\t\t/* hide app version and level on narrower screens */\n\t\t@media only screen and (max-width: 900px) {\n\t\t\t.app-version,\n\t\t\t.app-level {\n\t\t\t\tdisplay: none;\n\t\t\t}\n\t\t}\n\n\t\t/* Hide actions on a small screen. Click on app opens fill-screen sidebar with the buttons */\n\t\t@media only screen and (max-width: math.div(variables.$breakpoint-mobile, 2)) {\n\t\t\t.app-actions {\n\t\t\t\tdisplay: none;\n\t\t\t}\n\t\t}\n\t}\n\n\t&--store-view {\n\t\tpadding: 30px;\n\n\t\t.app-image-icon .icon-settings-dark {\n\t\t\twidth: 100%;\n\t\t\theight: 150px;\n\t\t\tbackground-size: 45px;\n\t\t\topacity: 0.5;\n\t\t}\n\n\t\t.app-image-icon svg {\n\t\t\tposition: absolute;\n\t\t\tbottom: 43px;\n\t\t\t/* position halfway vertically */\n\t\t\twidth: 64px;\n\t\t\theight: 64px;\n\t\t\topacity: .1;\n\t\t}\n\n\t\t.app-name {\n\t\t\tmargin: 5px 0;\n\t\t}\n\n\t\t.app-name--link::after {\n\t\t\tcontent: '';\n\t\t\tposition: absolute;\n\t\t\tinset-block: 0;\n\t\t\tinset-inline: 0;\n\t\t}\n\n\t\t.app-actions {\n\t\t\tmargin: 10px 0;\n\t\t}\n\n\t\t@media only screen and (min-width: 1601px) {\n\t\t\twidth: 25%;\n\n\t\t\t&.app-item--with-sidebar {\n\t\t\t\twidth: 33%;\n\t\t\t}\n\t\t}\n\n\t\t@media only screen and (max-width: 1600px) {\n\t\t\twidth: 25%;\n\n\t\t\t&.app-item--with-sidebar {\n\t\t\t\twidth: 33%;\n\t\t\t}\n\t\t}\n\n\t\t@media only screen and (max-width: 1400px) {\n\t\t\twidth: 33%;\n\n\t\t\t&.app-item--with-sidebar {\n\t\t\t\twidth: 50%;\n\t\t\t}\n\t\t}\n\n\t\t@media only screen and (max-width: 900px) {\n\t\t\twidth: 50%;\n\n\t\t\t&.app-item--with-sidebar {\n\t\t\t\twidth: 100%;\n\t\t\t}\n\t\t}\n\n\t\t@media only screen and (max-width: variables.$breakpoint-mobile) {\n\t\t\twidth: 50%;\n\t\t}\n\n\t\t@media only screen and (max-width: 480px) {\n\t\t\twidth: 100%;\n\t\t}\n\t}\n}\n\n.app-icon {\n\tfilter: var(--background-invert-if-bright);\n}\n\n.app-image {\n\tposition: relative;\n\theight: 150px;\n\topacity: 1;\n\toverflow: hidden;\n\n\timg {\n\t\twidth: 100%;\n\t}\n}\n\n.app-version {\n\tcolor: var(--color-text-maxcontrast);\n}\n"],sourceRoot:""}]);const r=o},13331:(t,e,a)=>{a.d(e,{A:()=>r});var n=a(71354),i=a.n(n),s=a(76314),o=a.n(s)()(i());o.push([t.id,".app-level-badge[data-v-5ee601b2]{color:var(--color-text-maxcontrast);background-color:rgba(0,0,0,0);border:1px solid var(--color-text-maxcontrast);border-radius:var(--border-radius);display:flex;flex-direction:row;gap:6px;padding:3px 6px;width:fit-content}.app-level-badge--supported[data-v-5ee601b2]{border-color:var(--color-success);color:var(--color-success)}","",{version:3,sources:["webpack://./apps/settings/src/components/AppList/AppLevelBadge.vue"],names:[],mappings:"AACA,kCACC,mCAAA,CACA,8BAAA,CACA,8CAAA,CACA,kCAAA,CAEA,YAAA,CACA,kBAAA,CACA,OAAA,CACA,eAAA,CACA,iBAAA,CAEA,6CACC,iCAAA,CACA,0BAAA",sourcesContent:["\n.app-level-badge {\n\tcolor: var(--color-text-maxcontrast);\n\tbackground-color: transparent;\n\tborder: 1px solid var(--color-text-maxcontrast);\n\tborder-radius: var(--border-radius);\n\n\tdisplay: flex;\n\tflex-direction: row;\n\tgap: 6px;\n\tpadding: 3px 6px;\n\twidth: fit-content;\n\n\t&--supported {\n\t\tborder-color: var(--color-success);\n\t\tcolor: var(--color-success);\n\t}\n}\n"],sourceRoot:""}]);const r=o},63021:(t,e,a)=>{a.d(e,{A:()=>r});var n=a(71354),i=a.n(n),s=a(76314),o=a.n(s)()(i());o.push([t.id,".app-discover[data-v-bb597eea]{max-width:1008px;margin-inline:auto;padding-inline:54px;padding-block-end:var(--default-clickable-area, 44px);display:flex;flex-direction:column;gap:var(--default-clickable-area, 44px)}","",{version:3,sources:["webpack://./apps/settings/src/components/AppStoreDiscover/AppStoreDiscoverSection.vue"],names:[],mappings:"AACA,+BACC,gBAAA,CACA,kBAAA,CACA,mBAAA,CAEA,qDAAA,CAEA,YAAA,CACA,qBAAA,CACA,uCAAA",sourcesContent:["\n.app-discover {\n\tmax-width: 1008px; /* 900px + 2x 54px padding for the carousel controls */\n\tmargin-inline: auto;\n\tpadding-inline: 54px;\n\t/* Padding required to make last element not bound to the bottom */\n\tpadding-block-end: var(--default-clickable-area, 44px);\n\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: var(--default-clickable-area, 44px);\n}\n"],sourceRoot:""}]);const r=o},3007:(t,e,a)=>{a.d(e,{A:()=>r});var n=a(71354),i=a.n(n),s=a(76314),o=a.n(s)()(i());o.push([t.id,".app-description[data-v-cf0a1ae6]{padding:12px}","",{version:3,sources:["webpack://./apps/settings/src/components/AppStoreSidebar/AppDescriptionTab.vue"],names:[],mappings:"AACA,kCACC,YAAA",sourcesContent:["\n.app-description {\n\tpadding: 12px;\n}\n"],sourceRoot:""}]);const r=o},62940:(t,e,a)=>{a.d(e,{A:()=>r});var n=a(71354),i=a.n(n),s=a(76314),o=a.n(s)()(i());o.push([t.id,'.app-details[data-v-533705fa]{padding:20px}.app-details__actions-manage[data-v-533705fa]{display:flex}.app-details__actions-manage input[data-v-533705fa]{flex:0 1 auto;min-width:0;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.app-details__authors[data-v-533705fa]{color:var(--color-text-maxcontrast)}.app-details__section[data-v-533705fa]{margin-top:15px}.app-details__section h4[data-v-533705fa]{font-size:16px;font-weight:bold;margin-block-end:5px}.app-details__interact[data-v-533705fa]{display:flex;flex-direction:row;flex-wrap:wrap;gap:12px}.app-details__documentation a[data-v-533705fa]{text-decoration:underline}.app-details__documentation li[data-v-533705fa]{padding-inline-start:20px}.app-details__documentation li[data-v-533705fa]::before{width:5px;height:5px;border-radius:100%;background-color:var(--color-main-text);content:"";float:inline-start;margin-inline-start:-13px;position:relative;top:10px}.force[data-v-533705fa]{color:var(--color-error);border-color:var(--color-error);background:var(--color-main-background)}.force[data-v-533705fa]:hover,.force[data-v-533705fa]:active{color:var(--color-main-background);border-color:var(--color-error) !important;background:var(--color-error)}.missing-dependencies[data-v-533705fa]{list-style:initial;list-style-type:initial;list-style-position:inside}',"",{version:3,sources:["webpack://./apps/settings/src/components/AppStoreSidebar/AppDetailsTab.vue"],names:[],mappings:"AACA,8BACC,YAAA,CAIC,8CAEC,YAAA,CACA,oDACC,aAAA,CACA,WAAA,CACA,sBAAA,CACA,kBAAA,CACA,eAAA,CAIH,uCACC,mCAAA,CAGD,uCACC,eAAA,CAEA,0CACC,cAAA,CACA,gBAAA,CACA,oBAAA,CAIF,wCACC,YAAA,CACA,kBAAA,CACA,cAAA,CACA,QAAA,CAIA,+CACC,yBAAA,CAED,gDACC,yBAAA,CAEA,wDACC,SAAA,CACA,UAAA,CACA,kBAAA,CACA,uCAAA,CACA,UAAA,CACA,kBAAA,CACA,yBAAA,CACA,iBAAA,CACA,QAAA,CAMJ,wBACC,wBAAA,CACA,+BAAA,CACA,uCAAA,CAED,6DAEC,kCAAA,CACA,0CAAA,CACA,6BAAA,CAGD,uCACC,kBAAA,CACA,uBAAA,CACA,0BAAA",sourcesContent:['\n.app-details {\n\tpadding: 20px;\n\n\t&__actions {\n\t\t// app management\n\t\t&-manage {\n\t\t\t// if too many, shrink them and ellipsis\n\t\t\tdisplay: flex;\n\t\t\tinput {\n\t\t\t\tflex: 0 1 auto;\n\t\t\t\tmin-width: 0;\n\t\t\t\ttext-overflow: ellipsis;\n\t\t\t\twhite-space: nowrap;\n\t\t\t\toverflow: hidden;\n\t\t\t}\n\t\t}\n\t}\n\t&__authors {\n\t\tcolor: var(--color-text-maxcontrast);\n\t}\n\n\t&__section {\n\t\tmargin-top: 15px;\n\n\t\th4 {\n\t\t\tfont-size: 16px;\n\t\t\tfont-weight: bold;\n\t\t\tmargin-block-end: 5px;\n\t\t}\n\t}\n\n\t&__interact {\n\t\tdisplay: flex;\n\t\tflex-direction: row;\n\t\tflex-wrap: wrap;\n\t\tgap: 12px;\n\t}\n\n\t&__documentation {\n\t\ta {\n\t\t\ttext-decoration: underline;\n\t\t}\n\t\tli {\n\t\t\tpadding-inline-start: 20px;\n\n\t\t\t&::before {\n\t\t\t\twidth: 5px;\n\t\t\t\theight: 5px;\n\t\t\t\tborder-radius: 100%;\n\t\t\t\tbackground-color: var(--color-main-text);\n\t\t\t\tcontent: "";\n\t\t\t\tfloat: inline-start;\n\t\t\t\tmargin-inline-start: -13px;\n\t\t\t\tposition: relative;\n\t\t\t\ttop: 10px;\n\t\t\t}\n\t\t}\n\t}\n}\n\n.force {\n\tcolor: var(--color-error);\n\tborder-color: var(--color-error);\n\tbackground: var(--color-main-background);\n}\n.force:hover,\n.force:active {\n\tcolor: var(--color-main-background);\n\tborder-color: var(--color-error) !important;\n\tbackground: var(--color-error);\n}\n\n.missing-dependencies {\n\tlist-style: initial;\n\tlist-style-type: initial;\n\tlist-style-position: inside;\n}\n'],sourceRoot:""}]);const r=o},37925:(t,e,a)=>{a.d(e,{A:()=>r});var n=a(71354),i=a.n(n),s=a(76314),o=a.n(s)()(i());o.push([t.id,".app-sidebar-tabs__release h2[data-v-9c32407e]{border-bottom:1px solid var(--color-border);font-size:24px}.app-sidebar-tabs__release-text[data-v-9c32407e] h3{font-size:20px}.app-sidebar-tabs__release-text[data-v-9c32407e] h4{font-size:17px}","",{version:3,sources:["webpack://./apps/settings/src/components/AppStoreSidebar/AppReleasesTab.vue"],names:[],mappings:"AAEC,+CACC,2CAAA,CACA,cAAA,CAKA,oDACC,cAAA,CAED,oDACC,cAAA",sourcesContent:["\n.app-sidebar-tabs__release {\n\th2 {\n\t\tborder-bottom: 1px solid var(--color-border);\n\t\tfont-size: 24px;\n\t}\n\n\t&-text {\n\t\t// Overwrite changelog heading styles\n\t\t:deep(h3) {\n\t\t\tfont-size: 20px;\n\t\t}\n\t\t:deep(h4) {\n\t\t\tfont-size: 17px;\n\t\t}\n\t}\n}\n"],sourceRoot:""}]);const r=o},95421:(t,e,a)=>{a.d(e,{A:()=>r});var n=a(71354),i=a.n(n),s=a(76314),o=a.n(s)()(i());o.push([t.id,".settings-markdown[data-v-5d3cebad] h1,.settings-markdown[data-v-5d3cebad] h2,.settings-markdown[data-v-5d3cebad] h3,.settings-markdown[data-v-5d3cebad] h4,.settings-markdown[data-v-5d3cebad] h5,.settings-markdown[data-v-5d3cebad] h6{font-weight:600;line-height:120%;margin-top:24px;margin-bottom:12px;color:var(--color-main-text)}.settings-markdown[data-v-5d3cebad] h1{font-size:36px;margin-top:48px}.settings-markdown[data-v-5d3cebad] h2{font-size:28px;margin-top:48px}.settings-markdown[data-v-5d3cebad] h3{font-size:24px}.settings-markdown[data-v-5d3cebad] h4{font-size:21px}.settings-markdown[data-v-5d3cebad] h5{font-size:17px}.settings-markdown[data-v-5d3cebad] h6{font-size:var(--default-font-size)}.settings-markdown[data-v-5d3cebad] pre{white-space:pre;overflow-x:auto;background-color:var(--color-background-dark);border-radius:var(--border-radius);padding:1em 1.3em;margin-bottom:1em}.settings-markdown[data-v-5d3cebad] p code{background-color:var(--color-background-dark);border-radius:var(--border-radius);padding:.1em .3em}.settings-markdown[data-v-5d3cebad] li{position:relative}.settings-markdown[data-v-5d3cebad] ul,.settings-markdown[data-v-5d3cebad] ol{padding-inline-start:10px;margin-inline-start:10px}.settings-markdown[data-v-5d3cebad] ul li{list-style-type:disc}.settings-markdown[data-v-5d3cebad] ul>li>ul>li{list-style-type:circle}.settings-markdown[data-v-5d3cebad] ul>li>ul>li ul li{list-style-type:square}.settings-markdown[data-v-5d3cebad] blockquote{padding-inline-start:1em;border-inline-start:4px solid var(--color-primary-element);color:var(--color-text-maxcontrast);margin-inline:0}","",{version:3,sources:["webpack://./apps/settings/src/components/Markdown.vue"],names:[],mappings:"AAGA,0OAMC,eAAA,CACA,gBAAA,CACA,eAAA,CACA,kBAAA,CACA,4BAAA,CAGD,uCACC,cAAA,CACA,eAAA,CAGD,uCACC,cAAA,CACA,eAAA,CAGD,uCACC,cAAA,CAGD,uCACC,cAAA,CAGD,uCACC,cAAA,CAGD,uCACC,kCAAA,CAGD,wCACC,eAAA,CACA,eAAA,CACA,6CAAA,CACA,kCAAA,CACA,iBAAA,CACA,iBAAA,CAGD,2CACC,6CAAA,CACA,kCAAA,CACA,iBAAA,CAGD,uCACC,iBAAA,CAGD,8EACC,yBAAA,CACA,wBAAA,CAGD,0CACC,oBAAA,CAGD,gDACC,sBAAA,CAGD,sDACC,sBAAA,CAGD,+CACC,wBAAA,CACA,0DAAA,CACA,mCAAA,CACA,eAAA",sourcesContent:["\n.settings-markdown::v-deep {\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6 {\n\tfont-weight: 600;\n\tline-height: 120%;\n\tmargin-top: 24px;\n\tmargin-bottom: 12px;\n\tcolor: var(--color-main-text);\n}\n\nh1 {\n\tfont-size: 36px;\n\tmargin-top: 48px;\n}\n\nh2 {\n\tfont-size: 28px;\n\tmargin-top: 48px;\n}\n\nh3 {\n\tfont-size: 24px;\n}\n\nh4 {\n\tfont-size: 21px;\n}\n\nh5 {\n\tfont-size: 17px;\n}\n\nh6 {\n\tfont-size: var(--default-font-size);\n}\n\npre {\n\twhite-space: pre;\n\toverflow-x: auto;\n\tbackground-color: var(--color-background-dark);\n\tborder-radius: var(--border-radius);\n\tpadding: 1em 1.3em;\n\tmargin-bottom: 1em;\n}\n\np code {\n\tbackground-color: var(--color-background-dark);\n\tborder-radius: var(--border-radius);\n\tpadding: .1em .3em;\n}\n\nli {\n\tposition: relative;\n}\n\nul, ol {\n\tpadding-inline-start: 10px;\n\tmargin-inline-start: 10px;\n}\n\nul li {\n\tlist-style-type: disc;\n}\n\nul > li > ul > li {\n\tlist-style-type: circle;\n}\n\nul > li > ul > li ul li {\n\tlist-style-type: square;\n}\n\nblockquote {\n\tpadding-inline-start: 1em;\n\tborder-inline-start: 4px solid var(--color-primary-element);\n\tcolor: var(--color-text-maxcontrast);\n\tmargin-inline: 0;\n}\n\n}\n"],sourceRoot:""}]);const r=o},17525:(t,e,a)=>{a.d(e,{A:()=>r});var n=a(71354),i=a.n(n),s=a(76314),o=a.n(s)()(i());o.push([t.id,".app-sidebar--with-screenshot[data-v-2f300fa2] .app-sidebar-header__figure{background-size:cover}.app-sidebar__fallback-icon[data-v-2f300fa2]{width:100%;height:100%}.app-sidebar__badges[data-v-2f300fa2]{display:flex;flex-direction:row;gap:12px}.app-sidebar__version[data-v-2f300fa2]{color:var(--color-text-maxcontrast)}","",{version:3,sources:["webpack://./apps/settings/src/views/AppStoreSidebar.vue"],names:[],mappings:"AAIE,2EACC,qBAAA,CAIF,6CAEC,UAAA,CACA,WAAA,CAGD,sCACC,YAAA,CACA,kBAAA,CACA,QAAA,CAGD,uCACC,mCAAA",sourcesContent:["\n.app-sidebar {\n\t// If a screenshot is available it should cover the whole figure\n\t&--with-screenshot {\n\t\t:deep(.app-sidebar-header__figure) {\n\t\t\tbackground-size: cover;\n\t\t}\n\t}\n\n\t&__fallback-icon {\n\t\t// both 100% to center the icon\n\t\twidth: 100%;\n\t\theight: 100%;\n\t}\n\n\t&__badges {\n\t\tdisplay: flex;\n\t\tflex-direction: row;\n\t\tgap: 12px;\n\t}\n\n\t&__version {\n\t\tcolor: var(--color-text-maxcontrast);\n\t}\n}\n"],sourceRoot:""}]);const r=o},96285:(t,e,a)=>{a.d(e,{A:()=>r});var n=a(71354),i=a.n(n),s=a(76314),o=a.n(s)()(i());o.push([t.id,"\n.app-score__wrapper[data-v-2193f4e0] {\n\tdisplay: inline-flex;\n\tcolor: var(--color-favorite, #a08b00);\n> *[data-v-2193f4e0] {\n\t\tvertical-align: text-bottom;\n}\n}\n","",{version:3,sources:["webpack://./apps/settings/src/components/AppList/AppScore.vue"],names:[],mappings:";AA+DA;CACA,oBAAA;CACA,qCAAA;AAEA;EACA,2BAAA;AACA;AACA",sourcesContent:['\x3c!--\n - SPDX-FileCopyrightText: 2018 Nextcloud GmbH and Nextcloud contributors\n - SPDX-License-Identifier: AGPL-3.0-or-later\n--\x3e\n\n<template>\n\t<span role="img"\n\t\t:aria-label="title"\n\t\t:title="title"\n\t\tclass="app-score__wrapper">\n\t\t<NcIconSvgWrapper v-for="index in fullStars"\n\t\t\t:key="`full-star-${index}`"\n\t\t\t:path="mdiStar"\n\t\t\tinline />\n\t\t<NcIconSvgWrapper v-if="hasHalfStar" :path="mdiStarHalfFull" inline />\n\t\t<NcIconSvgWrapper v-for="index in emptyStars"\n\t\t\t:key="`empty-star-${index}`"\n\t\t\t:path="mdiStarOutline"\n\t\t\tinline />\n\t</span>\n</template>\n<script lang="ts">\nimport NcIconSvgWrapper from \'@nextcloud/vue/dist/Components/NcIconSvgWrapper.js\'\nimport { mdiStar, mdiStarHalfFull, mdiStarOutline } from \'@mdi/js\'\nimport { translate as t } from \'@nextcloud/l10n\'\nimport { defineComponent } from \'vue\'\n\nexport default defineComponent({\n\tname: \'AppScore\',\n\tcomponents: {\n\t\tNcIconSvgWrapper,\n\t},\n\tprops: {\n\t\tscore: {\n\t\t\ttype: Number,\n\t\t\trequired: true,\n\t\t},\n\t},\n\tsetup() {\n\t\treturn {\n\t\t\tmdiStar,\n\t\t\tmdiStarHalfFull,\n\t\t\tmdiStarOutline,\n\t\t}\n\t},\n\tcomputed: {\n\t\ttitle() {\n\t\t\tconst appScore = (this.score * 5).toFixed(1)\n\t\t\treturn t(\'settings\', \'Community rating: {score}/5\', { score: appScore })\n\t\t},\n\t\tfullStars() {\n\t\t\treturn Math.floor(this.score * 5 + 0.25)\n\t\t},\n\t\temptyStars() {\n\t\t\treturn Math.min(Math.floor((1 - this.score) * 5 + 0.25), 5 - this.fullStars)\n\t\t},\n\t\thasHalfStar() {\n\t\t\treturn (this.fullStars + this.emptyStars) < 5\n\t\t},\n\t},\n})\n<\/script>\n<style scoped>\n.app-score__wrapper {\n\tdisplay: inline-flex;\n\tcolor: var(--color-favorite, #a08b00);\n\n\t> * {\n\t\tvertical-align: text-bottom;\n\t}\n}\n</style>\n'],sourceRoot:""}]);const r=o},43484:(t,e,a)=>{a.d(e,{A:()=>r});var n=a(71354),i=a.n(n),s=a(76314),o=a.n(s)()(i());o.push([t.id,"\n.empty-content__loading[data-v-f9073bbe] {\n\theight: 100%;\n}\n.app-settings-content__label[data-v-f9073bbe] {\n\tmargin-block-start: var(--app-navigation-padding);\n\tmargin-inline-start: calc(var(--default-clickable-area) + var(--app-navigation-padding) * 2);\n\tmin-height: var(--default-clickable-area);\n\tline-height: var(--default-clickable-area);\n\tvertical-align: center;\n}\n","",{version:3,sources:["webpack://./apps/settings/src/views/AppStore.vue"],names:[],mappings:";AAkEA;CACA,YAAA;AACA;AAEA;CACA,iDAAA;CACA,4FAAA;CACA,yCAAA;CACA,0CAAA;CACA,sBAAA;AACA",sourcesContent:["\x3c!--\n - SPDX-FileCopyrightText: 2018 Nextcloud GmbH and Nextcloud contributors\n - SPDX-License-Identifier: AGPL-3.0-or-later\n--\x3e\n\n<template>\n\t\x3c!-- Apps list --\x3e\n\t<NcAppContent class=\"app-settings-content\"\n\t\t:page-heading=\"appStoreLabel\">\n\t\t<h2 class=\"app-settings-content__label\" v-text=\"viewLabel\" />\n\n\t\t<AppStoreDiscoverSection v-if=\"currentCategory === 'discover'\" />\n\t\t<NcEmptyContent v-else-if=\"isLoading\"\n\t\t\tclass=\"empty-content__loading\"\n\t\t\t:name=\"t('settings', 'Loading app list')\">\n\t\t\t<template #icon>\n\t\t\t\t<NcLoadingIcon :size=\"64\" />\n\t\t\t</template>\n\t\t</NcEmptyContent>\n\t\t<AppList v-else :category=\"currentCategory\" />\n\t</NcAppContent>\n</template>\n\n<script setup lang=\"ts\">\nimport { translate as t } from '@nextcloud/l10n'\nimport { computed, getCurrentInstance, onBeforeMount, watchEffect } from 'vue'\nimport { useRoute } from 'vue-router/composables'\n\nimport { useAppsStore } from '../store/apps-store'\nimport { APPS_SECTION_ENUM } from '../constants/AppsConstants'\n\nimport NcAppContent from '@nextcloud/vue/dist/Components/NcAppContent.js'\nimport NcEmptyContent from '@nextcloud/vue/dist/Components/NcEmptyContent.js'\nimport NcLoadingIcon from '@nextcloud/vue/dist/Components/NcLoadingIcon.js'\nimport AppList from '../components/AppList.vue'\nimport AppStoreDiscoverSection from '../components/AppStoreDiscover/AppStoreDiscoverSection.vue'\n\nconst route = useRoute()\nconst store = useAppsStore()\n\n/**\n * ID of the current active category, default is `discover`\n */\nconst currentCategory = computed(() => route.params?.category ?? 'discover')\n\nconst appStoreLabel = t('settings', 'App Store')\nconst viewLabel = computed(() => APPS_SECTION_ENUM[currentCategory.value] ?? store.getCategoryById(currentCategory.value)?.displayName ?? appStoreLabel)\n\nwatchEffect(() => {\n\twindow.document.title = `${viewLabel.value} - ${appStoreLabel} - Nextcloud`\n})\n\n// TODO this part should be migrated to pinia\nconst instance = getCurrentInstance()\n/** Is the app list loading */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst isLoading = computed(() => (instance?.proxy as any).$store.getters.loading('list'))\nonBeforeMount(() => {\n\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\t(instance?.proxy as any).$store.dispatch('getCategories', { shouldRefetchCategories: true });\n\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\t(instance?.proxy as any).$store.dispatch('getAllApps')\n})\n<\/script>\n\n<style scoped>\n.empty-content__loading {\n\theight: 100%;\n}\n\n.app-settings-content__label {\n\tmargin-block-start: var(--app-navigation-padding);\n\tmargin-inline-start: calc(var(--default-clickable-area) + var(--app-navigation-padding) * 2);\n\tmin-height: var(--default-clickable-area);\n\tline-height: var(--default-clickable-area);\n\tvertical-align: center;\n}\n</style>\n"],sourceRoot:""}]);const r=o},63139:(t,e,a)=>{a.d(e,{A:()=>r});var n=a(71354),i=a.n(n),s=a(76314),o=a.n(s)()(i());o.push([t.id,"\n/* The categories-loading indicator */\n.categories--loading[data-v-26201909] {\n\tflex: 1;\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n}\n","",{version:3,sources:["webpack://./apps/settings/src/views/AppStoreNavigation.vue"],names:[],mappings:";AA2IA,qCAAA;AACA;CACA,OAAA;CACA,aAAA;CACA,mBAAA;CACA,uBAAA;AACA",sourcesContent:['\x3c!--\n - SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors\n - SPDX-License-Identifier: AGPL-3.0-or-later\n--\x3e\n<template>\n\t\x3c!-- Categories & filters --\x3e\n\t<NcAppNavigation :aria-label="t(\'settings\', \'Apps\')">\n\t\t<template #list>\n\t\t\t<NcAppNavigationItem v-if="appstoreEnabled"\n\t\t\t\tid="app-category-discover"\n\t\t\t\t:to="{ name: \'apps-category\', params: { category: \'discover\'} }"\n\t\t\t\t:name="APPS_SECTION_ENUM.discover">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<NcIconSvgWrapper :path="APPSTORE_CATEGORY_ICONS.discover" />\n\t\t\t\t</template>\n\t\t\t</NcAppNavigationItem>\n\t\t\t<NcAppNavigationItem id="app-category-installed"\n\t\t\t\t:to="{ name: \'apps-category\', params: { category: \'installed\'} }"\n\t\t\t\t:name="APPS_SECTION_ENUM.installed">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<NcIconSvgWrapper :path="APPSTORE_CATEGORY_ICONS.installed" />\n\t\t\t\t</template>\n\t\t\t</NcAppNavigationItem>\n\t\t\t<NcAppNavigationItem id="app-category-enabled"\n\t\t\t\t:to="{ name: \'apps-category\', params: { category: \'enabled\' } }"\n\t\t\t\t:name="APPS_SECTION_ENUM.enabled">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<NcIconSvgWrapper :path="APPSTORE_CATEGORY_ICONS.enabled" />\n\t\t\t\t</template>\n\t\t\t</NcAppNavigationItem>\n\t\t\t<NcAppNavigationItem id="app-category-disabled"\n\t\t\t\t:to="{ name: \'apps-category\', params: { category: \'disabled\' } }"\n\t\t\t\t:name="APPS_SECTION_ENUM.disabled">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<NcIconSvgWrapper :path="APPSTORE_CATEGORY_ICONS.disabled" />\n\t\t\t\t</template>\n\t\t\t</NcAppNavigationItem>\n\t\t\t<NcAppNavigationItem v-if="updateCount > 0"\n\t\t\t\tid="app-category-updates"\n\t\t\t\t:to="{ name: \'apps-category\', params: { category: \'updates\' } }"\n\t\t\t\t:name="APPS_SECTION_ENUM.updates">\n\t\t\t\t<template #counter>\n\t\t\t\t\t<NcCounterBubble>{{ updateCount }}</NcCounterBubble>\n\t\t\t\t</template>\n\t\t\t\t<template #icon>\n\t\t\t\t\t<NcIconSvgWrapper :path="APPSTORE_CATEGORY_ICONS.updates" />\n\t\t\t\t</template>\n\t\t\t</NcAppNavigationItem>\n\t\t\t<NcAppNavigationItem id="app-category-your-bundles"\n\t\t\t\t:to="{ name: \'apps-category\', params: { category: \'app-bundles\' } }"\n\t\t\t\t:name="APPS_SECTION_ENUM[\'app-bundles\']">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<NcIconSvgWrapper :path="APPSTORE_CATEGORY_ICONS.bundles" />\n\t\t\t\t</template>\n\t\t\t</NcAppNavigationItem>\n\n\t\t\t<NcAppNavigationSpacer />\n\n\t\t\t\x3c!-- App store categories --\x3e\n\t\t\t<li v-if="appstoreEnabled && categoriesLoading" class="categories--loading">\n\t\t\t\t<NcLoadingIcon :size="20" :aria-label="t(\'settings\', \'Loading categories\')" />\n\t\t\t</li>\n\t\t\t<template v-else-if="appstoreEnabled && !categoriesLoading">\n\t\t\t\t<NcAppNavigationItem v-if="isSubscribed"\n\t\t\t\t\tid="app-category-supported"\n\t\t\t\t\t:to="{ name: \'apps-category\', params: { category: \'supported\' } }"\n\t\t\t\t\t:name="APPS_SECTION_ENUM.supported">\n\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t<NcIconSvgWrapper :path="APPSTORE_CATEGORY_ICONS.supported" />\n\t\t\t\t\t</template>\n\t\t\t\t</NcAppNavigationItem>\n\t\t\t\t<NcAppNavigationItem id="app-category-featured"\n\t\t\t\t\t:to="{ name: \'apps-category\', params: { category: \'featured\' } }"\n\t\t\t\t\t:name="APPS_SECTION_ENUM.featured">\n\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t<NcIconSvgWrapper :path="APPSTORE_CATEGORY_ICONS.featured" />\n\t\t\t\t\t</template>\n\t\t\t\t</NcAppNavigationItem>\n\n\t\t\t\t<NcAppNavigationItem v-for="category in categories"\n\t\t\t\t\t:id="`app-category-${category.id}`"\n\t\t\t\t\t:key="category.id"\n\t\t\t\t\t:name="category.displayName"\n\t\t\t\t\t:to="{\n\t\t\t\t\t\tname: \'apps-category\',\n\t\t\t\t\t\tparams: { category: category.id },\n\t\t\t\t\t}">\n\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t<NcIconSvgWrapper :path="category.icon" />\n\t\t\t\t\t</template>\n\t\t\t\t</NcAppNavigationItem>\n\t\t\t</template>\n\n\t\t\t<NcAppNavigationItem id="app-developer-docs"\n\t\t\t\t:name="t(\'settings\', \'Developer documentation ↗\')"\n\t\t\t\t:href="developerDocsUrl" />\n\t\t</template>\n\t</NcAppNavigation>\n</template>\n\n<script setup lang="ts">\nimport { loadState } from \'@nextcloud/initial-state\'\nimport { translate as t } from \'@nextcloud/l10n\'\nimport { computed, onBeforeMount } from \'vue\'\nimport { APPS_SECTION_ENUM } from \'../constants/AppsConstants\'\nimport { useAppsStore } from \'../store/apps-store\'\n\nimport NcAppNavigation from \'@nextcloud/vue/dist/Components/NcAppNavigation.js\'\nimport NcAppNavigationItem from \'@nextcloud/vue/dist/Components/NcAppNavigationItem.js\'\nimport NcAppNavigationSpacer from \'@nextcloud/vue/dist/Components/NcAppNavigationSpacer.js\'\nimport NcCounterBubble from \'@nextcloud/vue/dist/Components/NcCounterBubble.js\'\nimport NcIconSvgWrapper from \'@nextcloud/vue/dist/Components/NcIconSvgWrapper.js\'\nimport NcLoadingIcon from \'@nextcloud/vue/dist/Components/NcLoadingIcon.js\'\n\nimport APPSTORE_CATEGORY_ICONS from \'../constants/AppstoreCategoryIcons.ts\'\n\nconst updateCount = loadState<number>(\'settings\', \'appstoreUpdateCount\', 0)\nconst appstoreEnabled = loadState<boolean>(\'settings\', \'appstoreEnabled\', true)\nconst developerDocsUrl = loadState<string>(\'settings\', \'appstoreDeveloperDocs\', \'\')\n\nconst store = useAppsStore()\nconst categories = computed(() => store.categories)\nconst categoriesLoading = computed(() => store.loading.categories)\n\n/**\n * Check if the current instance has a support subscription from the Nextcloud GmbH\n *\n * For customers of the Nextcloud GmbH the app level will be set to `300` for apps that are supported in their subscription\n */\nconst isSubscribed = computed(() => store.apps.find(({ level }) => level === 300) !== undefined)\n\n// load categories when component is mounted\nonBeforeMount(() => {\n\tstore.loadCategories()\n\tstore.loadApps()\n})\n<\/script>\n\n<style scoped>\n/* The categories-loading indicator */\n.categories--loading {\n\tflex: 1;\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n}\n</style>\n'],sourceRoot:""}]);const r=o},82692:(t,e,a)=>{a.d(e,{A:()=>S});var n=a(18881),i=a(11516),s=a(45834);const o={name:"SvgFilterMixin",data:()=>({filterId:""}),computed:{filterUrl(){return`url(#${this.filterId})`}},mounted(){this.filterId="invertIconApps-"+Math.random().toString(36).substring(2)}};var r=a(14486);const p=(0,r.A)(o,void 0,void 0,!1,null,null,null).exports;var l=a(18740);const c={name:"AppItem",components:{AppLevelBadge:i.A,AppScore:n.A,NcButton:l.A},mixins:[s.A,p],props:{app:{type:Object,required:!0},category:{type:String,required:!0},listView:{type:Boolean,default:!0},useBundleView:{type:Boolean,default:!1},headers:{type:String,default:null},inline:{type:Boolean,default:!1}},data:()=>({isSelected:!1,scrolled:!1,screenshotLoaded:!1}),computed:{hasRating(){return this.app.appstoreData&&this.app.appstoreData.ratingNumOverall>5},dataItemTag(){return this.listView?"td":"div"},withSidebar(){return!!this.$route.params.id}},watch:{"$route.params.id"(t){this.isSelected=this.app.id===t}},mounted(){if(this.isSelected=this.app.id===this.$route.params.id,this.app.releases&&this.app.screenshot){const t=new Image;t.onload=()=>{this.screenshotLoaded=!0},t.src=this.app.screenshot}},watchers:{},methods:{prefix:(t,e)=>t+"_"+e,getDataItemHeaders(t){return this.useBundleView?[this.headers,t].join(" "):null}}};var d=a(85072),A=a.n(d),u=a(97825),g=a.n(u),m=a(77659),v=a.n(m),h=a(55056),C=a.n(h),f=a(10540),b=a.n(f),_=a(41113),y=a.n(_),x=a(89668),w={};w.styleTagTransform=y(),w.setAttributes=C(),w.insert=v().bind(null,"head"),w.domAPI=g(),w.insertStyleElement=b(),A()(x.A,w),x.A&&x.A.locals&&x.A.locals;const S=(0,r.A)(c,(function(){var t=this,e=t._self._c;return e(t.listView?"tr":t.inline?"article":"li",{tag:"component",staticClass:"app-item",class:{"app-item--list-view":t.listView,"app-item--store-view":!t.listView,"app-item--selected":t.isSelected,"app-item--with-sidebar":t.withSidebar}},[e(t.dataItemTag,{tag:"component",staticClass:"app-image app-image-icon",attrs:{headers:t.getDataItemHeaders("app-table-col-icon")}},[t.listView&&!t.app.preview||!t.listView&&!t.screenshotLoaded?e("div",{staticClass:"icon-settings-dark"}):t.listView&&t.app.preview?e("svg",{attrs:{width:"32",height:"32",viewBox:"0 0 32 32"}},[e("image",{staticClass:"app-icon",attrs:{x:"0",y:"0",width:"32",height:"32",preserveAspectRatio:"xMinYMin meet","xlink:href":t.app.preview}})]):t._e(),t._v(" "),!t.listView&&t.app.screenshot&&t.screenshotLoaded?e("img",{attrs:{src:t.app.screenshot,alt:""}}):t._e()]),t._v(" "),e(t.dataItemTag,{tag:"component",staticClass:"app-name",attrs:{headers:t.getDataItemHeaders("app-table-col-name")}},[e("router-link",{staticClass:"app-name--link",attrs:{to:{name:"apps-details",params:{category:t.category,id:t.app.id}},"aria-label":t.t("settings","Show details for {appName} app",{appName:t.app.name})}},[t._v("\n\t\t\t"+t._s(t.app.name)+"\n\t\t")])],1),t._v(" "),t.listView?t._e():e(t.dataItemTag,{tag:"component",staticClass:"app-summary",attrs:{headers:t.getDataItemHeaders("app-version")}},[t._v("\n\t\t"+t._s(t.app.summary)+"\n\t")]),t._v(" "),t.listView?e(t.dataItemTag,{tag:"component",staticClass:"app-version",attrs:{headers:t.getDataItemHeaders("app-table-col-version")}},[t.app.version?e("span",[t._v(t._s(t.app.version))]):t.app.appstoreData.releases[0].version?e("span",[t._v(t._s(t.app.appstoreData.releases[0].version))]):t._e()]):t._e(),t._v(" "),e(t.dataItemTag,{tag:"component",staticClass:"app-level",attrs:{headers:t.getDataItemHeaders("app-table-col-level")}},[e("AppLevelBadge",{attrs:{level:t.app.level}}),t._v(" "),t.hasRating&&!t.listView?e("AppScore",{attrs:{score:t.app.score}}):t._e()],1),t._v(" "),t.inline?t._e():e(t.dataItemTag,{tag:"component",staticClass:"app-actions",attrs:{headers:t.getDataItemHeaders("app-table-col-actions")}},[t.app.error?e("div",{staticClass:"warning"},[t._v("\n\t\t\t"+t._s(t.app.error)+"\n\t\t")]):t._e(),t._v(" "),t.isLoading?e("div",{staticClass:"icon icon-loading-small"}):t._e(),t._v(" "),t.app.update?e("NcButton",{attrs:{type:"primary",disabled:t.installing||t.isLoading},on:{click:function(e){return e.stopPropagation(),t.update(t.app.id)}}},[t._v("\n\t\t\t"+t._s(t.t("settings","Update to {update}",{update:t.app.update}))+"\n\t\t")]):t._e(),t._v(" "),t.app.canUnInstall?e("NcButton",{staticClass:"uninstall",attrs:{type:"tertiary",disabled:t.installing||t.isLoading},on:{click:function(e){return e.stopPropagation(),t.remove(t.app.id)}}},[t._v("\n\t\t\t"+t._s(t.t("settings","Remove"))+"\n\t\t")]):t._e(),t._v(" "),t.app.active?e("NcButton",{attrs:{disabled:t.installing||t.isLoading},on:{click:function(e){return e.stopPropagation(),t.disable(t.app.id)}}},[t._v("\n\t\t\t"+t._s(t.t("settings","Disable"))+"\n\t\t")]):t._e(),t._v(" "),t.app.active||!t.app.canInstall&&!t.app.isCompatible?t.app.active?t._e():e("NcButton",{attrs:{title:t.forceEnableButtonTooltip,"aria-label":t.forceEnableButtonTooltip,type:"secondary",disabled:t.installing||t.isLoading},on:{click:function(e){return e.stopPropagation(),t.forceEnable(t.app.id)}}},[t._v("\n\t\t\t"+t._s(t.forceEnableButtonText)+"\n\t\t")]):e("NcButton",{attrs:{title:t.enableButtonTooltip,"aria-label":t.enableButtonTooltip,type:"primary",disabled:!t.app.canInstall||t.installing||t.isLoading},on:{click:function(e){return e.stopPropagation(),t.enable(t.app.id)}}},[t._v("\n\t\t\t"+t._s(t.enableButtonText)+"\n\t\t")])],1)],1)}),[],!1,null,"4f1b9f2a",null).exports},11516:(t,e,a)=>{a.d(e,{A:()=>y});var n=a(85471),i=a(6695),s=a(9165),o=a(53334);const r=(0,n.pM)({__name:"AppLevelBadge",props:{level:null},setup(t){const e=t,a=(0,n.EW)((()=>300===e.level)),r=(0,n.EW)((()=>200===e.level)),p=(0,n.EW)((()=>a.value?s.Yk:s.Tfj)),l=(0,n.EW)((()=>a.value?(0,o.Tl)("settings","Supported"):(0,o.Tl)("settings","Featured"))),c=(0,n.EW)((()=>a.value?(0,o.Tl)("settings","This app is supported via your current Nextcloud subscription."):(0,o.Tl)("settings","Featured apps are developed by and within the community. They offer central functionality and are ready for production use.")));return{__sfc:!0,props:e,isSupported:a,isFeatured:r,badgeIcon:p,badgeText:l,badgeTitle:c,NcIconSvgWrapper:i.A}}});var p=a(85072),l=a.n(p),c=a(97825),d=a.n(c),A=a(77659),u=a.n(A),g=a(55056),m=a.n(g),v=a(10540),h=a.n(v),C=a(41113),f=a.n(C),b=a(13331),_={};_.styleTagTransform=f(),_.setAttributes=m(),_.insert=u().bind(null,"head"),_.domAPI=d(),_.insertStyleElement=h(),l()(b.A,_),b.A&&b.A.locals&&b.A.locals;const y=(0,a(14486).A)(r,(function(){var t=this,e=t._self._c,a=t._self._setupProxy;return a.isSupported||a.isFeatured?e("span",{staticClass:"app-level-badge",class:{"app-level-badge--supported":a.isSupported},attrs:{title:a.badgeTitle}},[e(a.NcIconSvgWrapper,{attrs:{path:a.badgeIcon,size:20,inline:""}}),t._v("\n\t"+t._s(a.badgeText)+"\n")],1):t._e()}),[],!1,null,"5ee601b2",null).exports},18881:(t,e,a)=>{a.d(e,{A:()=>_});var n=a(6695),i=a(9165),s=a(53334);const o=(0,a(85471).pM)({name:"AppScore",components:{NcIconSvgWrapper:n.A},props:{score:{type:Number,required:!0}},setup:()=>({mdiStar:i.ZL5,mdiStarHalfFull:i.tdF,mdiStarOutline:i.dF}),computed:{title(){const t=(5*this.score).toFixed(1);return(0,s.Tl)("settings","Community rating: {score}/5",{score:t})},fullStars(){return Math.floor(5*this.score+.25)},emptyStars(){return Math.min(Math.floor(5*(1-this.score)+.25),5-this.fullStars)},hasHalfStar(){return this.fullStars+this.emptyStars<5}}});var r=a(85072),p=a.n(r),l=a(97825),c=a.n(l),d=a(77659),A=a.n(d),u=a(55056),g=a.n(u),m=a(10540),v=a.n(m),h=a(41113),C=a.n(h),f=a(96285),b={};b.styleTagTransform=C(),b.setAttributes=g(),b.insert=A().bind(null,"head"),b.domAPI=c(),b.insertStyleElement=v(),p()(f.A,b),f.A&&f.A.locals&&f.A.locals;const _=(0,a(14486).A)(o,(function(){var t=this,e=t._self._c;return t._self._setupProxy,e("span",{staticClass:"app-score__wrapper",attrs:{role:"img","aria-label":t.title,title:t.title}},[t._l(t.fullStars,(function(a){return e("NcIconSvgWrapper",{key:`full-star-${a}`,attrs:{path:t.mdiStar,inline:""}})})),t._v(" "),t.hasHalfStar?e("NcIconSvgWrapper",{attrs:{path:t.mdiStarHalfFull,inline:""}}):t._e(),t._v(" "),t._l(t.emptyStars,(function(a){return e("NcIconSvgWrapper",{key:`empty-star-${a}`,attrs:{path:t.mdiStarOutline,inline:""}})}))],2)}),[],!1,null,"2193f4e0",null).exports},91114:(e,a,n)=>{n.r(a),n.d(a,{default:()=>ot});var i=n(85471),s=n(53334),o=n(24387),r=n(846),p=n(92973),l=n(18195),c=n(34196),d=n(84237),A=n(61338),u=n(82692);function g(t,e,a){(function(t,e){if(e.has(t))throw new TypeError("Cannot initialize the same private elements twice on an object")})(t,e),e.set(t,a)}function m(t,e,a){return t.set(h(t,e),a),a}function v(t,e){return t.get(h(t,e))}function h(t,e,a){if("function"==typeof t?t===e:t.has(e))return arguments.length<3?e:a;throw new TypeError("Private element is not present on this object")}function C(t,e,a){return(e=function(t){var e=function(t){if("object"!=typeof t||!t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var a=e.call(t,"string");if("object"!=typeof a)return a;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(t);return"symbol"==typeof e?e:e+""}(e))in t?Object.defineProperty(t,e,{value:a,enumerable:!0,configurable:!0,writable:!0}):t[e]=a,t}class f{constructor(t){C(this,"value",void 0),C(this,"next",void 0),this.value=t}}var b=new WeakMap,_=new WeakMap,y=new WeakMap;class x{constructor(){g(this,b,void 0),g(this,_,void 0),g(this,y,void 0),this.clear()}enqueue(t){var e;const a=new f(t);v(b,this)?(v(_,this).next=a,m(_,this,a)):(m(b,this,a),m(_,this,a)),m(y,this,(e=v(y,this),++e))}dequeue(){var t;const e=v(b,this);if(e)return m(b,this,v(b,this).next),m(y,this,(t=v(y,this),--t)),e.value}peek(){if(v(b,this))return v(b,this).value}clear(){m(b,this,void 0),m(_,this,void 0),m(y,this,0)}get size(){return v(y,this)}*[Symbol.iterator](){let t=v(b,this);for(;t;)yield t.value,t=t.next}}function w(t){S(t);const e=new x;let a=0;const n=()=>{a<t&&e.size>0&&(e.dequeue()(),a++)},i=async(t,e,i)=>{const s=(async()=>t(...i))();e(s);try{await s}catch{}a--,n()},s=function(s){for(var o=arguments.length,r=new Array(o>1?o-1:0),p=1;p<o;p++)r[p-1]=arguments[p];return new Promise((o=>{((s,o,r)=>{new Promise((t=>{e.enqueue(t)})).then(i.bind(void 0,s,o,r)),(async()=>{await Promise.resolve(),a<t&&n()})()})(s,o,r)}))};return Object.defineProperties(s,{activeCount:{get:()=>a},pendingCount:{get:()=>e.size},clearQueue:{value(){e.clear()}},concurrency:{get:()=>t,set(i){S(i),t=i,queueMicrotask((()=>{for(;a<t&&e.size>0;)n()}))}}}),s}function S(t){if(!Number.isInteger(t)&&t!==Number.POSITIVE_INFINITY||!(t>0))throw new TypeError("Expected `concurrency` to be a number from 1 and up")}var k=n(18740),N=n(96763);const I={name:"AppList",components:{AppItem:u.A,NcButton:k.A},props:{category:{type:String,required:!0}},data:()=>({search:""}),computed:{counter(){return this.apps.filter((t=>t.update)).length},loading(){return this.$store.getters.loading("list")},hasPendingUpdate(){return this.apps.filter((t=>t.update)).length>0},showUpdateAll(){return this.hasPendingUpdate&&this.useListView},apps(){const t=this.$store.getters.getAllApps.filter((t=>-1!==t.name.toLowerCase().search(this.search.toLowerCase()))).sort((function(t,e){const a=""+(t.active?0:1)+(t.update?0:1)+t.name,n=""+(e.active?0:1)+(e.update?0:1)+e.name;return OC.Util.naturalSortCompare(a,n)}));return"installed"===this.category?t.filter((t=>t.installed)):"enabled"===this.category?t.filter((t=>t.active&&t.installed)):"disabled"===this.category?t.filter((t=>!t.active&&t.installed)):"app-bundles"===this.category?t.filter((t=>t.bundles)):"updates"===this.category?t.filter((t=>t.update)):"supported"===this.category?t.filter((t=>300===t.level)):"featured"===this.category?t.filter((t=>200===t.level)):t.filter((t=>t.appstore&&void 0!==t.category&&(t.category===this.category||t.category.indexOf(this.category)>-1)))},bundles(){return this.$store.getters.getAppBundles.filter((t=>this.bundleApps(t.id).length>0))},bundleApps:()=>function(t){return this.$store.getters.getAllApps.filter((e=>void 0!==e.bundleIds&&e.bundleIds.includes(t)))},searchApps(){return""===this.search?[]:this.$store.getters.getAllApps.filter((t=>-1!==t.name.toLowerCase().search(this.search.toLowerCase())&&!this.apps.find((e=>e.id===t.id))))},useAppStoreView(){return!this.useListView&&!this.useBundleView},useListView(){return"installed"===this.category||"enabled"===this.category||"disabled"===this.category||"updates"===this.category||"featured"===this.category||"supported"===this.category},useBundleView(){return"app-bundles"===this.category},allBundlesEnabled(){return t=>0===this.bundleApps(t).filter((t=>!t.active)).length},bundleToggleText(){return e=>this.allBundlesEnabled(e)?t("settings","Disable all"):t("settings","Download and enable all")}},beforeDestroy(){(0,A.al)("nextcloud:unified-search.search",this.setSearch),(0,A.al)("nextcloud:unified-search.reset",this.resetSearch)},mounted(){(0,A.B1)("nextcloud:unified-search.search",this.setSearch),(0,A.B1)("nextcloud:unified-search.reset",this.resetSearch)},methods:{setSearch(t){let{query:e}=t;this.search=e},resetSearch(){this.search=""},toggleBundle(t){return this.allBundlesEnabled(t)?this.disableBundle(t):this.enableBundle(t)},enableBundle(t){const e=this.bundleApps(t).map((t=>t.id));this.$store.dispatch("enableApp",{appId:e,groups:[]}).catch((t=>{N.error(t),OC.Notification.show(t)}))},disableBundle(t){const e=this.bundleApps(t).map((t=>t.id));this.$store.dispatch("disableApp",{appId:e,groups:[]}).catch((t=>{OC.Notification.show(t)}))},updateAll(){const t=w(1);this.apps.filter((t=>t.update)).map((e=>t((()=>this.$store.dispatch("updateApp",{appId:e.id})))))}}};var E=n(85072),T=n.n(E),D=n(97825),B=n.n(D),$=n(77659),P=n.n($),L=n(55056),O=n.n(L),G=n(10540),R=n.n(G),W=n(41113),U=n.n(W),M=n(35534),z={};z.styleTagTransform=U(),z.setAttributes=O(),z.insert=P().bind(null,"head"),z.domAPI=B(),z.insertStyleElement=R(),T()(M.A,z),M.A&&M.A.locals&&M.A.locals;var F=n(14486);const Y=(0,F.A)(I,(function(){var t=this,e=t._self._c;return e("div",{attrs:{id:"app-content-inner"}},[e("div",{staticClass:"apps-list",class:{"apps-list--list-view":t.useBundleView||t.useListView,"apps-list--store-view":t.useAppStoreView},attrs:{id:"apps-list"}},[t.useListView?[t.showUpdateAll?e("div",{staticClass:"apps-list__toolbar"},[t._v("\n\t\t\t\t"+t._s(t.n("settings","%n app has an update available","%n apps have an update available",t.counter))+"\n\t\t\t\t"),t.showUpdateAll?e("NcButton",{attrs:{id:"app-list-update-all",type:"primary"},on:{click:t.updateAll}},[t._v("\n\t\t\t\t\t"+t._s(t.n("settings","Update","Update all",t.counter))+"\n\t\t\t\t")]):t._e()],1):t._e(),t._v(" "),t.showUpdateAll?t._e():e("div",{staticClass:"apps-list__toolbar"},[t._v("\n\t\t\t\t"+t._s(t.t("settings","All apps are up-to-date."))+"\n\t\t\t")]),t._v(" "),e("TransitionGroup",{staticClass:"apps-list__list-container",attrs:{name:"apps-list",tag:"table"}},[e("tr",{key:"app-list-view-header"},[e("th",[e("span",{staticClass:"hidden-visually"},[t._v(t._s(t.t("settings","Icon")))])]),t._v(" "),e("th",[e("span",{staticClass:"hidden-visually"},[t._v(t._s(t.t("settings","Name")))])]),t._v(" "),e("th",[e("span",{staticClass:"hidden-visually"},[t._v(t._s(t.t("settings","Version")))])]),t._v(" "),e("th",[e("span",{staticClass:"hidden-visually"},[t._v(t._s(t.t("settings","Level")))])]),t._v(" "),e("th",[e("span",{staticClass:"hidden-visually"},[t._v(t._s(t.t("settings","Actions")))])])]),t._v(" "),t._l(t.apps,(function(a){return e("AppItem",{key:a.id,attrs:{app:a,category:t.category}})}))],2)]:t._e(),t._v(" "),t.useBundleView?e("table",{staticClass:"apps-list__list-container"},[e("tr",{key:"app-list-view-header"},[e("th",{attrs:{id:"app-table-col-icon"}},[e("span",{staticClass:"hidden-visually"},[t._v(t._s(t.t("settings","Icon")))])]),t._v(" "),e("th",{attrs:{id:"app-table-col-name"}},[e("span",{staticClass:"hidden-visually"},[t._v(t._s(t.t("settings","Name")))])]),t._v(" "),e("th",{attrs:{id:"app-table-col-version"}},[e("span",{staticClass:"hidden-visually"},[t._v(t._s(t.t("settings","Version")))])]),t._v(" "),e("th",{attrs:{id:"app-table-col-level"}},[e("span",{staticClass:"hidden-visually"},[t._v(t._s(t.t("settings","Level")))])]),t._v(" "),e("th",{attrs:{id:"app-table-col-actions"}},[e("span",{staticClass:"hidden-visually"},[t._v(t._s(t.t("settings","Actions")))])])]),t._v(" "),t._l(t.bundles,(function(a){return[e("tr",{key:a.id},[e("th",{attrs:{id:`app-table-rowgroup-${a.id}`,colspan:"5",scope:"rowgroup"}},[e("div",{staticClass:"apps-list__bundle-heading"},[e("span",{staticClass:"apps-list__bundle-header"},[t._v("\n\t\t\t\t\t\t\t\t"+t._s(a.name)+"\n\t\t\t\t\t\t\t")]),t._v(" "),e("NcButton",{attrs:{type:"secondary"},on:{click:function(e){return t.toggleBundle(a.id)}}},[t._v("\n\t\t\t\t\t\t\t\t"+t._s(t.t("settings",t.bundleToggleText(a.id)))+"\n\t\t\t\t\t\t\t")])],1)])]),t._v(" "),t._l(t.bundleApps(a.id),(function(n){return e("AppItem",{key:a.id+n.id,attrs:{"use-bundle-view":!0,headers:`app-table-rowgroup-${a.id}`,app:n,category:t.category}})}))]}))],2):t._e(),t._v(" "),t.useAppStoreView?e("ul",{staticClass:"apps-list__store-container"},t._l(t.apps,(function(a){return e("AppItem",{key:a.id,attrs:{app:a,category:t.category,"list-view":!1}})})),1):t._e()],2),t._v(" "),e("div",{staticClass:"apps-list apps-list--list-view",attrs:{id:"apps-list-search"}},[e("div",{staticClass:"apps-list__list-container"},[""!==t.search&&t.searchApps.length>0?e("table",{staticClass:"apps-list__list-container"},[e("caption",{staticClass:"apps-list__bundle-header"},[t._v("\n\t\t\t\t\t"+t._s(t.t("settings","Results from other categories"))+"\n\t\t\t\t")]),t._v(" "),e("tr",{key:"app-list-view-header"},[e("th",[e("span",{staticClass:"hidden-visually"},[t._v(t._s(t.t("settings","Icon")))])]),t._v(" "),e("th",[e("span",{staticClass:"hidden-visually"},[t._v(t._s(t.t("settings","Name")))])]),t._v(" "),e("th",[e("span",{staticClass:"hidden-visually"},[t._v(t._s(t.t("settings","Version")))])]),t._v(" "),e("th",[e("span",{staticClass:"hidden-visually"},[t._v(t._s(t.t("settings","Level")))])]),t._v(" "),e("th",[e("span",{staticClass:"hidden-visually"},[t._v(t._s(t.t("settings","Actions")))])])]),t._v(" "),t._l(t.searchApps,(function(a){return e("AppItem",{key:a.id,attrs:{app:a,category:t.category}})}))],2):t._e()])]),t._v(" "),""===t.search||t.loading||0!==t.searchApps.length||0!==t.apps.length?t._e():e("div",{staticClass:"emptycontent emptycontent-search",attrs:{id:"apps-list-empty"}},[e("div",{staticClass:"icon-settings-dark",attrs:{id:"app-list-empty-icon"}}),t._v(" "),e("h2",[t._v(t._s(t.t("settings","No apps found for your version")))])])])}),[],!1,null,"5cf3c7a8",null).exports;var V=n(9165),j=n(85168),q=n(63814),H=n(65043),K=n(6695),Q=n(36620);const X=t=>{const e={...t};if(e.date&&(e.date=Date.parse(e.date)),e.expiryDate&&(e.expiryDate=Date.parse(e.expiryDate)),"post"===e.type)return e;if("showcase"===e.type)return e;if("carousel"===e.type)return e;throw new Error(`Invalid argument, app discover element with type ${t.type??"unknown"} is unknown`)},Z=t=>{const e=Date.now();return!(t.date&&t.date>e||t.expiryDate&&t.expiryDate<e)},J=(0,i.pM)({__name:"AppStoreDiscoverSection",setup(t){const e=(0,i.$V)((()=>n.e(4546).then(n.bind(n,54546)))),a=(0,i.$V)((()=>n.e(9972).then(n.bind(n,79972)))),o=(0,i.$V)((()=>n.e(8737).then(n.bind(n,98737)))),r=(0,i.KR)(!1),p=(0,i.KR)([]),l=t=>{for(let e=t.length-1;e>0;e--){const a=Math.floor(Math.random()*(e+1));[t[e],t[a]]=[t[a],t[e]]}return t};return(0,i.KC)((async()=>{try{const{data:t}=await H.Ay.get((0,q.Jv)("/settings/api/apps/discover"));if(0===t.length)return Q.A.info("No app discover elements available (empty response)"),void(r.value=!0);const e=t.map(X).filter(Z),a=l(e);a.sort(((t,e)=>(t.order??1/0)<(e.order??1/0)?-1:1)),p.value=a}catch(t){r.value=!0,Q.A.error(t),(0,j.Qg)((0,s.Tl)("settings","Could not load app discover section"))}})),{__sfc:!0,PostType:e,CarouselType:a,ShowcaseType:o,hasError:r,elements:p,shuffleArray:l,getComponent:t=>"post"===t?e:"carousel"===t?a:"showcase"===t?o:(0,i.pM)({mounted:()=>Q.A.error("Unknown component requested ",t),render:t=>t("div",(0,s.Tl)("settings","Could not render element"))}),mdiEyeOff:V.Bk0,t:s.Tl,NcEmptyContent:c.A,NcIconSvgWrapper:K.A,NcLoadingIcon:d.A}}});var tt=n(63021),et={};et.styleTagTransform=U(),et.setAttributes=O(),et.insert=P().bind(null,"head"),et.domAPI=B(),et.insertStyleElement=R(),T()(tt.A,et),tt.A&&tt.A.locals&&tt.A.locals;const at=(0,F.A)(J,(function(){var t=this,e=t._self._c,a=t._self._setupProxy;return e("div",{staticClass:"app-discover"},[a.hasError?e(a.NcEmptyContent,{attrs:{name:a.t("settings","Nothing to show"),description:a.t("settings","Could not load section content from app store.")},scopedSlots:t._u([{key:"icon",fn:function(){return[e(a.NcIconSvgWrapper,{attrs:{path:a.mdiEyeOff,size:64}})]},proxy:!0}],null,!1,638098482)}):0===a.elements.length?e(a.NcEmptyContent,{attrs:{name:a.t("settings","Loading"),description:a.t("settings","Fetching the latest news…")},scopedSlots:t._u([{key:"icon",fn:function(){return[e(a.NcLoadingIcon,{attrs:{size:64}})]},proxy:!0}])}):t._l(a.elements,(function(n,i){return e(a.getComponent(n.type),t._b({key:n.id??i,tag:"component"},"component",n,!1))}))],2)}),[],!1,null,"bb597eea",null).exports,nt=(0,i.pM)({__name:"AppStore",setup(t){const e=(0,o.lq)(),a=(0,r.T)(),n=(0,i.EW)((()=>e.params?.category??"discover")),A=(0,s.Tl)("settings","App Store"),u=(0,i.EW)((()=>p.l[n.value]??a.getCategoryById(n.value)?.displayName??A));(0,i.nT)((()=>{window.document.title=`${u.value} - ${A} - Nextcloud`}));const g=(0,i.nI)(),m=(0,i.EW)((()=>(g?.proxy).$store.getters.loading("list")));return(0,i.KC)((()=>{(g?.proxy).$store.dispatch("getCategories",{shouldRefetchCategories:!0}),(g?.proxy).$store.dispatch("getAllApps")})),{__sfc:!0,route:e,store:a,currentCategory:n,appStoreLabel:A,viewLabel:u,instance:g,isLoading:m,t:s.Tl,NcAppContent:l.A,NcEmptyContent:c.A,NcLoadingIcon:d.A,AppList:Y,AppStoreDiscoverSection:at}}});var it=n(43484),st={};st.styleTagTransform=U(),st.setAttributes=O(),st.insert=P().bind(null,"head"),st.domAPI=B(),st.insertStyleElement=R(),T()(it.A,st),it.A&&it.A.locals&&it.A.locals;const ot=(0,F.A)(nt,(function(){var t=this,e=t._self._c,a=t._self._setupProxy;return e(a.NcAppContent,{staticClass:"app-settings-content",attrs:{"page-heading":a.appStoreLabel}},[e("h2",{staticClass:"app-settings-content__label",domProps:{textContent:t._s(a.viewLabel)}}),t._v(" "),"discover"===a.currentCategory?e(a.AppStoreDiscoverSection):a.isLoading?e(a.NcEmptyContent,{staticClass:"empty-content__loading",attrs:{name:a.t("settings","Loading app list")},scopedSlots:t._u([{key:"icon",fn:function(){return[e(a.NcLoadingIcon,{attrs:{size:64}})]},proxy:!0}])}):e(a.AppList,{attrs:{category:a.currentCategory}})],1)}),[],!1,null,"f9073bbe",null).exports},1615:(t,e,a)=>{a.r(e),a.d(e,{default:()=>T});var n=a(85471),i=a(32981),s=a(53334),o=a(92973),r=a(846),p=a(42530),l=a(52439),c=a(66687),d=a(85947),A=a(6695),u=a(84237),g=a(86438);const m=(0,n.pM)({__name:"AppStoreNavigation",setup(t){const e=(0,i.C)("settings","appstoreUpdateCount",0),a=(0,i.C)("settings","appstoreEnabled",!0),m=(0,i.C)("settings","appstoreDeveloperDocs",""),v=(0,r.T)(),h=(0,n.EW)((()=>v.categories)),C=(0,n.EW)((()=>v.loading.categories)),f=(0,n.EW)((()=>void 0!==v.apps.find((t=>{let{level:e}=t;return 300===e}))));return(0,n.KC)((()=>{v.loadCategories(),v.loadApps()})),{__sfc:!0,updateCount:e,appstoreEnabled:a,developerDocsUrl:m,store:v,categories:h,categoriesLoading:C,isSubscribed:f,t:s.Tl,APPS_SECTION_ENUM:o.l,NcAppNavigation:p.A,NcAppNavigationItem:l.A,NcAppNavigationSpacer:c.A,NcCounterBubble:d.A,NcIconSvgWrapper:A.A,NcLoadingIcon:u.A,APPSTORE_CATEGORY_ICONS:g.A}}});var v=a(85072),h=a.n(v),C=a(97825),f=a.n(C),b=a(77659),_=a.n(b),y=a(55056),x=a.n(y),w=a(10540),S=a.n(w),k=a(41113),N=a.n(k),I=a(63139),E={};E.styleTagTransform=N(),E.setAttributes=x(),E.insert=_().bind(null,"head"),E.domAPI=f(),E.insertStyleElement=S(),h()(I.A,E),I.A&&I.A.locals&&I.A.locals;const T=(0,a(14486).A)(m,(function(){var t=this,e=t._self._c,a=t._self._setupProxy;return e(a.NcAppNavigation,{attrs:{"aria-label":a.t("settings","Apps")},scopedSlots:t._u([{key:"list",fn:function(){return[a.appstoreEnabled?e(a.NcAppNavigationItem,{attrs:{id:"app-category-discover",to:{name:"apps-category",params:{category:"discover"}},name:a.APPS_SECTION_ENUM.discover},scopedSlots:t._u([{key:"icon",fn:function(){return[e(a.NcIconSvgWrapper,{attrs:{path:a.APPSTORE_CATEGORY_ICONS.discover}})]},proxy:!0}],null,!1,1397544286)}):t._e(),t._v(" "),e(a.NcAppNavigationItem,{attrs:{id:"app-category-installed",to:{name:"apps-category",params:{category:"installed"}},name:a.APPS_SECTION_ENUM.installed},scopedSlots:t._u([{key:"icon",fn:function(){return[e(a.NcIconSvgWrapper,{attrs:{path:a.APPSTORE_CATEGORY_ICONS.installed}})]},proxy:!0}])}),t._v(" "),e(a.NcAppNavigationItem,{attrs:{id:"app-category-enabled",to:{name:"apps-category",params:{category:"enabled"}},name:a.APPS_SECTION_ENUM.enabled},scopedSlots:t._u([{key:"icon",fn:function(){return[e(a.NcIconSvgWrapper,{attrs:{path:a.APPSTORE_CATEGORY_ICONS.enabled}})]},proxy:!0}])}),t._v(" "),e(a.NcAppNavigationItem,{attrs:{id:"app-category-disabled",to:{name:"apps-category",params:{category:"disabled"}},name:a.APPS_SECTION_ENUM.disabled},scopedSlots:t._u([{key:"icon",fn:function(){return[e(a.NcIconSvgWrapper,{attrs:{path:a.APPSTORE_CATEGORY_ICONS.disabled}})]},proxy:!0}])}),t._v(" "),a.updateCount>0?e(a.NcAppNavigationItem,{attrs:{id:"app-category-updates",to:{name:"apps-category",params:{category:"updates"}},name:a.APPS_SECTION_ENUM.updates},scopedSlots:t._u([{key:"counter",fn:function(){return[e(a.NcCounterBubble,[t._v(t._s(a.updateCount))])]},proxy:!0},{key:"icon",fn:function(){return[e(a.NcIconSvgWrapper,{attrs:{path:a.APPSTORE_CATEGORY_ICONS.updates}})]},proxy:!0}],null,!1,2824895104)}):t._e(),t._v(" "),e(a.NcAppNavigationItem,{attrs:{id:"app-category-your-bundles",to:{name:"apps-category",params:{category:"app-bundles"}},name:a.APPS_SECTION_ENUM["app-bundles"]},scopedSlots:t._u([{key:"icon",fn:function(){return[e(a.NcIconSvgWrapper,{attrs:{path:a.APPSTORE_CATEGORY_ICONS.bundles}})]},proxy:!0}])}),t._v(" "),e(a.NcAppNavigationSpacer),t._v(" "),a.appstoreEnabled&&a.categoriesLoading?e("li",{staticClass:"categories--loading"},[e(a.NcLoadingIcon,{attrs:{size:20,"aria-label":a.t("settings","Loading categories")}})],1):a.appstoreEnabled&&!a.categoriesLoading?[a.isSubscribed?e(a.NcAppNavigationItem,{attrs:{id:"app-category-supported",to:{name:"apps-category",params:{category:"supported"}},name:a.APPS_SECTION_ENUM.supported},scopedSlots:t._u([{key:"icon",fn:function(){return[e(a.NcIconSvgWrapper,{attrs:{path:a.APPSTORE_CATEGORY_ICONS.supported}})]},proxy:!0}],null,!1,613663011)}):t._e(),t._v(" "),e(a.NcAppNavigationItem,{attrs:{id:"app-category-featured",to:{name:"apps-category",params:{category:"featured"}},name:a.APPS_SECTION_ENUM.featured},scopedSlots:t._u([{key:"icon",fn:function(){return[e(a.NcIconSvgWrapper,{attrs:{path:a.APPSTORE_CATEGORY_ICONS.featured}})]},proxy:!0}])}),t._v(" "),t._l(a.categories,(function(n){return e(a.NcAppNavigationItem,{key:n.id,attrs:{id:`app-category-${n.id}`,name:n.displayName,to:{name:"apps-category",params:{category:n.id}}},scopedSlots:t._u([{key:"icon",fn:function(){return[e(a.NcIconSvgWrapper,{attrs:{path:n.icon}})]},proxy:!0}],null,!0)})}))]:t._e(),t._v(" "),e(a.NcAppNavigationItem,{attrs:{id:"app-developer-docs",name:a.t("settings","Developer documentation ↗"),href:a.developerDocsUrl}})]},proxy:!0}])})}),[],!1,null,"26201909",null).exports},36710:(e,a,n)=>{n.r(a),n.d(a,{default:()=>at});var i=n(85471),s=n(53334),o=n(24387),r=n(846),p=n(35190),l=n(6695),c=n(18881),d=n(9165),A=n(46503),u=n(60023),g=n(42838),m=n.n(g);const v={name:"Markdown",props:{text:{type:String,default:""},minHeading:{type:Number,default:1}},computed:{renderMarkdown(){const t=new u.xI.Renderer;return t.link=function(t,e,a){let n;try{n=decodeURIComponent(unescape(t)).replace(/[^\w:]/g,"").toLowerCase()}catch(t){return""}if(0!==n.indexOf("http:")&&0!==n.indexOf("https:"))return"";let i='<a href="'+t+'" rel="noreferrer noopener"';return e&&(i+=' title="'+e+'"'),i+=">"+a+"</a>",i},t.heading=(t,e)=>`<h${e=Math.min(6,e+(this.minHeading-1))}>${t}</h${e}>`,t.image=function(t,e,a){return a||e},t.blockquote=function(t){return t},m().sanitize((0,u.xI)(this.text.trim(),{renderer:t,gfm:!1,highlight:!1,tables:!1,breaks:!1,pedantic:!1,sanitize:!0,smartLists:!0,smartypants:!1}),{SAFE_FOR_JQUERY:!0,ALLOWED_TAGS:["h1","h2","h3","h4","h5","h6","strong","p","a","ul","ol","li","em","del","blockquote"]})}}};var h=n(85072),C=n.n(h),f=n(97825),b=n.n(f),_=n(77659),y=n.n(_),x=n(55056),w=n.n(x),S=n(10540),k=n.n(S),N=n(41113),I=n.n(N),E=n(95421),T={};T.styleTagTransform=I(),T.setAttributes=w(),T.insert=y().bind(null,"head"),T.domAPI=b(),T.insertStyleElement=k(),C()(E.A,T),E.A&&E.A.locals&&E.A.locals;var D=n(14486);const B=(0,D.A)(v,(function(){var t=this;return(0,t._self._c)("div",{staticClass:"settings-markdown",domProps:{innerHTML:t._s(t.renderMarkdown)}})}),[],!1,null,"5d3cebad",null).exports,$=(0,i.pM)({__name:"AppDescriptionTab",props:{app:null},setup:t=>({__sfc:!0,mdiTextShort:d.azb,t:s.Tl,NcAppSidebarTab:A.A,NcIconSvgWrapper:l.A,Markdown:B})});var P=n(3007),L={};L.styleTagTransform=I(),L.setAttributes=w(),L.insert=y().bind(null,"head"),L.domAPI=b(),L.insertStyleElement=k(),C()(P.A,L),P.A&&P.A.locals&&P.A.locals;const O=(0,D.A)($,(function(){var t=this,e=t._self._c,a=t._self._setupProxy;return e(a.NcAppSidebarTab,{attrs:{id:"desc",name:a.t("settings","Description"),order:0},scopedSlots:t._u([{key:"icon",fn:function(){return[e(a.NcIconSvgWrapper,{attrs:{path:a.mdiTextShort}})]},proxy:!0}])},[t._v(" "),e("div",{staticClass:"app-description"},[e(a.Markdown,{attrs:{text:t.app.description,"min-heading":4}})],1)])}),[],!1,null,"cf0a1ae6",null).exports;var G=n(18740),R=n(4604),W=n(67607),U=n(45834),M=n(96763);const z={name:"AppDetailsTab",components:{NcAppSidebarTab:A.A,NcButton:G.A,NcDateTime:R.A,NcIconSvgWrapper:l.A,NcSelect:W.A},mixins:[U.A],props:{app:{type:Object,required:!0}},setup:()=>({store:(0,r.T)(),mdiBug:d.xhV,mdiFeatureSearch:d.NZe,mdiStar:d.ZL5,mdiTextBox:d.n1r,mdiTooltipQuestion:d.iNF}),data:()=>({groupCheckedAppsData:!1}),computed:{lastModified(){return(this.app.appstoreData?.releases??[]).map((t=>{let{lastModified:e}=t;return Date.parse(e)})).sort().at(0)??null},appAuthors(){if(M.warn(this.app),!this.app)return"";const t=t=>t["@value"]?t["@value"]:t;return(Array.isArray(this.app.author)?this.app.author.map(t):[t(this.app.author)]).sort(((t,e)=>t.split(" ").at(-1).localeCompare(e.split(" ").at(-1)))).join(", ")},appstoreUrl(){return`https://apps.nextcloud.com/apps/${this.app.id}`},externalResources(){const e=[];return this.app.internal||e.push({id:"appstore",href:this.appstoreUrl,label:t("settings","View in store")}),this.app.website&&e.push({id:"website",href:this.app.website,label:t("settings","Visit website")}),this.app.documentation&&(this.app.documentation.user&&e.push({id:"doc-user",href:this.app.documentation.user,label:t("settings","Usage documentation")}),this.app.documentation.admin&&e.push({id:"doc-admin",href:this.app.documentation.admin,label:t("settings","Admin documentation")}),this.app.documentation.developer&&e.push({id:"doc-developer",href:this.app.documentation.developer,label:t("settings","Developer documentation")})),e},appCategories(){return[this.app.category].flat().map((t=>this.store.getCategoryById(t)?.displayName??t)).join(", ")},rateAppUrl(){return`${this.appstoreUrl}#comments`},appGroups(){return this.app.groups.map((t=>({id:t,name:t})))},groups(){return this.$store.getters.getGroups.filter((t=>"disabled"!==t.id)).sort(((t,e)=>t.name.localeCompare(e.name)))}},mounted(){this.app.groups.length>0&&(this.groupCheckedAppsData=!0)}};var F=n(62940),Y={};Y.styleTagTransform=I(),Y.setAttributes=w(),Y.insert=y().bind(null,"head"),Y.domAPI=b(),Y.insertStyleElement=k(),C()(F.A,Y),F.A&&F.A.locals&&F.A.locals;const V=(0,D.A)(z,(function(){var t=this,e=t._self._c;return e("NcAppSidebarTab",{attrs:{id:"details",name:t.t("settings","Details"),order:1},scopedSlots:t._u([{key:"icon",fn:function(){return[e("NcIconSvgWrapper",{attrs:{path:t.mdiTextBox}})]},proxy:!0}])},[t._v(" "),e("div",{staticClass:"app-details"},[e("div",{staticClass:"app-details__actions"},[t.app.active&&t.canLimitToGroups(t.app)?e("div",{staticClass:"app-details__actions-groups"},[e("input",{directives:[{name:"model",rawName:"v-model",value:t.groupCheckedAppsData,expression:"groupCheckedAppsData"}],staticClass:"groups-enable__checkbox checkbox",attrs:{id:`groups_enable_${t.app.id}`,type:"checkbox"},domProps:{value:t.app.id,checked:Array.isArray(t.groupCheckedAppsData)?t._i(t.groupCheckedAppsData,t.app.id)>-1:t.groupCheckedAppsData},on:{change:[function(e){var a=t.groupCheckedAppsData,n=e.target,i=!!n.checked;if(Array.isArray(a)){var s=t.app.id,o=t._i(a,s);n.checked?o<0&&(t.groupCheckedAppsData=a.concat([s])):o>-1&&(t.groupCheckedAppsData=a.slice(0,o).concat(a.slice(o+1)))}else t.groupCheckedAppsData=i},t.setGroupLimit]}}),t._v(" "),e("label",{attrs:{for:`groups_enable_${t.app.id}`}},[t._v(t._s(t.t("settings","Limit to groups")))]),t._v(" "),e("input",{staticClass:"group_select",attrs:{type:"hidden",title:t.t("settings","All"),value:""}}),t._v(" "),e("br"),t._v(" "),e("label",{attrs:{for:"limitToGroups"}},[e("span",[t._v(t._s(t.t("settings","Limit app usage to groups")))])]),t._v(" "),t.isLimitedToGroups(t.app)?e("NcSelect",{attrs:{"input-id":"limitToGroups",options:t.groups,value:t.appGroups,limit:5,label:"name",multiple:!0,"close-on-select":!1},on:{"option:selected":t.addGroupLimitation,"option:deselected":t.removeGroupLimitation,search:t.asyncFindGroup}},[e("span",{attrs:{slot:"noResult"},slot:"noResult"},[t._v(t._s(t.t("settings","No results")))])]):t._e()],1):t._e(),t._v(" "),e("div",{staticClass:"app-details__actions-manage"},[t.app.update?e("input",{staticClass:"update primary",attrs:{type:"button",value:t.t("settings","Update to {version}",{version:t.app.update}),disabled:t.installing||t.isLoading},on:{click:function(e){return t.update(t.app.id)}}}):t._e(),t._v(" "),t.app.canUnInstall?e("input",{staticClass:"uninstall",attrs:{type:"button",value:t.t("settings","Remove"),disabled:t.installing||t.isLoading},on:{click:function(e){return t.remove(t.app.id)}}}):t._e(),t._v(" "),t.app.active?e("input",{staticClass:"enable",attrs:{type:"button",value:t.t("settings","Disable"),disabled:t.installing||t.isLoading},on:{click:function(e){return t.disable(t.app.id)}}}):t._e(),t._v(" "),t.app.active||!t.app.canInstall&&!t.app.isCompatible?t.app.active||t.app.canInstall?t._e():e("input",{staticClass:"enable force",attrs:{title:t.forceEnableButtonTooltip,"aria-label":t.forceEnableButtonTooltip,type:"button",value:t.forceEnableButtonText,disabled:t.installing||t.isLoading},on:{click:function(e){return t.forceEnable(t.app.id)}}}):e("input",{staticClass:"enable primary",attrs:{title:t.enableButtonTooltip,"aria-label":t.enableButtonTooltip,type:"button",value:t.enableButtonText,disabled:!t.app.canInstall||t.installing||t.isLoading},on:{click:function(e){return t.enable(t.app.id)}}})])]),t._v(" "),e("ul",{staticClass:"app-details__dependencies"},[t.app.missingMinOwnCloudVersion?e("li",[t._v("\n\t\t\t\t"+t._s(t.t("settings","This app has no minimum Nextcloud version assigned. This will be an error in the future."))+"\n\t\t\t")]):t._e(),t._v(" "),t.app.missingMaxOwnCloudVersion?e("li",[t._v("\n\t\t\t\t"+t._s(t.t("settings","This app has no maximum Nextcloud version assigned. This will be an error in the future."))+"\n\t\t\t")]):t._e(),t._v(" "),t.app.canInstall?t._e():e("li",[t._v("\n\t\t\t\t"+t._s(t.t("settings","This app cannot be installed because the following dependencies are not fulfilled:"))+"\n\t\t\t\t"),e("ul",{staticClass:"missing-dependencies"},t._l(t.app.missingDependencies,(function(a,n){return e("li",{key:n},[t._v("\n\t\t\t\t\t\t"+t._s(a)+"\n\t\t\t\t\t")])})),0)])]),t._v(" "),t.lastModified?e("div",{staticClass:"app-details__section"},[e("h4",[t._v("\n\t\t\t\t"+t._s(t.t("settings","Latest updated"))+"\n\t\t\t")]),t._v(" "),e("NcDateTime",{attrs:{timestamp:t.lastModified}})],1):t._e(),t._v(" "),e("div",{staticClass:"app-details__section"},[e("h4",[t._v("\n\t\t\t\t"+t._s(t.t("settings","Author"))+"\n\t\t\t")]),t._v(" "),e("p",{staticClass:"app-details__authors"},[t._v("\n\t\t\t\t"+t._s(t.appAuthors)+"\n\t\t\t")])]),t._v(" "),e("div",{staticClass:"app-details__section"},[e("h4",[t._v("\n\t\t\t\t"+t._s(t.t("settings","Categories"))+"\n\t\t\t")]),t._v(" "),e("p",[t._v("\n\t\t\t\t"+t._s(t.appCategories)+"\n\t\t\t")])]),t._v(" "),t.externalResources.length>0?e("div",{staticClass:"app-details__section"},[e("h4",[t._v(t._s(t.t("settings","Resources")))]),t._v(" "),e("ul",{staticClass:"app-details__documentation",attrs:{"aria-label":t.t("settings","Documentation")}},t._l(t.externalResources,(function(a){return e("li",{key:a.id},[e("a",{staticClass:"appslink",attrs:{href:a.href,target:"_blank",rel:"noreferrer noopener"}},[t._v("\n\t\t\t\t\t\t"+t._s(a.label)+" ↗\n\t\t\t\t\t")])])})),0)]):t._e(),t._v(" "),e("div",{staticClass:"app-details__section"},[e("h4",[t._v(t._s(t.t("settings","Interact")))]),t._v(" "),e("div",{staticClass:"app-details__interact"},[e("NcButton",{attrs:{disabled:!t.app.bugs,href:t.app.bugs??"#","aria-label":t.t("settings","Report a bug"),title:t.t("settings","Report a bug")},scopedSlots:t._u([{key:"icon",fn:function(){return[e("NcIconSvgWrapper",{attrs:{path:t.mdiBug}})]},proxy:!0}])}),t._v(" "),e("NcButton",{attrs:{disabled:!t.app.bugs,href:t.app.bugs??"#","aria-label":t.t("settings","Request feature"),title:t.t("settings","Request feature")},scopedSlots:t._u([{key:"icon",fn:function(){return[e("NcIconSvgWrapper",{attrs:{path:t.mdiFeatureSearch}})]},proxy:!0}])}),t._v(" "),t.app.appstoreData?.discussion?e("NcButton",{attrs:{href:t.app.appstoreData.discussion,"aria-label":t.t("settings","Ask questions or discuss"),title:t.t("settings","Ask questions or discuss")},scopedSlots:t._u([{key:"icon",fn:function(){return[e("NcIconSvgWrapper",{attrs:{path:t.mdiTooltipQuestion}})]},proxy:!0}],null,!1,1288192462)}):t._e(),t._v(" "),t.app.internal?t._e():e("NcButton",{attrs:{href:t.rateAppUrl,"aria-label":t.t("settings","Rate the app"),title:t.t("settings","Rate")},scopedSlots:t._u([{key:"icon",fn:function(){return[e("NcIconSvgWrapper",{attrs:{path:t.mdiStar}})]},proxy:!0}],null,!1,422450625)})],1)])])])}),[],!1,null,"533705fa",null).exports,j=(0,i.pM)({__name:"AppReleasesTab",props:{app:null},setup(t){const e=t,a=(0,i.EW)((()=>Object.values(e.app.releases?.[0]?.translations??{}).some((t=>{let{changelog:e}=t;return!!e}))));return{__sfc:!0,props:e,hasChangelog:a,createChangelogFromRelease:t=>t.translations?.[(0,s.Z0)()]?.changelog??t.translations?.en?.changelog??"",mdiClockFast:d.NWU,t:s.Tl,NcAppSidebarTab:A.A,NcIconSvgWrapper:l.A,Markdown:B}}});var q=n(37925),H={};H.styleTagTransform=I(),H.setAttributes=w(),H.insert=y().bind(null,"head"),H.domAPI=b(),H.insertStyleElement=k(),C()(q.A,H),q.A&&q.A.locals&&q.A.locals;const K=(0,D.A)(j,(function(){var t=this,e=t._self._c,a=t._self._setupProxy;return a.hasChangelog?e(a.NcAppSidebarTab,{attrs:{id:"changelog",name:a.t("settings","Changelog"),order:2},scopedSlots:t._u([{key:"icon",fn:function(){return[e(a.NcIconSvgWrapper,{attrs:{path:a.mdiClockFast,size:24}})]},proxy:!0}],null,!1,1849836872)},[t._v(" "),t._l(t.app.releases,(function(n){return e("div",{key:n.version,staticClass:"app-sidebar-tabs__release"},[e("h2",[t._v(t._s(n.version))]),t._v(" "),e(a.Markdown,{staticClass:"app-sidebar-tabs__release-text",attrs:{text:a.createChangelogFromRelease(n)}})],1)}))],2):t._e()}),[],!1,null,"9c32407e",null).exports;var Q=n(11516),X=n(86438),Z=n(36620);const J=(0,i.pM)({__name:"AppStoreSidebar",setup(t){const e=(0,o.lq)(),a=(0,o.rd)(),n=(0,r.T)(),A=(0,i.EW)((()=>e.params.id??"")),u=(0,i.EW)((()=>n.getAppById(A.value))),g=(0,i.EW)((()=>u.value.appstoreData?.ratingNumOverall>5)),m=(0,i.EW)((()=>u.value.appstoreData?.ratingNumRecent>5?u.value.appstoreData.ratingRecent:u.value.appstoreData?.ratingOverall??.5)),v=(0,i.EW)((()=>null!==u.value)),{appIcon:h}=function(t){const e=(0,i.KR)(null),a=(0,i.EW)((()=>{const e=[t.value?.category??[]].flat().map((t=>X.A[t])).filter((t=>!!t)).at(0)??d.CZ3;return e?`<svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="${e}" /></svg>`:null}));return(0,i.nT)((async()=>{if(t.value?.preview){e.value=null;try{const a=await window.fetch(t.value.preview),n=await a.blob(),i=await n.text();e.value=i.replaceAll(/fill="#(fff|ffffff)([a-z0-9]{1,2})?"/gi,'fill="currentColor"')}catch(t){e.value=a.value,Z.A.error("Could not load app icon",{error:t})}}else e.value=a.value})),{appIcon:e}}(u),C=(0,i.EW)((()=>u.value?(0,s.Tl)("settings","Version {version}, {license}-licensed",{version:u.value.version,license:u.value.licence.toString().toUpperCase()}):"")),f=(0,i.KR)("details");(0,i.wB)([u],(()=>{f.value="details"}));const b=(0,i.KR)(!1),_=(0,i.EW)((()=>u.value?.screenshot&&b.value)),y=()=>{if(u.value?.releases&&u.value?.screenshot){const t=new Image;t.onload=()=>{b.value=!0},t.src=u.value.screenshot}};return(0,i.wB)([u],y),(0,i.sV)(y),{__sfc:!0,route:e,router:a,store:n,appId:A,app:u,hasRating:g,rating:m,showSidebar:v,appIcon:h,licenseText:C,activeTab:f,hideAppDetails:()=>{a.push({name:"apps-category",params:{category:e.params.category}})},screenshotLoaded:b,hasScreenshot:_,loadScreenshot:y,NcAppSidebar:p.N,NcIconSvgWrapper:l.A,AppScore:c.A,AppDescriptionTab:O,AppDetailsTab:V,AppReleasesTab:K,AppLevelBadge:Q.A}}});var tt=n(17525),et={};et.styleTagTransform=I(),et.setAttributes=w(),et.insert=y().bind(null,"head"),et.domAPI=b(),et.insertStyleElement=k(),C()(tt.A,et),tt.A&&tt.A.locals&&tt.A.locals;const at=(0,D.A)(J,(function(){var t=this,e=t._self._c,a=t._self._setupProxy;return a.showSidebar?e(a.NcAppSidebar,{staticClass:"app-sidebar",class:{"app-sidebar--with-screenshot":a.hasScreenshot},attrs:{active:a.activeTab,background:a.hasScreenshot?a.app.screenshot:void 0,compact:!a.hasScreenshot,name:a.app.name,title:a.app.name,subname:a.licenseText,subtitle:a.licenseText},on:{"update:active":function(t){a.activeTab=t},close:a.hideAppDetails},scopedSlots:t._u([a.hasScreenshot?null:{key:"header",fn:function(){return[e(a.NcIconSvgWrapper,{staticClass:"app-sidebar__fallback-icon",attrs:{svg:a.appIcon??"",size:64}})]},proxy:!0},{key:"description",fn:function(){return[e("div",{staticClass:"app-sidebar__badges"},[e(a.AppLevelBadge,{attrs:{level:a.app.level}}),t._v(" "),a.hasRating?e(a.AppScore,{attrs:{score:a.rating}}):t._e()],1)]},proxy:!0}],null,!0)},[t._v(" "),t._v(" "),e(a.AppDescriptionTab,{attrs:{app:a.app}}),t._v(" "),e(a.AppDetailsTab,{attrs:{app:a.app}}),t._v(" "),e(a.AppReleasesTab,{attrs:{app:a.app}})],1):t._e()}),[],!1,null,"2f300fa2",null).exports}}]);
+//# sourceMappingURL=settings-apps-view-4529.js.map?v=80559dd00b323f234969 \ No newline at end of file
diff --git a/dist/settings-apps-view-4529.js.map b/dist/settings-apps-view-4529.js.map
index 2f96da7bff4..93cea9956cd 100644
--- a/dist/settings-apps-view-4529.js.map
+++ b/dist/settings-apps-view-4529.js.map
@@ -1 +1 @@
-{"version":3,"file":"settings-apps-view-4529.js?v=1ff3e764eab81081e54c","mappings":"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","sources":["webpack:///nextcloud/apps/settings/src/constants/AppsConstants.js","webpack:///nextcloud/apps/settings/src/service/rebuild-navigation.js","webpack:///nextcloud/apps/settings/src/mixins/AppManagement.js","webpack:///nextcloud/apps/settings/src/constants/AppstoreCategoryIcons.ts","webpack:///nextcloud/apps/settings/src/store/apps-store.ts","webpack:///nextcloud/apps/settings/src/components/AppList.vue?vue&type=style&index=0&id=5cf3c7a8&prod&lang=scss&scoped=true","webpack:///nextcloud/apps/settings/src/components/AppList/AppItem.vue?vue&type=style&index=0&id=4f1b9f2a&prod&scoped=true&lang=scss","webpack:///nextcloud/apps/settings/src/components/AppList/AppLevelBadge.vue?vue&type=style&index=0&id=5ee601b2&prod&scoped=true&lang=scss","webpack:///nextcloud/apps/settings/src/components/AppStoreDiscover/AppStoreDiscoverSection.vue?vue&type=style&index=0&id=bb597eea&prod&scoped=true&lang=scss","webpack:///nextcloud/apps/settings/src/components/AppStoreSidebar/AppDescriptionTab.vue?vue&type=style&index=0&id=cf0a1ae6&prod&scoped=true&lang=scss","webpack:///nextcloud/apps/settings/src/components/AppStoreSidebar/AppDetailsTab.vue?vue&type=style&index=0&id=533705fa&prod&scoped=true&lang=scss","webpack:///nextcloud/apps/settings/src/components/AppStoreSidebar/AppReleasesTab.vue?vue&type=style&index=0&id=9c32407e&prod&scoped=true&lang=scss","webpack:///nextcloud/apps/settings/src/components/Markdown.vue?vue&type=style&index=0&id=5d3cebad&prod&scoped=true&lang=scss","webpack:///nextcloud/apps/settings/src/views/AppStoreSidebar.vue?vue&type=style&index=0&id=2f300fa2&prod&scoped=true&lang=scss","webpack:///nextcloud/apps/settings/src/components/AppList/AppScore.vue?vue&type=style&index=0&id=2193f4e0&prod&scoped=true&lang=css","webpack:///nextcloud/apps/settings/src/views/AppStore.vue?vue&type=style&index=0&id=f9073bbe&prod&scoped=true&lang=css","webpack:///nextcloud/apps/settings/src/views/AppStoreNavigation.vue?vue&type=style&index=0&id=1e611b27&prod&scoped=true&lang=css","webpack://nextcloud/./apps/settings/src/components/AppList/AppItem.vue?af1e","webpack:///nextcloud/apps/settings/src/components/SvgFilterMixin.vue","webpack:///nextcloud/apps/settings/src/components/SvgFilterMixin.vue?vue&type=script&lang=js","webpack://nextcloud/./apps/settings/src/components/SvgFilterMixin.vue?5bcd","webpack:///nextcloud/apps/settings/src/components/AppList/AppItem.vue","webpack:///nextcloud/apps/settings/src/components/AppList/AppItem.vue?vue&type=script&lang=js","webpack://nextcloud/./apps/settings/src/components/AppList/AppItem.vue?d389","webpack://nextcloud/./apps/settings/src/components/AppList/AppItem.vue?a9a1","webpack:///nextcloud/apps/settings/src/components/AppList/AppLevelBadge.vue","webpack:///nextcloud/apps/settings/src/components/AppList/AppLevelBadge.vue?vue&type=script&setup=true&lang=ts","webpack://nextcloud/./apps/settings/src/components/AppList/AppLevelBadge.vue?8473","webpack://nextcloud/./apps/settings/src/components/AppList/AppLevelBadge.vue?74e8","webpack:///nextcloud/apps/settings/src/components/AppList/AppScore.vue","webpack:///nextcloud/apps/settings/src/components/AppList/AppScore.vue?vue&type=script&lang=ts","webpack://nextcloud/./apps/settings/src/components/AppList/AppScore.vue?fc42","webpack://nextcloud/./apps/settings/src/components/AppList/AppScore.vue?26fd","webpack:///nextcloud/apps/settings/src/views/AppStore.vue","webpack:///nextcloud/node_modules/yocto-queue/index.js","webpack:///nextcloud/node_modules/p-limit/index.js","webpack:///nextcloud/apps/settings/src/components/AppList.vue","webpack:///nextcloud/apps/settings/src/components/AppList.vue?vue&type=script&lang=js","webpack://nextcloud/./apps/settings/src/components/AppList.vue?9198","webpack://nextcloud/./apps/settings/src/components/AppList.vue?8acf","webpack://nextcloud/./apps/settings/src/components/AppList.vue?ee21","webpack:///nextcloud/apps/settings/src/components/AppStoreDiscover/AppStoreDiscoverSection.vue","webpack:///nextcloud/apps/settings/src/utils/appDiscoverParser.ts","webpack:///nextcloud/apps/settings/src/components/AppStoreDiscover/AppStoreDiscoverSection.vue?vue&type=script&setup=true&lang=ts","webpack://nextcloud/./apps/settings/src/components/AppStoreDiscover/AppStoreDiscoverSection.vue?9ef0","webpack://nextcloud/./apps/settings/src/components/AppStoreDiscover/AppStoreDiscoverSection.vue?0759","webpack:///nextcloud/apps/settings/src/views/AppStore.vue?vue&type=script&setup=true&lang=ts","webpack://nextcloud/./apps/settings/src/views/AppStore.vue?a414","webpack://nextcloud/./apps/settings/src/views/AppStore.vue?47b2","webpack:///nextcloud/apps/settings/src/views/AppStoreNavigation.vue","webpack:///nextcloud/apps/settings/src/views/AppStoreNavigation.vue?vue&type=script&setup=true&lang=ts","webpack://nextcloud/./apps/settings/src/views/AppStoreNavigation.vue?3bdc","webpack://nextcloud/./apps/settings/src/views/AppStoreNavigation.vue?6e6f","webpack:///nextcloud/apps/settings/src/views/AppStoreSidebar.vue","webpack:///nextcloud/apps/settings/src/components/Markdown.vue","webpack:///nextcloud/apps/settings/src/components/Markdown.vue?vue&type=script&lang=js","webpack://nextcloud/./apps/settings/src/components/Markdown.vue?3dcc","webpack://nextcloud/./apps/settings/src/components/Markdown.vue?26cf","webpack://nextcloud/./apps/settings/src/components/Markdown.vue?d299","webpack:///nextcloud/apps/settings/src/components/AppStoreSidebar/AppDescriptionTab.vue?vue&type=script&setup=true&lang=ts","webpack:///nextcloud/apps/settings/src/components/AppStoreSidebar/AppDescriptionTab.vue","webpack://nextcloud/./apps/settings/src/components/AppStoreSidebar/AppDescriptionTab.vue?cd04","webpack://nextcloud/./apps/settings/src/components/AppStoreSidebar/AppDescriptionTab.vue?311d","webpack://nextcloud/./apps/settings/src/components/AppStoreSidebar/AppDetailsTab.vue?9ed4","webpack:///nextcloud/apps/settings/src/components/AppStoreSidebar/AppDetailsTab.vue","webpack:///nextcloud/apps/settings/src/components/AppStoreSidebar/AppDetailsTab.vue?vue&type=script&lang=js","webpack://nextcloud/./apps/settings/src/components/AppStoreSidebar/AppDetailsTab.vue?98a6","webpack://nextcloud/./apps/settings/src/components/AppStoreSidebar/AppDetailsTab.vue?d4df","webpack:///nextcloud/apps/settings/src/components/AppStoreSidebar/AppReleasesTab.vue?vue&type=script&setup=true&lang=ts","webpack:///nextcloud/apps/settings/src/components/AppStoreSidebar/AppReleasesTab.vue","webpack://nextcloud/./apps/settings/src/components/AppStoreSidebar/AppReleasesTab.vue?88c0","webpack://nextcloud/./apps/settings/src/components/AppStoreSidebar/AppReleasesTab.vue?d492","webpack:///nextcloud/apps/settings/src/views/AppStoreSidebar.vue?vue&type=script&setup=true&lang=ts","webpack:///nextcloud/apps/settings/src/composables/useAppIcon.ts","webpack://nextcloud/./apps/settings/src/views/AppStoreSidebar.vue?264a","webpack://nextcloud/./apps/settings/src/views/AppStoreSidebar.vue?5373"],"sourcesContent":["/**\n * SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport { translate as t } from '@nextcloud/l10n'\n\n/** Enum of verification constants, according to Apps */\nexport const APPS_SECTION_ENUM = Object.freeze({\n\tdiscover: t('settings', 'Discover'),\n\tinstalled: t('settings', 'Your apps'),\n\tenabled: t('settings', 'Active apps'),\n\tdisabled: t('settings', 'Disabled apps'),\n\tupdates: t('settings', 'Updates'),\n\t'app-bundles': t('settings', 'App bundles'),\n\tfeatured: t('settings', 'Featured apps'),\n\tsupported: t('settings', 'Supported apps'), // From subscription\n})\n","/**\n * SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\nimport axios from '@nextcloud/axios'\nimport { generateOcsUrl } from '@nextcloud/router'\nimport { emit } from '@nextcloud/event-bus'\n\nexport default () => {\n\treturn axios.get(generateOcsUrl('core/navigation', 2) + '/apps?format=json')\n\t\t.then(({ data }) => {\n\t\t\tif (data.ocs.meta.statuscode !== 200) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\temit('nextcloud:app-menu.refresh', { apps: data.ocs.data })\n\t\t\twindow.dispatchEvent(new Event('resize'))\n\t\t})\n}\n","/**\n * SPDX-FileCopyrightText: 2019 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport { showError } from '@nextcloud/dialogs'\nimport rebuildNavigation from '../service/rebuild-navigation.js'\n\nexport default {\n\tcomputed: {\n\t\tappGroups() {\n\t\t\treturn this.app.groups.map(group => { return { id: group, name: group } })\n\t\t},\n\t\tinstalling() {\n\t\t\treturn this.$store.getters.loading('install')\n\t\t},\n\t\tisLoading() {\n\t\t\treturn this.app && this.$store.getters.loading(this.app.id)\n\t\t},\n\t\tenableButtonText() {\n\t\t\tif (this.app.needsDownload) {\n\t\t\t\treturn t('settings', 'Download and enable')\n\t\t\t}\n\t\t\treturn t('settings', 'Enable')\n\t\t},\n\t\tforceEnableButtonText() {\n\t\t\tif (this.app.needsDownload) {\n\t\t\t\treturn t('settings', 'Allow untested app')\n\t\t\t}\n\t\t\treturn t('settings', 'Allow untested app')\n\t\t},\n\t\tenableButtonTooltip() {\n\t\t\tif (this.app.needsDownload) {\n\t\t\t\treturn t('settings', 'The app will be downloaded from the App Store')\n\t\t\t}\n\t\t\treturn null\n\t\t},\n\t\tforceEnableButtonTooltip() {\n\t\t\tconst base = t('settings', '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.')\n\t\t\tif (this.app.needsDownload) {\n\t\t\t\treturn base + ' ' + t('settings', 'The app will be downloaded from the App Store')\n\t\t\t}\n\t\t\treturn base\n\t\t},\n\t},\n\n\tdata() {\n\t\treturn {\n\t\t\tgroupCheckedAppsData: false,\n\t\t}\n\t},\n\n\tmounted() {\n\t\tif (this.app && this.app.groups && this.app.groups.length > 0) {\n\t\t\tthis.groupCheckedAppsData = true\n\t\t}\n\t},\n\n\tmethods: {\n\t\tasyncFindGroup(query) {\n\t\t\treturn this.$store.dispatch('getGroups', { search: query, limit: 5, offset: 0 })\n\t\t},\n\t\tisLimitedToGroups(app) {\n\t\t\tif (this.app.groups.length || this.groupCheckedAppsData) {\n\t\t\t\treturn true\n\t\t\t}\n\t\t\treturn false\n\t\t},\n\t\tsetGroupLimit() {\n\t\t\tif (!this.groupCheckedAppsData) {\n\t\t\t\tthis.$store.dispatch('enableApp', { appId: this.app.id, groups: [] })\n\t\t\t}\n\t\t},\n\t\tcanLimitToGroups(app) {\n\t\t\tif ((app.types && app.types.includes('filesystem'))\n\t\t\t\t\t|| app.types.includes('prelogin')\n\t\t\t\t\t|| app.types.includes('authentication')\n\t\t\t\t\t|| app.types.includes('logging')\n\t\t\t\t\t|| app.types.includes('prevent_group_restriction')) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\treturn true\n\t\t},\n\t\taddGroupLimitation(groupArray) {\n\t\t\tconst group = groupArray.pop()\n\t\t\tconst groups = this.app.groups.concat([]).concat([group.id])\n\t\t\tthis.$store.dispatch('enableApp', { appId: this.app.id, groups })\n\t\t},\n\t\tremoveGroupLimitation(group) {\n\t\t\tconst currentGroups = this.app.groups.concat([])\n\t\t\tconst index = currentGroups.indexOf(group.id)\n\t\t\tif (index > -1) {\n\t\t\t\tcurrentGroups.splice(index, 1)\n\t\t\t}\n\t\t\tthis.$store.dispatch('enableApp', { appId: this.app.id, groups: currentGroups })\n\t\t},\n\t\tforceEnable(appId) {\n\t\t\tthis.$store.dispatch('forceEnableApp', { appId, groups: [] })\n\t\t\t\t.then((response) => { rebuildNavigation() })\n\t\t\t\t.catch((error) => { showError(error) })\n\t\t},\n\t\tenable(appId) {\n\t\t\tthis.$store.dispatch('enableApp', { appId, groups: [] })\n\t\t\t\t.then((response) => { rebuildNavigation() })\n\t\t\t\t.catch((error) => { showError(error) })\n\t\t},\n\t\tdisable(appId) {\n\t\t\tthis.$store.dispatch('disableApp', { appId })\n\t\t\t\t.then((response) => { rebuildNavigation() })\n\t\t\t\t.catch((error) => { showError(error) })\n\t\t},\n\t\tremove(appId) {\n\t\t\tthis.$store.dispatch('uninstallApp', { appId })\n\t\t\t\t.then((response) => { rebuildNavigation() })\n\t\t\t\t.catch((error) => { showError(error) })\n\t\t},\n\t\tinstall(appId) {\n\t\t\tthis.$store.dispatch('enableApp', { appId })\n\t\t\t\t.then((response) => { rebuildNavigation() })\n\t\t\t\t.catch((error) => { showError(error) })\n\t\t},\n\t\tupdate(appId) {\n\t\t\tthis.$store.dispatch('updateApp', { appId })\n\t\t\t\t.then((response) => { rebuildNavigation() })\n\t\t\t\t.catch((error) => { showError(error) })\n\t\t},\n\t},\n}\n","/**\n * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\nimport { mdiAccount, mdiAccountMultiple, mdiArchive, mdiCheck, mdiClipboardFlow, mdiClose, mdiCog, mdiControllerClassic, mdiDownload, mdiFileDocumentEdit, mdiFolder, mdiKey, mdiMagnify, mdiMonitorEye, mdiMultimedia, mdiOfficeBuilding, mdiOpenInApp, mdiSecurity, mdiStar, mdiStarCircleOutline, mdiStarShooting, mdiTools, mdiViewColumn, } from '@mdi/js';\n/**\n * SVG paths used for appstore category icons\n */\nexport default Object.freeze({\n // system special categories\n discover: mdiStarCircleOutline,\n installed: mdiAccount,\n enabled: mdiCheck,\n disabled: mdiClose,\n bundles: mdiArchive,\n supported: mdiStarShooting,\n featured: mdiStar,\n updates: mdiDownload,\n // generic categories\n auth: mdiKey,\n customization: mdiCog,\n dashboard: mdiViewColumn,\n files: mdiFolder,\n games: mdiControllerClassic,\n integration: mdiOpenInApp,\n monitoring: mdiMonitorEye,\n multimedia: mdiMultimedia,\n office: mdiFileDocumentEdit,\n organization: mdiOfficeBuilding,\n search: mdiMagnify,\n security: mdiSecurity,\n social: mdiAccountMultiple,\n tools: mdiTools,\n workflow: mdiClipboardFlow,\n});\n","/**\n * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\nimport { showError } from '@nextcloud/dialogs';\nimport { loadState } from '@nextcloud/initial-state';\nimport { translate as t } from '@nextcloud/l10n';\nimport { generateUrl } from '@nextcloud/router';\nimport { defineStore } from 'pinia';\nimport axios from '@nextcloud/axios';\nimport logger from '../logger';\nimport APPSTORE_CATEGORY_ICONS from '../constants/AppstoreCategoryIcons.ts';\nconst showApiError = () => showError(t('settings', 'An error occurred during the request. Unable to proceed.'));\nexport const useAppsStore = defineStore('settings-apps', {\n state: () => ({\n apps: [],\n categories: [],\n updateCount: loadState('settings', 'appstoreUpdateCount', 0),\n loading: {\n apps: false,\n categories: false,\n },\n loadingList: false,\n gettingCategoriesPromise: null,\n }),\n actions: {\n async loadCategories(force = false) {\n if (this.categories.length > 0 && !force) {\n return;\n }\n try {\n this.loading.categories = true;\n const { data: categories } = await axios.get(generateUrl('settings/apps/categories'));\n for (const category of categories) {\n category.icon = APPSTORE_CATEGORY_ICONS[category.id] ?? '';\n }\n this.$patch({\n categories,\n });\n }\n catch (error) {\n logger.error(error);\n showApiError();\n }\n finally {\n this.loading.categories = false;\n }\n },\n async loadApps(force = false) {\n if (this.apps.length > 0 && !force) {\n return;\n }\n try {\n this.loading.apps = true;\n const { data } = await axios.get(generateUrl('settings/apps/list'));\n this.$patch({\n apps: data.apps,\n });\n }\n catch (error) {\n logger.error(error);\n showApiError();\n }\n finally {\n this.loading.apps = false;\n }\n },\n getCategoryById(categoryId) {\n return this.categories.find(({ id }) => id === categoryId) ?? null;\n },\n getAppById(appId) {\n return this.apps.find(({ id }) => id === appId) ?? null;\n },\n },\n});\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `.apps-list[data-v-5cf3c7a8]{display:flex;flex-wrap:wrap;align-content:flex-start}.apps-list--move[data-v-5cf3c7a8]{transition:transform 1s}.apps-list #app-list-update-all[data-v-5cf3c7a8]{margin-inline-start:10px}.apps-list__toolbar[data-v-5cf3c7a8]{height:60px;padding:8px;padding-inline-start:60px;width:100%;background-color:var(--color-main-background);position:sticky;top:0;z-index:1;display:flex;align-items:center}.apps-list--list-view[data-v-5cf3c7a8]{margin-bottom:100px;position:relative}.apps-list__list-container[data-v-5cf3c7a8]{width:100%}.apps-list__store-container[data-v-5cf3c7a8]{display:flex;flex-wrap:wrap}.apps-list__bundle-heading[data-v-5cf3c7a8]{display:flex;align-items:center;margin-block:20px;margin-inline:0 10px}.apps-list__bundle-header[data-v-5cf3c7a8]{margin-block:0;margin-inline:50px 10px;font-weight:bold;font-size:20px;line-height:30px;color:var(--color-text-light)}#apps-list-search .app-item h2[data-v-5cf3c7a8]{margin-bottom:0}`, \"\",{\"version\":3,\"sources\":[\"webpack://./apps/settings/src/components/AppList.vue\"],\"names\":[],\"mappings\":\"AAIA,4BACC,YAAA,CACA,cAAA,CACA,wBAAA,CAGA,kCACC,uBAAA,CAGD,iDACC,wBAAA,CAGD,qCACC,WAjBe,CAkBf,WAnBgB,CAqBhB,yBApBe,CAqBf,UAAA,CACA,6CAAA,CACA,eAAA,CACA,KAAA,CACA,SAAA,CACA,YAAA,CACA,kBAAA,CAGD,uCACC,mBAAA,CAEA,iBAAA,CAGD,4CACC,UAAA,CAGD,6CACC,YAAA,CACA,cAAA,CAGD,4CACC,YAAA,CACA,kBAAA,CACA,iBAAA,CACA,oBAAA,CAGD,2CACC,cAAA,CACA,uBAAA,CACA,gBAAA,CACA,cAAA,CACA,gBAAA,CACA,6BAAA,CAMA,gDACC,eAAA\",\"sourcesContent\":[\"\\n$toolbar-padding: 8px;\\n$toolbar-height: 44px + $toolbar-padding * 2;\\n\\n.apps-list {\\n\\tdisplay: flex;\\n\\tflex-wrap: wrap;\\n\\talign-content: flex-start;\\n\\n\\t// For transition group\\n\\t&--move {\\n\\t\\ttransition: transform 1s;\\n\\t}\\n\\n\\t#app-list-update-all {\\n\\t\\tmargin-inline-start: 10px;\\n\\t}\\n\\n\\t&__toolbar {\\n\\t\\theight: $toolbar-height;\\n\\t\\tpadding: $toolbar-padding;\\n\\t\\t// Leave room for app-navigation-toggle\\n\\t\\tpadding-inline-start: $toolbar-height;\\n\\t\\twidth: 100%;\\n\\t\\tbackground-color: var(--color-main-background);\\n\\t\\tposition: sticky;\\n\\t\\ttop: 0;\\n\\t\\tz-index: 1;\\n\\t\\tdisplay: flex;\\n\\t\\talign-items: center;\\n\\t}\\n\\n\\t&--list-view {\\n\\t\\tmargin-bottom: 100px;\\n\\t\\t// For positioning link overlay on rows\\n\\t\\tposition: relative;\\n\\t}\\n\\n\\t&__list-container {\\n\\t\\twidth: 100%;\\n\\t}\\n\\n\\t&__store-container {\\n\\t\\tdisplay: flex;\\n\\t\\tflex-wrap: wrap;\\n\\t}\\n\\n\\t&__bundle-heading {\\n\\t\\tdisplay: flex;\\n\\t\\talign-items: center;\\n\\t\\tmargin-block: 20px;\\n\\t\\tmargin-inline: 0 10px;\\n\\t}\\n\\n\\t&__bundle-header {\\n\\t\\tmargin-block: 0;\\n\\t\\tmargin-inline: 50px 10px;\\n\\t\\tfont-weight: bold;\\n\\t\\tfont-size: 20px;\\n\\t\\tline-height: 30px;\\n\\t\\tcolor: var(--color-text-light);\\n\\t}\\n}\\n\\n#apps-list-search {\\n\\t.app-item {\\n\\t\\th2 {\\n\\t\\t\\tmargin-bottom: 0;\\n\\t\\t}\\n\\t}\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `/*!\n * SPDX-FileCopyrightText: 2018 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */.app-item[data-v-4f1b9f2a]{position:relative}.app-item[data-v-4f1b9f2a]:hover{background-color:var(--color-background-dark)}.app-item--list-view[data-v-4f1b9f2a]{--app-item-padding: calc(var(--default-grid-baseline) * 2);--app-item-height: calc(var(--default-clickable-area) + var(--app-item-padding) * 2)}.app-item--list-view.app-item--selected[data-v-4f1b9f2a]{background-color:var(--color-background-dark)}.app-item--list-view>*[data-v-4f1b9f2a]{vertical-align:middle;border-bottom:1px solid var(--color-border);padding:var(--app-item-padding);height:var(--app-item-height)}.app-item--list-view .app-image[data-v-4f1b9f2a]{width:var(--default-clickable-area);height:auto;text-align:end}.app-item--list-view .app-image-icon svg[data-v-4f1b9f2a],.app-item--list-view .app-image-icon .icon-settings-dark[data-v-4f1b9f2a]{margin-top:5px;width:20px;height:20px;opacity:.5;background-size:cover;display:inline-block}.app-item--list-view .app-name[data-v-4f1b9f2a]{padding:0 var(--app-item-padding)}.app-item--list-view .app-name--link[data-v-4f1b9f2a]{height:var(--app-item-height);display:flex;align-items:center}.app-item--list-view .app-name--link[data-v-4f1b9f2a]::after{content:\"\";position:absolute;inset-inline:0;height:var(--app-item-height)}.app-item--list-view .app-actions[data-v-4f1b9f2a]{display:flex;gap:var(--app-item-padding);flex-wrap:wrap;justify-content:end}.app-item--list-view .app-actions .icon-loading-small[data-v-4f1b9f2a]{display:inline-block;top:4px;margin-inline-end:10px}@media only screen and (max-width: 900px){.app-item--list-view .app-version[data-v-4f1b9f2a],.app-item--list-view .app-level[data-v-4f1b9f2a]{display:none}}@media only screen and (max-width: 512px){.app-item--list-view .app-actions[data-v-4f1b9f2a]{display:none}}.app-item--store-view[data-v-4f1b9f2a]{padding:30px}.app-item--store-view .app-image-icon .icon-settings-dark[data-v-4f1b9f2a]{width:100%;height:150px;background-size:45px;opacity:.5}.app-item--store-view .app-image-icon svg[data-v-4f1b9f2a]{position:absolute;bottom:43px;width:64px;height:64px;opacity:.1}.app-item--store-view .app-name[data-v-4f1b9f2a]{margin:5px 0}.app-item--store-view .app-name--link[data-v-4f1b9f2a]::after{content:\"\";position:absolute;inset-block:0;inset-inline:0}.app-item--store-view .app-actions[data-v-4f1b9f2a]{margin:10px 0}@media only screen and (min-width: 1601px){.app-item--store-view[data-v-4f1b9f2a]{width:25%}.app-item--store-view.app-item--with-sidebar[data-v-4f1b9f2a]{width:33%}}@media only screen and (max-width: 1600px){.app-item--store-view[data-v-4f1b9f2a]{width:25%}.app-item--store-view.app-item--with-sidebar[data-v-4f1b9f2a]{width:33%}}@media only screen and (max-width: 1400px){.app-item--store-view[data-v-4f1b9f2a]{width:33%}.app-item--store-view.app-item--with-sidebar[data-v-4f1b9f2a]{width:50%}}@media only screen and (max-width: 900px){.app-item--store-view[data-v-4f1b9f2a]{width:50%}.app-item--store-view.app-item--with-sidebar[data-v-4f1b9f2a]{width:100%}}@media only screen and (max-width: 1024px){.app-item--store-view[data-v-4f1b9f2a]{width:50%}}@media only screen and (max-width: 480px){.app-item--store-view[data-v-4f1b9f2a]{width:100%}}.app-icon[data-v-4f1b9f2a]{filter:var(--background-invert-if-bright)}.app-image[data-v-4f1b9f2a]{position:relative;height:150px;opacity:1;overflow:hidden}.app-image img[data-v-4f1b9f2a]{width:100%}.app-version[data-v-4f1b9f2a]{color:var(--color-text-maxcontrast)}`, \"\",{\"version\":3,\"sources\":[\"webpack://./core/css/variables.scss\",\"webpack://./apps/settings/src/components/AppList/AppItem.vue\"],\"names\":[],\"mappings\":\"AAAA;;;EAAA,CCIA,2BACC,iBAAA,CAEA,iCACC,6CAAA,CAGD,sCACC,0DAAA,CACA,oFAAA,CAEA,yDACC,6CAAA,CAGD,wCACC,qBAAA,CACA,2CAAA,CACA,+BAAA,CACA,6BAAA,CAGD,iDACC,mCAAA,CACA,WAAA,CACA,cAAA,CAGD,oIAEC,cAAA,CACA,UAAA,CACA,WAAA,CACA,UAAA,CACA,qBAAA,CACA,oBAAA,CAGD,gDACC,iCAAA,CAGD,sDACC,6BAAA,CACA,YAAA,CACA,kBAAA,CAMD,6DACC,UAAA,CACA,iBAAA,CACA,cAAA,CACA,6BAAA,CAGD,mDACC,YAAA,CACA,2BAAA,CACA,cAAA,CACA,mBAAA,CAEA,uEACC,oBAAA,CACA,OAAA,CACA,sBAAA,CAKF,0CACC,oGAEC,YAAA,CAAA,CAKF,0CACC,mDACC,YAAA,CAAA,CAKH,uCACC,YAAA,CAEA,2EACC,UAAA,CACA,YAAA,CACA,oBAAA,CACA,UAAA,CAGD,2DACC,iBAAA,CACA,WAAA,CAEA,UAAA,CACA,WAAA,CACA,UAAA,CAGD,iDACC,YAAA,CAGD,8DACC,UAAA,CACA,iBAAA,CACA,aAAA,CACA,cAAA,CAGD,oDACC,aAAA,CAGD,2CAlCD,uCAmCE,SAAA,CAEA,8DACC,SAAA,CAAA,CAIF,2CA1CD,uCA2CE,SAAA,CAEA,8DACC,SAAA,CAAA,CAIF,2CAlDD,uCAmDE,SAAA,CAEA,8DACC,SAAA,CAAA,CAIF,0CA1DD,uCA2DE,SAAA,CAEA,8DACC,UAAA,CAAA,CAIF,2CAlED,uCAmEE,SAAA,CAAA,CAGD,0CAtED,uCAuEE,UAAA,CAAA,CAKH,2BACC,yCAAA,CAGD,4BACC,iBAAA,CACA,YAAA,CACA,SAAA,CACA,eAAA,CAEA,gCACC,UAAA,CAIF,8BACC,mCAAA\",\"sourcesContent\":[\"/*!\\n * SPDX-FileCopyrightText: 2018 Nextcloud GmbH and Nextcloud contributors\\n * SPDX-License-Identifier: AGPL-3.0-or-later\\n */\\n// SCSS darken/lighten function override\\n@function nc-darken($color, $value) {\\n\\t@return darken($color, $value);\\n}\\n\\n@function nc-lighten($color, $value) {\\n\\t@return lighten($color, $value);\\n}\\n\\n// SCSS variables\\n// DEPRECATED, please use CSS4 vars\\n$color-main-text: #222 !default; // Not #000 for better readability\\n$color-main-background: #fff !default;\\n$color-main-background-translucent: rgba($color-main-background, .97) !default;\\n\\n// used for different active/hover/focus/disabled states\\n$color-background-hover: nc-darken($color-main-background, 4%) !default;\\n$color-background-dark: nc-darken($color-main-background, 7%) !default;\\n$color-background-darker: nc-darken($color-main-background, 14%) !default;\\n\\n$color-placeholder-light: nc-darken($color-main-background, 10%) !default;\\n$color-placeholder-dark: nc-darken($color-main-background, 20%) !default;\\n\\n$color-primary: #0082c9 !default;\\n$color-primary-hover: mix($color-primary, $color-main-background, 80%) !default;\\n\\n$color-primary-light: mix($color-primary, $color-main-background, 10%) !default;\\n$color-primary-light-text: $color-primary !default;\\n$color-primary-light-hover: mix($color-primary-light, $color-main-text, 95%) !default;\\n\\n$color-primary-text: #ffffff !default;\\n// do not use nc-darken/lighten in case of overriding because\\n// primary-text is independent of color-main-text\\n$color-primary-element-text-dark: darken($color-primary-text, 7%) !default;\\n$color-primary-element: $color-primary !default;\\n$color-primary-element-hover: mix($color-primary-element, $color-main-background, 80%) !default;\\n$color-primary-element-light: lighten($color-primary-element, 15%) !default;\\n\\n$color-error: #e9322d;\\n$color-error-hover: mix($color-error, $color-main-background, 80%) !default;\\n$color-warning: #eca700;\\n$color-warning-hover: mix($color-warning, $color-main-background, 80%) !default;\\n$color-success: #46ba61;\\n$color-success-hover: mix($color-success, $color-main-background, 80%) !default;\\n// used for svg\\n$color-white: #fff;\\n$color-black: #000;\\n$color-yellow: #FC0;\\n\\n// rgb(118, 118, 118) / #767676\\n// min. color contrast for normal text on white background according to WCAG AA\\n// (Works as well: color: #000; opacity: 0.57;)\\n$color-text-maxcontrast: nc-lighten($color-main-text, 33%) !default;\\n$color-text-light: $color-main-text !default;\\n$color-text-lighter: $color-text-maxcontrast !default;\\n\\n$image-logo: url('../img/logo/logo.svg?v=1') !default;\\n$image-login-background: url('../img/background.png?v=2') !default;\\n$image-logoheader: url('../img/logo/logo.svg?v=1') !default;\\n$image-favicon: url('../img/logo/logo.svg?v=1') !default;\\n\\n$color-loading-light: #ccc !default;\\n$color-loading-dark: #444 !default;\\n\\n$color-box-shadow: transparentize(nc-darken($color-main-background, 70%), 0.5) !default;\\n\\n// light border like file table or app-content list\\n$color-border: nc-darken($color-main-background, 7%) !default;\\n// darker border like inputs or very visible elements\\n$color-border-dark: nc-darken($color-main-background, 14%) !default;\\n\\n$border-radius: 3px !default;\\n$border-radius-large: 10px !default;\\n// Pill-style button, value is large so big buttons also have correct roundness\\n$border-radius-pill: 100px !default;\\n\\n$font-face: system-ui, -apple-system, \\\"Segoe UI\\\", Roboto, Oxygen-Sans, Cantarell, Ubuntu, \\\"Helvetica Neue\\\", \\\"Noto Sans\\\", \\\"Liberation Sans\\\", Arial, sans-serif, \\\"Apple Color Emoji\\\", \\\"Segoe UI Emoji\\\", \\\"Segoe UI Symbol\\\", \\\"Noto Color Emoji\\\" !default;\\n$default-font-size: 15px;\\n\\n$default-line-height: 24px;\\n\\n$animation-quick: 100ms;\\n$animation-slow: 300ms;\\n\\n// various structure data\\n$header-height: 50px;\\n$navigation-width: 300px;\\n$sidebar-min-width: 300px;\\n$sidebar-max-width: 500px;\\n$list-min-width: 200px;\\n$list-max-width: 300px;\\n$header-menu-item-height: 44px;\\n$header-menu-profile-item-height: 66px;\\n\\n// mobile. Keep in sync with core/js/js.js\\n$breakpoint-mobile: 1024px;\\n\",\"\\n@use '../../../../../core/css/variables.scss' as variables;\\n@use 'sass:math';\\n\\n.app-item {\\n\\tposition: relative;\\n\\n\\t&:hover {\\n\\t\\tbackground-color: var(--color-background-dark);\\n\\t}\\n\\n\\t&--list-view {\\n\\t\\t--app-item-padding: calc(var(--default-grid-baseline) * 2);\\n\\t\\t--app-item-height: calc(var(--default-clickable-area) + var(--app-item-padding) * 2);\\n\\n\\t\\t&.app-item--selected {\\n\\t\\t\\tbackground-color: var(--color-background-dark);\\n\\t\\t}\\n\\n\\t\\t> * {\\n\\t\\t\\tvertical-align: middle;\\n\\t\\t\\tborder-bottom: 1px solid var(--color-border);\\n\\t\\t\\tpadding: var(--app-item-padding);\\n\\t\\t\\theight: var(--app-item-height);\\n\\t\\t}\\n\\n\\t\\t.app-image {\\n\\t\\t\\twidth: var(--default-clickable-area);\\n\\t\\t\\theight: auto;\\n\\t\\t\\ttext-align: end;\\n\\t\\t}\\n\\n\\t\\t.app-image-icon svg,\\n\\t\\t.app-image-icon .icon-settings-dark {\\n\\t\\t\\tmargin-top: 5px;\\n\\t\\t\\twidth: 20px;\\n\\t\\t\\theight: 20px;\\n\\t\\t\\topacity: .5;\\n\\t\\t\\tbackground-size: cover;\\n\\t\\t\\tdisplay: inline-block;\\n\\t\\t}\\n\\n\\t\\t.app-name {\\n\\t\\t\\tpadding: 0 var(--app-item-padding);\\n\\t\\t}\\n\\n\\t\\t.app-name--link {\\n\\t\\t\\theight: var(--app-item-height);\\n\\t\\t\\tdisplay: flex;\\n\\t\\t\\talign-items: center;\\n\\t\\t}\\n\\n\\t\\t// Note: because of Safari bug, we cannot position link overlay relative to the table row\\n\\t\\t// So we need to manually position it relative to the table container and cell\\n\\t\\t// See: https://bugs.webkit.org/show_bug.cgi?id=240961\\n\\t\\t.app-name--link::after {\\n\\t\\t\\tcontent: '';\\n\\t\\t\\tposition: absolute;\\n\\t\\t\\tinset-inline: 0;\\n\\t\\t\\theight: var(--app-item-height);\\n\\t\\t}\\n\\n\\t\\t.app-actions {\\n\\t\\t\\tdisplay: flex;\\n\\t\\t\\tgap: var(--app-item-padding);\\n\\t\\t\\tflex-wrap: wrap;\\n\\t\\t\\tjustify-content: end;\\n\\n\\t\\t\\t.icon-loading-small {\\n\\t\\t\\t\\tdisplay: inline-block;\\n\\t\\t\\t\\ttop: 4px;\\n\\t\\t\\t\\tmargin-inline-end: 10px;\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t/* hide app version and level on narrower screens */\\n\\t\\t@media only screen and (max-width: 900px) {\\n\\t\\t\\t.app-version,\\n\\t\\t\\t.app-level {\\n\\t\\t\\t\\tdisplay: none;\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t/* Hide actions on a small screen. Click on app opens fill-screen sidebar with the buttons */\\n\\t\\t@media only screen and (max-width: math.div(variables.$breakpoint-mobile, 2)) {\\n\\t\\t\\t.app-actions {\\n\\t\\t\\t\\tdisplay: none;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\t&--store-view {\\n\\t\\tpadding: 30px;\\n\\n\\t\\t.app-image-icon .icon-settings-dark {\\n\\t\\t\\twidth: 100%;\\n\\t\\t\\theight: 150px;\\n\\t\\t\\tbackground-size: 45px;\\n\\t\\t\\topacity: 0.5;\\n\\t\\t}\\n\\n\\t\\t.app-image-icon svg {\\n\\t\\t\\tposition: absolute;\\n\\t\\t\\tbottom: 43px;\\n\\t\\t\\t/* position halfway vertically */\\n\\t\\t\\twidth: 64px;\\n\\t\\t\\theight: 64px;\\n\\t\\t\\topacity: .1;\\n\\t\\t}\\n\\n\\t\\t.app-name {\\n\\t\\t\\tmargin: 5px 0;\\n\\t\\t}\\n\\n\\t\\t.app-name--link::after {\\n\\t\\t\\tcontent: '';\\n\\t\\t\\tposition: absolute;\\n\\t\\t\\tinset-block: 0;\\n\\t\\t\\tinset-inline: 0;\\n\\t\\t}\\n\\n\\t\\t.app-actions {\\n\\t\\t\\tmargin: 10px 0;\\n\\t\\t}\\n\\n\\t\\t@media only screen and (min-width: 1601px) {\\n\\t\\t\\twidth: 25%;\\n\\n\\t\\t\\t&.app-item--with-sidebar {\\n\\t\\t\\t\\twidth: 33%;\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t@media only screen and (max-width: 1600px) {\\n\\t\\t\\twidth: 25%;\\n\\n\\t\\t\\t&.app-item--with-sidebar {\\n\\t\\t\\t\\twidth: 33%;\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t@media only screen and (max-width: 1400px) {\\n\\t\\t\\twidth: 33%;\\n\\n\\t\\t\\t&.app-item--with-sidebar {\\n\\t\\t\\t\\twidth: 50%;\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t@media only screen and (max-width: 900px) {\\n\\t\\t\\twidth: 50%;\\n\\n\\t\\t\\t&.app-item--with-sidebar {\\n\\t\\t\\t\\twidth: 100%;\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t@media only screen and (max-width: variables.$breakpoint-mobile) {\\n\\t\\t\\twidth: 50%;\\n\\t\\t}\\n\\n\\t\\t@media only screen and (max-width: 480px) {\\n\\t\\t\\twidth: 100%;\\n\\t\\t}\\n\\t}\\n}\\n\\n.app-icon {\\n\\tfilter: var(--background-invert-if-bright);\\n}\\n\\n.app-image {\\n\\tposition: relative;\\n\\theight: 150px;\\n\\topacity: 1;\\n\\toverflow: hidden;\\n\\n\\timg {\\n\\t\\twidth: 100%;\\n\\t}\\n}\\n\\n.app-version {\\n\\tcolor: var(--color-text-maxcontrast);\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `.app-level-badge[data-v-5ee601b2]{color:var(--color-text-maxcontrast);background-color:rgba(0,0,0,0);border:1px solid var(--color-text-maxcontrast);border-radius:var(--border-radius);display:flex;flex-direction:row;gap:6px;padding:3px 6px;width:fit-content}.app-level-badge--supported[data-v-5ee601b2]{border-color:var(--color-success);color:var(--color-success)}`, \"\",{\"version\":3,\"sources\":[\"webpack://./apps/settings/src/components/AppList/AppLevelBadge.vue\"],\"names\":[],\"mappings\":\"AACA,kCACC,mCAAA,CACA,8BAAA,CACA,8CAAA,CACA,kCAAA,CAEA,YAAA,CACA,kBAAA,CACA,OAAA,CACA,eAAA,CACA,iBAAA,CAEA,6CACC,iCAAA,CACA,0BAAA\",\"sourcesContent\":[\"\\n.app-level-badge {\\n\\tcolor: var(--color-text-maxcontrast);\\n\\tbackground-color: transparent;\\n\\tborder: 1px solid var(--color-text-maxcontrast);\\n\\tborder-radius: var(--border-radius);\\n\\n\\tdisplay: flex;\\n\\tflex-direction: row;\\n\\tgap: 6px;\\n\\tpadding: 3px 6px;\\n\\twidth: fit-content;\\n\\n\\t&--supported {\\n\\t\\tborder-color: var(--color-success);\\n\\t\\tcolor: var(--color-success);\\n\\t}\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `.app-discover[data-v-bb597eea]{max-width:1008px;margin-inline:auto;padding-inline:54px;padding-block-end:var(--default-clickable-area, 44px);display:flex;flex-direction:column;gap:var(--default-clickable-area, 44px)}`, \"\",{\"version\":3,\"sources\":[\"webpack://./apps/settings/src/components/AppStoreDiscover/AppStoreDiscoverSection.vue\"],\"names\":[],\"mappings\":\"AACA,+BACC,gBAAA,CACA,kBAAA,CACA,mBAAA,CAEA,qDAAA,CAEA,YAAA,CACA,qBAAA,CACA,uCAAA\",\"sourcesContent\":[\"\\n.app-discover {\\n\\tmax-width: 1008px; /* 900px + 2x 54px padding for the carousel controls */\\n\\tmargin-inline: auto;\\n\\tpadding-inline: 54px;\\n\\t/* Padding required to make last element not bound to the bottom */\\n\\tpadding-block-end: var(--default-clickable-area, 44px);\\n\\n\\tdisplay: flex;\\n\\tflex-direction: column;\\n\\tgap: var(--default-clickable-area, 44px);\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `.app-description[data-v-cf0a1ae6]{padding:12px}`, \"\",{\"version\":3,\"sources\":[\"webpack://./apps/settings/src/components/AppStoreSidebar/AppDescriptionTab.vue\"],\"names\":[],\"mappings\":\"AACA,kCACC,YAAA\",\"sourcesContent\":[\"\\n.app-description {\\n\\tpadding: 12px;\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `.app-details[data-v-533705fa]{padding:20px}.app-details__actions-manage[data-v-533705fa]{display:flex}.app-details__actions-manage input[data-v-533705fa]{flex:0 1 auto;min-width:0;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.app-details__authors[data-v-533705fa]{color:var(--color-text-maxcontrast)}.app-details__section[data-v-533705fa]{margin-top:15px}.app-details__section h4[data-v-533705fa]{font-size:16px;font-weight:bold;margin-block-end:5px}.app-details__interact[data-v-533705fa]{display:flex;flex-direction:row;flex-wrap:wrap;gap:12px}.app-details__documentation a[data-v-533705fa]{text-decoration:underline}.app-details__documentation li[data-v-533705fa]{padding-inline-start:20px}.app-details__documentation li[data-v-533705fa]::before{width:5px;height:5px;border-radius:100%;background-color:var(--color-main-text);content:\"\";float:inline-start;margin-inline-start:-13px;position:relative;top:10px}.force[data-v-533705fa]{color:var(--color-error);border-color:var(--color-error);background:var(--color-main-background)}.force[data-v-533705fa]:hover,.force[data-v-533705fa]:active{color:var(--color-main-background);border-color:var(--color-error) !important;background:var(--color-error)}.missing-dependencies[data-v-533705fa]{list-style:initial;list-style-type:initial;list-style-position:inside}`, \"\",{\"version\":3,\"sources\":[\"webpack://./apps/settings/src/components/AppStoreSidebar/AppDetailsTab.vue\"],\"names\":[],\"mappings\":\"AACA,8BACC,YAAA,CAIC,8CAEC,YAAA,CACA,oDACC,aAAA,CACA,WAAA,CACA,sBAAA,CACA,kBAAA,CACA,eAAA,CAIH,uCACC,mCAAA,CAGD,uCACC,eAAA,CAEA,0CACC,cAAA,CACA,gBAAA,CACA,oBAAA,CAIF,wCACC,YAAA,CACA,kBAAA,CACA,cAAA,CACA,QAAA,CAIA,+CACC,yBAAA,CAED,gDACC,yBAAA,CAEA,wDACC,SAAA,CACA,UAAA,CACA,kBAAA,CACA,uCAAA,CACA,UAAA,CACA,kBAAA,CACA,yBAAA,CACA,iBAAA,CACA,QAAA,CAMJ,wBACC,wBAAA,CACA,+BAAA,CACA,uCAAA,CAED,6DAEC,kCAAA,CACA,0CAAA,CACA,6BAAA,CAGD,uCACC,kBAAA,CACA,uBAAA,CACA,0BAAA\",\"sourcesContent\":[\"\\n.app-details {\\n\\tpadding: 20px;\\n\\n\\t&__actions {\\n\\t\\t// app management\\n\\t\\t&-manage {\\n\\t\\t\\t// if too many, shrink them and ellipsis\\n\\t\\t\\tdisplay: flex;\\n\\t\\t\\tinput {\\n\\t\\t\\t\\tflex: 0 1 auto;\\n\\t\\t\\t\\tmin-width: 0;\\n\\t\\t\\t\\ttext-overflow: ellipsis;\\n\\t\\t\\t\\twhite-space: nowrap;\\n\\t\\t\\t\\toverflow: hidden;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\t&__authors {\\n\\t\\tcolor: var(--color-text-maxcontrast);\\n\\t}\\n\\n\\t&__section {\\n\\t\\tmargin-top: 15px;\\n\\n\\t\\th4 {\\n\\t\\t\\tfont-size: 16px;\\n\\t\\t\\tfont-weight: bold;\\n\\t\\t\\tmargin-block-end: 5px;\\n\\t\\t}\\n\\t}\\n\\n\\t&__interact {\\n\\t\\tdisplay: flex;\\n\\t\\tflex-direction: row;\\n\\t\\tflex-wrap: wrap;\\n\\t\\tgap: 12px;\\n\\t}\\n\\n\\t&__documentation {\\n\\t\\ta {\\n\\t\\t\\ttext-decoration: underline;\\n\\t\\t}\\n\\t\\tli {\\n\\t\\t\\tpadding-inline-start: 20px;\\n\\n\\t\\t\\t&::before {\\n\\t\\t\\t\\twidth: 5px;\\n\\t\\t\\t\\theight: 5px;\\n\\t\\t\\t\\tborder-radius: 100%;\\n\\t\\t\\t\\tbackground-color: var(--color-main-text);\\n\\t\\t\\t\\tcontent: \\\"\\\";\\n\\t\\t\\t\\tfloat: inline-start;\\n\\t\\t\\t\\tmargin-inline-start: -13px;\\n\\t\\t\\t\\tposition: relative;\\n\\t\\t\\t\\ttop: 10px;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n}\\n\\n.force {\\n\\tcolor: var(--color-error);\\n\\tborder-color: var(--color-error);\\n\\tbackground: var(--color-main-background);\\n}\\n.force:hover,\\n.force:active {\\n\\tcolor: var(--color-main-background);\\n\\tborder-color: var(--color-error) !important;\\n\\tbackground: var(--color-error);\\n}\\n\\n.missing-dependencies {\\n\\tlist-style: initial;\\n\\tlist-style-type: initial;\\n\\tlist-style-position: inside;\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `.app-sidebar-tabs__release h2[data-v-9c32407e]{border-bottom:1px solid var(--color-border);font-size:24px}.app-sidebar-tabs__release-text[data-v-9c32407e] h3{font-size:20px}.app-sidebar-tabs__release-text[data-v-9c32407e] h4{font-size:17px}`, \"\",{\"version\":3,\"sources\":[\"webpack://./apps/settings/src/components/AppStoreSidebar/AppReleasesTab.vue\"],\"names\":[],\"mappings\":\"AAEC,+CACC,2CAAA,CACA,cAAA,CAKA,oDACC,cAAA,CAED,oDACC,cAAA\",\"sourcesContent\":[\"\\n.app-sidebar-tabs__release {\\n\\th2 {\\n\\t\\tborder-bottom: 1px solid var(--color-border);\\n\\t\\tfont-size: 24px;\\n\\t}\\n\\n\\t&-text {\\n\\t\\t// Overwrite changelog heading styles\\n\\t\\t:deep(h3) {\\n\\t\\t\\tfont-size: 20px;\\n\\t\\t}\\n\\t\\t:deep(h4) {\\n\\t\\t\\tfont-size: 17px;\\n\\t\\t}\\n\\t}\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `.settings-markdown[data-v-5d3cebad] h1,.settings-markdown[data-v-5d3cebad] h2,.settings-markdown[data-v-5d3cebad] h3,.settings-markdown[data-v-5d3cebad] h4,.settings-markdown[data-v-5d3cebad] h5,.settings-markdown[data-v-5d3cebad] h6{font-weight:600;line-height:120%;margin-top:24px;margin-bottom:12px;color:var(--color-main-text)}.settings-markdown[data-v-5d3cebad] h1{font-size:36px;margin-top:48px}.settings-markdown[data-v-5d3cebad] h2{font-size:28px;margin-top:48px}.settings-markdown[data-v-5d3cebad] h3{font-size:24px}.settings-markdown[data-v-5d3cebad] h4{font-size:21px}.settings-markdown[data-v-5d3cebad] h5{font-size:17px}.settings-markdown[data-v-5d3cebad] h6{font-size:var(--default-font-size)}.settings-markdown[data-v-5d3cebad] pre{white-space:pre;overflow-x:auto;background-color:var(--color-background-dark);border-radius:var(--border-radius);padding:1em 1.3em;margin-bottom:1em}.settings-markdown[data-v-5d3cebad] p code{background-color:var(--color-background-dark);border-radius:var(--border-radius);padding:.1em .3em}.settings-markdown[data-v-5d3cebad] li{position:relative}.settings-markdown[data-v-5d3cebad] ul,.settings-markdown[data-v-5d3cebad] ol{padding-inline-start:10px;margin-inline-start:10px}.settings-markdown[data-v-5d3cebad] ul li{list-style-type:disc}.settings-markdown[data-v-5d3cebad] ul>li>ul>li{list-style-type:circle}.settings-markdown[data-v-5d3cebad] ul>li>ul>li ul li{list-style-type:square}.settings-markdown[data-v-5d3cebad] blockquote{padding-inline-start:1em;border-inline-start:4px solid var(--color-primary-element);color:var(--color-text-maxcontrast);margin-inline:0}`, \"\",{\"version\":3,\"sources\":[\"webpack://./apps/settings/src/components/Markdown.vue\"],\"names\":[],\"mappings\":\"AAGA,0OAMC,eAAA,CACA,gBAAA,CACA,eAAA,CACA,kBAAA,CACA,4BAAA,CAGD,uCACC,cAAA,CACA,eAAA,CAGD,uCACC,cAAA,CACA,eAAA,CAGD,uCACC,cAAA,CAGD,uCACC,cAAA,CAGD,uCACC,cAAA,CAGD,uCACC,kCAAA,CAGD,wCACC,eAAA,CACA,eAAA,CACA,6CAAA,CACA,kCAAA,CACA,iBAAA,CACA,iBAAA,CAGD,2CACC,6CAAA,CACA,kCAAA,CACA,iBAAA,CAGD,uCACC,iBAAA,CAGD,8EACC,yBAAA,CACA,wBAAA,CAGD,0CACC,oBAAA,CAGD,gDACC,sBAAA,CAGD,sDACC,sBAAA,CAGD,+CACC,wBAAA,CACA,0DAAA,CACA,mCAAA,CACA,eAAA\",\"sourcesContent\":[\"\\n.settings-markdown::v-deep {\\n\\nh1,\\nh2,\\nh3,\\nh4,\\nh5,\\nh6 {\\n\\tfont-weight: 600;\\n\\tline-height: 120%;\\n\\tmargin-top: 24px;\\n\\tmargin-bottom: 12px;\\n\\tcolor: var(--color-main-text);\\n}\\n\\nh1 {\\n\\tfont-size: 36px;\\n\\tmargin-top: 48px;\\n}\\n\\nh2 {\\n\\tfont-size: 28px;\\n\\tmargin-top: 48px;\\n}\\n\\nh3 {\\n\\tfont-size: 24px;\\n}\\n\\nh4 {\\n\\tfont-size: 21px;\\n}\\n\\nh5 {\\n\\tfont-size: 17px;\\n}\\n\\nh6 {\\n\\tfont-size: var(--default-font-size);\\n}\\n\\npre {\\n\\twhite-space: pre;\\n\\toverflow-x: auto;\\n\\tbackground-color: var(--color-background-dark);\\n\\tborder-radius: var(--border-radius);\\n\\tpadding: 1em 1.3em;\\n\\tmargin-bottom: 1em;\\n}\\n\\np code {\\n\\tbackground-color: var(--color-background-dark);\\n\\tborder-radius: var(--border-radius);\\n\\tpadding: .1em .3em;\\n}\\n\\nli {\\n\\tposition: relative;\\n}\\n\\nul, ol {\\n\\tpadding-inline-start: 10px;\\n\\tmargin-inline-start: 10px;\\n}\\n\\nul li {\\n\\tlist-style-type: disc;\\n}\\n\\nul > li > ul > li {\\n\\tlist-style-type: circle;\\n}\\n\\nul > li > ul > li ul li {\\n\\tlist-style-type: square;\\n}\\n\\nblockquote {\\n\\tpadding-inline-start: 1em;\\n\\tborder-inline-start: 4px solid var(--color-primary-element);\\n\\tcolor: var(--color-text-maxcontrast);\\n\\tmargin-inline: 0;\\n}\\n\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `.app-sidebar--with-screenshot[data-v-2f300fa2] .app-sidebar-header__figure{background-size:cover}.app-sidebar__fallback-icon[data-v-2f300fa2]{width:100%;height:100%}.app-sidebar__badges[data-v-2f300fa2]{display:flex;flex-direction:row;gap:12px}.app-sidebar__version[data-v-2f300fa2]{color:var(--color-text-maxcontrast)}`, \"\",{\"version\":3,\"sources\":[\"webpack://./apps/settings/src/views/AppStoreSidebar.vue\"],\"names\":[],\"mappings\":\"AAIE,2EACC,qBAAA,CAIF,6CAEC,UAAA,CACA,WAAA,CAGD,sCACC,YAAA,CACA,kBAAA,CACA,QAAA,CAGD,uCACC,mCAAA\",\"sourcesContent\":[\"\\n.app-sidebar {\\n\\t// If a screenshot is available it should cover the whole figure\\n\\t&--with-screenshot {\\n\\t\\t:deep(.app-sidebar-header__figure) {\\n\\t\\t\\tbackground-size: cover;\\n\\t\\t}\\n\\t}\\n\\n\\t&__fallback-icon {\\n\\t\\t// both 100% to center the icon\\n\\t\\twidth: 100%;\\n\\t\\theight: 100%;\\n\\t}\\n\\n\\t&__badges {\\n\\t\\tdisplay: flex;\\n\\t\\tflex-direction: row;\\n\\t\\tgap: 12px;\\n\\t}\\n\\n\\t&__version {\\n\\t\\tcolor: var(--color-text-maxcontrast);\\n\\t}\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `\n.app-score__wrapper[data-v-2193f4e0] {\n\tdisplay: inline-flex;\n\tcolor: var(--color-favorite, #a08b00);\n> *[data-v-2193f4e0] {\n\t\tvertical-align: text-bottom;\n}\n}\n`, \"\",{\"version\":3,\"sources\":[\"webpack://./apps/settings/src/components/AppList/AppScore.vue\"],\"names\":[],\"mappings\":\";AA+DA;CACA,oBAAA;CACA,qCAAA;AAEA;EACA,2BAAA;AACA;AACA\",\"sourcesContent\":[\"<!--\\n - SPDX-FileCopyrightText: 2018 Nextcloud GmbH and Nextcloud contributors\\n - SPDX-License-Identifier: AGPL-3.0-or-later\\n-->\\n\\n<template>\\n\\t<span role=\\\"img\\\"\\n\\t\\t:aria-label=\\\"title\\\"\\n\\t\\t:title=\\\"title\\\"\\n\\t\\tclass=\\\"app-score__wrapper\\\">\\n\\t\\t<NcIconSvgWrapper v-for=\\\"index in fullStars\\\"\\n\\t\\t\\t:key=\\\"`full-star-${index}`\\\"\\n\\t\\t\\t:path=\\\"mdiStar\\\"\\n\\t\\t\\tinline />\\n\\t\\t<NcIconSvgWrapper v-if=\\\"hasHalfStar\\\" :path=\\\"mdiStarHalfFull\\\" inline />\\n\\t\\t<NcIconSvgWrapper v-for=\\\"index in emptyStars\\\"\\n\\t\\t\\t:key=\\\"`empty-star-${index}`\\\"\\n\\t\\t\\t:path=\\\"mdiStarOutline\\\"\\n\\t\\t\\tinline />\\n\\t</span>\\n</template>\\n<script lang=\\\"ts\\\">\\nimport NcIconSvgWrapper from '@nextcloud/vue/dist/Components/NcIconSvgWrapper.js'\\nimport { mdiStar, mdiStarHalfFull, mdiStarOutline } from '@mdi/js'\\nimport { translate as t } from '@nextcloud/l10n'\\nimport { defineComponent } from 'vue'\\n\\nexport default defineComponent({\\n\\tname: 'AppScore',\\n\\tcomponents: {\\n\\t\\tNcIconSvgWrapper,\\n\\t},\\n\\tprops: {\\n\\t\\tscore: {\\n\\t\\t\\ttype: Number,\\n\\t\\t\\trequired: true,\\n\\t\\t},\\n\\t},\\n\\tsetup() {\\n\\t\\treturn {\\n\\t\\t\\tmdiStar,\\n\\t\\t\\tmdiStarHalfFull,\\n\\t\\t\\tmdiStarOutline,\\n\\t\\t}\\n\\t},\\n\\tcomputed: {\\n\\t\\ttitle() {\\n\\t\\t\\tconst appScore = (this.score * 5).toFixed(1)\\n\\t\\t\\treturn t('settings', 'Community rating: {score}/5', { score: appScore })\\n\\t\\t},\\n\\t\\tfullStars() {\\n\\t\\t\\treturn Math.floor(this.score * 5 + 0.25)\\n\\t\\t},\\n\\t\\temptyStars() {\\n\\t\\t\\treturn Math.min(Math.floor((1 - this.score) * 5 + 0.25), 5 - this.fullStars)\\n\\t\\t},\\n\\t\\thasHalfStar() {\\n\\t\\t\\treturn (this.fullStars + this.emptyStars) < 5\\n\\t\\t},\\n\\t},\\n})\\n</script>\\n<style scoped>\\n.app-score__wrapper {\\n\\tdisplay: inline-flex;\\n\\tcolor: var(--color-favorite, #a08b00);\\n\\n\\t> * {\\n\\t\\tvertical-align: text-bottom;\\n\\t}\\n}\\n</style>\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `\n.empty-content__loading[data-v-f9073bbe] {\n\theight: 100%;\n}\n.app-settings-content__label[data-v-f9073bbe] {\n\tmargin-block-start: var(--app-navigation-padding);\n\tmargin-inline-start: calc(var(--default-clickable-area) + var(--app-navigation-padding) * 2);\n\tmin-height: var(--default-clickable-area);\n\tline-height: var(--default-clickable-area);\n\tvertical-align: center;\n}\n`, \"\",{\"version\":3,\"sources\":[\"webpack://./apps/settings/src/views/AppStore.vue\"],\"names\":[],\"mappings\":\";AAkEA;CACA,YAAA;AACA;AAEA;CACA,iDAAA;CACA,4FAAA;CACA,yCAAA;CACA,0CAAA;CACA,sBAAA;AACA\",\"sourcesContent\":[\"<!--\\n - SPDX-FileCopyrightText: 2018 Nextcloud GmbH and Nextcloud contributors\\n - SPDX-License-Identifier: AGPL-3.0-or-later\\n-->\\n\\n<template>\\n\\t<!-- Apps list -->\\n\\t<NcAppContent class=\\\"app-settings-content\\\"\\n\\t\\t:page-heading=\\\"appStoreLabel\\\">\\n\\t\\t<h2 class=\\\"app-settings-content__label\\\" v-text=\\\"viewLabel\\\" />\\n\\n\\t\\t<AppStoreDiscoverSection v-if=\\\"currentCategory === 'discover'\\\" />\\n\\t\\t<NcEmptyContent v-else-if=\\\"isLoading\\\"\\n\\t\\t\\tclass=\\\"empty-content__loading\\\"\\n\\t\\t\\t:name=\\\"t('settings', 'Loading app list')\\\">\\n\\t\\t\\t<template #icon>\\n\\t\\t\\t\\t<NcLoadingIcon :size=\\\"64\\\" />\\n\\t\\t\\t</template>\\n\\t\\t</NcEmptyContent>\\n\\t\\t<AppList v-else :category=\\\"currentCategory\\\" />\\n\\t</NcAppContent>\\n</template>\\n\\n<script setup lang=\\\"ts\\\">\\nimport { translate as t } from '@nextcloud/l10n'\\nimport { computed, getCurrentInstance, onBeforeMount, watchEffect } from 'vue'\\nimport { useRoute } from 'vue-router/composables'\\n\\nimport { useAppsStore } from '../store/apps-store'\\nimport { APPS_SECTION_ENUM } from '../constants/AppsConstants'\\n\\nimport NcAppContent from '@nextcloud/vue/dist/Components/NcAppContent.js'\\nimport NcEmptyContent from '@nextcloud/vue/dist/Components/NcEmptyContent.js'\\nimport NcLoadingIcon from '@nextcloud/vue/dist/Components/NcLoadingIcon.js'\\nimport AppList from '../components/AppList.vue'\\nimport AppStoreDiscoverSection from '../components/AppStoreDiscover/AppStoreDiscoverSection.vue'\\n\\nconst route = useRoute()\\nconst store = useAppsStore()\\n\\n/**\\n * ID of the current active category, default is `discover`\\n */\\nconst currentCategory = computed(() => route.params?.category ?? 'discover')\\n\\nconst appStoreLabel = t('settings', 'App Store')\\nconst viewLabel = computed(() => APPS_SECTION_ENUM[currentCategory.value] ?? store.getCategoryById(currentCategory.value)?.displayName ?? appStoreLabel)\\n\\nwatchEffect(() => {\\n\\twindow.document.title = `${viewLabel.value} - ${appStoreLabel} - Nextcloud`\\n})\\n\\n// TODO this part should be migrated to pinia\\nconst instance = getCurrentInstance()\\n/** Is the app list loading */\\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\\nconst isLoading = computed(() => (instance?.proxy as any).$store.getters.loading('list'))\\nonBeforeMount(() => {\\n\\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\\n\\t(instance?.proxy as any).$store.dispatch('getCategories', { shouldRefetchCategories: true });\\n\\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\\n\\t(instance?.proxy as any).$store.dispatch('getAllApps')\\n})\\n</script>\\n\\n<style scoped>\\n.empty-content__loading {\\n\\theight: 100%;\\n}\\n\\n.app-settings-content__label {\\n\\tmargin-block-start: var(--app-navigation-padding);\\n\\tmargin-inline-start: calc(var(--default-clickable-area) + var(--app-navigation-padding) * 2);\\n\\tmin-height: var(--default-clickable-area);\\n\\tline-height: var(--default-clickable-area);\\n\\tvertical-align: center;\\n}\\n</style>\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `\n/* The categories-loading indicator */\n.categories--loading[data-v-1e611b27] {\n\tflex: 1;\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n}\n`, \"\",{\"version\":3,\"sources\":[\"webpack://./apps/settings/src/views/AppStoreNavigation.vue\"],\"names\":[],\"mappings\":\";AA0IA,qCAAA;AACA;CACA,OAAA;CACA,aAAA;CACA,mBAAA;CACA,uBAAA;AACA\",\"sourcesContent\":[\"<!--\\n - SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors\\n - SPDX-License-Identifier: AGPL-3.0-or-later\\n-->\\n<template>\\n\\t<!-- Categories & filters -->\\n\\t<NcAppNavigation :aria-label=\\\"t('settings', 'Apps')\\\">\\n\\t\\t<template #list>\\n\\t\\t\\t<NcAppNavigationItem id=\\\"app-category-discover\\\"\\n\\t\\t\\t\\t:to=\\\"{ name: 'apps-category', params: { category: 'discover'} }\\\"\\n\\t\\t\\t\\t:name=\\\"APPS_SECTION_ENUM.discover\\\">\\n\\t\\t\\t\\t<template #icon>\\n\\t\\t\\t\\t\\t<NcIconSvgWrapper :path=\\\"APPSTORE_CATEGORY_ICONS.discover\\\" />\\n\\t\\t\\t\\t</template>\\n\\t\\t\\t</NcAppNavigationItem>\\n\\t\\t\\t<NcAppNavigationItem id=\\\"app-category-installed\\\"\\n\\t\\t\\t\\t:to=\\\"{ name: 'apps-category', params: { category: 'installed'} }\\\"\\n\\t\\t\\t\\t:name=\\\"APPS_SECTION_ENUM.installed\\\">\\n\\t\\t\\t\\t<template #icon>\\n\\t\\t\\t\\t\\t<NcIconSvgWrapper :path=\\\"APPSTORE_CATEGORY_ICONS.installed\\\" />\\n\\t\\t\\t\\t</template>\\n\\t\\t\\t</NcAppNavigationItem>\\n\\t\\t\\t<NcAppNavigationItem id=\\\"app-category-enabled\\\"\\n\\t\\t\\t\\t:to=\\\"{ name: 'apps-category', params: { category: 'enabled' } }\\\"\\n\\t\\t\\t\\t:name=\\\"APPS_SECTION_ENUM.enabled\\\">\\n\\t\\t\\t\\t<template #icon>\\n\\t\\t\\t\\t\\t<NcIconSvgWrapper :path=\\\"APPSTORE_CATEGORY_ICONS.enabled\\\" />\\n\\t\\t\\t\\t</template>\\n\\t\\t\\t</NcAppNavigationItem>\\n\\t\\t\\t<NcAppNavigationItem id=\\\"app-category-disabled\\\"\\n\\t\\t\\t\\t:to=\\\"{ name: 'apps-category', params: { category: 'disabled' } }\\\"\\n\\t\\t\\t\\t:name=\\\"APPS_SECTION_ENUM.disabled\\\">\\n\\t\\t\\t\\t<template #icon>\\n\\t\\t\\t\\t\\t<NcIconSvgWrapper :path=\\\"APPSTORE_CATEGORY_ICONS.disabled\\\" />\\n\\t\\t\\t\\t</template>\\n\\t\\t\\t</NcAppNavigationItem>\\n\\t\\t\\t<NcAppNavigationItem v-if=\\\"updateCount > 0\\\"\\n\\t\\t\\t\\tid=\\\"app-category-updates\\\"\\n\\t\\t\\t\\t:to=\\\"{ name: 'apps-category', params: { category: 'updates' } }\\\"\\n\\t\\t\\t\\t:name=\\\"APPS_SECTION_ENUM.updates\\\">\\n\\t\\t\\t\\t<template #counter>\\n\\t\\t\\t\\t\\t<NcCounterBubble>{{ updateCount }}</NcCounterBubble>\\n\\t\\t\\t\\t</template>\\n\\t\\t\\t\\t<template #icon>\\n\\t\\t\\t\\t\\t<NcIconSvgWrapper :path=\\\"APPSTORE_CATEGORY_ICONS.updates\\\" />\\n\\t\\t\\t\\t</template>\\n\\t\\t\\t</NcAppNavigationItem>\\n\\t\\t\\t<NcAppNavigationItem id=\\\"app-category-your-bundles\\\"\\n\\t\\t\\t\\t:to=\\\"{ name: 'apps-category', params: { category: 'app-bundles' } }\\\"\\n\\t\\t\\t\\t:name=\\\"APPS_SECTION_ENUM['app-bundles']\\\">\\n\\t\\t\\t\\t<template #icon>\\n\\t\\t\\t\\t\\t<NcIconSvgWrapper :path=\\\"APPSTORE_CATEGORY_ICONS.bundles\\\" />\\n\\t\\t\\t\\t</template>\\n\\t\\t\\t</NcAppNavigationItem>\\n\\n\\t\\t\\t<NcAppNavigationSpacer />\\n\\n\\t\\t\\t<!-- App store categories -->\\n\\t\\t\\t<li v-if=\\\"appstoreEnabled && categoriesLoading\\\" class=\\\"categories--loading\\\">\\n\\t\\t\\t\\t<NcLoadingIcon :size=\\\"20\\\" :aria-label=\\\"t('settings', 'Loading categories')\\\" />\\n\\t\\t\\t</li>\\n\\t\\t\\t<template v-else-if=\\\"appstoreEnabled && !categoriesLoading\\\">\\n\\t\\t\\t\\t<NcAppNavigationItem v-if=\\\"isSubscribed\\\"\\n\\t\\t\\t\\t\\tid=\\\"app-category-supported\\\"\\n\\t\\t\\t\\t\\t:to=\\\"{ name: 'apps-category', params: { category: 'supported' } }\\\"\\n\\t\\t\\t\\t\\t:name=\\\"APPS_SECTION_ENUM.supported\\\">\\n\\t\\t\\t\\t\\t<template #icon>\\n\\t\\t\\t\\t\\t\\t<NcIconSvgWrapper :path=\\\"APPSTORE_CATEGORY_ICONS.supported\\\" />\\n\\t\\t\\t\\t\\t</template>\\n\\t\\t\\t\\t</NcAppNavigationItem>\\n\\t\\t\\t\\t<NcAppNavigationItem id=\\\"app-category-featured\\\"\\n\\t\\t\\t\\t\\t:to=\\\"{ name: 'apps-category', params: { category: 'featured' } }\\\"\\n\\t\\t\\t\\t\\t:name=\\\"APPS_SECTION_ENUM.featured\\\">\\n\\t\\t\\t\\t\\t<template #icon>\\n\\t\\t\\t\\t\\t\\t<NcIconSvgWrapper :path=\\\"APPSTORE_CATEGORY_ICONS.featured\\\" />\\n\\t\\t\\t\\t\\t</template>\\n\\t\\t\\t\\t</NcAppNavigationItem>\\n\\n\\t\\t\\t\\t<NcAppNavigationItem v-for=\\\"category in categories\\\"\\n\\t\\t\\t\\t\\t:id=\\\"`app-category-${category.id}`\\\"\\n\\t\\t\\t\\t\\t:key=\\\"category.id\\\"\\n\\t\\t\\t\\t\\t:name=\\\"category.displayName\\\"\\n\\t\\t\\t\\t\\t:to=\\\"{\\n\\t\\t\\t\\t\\t\\tname: 'apps-category',\\n\\t\\t\\t\\t\\t\\tparams: { category: category.id },\\n\\t\\t\\t\\t\\t}\\\">\\n\\t\\t\\t\\t\\t<template #icon>\\n\\t\\t\\t\\t\\t\\t<NcIconSvgWrapper :path=\\\"category.icon\\\" />\\n\\t\\t\\t\\t\\t</template>\\n\\t\\t\\t\\t</NcAppNavigationItem>\\n\\t\\t\\t</template>\\n\\n\\t\\t\\t<NcAppNavigationItem id=\\\"app-developer-docs\\\"\\n\\t\\t\\t\\t:name=\\\"t('settings', 'Developer documentation ↗')\\\"\\n\\t\\t\\t\\t:href=\\\"developerDocsUrl\\\" />\\n\\t\\t</template>\\n\\t</NcAppNavigation>\\n</template>\\n\\n<script setup lang=\\\"ts\\\">\\nimport { loadState } from '@nextcloud/initial-state'\\nimport { translate as t } from '@nextcloud/l10n'\\nimport { computed, onBeforeMount } from 'vue'\\nimport { APPS_SECTION_ENUM } from '../constants/AppsConstants'\\nimport { useAppsStore } from '../store/apps-store'\\n\\nimport NcAppNavigation from '@nextcloud/vue/dist/Components/NcAppNavigation.js'\\nimport NcAppNavigationItem from '@nextcloud/vue/dist/Components/NcAppNavigationItem.js'\\nimport NcAppNavigationSpacer from '@nextcloud/vue/dist/Components/NcAppNavigationSpacer.js'\\nimport NcCounterBubble from '@nextcloud/vue/dist/Components/NcCounterBubble.js'\\nimport NcIconSvgWrapper from '@nextcloud/vue/dist/Components/NcIconSvgWrapper.js'\\nimport NcLoadingIcon from '@nextcloud/vue/dist/Components/NcLoadingIcon.js'\\n\\nimport APPSTORE_CATEGORY_ICONS from '../constants/AppstoreCategoryIcons.ts'\\n\\nconst updateCount = loadState<number>('settings', 'appstoreUpdateCount', 0)\\nconst appstoreEnabled = loadState<boolean>('settings', 'appstoreEnabled', true)\\nconst developerDocsUrl = loadState<string>('settings', 'appstoreDeveloperDocs', '')\\n\\nconst store = useAppsStore()\\nconst categories = computed(() => store.categories)\\nconst categoriesLoading = computed(() => store.loading.categories)\\n\\n/**\\n * Check if the current instance has a support subscription from the Nextcloud GmbH\\n *\\n * For customers of the Nextcloud GmbH the app level will be set to `300` for apps that are supported in their subscription\\n */\\nconst isSubscribed = computed(() => store.apps.find(({ level }) => level === 300) !== undefined)\\n\\n// load categories when component is mounted\\nonBeforeMount(() => {\\n\\tstore.loadCategories()\\n\\tstore.loadApps()\\n})\\n</script>\\n\\n<style scoped>\\n/* The categories-loading indicator */\\n.categories--loading {\\n\\tflex: 1;\\n\\tdisplay: flex;\\n\\talign-items: center;\\n\\tjustify-content: center;\\n}\\n</style>\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","var render = function render(){var _vm=this,_c=_vm._self._c;return _c(_vm.listView ? 'tr' : (_vm.inline ? 'article' : 'li'),{tag:\"component\",staticClass:\"app-item\",class:{\n\t\t'app-item--list-view': _vm.listView,\n\t\t'app-item--store-view': !_vm.listView,\n\t\t'app-item--selected': _vm.isSelected,\n\t\t'app-item--with-sidebar': _vm.withSidebar,\n\t}},[_c(_vm.dataItemTag,{tag:\"component\",staticClass:\"app-image app-image-icon\",attrs:{\"headers\":_vm.getDataItemHeaders(`app-table-col-icon`)}},[((_vm.listView && !_vm.app.preview) || (!_vm.listView && !_vm.screenshotLoaded))?_c('div',{staticClass:\"icon-settings-dark\"}):(_vm.listView && _vm.app.preview)?_c('svg',{attrs:{\"width\":\"32\",\"height\":\"32\",\"viewBox\":\"0 0 32 32\"}},[_c('image',{staticClass:\"app-icon\",attrs:{\"x\":\"0\",\"y\":\"0\",\"width\":\"32\",\"height\":\"32\",\"preserveAspectRatio\":\"xMinYMin meet\",\"xlink:href\":_vm.app.preview}})]):_vm._e(),_vm._v(\" \"),(!_vm.listView && _vm.app.screenshot && _vm.screenshotLoaded)?_c('img',{attrs:{\"src\":_vm.app.screenshot,\"alt\":\"\"}}):_vm._e()]),_vm._v(\" \"),_c(_vm.dataItemTag,{tag:\"component\",staticClass:\"app-name\",attrs:{\"headers\":_vm.getDataItemHeaders(`app-table-col-name`)}},[_c('router-link',{staticClass:\"app-name--link\",attrs:{\"to\":{\n\t\t\t\tname: 'apps-details',\n\t\t\t\tparams: {\n\t\t\t\t\tcategory: _vm.category,\n\t\t\t\t\tid: _vm.app.id\n\t\t\t\t},\n\t\t\t},\"aria-label\":_vm.t('settings', 'Show details for {appName} app', { appName:_vm.app.name })}},[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.app.name)+\"\\n\\t\\t\")])],1),_vm._v(\" \"),(!_vm.listView)?_c(_vm.dataItemTag,{tag:\"component\",staticClass:\"app-summary\",attrs:{\"headers\":_vm.getDataItemHeaders(`app-version`)}},[_vm._v(\"\\n\\t\\t\"+_vm._s(_vm.app.summary)+\"\\n\\t\")]):_vm._e(),_vm._v(\" \"),(_vm.listView)?_c(_vm.dataItemTag,{tag:\"component\",staticClass:\"app-version\",attrs:{\"headers\":_vm.getDataItemHeaders(`app-table-col-version`)}},[(_vm.app.version)?_c('span',[_vm._v(_vm._s(_vm.app.version))]):(_vm.app.appstoreData.releases[0].version)?_c('span',[_vm._v(_vm._s(_vm.app.appstoreData.releases[0].version))]):_vm._e()]):_vm._e(),_vm._v(\" \"),_c(_vm.dataItemTag,{tag:\"component\",staticClass:\"app-level\",attrs:{\"headers\":_vm.getDataItemHeaders(`app-table-col-level`)}},[_c('AppLevelBadge',{attrs:{\"level\":_vm.app.level}}),_vm._v(\" \"),(_vm.hasRating && !_vm.listView)?_c('AppScore',{attrs:{\"score\":_vm.app.score}}):_vm._e()],1),_vm._v(\" \"),(!_vm.inline)?_c(_vm.dataItemTag,{tag:\"component\",staticClass:\"app-actions\",attrs:{\"headers\":_vm.getDataItemHeaders(`app-table-col-actions`)}},[(_vm.app.error)?_c('div',{staticClass:\"warning\"},[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.app.error)+\"\\n\\t\\t\")]):_vm._e(),_vm._v(\" \"),(_vm.isLoading)?_c('div',{staticClass:\"icon icon-loading-small\"}):_vm._e(),_vm._v(\" \"),(_vm.app.update)?_c('NcButton',{attrs:{\"type\":\"primary\",\"disabled\":_vm.installing || _vm.isLoading},on:{\"click\":function($event){$event.stopPropagation();return _vm.update(_vm.app.id)}}},[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.t('settings', 'Update to {update}', {update:_vm.app.update}))+\"\\n\\t\\t\")]):_vm._e(),_vm._v(\" \"),(_vm.app.canUnInstall)?_c('NcButton',{staticClass:\"uninstall\",attrs:{\"type\":\"tertiary\",\"disabled\":_vm.installing || _vm.isLoading},on:{\"click\":function($event){$event.stopPropagation();return _vm.remove(_vm.app.id)}}},[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.t('settings', 'Remove'))+\"\\n\\t\\t\")]):_vm._e(),_vm._v(\" \"),(_vm.app.active)?_c('NcButton',{attrs:{\"disabled\":_vm.installing || _vm.isLoading},on:{\"click\":function($event){$event.stopPropagation();return _vm.disable(_vm.app.id)}}},[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.t('settings','Disable'))+\"\\n\\t\\t\")]):_vm._e(),_vm._v(\" \"),(!_vm.app.active && (_vm.app.canInstall || _vm.app.isCompatible))?_c('NcButton',{attrs:{\"title\":_vm.enableButtonTooltip,\"aria-label\":_vm.enableButtonTooltip,\"type\":\"primary\",\"disabled\":!_vm.app.canInstall || _vm.installing || _vm.isLoading},on:{\"click\":function($event){$event.stopPropagation();return _vm.enable(_vm.app.id)}}},[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.enableButtonText)+\"\\n\\t\\t\")]):(!_vm.app.active)?_c('NcButton',{attrs:{\"title\":_vm.forceEnableButtonTooltip,\"aria-label\":_vm.forceEnableButtonTooltip,\"type\":\"secondary\",\"disabled\":_vm.installing || _vm.isLoading},on:{\"click\":function($event){$event.stopPropagation();return _vm.forceEnable(_vm.app.id)}}},[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.forceEnableButtonText)+\"\\n\\t\\t\")]):_vm._e()],1):_vm._e()],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<!--\n - SPDX-FileCopyrightText: 2018 Nextcloud GmbH and Nextcloud contributors\n - SPDX-License-Identifier: AGPL-3.0-or-later\n-->\n\n<script>\nexport default {\n\tname: 'SvgFilterMixin',\n\tdata() {\n\t\treturn {\n\t\t\tfilterId: '',\n\t\t}\n\t},\n\tcomputed: {\n\t\tfilterUrl() {\n\t\t\treturn `url(#${this.filterId})`\n\t\t},\n\t},\n\tmounted() {\n\t\tthis.filterId = 'invertIconApps-' + Math.random().toString(36).substring(2)\n\t},\n}\n</script>\n","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SvgFilterMixin.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SvgFilterMixin.vue?vue&type=script&lang=js\"","var render, staticRenderFns\nimport script from \"./SvgFilterMixin.vue?vue&type=script&lang=js\"\nexport * from \"./SvgFilterMixin.vue?vue&type=script&lang=js\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","<!--\n - SPDX-FileCopyrightText: 2018 Nextcloud GmbH and Nextcloud contributors\n - SPDX-License-Identifier: AGPL-3.0-or-later\n-->\n<template>\n\t<component :is=\"listView ? 'tr' : (inline ? 'article' : 'li')\"\n\t\tclass=\"app-item\"\n\t\t:class=\"{\n\t\t\t'app-item--list-view': listView,\n\t\t\t'app-item--store-view': !listView,\n\t\t\t'app-item--selected': isSelected,\n\t\t\t'app-item--with-sidebar': withSidebar,\n\t\t}\">\n\t\t<component :is=\"dataItemTag\"\n\t\t\tclass=\"app-image app-image-icon\"\n\t\t\t:headers=\"getDataItemHeaders(`app-table-col-icon`)\">\n\t\t\t<div v-if=\"(listView && !app.preview) || (!listView && !screenshotLoaded)\" class=\"icon-settings-dark\" />\n\n\t\t\t<svg v-else-if=\"listView && app.preview\"\n\t\t\t\twidth=\"32\"\n\t\t\t\theight=\"32\"\n\t\t\t\tviewBox=\"0 0 32 32\">\n\t\t\t\t<image x=\"0\"\n\t\t\t\t\ty=\"0\"\n\t\t\t\t\twidth=\"32\"\n\t\t\t\t\theight=\"32\"\n\t\t\t\t\tpreserveAspectRatio=\"xMinYMin meet\"\n\t\t\t\t\t:xlink:href=\"app.preview\"\n\t\t\t\t\tclass=\"app-icon\" />\n\t\t\t</svg>\n\n\t\t\t<img v-if=\"!listView && app.screenshot && screenshotLoaded\" :src=\"app.screenshot\" alt=\"\">\n\t\t</component>\n\t\t<component :is=\"dataItemTag\"\n\t\t\tclass=\"app-name\"\n\t\t\t:headers=\"getDataItemHeaders(`app-table-col-name`)\">\n\t\t\t<router-link class=\"app-name--link\"\n\t\t\t\t:to=\"{\n\t\t\t\t\tname: 'apps-details',\n\t\t\t\t\tparams: {\n\t\t\t\t\t\tcategory: category,\n\t\t\t\t\t\tid: app.id\n\t\t\t\t\t},\n\t\t\t\t}\"\n\t\t\t\t:aria-label=\"t('settings', 'Show details for {appName} app', { appName:app.name })\">\n\t\t\t\t{{ app.name }}\n\t\t\t</router-link>\n\t\t</component>\n\t\t<component :is=\"dataItemTag\"\n\t\t\tv-if=\"!listView\"\n\t\t\tclass=\"app-summary\"\n\t\t\t:headers=\"getDataItemHeaders(`app-version`)\">\n\t\t\t{{ app.summary }}\n\t\t</component>\n\t\t<component :is=\"dataItemTag\"\n\t\t\tv-if=\"listView\"\n\t\t\tclass=\"app-version\"\n\t\t\t:headers=\"getDataItemHeaders(`app-table-col-version`)\">\n\t\t\t<span v-if=\"app.version\">{{ app.version }}</span>\n\t\t\t<span v-else-if=\"app.appstoreData.releases[0].version\">{{ app.appstoreData.releases[0].version }}</span>\n\t\t</component>\n\n\t\t<component :is=\"dataItemTag\" :headers=\"getDataItemHeaders(`app-table-col-level`)\" class=\"app-level\">\n\t\t\t<AppLevelBadge :level=\"app.level\" />\n\t\t\t<AppScore v-if=\"hasRating && !listView\" :score=\"app.score\" />\n\t\t</component>\n\t\t<component :is=\"dataItemTag\"\n\t\t\tv-if=\"!inline\"\n\t\t\t:headers=\"getDataItemHeaders(`app-table-col-actions`)\"\n\t\t\tclass=\"app-actions\">\n\t\t\t<div v-if=\"app.error\" class=\"warning\">\n\t\t\t\t{{ app.error }}\n\t\t\t</div>\n\t\t\t<div v-if=\"isLoading\" class=\"icon icon-loading-small\" />\n\t\t\t<NcButton v-if=\"app.update\"\n\t\t\t\ttype=\"primary\"\n\t\t\t\t:disabled=\"installing || isLoading\"\n\t\t\t\t@click.stop=\"update(app.id)\">\n\t\t\t\t{{ t('settings', 'Update to {update}', {update:app.update}) }}\n\t\t\t</NcButton>\n\t\t\t<NcButton v-if=\"app.canUnInstall\"\n\t\t\t\tclass=\"uninstall\"\n\t\t\t\ttype=\"tertiary\"\n\t\t\t\t:disabled=\"installing || isLoading\"\n\t\t\t\t@click.stop=\"remove(app.id)\">\n\t\t\t\t{{ t('settings', 'Remove') }}\n\t\t\t</NcButton>\n\t\t\t<NcButton v-if=\"app.active\"\n\t\t\t\t:disabled=\"installing || isLoading\"\n\t\t\t\t@click.stop=\"disable(app.id)\">\n\t\t\t\t{{ t('settings','Disable') }}\n\t\t\t</NcButton>\n\t\t\t<NcButton v-if=\"!app.active && (app.canInstall || app.isCompatible)\"\n\t\t\t\t:title=\"enableButtonTooltip\"\n\t\t\t\t:aria-label=\"enableButtonTooltip\"\n\t\t\t\ttype=\"primary\"\n\t\t\t\t:disabled=\"!app.canInstall || installing || isLoading\"\n\t\t\t\t@click.stop=\"enable(app.id)\">\n\t\t\t\t{{ enableButtonText }}\n\t\t\t</NcButton>\n\t\t\t<NcButton v-else-if=\"!app.active\"\n\t\t\t\t:title=\"forceEnableButtonTooltip\"\n\t\t\t\t:aria-label=\"forceEnableButtonTooltip\"\n\t\t\t\ttype=\"secondary\"\n\t\t\t\t:disabled=\"installing || isLoading\"\n\t\t\t\t@click.stop=\"forceEnable(app.id)\">\n\t\t\t\t{{ forceEnableButtonText }}\n\t\t\t</NcButton>\n\t\t</component>\n\t</component>\n</template>\n\n<script>\nimport AppScore from './AppScore.vue'\nimport AppLevelBadge from './AppLevelBadge.vue'\nimport AppManagement from '../../mixins/AppManagement.js'\nimport SvgFilterMixin from '../SvgFilterMixin.vue'\nimport NcButton from '@nextcloud/vue/dist/Components/NcButton.js'\n\nexport default {\n\tname: 'AppItem',\n\tcomponents: {\n\t\tAppLevelBadge,\n\t\tAppScore,\n\t\tNcButton,\n\t},\n\tmixins: [AppManagement, SvgFilterMixin],\n\tprops: {\n\t\tapp: {\n\t\t\ttype: Object,\n\t\t\trequired: true,\n\t\t},\n\t\tcategory: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t},\n\t\tlistView: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\t\tuseBundleView: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t\theaders: {\n\t\t\ttype: String,\n\t\t\tdefault: null,\n\t\t},\n\t\tinline: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tisSelected: false,\n\t\t\tscrolled: false,\n\t\t\tscreenshotLoaded: false,\n\t\t}\n\t},\n\tcomputed: {\n\t\thasRating() {\n\t\t\treturn this.app.appstoreData && this.app.appstoreData.ratingNumOverall > 5\n\t\t},\n\t\tdataItemTag() {\n\t\t\treturn this.listView ? 'td' : 'div'\n\t\t},\n\t\twithSidebar() {\n\t\t\treturn !!this.$route.params.id\n\t\t},\n\t},\n\twatch: {\n\t\t'$route.params.id'(id) {\n\t\t\tthis.isSelected = (this.app.id === id)\n\t\t},\n\t},\n\tmounted() {\n\t\tthis.isSelected = (this.app.id === this.$route.params.id)\n\t\tif (this.app.releases && this.app.screenshot) {\n\t\t\tconst image = new Image()\n\t\t\timage.onload = () => {\n\t\t\t\tthis.screenshotLoaded = true\n\t\t\t}\n\t\t\timage.src = this.app.screenshot\n\t\t}\n\t},\n\twatchers: {\n\n\t},\n\tmethods: {\n\t\tprefix(prefix, content) {\n\t\t\treturn prefix + '_' + content\n\t\t},\n\n\t\tgetDataItemHeaders(columnName) {\n\t\t\treturn this.useBundleView ? [this.headers, columnName].join(' ') : null\n\t\t},\n\t},\n}\n</script>\n\n<style scoped lang=\"scss\">\n@use '../../../../../core/css/variables.scss' as variables;\n@use 'sass:math';\n\n.app-item {\n\tposition: relative;\n\n\t&:hover {\n\t\tbackground-color: var(--color-background-dark);\n\t}\n\n\t&--list-view {\n\t\t--app-item-padding: calc(var(--default-grid-baseline) * 2);\n\t\t--app-item-height: calc(var(--default-clickable-area) + var(--app-item-padding) * 2);\n\n\t\t&.app-item--selected {\n\t\t\tbackground-color: var(--color-background-dark);\n\t\t}\n\n\t\t> * {\n\t\t\tvertical-align: middle;\n\t\t\tborder-bottom: 1px solid var(--color-border);\n\t\t\tpadding: var(--app-item-padding);\n\t\t\theight: var(--app-item-height);\n\t\t}\n\n\t\t.app-image {\n\t\t\twidth: var(--default-clickable-area);\n\t\t\theight: auto;\n\t\t\ttext-align: end;\n\t\t}\n\n\t\t.app-image-icon svg,\n\t\t.app-image-icon .icon-settings-dark {\n\t\t\tmargin-top: 5px;\n\t\t\twidth: 20px;\n\t\t\theight: 20px;\n\t\t\topacity: .5;\n\t\t\tbackground-size: cover;\n\t\t\tdisplay: inline-block;\n\t\t}\n\n\t\t.app-name {\n\t\t\tpadding: 0 var(--app-item-padding);\n\t\t}\n\n\t\t.app-name--link {\n\t\t\theight: var(--app-item-height);\n\t\t\tdisplay: flex;\n\t\t\talign-items: center;\n\t\t}\n\n\t\t// Note: because of Safari bug, we cannot position link overlay relative to the table row\n\t\t// So we need to manually position it relative to the table container and cell\n\t\t// See: https://bugs.webkit.org/show_bug.cgi?id=240961\n\t\t.app-name--link::after {\n\t\t\tcontent: '';\n\t\t\tposition: absolute;\n\t\t\tinset-inline: 0;\n\t\t\theight: var(--app-item-height);\n\t\t}\n\n\t\t.app-actions {\n\t\t\tdisplay: flex;\n\t\t\tgap: var(--app-item-padding);\n\t\t\tflex-wrap: wrap;\n\t\t\tjustify-content: end;\n\n\t\t\t.icon-loading-small {\n\t\t\t\tdisplay: inline-block;\n\t\t\t\ttop: 4px;\n\t\t\t\tmargin-inline-end: 10px;\n\t\t\t}\n\t\t}\n\n\t\t/* hide app version and level on narrower screens */\n\t\t@media only screen and (max-width: 900px) {\n\t\t\t.app-version,\n\t\t\t.app-level {\n\t\t\t\tdisplay: none;\n\t\t\t}\n\t\t}\n\n\t\t/* Hide actions on a small screen. Click on app opens fill-screen sidebar with the buttons */\n\t\t@media only screen and (max-width: math.div(variables.$breakpoint-mobile, 2)) {\n\t\t\t.app-actions {\n\t\t\t\tdisplay: none;\n\t\t\t}\n\t\t}\n\t}\n\n\t&--store-view {\n\t\tpadding: 30px;\n\n\t\t.app-image-icon .icon-settings-dark {\n\t\t\twidth: 100%;\n\t\t\theight: 150px;\n\t\t\tbackground-size: 45px;\n\t\t\topacity: 0.5;\n\t\t}\n\n\t\t.app-image-icon svg {\n\t\t\tposition: absolute;\n\t\t\tbottom: 43px;\n\t\t\t/* position halfway vertically */\n\t\t\twidth: 64px;\n\t\t\theight: 64px;\n\t\t\topacity: .1;\n\t\t}\n\n\t\t.app-name {\n\t\t\tmargin: 5px 0;\n\t\t}\n\n\t\t.app-name--link::after {\n\t\t\tcontent: '';\n\t\t\tposition: absolute;\n\t\t\tinset-block: 0;\n\t\t\tinset-inline: 0;\n\t\t}\n\n\t\t.app-actions {\n\t\t\tmargin: 10px 0;\n\t\t}\n\n\t\t@media only screen and (min-width: 1601px) {\n\t\t\twidth: 25%;\n\n\t\t\t&.app-item--with-sidebar {\n\t\t\t\twidth: 33%;\n\t\t\t}\n\t\t}\n\n\t\t@media only screen and (max-width: 1600px) {\n\t\t\twidth: 25%;\n\n\t\t\t&.app-item--with-sidebar {\n\t\t\t\twidth: 33%;\n\t\t\t}\n\t\t}\n\n\t\t@media only screen and (max-width: 1400px) {\n\t\t\twidth: 33%;\n\n\t\t\t&.app-item--with-sidebar {\n\t\t\t\twidth: 50%;\n\t\t\t}\n\t\t}\n\n\t\t@media only screen and (max-width: 900px) {\n\t\t\twidth: 50%;\n\n\t\t\t&.app-item--with-sidebar {\n\t\t\t\twidth: 100%;\n\t\t\t}\n\t\t}\n\n\t\t@media only screen and (max-width: variables.$breakpoint-mobile) {\n\t\t\twidth: 50%;\n\t\t}\n\n\t\t@media only screen and (max-width: 480px) {\n\t\t\twidth: 100%;\n\t\t}\n\t}\n}\n\n.app-icon {\n\tfilter: var(--background-invert-if-bright);\n}\n\n.app-image {\n\tposition: relative;\n\theight: 150px;\n\topacity: 1;\n\toverflow: hidden;\n\n\timg {\n\t\twidth: 100%;\n\t}\n}\n\n.app-version {\n\tcolor: var(--color-text-maxcontrast);\n}\n</style>\n","import mod from \"-!../../../../../node_modules/babel-loader/lib/index.js!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppItem.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../../../../node_modules/babel-loader/lib/index.js!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppItem.vue?vue&type=script&lang=js\"","\n import API from \"!../../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../../node_modules/css-loader/dist/cjs.js!../../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../node_modules/sass-loader/dist/cjs.js!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppItem.vue?vue&type=style&index=0&id=4f1b9f2a&prod&scoped=true&lang=scss\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../../node_modules/css-loader/dist/cjs.js!../../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../node_modules/sass-loader/dist/cjs.js!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppItem.vue?vue&type=style&index=0&id=4f1b9f2a&prod&scoped=true&lang=scss\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./AppItem.vue?vue&type=template&id=4f1b9f2a&scoped=true\"\nimport script from \"./AppItem.vue?vue&type=script&lang=js\"\nexport * from \"./AppItem.vue?vue&type=script&lang=js\"\nimport style0 from \"./AppItem.vue?vue&type=style&index=0&id=4f1b9f2a&prod&scoped=true&lang=scss\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"4f1b9f2a\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c,_setup=_vm._self._setupProxy;return (_setup.isSupported || _setup.isFeatured)?_c('span',{staticClass:\"app-level-badge\",class:{ 'app-level-badge--supported': _setup.isSupported },attrs:{\"title\":_setup.badgeTitle}},[_c(_setup.NcIconSvgWrapper,{attrs:{\"path\":_setup.badgeIcon,\"size\":20,\"inline\":\"\"}}),_vm._v(\"\\n\\t\"+_vm._s(_setup.badgeText)+\"\\n\")],1):_vm._e()\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../../node_modules/babel-loader/lib/index.js!../../../../../node_modules/ts-loader/index.js??clonedRuleSet-4.use[1]!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppLevelBadge.vue?vue&type=script&setup=true&lang=ts\"; export default mod; export * from \"-!../../../../../node_modules/babel-loader/lib/index.js!../../../../../node_modules/ts-loader/index.js??clonedRuleSet-4.use[1]!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppLevelBadge.vue?vue&type=script&setup=true&lang=ts\"","\n import API from \"!../../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../../node_modules/css-loader/dist/cjs.js!../../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../node_modules/sass-loader/dist/cjs.js!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppLevelBadge.vue?vue&type=style&index=0&id=5ee601b2&prod&scoped=true&lang=scss\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../../node_modules/css-loader/dist/cjs.js!../../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../node_modules/sass-loader/dist/cjs.js!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppLevelBadge.vue?vue&type=style&index=0&id=5ee601b2&prod&scoped=true&lang=scss\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./AppLevelBadge.vue?vue&type=template&id=5ee601b2&scoped=true\"\nimport script from \"./AppLevelBadge.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./AppLevelBadge.vue?vue&type=script&setup=true&lang=ts\"\nimport style0 from \"./AppLevelBadge.vue?vue&type=style&index=0&id=5ee601b2&prod&scoped=true&lang=scss\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"5ee601b2\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c,_setup=_vm._self._setupProxy;return _c('span',{staticClass:\"app-score__wrapper\",attrs:{\"role\":\"img\",\"aria-label\":_vm.title,\"title\":_vm.title}},[_vm._l((_vm.fullStars),function(index){return _c('NcIconSvgWrapper',{key:`full-star-${index}`,attrs:{\"path\":_vm.mdiStar,\"inline\":\"\"}})}),_vm._v(\" \"),(_vm.hasHalfStar)?_c('NcIconSvgWrapper',{attrs:{\"path\":_vm.mdiStarHalfFull,\"inline\":\"\"}}):_vm._e(),_vm._v(\" \"),_vm._l((_vm.emptyStars),function(index){return _c('NcIconSvgWrapper',{key:`empty-star-${index}`,attrs:{\"path\":_vm.mdiStarOutline,\"inline\":\"\"}})})],2)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../../node_modules/babel-loader/lib/index.js!../../../../../node_modules/ts-loader/index.js??clonedRuleSet-4.use[1]!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppScore.vue?vue&type=script&lang=ts\"; export default mod; export * from \"-!../../../../../node_modules/babel-loader/lib/index.js!../../../../../node_modules/ts-loader/index.js??clonedRuleSet-4.use[1]!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppScore.vue?vue&type=script&lang=ts\"","\n import API from \"!../../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../../node_modules/css-loader/dist/cjs.js!../../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppScore.vue?vue&type=style&index=0&id=2193f4e0&prod&scoped=true&lang=css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../../node_modules/css-loader/dist/cjs.js!../../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppScore.vue?vue&type=style&index=0&id=2193f4e0&prod&scoped=true&lang=css\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./AppScore.vue?vue&type=template&id=2193f4e0&scoped=true\"\nimport script from \"./AppScore.vue?vue&type=script&lang=ts\"\nexport * from \"./AppScore.vue?vue&type=script&lang=ts\"\nimport style0 from \"./AppScore.vue?vue&type=style&index=0&id=2193f4e0&prod&scoped=true&lang=css\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"2193f4e0\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c,_setup=_vm._self._setupProxy;return _c(_setup.NcAppContent,{staticClass:\"app-settings-content\",attrs:{\"page-heading\":_setup.appStoreLabel}},[_c('h2',{staticClass:\"app-settings-content__label\",domProps:{\"textContent\":_vm._s(_setup.viewLabel)}}),_vm._v(\" \"),(_setup.currentCategory === 'discover')?_c(_setup.AppStoreDiscoverSection):(_setup.isLoading)?_c(_setup.NcEmptyContent,{staticClass:\"empty-content__loading\",attrs:{\"name\":_setup.t('settings', 'Loading app list')},scopedSlots:_vm._u([{key:\"icon\",fn:function(){return [_c(_setup.NcLoadingIcon,{attrs:{\"size\":64}})]},proxy:true}])}):_c(_setup.AppList,{attrs:{\"category\":_setup.currentCategory}})],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","/*\nHow it works:\n`this.#head` is an instance of `Node` which keeps track of its current value and nests another instance of `Node` that keeps the value that comes after it. When a value is provided to `.enqueue()`, the code needs to iterate through `this.#head`, going deeper and deeper to find the last value. However, iterating through every single item is slow. This problem is solved by saving a reference to the last value as `this.#tail` so that it can reference it to add a new value.\n*/\n\nclass Node {\n\tvalue;\n\tnext;\n\n\tconstructor(value) {\n\t\tthis.value = value;\n\t}\n}\n\nexport default class Queue {\n\t#head;\n\t#tail;\n\t#size;\n\n\tconstructor() {\n\t\tthis.clear();\n\t}\n\n\tenqueue(value) {\n\t\tconst node = new Node(value);\n\n\t\tif (this.#head) {\n\t\t\tthis.#tail.next = node;\n\t\t\tthis.#tail = node;\n\t\t} else {\n\t\t\tthis.#head = node;\n\t\t\tthis.#tail = node;\n\t\t}\n\n\t\tthis.#size++;\n\t}\n\n\tdequeue() {\n\t\tconst current = this.#head;\n\t\tif (!current) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.#head = this.#head.next;\n\t\tthis.#size--;\n\t\treturn current.value;\n\t}\n\n\tpeek() {\n\t\tif (!this.#head) {\n\t\t\treturn;\n\t\t}\n\n\t\treturn this.#head.value;\n\n\t\t// TODO: Node.js 18.\n\t\t// return this.#head?.value;\n\t}\n\n\tclear() {\n\t\tthis.#head = undefined;\n\t\tthis.#tail = undefined;\n\t\tthis.#size = 0;\n\t}\n\n\tget size() {\n\t\treturn this.#size;\n\t}\n\n\t* [Symbol.iterator]() {\n\t\tlet current = this.#head;\n\n\t\twhile (current) {\n\t\t\tyield current.value;\n\t\t\tcurrent = current.next;\n\t\t}\n\t}\n}\n","import Queue from 'yocto-queue';\n\nexport default function pLimit(concurrency) {\n\tvalidateConcurrency(concurrency);\n\n\tconst queue = new Queue();\n\tlet activeCount = 0;\n\n\tconst resumeNext = () => {\n\t\tif (activeCount < concurrency && queue.size > 0) {\n\t\t\tqueue.dequeue()();\n\t\t\t// Since `pendingCount` has been decreased by one, increase `activeCount` by one.\n\t\t\tactiveCount++;\n\t\t}\n\t};\n\n\tconst next = () => {\n\t\tactiveCount--;\n\n\t\tresumeNext();\n\t};\n\n\tconst run = async (function_, resolve, arguments_) => {\n\t\tconst result = (async () => function_(...arguments_))();\n\n\t\tresolve(result);\n\n\t\ttry {\n\t\t\tawait result;\n\t\t} catch {}\n\n\t\tnext();\n\t};\n\n\tconst enqueue = (function_, resolve, arguments_) => {\n\t\t// Queue `internalResolve` instead of the `run` function\n\t\t// to preserve asynchronous context.\n\t\tnew Promise(internalResolve => {\n\t\t\tqueue.enqueue(internalResolve);\n\t\t}).then(\n\t\t\trun.bind(undefined, function_, resolve, arguments_),\n\t\t);\n\n\t\t(async () => {\n\t\t\t// This function needs to wait until the next microtask before comparing\n\t\t\t// `activeCount` to `concurrency`, because `activeCount` is updated asynchronously\n\t\t\t// after the `internalResolve` function is dequeued and called. The comparison in the if-statement\n\t\t\t// needs to happen asynchronously as well to get an up-to-date value for `activeCount`.\n\t\t\tawait Promise.resolve();\n\n\t\t\tif (activeCount < concurrency) {\n\t\t\t\tresumeNext();\n\t\t\t}\n\t\t})();\n\t};\n\n\tconst generator = (function_, ...arguments_) => new Promise(resolve => {\n\t\tenqueue(function_, resolve, arguments_);\n\t});\n\n\tObject.defineProperties(generator, {\n\t\tactiveCount: {\n\t\t\tget: () => activeCount,\n\t\t},\n\t\tpendingCount: {\n\t\t\tget: () => queue.size,\n\t\t},\n\t\tclearQueue: {\n\t\t\tvalue() {\n\t\t\t\tqueue.clear();\n\t\t\t},\n\t\t},\n\t\tconcurrency: {\n\t\t\tget: () => concurrency,\n\n\t\t\tset(newConcurrency) {\n\t\t\t\tvalidateConcurrency(newConcurrency);\n\t\t\t\tconcurrency = newConcurrency;\n\n\t\t\t\tqueueMicrotask(() => {\n\t\t\t\t\t// eslint-disable-next-line no-unmodified-loop-condition\n\t\t\t\t\twhile (activeCount < concurrency && queue.size > 0) {\n\t\t\t\t\t\tresumeNext();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t},\n\t\t},\n\t});\n\n\treturn generator;\n}\n\nfunction validateConcurrency(concurrency) {\n\tif (!((Number.isInteger(concurrency) || concurrency === Number.POSITIVE_INFINITY) && concurrency > 0)) {\n\t\tthrow new TypeError('Expected `concurrency` to be a number from 1 and up');\n\t}\n}\n","<!--\n - SPDX-FileCopyrightText: 2018 Nextcloud GmbH and Nextcloud contributors\n - SPDX-License-Identifier: AGPL-3.0-or-later\n-->\n\n<template>\n\t<div id=\"app-content-inner\">\n\t\t<div id=\"apps-list\"\n\t\t\tclass=\"apps-list\"\n\t\t\t:class=\"{\n\t\t\t\t'apps-list--list-view': (useBundleView || useListView),\n\t\t\t\t'apps-list--store-view': useAppStoreView,\n\t\t\t}\">\n\t\t\t<template v-if=\"useListView\">\n\t\t\t\t<div v-if=\"showUpdateAll\" class=\"apps-list__toolbar\">\n\t\t\t\t\t{{ n('settings', '%n app has an update available', '%n apps have an update available', counter) }}\n\t\t\t\t\t<NcButton v-if=\"showUpdateAll\"\n\t\t\t\t\t\tid=\"app-list-update-all\"\n\t\t\t\t\t\ttype=\"primary\"\n\t\t\t\t\t\t@click=\"updateAll\">\n\t\t\t\t\t\t{{ n('settings', 'Update', 'Update all', counter) }}\n\t\t\t\t\t</NcButton>\n\t\t\t\t</div>\n\n\t\t\t\t<div v-if=\"!showUpdateAll\" class=\"apps-list__toolbar\">\n\t\t\t\t\t{{ t('settings', 'All apps are up-to-date.') }}\n\t\t\t\t</div>\n\n\t\t\t\t<TransitionGroup name=\"apps-list\" tag=\"table\" class=\"apps-list__list-container\">\n\t\t\t\t\t<tr key=\"app-list-view-header\">\n\t\t\t\t\t\t<th>\n\t\t\t\t\t\t\t<span class=\"hidden-visually\">{{ t('settings', 'Icon') }}</span>\n\t\t\t\t\t\t</th>\n\t\t\t\t\t\t<th>\n\t\t\t\t\t\t\t<span class=\"hidden-visually\">{{ t('settings', 'Name') }}</span>\n\t\t\t\t\t\t</th>\n\t\t\t\t\t\t<th>\n\t\t\t\t\t\t\t<span class=\"hidden-visually\">{{ t('settings', 'Version') }}</span>\n\t\t\t\t\t\t</th>\n\t\t\t\t\t\t<th>\n\t\t\t\t\t\t\t<span class=\"hidden-visually\">{{ t('settings', 'Level') }}</span>\n\t\t\t\t\t\t</th>\n\t\t\t\t\t\t<th>\n\t\t\t\t\t\t\t<span class=\"hidden-visually\">{{ t('settings', 'Actions') }}</span>\n\t\t\t\t\t\t</th>\n\t\t\t\t\t</tr>\n\t\t\t\t\t<AppItem v-for=\"app in apps\"\n\t\t\t\t\t\t:key=\"app.id\"\n\t\t\t\t\t\t:app=\"app\"\n\t\t\t\t\t\t:category=\"category\" />\n\t\t\t\t</TransitionGroup>\n\t\t\t</template>\n\n\t\t\t<table v-if=\"useBundleView\"\n\t\t\t\tclass=\"apps-list__list-container\">\n\t\t\t\t<tr key=\"app-list-view-header\">\n\t\t\t\t\t<th id=\"app-table-col-icon\">\n\t\t\t\t\t\t<span class=\"hidden-visually\">{{ t('settings', 'Icon') }}</span>\n\t\t\t\t\t</th>\n\t\t\t\t\t<th id=\"app-table-col-name\">\n\t\t\t\t\t\t<span class=\"hidden-visually\">{{ t('settings', 'Name') }}</span>\n\t\t\t\t\t</th>\n\t\t\t\t\t<th id=\"app-table-col-version\">\n\t\t\t\t\t\t<span class=\"hidden-visually\">{{ t('settings', 'Version') }}</span>\n\t\t\t\t\t</th>\n\t\t\t\t\t<th id=\"app-table-col-level\">\n\t\t\t\t\t\t<span class=\"hidden-visually\">{{ t('settings', 'Level') }}</span>\n\t\t\t\t\t</th>\n\t\t\t\t\t<th id=\"app-table-col-actions\">\n\t\t\t\t\t\t<span class=\"hidden-visually\">{{ t('settings', 'Actions') }}</span>\n\t\t\t\t\t</th>\n\t\t\t\t</tr>\n\t\t\t\t<template v-for=\"bundle in bundles\">\n\t\t\t\t\t<tr :key=\"bundle.id\">\n\t\t\t\t\t\t<th :id=\"`app-table-rowgroup-${bundle.id}`\" colspan=\"5\" scope=\"rowgroup\">\n\t\t\t\t\t\t\t<div class=\"apps-list__bundle-heading\">\n\t\t\t\t\t\t\t\t<span class=\"apps-list__bundle-header\">\n\t\t\t\t\t\t\t\t\t{{ bundle.name }}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t<NcButton type=\"secondary\" @click=\"toggleBundle(bundle.id)\">\n\t\t\t\t\t\t\t\t\t{{ t('settings', bundleToggleText(bundle.id)) }}\n\t\t\t\t\t\t\t\t</NcButton>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</th>\n\t\t\t\t\t</tr>\n\t\t\t\t\t<AppItem v-for=\"app in bundleApps(bundle.id)\"\n\t\t\t\t\t\t:key=\"bundle.id + app.id\"\n\t\t\t\t\t\t:use-bundle-view=\"true\"\n\t\t\t\t\t\t:headers=\"`app-table-rowgroup-${bundle.id}`\"\n\t\t\t\t\t\t:app=\"app\"\n\t\t\t\t\t\t:category=\"category\" />\n\t\t\t\t</template>\n\t\t\t</table>\n\t\t\t<ul v-if=\"useAppStoreView\" class=\"apps-list__store-container\">\n\t\t\t\t<AppItem v-for=\"app in apps\"\n\t\t\t\t\t:key=\"app.id\"\n\t\t\t\t\t:app=\"app\"\n\t\t\t\t\t:category=\"category\"\n\t\t\t\t\t:list-view=\"false\" />\n\t\t\t</ul>\n\t\t</div>\n\n\t\t<div id=\"apps-list-search\" class=\"apps-list apps-list--list-view\">\n\t\t\t<div class=\"apps-list__list-container\">\n\t\t\t\t<table v-if=\"search !== '' && searchApps.length > 0\" class=\"apps-list__list-container\">\n\t\t\t\t\t<caption class=\"apps-list__bundle-header\">\n\t\t\t\t\t\t{{ t('settings', 'Results from other categories') }}\n\t\t\t\t\t</caption>\n\t\t\t\t\t<tr key=\"app-list-view-header\">\n\t\t\t\t\t\t<th>\n\t\t\t\t\t\t\t<span class=\"hidden-visually\">{{ t('settings', 'Icon') }}</span>\n\t\t\t\t\t\t</th>\n\t\t\t\t\t\t<th>\n\t\t\t\t\t\t\t<span class=\"hidden-visually\">{{ t('settings', 'Name') }}</span>\n\t\t\t\t\t\t</th>\n\t\t\t\t\t\t<th>\n\t\t\t\t\t\t\t<span class=\"hidden-visually\">{{ t('settings', 'Version') }}</span>\n\t\t\t\t\t\t</th>\n\t\t\t\t\t\t<th>\n\t\t\t\t\t\t\t<span class=\"hidden-visually\">{{ t('settings', 'Level') }}</span>\n\t\t\t\t\t\t</th>\n\t\t\t\t\t\t<th>\n\t\t\t\t\t\t\t<span class=\"hidden-visually\">{{ t('settings', 'Actions') }}</span>\n\t\t\t\t\t\t</th>\n\t\t\t\t\t</tr>\n\t\t\t\t\t<AppItem v-for=\"app in searchApps\"\n\t\t\t\t\t\t:key=\"app.id\"\n\t\t\t\t\t\t:app=\"app\"\n\t\t\t\t\t\t:category=\"category\" />\n\t\t\t\t</table>\n\t\t\t</div>\n\t\t</div>\n\n\t\t<div v-if=\"search !== '' && !loading && searchApps.length === 0 && apps.length === 0\" id=\"apps-list-empty\" class=\"emptycontent emptycontent-search\">\n\t\t\t<div id=\"app-list-empty-icon\" class=\"icon-settings-dark\" />\n\t\t\t<h2>{{ t('settings', 'No apps found for your version') }}</h2>\n\t\t</div>\n\t</div>\n</template>\n\n<script>\nimport { subscribe, unsubscribe } from '@nextcloud/event-bus'\nimport AppItem from './AppList/AppItem.vue'\nimport pLimit from 'p-limit'\nimport NcButton from '@nextcloud/vue/dist/Components/NcButton.js'\n\nexport default {\n\tname: 'AppList',\n\tcomponents: {\n\t\tAppItem,\n\t\tNcButton,\n\t},\n\n\tprops: {\n\t\tcategory: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t},\n\t},\n\n\tdata() {\n\t\treturn {\n\t\t\tsearch: '',\n\t\t}\n\t},\n\tcomputed: {\n\t\tcounter() {\n\t\t\treturn this.apps.filter(app => app.update).length\n\t\t},\n\t\tloading() {\n\t\t\treturn this.$store.getters.loading('list')\n\t\t},\n\t\thasPendingUpdate() {\n\t\t\treturn this.apps.filter(app => app.update).length > 0\n\t\t},\n\t\tshowUpdateAll() {\n\t\t\treturn this.hasPendingUpdate && this.useListView\n\t\t},\n\t\tapps() {\n\t\t\tconst apps = this.$store.getters.getAllApps\n\t\t\t\t.filter(app => app.name.toLowerCase().search(this.search.toLowerCase()) !== -1)\n\t\t\t\t.sort(function(a, b) {\n\t\t\t\t\tconst sortStringA = '' + (a.active ? 0 : 1) + (a.update ? 0 : 1) + a.name\n\t\t\t\t\tconst sortStringB = '' + (b.active ? 0 : 1) + (b.update ? 0 : 1) + b.name\n\t\t\t\t\treturn OC.Util.naturalSortCompare(sortStringA, sortStringB)\n\t\t\t\t})\n\n\t\t\tif (this.category === 'installed') {\n\t\t\t\treturn apps.filter(app => app.installed)\n\t\t\t}\n\t\t\tif (this.category === 'enabled') {\n\t\t\t\treturn apps.filter(app => app.active && app.installed)\n\t\t\t}\n\t\t\tif (this.category === 'disabled') {\n\t\t\t\treturn apps.filter(app => !app.active && app.installed)\n\t\t\t}\n\t\t\tif (this.category === 'app-bundles') {\n\t\t\t\treturn apps.filter(app => app.bundles)\n\t\t\t}\n\t\t\tif (this.category === 'updates') {\n\t\t\t\treturn apps.filter(app => app.update)\n\t\t\t}\n\t\t\tif (this.category === 'supported') {\n\t\t\t\t// For customers of the Nextcloud GmbH the app level will be set to `300` for apps that are supported in their subscription\n\t\t\t\treturn apps.filter(app => app.level === 300)\n\t\t\t}\n\t\t\tif (this.category === 'featured') {\n\t\t\t\t// An app level of `200` will be set for apps featured on the app store\n\t\t\t\treturn apps.filter(app => app.level === 200)\n\t\t\t}\n\n\t\t\t// filter app store categories\n\t\t\treturn apps.filter(app => {\n\t\t\t\treturn app.appstore && app.category !== undefined\n\t\t\t\t\t&& (app.category === this.category || app.category.indexOf(this.category) > -1)\n\t\t\t})\n\t\t},\n\t\tbundles() {\n\t\t\treturn this.$store.getters.getAppBundles.filter(bundle => this.bundleApps(bundle.id).length > 0)\n\t\t},\n\t\tbundleApps() {\n\t\t\treturn function(bundle) {\n\t\t\t\treturn this.$store.getters.getAllApps\n\t\t\t\t\t.filter(app => {\n\t\t\t\t\t\treturn app.bundleIds !== undefined && app.bundleIds.includes(bundle)\n\t\t\t\t\t})\n\t\t\t}\n\t\t},\n\t\tsearchApps() {\n\t\t\tif (this.search === '') {\n\t\t\t\treturn []\n\t\t\t}\n\t\t\treturn this.$store.getters.getAllApps\n\t\t\t\t.filter(app => {\n\t\t\t\t\tif (app.name.toLowerCase().search(this.search.toLowerCase()) !== -1) {\n\t\t\t\t\t\treturn (!this.apps.find(_app => _app.id === app.id))\n\t\t\t\t\t}\n\t\t\t\t\treturn false\n\t\t\t\t})\n\t\t},\n\t\tuseAppStoreView() {\n\t\t\treturn !this.useListView && !this.useBundleView\n\t\t},\n\t\tuseListView() {\n\t\t\treturn (this.category === 'installed' || this.category === 'enabled' || this.category === 'disabled' || this.category === 'updates' || this.category === 'featured' || this.category === 'supported')\n\t\t},\n\t\tuseBundleView() {\n\t\t\treturn (this.category === 'app-bundles')\n\t\t},\n\t\tallBundlesEnabled() {\n\t\t\treturn (id) => {\n\t\t\t\treturn this.bundleApps(id).filter(app => !app.active).length === 0\n\t\t\t}\n\t\t},\n\t\tbundleToggleText() {\n\t\t\treturn (id) => {\n\t\t\t\tif (this.allBundlesEnabled(id)) {\n\t\t\t\t\treturn t('settings', 'Disable all')\n\t\t\t\t}\n\t\t\t\treturn t('settings', 'Download and enable all')\n\t\t\t}\n\t\t},\n\t},\n\n\tbeforeDestroy() {\n\t\tunsubscribe('nextcloud:unified-search.search', this.setSearch)\n\t\tunsubscribe('nextcloud:unified-search.reset', this.resetSearch)\n\t},\n\n\tmounted() {\n\t\tsubscribe('nextcloud:unified-search.search', this.setSearch)\n\t\tsubscribe('nextcloud:unified-search.reset', this.resetSearch)\n\t},\n\n\tmethods: {\n\t\tsetSearch({ query }) {\n\t\t\tthis.search = query\n\t\t},\n\t\tresetSearch() {\n\t\t\tthis.search = ''\n\t\t},\n\t\ttoggleBundle(id) {\n\t\t\tif (this.allBundlesEnabled(id)) {\n\t\t\t\treturn this.disableBundle(id)\n\t\t\t}\n\t\t\treturn this.enableBundle(id)\n\t\t},\n\t\tenableBundle(id) {\n\t\t\tconst apps = this.bundleApps(id).map(app => app.id)\n\t\t\tthis.$store.dispatch('enableApp', { appId: apps, groups: [] })\n\t\t\t\t.catch((error) => {\n\t\t\t\t\tconsole.error(error)\n\t\t\t\t\tOC.Notification.show(error)\n\t\t\t\t})\n\t\t},\n\t\tdisableBundle(id) {\n\t\t\tconst apps = this.bundleApps(id).map(app => app.id)\n\t\t\tthis.$store.dispatch('disableApp', { appId: apps, groups: [] })\n\t\t\t\t.catch((error) => {\n\t\t\t\t\tOC.Notification.show(error)\n\t\t\t\t})\n\t\t},\n\t\tupdateAll() {\n\t\t\tconst limit = pLimit(1)\n\t\t\tthis.apps\n\t\t\t\t.filter(app => app.update)\n\t\t\t\t.map(app => limit(() => this.$store.dispatch('updateApp', { appId: app.id })),\n\t\t\t\t)\n\t\t},\n\t},\n}\n</script>\n\n<style lang=\"scss\" scoped>\n$toolbar-padding: 8px;\n$toolbar-height: 44px + $toolbar-padding * 2;\n\n.apps-list {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\talign-content: flex-start;\n\n\t// For transition group\n\t&--move {\n\t\ttransition: transform 1s;\n\t}\n\n\t#app-list-update-all {\n\t\tmargin-inline-start: 10px;\n\t}\n\n\t&__toolbar {\n\t\theight: $toolbar-height;\n\t\tpadding: $toolbar-padding;\n\t\t// Leave room for app-navigation-toggle\n\t\tpadding-inline-start: $toolbar-height;\n\t\twidth: 100%;\n\t\tbackground-color: var(--color-main-background);\n\t\tposition: sticky;\n\t\ttop: 0;\n\t\tz-index: 1;\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t}\n\n\t&--list-view {\n\t\tmargin-bottom: 100px;\n\t\t// For positioning link overlay on rows\n\t\tposition: relative;\n\t}\n\n\t&__list-container {\n\t\twidth: 100%;\n\t}\n\n\t&__store-container {\n\t\tdisplay: flex;\n\t\tflex-wrap: wrap;\n\t}\n\n\t&__bundle-heading {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tmargin-block: 20px;\n\t\tmargin-inline: 0 10px;\n\t}\n\n\t&__bundle-header {\n\t\tmargin-block: 0;\n\t\tmargin-inline: 50px 10px;\n\t\tfont-weight: bold;\n\t\tfont-size: 20px;\n\t\tline-height: 30px;\n\t\tcolor: var(--color-text-light);\n\t}\n}\n\n#apps-list-search {\n\t.app-item {\n\t\th2 {\n\t\t\tmargin-bottom: 0;\n\t\t}\n\t}\n}\n</style>\n","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppList.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppList.vue?vue&type=script&lang=js\"","\n import API from \"!../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppList.vue?vue&type=style&index=0&id=5cf3c7a8&prod&lang=scss&scoped=true\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppList.vue?vue&type=style&index=0&id=5cf3c7a8&prod&lang=scss&scoped=true\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./AppList.vue?vue&type=template&id=5cf3c7a8&scoped=true\"\nimport script from \"./AppList.vue?vue&type=script&lang=js\"\nexport * from \"./AppList.vue?vue&type=script&lang=js\"\nimport style0 from \"./AppList.vue?vue&type=style&index=0&id=5cf3c7a8&prod&lang=scss&scoped=true\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"5cf3c7a8\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{attrs:{\"id\":\"app-content-inner\"}},[_c('div',{staticClass:\"apps-list\",class:{\n\t\t\t'apps-list--list-view': (_vm.useBundleView || _vm.useListView),\n\t\t\t'apps-list--store-view': _vm.useAppStoreView,\n\t\t},attrs:{\"id\":\"apps-list\"}},[(_vm.useListView)?[(_vm.showUpdateAll)?_c('div',{staticClass:\"apps-list__toolbar\"},[_vm._v(\"\\n\\t\\t\\t\\t\"+_vm._s(_vm.n('settings', '%n app has an update available', '%n apps have an update available', _vm.counter))+\"\\n\\t\\t\\t\\t\"),(_vm.showUpdateAll)?_c('NcButton',{attrs:{\"id\":\"app-list-update-all\",\"type\":\"primary\"},on:{\"click\":_vm.updateAll}},[_vm._v(\"\\n\\t\\t\\t\\t\\t\"+_vm._s(_vm.n('settings', 'Update', 'Update all', _vm.counter))+\"\\n\\t\\t\\t\\t\")]):_vm._e()],1):_vm._e(),_vm._v(\" \"),(!_vm.showUpdateAll)?_c('div',{staticClass:\"apps-list__toolbar\"},[_vm._v(\"\\n\\t\\t\\t\\t\"+_vm._s(_vm.t('settings', 'All apps are up-to-date.'))+\"\\n\\t\\t\\t\")]):_vm._e(),_vm._v(\" \"),_c('TransitionGroup',{staticClass:\"apps-list__list-container\",attrs:{\"name\":\"apps-list\",\"tag\":\"table\"}},[_c('tr',{key:\"app-list-view-header\"},[_c('th',[_c('span',{staticClass:\"hidden-visually\"},[_vm._v(_vm._s(_vm.t('settings', 'Icon')))])]),_vm._v(\" \"),_c('th',[_c('span',{staticClass:\"hidden-visually\"},[_vm._v(_vm._s(_vm.t('settings', 'Name')))])]),_vm._v(\" \"),_c('th',[_c('span',{staticClass:\"hidden-visually\"},[_vm._v(_vm._s(_vm.t('settings', 'Version')))])]),_vm._v(\" \"),_c('th',[_c('span',{staticClass:\"hidden-visually\"},[_vm._v(_vm._s(_vm.t('settings', 'Level')))])]),_vm._v(\" \"),_c('th',[_c('span',{staticClass:\"hidden-visually\"},[_vm._v(_vm._s(_vm.t('settings', 'Actions')))])])]),_vm._v(\" \"),_vm._l((_vm.apps),function(app){return _c('AppItem',{key:app.id,attrs:{\"app\":app,\"category\":_vm.category}})})],2)]:_vm._e(),_vm._v(\" \"),(_vm.useBundleView)?_c('table',{staticClass:\"apps-list__list-container\"},[_c('tr',{key:\"app-list-view-header\"},[_c('th',{attrs:{\"id\":\"app-table-col-icon\"}},[_c('span',{staticClass:\"hidden-visually\"},[_vm._v(_vm._s(_vm.t('settings', 'Icon')))])]),_vm._v(\" \"),_c('th',{attrs:{\"id\":\"app-table-col-name\"}},[_c('span',{staticClass:\"hidden-visually\"},[_vm._v(_vm._s(_vm.t('settings', 'Name')))])]),_vm._v(\" \"),_c('th',{attrs:{\"id\":\"app-table-col-version\"}},[_c('span',{staticClass:\"hidden-visually\"},[_vm._v(_vm._s(_vm.t('settings', 'Version')))])]),_vm._v(\" \"),_c('th',{attrs:{\"id\":\"app-table-col-level\"}},[_c('span',{staticClass:\"hidden-visually\"},[_vm._v(_vm._s(_vm.t('settings', 'Level')))])]),_vm._v(\" \"),_c('th',{attrs:{\"id\":\"app-table-col-actions\"}},[_c('span',{staticClass:\"hidden-visually\"},[_vm._v(_vm._s(_vm.t('settings', 'Actions')))])])]),_vm._v(\" \"),_vm._l((_vm.bundles),function(bundle){return [_c('tr',{key:bundle.id},[_c('th',{attrs:{\"id\":`app-table-rowgroup-${bundle.id}`,\"colspan\":\"5\",\"scope\":\"rowgroup\"}},[_c('div',{staticClass:\"apps-list__bundle-heading\"},[_c('span',{staticClass:\"apps-list__bundle-header\"},[_vm._v(\"\\n\\t\\t\\t\\t\\t\\t\\t\\t\"+_vm._s(bundle.name)+\"\\n\\t\\t\\t\\t\\t\\t\\t\")]),_vm._v(\" \"),_c('NcButton',{attrs:{\"type\":\"secondary\"},on:{\"click\":function($event){return _vm.toggleBundle(bundle.id)}}},[_vm._v(\"\\n\\t\\t\\t\\t\\t\\t\\t\\t\"+_vm._s(_vm.t('settings', _vm.bundleToggleText(bundle.id)))+\"\\n\\t\\t\\t\\t\\t\\t\\t\")])],1)])]),_vm._v(\" \"),_vm._l((_vm.bundleApps(bundle.id)),function(app){return _c('AppItem',{key:bundle.id + app.id,attrs:{\"use-bundle-view\":true,\"headers\":`app-table-rowgroup-${bundle.id}`,\"app\":app,\"category\":_vm.category}})})]})],2):_vm._e(),_vm._v(\" \"),(_vm.useAppStoreView)?_c('ul',{staticClass:\"apps-list__store-container\"},_vm._l((_vm.apps),function(app){return _c('AppItem',{key:app.id,attrs:{\"app\":app,\"category\":_vm.category,\"list-view\":false}})}),1):_vm._e()],2),_vm._v(\" \"),_c('div',{staticClass:\"apps-list apps-list--list-view\",attrs:{\"id\":\"apps-list-search\"}},[_c('div',{staticClass:\"apps-list__list-container\"},[(_vm.search !== '' && _vm.searchApps.length > 0)?_c('table',{staticClass:\"apps-list__list-container\"},[_c('caption',{staticClass:\"apps-list__bundle-header\"},[_vm._v(\"\\n\\t\\t\\t\\t\\t\"+_vm._s(_vm.t('settings', 'Results from other categories'))+\"\\n\\t\\t\\t\\t\")]),_vm._v(\" \"),_c('tr',{key:\"app-list-view-header\"},[_c('th',[_c('span',{staticClass:\"hidden-visually\"},[_vm._v(_vm._s(_vm.t('settings', 'Icon')))])]),_vm._v(\" \"),_c('th',[_c('span',{staticClass:\"hidden-visually\"},[_vm._v(_vm._s(_vm.t('settings', 'Name')))])]),_vm._v(\" \"),_c('th',[_c('span',{staticClass:\"hidden-visually\"},[_vm._v(_vm._s(_vm.t('settings', 'Version')))])]),_vm._v(\" \"),_c('th',[_c('span',{staticClass:\"hidden-visually\"},[_vm._v(_vm._s(_vm.t('settings', 'Level')))])]),_vm._v(\" \"),_c('th',[_c('span',{staticClass:\"hidden-visually\"},[_vm._v(_vm._s(_vm.t('settings', 'Actions')))])])]),_vm._v(\" \"),_vm._l((_vm.searchApps),function(app){return _c('AppItem',{key:app.id,attrs:{\"app\":app,\"category\":_vm.category}})})],2):_vm._e()])]),_vm._v(\" \"),(_vm.search !== '' && !_vm.loading && _vm.searchApps.length === 0 && _vm.apps.length === 0)?_c('div',{staticClass:\"emptycontent emptycontent-search\",attrs:{\"id\":\"apps-list-empty\"}},[_c('div',{staticClass:\"icon-settings-dark\",attrs:{\"id\":\"app-list-empty-icon\"}}),_vm._v(\" \"),_c('h2',[_vm._v(_vm._s(_vm.t('settings', 'No apps found for your version')))])]):_vm._e()])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c,_setup=_vm._self._setupProxy;return _c('div',{staticClass:\"app-discover\"},[(_setup.hasError)?_c(_setup.NcEmptyContent,{attrs:{\"name\":_setup.t('settings', 'Nothing to show'),\"description\":_setup.t('settings', 'Could not load section content from app store.')},scopedSlots:_vm._u([{key:\"icon\",fn:function(){return [_c(_setup.NcIconSvgWrapper,{attrs:{\"path\":_setup.mdiEyeOff,\"size\":64}})]},proxy:true}],null,false,638098482)}):(_setup.elements.length === 0)?_c(_setup.NcEmptyContent,{attrs:{\"name\":_setup.t('settings', 'Loading'),\"description\":_setup.t('settings', 'Fetching the latest news…')},scopedSlots:_vm._u([{key:\"icon\",fn:function(){return [_c(_setup.NcLoadingIcon,{attrs:{\"size\":64}})]},proxy:true}])}):_vm._l((_setup.elements),function(entry,index){return _c(_setup.getComponent(entry.type),_vm._b({key:entry.id ?? index,tag:\"component\"},'component',entry,false))})],2)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","/**\n * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n/**\n * Helper to transform the JSON API results to proper frontend objects (app discover section elements)\n *\n * @param element The JSON API element to transform\n */\nexport const parseApiResponse = (element) => {\n const appElement = { ...element };\n if (appElement.date) {\n appElement.date = Date.parse(appElement.date);\n }\n if (appElement.expiryDate) {\n appElement.expiryDate = Date.parse(appElement.expiryDate);\n }\n if (appElement.type === 'post') {\n return appElement;\n }\n else if (appElement.type === 'showcase') {\n return appElement;\n }\n else if (appElement.type === 'carousel') {\n return appElement;\n }\n throw new Error(`Invalid argument, app discover element with type ${element.type ?? 'unknown'} is unknown`);\n};\n/**\n * Filter outdated or upcoming elements\n * @param element Element to check\n */\nexport const filterElements = (element) => {\n const now = Date.now();\n // Element not yet published\n if (element.date && element.date > now) {\n return false;\n }\n // Element expired\n if (element.expiryDate && element.expiryDate < now) {\n return false;\n }\n return true;\n};\n","import mod from \"-!../../../../../node_modules/babel-loader/lib/index.js!../../../../../node_modules/ts-loader/index.js??clonedRuleSet-4.use[1]!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppStoreDiscoverSection.vue?vue&type=script&setup=true&lang=ts\"; export default mod; export * from \"-!../../../../../node_modules/babel-loader/lib/index.js!../../../../../node_modules/ts-loader/index.js??clonedRuleSet-4.use[1]!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppStoreDiscoverSection.vue?vue&type=script&setup=true&lang=ts\"","\n import API from \"!../../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../../node_modules/css-loader/dist/cjs.js!../../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../node_modules/sass-loader/dist/cjs.js!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppStoreDiscoverSection.vue?vue&type=style&index=0&id=bb597eea&prod&scoped=true&lang=scss\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../../node_modules/css-loader/dist/cjs.js!../../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../node_modules/sass-loader/dist/cjs.js!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppStoreDiscoverSection.vue?vue&type=style&index=0&id=bb597eea&prod&scoped=true&lang=scss\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./AppStoreDiscoverSection.vue?vue&type=template&id=bb597eea&scoped=true\"\nimport script from \"./AppStoreDiscoverSection.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./AppStoreDiscoverSection.vue?vue&type=script&setup=true&lang=ts\"\nimport style0 from \"./AppStoreDiscoverSection.vue?vue&type=style&index=0&id=bb597eea&prod&scoped=true&lang=scss\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"bb597eea\",\n null\n \n)\n\nexport default component.exports","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/ts-loader/index.js??clonedRuleSet-4.use[1]!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppStore.vue?vue&type=script&setup=true&lang=ts\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/ts-loader/index.js??clonedRuleSet-4.use[1]!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppStore.vue?vue&type=script&setup=true&lang=ts\"","\n import API from \"!../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppStore.vue?vue&type=style&index=0&id=f9073bbe&prod&scoped=true&lang=css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppStore.vue?vue&type=style&index=0&id=f9073bbe&prod&scoped=true&lang=css\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./AppStore.vue?vue&type=template&id=f9073bbe&scoped=true\"\nimport script from \"./AppStore.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./AppStore.vue?vue&type=script&setup=true&lang=ts\"\nimport style0 from \"./AppStore.vue?vue&type=style&index=0&id=f9073bbe&prod&scoped=true&lang=css\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"f9073bbe\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c,_setup=_vm._self._setupProxy;return _c(_setup.NcAppNavigation,{attrs:{\"aria-label\":_setup.t('settings', 'Apps')},scopedSlots:_vm._u([{key:\"list\",fn:function(){return [_c(_setup.NcAppNavigationItem,{attrs:{\"id\":\"app-category-discover\",\"to\":{ name: 'apps-category', params: { category: 'discover'} },\"name\":_setup.APPS_SECTION_ENUM.discover},scopedSlots:_vm._u([{key:\"icon\",fn:function(){return [_c(_setup.NcIconSvgWrapper,{attrs:{\"path\":_setup.APPSTORE_CATEGORY_ICONS.discover}})]},proxy:true}])}),_vm._v(\" \"),_c(_setup.NcAppNavigationItem,{attrs:{\"id\":\"app-category-installed\",\"to\":{ name: 'apps-category', params: { category: 'installed'} },\"name\":_setup.APPS_SECTION_ENUM.installed},scopedSlots:_vm._u([{key:\"icon\",fn:function(){return [_c(_setup.NcIconSvgWrapper,{attrs:{\"path\":_setup.APPSTORE_CATEGORY_ICONS.installed}})]},proxy:true}])}),_vm._v(\" \"),_c(_setup.NcAppNavigationItem,{attrs:{\"id\":\"app-category-enabled\",\"to\":{ name: 'apps-category', params: { category: 'enabled' } },\"name\":_setup.APPS_SECTION_ENUM.enabled},scopedSlots:_vm._u([{key:\"icon\",fn:function(){return [_c(_setup.NcIconSvgWrapper,{attrs:{\"path\":_setup.APPSTORE_CATEGORY_ICONS.enabled}})]},proxy:true}])}),_vm._v(\" \"),_c(_setup.NcAppNavigationItem,{attrs:{\"id\":\"app-category-disabled\",\"to\":{ name: 'apps-category', params: { category: 'disabled' } },\"name\":_setup.APPS_SECTION_ENUM.disabled},scopedSlots:_vm._u([{key:\"icon\",fn:function(){return [_c(_setup.NcIconSvgWrapper,{attrs:{\"path\":_setup.APPSTORE_CATEGORY_ICONS.disabled}})]},proxy:true}])}),_vm._v(\" \"),(_setup.updateCount > 0)?_c(_setup.NcAppNavigationItem,{attrs:{\"id\":\"app-category-updates\",\"to\":{ name: 'apps-category', params: { category: 'updates' } },\"name\":_setup.APPS_SECTION_ENUM.updates},scopedSlots:_vm._u([{key:\"counter\",fn:function(){return [_c(_setup.NcCounterBubble,[_vm._v(_vm._s(_setup.updateCount))])]},proxy:true},{key:\"icon\",fn:function(){return [_c(_setup.NcIconSvgWrapper,{attrs:{\"path\":_setup.APPSTORE_CATEGORY_ICONS.updates}})]},proxy:true}],null,false,2824895104)}):_vm._e(),_vm._v(\" \"),_c(_setup.NcAppNavigationItem,{attrs:{\"id\":\"app-category-your-bundles\",\"to\":{ name: 'apps-category', params: { category: 'app-bundles' } },\"name\":_setup.APPS_SECTION_ENUM['app-bundles']},scopedSlots:_vm._u([{key:\"icon\",fn:function(){return [_c(_setup.NcIconSvgWrapper,{attrs:{\"path\":_setup.APPSTORE_CATEGORY_ICONS.bundles}})]},proxy:true}])}),_vm._v(\" \"),_c(_setup.NcAppNavigationSpacer),_vm._v(\" \"),(_setup.appstoreEnabled && _setup.categoriesLoading)?_c('li',{staticClass:\"categories--loading\"},[_c(_setup.NcLoadingIcon,{attrs:{\"size\":20,\"aria-label\":_setup.t('settings', 'Loading categories')}})],1):(_setup.appstoreEnabled && !_setup.categoriesLoading)?[(_setup.isSubscribed)?_c(_setup.NcAppNavigationItem,{attrs:{\"id\":\"app-category-supported\",\"to\":{ name: 'apps-category', params: { category: 'supported' } },\"name\":_setup.APPS_SECTION_ENUM.supported},scopedSlots:_vm._u([{key:\"icon\",fn:function(){return [_c(_setup.NcIconSvgWrapper,{attrs:{\"path\":_setup.APPSTORE_CATEGORY_ICONS.supported}})]},proxy:true}],null,false,613663011)}):_vm._e(),_vm._v(\" \"),_c(_setup.NcAppNavigationItem,{attrs:{\"id\":\"app-category-featured\",\"to\":{ name: 'apps-category', params: { category: 'featured' } },\"name\":_setup.APPS_SECTION_ENUM.featured},scopedSlots:_vm._u([{key:\"icon\",fn:function(){return [_c(_setup.NcIconSvgWrapper,{attrs:{\"path\":_setup.APPSTORE_CATEGORY_ICONS.featured}})]},proxy:true}])}),_vm._v(\" \"),_vm._l((_setup.categories),function(category){return _c(_setup.NcAppNavigationItem,{key:category.id,attrs:{\"id\":`app-category-${category.id}`,\"name\":category.displayName,\"to\":{\n\t\t\t\t\tname: 'apps-category',\n\t\t\t\t\tparams: { category: category.id },\n\t\t\t\t}},scopedSlots:_vm._u([{key:\"icon\",fn:function(){return [_c(_setup.NcIconSvgWrapper,{attrs:{\"path\":category.icon}})]},proxy:true}],null,true)})})]:_vm._e(),_vm._v(\" \"),_c(_setup.NcAppNavigationItem,{attrs:{\"id\":\"app-developer-docs\",\"name\":_setup.t('settings', 'Developer documentation ↗'),\"href\":_setup.developerDocsUrl}})]},proxy:true}])})\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/ts-loader/index.js??clonedRuleSet-4.use[1]!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppStoreNavigation.vue?vue&type=script&setup=true&lang=ts\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/ts-loader/index.js??clonedRuleSet-4.use[1]!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppStoreNavigation.vue?vue&type=script&setup=true&lang=ts\"","\n import API from \"!../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppStoreNavigation.vue?vue&type=style&index=0&id=1e611b27&prod&scoped=true&lang=css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppStoreNavigation.vue?vue&type=style&index=0&id=1e611b27&prod&scoped=true&lang=css\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./AppStoreNavigation.vue?vue&type=template&id=1e611b27&scoped=true\"\nimport script from \"./AppStoreNavigation.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./AppStoreNavigation.vue?vue&type=script&setup=true&lang=ts\"\nimport style0 from \"./AppStoreNavigation.vue?vue&type=style&index=0&id=1e611b27&prod&scoped=true&lang=css\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"1e611b27\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c,_setup=_vm._self._setupProxy;return (_setup.showSidebar)?_c(_setup.NcAppSidebar,{staticClass:\"app-sidebar\",class:{ 'app-sidebar--with-screenshot': _setup.hasScreenshot },attrs:{\"active\":_setup.activeTab,\"background\":_setup.hasScreenshot ? _setup.app.screenshot : undefined,\"compact\":!_setup.hasScreenshot,\"name\":_setup.app.name,\"title\":_setup.app.name,\"subname\":_setup.licenseText,\"subtitle\":_setup.licenseText},on:{\"update:active\":function($event){_setup.activeTab=$event},\"close\":_setup.hideAppDetails},scopedSlots:_vm._u([(!_setup.hasScreenshot)?{key:\"header\",fn:function(){return [_c(_setup.NcIconSvgWrapper,{staticClass:\"app-sidebar__fallback-icon\",attrs:{\"svg\":_setup.appIcon ?? '',\"size\":64}})]},proxy:true}:null,{key:\"description\",fn:function(){return [_c('div',{staticClass:\"app-sidebar__badges\"},[_c(_setup.AppLevelBadge,{attrs:{\"level\":_setup.app.level}}),_vm._v(\" \"),(_setup.hasRating)?_c(_setup.AppScore,{attrs:{\"score\":_setup.rating}}):_vm._e()],1)]},proxy:true}],null,true)},[_vm._v(\" \"),_vm._v(\" \"),_c(_setup.AppDescriptionTab,{attrs:{\"app\":_setup.app}}),_vm._v(\" \"),_c(_setup.AppDetailsTab,{attrs:{\"app\":_setup.app}}),_vm._v(\" \"),_c(_setup.AppReleasesTab,{attrs:{\"app\":_setup.app}})],1):_vm._e()\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<!--\n - SPDX-FileCopyrightText: 2020 Nextcloud GmbH and Nextcloud contributors\n - SPDX-License-Identifier: AGPL-3.0-or-later\n-->\n\n<template>\n\t<div class=\"settings-markdown\" v-html=\"renderMarkdown\" />\n</template>\n\n<script>\nimport { marked } from 'marked'\nimport dompurify from 'dompurify'\n\nexport default {\n\tname: 'Markdown',\n\tprops: {\n\t\ttext: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\t\tminHeading: {\n\t\t\ttype: Number,\n\t\t\tdefault: 1,\n\t\t},\n\t},\n\tcomputed: {\n\t\trenderMarkdown() {\n\t\t\tconst renderer = new marked.Renderer()\n\t\t\trenderer.link = function(href, title, text) {\n\t\t\t\tlet prot\n\t\t\t\ttry {\n\t\t\t\t\tprot = decodeURIComponent(unescape(href))\n\t\t\t\t\t\t.replace(/[^\\w:]/g, '')\n\t\t\t\t\t\t.toLowerCase()\n\t\t\t\t} catch (e) {\n\t\t\t\t\treturn ''\n\t\t\t\t}\n\n\t\t\t\tif (prot.indexOf('http:') !== 0 && prot.indexOf('https:') !== 0) {\n\t\t\t\t\treturn ''\n\t\t\t\t}\n\n\t\t\t\tlet out = '<a href=\"' + href + '\" rel=\"noreferrer noopener\"'\n\t\t\t\tif (title) {\n\t\t\t\t\tout += ' title=\"' + title + '\"'\n\t\t\t\t}\n\t\t\t\tout += '>' + text + '</a>'\n\t\t\t\treturn out\n\t\t\t}\n\t\t\trenderer.heading = (text, level) => {\n\t\t\t\tlevel = Math.min(6, level + (this.minHeading - 1))\n\t\t\t\treturn `<h${level}>${text}</h${level}>`\n\t\t\t}\n\t\t\trenderer.image = function(href, title, text) {\n\t\t\t\tif (text) {\n\t\t\t\t\treturn text\n\t\t\t\t}\n\t\t\t\treturn title\n\t\t\t}\n\t\t\trenderer.blockquote = function(quote) {\n\t\t\t\treturn quote\n\t\t\t}\n\t\t\treturn dompurify.sanitize(\n\t\t\t\tmarked(this.text.trim(), {\n\t\t\t\t\trenderer,\n\t\t\t\t\tgfm: false,\n\t\t\t\t\thighlight: false,\n\t\t\t\t\ttables: false,\n\t\t\t\t\tbreaks: false,\n\t\t\t\t\tpedantic: false,\n\t\t\t\t\tsanitize: true,\n\t\t\t\t\tsmartLists: true,\n\t\t\t\t\tsmartypants: false,\n\t\t\t\t}),\n\t\t\t\t{\n\t\t\t\t\tSAFE_FOR_JQUERY: true,\n\t\t\t\t\tALLOWED_TAGS: [\n\t\t\t\t\t\t'h1',\n\t\t\t\t\t\t'h2',\n\t\t\t\t\t\t'h3',\n\t\t\t\t\t\t'h4',\n\t\t\t\t\t\t'h5',\n\t\t\t\t\t\t'h6',\n\t\t\t\t\t\t'strong',\n\t\t\t\t\t\t'p',\n\t\t\t\t\t\t'a',\n\t\t\t\t\t\t'ul',\n\t\t\t\t\t\t'ol',\n\t\t\t\t\t\t'li',\n\t\t\t\t\t\t'em',\n\t\t\t\t\t\t'del',\n\t\t\t\t\t\t'blockquote',\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t)\n\t\t},\n\t},\n}\n</script>\n\n<style scoped lang=\"scss\">\n\t.settings-markdown::v-deep {\n\n\th1,\n\th2,\n\th3,\n\th4,\n\th5,\n\th6 {\n\t\tfont-weight: 600;\n\t\tline-height: 120%;\n\t\tmargin-top: 24px;\n\t\tmargin-bottom: 12px;\n\t\tcolor: var(--color-main-text);\n\t}\n\n\th1 {\n\t\tfont-size: 36px;\n\t\tmargin-top: 48px;\n\t}\n\n\th2 {\n\t\tfont-size: 28px;\n\t\tmargin-top: 48px;\n\t}\n\n\th3 {\n\t\tfont-size: 24px;\n\t}\n\n\th4 {\n\t\tfont-size: 21px;\n\t}\n\n\th5 {\n\t\tfont-size: 17px;\n\t}\n\n\th6 {\n\t\tfont-size: var(--default-font-size);\n\t}\n\n\tpre {\n\t\twhite-space: pre;\n\t\toverflow-x: auto;\n\t\tbackground-color: var(--color-background-dark);\n\t\tborder-radius: var(--border-radius);\n\t\tpadding: 1em 1.3em;\n\t\tmargin-bottom: 1em;\n\t}\n\n\tp code {\n\t\tbackground-color: var(--color-background-dark);\n\t\tborder-radius: var(--border-radius);\n\t\tpadding: .1em .3em;\n\t}\n\n\tli {\n\t\tposition: relative;\n\t}\n\n\tul, ol {\n\t\tpadding-inline-start: 10px;\n\t\tmargin-inline-start: 10px;\n\t}\n\n\tul li {\n\t\tlist-style-type: disc;\n\t}\n\n\tul > li > ul > li {\n\t\tlist-style-type: circle;\n\t}\n\n\tul > li > ul > li ul li {\n\t\tlist-style-type: square;\n\t}\n\n\tblockquote {\n\t\tpadding-inline-start: 1em;\n\t\tborder-inline-start: 4px solid var(--color-primary-element);\n\t\tcolor: var(--color-text-maxcontrast);\n\t\tmargin-inline: 0;\n\t}\n\n\t}\n</style>\n","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Markdown.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Markdown.vue?vue&type=script&lang=js\"","\n import API from \"!../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Markdown.vue?vue&type=style&index=0&id=5d3cebad&prod&scoped=true&lang=scss\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Markdown.vue?vue&type=style&index=0&id=5d3cebad&prod&scoped=true&lang=scss\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./Markdown.vue?vue&type=template&id=5d3cebad&scoped=true\"\nimport script from \"./Markdown.vue?vue&type=script&lang=js\"\nexport * from \"./Markdown.vue?vue&type=script&lang=js\"\nimport style0 from \"./Markdown.vue?vue&type=style&index=0&id=5d3cebad&prod&scoped=true&lang=scss\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"5d3cebad\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"settings-markdown\",domProps:{\"innerHTML\":_vm._s(_vm.renderMarkdown)}})\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../../node_modules/babel-loader/lib/index.js!../../../../../node_modules/ts-loader/index.js??clonedRuleSet-4.use[1]!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppDescriptionTab.vue?vue&type=script&setup=true&lang=ts\"; export default mod; export * from \"-!../../../../../node_modules/babel-loader/lib/index.js!../../../../../node_modules/ts-loader/index.js??clonedRuleSet-4.use[1]!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppDescriptionTab.vue?vue&type=script&setup=true&lang=ts\"","var render = function render(){var _vm=this,_c=_vm._self._c,_setup=_vm._self._setupProxy;return _c(_setup.NcAppSidebarTab,{attrs:{\"id\":\"desc\",\"name\":_setup.t('settings', 'Description'),\"order\":0},scopedSlots:_vm._u([{key:\"icon\",fn:function(){return [_c(_setup.NcIconSvgWrapper,{attrs:{\"path\":_setup.mdiTextShort}})]},proxy:true}])},[_vm._v(\" \"),_c('div',{staticClass:\"app-description\"},[_c(_setup.Markdown,{attrs:{\"text\":_vm.app.description,\"min-heading\":4}})],1)])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n import API from \"!../../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../../node_modules/css-loader/dist/cjs.js!../../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../node_modules/sass-loader/dist/cjs.js!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppDescriptionTab.vue?vue&type=style&index=0&id=cf0a1ae6&prod&scoped=true&lang=scss\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../../node_modules/css-loader/dist/cjs.js!../../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../node_modules/sass-loader/dist/cjs.js!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppDescriptionTab.vue?vue&type=style&index=0&id=cf0a1ae6&prod&scoped=true&lang=scss\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./AppDescriptionTab.vue?vue&type=template&id=cf0a1ae6&scoped=true\"\nimport script from \"./AppDescriptionTab.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./AppDescriptionTab.vue?vue&type=script&setup=true&lang=ts\"\nimport style0 from \"./AppDescriptionTab.vue?vue&type=style&index=0&id=cf0a1ae6&prod&scoped=true&lang=scss\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"cf0a1ae6\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('NcAppSidebarTab',{attrs:{\"id\":\"details\",\"name\":_vm.t('settings', 'Details'),\"order\":1},scopedSlots:_vm._u([{key:\"icon\",fn:function(){return [_c('NcIconSvgWrapper',{attrs:{\"path\":_vm.mdiTextBox}})]},proxy:true}])},[_vm._v(\" \"),_c('div',{staticClass:\"app-details\"},[_c('div',{staticClass:\"app-details__actions\"},[(_vm.app.active && _vm.canLimitToGroups(_vm.app))?_c('div',{staticClass:\"app-details__actions-groups\"},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.groupCheckedAppsData),expression:\"groupCheckedAppsData\"}],staticClass:\"groups-enable__checkbox checkbox\",attrs:{\"id\":`groups_enable_${_vm.app.id}`,\"type\":\"checkbox\"},domProps:{\"value\":_vm.app.id,\"checked\":Array.isArray(_vm.groupCheckedAppsData)?_vm._i(_vm.groupCheckedAppsData,_vm.app.id)>-1:(_vm.groupCheckedAppsData)},on:{\"change\":[function($event){var $$a=_vm.groupCheckedAppsData,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=_vm.app.id,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.groupCheckedAppsData=$$a.concat([$$v]))}else{$$i>-1&&(_vm.groupCheckedAppsData=$$a.slice(0,$$i).concat($$a.slice($$i+1)))}}else{_vm.groupCheckedAppsData=$$c}},_vm.setGroupLimit]}}),_vm._v(\" \"),_c('label',{attrs:{\"for\":`groups_enable_${_vm.app.id}`}},[_vm._v(_vm._s(_vm.t('settings', 'Limit to groups')))]),_vm._v(\" \"),_c('input',{staticClass:\"group_select\",attrs:{\"type\":\"hidden\",\"title\":_vm.t('settings', 'All'),\"value\":\"\"}}),_vm._v(\" \"),_c('br'),_vm._v(\" \"),_c('label',{attrs:{\"for\":\"limitToGroups\"}},[_c('span',[_vm._v(_vm._s(_vm.t('settings', 'Limit app usage to groups')))])]),_vm._v(\" \"),(_vm.isLimitedToGroups(_vm.app))?_c('NcSelect',{attrs:{\"input-id\":\"limitToGroups\",\"options\":_vm.groups,\"value\":_vm.appGroups,\"limit\":5,\"label\":\"name\",\"multiple\":true,\"close-on-select\":false},on:{\"option:selected\":_vm.addGroupLimitation,\"option:deselected\":_vm.removeGroupLimitation,\"search\":_vm.asyncFindGroup}},[_c('span',{attrs:{\"slot\":\"noResult\"},slot:\"noResult\"},[_vm._v(_vm._s(_vm.t('settings', 'No results')))])]):_vm._e()],1):_vm._e(),_vm._v(\" \"),_c('div',{staticClass:\"app-details__actions-manage\"},[(_vm.app.update)?_c('input',{staticClass:\"update primary\",attrs:{\"type\":\"button\",\"value\":_vm.t('settings', 'Update to {version}', { version: _vm.app.update }),\"disabled\":_vm.installing || _vm.isLoading},on:{\"click\":function($event){return _vm.update(_vm.app.id)}}}):_vm._e(),_vm._v(\" \"),(_vm.app.canUnInstall)?_c('input',{staticClass:\"uninstall\",attrs:{\"type\":\"button\",\"value\":_vm.t('settings', 'Remove'),\"disabled\":_vm.installing || _vm.isLoading},on:{\"click\":function($event){return _vm.remove(_vm.app.id)}}}):_vm._e(),_vm._v(\" \"),(_vm.app.active)?_c('input',{staticClass:\"enable\",attrs:{\"type\":\"button\",\"value\":_vm.t('settings','Disable'),\"disabled\":_vm.installing || _vm.isLoading},on:{\"click\":function($event){return _vm.disable(_vm.app.id)}}}):_vm._e(),_vm._v(\" \"),(!_vm.app.active && (_vm.app.canInstall || _vm.app.isCompatible))?_c('input',{staticClass:\"enable primary\",attrs:{\"title\":_vm.enableButtonTooltip,\"aria-label\":_vm.enableButtonTooltip,\"type\":\"button\",\"value\":_vm.enableButtonText,\"disabled\":!_vm.app.canInstall || _vm.installing || _vm.isLoading},on:{\"click\":function($event){return _vm.enable(_vm.app.id)}}}):(!_vm.app.active && !_vm.app.canInstall)?_c('input',{staticClass:\"enable force\",attrs:{\"title\":_vm.forceEnableButtonTooltip,\"aria-label\":_vm.forceEnableButtonTooltip,\"type\":\"button\",\"value\":_vm.forceEnableButtonText,\"disabled\":_vm.installing || _vm.isLoading},on:{\"click\":function($event){return _vm.forceEnable(_vm.app.id)}}}):_vm._e()])]),_vm._v(\" \"),_c('ul',{staticClass:\"app-details__dependencies\"},[(_vm.app.missingMinOwnCloudVersion)?_c('li',[_vm._v(\"\\n\\t\\t\\t\\t\"+_vm._s(_vm.t('settings', 'This app has no minimum Nextcloud version assigned. This will be an error in the future.'))+\"\\n\\t\\t\\t\")]):_vm._e(),_vm._v(\" \"),(_vm.app.missingMaxOwnCloudVersion)?_c('li',[_vm._v(\"\\n\\t\\t\\t\\t\"+_vm._s(_vm.t('settings', 'This app has no maximum Nextcloud version assigned. This will be an error in the future.'))+\"\\n\\t\\t\\t\")]):_vm._e(),_vm._v(\" \"),(!_vm.app.canInstall)?_c('li',[_vm._v(\"\\n\\t\\t\\t\\t\"+_vm._s(_vm.t('settings', 'This app cannot be installed because the following dependencies are not fulfilled:'))+\"\\n\\t\\t\\t\\t\"),_c('ul',{staticClass:\"missing-dependencies\"},_vm._l((_vm.app.missingDependencies),function(dep,index){return _c('li',{key:index},[_vm._v(\"\\n\\t\\t\\t\\t\\t\\t\"+_vm._s(dep)+\"\\n\\t\\t\\t\\t\\t\")])}),0)]):_vm._e()]),_vm._v(\" \"),(_vm.lastModified)?_c('div',{staticClass:\"app-details__section\"},[_c('h4',[_vm._v(\"\\n\\t\\t\\t\\t\"+_vm._s(_vm.t('settings', 'Latest updated'))+\"\\n\\t\\t\\t\")]),_vm._v(\" \"),_c('NcDateTime',{attrs:{\"timestamp\":_vm.lastModified}})],1):_vm._e(),_vm._v(\" \"),_c('div',{staticClass:\"app-details__section\"},[_c('h4',[_vm._v(\"\\n\\t\\t\\t\\t\"+_vm._s(_vm.t('settings', 'Author'))+\"\\n\\t\\t\\t\")]),_vm._v(\" \"),_c('p',{staticClass:\"app-details__authors\"},[_vm._v(\"\\n\\t\\t\\t\\t\"+_vm._s(_vm.appAuthors)+\"\\n\\t\\t\\t\")])]),_vm._v(\" \"),_c('div',{staticClass:\"app-details__section\"},[_c('h4',[_vm._v(\"\\n\\t\\t\\t\\t\"+_vm._s(_vm.t('settings', 'Categories'))+\"\\n\\t\\t\\t\")]),_vm._v(\" \"),_c('p',[_vm._v(\"\\n\\t\\t\\t\\t\"+_vm._s(_vm.appCategories)+\"\\n\\t\\t\\t\")])]),_vm._v(\" \"),(_vm.externalResources.length > 0)?_c('div',{staticClass:\"app-details__section\"},[_c('h4',[_vm._v(_vm._s(_vm.t('settings', 'Resources')))]),_vm._v(\" \"),_c('ul',{staticClass:\"app-details__documentation\",attrs:{\"aria-label\":_vm.t('settings', 'Documentation')}},_vm._l((_vm.externalResources),function(resource){return _c('li',{key:resource.id},[_c('a',{staticClass:\"appslink\",attrs:{\"href\":resource.href,\"target\":\"_blank\",\"rel\":\"noreferrer noopener\"}},[_vm._v(\"\\n\\t\\t\\t\\t\\t\\t\"+_vm._s(resource.label)+\" ↗\\n\\t\\t\\t\\t\\t\")])])}),0)]):_vm._e(),_vm._v(\" \"),_c('div',{staticClass:\"app-details__section\"},[_c('h4',[_vm._v(_vm._s(_vm.t('settings', 'Interact')))]),_vm._v(\" \"),_c('div',{staticClass:\"app-details__interact\"},[_c('NcButton',{attrs:{\"disabled\":!_vm.app.bugs,\"href\":_vm.app.bugs ?? '#',\"aria-label\":_vm.t('settings', 'Report a bug'),\"title\":_vm.t('settings', 'Report a bug')},scopedSlots:_vm._u([{key:\"icon\",fn:function(){return [_c('NcIconSvgWrapper',{attrs:{\"path\":_vm.mdiBug}})]},proxy:true}])}),_vm._v(\" \"),_c('NcButton',{attrs:{\"disabled\":!_vm.app.bugs,\"href\":_vm.app.bugs ?? '#',\"aria-label\":_vm.t('settings', 'Request feature'),\"title\":_vm.t('settings', 'Request feature')},scopedSlots:_vm._u([{key:\"icon\",fn:function(){return [_c('NcIconSvgWrapper',{attrs:{\"path\":_vm.mdiFeatureSearch}})]},proxy:true}])}),_vm._v(\" \"),(_vm.app.appstoreData?.discussion)?_c('NcButton',{attrs:{\"href\":_vm.app.appstoreData.discussion,\"aria-label\":_vm.t('settings', 'Ask questions or discuss'),\"title\":_vm.t('settings', 'Ask questions or discuss')},scopedSlots:_vm._u([{key:\"icon\",fn:function(){return [_c('NcIconSvgWrapper',{attrs:{\"path\":_vm.mdiTooltipQuestion}})]},proxy:true}],null,false,1288192462)}):_vm._e(),_vm._v(\" \"),(!_vm.app.internal)?_c('NcButton',{attrs:{\"href\":_vm.rateAppUrl,\"aria-label\":_vm.t('settings', 'Rate the app'),\"title\":_vm.t('settings', 'Rate')},scopedSlots:_vm._u([{key:\"icon\",fn:function(){return [_c('NcIconSvgWrapper',{attrs:{\"path\":_vm.mdiStar}})]},proxy:true}],null,false,422450625)}):_vm._e()],1)])])])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<!--\n - SPDX-FileCopyrightText: 2018 Nextcloud GmbH and Nextcloud contributors\n - SPDX-License-Identifier: AGPL-3.0-or-later\n-->\n\n<template>\n\t<NcAppSidebarTab id=\"details\"\n\t\t:name=\"t('settings', 'Details')\"\n\t\t:order=\"1\">\n\t\t<template #icon>\n\t\t\t<NcIconSvgWrapper :path=\"mdiTextBox\" />\n\t\t</template>\n\t\t<div class=\"app-details\">\n\t\t\t<div class=\"app-details__actions\">\n\t\t\t\t<div v-if=\"app.active && canLimitToGroups(app)\" class=\"app-details__actions-groups\">\n\t\t\t\t\t<input :id=\"`groups_enable_${app.id}`\"\n\t\t\t\t\t\tv-model=\"groupCheckedAppsData\"\n\t\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\t\t:value=\"app.id\"\n\t\t\t\t\t\tclass=\"groups-enable__checkbox checkbox\"\n\t\t\t\t\t\t@change=\"setGroupLimit\">\n\t\t\t\t\t<label :for=\"`groups_enable_${app.id}`\">{{ t('settings', 'Limit to groups') }}</label>\n\t\t\t\t\t<input type=\"hidden\"\n\t\t\t\t\t\tclass=\"group_select\"\n\t\t\t\t\t\t:title=\"t('settings', 'All')\"\n\t\t\t\t\t\tvalue=\"\">\n\t\t\t\t\t<br>\n\t\t\t\t\t<label for=\"limitToGroups\">\n\t\t\t\t\t\t<span>{{ t('settings', 'Limit app usage to groups') }}</span>\n\t\t\t\t\t</label>\n\t\t\t\t\t<NcSelect v-if=\"isLimitedToGroups(app)\"\n\t\t\t\t\t\tinput-id=\"limitToGroups\"\n\t\t\t\t\t\t:options=\"groups\"\n\t\t\t\t\t\t:value=\"appGroups\"\n\t\t\t\t\t\t:limit=\"5\"\n\t\t\t\t\t\tlabel=\"name\"\n\t\t\t\t\t\t:multiple=\"true\"\n\t\t\t\t\t\t:close-on-select=\"false\"\n\t\t\t\t\t\t@option:selected=\"addGroupLimitation\"\n\t\t\t\t\t\t@option:deselected=\"removeGroupLimitation\"\n\t\t\t\t\t\t@search=\"asyncFindGroup\">\n\t\t\t\t\t\t<span slot=\"noResult\">{{ t('settings', 'No results') }}</span>\n\t\t\t\t\t</NcSelect>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"app-details__actions-manage\">\n\t\t\t\t\t<input v-if=\"app.update\"\n\t\t\t\t\t\tclass=\"update primary\"\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t:value=\"t('settings', 'Update to {version}', { version: app.update })\"\n\t\t\t\t\t\t:disabled=\"installing || isLoading\"\n\t\t\t\t\t\t@click=\"update(app.id)\">\n\t\t\t\t\t<input v-if=\"app.canUnInstall\"\n\t\t\t\t\t\tclass=\"uninstall\"\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t:value=\"t('settings', 'Remove')\"\n\t\t\t\t\t\t:disabled=\"installing || isLoading\"\n\t\t\t\t\t\t@click=\"remove(app.id)\">\n\t\t\t\t\t<input v-if=\"app.active\"\n\t\t\t\t\t\tclass=\"enable\"\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t:value=\"t('settings','Disable')\"\n\t\t\t\t\t\t:disabled=\"installing || isLoading\"\n\t\t\t\t\t\t@click=\"disable(app.id)\">\n\t\t\t\t\t<input v-if=\"!app.active && (app.canInstall || app.isCompatible)\"\n\t\t\t\t\t\t:title=\"enableButtonTooltip\"\n\t\t\t\t\t\t:aria-label=\"enableButtonTooltip\"\n\t\t\t\t\t\tclass=\"enable primary\"\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t:value=\"enableButtonText\"\n\t\t\t\t\t\t:disabled=\"!app.canInstall || installing || isLoading\"\n\t\t\t\t\t\t@click=\"enable(app.id)\">\n\t\t\t\t\t<input v-else-if=\"!app.active && !app.canInstall\"\n\t\t\t\t\t\t:title=\"forceEnableButtonTooltip\"\n\t\t\t\t\t\t:aria-label=\"forceEnableButtonTooltip\"\n\t\t\t\t\t\tclass=\"enable force\"\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t:value=\"forceEnableButtonText\"\n\t\t\t\t\t\t:disabled=\"installing || isLoading\"\n\t\t\t\t\t\t@click=\"forceEnable(app.id)\">\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<ul class=\"app-details__dependencies\">\n\t\t\t\t<li v-if=\"app.missingMinOwnCloudVersion\">\n\t\t\t\t\t{{ t('settings', 'This app has no minimum Nextcloud version assigned. This will be an error in the future.') }}\n\t\t\t\t</li>\n\t\t\t\t<li v-if=\"app.missingMaxOwnCloudVersion\">\n\t\t\t\t\t{{ t('settings', 'This app has no maximum Nextcloud version assigned. This will be an error in the future.') }}\n\t\t\t\t</li>\n\t\t\t\t<li v-if=\"!app.canInstall\">\n\t\t\t\t\t{{ t('settings', 'This app cannot be installed because the following dependencies are not fulfilled:') }}\n\t\t\t\t\t<ul class=\"missing-dependencies\">\n\t\t\t\t\t\t<li v-for=\"(dep, index) in app.missingDependencies\" :key=\"index\">\n\t\t\t\t\t\t\t{{ dep }}\n\t\t\t\t\t\t</li>\n\t\t\t\t\t</ul>\n\t\t\t\t</li>\n\t\t\t</ul>\n\n\t\t\t<div v-if=\"lastModified\" class=\"app-details__section\">\n\t\t\t\t<h4>\n\t\t\t\t\t{{ t('settings', 'Latest updated') }}\n\t\t\t\t</h4>\n\t\t\t\t<NcDateTime :timestamp=\"lastModified\" />\n\t\t\t</div>\n\n\t\t\t<div class=\"app-details__section\">\n\t\t\t\t<h4>\n\t\t\t\t\t{{ t('settings', 'Author') }}\n\t\t\t\t</h4>\n\t\t\t\t<p class=\"app-details__authors\">\n\t\t\t\t\t{{ appAuthors }}\n\t\t\t\t</p>\n\t\t\t</div>\n\n\t\t\t<div class=\"app-details__section\">\n\t\t\t\t<h4>\n\t\t\t\t\t{{ t('settings', 'Categories') }}\n\t\t\t\t</h4>\n\t\t\t\t<p>\n\t\t\t\t\t{{ appCategories }}\n\t\t\t\t</p>\n\t\t\t</div>\n\n\t\t\t<div v-if=\"externalResources.length > 0\" class=\"app-details__section\">\n\t\t\t\t<h4>{{ t('settings', 'Resources') }}</h4>\n\t\t\t\t<ul class=\"app-details__documentation\" :aria-label=\"t('settings', 'Documentation')\">\n\t\t\t\t\t<li v-for=\"resource of externalResources\" :key=\"resource.id\">\n\t\t\t\t\t\t<a class=\"appslink\"\n\t\t\t\t\t\t\t:href=\"resource.href\"\n\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\trel=\"noreferrer noopener\">\n\t\t\t\t\t\t\t{{ resource.label }} ↗\n\t\t\t\t\t\t</a>\n\t\t\t\t\t</li>\n\t\t\t\t</ul>\n\t\t\t</div>\n\n\t\t\t<div class=\"app-details__section\">\n\t\t\t\t<h4>{{ t('settings', 'Interact') }}</h4>\n\t\t\t\t<div class=\"app-details__interact\">\n\t\t\t\t\t<NcButton :disabled=\"!app.bugs\"\n\t\t\t\t\t\t:href=\"app.bugs ?? '#'\"\n\t\t\t\t\t\t:aria-label=\"t('settings', 'Report a bug')\"\n\t\t\t\t\t\t:title=\"t('settings', 'Report a bug')\">\n\t\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t\t<NcIconSvgWrapper :path=\"mdiBug\" />\n\t\t\t\t\t\t</template>\n\t\t\t\t\t</NcButton>\n\t\t\t\t\t<NcButton :disabled=\"!app.bugs\"\n\t\t\t\t\t\t:href=\"app.bugs ?? '#'\"\n\t\t\t\t\t\t:aria-label=\"t('settings', 'Request feature')\"\n\t\t\t\t\t\t:title=\"t('settings', 'Request feature')\">\n\t\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t\t<NcIconSvgWrapper :path=\"mdiFeatureSearch\" />\n\t\t\t\t\t\t</template>\n\t\t\t\t\t</NcButton>\n\t\t\t\t\t<NcButton v-if=\"app.appstoreData?.discussion\"\n\t\t\t\t\t\t:href=\"app.appstoreData.discussion\"\n\t\t\t\t\t\t:aria-label=\"t('settings', 'Ask questions or discuss')\"\n\t\t\t\t\t\t:title=\"t('settings', 'Ask questions or discuss')\">\n\t\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t\t<NcIconSvgWrapper :path=\"mdiTooltipQuestion\" />\n\t\t\t\t\t\t</template>\n\t\t\t\t\t</NcButton>\n\t\t\t\t\t<NcButton v-if=\"!app.internal\"\n\t\t\t\t\t\t:href=\"rateAppUrl\"\n\t\t\t\t\t\t:aria-label=\"t('settings', 'Rate the app')\"\n\t\t\t\t\t\t:title=\"t('settings', 'Rate')\">\n\t\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t\t<NcIconSvgWrapper :path=\"mdiStar\" />\n\t\t\t\t\t\t</template>\n\t\t\t\t\t</NcButton>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t</NcAppSidebarTab>\n</template>\n\n<script>\nimport NcAppSidebarTab from '@nextcloud/vue/dist/Components/NcAppSidebarTab.js'\nimport NcButton from '@nextcloud/vue/dist/Components/NcButton.js'\nimport NcDateTime from '@nextcloud/vue/dist/Components/NcDateTime.js'\nimport NcIconSvgWrapper from '@nextcloud/vue/dist/Components/NcIconSvgWrapper.js'\nimport NcSelect from '@nextcloud/vue/dist/Components/NcSelect.js'\n\nimport AppManagement from '../../mixins/AppManagement.js'\nimport { mdiBug, mdiFeatureSearch, mdiStar, mdiTextBox, mdiTooltipQuestion } from '@mdi/js'\nimport { useAppsStore } from '../../store/apps-store'\n\nexport default {\n\tname: 'AppDetailsTab',\n\n\tcomponents: {\n\t\tNcAppSidebarTab,\n\t\tNcButton,\n\t\tNcDateTime,\n\t\tNcIconSvgWrapper,\n\t\tNcSelect,\n\t},\n\tmixins: [AppManagement],\n\n\tprops: {\n\t\tapp: {\n\t\t\ttype: Object,\n\t\t\trequired: true,\n\t\t},\n\t},\n\n\tsetup() {\n\t\tconst store = useAppsStore()\n\n\t\treturn {\n\t\t\tstore,\n\n\t\t\tmdiBug,\n\t\t\tmdiFeatureSearch,\n\t\t\tmdiStar,\n\t\t\tmdiTextBox,\n\t\t\tmdiTooltipQuestion,\n\t\t}\n\t},\n\n\tdata() {\n\t\treturn {\n\t\t\tgroupCheckedAppsData: false,\n\t\t}\n\t},\n\n\tcomputed: {\n\t\tlastModified() {\n\t\t\treturn (this.app.appstoreData?.releases ?? [])\n\t\t\t\t.map(({ lastModified }) => Date.parse(lastModified))\n\t\t\t\t.sort()\n\t\t\t\t.at(0) ?? null\n\t\t},\n\t\t/**\n\t\t * App authors as comma separated string\n\t\t */\n\t\tappAuthors() {\n\t\t\tconsole.warn(this.app)\n\t\t\tif (!this.app) {\n\t\t\t\treturn ''\n\t\t\t}\n\n\t\t\tconst authorName = (xmlNode) => {\n\t\t\t\tif (xmlNode['@value']) {\n\t\t\t\t\t// Complex node (with email or homepage attribute)\n\t\t\t\t\treturn xmlNode['@value']\n\t\t\t\t}\n\t\t\t\t// Simple text node\n\t\t\t\treturn xmlNode\n\t\t\t}\n\n\t\t\tconst authors = Array.isArray(this.app.author)\n\t\t\t\t? this.app.author.map(authorName)\n\t\t\t\t: [authorName(this.app.author)]\n\n\t\t\treturn authors\n\t\t\t\t.sort((a, b) => a.split(' ').at(-1).localeCompare(b.split(' ').at(-1)))\n\t\t\t\t.join(', ')\n\t\t},\n\n\t\tappstoreUrl() {\n\t\t\treturn `https://apps.nextcloud.com/apps/${this.app.id}`\n\t\t},\n\n\t\t/**\n\t\t * Further external resources (e.g. website)\n\t\t */\n\t\texternalResources() {\n\t\t\tconst resources = []\n\t\t\tif (!this.app.internal) {\n\t\t\t\tresources.push({\n\t\t\t\t\tid: 'appstore',\n\t\t\t\t\thref: this.appstoreUrl,\n\t\t\t\t\tlabel: t('settings', 'View in store'),\n\t\t\t\t})\n\t\t\t}\n\t\t\tif (this.app.website) {\n\t\t\t\tresources.push({\n\t\t\t\t\tid: 'website',\n\t\t\t\t\thref: this.app.website,\n\t\t\t\t\tlabel: t('settings', 'Visit website'),\n\t\t\t\t})\n\t\t\t}\n\t\t\tif (this.app.documentation) {\n\t\t\t\tif (this.app.documentation.user) {\n\t\t\t\t\tresources.push({\n\t\t\t\t\t\tid: 'doc-user',\n\t\t\t\t\t\thref: this.app.documentation.user,\n\t\t\t\t\t\tlabel: t('settings', 'Usage documentation'),\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t\tif (this.app.documentation.admin) {\n\t\t\t\t\tresources.push({\n\t\t\t\t\t\tid: 'doc-admin',\n\t\t\t\t\t\thref: this.app.documentation.admin,\n\t\t\t\t\t\tlabel: t('settings', 'Admin documentation'),\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t\tif (this.app.documentation.developer) {\n\t\t\t\t\tresources.push({\n\t\t\t\t\t\tid: 'doc-developer',\n\t\t\t\t\t\thref: this.app.documentation.developer,\n\t\t\t\t\t\tlabel: t('settings', 'Developer documentation'),\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn resources\n\t\t},\n\n\t\tappCategories() {\n\t\t\treturn [this.app.category].flat()\n\t\t\t\t.map((id) => this.store.getCategoryById(id)?.displayName ?? id)\n\t\t\t\t.join(', ')\n\t\t},\n\n\t\trateAppUrl() {\n\t\t\treturn `${this.appstoreUrl}#comments`\n\t\t},\n\t\tappGroups() {\n\t\t\treturn this.app.groups.map(group => { return { id: group, name: group } })\n\t\t},\n\t\tgroups() {\n\t\t\treturn this.$store.getters.getGroups\n\t\t\t\t.filter(group => group.id !== 'disabled')\n\t\t\t\t.sort((a, b) => a.name.localeCompare(b.name))\n\t\t},\n\t},\n\tmounted() {\n\t\tif (this.app.groups.length > 0) {\n\t\t\tthis.groupCheckedAppsData = true\n\t\t}\n\t},\n}\n</script>\n\n<style scoped lang=\"scss\">\n.app-details {\n\tpadding: 20px;\n\n\t&__actions {\n\t\t// app management\n\t\t&-manage {\n\t\t\t// if too many, shrink them and ellipsis\n\t\t\tdisplay: flex;\n\t\t\tinput {\n\t\t\t\tflex: 0 1 auto;\n\t\t\t\tmin-width: 0;\n\t\t\t\ttext-overflow: ellipsis;\n\t\t\t\twhite-space: nowrap;\n\t\t\t\toverflow: hidden;\n\t\t\t}\n\t\t}\n\t}\n\t&__authors {\n\t\tcolor: var(--color-text-maxcontrast);\n\t}\n\n\t&__section {\n\t\tmargin-top: 15px;\n\n\t\th4 {\n\t\t\tfont-size: 16px;\n\t\t\tfont-weight: bold;\n\t\t\tmargin-block-end: 5px;\n\t\t}\n\t}\n\n\t&__interact {\n\t\tdisplay: flex;\n\t\tflex-direction: row;\n\t\tflex-wrap: wrap;\n\t\tgap: 12px;\n\t}\n\n\t&__documentation {\n\t\ta {\n\t\t\ttext-decoration: underline;\n\t\t}\n\t\tli {\n\t\t\tpadding-inline-start: 20px;\n\n\t\t\t&::before {\n\t\t\t\twidth: 5px;\n\t\t\t\theight: 5px;\n\t\t\t\tborder-radius: 100%;\n\t\t\t\tbackground-color: var(--color-main-text);\n\t\t\t\tcontent: \"\";\n\t\t\t\tfloat: inline-start;\n\t\t\t\tmargin-inline-start: -13px;\n\t\t\t\tposition: relative;\n\t\t\t\ttop: 10px;\n\t\t\t}\n\t\t}\n\t}\n}\n\n.force {\n\tcolor: var(--color-error);\n\tborder-color: var(--color-error);\n\tbackground: var(--color-main-background);\n}\n.force:hover,\n.force:active {\n\tcolor: var(--color-main-background);\n\tborder-color: var(--color-error) !important;\n\tbackground: var(--color-error);\n}\n\n.missing-dependencies {\n\tlist-style: initial;\n\tlist-style-type: initial;\n\tlist-style-position: inside;\n}\n</style>\n","import mod from \"-!../../../../../node_modules/babel-loader/lib/index.js!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppDetailsTab.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../../../../node_modules/babel-loader/lib/index.js!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppDetailsTab.vue?vue&type=script&lang=js\"","\n import API from \"!../../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../../node_modules/css-loader/dist/cjs.js!../../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../node_modules/sass-loader/dist/cjs.js!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppDetailsTab.vue?vue&type=style&index=0&id=533705fa&prod&scoped=true&lang=scss\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../../node_modules/css-loader/dist/cjs.js!../../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../node_modules/sass-loader/dist/cjs.js!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppDetailsTab.vue?vue&type=style&index=0&id=533705fa&prod&scoped=true&lang=scss\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./AppDetailsTab.vue?vue&type=template&id=533705fa&scoped=true\"\nimport script from \"./AppDetailsTab.vue?vue&type=script&lang=js\"\nexport * from \"./AppDetailsTab.vue?vue&type=script&lang=js\"\nimport style0 from \"./AppDetailsTab.vue?vue&type=style&index=0&id=533705fa&prod&scoped=true&lang=scss\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"533705fa\",\n null\n \n)\n\nexport default component.exports","import mod from \"-!../../../../../node_modules/babel-loader/lib/index.js!../../../../../node_modules/ts-loader/index.js??clonedRuleSet-4.use[1]!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppReleasesTab.vue?vue&type=script&setup=true&lang=ts\"; export default mod; export * from \"-!../../../../../node_modules/babel-loader/lib/index.js!../../../../../node_modules/ts-loader/index.js??clonedRuleSet-4.use[1]!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppReleasesTab.vue?vue&type=script&setup=true&lang=ts\"","var render = function render(){var _vm=this,_c=_vm._self._c,_setup=_vm._self._setupProxy;return (_setup.hasChangelog)?_c(_setup.NcAppSidebarTab,{attrs:{\"id\":\"changelog\",\"name\":_setup.t('settings', 'Changelog'),\"order\":2},scopedSlots:_vm._u([{key:\"icon\",fn:function(){return [_c(_setup.NcIconSvgWrapper,{attrs:{\"path\":_setup.mdiClockFast,\"size\":24}})]},proxy:true}],null,false,1849836872)},[_vm._v(\" \"),_vm._l((_vm.app.releases),function(release){return _c('div',{key:release.version,staticClass:\"app-sidebar-tabs__release\"},[_c('h2',[_vm._v(_vm._s(release.version))]),_vm._v(\" \"),_c(_setup.Markdown,{staticClass:\"app-sidebar-tabs__release-text\",attrs:{\"text\":_setup.createChangelogFromRelease(release)}})],1)})],2):_vm._e()\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n import API from \"!../../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../../node_modules/css-loader/dist/cjs.js!../../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../node_modules/sass-loader/dist/cjs.js!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppReleasesTab.vue?vue&type=style&index=0&id=9c32407e&prod&scoped=true&lang=scss\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../../node_modules/css-loader/dist/cjs.js!../../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../node_modules/sass-loader/dist/cjs.js!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppReleasesTab.vue?vue&type=style&index=0&id=9c32407e&prod&scoped=true&lang=scss\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./AppReleasesTab.vue?vue&type=template&id=9c32407e&scoped=true\"\nimport script from \"./AppReleasesTab.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./AppReleasesTab.vue?vue&type=script&setup=true&lang=ts\"\nimport style0 from \"./AppReleasesTab.vue?vue&type=style&index=0&id=9c32407e&prod&scoped=true&lang=scss\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"9c32407e\",\n null\n \n)\n\nexport default component.exports","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/ts-loader/index.js??clonedRuleSet-4.use[1]!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppStoreSidebar.vue?vue&type=script&setup=true&lang=ts\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/ts-loader/index.js??clonedRuleSet-4.use[1]!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppStoreSidebar.vue?vue&type=script&setup=true&lang=ts\"","import { mdiCog } from '@mdi/js';\nimport { computed, ref, watchEffect } from 'vue';\nimport AppstoreCategoryIcons from '../constants/AppstoreCategoryIcons.ts';\nimport logger from '../logger.ts';\n/**\n * Get the app icon raw SVG for use with `NcIconSvgWrapper` (do never use without sanitizing)\n * It has a fallback to the categroy icon.\n *\n * @param app The app to get the icon for\n */\nexport function useAppIcon(app) {\n const appIcon = ref(null);\n /**\n * Fallback value if no app icon available\n */\n const categoryIcon = computed(() => {\n const path = [app.value?.category ?? []].flat()\n .map((name) => AppstoreCategoryIcons[name])\n .filter((icon) => !!icon)\n .at(0)\n ?? mdiCog;\n return path ? `<svg viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"${path}\" /></svg>` : null;\n });\n watchEffect(async () => {\n // Note: Only variables until the first `await` will be watched!\n if (!app.value?.preview) {\n appIcon.value = categoryIcon.value;\n }\n else {\n appIcon.value = null;\n // Now try to load the real app icon\n try {\n const response = await window.fetch(app.value.preview);\n const blob = await response.blob();\n const rawSvg = await blob.text();\n appIcon.value = rawSvg.replaceAll(/fill=\"#(fff|ffffff)([a-z0-9]{1,2})?\"/ig, 'fill=\"currentColor\"');\n }\n catch (error) {\n appIcon.value = categoryIcon.value;\n logger.error('Could not load app icon', { error });\n }\n }\n });\n return {\n appIcon,\n };\n}\n","\n import API from \"!../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppStoreSidebar.vue?vue&type=style&index=0&id=2f300fa2&prod&scoped=true&lang=scss\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppStoreSidebar.vue?vue&type=style&index=0&id=2f300fa2&prod&scoped=true&lang=scss\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./AppStoreSidebar.vue?vue&type=template&id=2f300fa2&scoped=true\"\nimport script from \"./AppStoreSidebar.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./AppStoreSidebar.vue?vue&type=script&setup=true&lang=ts\"\nimport style0 from \"./AppStoreSidebar.vue?vue&type=style&index=0&id=2f300fa2&prod&scoped=true&lang=scss\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"2f300fa2\",\n null\n \n)\n\nexport default component.exports"],"names":["APPS_SECTION_ENUM","Object","freeze","discover","t","installed","enabled","disabled","updates","featured","supported","axios","get","generateOcsUrl","then","_ref","data","ocs","meta","statuscode","emit","apps","window","dispatchEvent","Event","computed","appGroups","this","app","groups","map","group","id","name","installing","$store","getters","loading","isLoading","enableButtonText","needsDownload","forceEnableButtonText","enableButtonTooltip","forceEnableButtonTooltip","base","groupCheckedAppsData","mounted","length","methods","asyncFindGroup","query","dispatch","search","limit","offset","isLimitedToGroups","setGroupLimit","appId","canLimitToGroups","types","includes","addGroupLimitation","groupArray","pop","concat","removeGroupLimitation","currentGroups","index","indexOf","splice","forceEnable","response","rebuildNavigation","catch","error","showError","enable","disable","remove","install","update","mdiStarCircleOutline","mdiAccount","mdiCheck","mdiClose","bundles","mdiArchive","mdiStarShooting","mdiStar","mdiDownload","auth","mdiKey","customization","mdiCog","dashboard","mdiViewColumn","files","mdiFolder","games","mdiControllerClassic","integration","mdiOpenInApp","monitoring","mdiMonitorEye","multimedia","mdiMultimedia","office","mdiFileDocumentEdit","organization","mdiOfficeBuilding","mdiMagnify","security","mdiSecurity","social","mdiAccountMultiple","tools","mdiTools","workflow","mdiClipboardFlow","showApiError","useAppsStore","defineStore","state","categories","updateCount","loadState","loadingList","gettingCategoriesPromise","actions","loadCategories","force","arguments","undefined","generateUrl","category","icon","APPSTORE_CATEGORY_ICONS","$patch","logger","loadApps","getCategoryById","categoryId","find","getAppById","_ref2","___CSS_LOADER_EXPORT___","push","module","filterId","filterUrl","Math","random","toString","substring","components","AppLevelBadge","AppScore","NcButton","mixins","AppManagement","SvgFilterMixin","props","type","required","String","listView","Boolean","default","useBundleView","headers","inline","isSelected","scrolled","screenshotLoaded","hasRating","appstoreData","ratingNumOverall","dataItemTag","withSidebar","$route","params","watch","releases","screenshot","image","Image","onload","src","watchers","prefix","content","getDataItemHeaders","columnName","join","options","styleTagTransform","setAttributes","insert","domAPI","insertStyleElement","locals","_vm","_c","_self","tag","staticClass","class","attrs","preview","_e","_v","appName","_s","summary","version","level","score","on","$event","stopPropagation","canUnInstall","active","canInstall","isCompatible","_defineComponent","__name","setup","__props","isSupported","isFeatured","badgeIcon","value","badgeText","badgeTitle","__sfc","NcIconSvgWrapper","_setup","_setupProxy","defineComponent","Number","mdiStarHalfFull","mdiStarOutline","title","appScore","toFixed","fullStars","floor","emptyStars","min","hasHalfStar","_l","key","Node","constructor","_defineProperty","_head","WeakMap","_tail","_size","Queue","_classPrivateFieldInitSpec","clear","enqueue","_this$size","node","_classPrivateFieldGet","next","_classPrivateFieldSet","dequeue","_this$size3","current","peek","size","Symbol","iterator","pLimit","concurrency","validateConcurrency","queue","activeCount","resumeNext","run","async","function_","resolve","arguments_","result","generator","_len","Array","_key","Promise","internalResolve","bind","defineProperties","pendingCount","clearQueue","set","newConcurrency","queueMicrotask","isInteger","POSITIVE_INFINITY","TypeError","AppItem","counter","filter","hasPendingUpdate","showUpdateAll","useListView","getAllApps","toLowerCase","sort","a","b","sortStringA","sortStringB","OC","Util","naturalSortCompare","appstore","getAppBundles","bundle","bundleApps","bundleIds","searchApps","_app","useAppStoreView","allBundlesEnabled","bundleToggleText","beforeDestroy","unsubscribe","setSearch","resetSearch","subscribe","toggleBundle","disableBundle","enableBundle","console","Notification","show","updateAll","n","parseApiResponse","element","appElement","date","Date","parse","expiryDate","Error","filterElements","now","PostType","defineAsyncComponent","CarouselType","ShowcaseType","hasError","ref","elements","shuffleArray","array","i","j","onBeforeMount","info","parsedElements","shuffledElements","order","Infinity","getComponent","render","h","mdiEyeOff","NcEmptyContent","NcLoadingIcon","scopedSlots","_u","fn","proxy","entry","_b","route","useRoute","store","currentCategory","appStoreLabel","viewLabel","displayName","watchEffect","document","instance","getCurrentInstance","shouldRefetchCategories","NcAppContent","AppList","AppStoreDiscoverSection","domProps","appstoreEnabled","developerDocsUrl","categoriesLoading","isSubscribed","NcAppNavigation","NcAppNavigationItem","NcAppNavigationSpacer","NcCounterBubble","text","minHeading","renderMarkdown","renderer","marked","Renderer","link","href","prot","decodeURIComponent","unescape","replace","e","out","heading","blockquote","quote","dompurify","trim","gfm","highlight","tables","breaks","pedantic","sanitize","smartLists","smartypants","SAFE_FOR_JQUERY","ALLOWED_TAGS","mdiTextShort","NcAppSidebarTab","Markdown","description","NcDateTime","NcSelect","mdiBug","mdiFeatureSearch","mdiTextBox","mdiTooltipQuestion","lastModified","at","appAuthors","warn","authorName","xmlNode","isArray","author","split","localeCompare","appstoreUrl","externalResources","resources","internal","label","website","documentation","user","admin","developer","appCategories","flat","rateAppUrl","getGroups","directives","rawName","expression","_i","$$a","$$el","target","$$c","checked","$$v","$$i","slice","slot","missingMinOwnCloudVersion","missingMaxOwnCloudVersion","missingDependencies","dep","resource","bugs","discussion","hasChangelog","values","translations","some","changelog","createChangelogFromRelease","release","getLanguage","en","mdiClockFast","router","useRouter","rating","ratingNumRecent","ratingRecent","ratingOverall","showSidebar","appIcon","categoryIcon","path","AppstoreCategoryIcons","fetch","blob","rawSvg","replaceAll","useAppIcon","licenseText","license","licence","toUpperCase","activeTab","hasScreenshot","loadScreenshot","onMounted","hideAppDetails","NcAppSidebar","AppDescriptionTab","AppDetailsTab","AppReleasesTab"],"sourceRoot":""} \ No newline at end of file
+{"version":3,"file":"settings-apps-view-4529.js?v=80559dd00b323f234969","mappings":"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","sources":["webpack:///nextcloud/apps/settings/src/constants/AppsConstants.js","webpack:///nextcloud/apps/settings/src/service/rebuild-navigation.js","webpack:///nextcloud/apps/settings/src/mixins/AppManagement.js","webpack:///nextcloud/apps/settings/src/constants/AppstoreCategoryIcons.ts","webpack:///nextcloud/apps/settings/src/store/apps-store.ts","webpack:///nextcloud/apps/settings/src/components/AppList.vue?vue&type=style&index=0&id=5cf3c7a8&prod&lang=scss&scoped=true","webpack:///nextcloud/apps/settings/src/components/AppList/AppItem.vue?vue&type=style&index=0&id=4f1b9f2a&prod&scoped=true&lang=scss","webpack:///nextcloud/apps/settings/src/components/AppList/AppLevelBadge.vue?vue&type=style&index=0&id=5ee601b2&prod&scoped=true&lang=scss","webpack:///nextcloud/apps/settings/src/components/AppStoreDiscover/AppStoreDiscoverSection.vue?vue&type=style&index=0&id=bb597eea&prod&scoped=true&lang=scss","webpack:///nextcloud/apps/settings/src/components/AppStoreSidebar/AppDescriptionTab.vue?vue&type=style&index=0&id=cf0a1ae6&prod&scoped=true&lang=scss","webpack:///nextcloud/apps/settings/src/components/AppStoreSidebar/AppDetailsTab.vue?vue&type=style&index=0&id=533705fa&prod&scoped=true&lang=scss","webpack:///nextcloud/apps/settings/src/components/AppStoreSidebar/AppReleasesTab.vue?vue&type=style&index=0&id=9c32407e&prod&scoped=true&lang=scss","webpack:///nextcloud/apps/settings/src/components/Markdown.vue?vue&type=style&index=0&id=5d3cebad&prod&scoped=true&lang=scss","webpack:///nextcloud/apps/settings/src/views/AppStoreSidebar.vue?vue&type=style&index=0&id=2f300fa2&prod&scoped=true&lang=scss","webpack:///nextcloud/apps/settings/src/components/AppList/AppScore.vue?vue&type=style&index=0&id=2193f4e0&prod&scoped=true&lang=css","webpack:///nextcloud/apps/settings/src/views/AppStore.vue?vue&type=style&index=0&id=f9073bbe&prod&scoped=true&lang=css","webpack:///nextcloud/apps/settings/src/views/AppStoreNavigation.vue?vue&type=style&index=0&id=26201909&prod&scoped=true&lang=css","webpack://nextcloud/./apps/settings/src/components/AppList/AppItem.vue?af1e","webpack:///nextcloud/apps/settings/src/components/SvgFilterMixin.vue","webpack:///nextcloud/apps/settings/src/components/SvgFilterMixin.vue?vue&type=script&lang=js","webpack://nextcloud/./apps/settings/src/components/SvgFilterMixin.vue?5bcd","webpack:///nextcloud/apps/settings/src/components/AppList/AppItem.vue","webpack:///nextcloud/apps/settings/src/components/AppList/AppItem.vue?vue&type=script&lang=js","webpack://nextcloud/./apps/settings/src/components/AppList/AppItem.vue?d389","webpack://nextcloud/./apps/settings/src/components/AppList/AppItem.vue?a9a1","webpack:///nextcloud/apps/settings/src/components/AppList/AppLevelBadge.vue","webpack:///nextcloud/apps/settings/src/components/AppList/AppLevelBadge.vue?vue&type=script&setup=true&lang=ts","webpack://nextcloud/./apps/settings/src/components/AppList/AppLevelBadge.vue?8473","webpack://nextcloud/./apps/settings/src/components/AppList/AppLevelBadge.vue?74e8","webpack:///nextcloud/apps/settings/src/components/AppList/AppScore.vue","webpack:///nextcloud/apps/settings/src/components/AppList/AppScore.vue?vue&type=script&lang=ts","webpack://nextcloud/./apps/settings/src/components/AppList/AppScore.vue?fc42","webpack://nextcloud/./apps/settings/src/components/AppList/AppScore.vue?26fd","webpack:///nextcloud/apps/settings/src/views/AppStore.vue","webpack:///nextcloud/node_modules/yocto-queue/index.js","webpack:///nextcloud/node_modules/p-limit/index.js","webpack:///nextcloud/apps/settings/src/components/AppList.vue","webpack:///nextcloud/apps/settings/src/components/AppList.vue?vue&type=script&lang=js","webpack://nextcloud/./apps/settings/src/components/AppList.vue?9198","webpack://nextcloud/./apps/settings/src/components/AppList.vue?8acf","webpack://nextcloud/./apps/settings/src/components/AppList.vue?ee21","webpack:///nextcloud/apps/settings/src/components/AppStoreDiscover/AppStoreDiscoverSection.vue","webpack:///nextcloud/apps/settings/src/utils/appDiscoverParser.ts","webpack:///nextcloud/apps/settings/src/components/AppStoreDiscover/AppStoreDiscoverSection.vue?vue&type=script&setup=true&lang=ts","webpack://nextcloud/./apps/settings/src/components/AppStoreDiscover/AppStoreDiscoverSection.vue?9ef0","webpack://nextcloud/./apps/settings/src/components/AppStoreDiscover/AppStoreDiscoverSection.vue?0759","webpack:///nextcloud/apps/settings/src/views/AppStore.vue?vue&type=script&setup=true&lang=ts","webpack://nextcloud/./apps/settings/src/views/AppStore.vue?a414","webpack://nextcloud/./apps/settings/src/views/AppStore.vue?47b2","webpack:///nextcloud/apps/settings/src/views/AppStoreNavigation.vue","webpack:///nextcloud/apps/settings/src/views/AppStoreNavigation.vue?vue&type=script&setup=true&lang=ts","webpack://nextcloud/./apps/settings/src/views/AppStoreNavigation.vue?c5d2","webpack://nextcloud/./apps/settings/src/views/AppStoreNavigation.vue?6e6f","webpack:///nextcloud/apps/settings/src/views/AppStoreSidebar.vue","webpack:///nextcloud/apps/settings/src/components/Markdown.vue","webpack:///nextcloud/apps/settings/src/components/Markdown.vue?vue&type=script&lang=js","webpack://nextcloud/./apps/settings/src/components/Markdown.vue?3dcc","webpack://nextcloud/./apps/settings/src/components/Markdown.vue?26cf","webpack://nextcloud/./apps/settings/src/components/Markdown.vue?d299","webpack:///nextcloud/apps/settings/src/components/AppStoreSidebar/AppDescriptionTab.vue?vue&type=script&setup=true&lang=ts","webpack:///nextcloud/apps/settings/src/components/AppStoreSidebar/AppDescriptionTab.vue","webpack://nextcloud/./apps/settings/src/components/AppStoreSidebar/AppDescriptionTab.vue?cd04","webpack://nextcloud/./apps/settings/src/components/AppStoreSidebar/AppDescriptionTab.vue?311d","webpack://nextcloud/./apps/settings/src/components/AppStoreSidebar/AppDetailsTab.vue?9ed4","webpack:///nextcloud/apps/settings/src/components/AppStoreSidebar/AppDetailsTab.vue","webpack:///nextcloud/apps/settings/src/components/AppStoreSidebar/AppDetailsTab.vue?vue&type=script&lang=js","webpack://nextcloud/./apps/settings/src/components/AppStoreSidebar/AppDetailsTab.vue?98a6","webpack://nextcloud/./apps/settings/src/components/AppStoreSidebar/AppDetailsTab.vue?d4df","webpack:///nextcloud/apps/settings/src/components/AppStoreSidebar/AppReleasesTab.vue?vue&type=script&setup=true&lang=ts","webpack:///nextcloud/apps/settings/src/components/AppStoreSidebar/AppReleasesTab.vue","webpack://nextcloud/./apps/settings/src/components/AppStoreSidebar/AppReleasesTab.vue?88c0","webpack://nextcloud/./apps/settings/src/components/AppStoreSidebar/AppReleasesTab.vue?d492","webpack:///nextcloud/apps/settings/src/views/AppStoreSidebar.vue?vue&type=script&setup=true&lang=ts","webpack:///nextcloud/apps/settings/src/composables/useAppIcon.ts","webpack://nextcloud/./apps/settings/src/views/AppStoreSidebar.vue?264a","webpack://nextcloud/./apps/settings/src/views/AppStoreSidebar.vue?5373"],"sourcesContent":["/**\n * SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport { translate as t } from '@nextcloud/l10n'\n\n/** Enum of verification constants, according to Apps */\nexport const APPS_SECTION_ENUM = Object.freeze({\n\tdiscover: t('settings', 'Discover'),\n\tinstalled: t('settings', 'Your apps'),\n\tenabled: t('settings', 'Active apps'),\n\tdisabled: t('settings', 'Disabled apps'),\n\tupdates: t('settings', 'Updates'),\n\t'app-bundles': t('settings', 'App bundles'),\n\tfeatured: t('settings', 'Featured apps'),\n\tsupported: t('settings', 'Supported apps'), // From subscription\n})\n","/**\n * SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\nimport axios from '@nextcloud/axios'\nimport { generateOcsUrl } from '@nextcloud/router'\nimport { emit } from '@nextcloud/event-bus'\n\nexport default () => {\n\treturn axios.get(generateOcsUrl('core/navigation', 2) + '/apps?format=json')\n\t\t.then(({ data }) => {\n\t\t\tif (data.ocs.meta.statuscode !== 200) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\temit('nextcloud:app-menu.refresh', { apps: data.ocs.data })\n\t\t\twindow.dispatchEvent(new Event('resize'))\n\t\t})\n}\n","/**\n * SPDX-FileCopyrightText: 2019 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport { showError } from '@nextcloud/dialogs'\nimport rebuildNavigation from '../service/rebuild-navigation.js'\n\nexport default {\n\tcomputed: {\n\t\tappGroups() {\n\t\t\treturn this.app.groups.map(group => { return { id: group, name: group } })\n\t\t},\n\t\tinstalling() {\n\t\t\treturn this.$store.getters.loading('install')\n\t\t},\n\t\tisLoading() {\n\t\t\treturn this.app && this.$store.getters.loading(this.app.id)\n\t\t},\n\t\tenableButtonText() {\n\t\t\tif (this.app.needsDownload) {\n\t\t\t\treturn t('settings', 'Download and enable')\n\t\t\t}\n\t\t\treturn t('settings', 'Enable')\n\t\t},\n\t\tforceEnableButtonText() {\n\t\t\tif (this.app.needsDownload) {\n\t\t\t\treturn t('settings', 'Allow untested app')\n\t\t\t}\n\t\t\treturn t('settings', 'Allow untested app')\n\t\t},\n\t\tenableButtonTooltip() {\n\t\t\tif (this.app.needsDownload) {\n\t\t\t\treturn t('settings', 'The app will be downloaded from the App Store')\n\t\t\t}\n\t\t\treturn null\n\t\t},\n\t\tforceEnableButtonTooltip() {\n\t\t\tconst base = t('settings', '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.')\n\t\t\tif (this.app.needsDownload) {\n\t\t\t\treturn base + ' ' + t('settings', 'The app will be downloaded from the App Store')\n\t\t\t}\n\t\t\treturn base\n\t\t},\n\t},\n\n\tdata() {\n\t\treturn {\n\t\t\tgroupCheckedAppsData: false,\n\t\t}\n\t},\n\n\tmounted() {\n\t\tif (this.app && this.app.groups && this.app.groups.length > 0) {\n\t\t\tthis.groupCheckedAppsData = true\n\t\t}\n\t},\n\n\tmethods: {\n\t\tasyncFindGroup(query) {\n\t\t\treturn this.$store.dispatch('getGroups', { search: query, limit: 5, offset: 0 })\n\t\t},\n\t\tisLimitedToGroups(app) {\n\t\t\tif (this.app.groups.length || this.groupCheckedAppsData) {\n\t\t\t\treturn true\n\t\t\t}\n\t\t\treturn false\n\t\t},\n\t\tsetGroupLimit() {\n\t\t\tif (!this.groupCheckedAppsData) {\n\t\t\t\tthis.$store.dispatch('enableApp', { appId: this.app.id, groups: [] })\n\t\t\t}\n\t\t},\n\t\tcanLimitToGroups(app) {\n\t\t\tif ((app.types && app.types.includes('filesystem'))\n\t\t\t\t\t|| app.types.includes('prelogin')\n\t\t\t\t\t|| app.types.includes('authentication')\n\t\t\t\t\t|| app.types.includes('logging')\n\t\t\t\t\t|| app.types.includes('prevent_group_restriction')) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\treturn true\n\t\t},\n\t\taddGroupLimitation(groupArray) {\n\t\t\tconst group = groupArray.pop()\n\t\t\tconst groups = this.app.groups.concat([]).concat([group.id])\n\t\t\tthis.$store.dispatch('enableApp', { appId: this.app.id, groups })\n\t\t},\n\t\tremoveGroupLimitation(group) {\n\t\t\tconst currentGroups = this.app.groups.concat([])\n\t\t\tconst index = currentGroups.indexOf(group.id)\n\t\t\tif (index > -1) {\n\t\t\t\tcurrentGroups.splice(index, 1)\n\t\t\t}\n\t\t\tthis.$store.dispatch('enableApp', { appId: this.app.id, groups: currentGroups })\n\t\t},\n\t\tforceEnable(appId) {\n\t\t\tthis.$store.dispatch('forceEnableApp', { appId, groups: [] })\n\t\t\t\t.then((response) => { rebuildNavigation() })\n\t\t\t\t.catch((error) => { showError(error) })\n\t\t},\n\t\tenable(appId) {\n\t\t\tthis.$store.dispatch('enableApp', { appId, groups: [] })\n\t\t\t\t.then((response) => { rebuildNavigation() })\n\t\t\t\t.catch((error) => { showError(error) })\n\t\t},\n\t\tdisable(appId) {\n\t\t\tthis.$store.dispatch('disableApp', { appId })\n\t\t\t\t.then((response) => { rebuildNavigation() })\n\t\t\t\t.catch((error) => { showError(error) })\n\t\t},\n\t\tremove(appId) {\n\t\t\tthis.$store.dispatch('uninstallApp', { appId })\n\t\t\t\t.then((response) => { rebuildNavigation() })\n\t\t\t\t.catch((error) => { showError(error) })\n\t\t},\n\t\tinstall(appId) {\n\t\t\tthis.$store.dispatch('enableApp', { appId })\n\t\t\t\t.then((response) => { rebuildNavigation() })\n\t\t\t\t.catch((error) => { showError(error) })\n\t\t},\n\t\tupdate(appId) {\n\t\t\tthis.$store.dispatch('updateApp', { appId })\n\t\t\t\t.then((response) => { rebuildNavigation() })\n\t\t\t\t.catch((error) => { showError(error) })\n\t\t},\n\t},\n}\n","/**\n * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\nimport { mdiAccount, mdiAccountMultiple, mdiArchive, mdiCheck, mdiClipboardFlow, mdiClose, mdiCog, mdiControllerClassic, mdiDownload, mdiFileDocumentEdit, mdiFolder, mdiKey, mdiMagnify, mdiMonitorEye, mdiMultimedia, mdiOfficeBuilding, mdiOpenInApp, mdiSecurity, mdiStar, mdiStarCircleOutline, mdiStarShooting, mdiTools, mdiViewColumn, } from '@mdi/js';\n/**\n * SVG paths used for appstore category icons\n */\nexport default Object.freeze({\n // system special categories\n discover: mdiStarCircleOutline,\n installed: mdiAccount,\n enabled: mdiCheck,\n disabled: mdiClose,\n bundles: mdiArchive,\n supported: mdiStarShooting,\n featured: mdiStar,\n updates: mdiDownload,\n // generic categories\n auth: mdiKey,\n customization: mdiCog,\n dashboard: mdiViewColumn,\n files: mdiFolder,\n games: mdiControllerClassic,\n integration: mdiOpenInApp,\n monitoring: mdiMonitorEye,\n multimedia: mdiMultimedia,\n office: mdiFileDocumentEdit,\n organization: mdiOfficeBuilding,\n search: mdiMagnify,\n security: mdiSecurity,\n social: mdiAccountMultiple,\n tools: mdiTools,\n workflow: mdiClipboardFlow,\n});\n","/**\n * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\nimport { showError } from '@nextcloud/dialogs';\nimport { loadState } from '@nextcloud/initial-state';\nimport { translate as t } from '@nextcloud/l10n';\nimport { generateUrl } from '@nextcloud/router';\nimport { defineStore } from 'pinia';\nimport axios from '@nextcloud/axios';\nimport logger from '../logger';\nimport APPSTORE_CATEGORY_ICONS from '../constants/AppstoreCategoryIcons.ts';\nconst showApiError = () => showError(t('settings', 'An error occurred during the request. Unable to proceed.'));\nexport const useAppsStore = defineStore('settings-apps', {\n state: () => ({\n apps: [],\n categories: [],\n updateCount: loadState('settings', 'appstoreUpdateCount', 0),\n loading: {\n apps: false,\n categories: false,\n },\n loadingList: false,\n gettingCategoriesPromise: null,\n }),\n actions: {\n async loadCategories(force = false) {\n if (this.categories.length > 0 && !force) {\n return;\n }\n try {\n this.loading.categories = true;\n const { data: categories } = await axios.get(generateUrl('settings/apps/categories'));\n for (const category of categories) {\n category.icon = APPSTORE_CATEGORY_ICONS[category.id] ?? '';\n }\n this.$patch({\n categories,\n });\n }\n catch (error) {\n logger.error(error);\n showApiError();\n }\n finally {\n this.loading.categories = false;\n }\n },\n async loadApps(force = false) {\n if (this.apps.length > 0 && !force) {\n return;\n }\n try {\n this.loading.apps = true;\n const { data } = await axios.get(generateUrl('settings/apps/list'));\n this.$patch({\n apps: data.apps,\n });\n }\n catch (error) {\n logger.error(error);\n showApiError();\n }\n finally {\n this.loading.apps = false;\n }\n },\n getCategoryById(categoryId) {\n return this.categories.find(({ id }) => id === categoryId) ?? null;\n },\n getAppById(appId) {\n return this.apps.find(({ id }) => id === appId) ?? null;\n },\n },\n});\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `.apps-list[data-v-5cf3c7a8]{display:flex;flex-wrap:wrap;align-content:flex-start}.apps-list--move[data-v-5cf3c7a8]{transition:transform 1s}.apps-list #app-list-update-all[data-v-5cf3c7a8]{margin-inline-start:10px}.apps-list__toolbar[data-v-5cf3c7a8]{height:60px;padding:8px;padding-inline-start:60px;width:100%;background-color:var(--color-main-background);position:sticky;top:0;z-index:1;display:flex;align-items:center}.apps-list--list-view[data-v-5cf3c7a8]{margin-bottom:100px;position:relative}.apps-list__list-container[data-v-5cf3c7a8]{width:100%}.apps-list__store-container[data-v-5cf3c7a8]{display:flex;flex-wrap:wrap}.apps-list__bundle-heading[data-v-5cf3c7a8]{display:flex;align-items:center;margin-block:20px;margin-inline:0 10px}.apps-list__bundle-header[data-v-5cf3c7a8]{margin-block:0;margin-inline:50px 10px;font-weight:bold;font-size:20px;line-height:30px;color:var(--color-text-light)}#apps-list-search .app-item h2[data-v-5cf3c7a8]{margin-bottom:0}`, \"\",{\"version\":3,\"sources\":[\"webpack://./apps/settings/src/components/AppList.vue\"],\"names\":[],\"mappings\":\"AAIA,4BACC,YAAA,CACA,cAAA,CACA,wBAAA,CAGA,kCACC,uBAAA,CAGD,iDACC,wBAAA,CAGD,qCACC,WAjBe,CAkBf,WAnBgB,CAqBhB,yBApBe,CAqBf,UAAA,CACA,6CAAA,CACA,eAAA,CACA,KAAA,CACA,SAAA,CACA,YAAA,CACA,kBAAA,CAGD,uCACC,mBAAA,CAEA,iBAAA,CAGD,4CACC,UAAA,CAGD,6CACC,YAAA,CACA,cAAA,CAGD,4CACC,YAAA,CACA,kBAAA,CACA,iBAAA,CACA,oBAAA,CAGD,2CACC,cAAA,CACA,uBAAA,CACA,gBAAA,CACA,cAAA,CACA,gBAAA,CACA,6BAAA,CAMA,gDACC,eAAA\",\"sourcesContent\":[\"\\n$toolbar-padding: 8px;\\n$toolbar-height: 44px + $toolbar-padding * 2;\\n\\n.apps-list {\\n\\tdisplay: flex;\\n\\tflex-wrap: wrap;\\n\\talign-content: flex-start;\\n\\n\\t// For transition group\\n\\t&--move {\\n\\t\\ttransition: transform 1s;\\n\\t}\\n\\n\\t#app-list-update-all {\\n\\t\\tmargin-inline-start: 10px;\\n\\t}\\n\\n\\t&__toolbar {\\n\\t\\theight: $toolbar-height;\\n\\t\\tpadding: $toolbar-padding;\\n\\t\\t// Leave room for app-navigation-toggle\\n\\t\\tpadding-inline-start: $toolbar-height;\\n\\t\\twidth: 100%;\\n\\t\\tbackground-color: var(--color-main-background);\\n\\t\\tposition: sticky;\\n\\t\\ttop: 0;\\n\\t\\tz-index: 1;\\n\\t\\tdisplay: flex;\\n\\t\\talign-items: center;\\n\\t}\\n\\n\\t&--list-view {\\n\\t\\tmargin-bottom: 100px;\\n\\t\\t// For positioning link overlay on rows\\n\\t\\tposition: relative;\\n\\t}\\n\\n\\t&__list-container {\\n\\t\\twidth: 100%;\\n\\t}\\n\\n\\t&__store-container {\\n\\t\\tdisplay: flex;\\n\\t\\tflex-wrap: wrap;\\n\\t}\\n\\n\\t&__bundle-heading {\\n\\t\\tdisplay: flex;\\n\\t\\talign-items: center;\\n\\t\\tmargin-block: 20px;\\n\\t\\tmargin-inline: 0 10px;\\n\\t}\\n\\n\\t&__bundle-header {\\n\\t\\tmargin-block: 0;\\n\\t\\tmargin-inline: 50px 10px;\\n\\t\\tfont-weight: bold;\\n\\t\\tfont-size: 20px;\\n\\t\\tline-height: 30px;\\n\\t\\tcolor: var(--color-text-light);\\n\\t}\\n}\\n\\n#apps-list-search {\\n\\t.app-item {\\n\\t\\th2 {\\n\\t\\t\\tmargin-bottom: 0;\\n\\t\\t}\\n\\t}\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `/*!\n * SPDX-FileCopyrightText: 2018 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */.app-item[data-v-4f1b9f2a]{position:relative}.app-item[data-v-4f1b9f2a]:hover{background-color:var(--color-background-dark)}.app-item--list-view[data-v-4f1b9f2a]{--app-item-padding: calc(var(--default-grid-baseline) * 2);--app-item-height: calc(var(--default-clickable-area) + var(--app-item-padding) * 2)}.app-item--list-view.app-item--selected[data-v-4f1b9f2a]{background-color:var(--color-background-dark)}.app-item--list-view>*[data-v-4f1b9f2a]{vertical-align:middle;border-bottom:1px solid var(--color-border);padding:var(--app-item-padding);height:var(--app-item-height)}.app-item--list-view .app-image[data-v-4f1b9f2a]{width:var(--default-clickable-area);height:auto;text-align:end}.app-item--list-view .app-image-icon svg[data-v-4f1b9f2a],.app-item--list-view .app-image-icon .icon-settings-dark[data-v-4f1b9f2a]{margin-top:5px;width:20px;height:20px;opacity:.5;background-size:cover;display:inline-block}.app-item--list-view .app-name[data-v-4f1b9f2a]{padding:0 var(--app-item-padding)}.app-item--list-view .app-name--link[data-v-4f1b9f2a]{height:var(--app-item-height);display:flex;align-items:center}.app-item--list-view .app-name--link[data-v-4f1b9f2a]::after{content:\"\";position:absolute;inset-inline:0;height:var(--app-item-height)}.app-item--list-view .app-actions[data-v-4f1b9f2a]{display:flex;gap:var(--app-item-padding);flex-wrap:wrap;justify-content:end}.app-item--list-view .app-actions .icon-loading-small[data-v-4f1b9f2a]{display:inline-block;top:4px;margin-inline-end:10px}@media only screen and (max-width: 900px){.app-item--list-view .app-version[data-v-4f1b9f2a],.app-item--list-view .app-level[data-v-4f1b9f2a]{display:none}}@media only screen and (max-width: 512px){.app-item--list-view .app-actions[data-v-4f1b9f2a]{display:none}}.app-item--store-view[data-v-4f1b9f2a]{padding:30px}.app-item--store-view .app-image-icon .icon-settings-dark[data-v-4f1b9f2a]{width:100%;height:150px;background-size:45px;opacity:.5}.app-item--store-view .app-image-icon svg[data-v-4f1b9f2a]{position:absolute;bottom:43px;width:64px;height:64px;opacity:.1}.app-item--store-view .app-name[data-v-4f1b9f2a]{margin:5px 0}.app-item--store-view .app-name--link[data-v-4f1b9f2a]::after{content:\"\";position:absolute;inset-block:0;inset-inline:0}.app-item--store-view .app-actions[data-v-4f1b9f2a]{margin:10px 0}@media only screen and (min-width: 1601px){.app-item--store-view[data-v-4f1b9f2a]{width:25%}.app-item--store-view.app-item--with-sidebar[data-v-4f1b9f2a]{width:33%}}@media only screen and (max-width: 1600px){.app-item--store-view[data-v-4f1b9f2a]{width:25%}.app-item--store-view.app-item--with-sidebar[data-v-4f1b9f2a]{width:33%}}@media only screen and (max-width: 1400px){.app-item--store-view[data-v-4f1b9f2a]{width:33%}.app-item--store-view.app-item--with-sidebar[data-v-4f1b9f2a]{width:50%}}@media only screen and (max-width: 900px){.app-item--store-view[data-v-4f1b9f2a]{width:50%}.app-item--store-view.app-item--with-sidebar[data-v-4f1b9f2a]{width:100%}}@media only screen and (max-width: 1024px){.app-item--store-view[data-v-4f1b9f2a]{width:50%}}@media only screen and (max-width: 480px){.app-item--store-view[data-v-4f1b9f2a]{width:100%}}.app-icon[data-v-4f1b9f2a]{filter:var(--background-invert-if-bright)}.app-image[data-v-4f1b9f2a]{position:relative;height:150px;opacity:1;overflow:hidden}.app-image img[data-v-4f1b9f2a]{width:100%}.app-version[data-v-4f1b9f2a]{color:var(--color-text-maxcontrast)}`, \"\",{\"version\":3,\"sources\":[\"webpack://./core/css/variables.scss\",\"webpack://./apps/settings/src/components/AppList/AppItem.vue\"],\"names\":[],\"mappings\":\"AAAA;;;EAAA,CCIA,2BACC,iBAAA,CAEA,iCACC,6CAAA,CAGD,sCACC,0DAAA,CACA,oFAAA,CAEA,yDACC,6CAAA,CAGD,wCACC,qBAAA,CACA,2CAAA,CACA,+BAAA,CACA,6BAAA,CAGD,iDACC,mCAAA,CACA,WAAA,CACA,cAAA,CAGD,oIAEC,cAAA,CACA,UAAA,CACA,WAAA,CACA,UAAA,CACA,qBAAA,CACA,oBAAA,CAGD,gDACC,iCAAA,CAGD,sDACC,6BAAA,CACA,YAAA,CACA,kBAAA,CAMD,6DACC,UAAA,CACA,iBAAA,CACA,cAAA,CACA,6BAAA,CAGD,mDACC,YAAA,CACA,2BAAA,CACA,cAAA,CACA,mBAAA,CAEA,uEACC,oBAAA,CACA,OAAA,CACA,sBAAA,CAKF,0CACC,oGAEC,YAAA,CAAA,CAKF,0CACC,mDACC,YAAA,CAAA,CAKH,uCACC,YAAA,CAEA,2EACC,UAAA,CACA,YAAA,CACA,oBAAA,CACA,UAAA,CAGD,2DACC,iBAAA,CACA,WAAA,CAEA,UAAA,CACA,WAAA,CACA,UAAA,CAGD,iDACC,YAAA,CAGD,8DACC,UAAA,CACA,iBAAA,CACA,aAAA,CACA,cAAA,CAGD,oDACC,aAAA,CAGD,2CAlCD,uCAmCE,SAAA,CAEA,8DACC,SAAA,CAAA,CAIF,2CA1CD,uCA2CE,SAAA,CAEA,8DACC,SAAA,CAAA,CAIF,2CAlDD,uCAmDE,SAAA,CAEA,8DACC,SAAA,CAAA,CAIF,0CA1DD,uCA2DE,SAAA,CAEA,8DACC,UAAA,CAAA,CAIF,2CAlED,uCAmEE,SAAA,CAAA,CAGD,0CAtED,uCAuEE,UAAA,CAAA,CAKH,2BACC,yCAAA,CAGD,4BACC,iBAAA,CACA,YAAA,CACA,SAAA,CACA,eAAA,CAEA,gCACC,UAAA,CAIF,8BACC,mCAAA\",\"sourcesContent\":[\"/*!\\n * SPDX-FileCopyrightText: 2018 Nextcloud GmbH and Nextcloud contributors\\n * SPDX-License-Identifier: AGPL-3.0-or-later\\n */\\n// SCSS darken/lighten function override\\n@function nc-darken($color, $value) {\\n\\t@return darken($color, $value);\\n}\\n\\n@function nc-lighten($color, $value) {\\n\\t@return lighten($color, $value);\\n}\\n\\n// SCSS variables\\n// DEPRECATED, please use CSS4 vars\\n$color-main-text: #222 !default; // Not #000 for better readability\\n$color-main-background: #fff !default;\\n$color-main-background-translucent: rgba($color-main-background, .97) !default;\\n\\n// used for different active/hover/focus/disabled states\\n$color-background-hover: nc-darken($color-main-background, 4%) !default;\\n$color-background-dark: nc-darken($color-main-background, 7%) !default;\\n$color-background-darker: nc-darken($color-main-background, 14%) !default;\\n\\n$color-placeholder-light: nc-darken($color-main-background, 10%) !default;\\n$color-placeholder-dark: nc-darken($color-main-background, 20%) !default;\\n\\n$color-primary: #0082c9 !default;\\n$color-primary-hover: mix($color-primary, $color-main-background, 80%) !default;\\n\\n$color-primary-light: mix($color-primary, $color-main-background, 10%) !default;\\n$color-primary-light-text: $color-primary !default;\\n$color-primary-light-hover: mix($color-primary-light, $color-main-text, 95%) !default;\\n\\n$color-primary-text: #ffffff !default;\\n// do not use nc-darken/lighten in case of overriding because\\n// primary-text is independent of color-main-text\\n$color-primary-element-text-dark: darken($color-primary-text, 7%) !default;\\n$color-primary-element: $color-primary !default;\\n$color-primary-element-hover: mix($color-primary-element, $color-main-background, 80%) !default;\\n$color-primary-element-light: lighten($color-primary-element, 15%) !default;\\n\\n$color-error: #e9322d;\\n$color-error-hover: mix($color-error, $color-main-background, 80%) !default;\\n$color-warning: #eca700;\\n$color-warning-hover: mix($color-warning, $color-main-background, 80%) !default;\\n$color-success: #46ba61;\\n$color-success-hover: mix($color-success, $color-main-background, 80%) !default;\\n// used for svg\\n$color-white: #fff;\\n$color-black: #000;\\n$color-yellow: #FC0;\\n\\n// rgb(118, 118, 118) / #767676\\n// min. color contrast for normal text on white background according to WCAG AA\\n// (Works as well: color: #000; opacity: 0.57;)\\n$color-text-maxcontrast: nc-lighten($color-main-text, 33%) !default;\\n$color-text-light: $color-main-text !default;\\n$color-text-lighter: $color-text-maxcontrast !default;\\n\\n$image-logo: url('../img/logo/logo.svg?v=1') !default;\\n$image-login-background: url('../img/background.png?v=2') !default;\\n$image-logoheader: url('../img/logo/logo.svg?v=1') !default;\\n$image-favicon: url('../img/logo/logo.svg?v=1') !default;\\n\\n$color-loading-light: #ccc !default;\\n$color-loading-dark: #444 !default;\\n\\n$color-box-shadow: transparentize(nc-darken($color-main-background, 70%), 0.5) !default;\\n\\n// light border like file table or app-content list\\n$color-border: nc-darken($color-main-background, 7%) !default;\\n// darker border like inputs or very visible elements\\n$color-border-dark: nc-darken($color-main-background, 14%) !default;\\n\\n$border-radius: 3px !default;\\n$border-radius-large: 10px !default;\\n// Pill-style button, value is large so big buttons also have correct roundness\\n$border-radius-pill: 100px !default;\\n\\n$font-face: system-ui, -apple-system, \\\"Segoe UI\\\", Roboto, Oxygen-Sans, Cantarell, Ubuntu, \\\"Helvetica Neue\\\", \\\"Noto Sans\\\", \\\"Liberation Sans\\\", Arial, sans-serif, \\\"Apple Color Emoji\\\", \\\"Segoe UI Emoji\\\", \\\"Segoe UI Symbol\\\", \\\"Noto Color Emoji\\\" !default;\\n$default-font-size: 15px;\\n\\n$default-line-height: 24px;\\n\\n$animation-quick: 100ms;\\n$animation-slow: 300ms;\\n\\n// various structure data\\n$header-height: 50px;\\n$navigation-width: 300px;\\n$sidebar-min-width: 300px;\\n$sidebar-max-width: 500px;\\n$list-min-width: 200px;\\n$list-max-width: 300px;\\n$header-menu-item-height: 44px;\\n$header-menu-profile-item-height: 66px;\\n\\n// mobile. Keep in sync with core/js/js.js\\n$breakpoint-mobile: 1024px;\\n\",\"\\n@use '../../../../../core/css/variables.scss' as variables;\\n@use 'sass:math';\\n\\n.app-item {\\n\\tposition: relative;\\n\\n\\t&:hover {\\n\\t\\tbackground-color: var(--color-background-dark);\\n\\t}\\n\\n\\t&--list-view {\\n\\t\\t--app-item-padding: calc(var(--default-grid-baseline) * 2);\\n\\t\\t--app-item-height: calc(var(--default-clickable-area) + var(--app-item-padding) * 2);\\n\\n\\t\\t&.app-item--selected {\\n\\t\\t\\tbackground-color: var(--color-background-dark);\\n\\t\\t}\\n\\n\\t\\t> * {\\n\\t\\t\\tvertical-align: middle;\\n\\t\\t\\tborder-bottom: 1px solid var(--color-border);\\n\\t\\t\\tpadding: var(--app-item-padding);\\n\\t\\t\\theight: var(--app-item-height);\\n\\t\\t}\\n\\n\\t\\t.app-image {\\n\\t\\t\\twidth: var(--default-clickable-area);\\n\\t\\t\\theight: auto;\\n\\t\\t\\ttext-align: end;\\n\\t\\t}\\n\\n\\t\\t.app-image-icon svg,\\n\\t\\t.app-image-icon .icon-settings-dark {\\n\\t\\t\\tmargin-top: 5px;\\n\\t\\t\\twidth: 20px;\\n\\t\\t\\theight: 20px;\\n\\t\\t\\topacity: .5;\\n\\t\\t\\tbackground-size: cover;\\n\\t\\t\\tdisplay: inline-block;\\n\\t\\t}\\n\\n\\t\\t.app-name {\\n\\t\\t\\tpadding: 0 var(--app-item-padding);\\n\\t\\t}\\n\\n\\t\\t.app-name--link {\\n\\t\\t\\theight: var(--app-item-height);\\n\\t\\t\\tdisplay: flex;\\n\\t\\t\\talign-items: center;\\n\\t\\t}\\n\\n\\t\\t// Note: because of Safari bug, we cannot position link overlay relative to the table row\\n\\t\\t// So we need to manually position it relative to the table container and cell\\n\\t\\t// See: https://bugs.webkit.org/show_bug.cgi?id=240961\\n\\t\\t.app-name--link::after {\\n\\t\\t\\tcontent: '';\\n\\t\\t\\tposition: absolute;\\n\\t\\t\\tinset-inline: 0;\\n\\t\\t\\theight: var(--app-item-height);\\n\\t\\t}\\n\\n\\t\\t.app-actions {\\n\\t\\t\\tdisplay: flex;\\n\\t\\t\\tgap: var(--app-item-padding);\\n\\t\\t\\tflex-wrap: wrap;\\n\\t\\t\\tjustify-content: end;\\n\\n\\t\\t\\t.icon-loading-small {\\n\\t\\t\\t\\tdisplay: inline-block;\\n\\t\\t\\t\\ttop: 4px;\\n\\t\\t\\t\\tmargin-inline-end: 10px;\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t/* hide app version and level on narrower screens */\\n\\t\\t@media only screen and (max-width: 900px) {\\n\\t\\t\\t.app-version,\\n\\t\\t\\t.app-level {\\n\\t\\t\\t\\tdisplay: none;\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t/* Hide actions on a small screen. Click on app opens fill-screen sidebar with the buttons */\\n\\t\\t@media only screen and (max-width: math.div(variables.$breakpoint-mobile, 2)) {\\n\\t\\t\\t.app-actions {\\n\\t\\t\\t\\tdisplay: none;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\t&--store-view {\\n\\t\\tpadding: 30px;\\n\\n\\t\\t.app-image-icon .icon-settings-dark {\\n\\t\\t\\twidth: 100%;\\n\\t\\t\\theight: 150px;\\n\\t\\t\\tbackground-size: 45px;\\n\\t\\t\\topacity: 0.5;\\n\\t\\t}\\n\\n\\t\\t.app-image-icon svg {\\n\\t\\t\\tposition: absolute;\\n\\t\\t\\tbottom: 43px;\\n\\t\\t\\t/* position halfway vertically */\\n\\t\\t\\twidth: 64px;\\n\\t\\t\\theight: 64px;\\n\\t\\t\\topacity: .1;\\n\\t\\t}\\n\\n\\t\\t.app-name {\\n\\t\\t\\tmargin: 5px 0;\\n\\t\\t}\\n\\n\\t\\t.app-name--link::after {\\n\\t\\t\\tcontent: '';\\n\\t\\t\\tposition: absolute;\\n\\t\\t\\tinset-block: 0;\\n\\t\\t\\tinset-inline: 0;\\n\\t\\t}\\n\\n\\t\\t.app-actions {\\n\\t\\t\\tmargin: 10px 0;\\n\\t\\t}\\n\\n\\t\\t@media only screen and (min-width: 1601px) {\\n\\t\\t\\twidth: 25%;\\n\\n\\t\\t\\t&.app-item--with-sidebar {\\n\\t\\t\\t\\twidth: 33%;\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t@media only screen and (max-width: 1600px) {\\n\\t\\t\\twidth: 25%;\\n\\n\\t\\t\\t&.app-item--with-sidebar {\\n\\t\\t\\t\\twidth: 33%;\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t@media only screen and (max-width: 1400px) {\\n\\t\\t\\twidth: 33%;\\n\\n\\t\\t\\t&.app-item--with-sidebar {\\n\\t\\t\\t\\twidth: 50%;\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t@media only screen and (max-width: 900px) {\\n\\t\\t\\twidth: 50%;\\n\\n\\t\\t\\t&.app-item--with-sidebar {\\n\\t\\t\\t\\twidth: 100%;\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t@media only screen and (max-width: variables.$breakpoint-mobile) {\\n\\t\\t\\twidth: 50%;\\n\\t\\t}\\n\\n\\t\\t@media only screen and (max-width: 480px) {\\n\\t\\t\\twidth: 100%;\\n\\t\\t}\\n\\t}\\n}\\n\\n.app-icon {\\n\\tfilter: var(--background-invert-if-bright);\\n}\\n\\n.app-image {\\n\\tposition: relative;\\n\\theight: 150px;\\n\\topacity: 1;\\n\\toverflow: hidden;\\n\\n\\timg {\\n\\t\\twidth: 100%;\\n\\t}\\n}\\n\\n.app-version {\\n\\tcolor: var(--color-text-maxcontrast);\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `.app-level-badge[data-v-5ee601b2]{color:var(--color-text-maxcontrast);background-color:rgba(0,0,0,0);border:1px solid var(--color-text-maxcontrast);border-radius:var(--border-radius);display:flex;flex-direction:row;gap:6px;padding:3px 6px;width:fit-content}.app-level-badge--supported[data-v-5ee601b2]{border-color:var(--color-success);color:var(--color-success)}`, \"\",{\"version\":3,\"sources\":[\"webpack://./apps/settings/src/components/AppList/AppLevelBadge.vue\"],\"names\":[],\"mappings\":\"AACA,kCACC,mCAAA,CACA,8BAAA,CACA,8CAAA,CACA,kCAAA,CAEA,YAAA,CACA,kBAAA,CACA,OAAA,CACA,eAAA,CACA,iBAAA,CAEA,6CACC,iCAAA,CACA,0BAAA\",\"sourcesContent\":[\"\\n.app-level-badge {\\n\\tcolor: var(--color-text-maxcontrast);\\n\\tbackground-color: transparent;\\n\\tborder: 1px solid var(--color-text-maxcontrast);\\n\\tborder-radius: var(--border-radius);\\n\\n\\tdisplay: flex;\\n\\tflex-direction: row;\\n\\tgap: 6px;\\n\\tpadding: 3px 6px;\\n\\twidth: fit-content;\\n\\n\\t&--supported {\\n\\t\\tborder-color: var(--color-success);\\n\\t\\tcolor: var(--color-success);\\n\\t}\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `.app-discover[data-v-bb597eea]{max-width:1008px;margin-inline:auto;padding-inline:54px;padding-block-end:var(--default-clickable-area, 44px);display:flex;flex-direction:column;gap:var(--default-clickable-area, 44px)}`, \"\",{\"version\":3,\"sources\":[\"webpack://./apps/settings/src/components/AppStoreDiscover/AppStoreDiscoverSection.vue\"],\"names\":[],\"mappings\":\"AACA,+BACC,gBAAA,CACA,kBAAA,CACA,mBAAA,CAEA,qDAAA,CAEA,YAAA,CACA,qBAAA,CACA,uCAAA\",\"sourcesContent\":[\"\\n.app-discover {\\n\\tmax-width: 1008px; /* 900px + 2x 54px padding for the carousel controls */\\n\\tmargin-inline: auto;\\n\\tpadding-inline: 54px;\\n\\t/* Padding required to make last element not bound to the bottom */\\n\\tpadding-block-end: var(--default-clickable-area, 44px);\\n\\n\\tdisplay: flex;\\n\\tflex-direction: column;\\n\\tgap: var(--default-clickable-area, 44px);\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `.app-description[data-v-cf0a1ae6]{padding:12px}`, \"\",{\"version\":3,\"sources\":[\"webpack://./apps/settings/src/components/AppStoreSidebar/AppDescriptionTab.vue\"],\"names\":[],\"mappings\":\"AACA,kCACC,YAAA\",\"sourcesContent\":[\"\\n.app-description {\\n\\tpadding: 12px;\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `.app-details[data-v-533705fa]{padding:20px}.app-details__actions-manage[data-v-533705fa]{display:flex}.app-details__actions-manage input[data-v-533705fa]{flex:0 1 auto;min-width:0;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.app-details__authors[data-v-533705fa]{color:var(--color-text-maxcontrast)}.app-details__section[data-v-533705fa]{margin-top:15px}.app-details__section h4[data-v-533705fa]{font-size:16px;font-weight:bold;margin-block-end:5px}.app-details__interact[data-v-533705fa]{display:flex;flex-direction:row;flex-wrap:wrap;gap:12px}.app-details__documentation a[data-v-533705fa]{text-decoration:underline}.app-details__documentation li[data-v-533705fa]{padding-inline-start:20px}.app-details__documentation li[data-v-533705fa]::before{width:5px;height:5px;border-radius:100%;background-color:var(--color-main-text);content:\"\";float:inline-start;margin-inline-start:-13px;position:relative;top:10px}.force[data-v-533705fa]{color:var(--color-error);border-color:var(--color-error);background:var(--color-main-background)}.force[data-v-533705fa]:hover,.force[data-v-533705fa]:active{color:var(--color-main-background);border-color:var(--color-error) !important;background:var(--color-error)}.missing-dependencies[data-v-533705fa]{list-style:initial;list-style-type:initial;list-style-position:inside}`, \"\",{\"version\":3,\"sources\":[\"webpack://./apps/settings/src/components/AppStoreSidebar/AppDetailsTab.vue\"],\"names\":[],\"mappings\":\"AACA,8BACC,YAAA,CAIC,8CAEC,YAAA,CACA,oDACC,aAAA,CACA,WAAA,CACA,sBAAA,CACA,kBAAA,CACA,eAAA,CAIH,uCACC,mCAAA,CAGD,uCACC,eAAA,CAEA,0CACC,cAAA,CACA,gBAAA,CACA,oBAAA,CAIF,wCACC,YAAA,CACA,kBAAA,CACA,cAAA,CACA,QAAA,CAIA,+CACC,yBAAA,CAED,gDACC,yBAAA,CAEA,wDACC,SAAA,CACA,UAAA,CACA,kBAAA,CACA,uCAAA,CACA,UAAA,CACA,kBAAA,CACA,yBAAA,CACA,iBAAA,CACA,QAAA,CAMJ,wBACC,wBAAA,CACA,+BAAA,CACA,uCAAA,CAED,6DAEC,kCAAA,CACA,0CAAA,CACA,6BAAA,CAGD,uCACC,kBAAA,CACA,uBAAA,CACA,0BAAA\",\"sourcesContent\":[\"\\n.app-details {\\n\\tpadding: 20px;\\n\\n\\t&__actions {\\n\\t\\t// app management\\n\\t\\t&-manage {\\n\\t\\t\\t// if too many, shrink them and ellipsis\\n\\t\\t\\tdisplay: flex;\\n\\t\\t\\tinput {\\n\\t\\t\\t\\tflex: 0 1 auto;\\n\\t\\t\\t\\tmin-width: 0;\\n\\t\\t\\t\\ttext-overflow: ellipsis;\\n\\t\\t\\t\\twhite-space: nowrap;\\n\\t\\t\\t\\toverflow: hidden;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\t&__authors {\\n\\t\\tcolor: var(--color-text-maxcontrast);\\n\\t}\\n\\n\\t&__section {\\n\\t\\tmargin-top: 15px;\\n\\n\\t\\th4 {\\n\\t\\t\\tfont-size: 16px;\\n\\t\\t\\tfont-weight: bold;\\n\\t\\t\\tmargin-block-end: 5px;\\n\\t\\t}\\n\\t}\\n\\n\\t&__interact {\\n\\t\\tdisplay: flex;\\n\\t\\tflex-direction: row;\\n\\t\\tflex-wrap: wrap;\\n\\t\\tgap: 12px;\\n\\t}\\n\\n\\t&__documentation {\\n\\t\\ta {\\n\\t\\t\\ttext-decoration: underline;\\n\\t\\t}\\n\\t\\tli {\\n\\t\\t\\tpadding-inline-start: 20px;\\n\\n\\t\\t\\t&::before {\\n\\t\\t\\t\\twidth: 5px;\\n\\t\\t\\t\\theight: 5px;\\n\\t\\t\\t\\tborder-radius: 100%;\\n\\t\\t\\t\\tbackground-color: var(--color-main-text);\\n\\t\\t\\t\\tcontent: \\\"\\\";\\n\\t\\t\\t\\tfloat: inline-start;\\n\\t\\t\\t\\tmargin-inline-start: -13px;\\n\\t\\t\\t\\tposition: relative;\\n\\t\\t\\t\\ttop: 10px;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n}\\n\\n.force {\\n\\tcolor: var(--color-error);\\n\\tborder-color: var(--color-error);\\n\\tbackground: var(--color-main-background);\\n}\\n.force:hover,\\n.force:active {\\n\\tcolor: var(--color-main-background);\\n\\tborder-color: var(--color-error) !important;\\n\\tbackground: var(--color-error);\\n}\\n\\n.missing-dependencies {\\n\\tlist-style: initial;\\n\\tlist-style-type: initial;\\n\\tlist-style-position: inside;\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `.app-sidebar-tabs__release h2[data-v-9c32407e]{border-bottom:1px solid var(--color-border);font-size:24px}.app-sidebar-tabs__release-text[data-v-9c32407e] h3{font-size:20px}.app-sidebar-tabs__release-text[data-v-9c32407e] h4{font-size:17px}`, \"\",{\"version\":3,\"sources\":[\"webpack://./apps/settings/src/components/AppStoreSidebar/AppReleasesTab.vue\"],\"names\":[],\"mappings\":\"AAEC,+CACC,2CAAA,CACA,cAAA,CAKA,oDACC,cAAA,CAED,oDACC,cAAA\",\"sourcesContent\":[\"\\n.app-sidebar-tabs__release {\\n\\th2 {\\n\\t\\tborder-bottom: 1px solid var(--color-border);\\n\\t\\tfont-size: 24px;\\n\\t}\\n\\n\\t&-text {\\n\\t\\t// Overwrite changelog heading styles\\n\\t\\t:deep(h3) {\\n\\t\\t\\tfont-size: 20px;\\n\\t\\t}\\n\\t\\t:deep(h4) {\\n\\t\\t\\tfont-size: 17px;\\n\\t\\t}\\n\\t}\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `.settings-markdown[data-v-5d3cebad] h1,.settings-markdown[data-v-5d3cebad] h2,.settings-markdown[data-v-5d3cebad] h3,.settings-markdown[data-v-5d3cebad] h4,.settings-markdown[data-v-5d3cebad] h5,.settings-markdown[data-v-5d3cebad] h6{font-weight:600;line-height:120%;margin-top:24px;margin-bottom:12px;color:var(--color-main-text)}.settings-markdown[data-v-5d3cebad] h1{font-size:36px;margin-top:48px}.settings-markdown[data-v-5d3cebad] h2{font-size:28px;margin-top:48px}.settings-markdown[data-v-5d3cebad] h3{font-size:24px}.settings-markdown[data-v-5d3cebad] h4{font-size:21px}.settings-markdown[data-v-5d3cebad] h5{font-size:17px}.settings-markdown[data-v-5d3cebad] h6{font-size:var(--default-font-size)}.settings-markdown[data-v-5d3cebad] pre{white-space:pre;overflow-x:auto;background-color:var(--color-background-dark);border-radius:var(--border-radius);padding:1em 1.3em;margin-bottom:1em}.settings-markdown[data-v-5d3cebad] p code{background-color:var(--color-background-dark);border-radius:var(--border-radius);padding:.1em .3em}.settings-markdown[data-v-5d3cebad] li{position:relative}.settings-markdown[data-v-5d3cebad] ul,.settings-markdown[data-v-5d3cebad] ol{padding-inline-start:10px;margin-inline-start:10px}.settings-markdown[data-v-5d3cebad] ul li{list-style-type:disc}.settings-markdown[data-v-5d3cebad] ul>li>ul>li{list-style-type:circle}.settings-markdown[data-v-5d3cebad] ul>li>ul>li ul li{list-style-type:square}.settings-markdown[data-v-5d3cebad] blockquote{padding-inline-start:1em;border-inline-start:4px solid var(--color-primary-element);color:var(--color-text-maxcontrast);margin-inline:0}`, \"\",{\"version\":3,\"sources\":[\"webpack://./apps/settings/src/components/Markdown.vue\"],\"names\":[],\"mappings\":\"AAGA,0OAMC,eAAA,CACA,gBAAA,CACA,eAAA,CACA,kBAAA,CACA,4BAAA,CAGD,uCACC,cAAA,CACA,eAAA,CAGD,uCACC,cAAA,CACA,eAAA,CAGD,uCACC,cAAA,CAGD,uCACC,cAAA,CAGD,uCACC,cAAA,CAGD,uCACC,kCAAA,CAGD,wCACC,eAAA,CACA,eAAA,CACA,6CAAA,CACA,kCAAA,CACA,iBAAA,CACA,iBAAA,CAGD,2CACC,6CAAA,CACA,kCAAA,CACA,iBAAA,CAGD,uCACC,iBAAA,CAGD,8EACC,yBAAA,CACA,wBAAA,CAGD,0CACC,oBAAA,CAGD,gDACC,sBAAA,CAGD,sDACC,sBAAA,CAGD,+CACC,wBAAA,CACA,0DAAA,CACA,mCAAA,CACA,eAAA\",\"sourcesContent\":[\"\\n.settings-markdown::v-deep {\\n\\nh1,\\nh2,\\nh3,\\nh4,\\nh5,\\nh6 {\\n\\tfont-weight: 600;\\n\\tline-height: 120%;\\n\\tmargin-top: 24px;\\n\\tmargin-bottom: 12px;\\n\\tcolor: var(--color-main-text);\\n}\\n\\nh1 {\\n\\tfont-size: 36px;\\n\\tmargin-top: 48px;\\n}\\n\\nh2 {\\n\\tfont-size: 28px;\\n\\tmargin-top: 48px;\\n}\\n\\nh3 {\\n\\tfont-size: 24px;\\n}\\n\\nh4 {\\n\\tfont-size: 21px;\\n}\\n\\nh5 {\\n\\tfont-size: 17px;\\n}\\n\\nh6 {\\n\\tfont-size: var(--default-font-size);\\n}\\n\\npre {\\n\\twhite-space: pre;\\n\\toverflow-x: auto;\\n\\tbackground-color: var(--color-background-dark);\\n\\tborder-radius: var(--border-radius);\\n\\tpadding: 1em 1.3em;\\n\\tmargin-bottom: 1em;\\n}\\n\\np code {\\n\\tbackground-color: var(--color-background-dark);\\n\\tborder-radius: var(--border-radius);\\n\\tpadding: .1em .3em;\\n}\\n\\nli {\\n\\tposition: relative;\\n}\\n\\nul, ol {\\n\\tpadding-inline-start: 10px;\\n\\tmargin-inline-start: 10px;\\n}\\n\\nul li {\\n\\tlist-style-type: disc;\\n}\\n\\nul > li > ul > li {\\n\\tlist-style-type: circle;\\n}\\n\\nul > li > ul > li ul li {\\n\\tlist-style-type: square;\\n}\\n\\nblockquote {\\n\\tpadding-inline-start: 1em;\\n\\tborder-inline-start: 4px solid var(--color-primary-element);\\n\\tcolor: var(--color-text-maxcontrast);\\n\\tmargin-inline: 0;\\n}\\n\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `.app-sidebar--with-screenshot[data-v-2f300fa2] .app-sidebar-header__figure{background-size:cover}.app-sidebar__fallback-icon[data-v-2f300fa2]{width:100%;height:100%}.app-sidebar__badges[data-v-2f300fa2]{display:flex;flex-direction:row;gap:12px}.app-sidebar__version[data-v-2f300fa2]{color:var(--color-text-maxcontrast)}`, \"\",{\"version\":3,\"sources\":[\"webpack://./apps/settings/src/views/AppStoreSidebar.vue\"],\"names\":[],\"mappings\":\"AAIE,2EACC,qBAAA,CAIF,6CAEC,UAAA,CACA,WAAA,CAGD,sCACC,YAAA,CACA,kBAAA,CACA,QAAA,CAGD,uCACC,mCAAA\",\"sourcesContent\":[\"\\n.app-sidebar {\\n\\t// If a screenshot is available it should cover the whole figure\\n\\t&--with-screenshot {\\n\\t\\t:deep(.app-sidebar-header__figure) {\\n\\t\\t\\tbackground-size: cover;\\n\\t\\t}\\n\\t}\\n\\n\\t&__fallback-icon {\\n\\t\\t// both 100% to center the icon\\n\\t\\twidth: 100%;\\n\\t\\theight: 100%;\\n\\t}\\n\\n\\t&__badges {\\n\\t\\tdisplay: flex;\\n\\t\\tflex-direction: row;\\n\\t\\tgap: 12px;\\n\\t}\\n\\n\\t&__version {\\n\\t\\tcolor: var(--color-text-maxcontrast);\\n\\t}\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `\n.app-score__wrapper[data-v-2193f4e0] {\n\tdisplay: inline-flex;\n\tcolor: var(--color-favorite, #a08b00);\n> *[data-v-2193f4e0] {\n\t\tvertical-align: text-bottom;\n}\n}\n`, \"\",{\"version\":3,\"sources\":[\"webpack://./apps/settings/src/components/AppList/AppScore.vue\"],\"names\":[],\"mappings\":\";AA+DA;CACA,oBAAA;CACA,qCAAA;AAEA;EACA,2BAAA;AACA;AACA\",\"sourcesContent\":[\"<!--\\n - SPDX-FileCopyrightText: 2018 Nextcloud GmbH and Nextcloud contributors\\n - SPDX-License-Identifier: AGPL-3.0-or-later\\n-->\\n\\n<template>\\n\\t<span role=\\\"img\\\"\\n\\t\\t:aria-label=\\\"title\\\"\\n\\t\\t:title=\\\"title\\\"\\n\\t\\tclass=\\\"app-score__wrapper\\\">\\n\\t\\t<NcIconSvgWrapper v-for=\\\"index in fullStars\\\"\\n\\t\\t\\t:key=\\\"`full-star-${index}`\\\"\\n\\t\\t\\t:path=\\\"mdiStar\\\"\\n\\t\\t\\tinline />\\n\\t\\t<NcIconSvgWrapper v-if=\\\"hasHalfStar\\\" :path=\\\"mdiStarHalfFull\\\" inline />\\n\\t\\t<NcIconSvgWrapper v-for=\\\"index in emptyStars\\\"\\n\\t\\t\\t:key=\\\"`empty-star-${index}`\\\"\\n\\t\\t\\t:path=\\\"mdiStarOutline\\\"\\n\\t\\t\\tinline />\\n\\t</span>\\n</template>\\n<script lang=\\\"ts\\\">\\nimport NcIconSvgWrapper from '@nextcloud/vue/dist/Components/NcIconSvgWrapper.js'\\nimport { mdiStar, mdiStarHalfFull, mdiStarOutline } from '@mdi/js'\\nimport { translate as t } from '@nextcloud/l10n'\\nimport { defineComponent } from 'vue'\\n\\nexport default defineComponent({\\n\\tname: 'AppScore',\\n\\tcomponents: {\\n\\t\\tNcIconSvgWrapper,\\n\\t},\\n\\tprops: {\\n\\t\\tscore: {\\n\\t\\t\\ttype: Number,\\n\\t\\t\\trequired: true,\\n\\t\\t},\\n\\t},\\n\\tsetup() {\\n\\t\\treturn {\\n\\t\\t\\tmdiStar,\\n\\t\\t\\tmdiStarHalfFull,\\n\\t\\t\\tmdiStarOutline,\\n\\t\\t}\\n\\t},\\n\\tcomputed: {\\n\\t\\ttitle() {\\n\\t\\t\\tconst appScore = (this.score * 5).toFixed(1)\\n\\t\\t\\treturn t('settings', 'Community rating: {score}/5', { score: appScore })\\n\\t\\t},\\n\\t\\tfullStars() {\\n\\t\\t\\treturn Math.floor(this.score * 5 + 0.25)\\n\\t\\t},\\n\\t\\temptyStars() {\\n\\t\\t\\treturn Math.min(Math.floor((1 - this.score) * 5 + 0.25), 5 - this.fullStars)\\n\\t\\t},\\n\\t\\thasHalfStar() {\\n\\t\\t\\treturn (this.fullStars + this.emptyStars) < 5\\n\\t\\t},\\n\\t},\\n})\\n</script>\\n<style scoped>\\n.app-score__wrapper {\\n\\tdisplay: inline-flex;\\n\\tcolor: var(--color-favorite, #a08b00);\\n\\n\\t> * {\\n\\t\\tvertical-align: text-bottom;\\n\\t}\\n}\\n</style>\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `\n.empty-content__loading[data-v-f9073bbe] {\n\theight: 100%;\n}\n.app-settings-content__label[data-v-f9073bbe] {\n\tmargin-block-start: var(--app-navigation-padding);\n\tmargin-inline-start: calc(var(--default-clickable-area) + var(--app-navigation-padding) * 2);\n\tmin-height: var(--default-clickable-area);\n\tline-height: var(--default-clickable-area);\n\tvertical-align: center;\n}\n`, \"\",{\"version\":3,\"sources\":[\"webpack://./apps/settings/src/views/AppStore.vue\"],\"names\":[],\"mappings\":\";AAkEA;CACA,YAAA;AACA;AAEA;CACA,iDAAA;CACA,4FAAA;CACA,yCAAA;CACA,0CAAA;CACA,sBAAA;AACA\",\"sourcesContent\":[\"<!--\\n - SPDX-FileCopyrightText: 2018 Nextcloud GmbH and Nextcloud contributors\\n - SPDX-License-Identifier: AGPL-3.0-or-later\\n-->\\n\\n<template>\\n\\t<!-- Apps list -->\\n\\t<NcAppContent class=\\\"app-settings-content\\\"\\n\\t\\t:page-heading=\\\"appStoreLabel\\\">\\n\\t\\t<h2 class=\\\"app-settings-content__label\\\" v-text=\\\"viewLabel\\\" />\\n\\n\\t\\t<AppStoreDiscoverSection v-if=\\\"currentCategory === 'discover'\\\" />\\n\\t\\t<NcEmptyContent v-else-if=\\\"isLoading\\\"\\n\\t\\t\\tclass=\\\"empty-content__loading\\\"\\n\\t\\t\\t:name=\\\"t('settings', 'Loading app list')\\\">\\n\\t\\t\\t<template #icon>\\n\\t\\t\\t\\t<NcLoadingIcon :size=\\\"64\\\" />\\n\\t\\t\\t</template>\\n\\t\\t</NcEmptyContent>\\n\\t\\t<AppList v-else :category=\\\"currentCategory\\\" />\\n\\t</NcAppContent>\\n</template>\\n\\n<script setup lang=\\\"ts\\\">\\nimport { translate as t } from '@nextcloud/l10n'\\nimport { computed, getCurrentInstance, onBeforeMount, watchEffect } from 'vue'\\nimport { useRoute } from 'vue-router/composables'\\n\\nimport { useAppsStore } from '../store/apps-store'\\nimport { APPS_SECTION_ENUM } from '../constants/AppsConstants'\\n\\nimport NcAppContent from '@nextcloud/vue/dist/Components/NcAppContent.js'\\nimport NcEmptyContent from '@nextcloud/vue/dist/Components/NcEmptyContent.js'\\nimport NcLoadingIcon from '@nextcloud/vue/dist/Components/NcLoadingIcon.js'\\nimport AppList from '../components/AppList.vue'\\nimport AppStoreDiscoverSection from '../components/AppStoreDiscover/AppStoreDiscoverSection.vue'\\n\\nconst route = useRoute()\\nconst store = useAppsStore()\\n\\n/**\\n * ID of the current active category, default is `discover`\\n */\\nconst currentCategory = computed(() => route.params?.category ?? 'discover')\\n\\nconst appStoreLabel = t('settings', 'App Store')\\nconst viewLabel = computed(() => APPS_SECTION_ENUM[currentCategory.value] ?? store.getCategoryById(currentCategory.value)?.displayName ?? appStoreLabel)\\n\\nwatchEffect(() => {\\n\\twindow.document.title = `${viewLabel.value} - ${appStoreLabel} - Nextcloud`\\n})\\n\\n// TODO this part should be migrated to pinia\\nconst instance = getCurrentInstance()\\n/** Is the app list loading */\\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\\nconst isLoading = computed(() => (instance?.proxy as any).$store.getters.loading('list'))\\nonBeforeMount(() => {\\n\\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\\n\\t(instance?.proxy as any).$store.dispatch('getCategories', { shouldRefetchCategories: true });\\n\\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\\n\\t(instance?.proxy as any).$store.dispatch('getAllApps')\\n})\\n</script>\\n\\n<style scoped>\\n.empty-content__loading {\\n\\theight: 100%;\\n}\\n\\n.app-settings-content__label {\\n\\tmargin-block-start: var(--app-navigation-padding);\\n\\tmargin-inline-start: calc(var(--default-clickable-area) + var(--app-navigation-padding) * 2);\\n\\tmin-height: var(--default-clickable-area);\\n\\tline-height: var(--default-clickable-area);\\n\\tvertical-align: center;\\n}\\n</style>\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `\n/* The categories-loading indicator */\n.categories--loading[data-v-26201909] {\n\tflex: 1;\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n}\n`, \"\",{\"version\":3,\"sources\":[\"webpack://./apps/settings/src/views/AppStoreNavigation.vue\"],\"names\":[],\"mappings\":\";AA2IA,qCAAA;AACA;CACA,OAAA;CACA,aAAA;CACA,mBAAA;CACA,uBAAA;AACA\",\"sourcesContent\":[\"<!--\\n - SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors\\n - SPDX-License-Identifier: AGPL-3.0-or-later\\n-->\\n<template>\\n\\t<!-- Categories & filters -->\\n\\t<NcAppNavigation :aria-label=\\\"t('settings', 'Apps')\\\">\\n\\t\\t<template #list>\\n\\t\\t\\t<NcAppNavigationItem v-if=\\\"appstoreEnabled\\\"\\n\\t\\t\\t\\tid=\\\"app-category-discover\\\"\\n\\t\\t\\t\\t:to=\\\"{ name: 'apps-category', params: { category: 'discover'} }\\\"\\n\\t\\t\\t\\t:name=\\\"APPS_SECTION_ENUM.discover\\\">\\n\\t\\t\\t\\t<template #icon>\\n\\t\\t\\t\\t\\t<NcIconSvgWrapper :path=\\\"APPSTORE_CATEGORY_ICONS.discover\\\" />\\n\\t\\t\\t\\t</template>\\n\\t\\t\\t</NcAppNavigationItem>\\n\\t\\t\\t<NcAppNavigationItem id=\\\"app-category-installed\\\"\\n\\t\\t\\t\\t:to=\\\"{ name: 'apps-category', params: { category: 'installed'} }\\\"\\n\\t\\t\\t\\t:name=\\\"APPS_SECTION_ENUM.installed\\\">\\n\\t\\t\\t\\t<template #icon>\\n\\t\\t\\t\\t\\t<NcIconSvgWrapper :path=\\\"APPSTORE_CATEGORY_ICONS.installed\\\" />\\n\\t\\t\\t\\t</template>\\n\\t\\t\\t</NcAppNavigationItem>\\n\\t\\t\\t<NcAppNavigationItem id=\\\"app-category-enabled\\\"\\n\\t\\t\\t\\t:to=\\\"{ name: 'apps-category', params: { category: 'enabled' } }\\\"\\n\\t\\t\\t\\t:name=\\\"APPS_SECTION_ENUM.enabled\\\">\\n\\t\\t\\t\\t<template #icon>\\n\\t\\t\\t\\t\\t<NcIconSvgWrapper :path=\\\"APPSTORE_CATEGORY_ICONS.enabled\\\" />\\n\\t\\t\\t\\t</template>\\n\\t\\t\\t</NcAppNavigationItem>\\n\\t\\t\\t<NcAppNavigationItem id=\\\"app-category-disabled\\\"\\n\\t\\t\\t\\t:to=\\\"{ name: 'apps-category', params: { category: 'disabled' } }\\\"\\n\\t\\t\\t\\t:name=\\\"APPS_SECTION_ENUM.disabled\\\">\\n\\t\\t\\t\\t<template #icon>\\n\\t\\t\\t\\t\\t<NcIconSvgWrapper :path=\\\"APPSTORE_CATEGORY_ICONS.disabled\\\" />\\n\\t\\t\\t\\t</template>\\n\\t\\t\\t</NcAppNavigationItem>\\n\\t\\t\\t<NcAppNavigationItem v-if=\\\"updateCount > 0\\\"\\n\\t\\t\\t\\tid=\\\"app-category-updates\\\"\\n\\t\\t\\t\\t:to=\\\"{ name: 'apps-category', params: { category: 'updates' } }\\\"\\n\\t\\t\\t\\t:name=\\\"APPS_SECTION_ENUM.updates\\\">\\n\\t\\t\\t\\t<template #counter>\\n\\t\\t\\t\\t\\t<NcCounterBubble>{{ updateCount }}</NcCounterBubble>\\n\\t\\t\\t\\t</template>\\n\\t\\t\\t\\t<template #icon>\\n\\t\\t\\t\\t\\t<NcIconSvgWrapper :path=\\\"APPSTORE_CATEGORY_ICONS.updates\\\" />\\n\\t\\t\\t\\t</template>\\n\\t\\t\\t</NcAppNavigationItem>\\n\\t\\t\\t<NcAppNavigationItem id=\\\"app-category-your-bundles\\\"\\n\\t\\t\\t\\t:to=\\\"{ name: 'apps-category', params: { category: 'app-bundles' } }\\\"\\n\\t\\t\\t\\t:name=\\\"APPS_SECTION_ENUM['app-bundles']\\\">\\n\\t\\t\\t\\t<template #icon>\\n\\t\\t\\t\\t\\t<NcIconSvgWrapper :path=\\\"APPSTORE_CATEGORY_ICONS.bundles\\\" />\\n\\t\\t\\t\\t</template>\\n\\t\\t\\t</NcAppNavigationItem>\\n\\n\\t\\t\\t<NcAppNavigationSpacer />\\n\\n\\t\\t\\t<!-- App store categories -->\\n\\t\\t\\t<li v-if=\\\"appstoreEnabled && categoriesLoading\\\" class=\\\"categories--loading\\\">\\n\\t\\t\\t\\t<NcLoadingIcon :size=\\\"20\\\" :aria-label=\\\"t('settings', 'Loading categories')\\\" />\\n\\t\\t\\t</li>\\n\\t\\t\\t<template v-else-if=\\\"appstoreEnabled && !categoriesLoading\\\">\\n\\t\\t\\t\\t<NcAppNavigationItem v-if=\\\"isSubscribed\\\"\\n\\t\\t\\t\\t\\tid=\\\"app-category-supported\\\"\\n\\t\\t\\t\\t\\t:to=\\\"{ name: 'apps-category', params: { category: 'supported' } }\\\"\\n\\t\\t\\t\\t\\t:name=\\\"APPS_SECTION_ENUM.supported\\\">\\n\\t\\t\\t\\t\\t<template #icon>\\n\\t\\t\\t\\t\\t\\t<NcIconSvgWrapper :path=\\\"APPSTORE_CATEGORY_ICONS.supported\\\" />\\n\\t\\t\\t\\t\\t</template>\\n\\t\\t\\t\\t</NcAppNavigationItem>\\n\\t\\t\\t\\t<NcAppNavigationItem id=\\\"app-category-featured\\\"\\n\\t\\t\\t\\t\\t:to=\\\"{ name: 'apps-category', params: { category: 'featured' } }\\\"\\n\\t\\t\\t\\t\\t:name=\\\"APPS_SECTION_ENUM.featured\\\">\\n\\t\\t\\t\\t\\t<template #icon>\\n\\t\\t\\t\\t\\t\\t<NcIconSvgWrapper :path=\\\"APPSTORE_CATEGORY_ICONS.featured\\\" />\\n\\t\\t\\t\\t\\t</template>\\n\\t\\t\\t\\t</NcAppNavigationItem>\\n\\n\\t\\t\\t\\t<NcAppNavigationItem v-for=\\\"category in categories\\\"\\n\\t\\t\\t\\t\\t:id=\\\"`app-category-${category.id}`\\\"\\n\\t\\t\\t\\t\\t:key=\\\"category.id\\\"\\n\\t\\t\\t\\t\\t:name=\\\"category.displayName\\\"\\n\\t\\t\\t\\t\\t:to=\\\"{\\n\\t\\t\\t\\t\\t\\tname: 'apps-category',\\n\\t\\t\\t\\t\\t\\tparams: { category: category.id },\\n\\t\\t\\t\\t\\t}\\\">\\n\\t\\t\\t\\t\\t<template #icon>\\n\\t\\t\\t\\t\\t\\t<NcIconSvgWrapper :path=\\\"category.icon\\\" />\\n\\t\\t\\t\\t\\t</template>\\n\\t\\t\\t\\t</NcAppNavigationItem>\\n\\t\\t\\t</template>\\n\\n\\t\\t\\t<NcAppNavigationItem id=\\\"app-developer-docs\\\"\\n\\t\\t\\t\\t:name=\\\"t('settings', 'Developer documentation ↗')\\\"\\n\\t\\t\\t\\t:href=\\\"developerDocsUrl\\\" />\\n\\t\\t</template>\\n\\t</NcAppNavigation>\\n</template>\\n\\n<script setup lang=\\\"ts\\\">\\nimport { loadState } from '@nextcloud/initial-state'\\nimport { translate as t } from '@nextcloud/l10n'\\nimport { computed, onBeforeMount } from 'vue'\\nimport { APPS_SECTION_ENUM } from '../constants/AppsConstants'\\nimport { useAppsStore } from '../store/apps-store'\\n\\nimport NcAppNavigation from '@nextcloud/vue/dist/Components/NcAppNavigation.js'\\nimport NcAppNavigationItem from '@nextcloud/vue/dist/Components/NcAppNavigationItem.js'\\nimport NcAppNavigationSpacer from '@nextcloud/vue/dist/Components/NcAppNavigationSpacer.js'\\nimport NcCounterBubble from '@nextcloud/vue/dist/Components/NcCounterBubble.js'\\nimport NcIconSvgWrapper from '@nextcloud/vue/dist/Components/NcIconSvgWrapper.js'\\nimport NcLoadingIcon from '@nextcloud/vue/dist/Components/NcLoadingIcon.js'\\n\\nimport APPSTORE_CATEGORY_ICONS from '../constants/AppstoreCategoryIcons.ts'\\n\\nconst updateCount = loadState<number>('settings', 'appstoreUpdateCount', 0)\\nconst appstoreEnabled = loadState<boolean>('settings', 'appstoreEnabled', true)\\nconst developerDocsUrl = loadState<string>('settings', 'appstoreDeveloperDocs', '')\\n\\nconst store = useAppsStore()\\nconst categories = computed(() => store.categories)\\nconst categoriesLoading = computed(() => store.loading.categories)\\n\\n/**\\n * Check if the current instance has a support subscription from the Nextcloud GmbH\\n *\\n * For customers of the Nextcloud GmbH the app level will be set to `300` for apps that are supported in their subscription\\n */\\nconst isSubscribed = computed(() => store.apps.find(({ level }) => level === 300) !== undefined)\\n\\n// load categories when component is mounted\\nonBeforeMount(() => {\\n\\tstore.loadCategories()\\n\\tstore.loadApps()\\n})\\n</script>\\n\\n<style scoped>\\n/* The categories-loading indicator */\\n.categories--loading {\\n\\tflex: 1;\\n\\tdisplay: flex;\\n\\talign-items: center;\\n\\tjustify-content: center;\\n}\\n</style>\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","var render = function render(){var _vm=this,_c=_vm._self._c;return _c(_vm.listView ? 'tr' : (_vm.inline ? 'article' : 'li'),{tag:\"component\",staticClass:\"app-item\",class:{\n\t\t'app-item--list-view': _vm.listView,\n\t\t'app-item--store-view': !_vm.listView,\n\t\t'app-item--selected': _vm.isSelected,\n\t\t'app-item--with-sidebar': _vm.withSidebar,\n\t}},[_c(_vm.dataItemTag,{tag:\"component\",staticClass:\"app-image app-image-icon\",attrs:{\"headers\":_vm.getDataItemHeaders(`app-table-col-icon`)}},[((_vm.listView && !_vm.app.preview) || (!_vm.listView && !_vm.screenshotLoaded))?_c('div',{staticClass:\"icon-settings-dark\"}):(_vm.listView && _vm.app.preview)?_c('svg',{attrs:{\"width\":\"32\",\"height\":\"32\",\"viewBox\":\"0 0 32 32\"}},[_c('image',{staticClass:\"app-icon\",attrs:{\"x\":\"0\",\"y\":\"0\",\"width\":\"32\",\"height\":\"32\",\"preserveAspectRatio\":\"xMinYMin meet\",\"xlink:href\":_vm.app.preview}})]):_vm._e(),_vm._v(\" \"),(!_vm.listView && _vm.app.screenshot && _vm.screenshotLoaded)?_c('img',{attrs:{\"src\":_vm.app.screenshot,\"alt\":\"\"}}):_vm._e()]),_vm._v(\" \"),_c(_vm.dataItemTag,{tag:\"component\",staticClass:\"app-name\",attrs:{\"headers\":_vm.getDataItemHeaders(`app-table-col-name`)}},[_c('router-link',{staticClass:\"app-name--link\",attrs:{\"to\":{\n\t\t\t\tname: 'apps-details',\n\t\t\t\tparams: {\n\t\t\t\t\tcategory: _vm.category,\n\t\t\t\t\tid: _vm.app.id\n\t\t\t\t},\n\t\t\t},\"aria-label\":_vm.t('settings', 'Show details for {appName} app', { appName:_vm.app.name })}},[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.app.name)+\"\\n\\t\\t\")])],1),_vm._v(\" \"),(!_vm.listView)?_c(_vm.dataItemTag,{tag:\"component\",staticClass:\"app-summary\",attrs:{\"headers\":_vm.getDataItemHeaders(`app-version`)}},[_vm._v(\"\\n\\t\\t\"+_vm._s(_vm.app.summary)+\"\\n\\t\")]):_vm._e(),_vm._v(\" \"),(_vm.listView)?_c(_vm.dataItemTag,{tag:\"component\",staticClass:\"app-version\",attrs:{\"headers\":_vm.getDataItemHeaders(`app-table-col-version`)}},[(_vm.app.version)?_c('span',[_vm._v(_vm._s(_vm.app.version))]):(_vm.app.appstoreData.releases[0].version)?_c('span',[_vm._v(_vm._s(_vm.app.appstoreData.releases[0].version))]):_vm._e()]):_vm._e(),_vm._v(\" \"),_c(_vm.dataItemTag,{tag:\"component\",staticClass:\"app-level\",attrs:{\"headers\":_vm.getDataItemHeaders(`app-table-col-level`)}},[_c('AppLevelBadge',{attrs:{\"level\":_vm.app.level}}),_vm._v(\" \"),(_vm.hasRating && !_vm.listView)?_c('AppScore',{attrs:{\"score\":_vm.app.score}}):_vm._e()],1),_vm._v(\" \"),(!_vm.inline)?_c(_vm.dataItemTag,{tag:\"component\",staticClass:\"app-actions\",attrs:{\"headers\":_vm.getDataItemHeaders(`app-table-col-actions`)}},[(_vm.app.error)?_c('div',{staticClass:\"warning\"},[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.app.error)+\"\\n\\t\\t\")]):_vm._e(),_vm._v(\" \"),(_vm.isLoading)?_c('div',{staticClass:\"icon icon-loading-small\"}):_vm._e(),_vm._v(\" \"),(_vm.app.update)?_c('NcButton',{attrs:{\"type\":\"primary\",\"disabled\":_vm.installing || _vm.isLoading},on:{\"click\":function($event){$event.stopPropagation();return _vm.update(_vm.app.id)}}},[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.t('settings', 'Update to {update}', {update:_vm.app.update}))+\"\\n\\t\\t\")]):_vm._e(),_vm._v(\" \"),(_vm.app.canUnInstall)?_c('NcButton',{staticClass:\"uninstall\",attrs:{\"type\":\"tertiary\",\"disabled\":_vm.installing || _vm.isLoading},on:{\"click\":function($event){$event.stopPropagation();return _vm.remove(_vm.app.id)}}},[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.t('settings', 'Remove'))+\"\\n\\t\\t\")]):_vm._e(),_vm._v(\" \"),(_vm.app.active)?_c('NcButton',{attrs:{\"disabled\":_vm.installing || _vm.isLoading},on:{\"click\":function($event){$event.stopPropagation();return _vm.disable(_vm.app.id)}}},[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.t('settings','Disable'))+\"\\n\\t\\t\")]):_vm._e(),_vm._v(\" \"),(!_vm.app.active && (_vm.app.canInstall || _vm.app.isCompatible))?_c('NcButton',{attrs:{\"title\":_vm.enableButtonTooltip,\"aria-label\":_vm.enableButtonTooltip,\"type\":\"primary\",\"disabled\":!_vm.app.canInstall || _vm.installing || _vm.isLoading},on:{\"click\":function($event){$event.stopPropagation();return _vm.enable(_vm.app.id)}}},[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.enableButtonText)+\"\\n\\t\\t\")]):(!_vm.app.active)?_c('NcButton',{attrs:{\"title\":_vm.forceEnableButtonTooltip,\"aria-label\":_vm.forceEnableButtonTooltip,\"type\":\"secondary\",\"disabled\":_vm.installing || _vm.isLoading},on:{\"click\":function($event){$event.stopPropagation();return _vm.forceEnable(_vm.app.id)}}},[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.forceEnableButtonText)+\"\\n\\t\\t\")]):_vm._e()],1):_vm._e()],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<!--\n - SPDX-FileCopyrightText: 2018 Nextcloud GmbH and Nextcloud contributors\n - SPDX-License-Identifier: AGPL-3.0-or-later\n-->\n\n<script>\nexport default {\n\tname: 'SvgFilterMixin',\n\tdata() {\n\t\treturn {\n\t\t\tfilterId: '',\n\t\t}\n\t},\n\tcomputed: {\n\t\tfilterUrl() {\n\t\t\treturn `url(#${this.filterId})`\n\t\t},\n\t},\n\tmounted() {\n\t\tthis.filterId = 'invertIconApps-' + Math.random().toString(36).substring(2)\n\t},\n}\n</script>\n","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SvgFilterMixin.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SvgFilterMixin.vue?vue&type=script&lang=js\"","var render, staticRenderFns\nimport script from \"./SvgFilterMixin.vue?vue&type=script&lang=js\"\nexport * from \"./SvgFilterMixin.vue?vue&type=script&lang=js\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","<!--\n - SPDX-FileCopyrightText: 2018 Nextcloud GmbH and Nextcloud contributors\n - SPDX-License-Identifier: AGPL-3.0-or-later\n-->\n<template>\n\t<component :is=\"listView ? 'tr' : (inline ? 'article' : 'li')\"\n\t\tclass=\"app-item\"\n\t\t:class=\"{\n\t\t\t'app-item--list-view': listView,\n\t\t\t'app-item--store-view': !listView,\n\t\t\t'app-item--selected': isSelected,\n\t\t\t'app-item--with-sidebar': withSidebar,\n\t\t}\">\n\t\t<component :is=\"dataItemTag\"\n\t\t\tclass=\"app-image app-image-icon\"\n\t\t\t:headers=\"getDataItemHeaders(`app-table-col-icon`)\">\n\t\t\t<div v-if=\"(listView && !app.preview) || (!listView && !screenshotLoaded)\" class=\"icon-settings-dark\" />\n\n\t\t\t<svg v-else-if=\"listView && app.preview\"\n\t\t\t\twidth=\"32\"\n\t\t\t\theight=\"32\"\n\t\t\t\tviewBox=\"0 0 32 32\">\n\t\t\t\t<image x=\"0\"\n\t\t\t\t\ty=\"0\"\n\t\t\t\t\twidth=\"32\"\n\t\t\t\t\theight=\"32\"\n\t\t\t\t\tpreserveAspectRatio=\"xMinYMin meet\"\n\t\t\t\t\t:xlink:href=\"app.preview\"\n\t\t\t\t\tclass=\"app-icon\" />\n\t\t\t</svg>\n\n\t\t\t<img v-if=\"!listView && app.screenshot && screenshotLoaded\" :src=\"app.screenshot\" alt=\"\">\n\t\t</component>\n\t\t<component :is=\"dataItemTag\"\n\t\t\tclass=\"app-name\"\n\t\t\t:headers=\"getDataItemHeaders(`app-table-col-name`)\">\n\t\t\t<router-link class=\"app-name--link\"\n\t\t\t\t:to=\"{\n\t\t\t\t\tname: 'apps-details',\n\t\t\t\t\tparams: {\n\t\t\t\t\t\tcategory: category,\n\t\t\t\t\t\tid: app.id\n\t\t\t\t\t},\n\t\t\t\t}\"\n\t\t\t\t:aria-label=\"t('settings', 'Show details for {appName} app', { appName:app.name })\">\n\t\t\t\t{{ app.name }}\n\t\t\t</router-link>\n\t\t</component>\n\t\t<component :is=\"dataItemTag\"\n\t\t\tv-if=\"!listView\"\n\t\t\tclass=\"app-summary\"\n\t\t\t:headers=\"getDataItemHeaders(`app-version`)\">\n\t\t\t{{ app.summary }}\n\t\t</component>\n\t\t<component :is=\"dataItemTag\"\n\t\t\tv-if=\"listView\"\n\t\t\tclass=\"app-version\"\n\t\t\t:headers=\"getDataItemHeaders(`app-table-col-version`)\">\n\t\t\t<span v-if=\"app.version\">{{ app.version }}</span>\n\t\t\t<span v-else-if=\"app.appstoreData.releases[0].version\">{{ app.appstoreData.releases[0].version }}</span>\n\t\t</component>\n\n\t\t<component :is=\"dataItemTag\" :headers=\"getDataItemHeaders(`app-table-col-level`)\" class=\"app-level\">\n\t\t\t<AppLevelBadge :level=\"app.level\" />\n\t\t\t<AppScore v-if=\"hasRating && !listView\" :score=\"app.score\" />\n\t\t</component>\n\t\t<component :is=\"dataItemTag\"\n\t\t\tv-if=\"!inline\"\n\t\t\t:headers=\"getDataItemHeaders(`app-table-col-actions`)\"\n\t\t\tclass=\"app-actions\">\n\t\t\t<div v-if=\"app.error\" class=\"warning\">\n\t\t\t\t{{ app.error }}\n\t\t\t</div>\n\t\t\t<div v-if=\"isLoading\" class=\"icon icon-loading-small\" />\n\t\t\t<NcButton v-if=\"app.update\"\n\t\t\t\ttype=\"primary\"\n\t\t\t\t:disabled=\"installing || isLoading\"\n\t\t\t\t@click.stop=\"update(app.id)\">\n\t\t\t\t{{ t('settings', 'Update to {update}', {update:app.update}) }}\n\t\t\t</NcButton>\n\t\t\t<NcButton v-if=\"app.canUnInstall\"\n\t\t\t\tclass=\"uninstall\"\n\t\t\t\ttype=\"tertiary\"\n\t\t\t\t:disabled=\"installing || isLoading\"\n\t\t\t\t@click.stop=\"remove(app.id)\">\n\t\t\t\t{{ t('settings', 'Remove') }}\n\t\t\t</NcButton>\n\t\t\t<NcButton v-if=\"app.active\"\n\t\t\t\t:disabled=\"installing || isLoading\"\n\t\t\t\t@click.stop=\"disable(app.id)\">\n\t\t\t\t{{ t('settings','Disable') }}\n\t\t\t</NcButton>\n\t\t\t<NcButton v-if=\"!app.active && (app.canInstall || app.isCompatible)\"\n\t\t\t\t:title=\"enableButtonTooltip\"\n\t\t\t\t:aria-label=\"enableButtonTooltip\"\n\t\t\t\ttype=\"primary\"\n\t\t\t\t:disabled=\"!app.canInstall || installing || isLoading\"\n\t\t\t\t@click.stop=\"enable(app.id)\">\n\t\t\t\t{{ enableButtonText }}\n\t\t\t</NcButton>\n\t\t\t<NcButton v-else-if=\"!app.active\"\n\t\t\t\t:title=\"forceEnableButtonTooltip\"\n\t\t\t\t:aria-label=\"forceEnableButtonTooltip\"\n\t\t\t\ttype=\"secondary\"\n\t\t\t\t:disabled=\"installing || isLoading\"\n\t\t\t\t@click.stop=\"forceEnable(app.id)\">\n\t\t\t\t{{ forceEnableButtonText }}\n\t\t\t</NcButton>\n\t\t</component>\n\t</component>\n</template>\n\n<script>\nimport AppScore from './AppScore.vue'\nimport AppLevelBadge from './AppLevelBadge.vue'\nimport AppManagement from '../../mixins/AppManagement.js'\nimport SvgFilterMixin from '../SvgFilterMixin.vue'\nimport NcButton from '@nextcloud/vue/dist/Components/NcButton.js'\n\nexport default {\n\tname: 'AppItem',\n\tcomponents: {\n\t\tAppLevelBadge,\n\t\tAppScore,\n\t\tNcButton,\n\t},\n\tmixins: [AppManagement, SvgFilterMixin],\n\tprops: {\n\t\tapp: {\n\t\t\ttype: Object,\n\t\t\trequired: true,\n\t\t},\n\t\tcategory: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t},\n\t\tlistView: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\t\tuseBundleView: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t\theaders: {\n\t\t\ttype: String,\n\t\t\tdefault: null,\n\t\t},\n\t\tinline: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tisSelected: false,\n\t\t\tscrolled: false,\n\t\t\tscreenshotLoaded: false,\n\t\t}\n\t},\n\tcomputed: {\n\t\thasRating() {\n\t\t\treturn this.app.appstoreData && this.app.appstoreData.ratingNumOverall > 5\n\t\t},\n\t\tdataItemTag() {\n\t\t\treturn this.listView ? 'td' : 'div'\n\t\t},\n\t\twithSidebar() {\n\t\t\treturn !!this.$route.params.id\n\t\t},\n\t},\n\twatch: {\n\t\t'$route.params.id'(id) {\n\t\t\tthis.isSelected = (this.app.id === id)\n\t\t},\n\t},\n\tmounted() {\n\t\tthis.isSelected = (this.app.id === this.$route.params.id)\n\t\tif (this.app.releases && this.app.screenshot) {\n\t\t\tconst image = new Image()\n\t\t\timage.onload = () => {\n\t\t\t\tthis.screenshotLoaded = true\n\t\t\t}\n\t\t\timage.src = this.app.screenshot\n\t\t}\n\t},\n\twatchers: {\n\n\t},\n\tmethods: {\n\t\tprefix(prefix, content) {\n\t\t\treturn prefix + '_' + content\n\t\t},\n\n\t\tgetDataItemHeaders(columnName) {\n\t\t\treturn this.useBundleView ? [this.headers, columnName].join(' ') : null\n\t\t},\n\t},\n}\n</script>\n\n<style scoped lang=\"scss\">\n@use '../../../../../core/css/variables.scss' as variables;\n@use 'sass:math';\n\n.app-item {\n\tposition: relative;\n\n\t&:hover {\n\t\tbackground-color: var(--color-background-dark);\n\t}\n\n\t&--list-view {\n\t\t--app-item-padding: calc(var(--default-grid-baseline) * 2);\n\t\t--app-item-height: calc(var(--default-clickable-area) + var(--app-item-padding) * 2);\n\n\t\t&.app-item--selected {\n\t\t\tbackground-color: var(--color-background-dark);\n\t\t}\n\n\t\t> * {\n\t\t\tvertical-align: middle;\n\t\t\tborder-bottom: 1px solid var(--color-border);\n\t\t\tpadding: var(--app-item-padding);\n\t\t\theight: var(--app-item-height);\n\t\t}\n\n\t\t.app-image {\n\t\t\twidth: var(--default-clickable-area);\n\t\t\theight: auto;\n\t\t\ttext-align: end;\n\t\t}\n\n\t\t.app-image-icon svg,\n\t\t.app-image-icon .icon-settings-dark {\n\t\t\tmargin-top: 5px;\n\t\t\twidth: 20px;\n\t\t\theight: 20px;\n\t\t\topacity: .5;\n\t\t\tbackground-size: cover;\n\t\t\tdisplay: inline-block;\n\t\t}\n\n\t\t.app-name {\n\t\t\tpadding: 0 var(--app-item-padding);\n\t\t}\n\n\t\t.app-name--link {\n\t\t\theight: var(--app-item-height);\n\t\t\tdisplay: flex;\n\t\t\talign-items: center;\n\t\t}\n\n\t\t// Note: because of Safari bug, we cannot position link overlay relative to the table row\n\t\t// So we need to manually position it relative to the table container and cell\n\t\t// See: https://bugs.webkit.org/show_bug.cgi?id=240961\n\t\t.app-name--link::after {\n\t\t\tcontent: '';\n\t\t\tposition: absolute;\n\t\t\tinset-inline: 0;\n\t\t\theight: var(--app-item-height);\n\t\t}\n\n\t\t.app-actions {\n\t\t\tdisplay: flex;\n\t\t\tgap: var(--app-item-padding);\n\t\t\tflex-wrap: wrap;\n\t\t\tjustify-content: end;\n\n\t\t\t.icon-loading-small {\n\t\t\t\tdisplay: inline-block;\n\t\t\t\ttop: 4px;\n\t\t\t\tmargin-inline-end: 10px;\n\t\t\t}\n\t\t}\n\n\t\t/* hide app version and level on narrower screens */\n\t\t@media only screen and (max-width: 900px) {\n\t\t\t.app-version,\n\t\t\t.app-level {\n\t\t\t\tdisplay: none;\n\t\t\t}\n\t\t}\n\n\t\t/* Hide actions on a small screen. Click on app opens fill-screen sidebar with the buttons */\n\t\t@media only screen and (max-width: math.div(variables.$breakpoint-mobile, 2)) {\n\t\t\t.app-actions {\n\t\t\t\tdisplay: none;\n\t\t\t}\n\t\t}\n\t}\n\n\t&--store-view {\n\t\tpadding: 30px;\n\n\t\t.app-image-icon .icon-settings-dark {\n\t\t\twidth: 100%;\n\t\t\theight: 150px;\n\t\t\tbackground-size: 45px;\n\t\t\topacity: 0.5;\n\t\t}\n\n\t\t.app-image-icon svg {\n\t\t\tposition: absolute;\n\t\t\tbottom: 43px;\n\t\t\t/* position halfway vertically */\n\t\t\twidth: 64px;\n\t\t\theight: 64px;\n\t\t\topacity: .1;\n\t\t}\n\n\t\t.app-name {\n\t\t\tmargin: 5px 0;\n\t\t}\n\n\t\t.app-name--link::after {\n\t\t\tcontent: '';\n\t\t\tposition: absolute;\n\t\t\tinset-block: 0;\n\t\t\tinset-inline: 0;\n\t\t}\n\n\t\t.app-actions {\n\t\t\tmargin: 10px 0;\n\t\t}\n\n\t\t@media only screen and (min-width: 1601px) {\n\t\t\twidth: 25%;\n\n\t\t\t&.app-item--with-sidebar {\n\t\t\t\twidth: 33%;\n\t\t\t}\n\t\t}\n\n\t\t@media only screen and (max-width: 1600px) {\n\t\t\twidth: 25%;\n\n\t\t\t&.app-item--with-sidebar {\n\t\t\t\twidth: 33%;\n\t\t\t}\n\t\t}\n\n\t\t@media only screen and (max-width: 1400px) {\n\t\t\twidth: 33%;\n\n\t\t\t&.app-item--with-sidebar {\n\t\t\t\twidth: 50%;\n\t\t\t}\n\t\t}\n\n\t\t@media only screen and (max-width: 900px) {\n\t\t\twidth: 50%;\n\n\t\t\t&.app-item--with-sidebar {\n\t\t\t\twidth: 100%;\n\t\t\t}\n\t\t}\n\n\t\t@media only screen and (max-width: variables.$breakpoint-mobile) {\n\t\t\twidth: 50%;\n\t\t}\n\n\t\t@media only screen and (max-width: 480px) {\n\t\t\twidth: 100%;\n\t\t}\n\t}\n}\n\n.app-icon {\n\tfilter: var(--background-invert-if-bright);\n}\n\n.app-image {\n\tposition: relative;\n\theight: 150px;\n\topacity: 1;\n\toverflow: hidden;\n\n\timg {\n\t\twidth: 100%;\n\t}\n}\n\n.app-version {\n\tcolor: var(--color-text-maxcontrast);\n}\n</style>\n","import mod from \"-!../../../../../node_modules/babel-loader/lib/index.js!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppItem.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../../../../node_modules/babel-loader/lib/index.js!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppItem.vue?vue&type=script&lang=js\"","\n import API from \"!../../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../../node_modules/css-loader/dist/cjs.js!../../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../node_modules/sass-loader/dist/cjs.js!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppItem.vue?vue&type=style&index=0&id=4f1b9f2a&prod&scoped=true&lang=scss\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../../node_modules/css-loader/dist/cjs.js!../../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../node_modules/sass-loader/dist/cjs.js!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppItem.vue?vue&type=style&index=0&id=4f1b9f2a&prod&scoped=true&lang=scss\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./AppItem.vue?vue&type=template&id=4f1b9f2a&scoped=true\"\nimport script from \"./AppItem.vue?vue&type=script&lang=js\"\nexport * from \"./AppItem.vue?vue&type=script&lang=js\"\nimport style0 from \"./AppItem.vue?vue&type=style&index=0&id=4f1b9f2a&prod&scoped=true&lang=scss\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"4f1b9f2a\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c,_setup=_vm._self._setupProxy;return (_setup.isSupported || _setup.isFeatured)?_c('span',{staticClass:\"app-level-badge\",class:{ 'app-level-badge--supported': _setup.isSupported },attrs:{\"title\":_setup.badgeTitle}},[_c(_setup.NcIconSvgWrapper,{attrs:{\"path\":_setup.badgeIcon,\"size\":20,\"inline\":\"\"}}),_vm._v(\"\\n\\t\"+_vm._s(_setup.badgeText)+\"\\n\")],1):_vm._e()\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../../node_modules/babel-loader/lib/index.js!../../../../../node_modules/ts-loader/index.js??clonedRuleSet-4.use[1]!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppLevelBadge.vue?vue&type=script&setup=true&lang=ts\"; export default mod; export * from \"-!../../../../../node_modules/babel-loader/lib/index.js!../../../../../node_modules/ts-loader/index.js??clonedRuleSet-4.use[1]!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppLevelBadge.vue?vue&type=script&setup=true&lang=ts\"","\n import API from \"!../../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../../node_modules/css-loader/dist/cjs.js!../../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../node_modules/sass-loader/dist/cjs.js!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppLevelBadge.vue?vue&type=style&index=0&id=5ee601b2&prod&scoped=true&lang=scss\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../../node_modules/css-loader/dist/cjs.js!../../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../node_modules/sass-loader/dist/cjs.js!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppLevelBadge.vue?vue&type=style&index=0&id=5ee601b2&prod&scoped=true&lang=scss\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./AppLevelBadge.vue?vue&type=template&id=5ee601b2&scoped=true\"\nimport script from \"./AppLevelBadge.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./AppLevelBadge.vue?vue&type=script&setup=true&lang=ts\"\nimport style0 from \"./AppLevelBadge.vue?vue&type=style&index=0&id=5ee601b2&prod&scoped=true&lang=scss\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"5ee601b2\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c,_setup=_vm._self._setupProxy;return _c('span',{staticClass:\"app-score__wrapper\",attrs:{\"role\":\"img\",\"aria-label\":_vm.title,\"title\":_vm.title}},[_vm._l((_vm.fullStars),function(index){return _c('NcIconSvgWrapper',{key:`full-star-${index}`,attrs:{\"path\":_vm.mdiStar,\"inline\":\"\"}})}),_vm._v(\" \"),(_vm.hasHalfStar)?_c('NcIconSvgWrapper',{attrs:{\"path\":_vm.mdiStarHalfFull,\"inline\":\"\"}}):_vm._e(),_vm._v(\" \"),_vm._l((_vm.emptyStars),function(index){return _c('NcIconSvgWrapper',{key:`empty-star-${index}`,attrs:{\"path\":_vm.mdiStarOutline,\"inline\":\"\"}})})],2)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../../node_modules/babel-loader/lib/index.js!../../../../../node_modules/ts-loader/index.js??clonedRuleSet-4.use[1]!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppScore.vue?vue&type=script&lang=ts\"; export default mod; export * from \"-!../../../../../node_modules/babel-loader/lib/index.js!../../../../../node_modules/ts-loader/index.js??clonedRuleSet-4.use[1]!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppScore.vue?vue&type=script&lang=ts\"","\n import API from \"!../../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../../node_modules/css-loader/dist/cjs.js!../../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppScore.vue?vue&type=style&index=0&id=2193f4e0&prod&scoped=true&lang=css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../../node_modules/css-loader/dist/cjs.js!../../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppScore.vue?vue&type=style&index=0&id=2193f4e0&prod&scoped=true&lang=css\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./AppScore.vue?vue&type=template&id=2193f4e0&scoped=true\"\nimport script from \"./AppScore.vue?vue&type=script&lang=ts\"\nexport * from \"./AppScore.vue?vue&type=script&lang=ts\"\nimport style0 from \"./AppScore.vue?vue&type=style&index=0&id=2193f4e0&prod&scoped=true&lang=css\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"2193f4e0\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c,_setup=_vm._self._setupProxy;return _c(_setup.NcAppContent,{staticClass:\"app-settings-content\",attrs:{\"page-heading\":_setup.appStoreLabel}},[_c('h2',{staticClass:\"app-settings-content__label\",domProps:{\"textContent\":_vm._s(_setup.viewLabel)}}),_vm._v(\" \"),(_setup.currentCategory === 'discover')?_c(_setup.AppStoreDiscoverSection):(_setup.isLoading)?_c(_setup.NcEmptyContent,{staticClass:\"empty-content__loading\",attrs:{\"name\":_setup.t('settings', 'Loading app list')},scopedSlots:_vm._u([{key:\"icon\",fn:function(){return [_c(_setup.NcLoadingIcon,{attrs:{\"size\":64}})]},proxy:true}])}):_c(_setup.AppList,{attrs:{\"category\":_setup.currentCategory}})],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","/*\nHow it works:\n`this.#head` is an instance of `Node` which keeps track of its current value and nests another instance of `Node` that keeps the value that comes after it. When a value is provided to `.enqueue()`, the code needs to iterate through `this.#head`, going deeper and deeper to find the last value. However, iterating through every single item is slow. This problem is solved by saving a reference to the last value as `this.#tail` so that it can reference it to add a new value.\n*/\n\nclass Node {\n\tvalue;\n\tnext;\n\n\tconstructor(value) {\n\t\tthis.value = value;\n\t}\n}\n\nexport default class Queue {\n\t#head;\n\t#tail;\n\t#size;\n\n\tconstructor() {\n\t\tthis.clear();\n\t}\n\n\tenqueue(value) {\n\t\tconst node = new Node(value);\n\n\t\tif (this.#head) {\n\t\t\tthis.#tail.next = node;\n\t\t\tthis.#tail = node;\n\t\t} else {\n\t\t\tthis.#head = node;\n\t\t\tthis.#tail = node;\n\t\t}\n\n\t\tthis.#size++;\n\t}\n\n\tdequeue() {\n\t\tconst current = this.#head;\n\t\tif (!current) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.#head = this.#head.next;\n\t\tthis.#size--;\n\t\treturn current.value;\n\t}\n\n\tpeek() {\n\t\tif (!this.#head) {\n\t\t\treturn;\n\t\t}\n\n\t\treturn this.#head.value;\n\n\t\t// TODO: Node.js 18.\n\t\t// return this.#head?.value;\n\t}\n\n\tclear() {\n\t\tthis.#head = undefined;\n\t\tthis.#tail = undefined;\n\t\tthis.#size = 0;\n\t}\n\n\tget size() {\n\t\treturn this.#size;\n\t}\n\n\t* [Symbol.iterator]() {\n\t\tlet current = this.#head;\n\n\t\twhile (current) {\n\t\t\tyield current.value;\n\t\t\tcurrent = current.next;\n\t\t}\n\t}\n}\n","import Queue from 'yocto-queue';\n\nexport default function pLimit(concurrency) {\n\tvalidateConcurrency(concurrency);\n\n\tconst queue = new Queue();\n\tlet activeCount = 0;\n\n\tconst resumeNext = () => {\n\t\tif (activeCount < concurrency && queue.size > 0) {\n\t\t\tqueue.dequeue()();\n\t\t\t// Since `pendingCount` has been decreased by one, increase `activeCount` by one.\n\t\t\tactiveCount++;\n\t\t}\n\t};\n\n\tconst next = () => {\n\t\tactiveCount--;\n\n\t\tresumeNext();\n\t};\n\n\tconst run = async (function_, resolve, arguments_) => {\n\t\tconst result = (async () => function_(...arguments_))();\n\n\t\tresolve(result);\n\n\t\ttry {\n\t\t\tawait result;\n\t\t} catch {}\n\n\t\tnext();\n\t};\n\n\tconst enqueue = (function_, resolve, arguments_) => {\n\t\t// Queue `internalResolve` instead of the `run` function\n\t\t// to preserve asynchronous context.\n\t\tnew Promise(internalResolve => {\n\t\t\tqueue.enqueue(internalResolve);\n\t\t}).then(\n\t\t\trun.bind(undefined, function_, resolve, arguments_),\n\t\t);\n\n\t\t(async () => {\n\t\t\t// This function needs to wait until the next microtask before comparing\n\t\t\t// `activeCount` to `concurrency`, because `activeCount` is updated asynchronously\n\t\t\t// after the `internalResolve` function is dequeued and called. The comparison in the if-statement\n\t\t\t// needs to happen asynchronously as well to get an up-to-date value for `activeCount`.\n\t\t\tawait Promise.resolve();\n\n\t\t\tif (activeCount < concurrency) {\n\t\t\t\tresumeNext();\n\t\t\t}\n\t\t})();\n\t};\n\n\tconst generator = (function_, ...arguments_) => new Promise(resolve => {\n\t\tenqueue(function_, resolve, arguments_);\n\t});\n\n\tObject.defineProperties(generator, {\n\t\tactiveCount: {\n\t\t\tget: () => activeCount,\n\t\t},\n\t\tpendingCount: {\n\t\t\tget: () => queue.size,\n\t\t},\n\t\tclearQueue: {\n\t\t\tvalue() {\n\t\t\t\tqueue.clear();\n\t\t\t},\n\t\t},\n\t\tconcurrency: {\n\t\t\tget: () => concurrency,\n\n\t\t\tset(newConcurrency) {\n\t\t\t\tvalidateConcurrency(newConcurrency);\n\t\t\t\tconcurrency = newConcurrency;\n\n\t\t\t\tqueueMicrotask(() => {\n\t\t\t\t\t// eslint-disable-next-line no-unmodified-loop-condition\n\t\t\t\t\twhile (activeCount < concurrency && queue.size > 0) {\n\t\t\t\t\t\tresumeNext();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t},\n\t\t},\n\t});\n\n\treturn generator;\n}\n\nfunction validateConcurrency(concurrency) {\n\tif (!((Number.isInteger(concurrency) || concurrency === Number.POSITIVE_INFINITY) && concurrency > 0)) {\n\t\tthrow new TypeError('Expected `concurrency` to be a number from 1 and up');\n\t}\n}\n","<!--\n - SPDX-FileCopyrightText: 2018 Nextcloud GmbH and Nextcloud contributors\n - SPDX-License-Identifier: AGPL-3.0-or-later\n-->\n\n<template>\n\t<div id=\"app-content-inner\">\n\t\t<div id=\"apps-list\"\n\t\t\tclass=\"apps-list\"\n\t\t\t:class=\"{\n\t\t\t\t'apps-list--list-view': (useBundleView || useListView),\n\t\t\t\t'apps-list--store-view': useAppStoreView,\n\t\t\t}\">\n\t\t\t<template v-if=\"useListView\">\n\t\t\t\t<div v-if=\"showUpdateAll\" class=\"apps-list__toolbar\">\n\t\t\t\t\t{{ n('settings', '%n app has an update available', '%n apps have an update available', counter) }}\n\t\t\t\t\t<NcButton v-if=\"showUpdateAll\"\n\t\t\t\t\t\tid=\"app-list-update-all\"\n\t\t\t\t\t\ttype=\"primary\"\n\t\t\t\t\t\t@click=\"updateAll\">\n\t\t\t\t\t\t{{ n('settings', 'Update', 'Update all', counter) }}\n\t\t\t\t\t</NcButton>\n\t\t\t\t</div>\n\n\t\t\t\t<div v-if=\"!showUpdateAll\" class=\"apps-list__toolbar\">\n\t\t\t\t\t{{ t('settings', 'All apps are up-to-date.') }}\n\t\t\t\t</div>\n\n\t\t\t\t<TransitionGroup name=\"apps-list\" tag=\"table\" class=\"apps-list__list-container\">\n\t\t\t\t\t<tr key=\"app-list-view-header\">\n\t\t\t\t\t\t<th>\n\t\t\t\t\t\t\t<span class=\"hidden-visually\">{{ t('settings', 'Icon') }}</span>\n\t\t\t\t\t\t</th>\n\t\t\t\t\t\t<th>\n\t\t\t\t\t\t\t<span class=\"hidden-visually\">{{ t('settings', 'Name') }}</span>\n\t\t\t\t\t\t</th>\n\t\t\t\t\t\t<th>\n\t\t\t\t\t\t\t<span class=\"hidden-visually\">{{ t('settings', 'Version') }}</span>\n\t\t\t\t\t\t</th>\n\t\t\t\t\t\t<th>\n\t\t\t\t\t\t\t<span class=\"hidden-visually\">{{ t('settings', 'Level') }}</span>\n\t\t\t\t\t\t</th>\n\t\t\t\t\t\t<th>\n\t\t\t\t\t\t\t<span class=\"hidden-visually\">{{ t('settings', 'Actions') }}</span>\n\t\t\t\t\t\t</th>\n\t\t\t\t\t</tr>\n\t\t\t\t\t<AppItem v-for=\"app in apps\"\n\t\t\t\t\t\t:key=\"app.id\"\n\t\t\t\t\t\t:app=\"app\"\n\t\t\t\t\t\t:category=\"category\" />\n\t\t\t\t</TransitionGroup>\n\t\t\t</template>\n\n\t\t\t<table v-if=\"useBundleView\"\n\t\t\t\tclass=\"apps-list__list-container\">\n\t\t\t\t<tr key=\"app-list-view-header\">\n\t\t\t\t\t<th id=\"app-table-col-icon\">\n\t\t\t\t\t\t<span class=\"hidden-visually\">{{ t('settings', 'Icon') }}</span>\n\t\t\t\t\t</th>\n\t\t\t\t\t<th id=\"app-table-col-name\">\n\t\t\t\t\t\t<span class=\"hidden-visually\">{{ t('settings', 'Name') }}</span>\n\t\t\t\t\t</th>\n\t\t\t\t\t<th id=\"app-table-col-version\">\n\t\t\t\t\t\t<span class=\"hidden-visually\">{{ t('settings', 'Version') }}</span>\n\t\t\t\t\t</th>\n\t\t\t\t\t<th id=\"app-table-col-level\">\n\t\t\t\t\t\t<span class=\"hidden-visually\">{{ t('settings', 'Level') }}</span>\n\t\t\t\t\t</th>\n\t\t\t\t\t<th id=\"app-table-col-actions\">\n\t\t\t\t\t\t<span class=\"hidden-visually\">{{ t('settings', 'Actions') }}</span>\n\t\t\t\t\t</th>\n\t\t\t\t</tr>\n\t\t\t\t<template v-for=\"bundle in bundles\">\n\t\t\t\t\t<tr :key=\"bundle.id\">\n\t\t\t\t\t\t<th :id=\"`app-table-rowgroup-${bundle.id}`\" colspan=\"5\" scope=\"rowgroup\">\n\t\t\t\t\t\t\t<div class=\"apps-list__bundle-heading\">\n\t\t\t\t\t\t\t\t<span class=\"apps-list__bundle-header\">\n\t\t\t\t\t\t\t\t\t{{ bundle.name }}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t<NcButton type=\"secondary\" @click=\"toggleBundle(bundle.id)\">\n\t\t\t\t\t\t\t\t\t{{ t('settings', bundleToggleText(bundle.id)) }}\n\t\t\t\t\t\t\t\t</NcButton>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</th>\n\t\t\t\t\t</tr>\n\t\t\t\t\t<AppItem v-for=\"app in bundleApps(bundle.id)\"\n\t\t\t\t\t\t:key=\"bundle.id + app.id\"\n\t\t\t\t\t\t:use-bundle-view=\"true\"\n\t\t\t\t\t\t:headers=\"`app-table-rowgroup-${bundle.id}`\"\n\t\t\t\t\t\t:app=\"app\"\n\t\t\t\t\t\t:category=\"category\" />\n\t\t\t\t</template>\n\t\t\t</table>\n\t\t\t<ul v-if=\"useAppStoreView\" class=\"apps-list__store-container\">\n\t\t\t\t<AppItem v-for=\"app in apps\"\n\t\t\t\t\t:key=\"app.id\"\n\t\t\t\t\t:app=\"app\"\n\t\t\t\t\t:category=\"category\"\n\t\t\t\t\t:list-view=\"false\" />\n\t\t\t</ul>\n\t\t</div>\n\n\t\t<div id=\"apps-list-search\" class=\"apps-list apps-list--list-view\">\n\t\t\t<div class=\"apps-list__list-container\">\n\t\t\t\t<table v-if=\"search !== '' && searchApps.length > 0\" class=\"apps-list__list-container\">\n\t\t\t\t\t<caption class=\"apps-list__bundle-header\">\n\t\t\t\t\t\t{{ t('settings', 'Results from other categories') }}\n\t\t\t\t\t</caption>\n\t\t\t\t\t<tr key=\"app-list-view-header\">\n\t\t\t\t\t\t<th>\n\t\t\t\t\t\t\t<span class=\"hidden-visually\">{{ t('settings', 'Icon') }}</span>\n\t\t\t\t\t\t</th>\n\t\t\t\t\t\t<th>\n\t\t\t\t\t\t\t<span class=\"hidden-visually\">{{ t('settings', 'Name') }}</span>\n\t\t\t\t\t\t</th>\n\t\t\t\t\t\t<th>\n\t\t\t\t\t\t\t<span class=\"hidden-visually\">{{ t('settings', 'Version') }}</span>\n\t\t\t\t\t\t</th>\n\t\t\t\t\t\t<th>\n\t\t\t\t\t\t\t<span class=\"hidden-visually\">{{ t('settings', 'Level') }}</span>\n\t\t\t\t\t\t</th>\n\t\t\t\t\t\t<th>\n\t\t\t\t\t\t\t<span class=\"hidden-visually\">{{ t('settings', 'Actions') }}</span>\n\t\t\t\t\t\t</th>\n\t\t\t\t\t</tr>\n\t\t\t\t\t<AppItem v-for=\"app in searchApps\"\n\t\t\t\t\t\t:key=\"app.id\"\n\t\t\t\t\t\t:app=\"app\"\n\t\t\t\t\t\t:category=\"category\" />\n\t\t\t\t</table>\n\t\t\t</div>\n\t\t</div>\n\n\t\t<div v-if=\"search !== '' && !loading && searchApps.length === 0 && apps.length === 0\" id=\"apps-list-empty\" class=\"emptycontent emptycontent-search\">\n\t\t\t<div id=\"app-list-empty-icon\" class=\"icon-settings-dark\" />\n\t\t\t<h2>{{ t('settings', 'No apps found for your version') }}</h2>\n\t\t</div>\n\t</div>\n</template>\n\n<script>\nimport { subscribe, unsubscribe } from '@nextcloud/event-bus'\nimport AppItem from './AppList/AppItem.vue'\nimport pLimit from 'p-limit'\nimport NcButton from '@nextcloud/vue/dist/Components/NcButton.js'\n\nexport default {\n\tname: 'AppList',\n\tcomponents: {\n\t\tAppItem,\n\t\tNcButton,\n\t},\n\n\tprops: {\n\t\tcategory: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t},\n\t},\n\n\tdata() {\n\t\treturn {\n\t\t\tsearch: '',\n\t\t}\n\t},\n\tcomputed: {\n\t\tcounter() {\n\t\t\treturn this.apps.filter(app => app.update).length\n\t\t},\n\t\tloading() {\n\t\t\treturn this.$store.getters.loading('list')\n\t\t},\n\t\thasPendingUpdate() {\n\t\t\treturn this.apps.filter(app => app.update).length > 0\n\t\t},\n\t\tshowUpdateAll() {\n\t\t\treturn this.hasPendingUpdate && this.useListView\n\t\t},\n\t\tapps() {\n\t\t\tconst apps = this.$store.getters.getAllApps\n\t\t\t\t.filter(app => app.name.toLowerCase().search(this.search.toLowerCase()) !== -1)\n\t\t\t\t.sort(function(a, b) {\n\t\t\t\t\tconst sortStringA = '' + (a.active ? 0 : 1) + (a.update ? 0 : 1) + a.name\n\t\t\t\t\tconst sortStringB = '' + (b.active ? 0 : 1) + (b.update ? 0 : 1) + b.name\n\t\t\t\t\treturn OC.Util.naturalSortCompare(sortStringA, sortStringB)\n\t\t\t\t})\n\n\t\t\tif (this.category === 'installed') {\n\t\t\t\treturn apps.filter(app => app.installed)\n\t\t\t}\n\t\t\tif (this.category === 'enabled') {\n\t\t\t\treturn apps.filter(app => app.active && app.installed)\n\t\t\t}\n\t\t\tif (this.category === 'disabled') {\n\t\t\t\treturn apps.filter(app => !app.active && app.installed)\n\t\t\t}\n\t\t\tif (this.category === 'app-bundles') {\n\t\t\t\treturn apps.filter(app => app.bundles)\n\t\t\t}\n\t\t\tif (this.category === 'updates') {\n\t\t\t\treturn apps.filter(app => app.update)\n\t\t\t}\n\t\t\tif (this.category === 'supported') {\n\t\t\t\t// For customers of the Nextcloud GmbH the app level will be set to `300` for apps that are supported in their subscription\n\t\t\t\treturn apps.filter(app => app.level === 300)\n\t\t\t}\n\t\t\tif (this.category === 'featured') {\n\t\t\t\t// An app level of `200` will be set for apps featured on the app store\n\t\t\t\treturn apps.filter(app => app.level === 200)\n\t\t\t}\n\n\t\t\t// filter app store categories\n\t\t\treturn apps.filter(app => {\n\t\t\t\treturn app.appstore && app.category !== undefined\n\t\t\t\t\t&& (app.category === this.category || app.category.indexOf(this.category) > -1)\n\t\t\t})\n\t\t},\n\t\tbundles() {\n\t\t\treturn this.$store.getters.getAppBundles.filter(bundle => this.bundleApps(bundle.id).length > 0)\n\t\t},\n\t\tbundleApps() {\n\t\t\treturn function(bundle) {\n\t\t\t\treturn this.$store.getters.getAllApps\n\t\t\t\t\t.filter(app => {\n\t\t\t\t\t\treturn app.bundleIds !== undefined && app.bundleIds.includes(bundle)\n\t\t\t\t\t})\n\t\t\t}\n\t\t},\n\t\tsearchApps() {\n\t\t\tif (this.search === '') {\n\t\t\t\treturn []\n\t\t\t}\n\t\t\treturn this.$store.getters.getAllApps\n\t\t\t\t.filter(app => {\n\t\t\t\t\tif (app.name.toLowerCase().search(this.search.toLowerCase()) !== -1) {\n\t\t\t\t\t\treturn (!this.apps.find(_app => _app.id === app.id))\n\t\t\t\t\t}\n\t\t\t\t\treturn false\n\t\t\t\t})\n\t\t},\n\t\tuseAppStoreView() {\n\t\t\treturn !this.useListView && !this.useBundleView\n\t\t},\n\t\tuseListView() {\n\t\t\treturn (this.category === 'installed' || this.category === 'enabled' || this.category === 'disabled' || this.category === 'updates' || this.category === 'featured' || this.category === 'supported')\n\t\t},\n\t\tuseBundleView() {\n\t\t\treturn (this.category === 'app-bundles')\n\t\t},\n\t\tallBundlesEnabled() {\n\t\t\treturn (id) => {\n\t\t\t\treturn this.bundleApps(id).filter(app => !app.active).length === 0\n\t\t\t}\n\t\t},\n\t\tbundleToggleText() {\n\t\t\treturn (id) => {\n\t\t\t\tif (this.allBundlesEnabled(id)) {\n\t\t\t\t\treturn t('settings', 'Disable all')\n\t\t\t\t}\n\t\t\t\treturn t('settings', 'Download and enable all')\n\t\t\t}\n\t\t},\n\t},\n\n\tbeforeDestroy() {\n\t\tunsubscribe('nextcloud:unified-search.search', this.setSearch)\n\t\tunsubscribe('nextcloud:unified-search.reset', this.resetSearch)\n\t},\n\n\tmounted() {\n\t\tsubscribe('nextcloud:unified-search.search', this.setSearch)\n\t\tsubscribe('nextcloud:unified-search.reset', this.resetSearch)\n\t},\n\n\tmethods: {\n\t\tsetSearch({ query }) {\n\t\t\tthis.search = query\n\t\t},\n\t\tresetSearch() {\n\t\t\tthis.search = ''\n\t\t},\n\t\ttoggleBundle(id) {\n\t\t\tif (this.allBundlesEnabled(id)) {\n\t\t\t\treturn this.disableBundle(id)\n\t\t\t}\n\t\t\treturn this.enableBundle(id)\n\t\t},\n\t\tenableBundle(id) {\n\t\t\tconst apps = this.bundleApps(id).map(app => app.id)\n\t\t\tthis.$store.dispatch('enableApp', { appId: apps, groups: [] })\n\t\t\t\t.catch((error) => {\n\t\t\t\t\tconsole.error(error)\n\t\t\t\t\tOC.Notification.show(error)\n\t\t\t\t})\n\t\t},\n\t\tdisableBundle(id) {\n\t\t\tconst apps = this.bundleApps(id).map(app => app.id)\n\t\t\tthis.$store.dispatch('disableApp', { appId: apps, groups: [] })\n\t\t\t\t.catch((error) => {\n\t\t\t\t\tOC.Notification.show(error)\n\t\t\t\t})\n\t\t},\n\t\tupdateAll() {\n\t\t\tconst limit = pLimit(1)\n\t\t\tthis.apps\n\t\t\t\t.filter(app => app.update)\n\t\t\t\t.map(app => limit(() => this.$store.dispatch('updateApp', { appId: app.id })),\n\t\t\t\t)\n\t\t},\n\t},\n}\n</script>\n\n<style lang=\"scss\" scoped>\n$toolbar-padding: 8px;\n$toolbar-height: 44px + $toolbar-padding * 2;\n\n.apps-list {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\talign-content: flex-start;\n\n\t// For transition group\n\t&--move {\n\t\ttransition: transform 1s;\n\t}\n\n\t#app-list-update-all {\n\t\tmargin-inline-start: 10px;\n\t}\n\n\t&__toolbar {\n\t\theight: $toolbar-height;\n\t\tpadding: $toolbar-padding;\n\t\t// Leave room for app-navigation-toggle\n\t\tpadding-inline-start: $toolbar-height;\n\t\twidth: 100%;\n\t\tbackground-color: var(--color-main-background);\n\t\tposition: sticky;\n\t\ttop: 0;\n\t\tz-index: 1;\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t}\n\n\t&--list-view {\n\t\tmargin-bottom: 100px;\n\t\t// For positioning link overlay on rows\n\t\tposition: relative;\n\t}\n\n\t&__list-container {\n\t\twidth: 100%;\n\t}\n\n\t&__store-container {\n\t\tdisplay: flex;\n\t\tflex-wrap: wrap;\n\t}\n\n\t&__bundle-heading {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tmargin-block: 20px;\n\t\tmargin-inline: 0 10px;\n\t}\n\n\t&__bundle-header {\n\t\tmargin-block: 0;\n\t\tmargin-inline: 50px 10px;\n\t\tfont-weight: bold;\n\t\tfont-size: 20px;\n\t\tline-height: 30px;\n\t\tcolor: var(--color-text-light);\n\t}\n}\n\n#apps-list-search {\n\t.app-item {\n\t\th2 {\n\t\t\tmargin-bottom: 0;\n\t\t}\n\t}\n}\n</style>\n","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppList.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppList.vue?vue&type=script&lang=js\"","\n import API from \"!../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppList.vue?vue&type=style&index=0&id=5cf3c7a8&prod&lang=scss&scoped=true\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppList.vue?vue&type=style&index=0&id=5cf3c7a8&prod&lang=scss&scoped=true\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./AppList.vue?vue&type=template&id=5cf3c7a8&scoped=true\"\nimport script from \"./AppList.vue?vue&type=script&lang=js\"\nexport * from \"./AppList.vue?vue&type=script&lang=js\"\nimport style0 from \"./AppList.vue?vue&type=style&index=0&id=5cf3c7a8&prod&lang=scss&scoped=true\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"5cf3c7a8\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{attrs:{\"id\":\"app-content-inner\"}},[_c('div',{staticClass:\"apps-list\",class:{\n\t\t\t'apps-list--list-view': (_vm.useBundleView || _vm.useListView),\n\t\t\t'apps-list--store-view': _vm.useAppStoreView,\n\t\t},attrs:{\"id\":\"apps-list\"}},[(_vm.useListView)?[(_vm.showUpdateAll)?_c('div',{staticClass:\"apps-list__toolbar\"},[_vm._v(\"\\n\\t\\t\\t\\t\"+_vm._s(_vm.n('settings', '%n app has an update available', '%n apps have an update available', _vm.counter))+\"\\n\\t\\t\\t\\t\"),(_vm.showUpdateAll)?_c('NcButton',{attrs:{\"id\":\"app-list-update-all\",\"type\":\"primary\"},on:{\"click\":_vm.updateAll}},[_vm._v(\"\\n\\t\\t\\t\\t\\t\"+_vm._s(_vm.n('settings', 'Update', 'Update all', _vm.counter))+\"\\n\\t\\t\\t\\t\")]):_vm._e()],1):_vm._e(),_vm._v(\" \"),(!_vm.showUpdateAll)?_c('div',{staticClass:\"apps-list__toolbar\"},[_vm._v(\"\\n\\t\\t\\t\\t\"+_vm._s(_vm.t('settings', 'All apps are up-to-date.'))+\"\\n\\t\\t\\t\")]):_vm._e(),_vm._v(\" \"),_c('TransitionGroup',{staticClass:\"apps-list__list-container\",attrs:{\"name\":\"apps-list\",\"tag\":\"table\"}},[_c('tr',{key:\"app-list-view-header\"},[_c('th',[_c('span',{staticClass:\"hidden-visually\"},[_vm._v(_vm._s(_vm.t('settings', 'Icon')))])]),_vm._v(\" \"),_c('th',[_c('span',{staticClass:\"hidden-visually\"},[_vm._v(_vm._s(_vm.t('settings', 'Name')))])]),_vm._v(\" \"),_c('th',[_c('span',{staticClass:\"hidden-visually\"},[_vm._v(_vm._s(_vm.t('settings', 'Version')))])]),_vm._v(\" \"),_c('th',[_c('span',{staticClass:\"hidden-visually\"},[_vm._v(_vm._s(_vm.t('settings', 'Level')))])]),_vm._v(\" \"),_c('th',[_c('span',{staticClass:\"hidden-visually\"},[_vm._v(_vm._s(_vm.t('settings', 'Actions')))])])]),_vm._v(\" \"),_vm._l((_vm.apps),function(app){return _c('AppItem',{key:app.id,attrs:{\"app\":app,\"category\":_vm.category}})})],2)]:_vm._e(),_vm._v(\" \"),(_vm.useBundleView)?_c('table',{staticClass:\"apps-list__list-container\"},[_c('tr',{key:\"app-list-view-header\"},[_c('th',{attrs:{\"id\":\"app-table-col-icon\"}},[_c('span',{staticClass:\"hidden-visually\"},[_vm._v(_vm._s(_vm.t('settings', 'Icon')))])]),_vm._v(\" \"),_c('th',{attrs:{\"id\":\"app-table-col-name\"}},[_c('span',{staticClass:\"hidden-visually\"},[_vm._v(_vm._s(_vm.t('settings', 'Name')))])]),_vm._v(\" \"),_c('th',{attrs:{\"id\":\"app-table-col-version\"}},[_c('span',{staticClass:\"hidden-visually\"},[_vm._v(_vm._s(_vm.t('settings', 'Version')))])]),_vm._v(\" \"),_c('th',{attrs:{\"id\":\"app-table-col-level\"}},[_c('span',{staticClass:\"hidden-visually\"},[_vm._v(_vm._s(_vm.t('settings', 'Level')))])]),_vm._v(\" \"),_c('th',{attrs:{\"id\":\"app-table-col-actions\"}},[_c('span',{staticClass:\"hidden-visually\"},[_vm._v(_vm._s(_vm.t('settings', 'Actions')))])])]),_vm._v(\" \"),_vm._l((_vm.bundles),function(bundle){return [_c('tr',{key:bundle.id},[_c('th',{attrs:{\"id\":`app-table-rowgroup-${bundle.id}`,\"colspan\":\"5\",\"scope\":\"rowgroup\"}},[_c('div',{staticClass:\"apps-list__bundle-heading\"},[_c('span',{staticClass:\"apps-list__bundle-header\"},[_vm._v(\"\\n\\t\\t\\t\\t\\t\\t\\t\\t\"+_vm._s(bundle.name)+\"\\n\\t\\t\\t\\t\\t\\t\\t\")]),_vm._v(\" \"),_c('NcButton',{attrs:{\"type\":\"secondary\"},on:{\"click\":function($event){return _vm.toggleBundle(bundle.id)}}},[_vm._v(\"\\n\\t\\t\\t\\t\\t\\t\\t\\t\"+_vm._s(_vm.t('settings', _vm.bundleToggleText(bundle.id)))+\"\\n\\t\\t\\t\\t\\t\\t\\t\")])],1)])]),_vm._v(\" \"),_vm._l((_vm.bundleApps(bundle.id)),function(app){return _c('AppItem',{key:bundle.id + app.id,attrs:{\"use-bundle-view\":true,\"headers\":`app-table-rowgroup-${bundle.id}`,\"app\":app,\"category\":_vm.category}})})]})],2):_vm._e(),_vm._v(\" \"),(_vm.useAppStoreView)?_c('ul',{staticClass:\"apps-list__store-container\"},_vm._l((_vm.apps),function(app){return _c('AppItem',{key:app.id,attrs:{\"app\":app,\"category\":_vm.category,\"list-view\":false}})}),1):_vm._e()],2),_vm._v(\" \"),_c('div',{staticClass:\"apps-list apps-list--list-view\",attrs:{\"id\":\"apps-list-search\"}},[_c('div',{staticClass:\"apps-list__list-container\"},[(_vm.search !== '' && _vm.searchApps.length > 0)?_c('table',{staticClass:\"apps-list__list-container\"},[_c('caption',{staticClass:\"apps-list__bundle-header\"},[_vm._v(\"\\n\\t\\t\\t\\t\\t\"+_vm._s(_vm.t('settings', 'Results from other categories'))+\"\\n\\t\\t\\t\\t\")]),_vm._v(\" \"),_c('tr',{key:\"app-list-view-header\"},[_c('th',[_c('span',{staticClass:\"hidden-visually\"},[_vm._v(_vm._s(_vm.t('settings', 'Icon')))])]),_vm._v(\" \"),_c('th',[_c('span',{staticClass:\"hidden-visually\"},[_vm._v(_vm._s(_vm.t('settings', 'Name')))])]),_vm._v(\" \"),_c('th',[_c('span',{staticClass:\"hidden-visually\"},[_vm._v(_vm._s(_vm.t('settings', 'Version')))])]),_vm._v(\" \"),_c('th',[_c('span',{staticClass:\"hidden-visually\"},[_vm._v(_vm._s(_vm.t('settings', 'Level')))])]),_vm._v(\" \"),_c('th',[_c('span',{staticClass:\"hidden-visually\"},[_vm._v(_vm._s(_vm.t('settings', 'Actions')))])])]),_vm._v(\" \"),_vm._l((_vm.searchApps),function(app){return _c('AppItem',{key:app.id,attrs:{\"app\":app,\"category\":_vm.category}})})],2):_vm._e()])]),_vm._v(\" \"),(_vm.search !== '' && !_vm.loading && _vm.searchApps.length === 0 && _vm.apps.length === 0)?_c('div',{staticClass:\"emptycontent emptycontent-search\",attrs:{\"id\":\"apps-list-empty\"}},[_c('div',{staticClass:\"icon-settings-dark\",attrs:{\"id\":\"app-list-empty-icon\"}}),_vm._v(\" \"),_c('h2',[_vm._v(_vm._s(_vm.t('settings', 'No apps found for your version')))])]):_vm._e()])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c,_setup=_vm._self._setupProxy;return _c('div',{staticClass:\"app-discover\"},[(_setup.hasError)?_c(_setup.NcEmptyContent,{attrs:{\"name\":_setup.t('settings', 'Nothing to show'),\"description\":_setup.t('settings', 'Could not load section content from app store.')},scopedSlots:_vm._u([{key:\"icon\",fn:function(){return [_c(_setup.NcIconSvgWrapper,{attrs:{\"path\":_setup.mdiEyeOff,\"size\":64}})]},proxy:true}],null,false,638098482)}):(_setup.elements.length === 0)?_c(_setup.NcEmptyContent,{attrs:{\"name\":_setup.t('settings', 'Loading'),\"description\":_setup.t('settings', 'Fetching the latest news…')},scopedSlots:_vm._u([{key:\"icon\",fn:function(){return [_c(_setup.NcLoadingIcon,{attrs:{\"size\":64}})]},proxy:true}])}):_vm._l((_setup.elements),function(entry,index){return _c(_setup.getComponent(entry.type),_vm._b({key:entry.id ?? index,tag:\"component\"},'component',entry,false))})],2)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","/**\n * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n/**\n * Helper to transform the JSON API results to proper frontend objects (app discover section elements)\n *\n * @param element The JSON API element to transform\n */\nexport const parseApiResponse = (element) => {\n const appElement = { ...element };\n if (appElement.date) {\n appElement.date = Date.parse(appElement.date);\n }\n if (appElement.expiryDate) {\n appElement.expiryDate = Date.parse(appElement.expiryDate);\n }\n if (appElement.type === 'post') {\n return appElement;\n }\n else if (appElement.type === 'showcase') {\n return appElement;\n }\n else if (appElement.type === 'carousel') {\n return appElement;\n }\n throw new Error(`Invalid argument, app discover element with type ${element.type ?? 'unknown'} is unknown`);\n};\n/**\n * Filter outdated or upcoming elements\n * @param element Element to check\n */\nexport const filterElements = (element) => {\n const now = Date.now();\n // Element not yet published\n if (element.date && element.date > now) {\n return false;\n }\n // Element expired\n if (element.expiryDate && element.expiryDate < now) {\n return false;\n }\n return true;\n};\n","import mod from \"-!../../../../../node_modules/babel-loader/lib/index.js!../../../../../node_modules/ts-loader/index.js??clonedRuleSet-4.use[1]!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppStoreDiscoverSection.vue?vue&type=script&setup=true&lang=ts\"; export default mod; export * from \"-!../../../../../node_modules/babel-loader/lib/index.js!../../../../../node_modules/ts-loader/index.js??clonedRuleSet-4.use[1]!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppStoreDiscoverSection.vue?vue&type=script&setup=true&lang=ts\"","\n import API from \"!../../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../../node_modules/css-loader/dist/cjs.js!../../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../node_modules/sass-loader/dist/cjs.js!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppStoreDiscoverSection.vue?vue&type=style&index=0&id=bb597eea&prod&scoped=true&lang=scss\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../../node_modules/css-loader/dist/cjs.js!../../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../node_modules/sass-loader/dist/cjs.js!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppStoreDiscoverSection.vue?vue&type=style&index=0&id=bb597eea&prod&scoped=true&lang=scss\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./AppStoreDiscoverSection.vue?vue&type=template&id=bb597eea&scoped=true\"\nimport script from \"./AppStoreDiscoverSection.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./AppStoreDiscoverSection.vue?vue&type=script&setup=true&lang=ts\"\nimport style0 from \"./AppStoreDiscoverSection.vue?vue&type=style&index=0&id=bb597eea&prod&scoped=true&lang=scss\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"bb597eea\",\n null\n \n)\n\nexport default component.exports","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/ts-loader/index.js??clonedRuleSet-4.use[1]!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppStore.vue?vue&type=script&setup=true&lang=ts\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/ts-loader/index.js??clonedRuleSet-4.use[1]!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppStore.vue?vue&type=script&setup=true&lang=ts\"","\n import API from \"!../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppStore.vue?vue&type=style&index=0&id=f9073bbe&prod&scoped=true&lang=css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppStore.vue?vue&type=style&index=0&id=f9073bbe&prod&scoped=true&lang=css\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./AppStore.vue?vue&type=template&id=f9073bbe&scoped=true\"\nimport script from \"./AppStore.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./AppStore.vue?vue&type=script&setup=true&lang=ts\"\nimport style0 from \"./AppStore.vue?vue&type=style&index=0&id=f9073bbe&prod&scoped=true&lang=css\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"f9073bbe\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c,_setup=_vm._self._setupProxy;return _c(_setup.NcAppNavigation,{attrs:{\"aria-label\":_setup.t('settings', 'Apps')},scopedSlots:_vm._u([{key:\"list\",fn:function(){return [(_setup.appstoreEnabled)?_c(_setup.NcAppNavigationItem,{attrs:{\"id\":\"app-category-discover\",\"to\":{ name: 'apps-category', params: { category: 'discover'} },\"name\":_setup.APPS_SECTION_ENUM.discover},scopedSlots:_vm._u([{key:\"icon\",fn:function(){return [_c(_setup.NcIconSvgWrapper,{attrs:{\"path\":_setup.APPSTORE_CATEGORY_ICONS.discover}})]},proxy:true}],null,false,1397544286)}):_vm._e(),_vm._v(\" \"),_c(_setup.NcAppNavigationItem,{attrs:{\"id\":\"app-category-installed\",\"to\":{ name: 'apps-category', params: { category: 'installed'} },\"name\":_setup.APPS_SECTION_ENUM.installed},scopedSlots:_vm._u([{key:\"icon\",fn:function(){return [_c(_setup.NcIconSvgWrapper,{attrs:{\"path\":_setup.APPSTORE_CATEGORY_ICONS.installed}})]},proxy:true}])}),_vm._v(\" \"),_c(_setup.NcAppNavigationItem,{attrs:{\"id\":\"app-category-enabled\",\"to\":{ name: 'apps-category', params: { category: 'enabled' } },\"name\":_setup.APPS_SECTION_ENUM.enabled},scopedSlots:_vm._u([{key:\"icon\",fn:function(){return [_c(_setup.NcIconSvgWrapper,{attrs:{\"path\":_setup.APPSTORE_CATEGORY_ICONS.enabled}})]},proxy:true}])}),_vm._v(\" \"),_c(_setup.NcAppNavigationItem,{attrs:{\"id\":\"app-category-disabled\",\"to\":{ name: 'apps-category', params: { category: 'disabled' } },\"name\":_setup.APPS_SECTION_ENUM.disabled},scopedSlots:_vm._u([{key:\"icon\",fn:function(){return [_c(_setup.NcIconSvgWrapper,{attrs:{\"path\":_setup.APPSTORE_CATEGORY_ICONS.disabled}})]},proxy:true}])}),_vm._v(\" \"),(_setup.updateCount > 0)?_c(_setup.NcAppNavigationItem,{attrs:{\"id\":\"app-category-updates\",\"to\":{ name: 'apps-category', params: { category: 'updates' } },\"name\":_setup.APPS_SECTION_ENUM.updates},scopedSlots:_vm._u([{key:\"counter\",fn:function(){return [_c(_setup.NcCounterBubble,[_vm._v(_vm._s(_setup.updateCount))])]},proxy:true},{key:\"icon\",fn:function(){return [_c(_setup.NcIconSvgWrapper,{attrs:{\"path\":_setup.APPSTORE_CATEGORY_ICONS.updates}})]},proxy:true}],null,false,2824895104)}):_vm._e(),_vm._v(\" \"),_c(_setup.NcAppNavigationItem,{attrs:{\"id\":\"app-category-your-bundles\",\"to\":{ name: 'apps-category', params: { category: 'app-bundles' } },\"name\":_setup.APPS_SECTION_ENUM['app-bundles']},scopedSlots:_vm._u([{key:\"icon\",fn:function(){return [_c(_setup.NcIconSvgWrapper,{attrs:{\"path\":_setup.APPSTORE_CATEGORY_ICONS.bundles}})]},proxy:true}])}),_vm._v(\" \"),_c(_setup.NcAppNavigationSpacer),_vm._v(\" \"),(_setup.appstoreEnabled && _setup.categoriesLoading)?_c('li',{staticClass:\"categories--loading\"},[_c(_setup.NcLoadingIcon,{attrs:{\"size\":20,\"aria-label\":_setup.t('settings', 'Loading categories')}})],1):(_setup.appstoreEnabled && !_setup.categoriesLoading)?[(_setup.isSubscribed)?_c(_setup.NcAppNavigationItem,{attrs:{\"id\":\"app-category-supported\",\"to\":{ name: 'apps-category', params: { category: 'supported' } },\"name\":_setup.APPS_SECTION_ENUM.supported},scopedSlots:_vm._u([{key:\"icon\",fn:function(){return [_c(_setup.NcIconSvgWrapper,{attrs:{\"path\":_setup.APPSTORE_CATEGORY_ICONS.supported}})]},proxy:true}],null,false,613663011)}):_vm._e(),_vm._v(\" \"),_c(_setup.NcAppNavigationItem,{attrs:{\"id\":\"app-category-featured\",\"to\":{ name: 'apps-category', params: { category: 'featured' } },\"name\":_setup.APPS_SECTION_ENUM.featured},scopedSlots:_vm._u([{key:\"icon\",fn:function(){return [_c(_setup.NcIconSvgWrapper,{attrs:{\"path\":_setup.APPSTORE_CATEGORY_ICONS.featured}})]},proxy:true}])}),_vm._v(\" \"),_vm._l((_setup.categories),function(category){return _c(_setup.NcAppNavigationItem,{key:category.id,attrs:{\"id\":`app-category-${category.id}`,\"name\":category.displayName,\"to\":{\n\t\t\t\t\tname: 'apps-category',\n\t\t\t\t\tparams: { category: category.id },\n\t\t\t\t}},scopedSlots:_vm._u([{key:\"icon\",fn:function(){return [_c(_setup.NcIconSvgWrapper,{attrs:{\"path\":category.icon}})]},proxy:true}],null,true)})})]:_vm._e(),_vm._v(\" \"),_c(_setup.NcAppNavigationItem,{attrs:{\"id\":\"app-developer-docs\",\"name\":_setup.t('settings', 'Developer documentation ↗'),\"href\":_setup.developerDocsUrl}})]},proxy:true}])})\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/ts-loader/index.js??clonedRuleSet-4.use[1]!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppStoreNavigation.vue?vue&type=script&setup=true&lang=ts\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/ts-loader/index.js??clonedRuleSet-4.use[1]!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppStoreNavigation.vue?vue&type=script&setup=true&lang=ts\"","\n import API from \"!../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppStoreNavigation.vue?vue&type=style&index=0&id=26201909&prod&scoped=true&lang=css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppStoreNavigation.vue?vue&type=style&index=0&id=26201909&prod&scoped=true&lang=css\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./AppStoreNavigation.vue?vue&type=template&id=26201909&scoped=true\"\nimport script from \"./AppStoreNavigation.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./AppStoreNavigation.vue?vue&type=script&setup=true&lang=ts\"\nimport style0 from \"./AppStoreNavigation.vue?vue&type=style&index=0&id=26201909&prod&scoped=true&lang=css\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"26201909\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c,_setup=_vm._self._setupProxy;return (_setup.showSidebar)?_c(_setup.NcAppSidebar,{staticClass:\"app-sidebar\",class:{ 'app-sidebar--with-screenshot': _setup.hasScreenshot },attrs:{\"active\":_setup.activeTab,\"background\":_setup.hasScreenshot ? _setup.app.screenshot : undefined,\"compact\":!_setup.hasScreenshot,\"name\":_setup.app.name,\"title\":_setup.app.name,\"subname\":_setup.licenseText,\"subtitle\":_setup.licenseText},on:{\"update:active\":function($event){_setup.activeTab=$event},\"close\":_setup.hideAppDetails},scopedSlots:_vm._u([(!_setup.hasScreenshot)?{key:\"header\",fn:function(){return [_c(_setup.NcIconSvgWrapper,{staticClass:\"app-sidebar__fallback-icon\",attrs:{\"svg\":_setup.appIcon ?? '',\"size\":64}})]},proxy:true}:null,{key:\"description\",fn:function(){return [_c('div',{staticClass:\"app-sidebar__badges\"},[_c(_setup.AppLevelBadge,{attrs:{\"level\":_setup.app.level}}),_vm._v(\" \"),(_setup.hasRating)?_c(_setup.AppScore,{attrs:{\"score\":_setup.rating}}):_vm._e()],1)]},proxy:true}],null,true)},[_vm._v(\" \"),_vm._v(\" \"),_c(_setup.AppDescriptionTab,{attrs:{\"app\":_setup.app}}),_vm._v(\" \"),_c(_setup.AppDetailsTab,{attrs:{\"app\":_setup.app}}),_vm._v(\" \"),_c(_setup.AppReleasesTab,{attrs:{\"app\":_setup.app}})],1):_vm._e()\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<!--\n - SPDX-FileCopyrightText: 2020 Nextcloud GmbH and Nextcloud contributors\n - SPDX-License-Identifier: AGPL-3.0-or-later\n-->\n\n<template>\n\t<div class=\"settings-markdown\" v-html=\"renderMarkdown\" />\n</template>\n\n<script>\nimport { marked } from 'marked'\nimport dompurify from 'dompurify'\n\nexport default {\n\tname: 'Markdown',\n\tprops: {\n\t\ttext: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\t\tminHeading: {\n\t\t\ttype: Number,\n\t\t\tdefault: 1,\n\t\t},\n\t},\n\tcomputed: {\n\t\trenderMarkdown() {\n\t\t\tconst renderer = new marked.Renderer()\n\t\t\trenderer.link = function(href, title, text) {\n\t\t\t\tlet prot\n\t\t\t\ttry {\n\t\t\t\t\tprot = decodeURIComponent(unescape(href))\n\t\t\t\t\t\t.replace(/[^\\w:]/g, '')\n\t\t\t\t\t\t.toLowerCase()\n\t\t\t\t} catch (e) {\n\t\t\t\t\treturn ''\n\t\t\t\t}\n\n\t\t\t\tif (prot.indexOf('http:') !== 0 && prot.indexOf('https:') !== 0) {\n\t\t\t\t\treturn ''\n\t\t\t\t}\n\n\t\t\t\tlet out = '<a href=\"' + href + '\" rel=\"noreferrer noopener\"'\n\t\t\t\tif (title) {\n\t\t\t\t\tout += ' title=\"' + title + '\"'\n\t\t\t\t}\n\t\t\t\tout += '>' + text + '</a>'\n\t\t\t\treturn out\n\t\t\t}\n\t\t\trenderer.heading = (text, level) => {\n\t\t\t\tlevel = Math.min(6, level + (this.minHeading - 1))\n\t\t\t\treturn `<h${level}>${text}</h${level}>`\n\t\t\t}\n\t\t\trenderer.image = function(href, title, text) {\n\t\t\t\tif (text) {\n\t\t\t\t\treturn text\n\t\t\t\t}\n\t\t\t\treturn title\n\t\t\t}\n\t\t\trenderer.blockquote = function(quote) {\n\t\t\t\treturn quote\n\t\t\t}\n\t\t\treturn dompurify.sanitize(\n\t\t\t\tmarked(this.text.trim(), {\n\t\t\t\t\trenderer,\n\t\t\t\t\tgfm: false,\n\t\t\t\t\thighlight: false,\n\t\t\t\t\ttables: false,\n\t\t\t\t\tbreaks: false,\n\t\t\t\t\tpedantic: false,\n\t\t\t\t\tsanitize: true,\n\t\t\t\t\tsmartLists: true,\n\t\t\t\t\tsmartypants: false,\n\t\t\t\t}),\n\t\t\t\t{\n\t\t\t\t\tSAFE_FOR_JQUERY: true,\n\t\t\t\t\tALLOWED_TAGS: [\n\t\t\t\t\t\t'h1',\n\t\t\t\t\t\t'h2',\n\t\t\t\t\t\t'h3',\n\t\t\t\t\t\t'h4',\n\t\t\t\t\t\t'h5',\n\t\t\t\t\t\t'h6',\n\t\t\t\t\t\t'strong',\n\t\t\t\t\t\t'p',\n\t\t\t\t\t\t'a',\n\t\t\t\t\t\t'ul',\n\t\t\t\t\t\t'ol',\n\t\t\t\t\t\t'li',\n\t\t\t\t\t\t'em',\n\t\t\t\t\t\t'del',\n\t\t\t\t\t\t'blockquote',\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t)\n\t\t},\n\t},\n}\n</script>\n\n<style scoped lang=\"scss\">\n\t.settings-markdown::v-deep {\n\n\th1,\n\th2,\n\th3,\n\th4,\n\th5,\n\th6 {\n\t\tfont-weight: 600;\n\t\tline-height: 120%;\n\t\tmargin-top: 24px;\n\t\tmargin-bottom: 12px;\n\t\tcolor: var(--color-main-text);\n\t}\n\n\th1 {\n\t\tfont-size: 36px;\n\t\tmargin-top: 48px;\n\t}\n\n\th2 {\n\t\tfont-size: 28px;\n\t\tmargin-top: 48px;\n\t}\n\n\th3 {\n\t\tfont-size: 24px;\n\t}\n\n\th4 {\n\t\tfont-size: 21px;\n\t}\n\n\th5 {\n\t\tfont-size: 17px;\n\t}\n\n\th6 {\n\t\tfont-size: var(--default-font-size);\n\t}\n\n\tpre {\n\t\twhite-space: pre;\n\t\toverflow-x: auto;\n\t\tbackground-color: var(--color-background-dark);\n\t\tborder-radius: var(--border-radius);\n\t\tpadding: 1em 1.3em;\n\t\tmargin-bottom: 1em;\n\t}\n\n\tp code {\n\t\tbackground-color: var(--color-background-dark);\n\t\tborder-radius: var(--border-radius);\n\t\tpadding: .1em .3em;\n\t}\n\n\tli {\n\t\tposition: relative;\n\t}\n\n\tul, ol {\n\t\tpadding-inline-start: 10px;\n\t\tmargin-inline-start: 10px;\n\t}\n\n\tul li {\n\t\tlist-style-type: disc;\n\t}\n\n\tul > li > ul > li {\n\t\tlist-style-type: circle;\n\t}\n\n\tul > li > ul > li ul li {\n\t\tlist-style-type: square;\n\t}\n\n\tblockquote {\n\t\tpadding-inline-start: 1em;\n\t\tborder-inline-start: 4px solid var(--color-primary-element);\n\t\tcolor: var(--color-text-maxcontrast);\n\t\tmargin-inline: 0;\n\t}\n\n\t}\n</style>\n","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Markdown.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Markdown.vue?vue&type=script&lang=js\"","\n import API from \"!../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Markdown.vue?vue&type=style&index=0&id=5d3cebad&prod&scoped=true&lang=scss\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Markdown.vue?vue&type=style&index=0&id=5d3cebad&prod&scoped=true&lang=scss\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./Markdown.vue?vue&type=template&id=5d3cebad&scoped=true\"\nimport script from \"./Markdown.vue?vue&type=script&lang=js\"\nexport * from \"./Markdown.vue?vue&type=script&lang=js\"\nimport style0 from \"./Markdown.vue?vue&type=style&index=0&id=5d3cebad&prod&scoped=true&lang=scss\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"5d3cebad\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"settings-markdown\",domProps:{\"innerHTML\":_vm._s(_vm.renderMarkdown)}})\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../../node_modules/babel-loader/lib/index.js!../../../../../node_modules/ts-loader/index.js??clonedRuleSet-4.use[1]!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppDescriptionTab.vue?vue&type=script&setup=true&lang=ts\"; export default mod; export * from \"-!../../../../../node_modules/babel-loader/lib/index.js!../../../../../node_modules/ts-loader/index.js??clonedRuleSet-4.use[1]!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppDescriptionTab.vue?vue&type=script&setup=true&lang=ts\"","var render = function render(){var _vm=this,_c=_vm._self._c,_setup=_vm._self._setupProxy;return _c(_setup.NcAppSidebarTab,{attrs:{\"id\":\"desc\",\"name\":_setup.t('settings', 'Description'),\"order\":0},scopedSlots:_vm._u([{key:\"icon\",fn:function(){return [_c(_setup.NcIconSvgWrapper,{attrs:{\"path\":_setup.mdiTextShort}})]},proxy:true}])},[_vm._v(\" \"),_c('div',{staticClass:\"app-description\"},[_c(_setup.Markdown,{attrs:{\"text\":_vm.app.description,\"min-heading\":4}})],1)])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n import API from \"!../../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../../node_modules/css-loader/dist/cjs.js!../../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../node_modules/sass-loader/dist/cjs.js!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppDescriptionTab.vue?vue&type=style&index=0&id=cf0a1ae6&prod&scoped=true&lang=scss\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../../node_modules/css-loader/dist/cjs.js!../../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../node_modules/sass-loader/dist/cjs.js!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppDescriptionTab.vue?vue&type=style&index=0&id=cf0a1ae6&prod&scoped=true&lang=scss\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./AppDescriptionTab.vue?vue&type=template&id=cf0a1ae6&scoped=true\"\nimport script from \"./AppDescriptionTab.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./AppDescriptionTab.vue?vue&type=script&setup=true&lang=ts\"\nimport style0 from \"./AppDescriptionTab.vue?vue&type=style&index=0&id=cf0a1ae6&prod&scoped=true&lang=scss\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"cf0a1ae6\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('NcAppSidebarTab',{attrs:{\"id\":\"details\",\"name\":_vm.t('settings', 'Details'),\"order\":1},scopedSlots:_vm._u([{key:\"icon\",fn:function(){return [_c('NcIconSvgWrapper',{attrs:{\"path\":_vm.mdiTextBox}})]},proxy:true}])},[_vm._v(\" \"),_c('div',{staticClass:\"app-details\"},[_c('div',{staticClass:\"app-details__actions\"},[(_vm.app.active && _vm.canLimitToGroups(_vm.app))?_c('div',{staticClass:\"app-details__actions-groups\"},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.groupCheckedAppsData),expression:\"groupCheckedAppsData\"}],staticClass:\"groups-enable__checkbox checkbox\",attrs:{\"id\":`groups_enable_${_vm.app.id}`,\"type\":\"checkbox\"},domProps:{\"value\":_vm.app.id,\"checked\":Array.isArray(_vm.groupCheckedAppsData)?_vm._i(_vm.groupCheckedAppsData,_vm.app.id)>-1:(_vm.groupCheckedAppsData)},on:{\"change\":[function($event){var $$a=_vm.groupCheckedAppsData,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=_vm.app.id,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.groupCheckedAppsData=$$a.concat([$$v]))}else{$$i>-1&&(_vm.groupCheckedAppsData=$$a.slice(0,$$i).concat($$a.slice($$i+1)))}}else{_vm.groupCheckedAppsData=$$c}},_vm.setGroupLimit]}}),_vm._v(\" \"),_c('label',{attrs:{\"for\":`groups_enable_${_vm.app.id}`}},[_vm._v(_vm._s(_vm.t('settings', 'Limit to groups')))]),_vm._v(\" \"),_c('input',{staticClass:\"group_select\",attrs:{\"type\":\"hidden\",\"title\":_vm.t('settings', 'All'),\"value\":\"\"}}),_vm._v(\" \"),_c('br'),_vm._v(\" \"),_c('label',{attrs:{\"for\":\"limitToGroups\"}},[_c('span',[_vm._v(_vm._s(_vm.t('settings', 'Limit app usage to groups')))])]),_vm._v(\" \"),(_vm.isLimitedToGroups(_vm.app))?_c('NcSelect',{attrs:{\"input-id\":\"limitToGroups\",\"options\":_vm.groups,\"value\":_vm.appGroups,\"limit\":5,\"label\":\"name\",\"multiple\":true,\"close-on-select\":false},on:{\"option:selected\":_vm.addGroupLimitation,\"option:deselected\":_vm.removeGroupLimitation,\"search\":_vm.asyncFindGroup}},[_c('span',{attrs:{\"slot\":\"noResult\"},slot:\"noResult\"},[_vm._v(_vm._s(_vm.t('settings', 'No results')))])]):_vm._e()],1):_vm._e(),_vm._v(\" \"),_c('div',{staticClass:\"app-details__actions-manage\"},[(_vm.app.update)?_c('input',{staticClass:\"update primary\",attrs:{\"type\":\"button\",\"value\":_vm.t('settings', 'Update to {version}', { version: _vm.app.update }),\"disabled\":_vm.installing || _vm.isLoading},on:{\"click\":function($event){return _vm.update(_vm.app.id)}}}):_vm._e(),_vm._v(\" \"),(_vm.app.canUnInstall)?_c('input',{staticClass:\"uninstall\",attrs:{\"type\":\"button\",\"value\":_vm.t('settings', 'Remove'),\"disabled\":_vm.installing || _vm.isLoading},on:{\"click\":function($event){return _vm.remove(_vm.app.id)}}}):_vm._e(),_vm._v(\" \"),(_vm.app.active)?_c('input',{staticClass:\"enable\",attrs:{\"type\":\"button\",\"value\":_vm.t('settings','Disable'),\"disabled\":_vm.installing || _vm.isLoading},on:{\"click\":function($event){return _vm.disable(_vm.app.id)}}}):_vm._e(),_vm._v(\" \"),(!_vm.app.active && (_vm.app.canInstall || _vm.app.isCompatible))?_c('input',{staticClass:\"enable primary\",attrs:{\"title\":_vm.enableButtonTooltip,\"aria-label\":_vm.enableButtonTooltip,\"type\":\"button\",\"value\":_vm.enableButtonText,\"disabled\":!_vm.app.canInstall || _vm.installing || _vm.isLoading},on:{\"click\":function($event){return _vm.enable(_vm.app.id)}}}):(!_vm.app.active && !_vm.app.canInstall)?_c('input',{staticClass:\"enable force\",attrs:{\"title\":_vm.forceEnableButtonTooltip,\"aria-label\":_vm.forceEnableButtonTooltip,\"type\":\"button\",\"value\":_vm.forceEnableButtonText,\"disabled\":_vm.installing || _vm.isLoading},on:{\"click\":function($event){return _vm.forceEnable(_vm.app.id)}}}):_vm._e()])]),_vm._v(\" \"),_c('ul',{staticClass:\"app-details__dependencies\"},[(_vm.app.missingMinOwnCloudVersion)?_c('li',[_vm._v(\"\\n\\t\\t\\t\\t\"+_vm._s(_vm.t('settings', 'This app has no minimum Nextcloud version assigned. This will be an error in the future.'))+\"\\n\\t\\t\\t\")]):_vm._e(),_vm._v(\" \"),(_vm.app.missingMaxOwnCloudVersion)?_c('li',[_vm._v(\"\\n\\t\\t\\t\\t\"+_vm._s(_vm.t('settings', 'This app has no maximum Nextcloud version assigned. This will be an error in the future.'))+\"\\n\\t\\t\\t\")]):_vm._e(),_vm._v(\" \"),(!_vm.app.canInstall)?_c('li',[_vm._v(\"\\n\\t\\t\\t\\t\"+_vm._s(_vm.t('settings', 'This app cannot be installed because the following dependencies are not fulfilled:'))+\"\\n\\t\\t\\t\\t\"),_c('ul',{staticClass:\"missing-dependencies\"},_vm._l((_vm.app.missingDependencies),function(dep,index){return _c('li',{key:index},[_vm._v(\"\\n\\t\\t\\t\\t\\t\\t\"+_vm._s(dep)+\"\\n\\t\\t\\t\\t\\t\")])}),0)]):_vm._e()]),_vm._v(\" \"),(_vm.lastModified)?_c('div',{staticClass:\"app-details__section\"},[_c('h4',[_vm._v(\"\\n\\t\\t\\t\\t\"+_vm._s(_vm.t('settings', 'Latest updated'))+\"\\n\\t\\t\\t\")]),_vm._v(\" \"),_c('NcDateTime',{attrs:{\"timestamp\":_vm.lastModified}})],1):_vm._e(),_vm._v(\" \"),_c('div',{staticClass:\"app-details__section\"},[_c('h4',[_vm._v(\"\\n\\t\\t\\t\\t\"+_vm._s(_vm.t('settings', 'Author'))+\"\\n\\t\\t\\t\")]),_vm._v(\" \"),_c('p',{staticClass:\"app-details__authors\"},[_vm._v(\"\\n\\t\\t\\t\\t\"+_vm._s(_vm.appAuthors)+\"\\n\\t\\t\\t\")])]),_vm._v(\" \"),_c('div',{staticClass:\"app-details__section\"},[_c('h4',[_vm._v(\"\\n\\t\\t\\t\\t\"+_vm._s(_vm.t('settings', 'Categories'))+\"\\n\\t\\t\\t\")]),_vm._v(\" \"),_c('p',[_vm._v(\"\\n\\t\\t\\t\\t\"+_vm._s(_vm.appCategories)+\"\\n\\t\\t\\t\")])]),_vm._v(\" \"),(_vm.externalResources.length > 0)?_c('div',{staticClass:\"app-details__section\"},[_c('h4',[_vm._v(_vm._s(_vm.t('settings', 'Resources')))]),_vm._v(\" \"),_c('ul',{staticClass:\"app-details__documentation\",attrs:{\"aria-label\":_vm.t('settings', 'Documentation')}},_vm._l((_vm.externalResources),function(resource){return _c('li',{key:resource.id},[_c('a',{staticClass:\"appslink\",attrs:{\"href\":resource.href,\"target\":\"_blank\",\"rel\":\"noreferrer noopener\"}},[_vm._v(\"\\n\\t\\t\\t\\t\\t\\t\"+_vm._s(resource.label)+\" ↗\\n\\t\\t\\t\\t\\t\")])])}),0)]):_vm._e(),_vm._v(\" \"),_c('div',{staticClass:\"app-details__section\"},[_c('h4',[_vm._v(_vm._s(_vm.t('settings', 'Interact')))]),_vm._v(\" \"),_c('div',{staticClass:\"app-details__interact\"},[_c('NcButton',{attrs:{\"disabled\":!_vm.app.bugs,\"href\":_vm.app.bugs ?? '#',\"aria-label\":_vm.t('settings', 'Report a bug'),\"title\":_vm.t('settings', 'Report a bug')},scopedSlots:_vm._u([{key:\"icon\",fn:function(){return [_c('NcIconSvgWrapper',{attrs:{\"path\":_vm.mdiBug}})]},proxy:true}])}),_vm._v(\" \"),_c('NcButton',{attrs:{\"disabled\":!_vm.app.bugs,\"href\":_vm.app.bugs ?? '#',\"aria-label\":_vm.t('settings', 'Request feature'),\"title\":_vm.t('settings', 'Request feature')},scopedSlots:_vm._u([{key:\"icon\",fn:function(){return [_c('NcIconSvgWrapper',{attrs:{\"path\":_vm.mdiFeatureSearch}})]},proxy:true}])}),_vm._v(\" \"),(_vm.app.appstoreData?.discussion)?_c('NcButton',{attrs:{\"href\":_vm.app.appstoreData.discussion,\"aria-label\":_vm.t('settings', 'Ask questions or discuss'),\"title\":_vm.t('settings', 'Ask questions or discuss')},scopedSlots:_vm._u([{key:\"icon\",fn:function(){return [_c('NcIconSvgWrapper',{attrs:{\"path\":_vm.mdiTooltipQuestion}})]},proxy:true}],null,false,1288192462)}):_vm._e(),_vm._v(\" \"),(!_vm.app.internal)?_c('NcButton',{attrs:{\"href\":_vm.rateAppUrl,\"aria-label\":_vm.t('settings', 'Rate the app'),\"title\":_vm.t('settings', 'Rate')},scopedSlots:_vm._u([{key:\"icon\",fn:function(){return [_c('NcIconSvgWrapper',{attrs:{\"path\":_vm.mdiStar}})]},proxy:true}],null,false,422450625)}):_vm._e()],1)])])])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<!--\n - SPDX-FileCopyrightText: 2018 Nextcloud GmbH and Nextcloud contributors\n - SPDX-License-Identifier: AGPL-3.0-or-later\n-->\n\n<template>\n\t<NcAppSidebarTab id=\"details\"\n\t\t:name=\"t('settings', 'Details')\"\n\t\t:order=\"1\">\n\t\t<template #icon>\n\t\t\t<NcIconSvgWrapper :path=\"mdiTextBox\" />\n\t\t</template>\n\t\t<div class=\"app-details\">\n\t\t\t<div class=\"app-details__actions\">\n\t\t\t\t<div v-if=\"app.active && canLimitToGroups(app)\" class=\"app-details__actions-groups\">\n\t\t\t\t\t<input :id=\"`groups_enable_${app.id}`\"\n\t\t\t\t\t\tv-model=\"groupCheckedAppsData\"\n\t\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\t\t:value=\"app.id\"\n\t\t\t\t\t\tclass=\"groups-enable__checkbox checkbox\"\n\t\t\t\t\t\t@change=\"setGroupLimit\">\n\t\t\t\t\t<label :for=\"`groups_enable_${app.id}`\">{{ t('settings', 'Limit to groups') }}</label>\n\t\t\t\t\t<input type=\"hidden\"\n\t\t\t\t\t\tclass=\"group_select\"\n\t\t\t\t\t\t:title=\"t('settings', 'All')\"\n\t\t\t\t\t\tvalue=\"\">\n\t\t\t\t\t<br>\n\t\t\t\t\t<label for=\"limitToGroups\">\n\t\t\t\t\t\t<span>{{ t('settings', 'Limit app usage to groups') }}</span>\n\t\t\t\t\t</label>\n\t\t\t\t\t<NcSelect v-if=\"isLimitedToGroups(app)\"\n\t\t\t\t\t\tinput-id=\"limitToGroups\"\n\t\t\t\t\t\t:options=\"groups\"\n\t\t\t\t\t\t:value=\"appGroups\"\n\t\t\t\t\t\t:limit=\"5\"\n\t\t\t\t\t\tlabel=\"name\"\n\t\t\t\t\t\t:multiple=\"true\"\n\t\t\t\t\t\t:close-on-select=\"false\"\n\t\t\t\t\t\t@option:selected=\"addGroupLimitation\"\n\t\t\t\t\t\t@option:deselected=\"removeGroupLimitation\"\n\t\t\t\t\t\t@search=\"asyncFindGroup\">\n\t\t\t\t\t\t<span slot=\"noResult\">{{ t('settings', 'No results') }}</span>\n\t\t\t\t\t</NcSelect>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"app-details__actions-manage\">\n\t\t\t\t\t<input v-if=\"app.update\"\n\t\t\t\t\t\tclass=\"update primary\"\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t:value=\"t('settings', 'Update to {version}', { version: app.update })\"\n\t\t\t\t\t\t:disabled=\"installing || isLoading\"\n\t\t\t\t\t\t@click=\"update(app.id)\">\n\t\t\t\t\t<input v-if=\"app.canUnInstall\"\n\t\t\t\t\t\tclass=\"uninstall\"\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t:value=\"t('settings', 'Remove')\"\n\t\t\t\t\t\t:disabled=\"installing || isLoading\"\n\t\t\t\t\t\t@click=\"remove(app.id)\">\n\t\t\t\t\t<input v-if=\"app.active\"\n\t\t\t\t\t\tclass=\"enable\"\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t:value=\"t('settings','Disable')\"\n\t\t\t\t\t\t:disabled=\"installing || isLoading\"\n\t\t\t\t\t\t@click=\"disable(app.id)\">\n\t\t\t\t\t<input v-if=\"!app.active && (app.canInstall || app.isCompatible)\"\n\t\t\t\t\t\t:title=\"enableButtonTooltip\"\n\t\t\t\t\t\t:aria-label=\"enableButtonTooltip\"\n\t\t\t\t\t\tclass=\"enable primary\"\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t:value=\"enableButtonText\"\n\t\t\t\t\t\t:disabled=\"!app.canInstall || installing || isLoading\"\n\t\t\t\t\t\t@click=\"enable(app.id)\">\n\t\t\t\t\t<input v-else-if=\"!app.active && !app.canInstall\"\n\t\t\t\t\t\t:title=\"forceEnableButtonTooltip\"\n\t\t\t\t\t\t:aria-label=\"forceEnableButtonTooltip\"\n\t\t\t\t\t\tclass=\"enable force\"\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t:value=\"forceEnableButtonText\"\n\t\t\t\t\t\t:disabled=\"installing || isLoading\"\n\t\t\t\t\t\t@click=\"forceEnable(app.id)\">\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<ul class=\"app-details__dependencies\">\n\t\t\t\t<li v-if=\"app.missingMinOwnCloudVersion\">\n\t\t\t\t\t{{ t('settings', 'This app has no minimum Nextcloud version assigned. This will be an error in the future.') }}\n\t\t\t\t</li>\n\t\t\t\t<li v-if=\"app.missingMaxOwnCloudVersion\">\n\t\t\t\t\t{{ t('settings', 'This app has no maximum Nextcloud version assigned. This will be an error in the future.') }}\n\t\t\t\t</li>\n\t\t\t\t<li v-if=\"!app.canInstall\">\n\t\t\t\t\t{{ t('settings', 'This app cannot be installed because the following dependencies are not fulfilled:') }}\n\t\t\t\t\t<ul class=\"missing-dependencies\">\n\t\t\t\t\t\t<li v-for=\"(dep, index) in app.missingDependencies\" :key=\"index\">\n\t\t\t\t\t\t\t{{ dep }}\n\t\t\t\t\t\t</li>\n\t\t\t\t\t</ul>\n\t\t\t\t</li>\n\t\t\t</ul>\n\n\t\t\t<div v-if=\"lastModified\" class=\"app-details__section\">\n\t\t\t\t<h4>\n\t\t\t\t\t{{ t('settings', 'Latest updated') }}\n\t\t\t\t</h4>\n\t\t\t\t<NcDateTime :timestamp=\"lastModified\" />\n\t\t\t</div>\n\n\t\t\t<div class=\"app-details__section\">\n\t\t\t\t<h4>\n\t\t\t\t\t{{ t('settings', 'Author') }}\n\t\t\t\t</h4>\n\t\t\t\t<p class=\"app-details__authors\">\n\t\t\t\t\t{{ appAuthors }}\n\t\t\t\t</p>\n\t\t\t</div>\n\n\t\t\t<div class=\"app-details__section\">\n\t\t\t\t<h4>\n\t\t\t\t\t{{ t('settings', 'Categories') }}\n\t\t\t\t</h4>\n\t\t\t\t<p>\n\t\t\t\t\t{{ appCategories }}\n\t\t\t\t</p>\n\t\t\t</div>\n\n\t\t\t<div v-if=\"externalResources.length > 0\" class=\"app-details__section\">\n\t\t\t\t<h4>{{ t('settings', 'Resources') }}</h4>\n\t\t\t\t<ul class=\"app-details__documentation\" :aria-label=\"t('settings', 'Documentation')\">\n\t\t\t\t\t<li v-for=\"resource of externalResources\" :key=\"resource.id\">\n\t\t\t\t\t\t<a class=\"appslink\"\n\t\t\t\t\t\t\t:href=\"resource.href\"\n\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\trel=\"noreferrer noopener\">\n\t\t\t\t\t\t\t{{ resource.label }} ↗\n\t\t\t\t\t\t</a>\n\t\t\t\t\t</li>\n\t\t\t\t</ul>\n\t\t\t</div>\n\n\t\t\t<div class=\"app-details__section\">\n\t\t\t\t<h4>{{ t('settings', 'Interact') }}</h4>\n\t\t\t\t<div class=\"app-details__interact\">\n\t\t\t\t\t<NcButton :disabled=\"!app.bugs\"\n\t\t\t\t\t\t:href=\"app.bugs ?? '#'\"\n\t\t\t\t\t\t:aria-label=\"t('settings', 'Report a bug')\"\n\t\t\t\t\t\t:title=\"t('settings', 'Report a bug')\">\n\t\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t\t<NcIconSvgWrapper :path=\"mdiBug\" />\n\t\t\t\t\t\t</template>\n\t\t\t\t\t</NcButton>\n\t\t\t\t\t<NcButton :disabled=\"!app.bugs\"\n\t\t\t\t\t\t:href=\"app.bugs ?? '#'\"\n\t\t\t\t\t\t:aria-label=\"t('settings', 'Request feature')\"\n\t\t\t\t\t\t:title=\"t('settings', 'Request feature')\">\n\t\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t\t<NcIconSvgWrapper :path=\"mdiFeatureSearch\" />\n\t\t\t\t\t\t</template>\n\t\t\t\t\t</NcButton>\n\t\t\t\t\t<NcButton v-if=\"app.appstoreData?.discussion\"\n\t\t\t\t\t\t:href=\"app.appstoreData.discussion\"\n\t\t\t\t\t\t:aria-label=\"t('settings', 'Ask questions or discuss')\"\n\t\t\t\t\t\t:title=\"t('settings', 'Ask questions or discuss')\">\n\t\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t\t<NcIconSvgWrapper :path=\"mdiTooltipQuestion\" />\n\t\t\t\t\t\t</template>\n\t\t\t\t\t</NcButton>\n\t\t\t\t\t<NcButton v-if=\"!app.internal\"\n\t\t\t\t\t\t:href=\"rateAppUrl\"\n\t\t\t\t\t\t:aria-label=\"t('settings', 'Rate the app')\"\n\t\t\t\t\t\t:title=\"t('settings', 'Rate')\">\n\t\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t\t<NcIconSvgWrapper :path=\"mdiStar\" />\n\t\t\t\t\t\t</template>\n\t\t\t\t\t</NcButton>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t</NcAppSidebarTab>\n</template>\n\n<script>\nimport NcAppSidebarTab from '@nextcloud/vue/dist/Components/NcAppSidebarTab.js'\nimport NcButton from '@nextcloud/vue/dist/Components/NcButton.js'\nimport NcDateTime from '@nextcloud/vue/dist/Components/NcDateTime.js'\nimport NcIconSvgWrapper from '@nextcloud/vue/dist/Components/NcIconSvgWrapper.js'\nimport NcSelect from '@nextcloud/vue/dist/Components/NcSelect.js'\n\nimport AppManagement from '../../mixins/AppManagement.js'\nimport { mdiBug, mdiFeatureSearch, mdiStar, mdiTextBox, mdiTooltipQuestion } from '@mdi/js'\nimport { useAppsStore } from '../../store/apps-store'\n\nexport default {\n\tname: 'AppDetailsTab',\n\n\tcomponents: {\n\t\tNcAppSidebarTab,\n\t\tNcButton,\n\t\tNcDateTime,\n\t\tNcIconSvgWrapper,\n\t\tNcSelect,\n\t},\n\tmixins: [AppManagement],\n\n\tprops: {\n\t\tapp: {\n\t\t\ttype: Object,\n\t\t\trequired: true,\n\t\t},\n\t},\n\n\tsetup() {\n\t\tconst store = useAppsStore()\n\n\t\treturn {\n\t\t\tstore,\n\n\t\t\tmdiBug,\n\t\t\tmdiFeatureSearch,\n\t\t\tmdiStar,\n\t\t\tmdiTextBox,\n\t\t\tmdiTooltipQuestion,\n\t\t}\n\t},\n\n\tdata() {\n\t\treturn {\n\t\t\tgroupCheckedAppsData: false,\n\t\t}\n\t},\n\n\tcomputed: {\n\t\tlastModified() {\n\t\t\treturn (this.app.appstoreData?.releases ?? [])\n\t\t\t\t.map(({ lastModified }) => Date.parse(lastModified))\n\t\t\t\t.sort()\n\t\t\t\t.at(0) ?? null\n\t\t},\n\t\t/**\n\t\t * App authors as comma separated string\n\t\t */\n\t\tappAuthors() {\n\t\t\tconsole.warn(this.app)\n\t\t\tif (!this.app) {\n\t\t\t\treturn ''\n\t\t\t}\n\n\t\t\tconst authorName = (xmlNode) => {\n\t\t\t\tif (xmlNode['@value']) {\n\t\t\t\t\t// Complex node (with email or homepage attribute)\n\t\t\t\t\treturn xmlNode['@value']\n\t\t\t\t}\n\t\t\t\t// Simple text node\n\t\t\t\treturn xmlNode\n\t\t\t}\n\n\t\t\tconst authors = Array.isArray(this.app.author)\n\t\t\t\t? this.app.author.map(authorName)\n\t\t\t\t: [authorName(this.app.author)]\n\n\t\t\treturn authors\n\t\t\t\t.sort((a, b) => a.split(' ').at(-1).localeCompare(b.split(' ').at(-1)))\n\t\t\t\t.join(', ')\n\t\t},\n\n\t\tappstoreUrl() {\n\t\t\treturn `https://apps.nextcloud.com/apps/${this.app.id}`\n\t\t},\n\n\t\t/**\n\t\t * Further external resources (e.g. website)\n\t\t */\n\t\texternalResources() {\n\t\t\tconst resources = []\n\t\t\tif (!this.app.internal) {\n\t\t\t\tresources.push({\n\t\t\t\t\tid: 'appstore',\n\t\t\t\t\thref: this.appstoreUrl,\n\t\t\t\t\tlabel: t('settings', 'View in store'),\n\t\t\t\t})\n\t\t\t}\n\t\t\tif (this.app.website) {\n\t\t\t\tresources.push({\n\t\t\t\t\tid: 'website',\n\t\t\t\t\thref: this.app.website,\n\t\t\t\t\tlabel: t('settings', 'Visit website'),\n\t\t\t\t})\n\t\t\t}\n\t\t\tif (this.app.documentation) {\n\t\t\t\tif (this.app.documentation.user) {\n\t\t\t\t\tresources.push({\n\t\t\t\t\t\tid: 'doc-user',\n\t\t\t\t\t\thref: this.app.documentation.user,\n\t\t\t\t\t\tlabel: t('settings', 'Usage documentation'),\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t\tif (this.app.documentation.admin) {\n\t\t\t\t\tresources.push({\n\t\t\t\t\t\tid: 'doc-admin',\n\t\t\t\t\t\thref: this.app.documentation.admin,\n\t\t\t\t\t\tlabel: t('settings', 'Admin documentation'),\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t\tif (this.app.documentation.developer) {\n\t\t\t\t\tresources.push({\n\t\t\t\t\t\tid: 'doc-developer',\n\t\t\t\t\t\thref: this.app.documentation.developer,\n\t\t\t\t\t\tlabel: t('settings', 'Developer documentation'),\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn resources\n\t\t},\n\n\t\tappCategories() {\n\t\t\treturn [this.app.category].flat()\n\t\t\t\t.map((id) => this.store.getCategoryById(id)?.displayName ?? id)\n\t\t\t\t.join(', ')\n\t\t},\n\n\t\trateAppUrl() {\n\t\t\treturn `${this.appstoreUrl}#comments`\n\t\t},\n\t\tappGroups() {\n\t\t\treturn this.app.groups.map(group => { return { id: group, name: group } })\n\t\t},\n\t\tgroups() {\n\t\t\treturn this.$store.getters.getGroups\n\t\t\t\t.filter(group => group.id !== 'disabled')\n\t\t\t\t.sort((a, b) => a.name.localeCompare(b.name))\n\t\t},\n\t},\n\tmounted() {\n\t\tif (this.app.groups.length > 0) {\n\t\t\tthis.groupCheckedAppsData = true\n\t\t}\n\t},\n}\n</script>\n\n<style scoped lang=\"scss\">\n.app-details {\n\tpadding: 20px;\n\n\t&__actions {\n\t\t// app management\n\t\t&-manage {\n\t\t\t// if too many, shrink them and ellipsis\n\t\t\tdisplay: flex;\n\t\t\tinput {\n\t\t\t\tflex: 0 1 auto;\n\t\t\t\tmin-width: 0;\n\t\t\t\ttext-overflow: ellipsis;\n\t\t\t\twhite-space: nowrap;\n\t\t\t\toverflow: hidden;\n\t\t\t}\n\t\t}\n\t}\n\t&__authors {\n\t\tcolor: var(--color-text-maxcontrast);\n\t}\n\n\t&__section {\n\t\tmargin-top: 15px;\n\n\t\th4 {\n\t\t\tfont-size: 16px;\n\t\t\tfont-weight: bold;\n\t\t\tmargin-block-end: 5px;\n\t\t}\n\t}\n\n\t&__interact {\n\t\tdisplay: flex;\n\t\tflex-direction: row;\n\t\tflex-wrap: wrap;\n\t\tgap: 12px;\n\t}\n\n\t&__documentation {\n\t\ta {\n\t\t\ttext-decoration: underline;\n\t\t}\n\t\tli {\n\t\t\tpadding-inline-start: 20px;\n\n\t\t\t&::before {\n\t\t\t\twidth: 5px;\n\t\t\t\theight: 5px;\n\t\t\t\tborder-radius: 100%;\n\t\t\t\tbackground-color: var(--color-main-text);\n\t\t\t\tcontent: \"\";\n\t\t\t\tfloat: inline-start;\n\t\t\t\tmargin-inline-start: -13px;\n\t\t\t\tposition: relative;\n\t\t\t\ttop: 10px;\n\t\t\t}\n\t\t}\n\t}\n}\n\n.force {\n\tcolor: var(--color-error);\n\tborder-color: var(--color-error);\n\tbackground: var(--color-main-background);\n}\n.force:hover,\n.force:active {\n\tcolor: var(--color-main-background);\n\tborder-color: var(--color-error) !important;\n\tbackground: var(--color-error);\n}\n\n.missing-dependencies {\n\tlist-style: initial;\n\tlist-style-type: initial;\n\tlist-style-position: inside;\n}\n</style>\n","import mod from \"-!../../../../../node_modules/babel-loader/lib/index.js!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppDetailsTab.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../../../../node_modules/babel-loader/lib/index.js!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppDetailsTab.vue?vue&type=script&lang=js\"","\n import API from \"!../../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../../node_modules/css-loader/dist/cjs.js!../../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../node_modules/sass-loader/dist/cjs.js!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppDetailsTab.vue?vue&type=style&index=0&id=533705fa&prod&scoped=true&lang=scss\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../../node_modules/css-loader/dist/cjs.js!../../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../node_modules/sass-loader/dist/cjs.js!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppDetailsTab.vue?vue&type=style&index=0&id=533705fa&prod&scoped=true&lang=scss\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./AppDetailsTab.vue?vue&type=template&id=533705fa&scoped=true\"\nimport script from \"./AppDetailsTab.vue?vue&type=script&lang=js\"\nexport * from \"./AppDetailsTab.vue?vue&type=script&lang=js\"\nimport style0 from \"./AppDetailsTab.vue?vue&type=style&index=0&id=533705fa&prod&scoped=true&lang=scss\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"533705fa\",\n null\n \n)\n\nexport default component.exports","import mod from \"-!../../../../../node_modules/babel-loader/lib/index.js!../../../../../node_modules/ts-loader/index.js??clonedRuleSet-4.use[1]!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppReleasesTab.vue?vue&type=script&setup=true&lang=ts\"; export default mod; export * from \"-!../../../../../node_modules/babel-loader/lib/index.js!../../../../../node_modules/ts-loader/index.js??clonedRuleSet-4.use[1]!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppReleasesTab.vue?vue&type=script&setup=true&lang=ts\"","var render = function render(){var _vm=this,_c=_vm._self._c,_setup=_vm._self._setupProxy;return (_setup.hasChangelog)?_c(_setup.NcAppSidebarTab,{attrs:{\"id\":\"changelog\",\"name\":_setup.t('settings', 'Changelog'),\"order\":2},scopedSlots:_vm._u([{key:\"icon\",fn:function(){return [_c(_setup.NcIconSvgWrapper,{attrs:{\"path\":_setup.mdiClockFast,\"size\":24}})]},proxy:true}],null,false,1849836872)},[_vm._v(\" \"),_vm._l((_vm.app.releases),function(release){return _c('div',{key:release.version,staticClass:\"app-sidebar-tabs__release\"},[_c('h2',[_vm._v(_vm._s(release.version))]),_vm._v(\" \"),_c(_setup.Markdown,{staticClass:\"app-sidebar-tabs__release-text\",attrs:{\"text\":_setup.createChangelogFromRelease(release)}})],1)})],2):_vm._e()\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n import API from \"!../../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../../node_modules/css-loader/dist/cjs.js!../../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../node_modules/sass-loader/dist/cjs.js!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppReleasesTab.vue?vue&type=style&index=0&id=9c32407e&prod&scoped=true&lang=scss\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../../node_modules/css-loader/dist/cjs.js!../../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../node_modules/sass-loader/dist/cjs.js!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppReleasesTab.vue?vue&type=style&index=0&id=9c32407e&prod&scoped=true&lang=scss\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./AppReleasesTab.vue?vue&type=template&id=9c32407e&scoped=true\"\nimport script from \"./AppReleasesTab.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./AppReleasesTab.vue?vue&type=script&setup=true&lang=ts\"\nimport style0 from \"./AppReleasesTab.vue?vue&type=style&index=0&id=9c32407e&prod&scoped=true&lang=scss\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"9c32407e\",\n null\n \n)\n\nexport default component.exports","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/ts-loader/index.js??clonedRuleSet-4.use[1]!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppStoreSidebar.vue?vue&type=script&setup=true&lang=ts\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/ts-loader/index.js??clonedRuleSet-4.use[1]!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppStoreSidebar.vue?vue&type=script&setup=true&lang=ts\"","import { mdiCog } from '@mdi/js';\nimport { computed, ref, watchEffect } from 'vue';\nimport AppstoreCategoryIcons from '../constants/AppstoreCategoryIcons.ts';\nimport logger from '../logger.ts';\n/**\n * Get the app icon raw SVG for use with `NcIconSvgWrapper` (do never use without sanitizing)\n * It has a fallback to the categroy icon.\n *\n * @param app The app to get the icon for\n */\nexport function useAppIcon(app) {\n const appIcon = ref(null);\n /**\n * Fallback value if no app icon available\n */\n const categoryIcon = computed(() => {\n const path = [app.value?.category ?? []].flat()\n .map((name) => AppstoreCategoryIcons[name])\n .filter((icon) => !!icon)\n .at(0)\n ?? mdiCog;\n return path ? `<svg viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"${path}\" /></svg>` : null;\n });\n watchEffect(async () => {\n // Note: Only variables until the first `await` will be watched!\n if (!app.value?.preview) {\n appIcon.value = categoryIcon.value;\n }\n else {\n appIcon.value = null;\n // Now try to load the real app icon\n try {\n const response = await window.fetch(app.value.preview);\n const blob = await response.blob();\n const rawSvg = await blob.text();\n appIcon.value = rawSvg.replaceAll(/fill=\"#(fff|ffffff)([a-z0-9]{1,2})?\"/ig, 'fill=\"currentColor\"');\n }\n catch (error) {\n appIcon.value = categoryIcon.value;\n logger.error('Could not load app icon', { error });\n }\n }\n });\n return {\n appIcon,\n };\n}\n","\n import API from \"!../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppStoreSidebar.vue?vue&type=style&index=0&id=2f300fa2&prod&scoped=true&lang=scss\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppStoreSidebar.vue?vue&type=style&index=0&id=2f300fa2&prod&scoped=true&lang=scss\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./AppStoreSidebar.vue?vue&type=template&id=2f300fa2&scoped=true\"\nimport script from \"./AppStoreSidebar.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./AppStoreSidebar.vue?vue&type=script&setup=true&lang=ts\"\nimport style0 from \"./AppStoreSidebar.vue?vue&type=style&index=0&id=2f300fa2&prod&scoped=true&lang=scss\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"2f300fa2\",\n null\n \n)\n\nexport default component.exports"],"names":["APPS_SECTION_ENUM","Object","freeze","discover","t","installed","enabled","disabled","updates","featured","supported","axios","get","generateOcsUrl","then","_ref","data","ocs","meta","statuscode","emit","apps","window","dispatchEvent","Event","computed","appGroups","this","app","groups","map","group","id","name","installing","$store","getters","loading","isLoading","enableButtonText","needsDownload","forceEnableButtonText","enableButtonTooltip","forceEnableButtonTooltip","base","groupCheckedAppsData","mounted","length","methods","asyncFindGroup","query","dispatch","search","limit","offset","isLimitedToGroups","setGroupLimit","appId","canLimitToGroups","types","includes","addGroupLimitation","groupArray","pop","concat","removeGroupLimitation","currentGroups","index","indexOf","splice","forceEnable","response","rebuildNavigation","catch","error","showError","enable","disable","remove","install","update","mdiStarCircleOutline","mdiAccount","mdiCheck","mdiClose","bundles","mdiArchive","mdiStarShooting","mdiStar","mdiDownload","auth","mdiKey","customization","mdiCog","dashboard","mdiViewColumn","files","mdiFolder","games","mdiControllerClassic","integration","mdiOpenInApp","monitoring","mdiMonitorEye","multimedia","mdiMultimedia","office","mdiFileDocumentEdit","organization","mdiOfficeBuilding","mdiMagnify","security","mdiSecurity","social","mdiAccountMultiple","tools","mdiTools","workflow","mdiClipboardFlow","showApiError","useAppsStore","defineStore","state","categories","updateCount","loadState","loadingList","gettingCategoriesPromise","actions","loadCategories","force","arguments","undefined","generateUrl","category","icon","APPSTORE_CATEGORY_ICONS","$patch","logger","loadApps","getCategoryById","categoryId","find","getAppById","_ref2","___CSS_LOADER_EXPORT___","push","module","filterId","filterUrl","Math","random","toString","substring","components","AppLevelBadge","AppScore","NcButton","mixins","AppManagement","SvgFilterMixin","props","type","required","String","listView","Boolean","default","useBundleView","headers","inline","isSelected","scrolled","screenshotLoaded","hasRating","appstoreData","ratingNumOverall","dataItemTag","withSidebar","$route","params","watch","releases","screenshot","image","Image","onload","src","watchers","prefix","content","getDataItemHeaders","columnName","join","options","styleTagTransform","setAttributes","insert","domAPI","insertStyleElement","locals","_vm","_c","_self","tag","staticClass","class","attrs","preview","_e","_v","appName","_s","summary","version","level","score","on","$event","stopPropagation","canUnInstall","active","canInstall","isCompatible","_defineComponent","__name","setup","__props","isSupported","isFeatured","badgeIcon","value","badgeText","badgeTitle","__sfc","NcIconSvgWrapper","_setup","_setupProxy","defineComponent","Number","mdiStarHalfFull","mdiStarOutline","title","appScore","toFixed","fullStars","floor","emptyStars","min","hasHalfStar","_l","key","Node","constructor","_defineProperty","_head","WeakMap","_tail","_size","Queue","_classPrivateFieldInitSpec","clear","enqueue","_this$size","node","_classPrivateFieldGet","next","_classPrivateFieldSet","dequeue","_this$size3","current","peek","size","Symbol","iterator","pLimit","concurrency","validateConcurrency","queue","activeCount","resumeNext","run","async","function_","resolve","arguments_","result","generator","_len","Array","_key","Promise","internalResolve","bind","defineProperties","pendingCount","clearQueue","set","newConcurrency","queueMicrotask","isInteger","POSITIVE_INFINITY","TypeError","AppItem","counter","filter","hasPendingUpdate","showUpdateAll","useListView","getAllApps","toLowerCase","sort","a","b","sortStringA","sortStringB","OC","Util","naturalSortCompare","appstore","getAppBundles","bundle","bundleApps","bundleIds","searchApps","_app","useAppStoreView","allBundlesEnabled","bundleToggleText","beforeDestroy","unsubscribe","setSearch","resetSearch","subscribe","toggleBundle","disableBundle","enableBundle","console","Notification","show","updateAll","n","parseApiResponse","element","appElement","date","Date","parse","expiryDate","Error","filterElements","now","PostType","defineAsyncComponent","CarouselType","ShowcaseType","hasError","ref","elements","shuffleArray","array","i","j","onBeforeMount","info","parsedElements","shuffledElements","order","Infinity","getComponent","render","h","mdiEyeOff","NcEmptyContent","NcLoadingIcon","scopedSlots","_u","fn","proxy","entry","_b","route","useRoute","store","currentCategory","appStoreLabel","viewLabel","displayName","watchEffect","document","instance","getCurrentInstance","shouldRefetchCategories","NcAppContent","AppList","AppStoreDiscoverSection","domProps","appstoreEnabled","developerDocsUrl","categoriesLoading","isSubscribed","NcAppNavigation","NcAppNavigationItem","NcAppNavigationSpacer","NcCounterBubble","text","minHeading","renderMarkdown","renderer","marked","Renderer","link","href","prot","decodeURIComponent","unescape","replace","e","out","heading","blockquote","quote","dompurify","trim","gfm","highlight","tables","breaks","pedantic","sanitize","smartLists","smartypants","SAFE_FOR_JQUERY","ALLOWED_TAGS","mdiTextShort","NcAppSidebarTab","Markdown","description","NcDateTime","NcSelect","mdiBug","mdiFeatureSearch","mdiTextBox","mdiTooltipQuestion","lastModified","at","appAuthors","warn","authorName","xmlNode","isArray","author","split","localeCompare","appstoreUrl","externalResources","resources","internal","label","website","documentation","user","admin","developer","appCategories","flat","rateAppUrl","getGroups","directives","rawName","expression","_i","$$a","$$el","target","$$c","checked","$$v","$$i","slice","slot","missingMinOwnCloudVersion","missingMaxOwnCloudVersion","missingDependencies","dep","resource","bugs","discussion","hasChangelog","values","translations","some","changelog","createChangelogFromRelease","release","getLanguage","en","mdiClockFast","router","useRouter","rating","ratingNumRecent","ratingRecent","ratingOverall","showSidebar","appIcon","categoryIcon","path","AppstoreCategoryIcons","fetch","blob","rawSvg","replaceAll","useAppIcon","licenseText","license","licence","toUpperCase","activeTab","hasScreenshot","loadScreenshot","onMounted","hideAppDetails","NcAppSidebar","AppDescriptionTab","AppDetailsTab","AppReleasesTab"],"sourceRoot":""} \ No newline at end of file
diff --git a/dist/settings-vue-settings-apps-users-management.js b/dist/settings-vue-settings-apps-users-management.js
index 96e754c057a..d807a7317a1 100644
--- a/dist/settings-vue-settings-apps-users-management.js
+++ b/dist/settings-vue-settings-apps-users-management.js
@@ -1,2 +1,2 @@
-(()=>{var e,s,r,i={31755:(e,s,r)=>{"use strict";r.d(s,{P:()=>X});var i=r(85471),o=r(95353),n=r(59097),a=r(87485),d=r(35810),c=r(85168),u=r(63814),p=r(65043),l=r(15916),m=r(56760);r(51257);const h=function(t){return t.replace(/\/$/,"")},g=()=>(0,m.C)(),f=(t,e)=>p.Ay.get(h(t),e),E=(t,e)=>p.Ay.post(h(t),e),A=(t,e)=>p.Ay.put(h(t),e),I=(t,e)=>p.Ay.delete(h(t),{params:e});var b=r(36620),N=r(96763);const y=(0,n.c0)("settings").persist(!0).build(),L={id:"",name:"",usercount:0,disabled:0,canAdd:!0,canRemove:!0},v={users:[],groups:[],orderBy:l.q.UserCount,minPasswordLength:0,usersOffset:0,usersLimit:25,disabledUsersOffset:0,disabledUsersLimit:25,userCount:0,showConfig:{showStoragePath:"true"===y.getItem("account_settings__showStoragePath"),showUserBackend:"true"===y.getItem("account_settings__showUserBackend"),showLastLogin:"true"===y.getItem("account_settings__showLastLogin"),showNewUserForm:"true"===y.getItem("account_settings__showNewUserForm"),showLanguages:"true"===y.getItem("account_settings__showLanguages")}},R={appendUsers(t,e){const s=t.users.map((t=>{let{id:e}=t;return e})),r=Object.values(e).filter((t=>{let{id:e}=t;return!s.includes(e)})),i=t.users.concat(r);t.usersOffset+=t.usersLimit,t.users=i},updateDisabledUsers(t,e){t.disabledUsersOffset+=t.disabledUsersLimit},setPasswordPolicyMinLength(t,e){t.minPasswordLength=""!==e?e:0},initGroups(t,e){let{groups:s,orderBy:r,userCount:i}=e;t.groups=s.map((t=>Object.assign({},L,t))),t.orderBy=r,t.userCount=i},addGroup(t,e){let{gid:s,displayName:r}=e;try{if(void 0!==t.groups.find((t=>t.id===s)))return;const e=Object.assign({},L,{id:s,name:r});t.groups.unshift(e)}catch(t){N.error("Can't create group",t)}},renameGroup(t,e){let{gid:s,displayName:r}=e;const i=t.groups.findIndex((t=>t.id===s));if(i>=0){const e=t.groups[i];e.name=r,t.groups.splice(i,1,e)}},removeGroup(t,e){const s=t.groups.findIndex((t=>t.id===e));s>=0&&t.groups.splice(s,1)},addUserGroup(t,e){let{userid:s,gid:r}=e;const i=t.groups.find((t=>t.id===r)),o=t.users.find((t=>t.id===s));i&&o.enabled&&t.userCount>0&&i.usercount++,o.groups.push(r)},removeUserGroup(t,e){let{userid:s,gid:r}=e;const i=t.groups.find((t=>t.id===r)),o=t.users.find((t=>t.id===s));i&&o.enabled&&t.userCount>0&&i.usercount--;const n=o.groups;n.splice(n.indexOf(r),1)},addUserSubAdmin(t,e){let{userid:s,gid:r}=e;t.users.find((t=>t.id===s)).subadmin.push(r)},removeUserSubAdmin(t,e){let{userid:s,gid:r}=e;const i=t.users.find((t=>t.id===s)).subadmin;i.splice(i.indexOf(r),1)},deleteUser(t,e){const s=t.users.findIndex((t=>t.id===e));this.commit("updateUserCounts",{user:t.users[s],actionType:"remove"}),t.users.splice(s,1)},addUserData(t,e){const s=e.data.ocs.data;t.users.unshift(s),this.commit("updateUserCounts",{user:s,actionType:"create"})},enableDisableUser(t,e){let{userid:s,enabled:r}=e;const i=t.users.find((t=>t.id===s));i.enabled=r,this.commit("updateUserCounts",{user:i,actionType:r?"enable":"disable"})},updateUserCounts(t,e){let{user:s,actionType:r}=e;if(0===t.userCount)return;const i=t.groups.find((t=>"__nc_internal_recent"===t.id)),o=t.groups.find((t=>"disabled"===t.id));switch(r){case"enable":case"disable":o.usercount+=s.enabled?-1:1,i.usercount+=s.enabled?1:-1,t.userCount+=s.enabled?1:-1,s.groups.forEach((e=>{t.groups.find((t=>t.id===e)).disabled+=s.enabled?-1:1}));break;case"create":i.usercount++,t.userCount++,s.groups.forEach((e=>{t.groups.find((t=>t.id===e)).usercount++}));break;case"remove":s.enabled?(i.usercount--,t.userCount--,s.groups.forEach((e=>{const s=t.groups.find((t=>t.id===e));s?s.usercount--:N.warn("User group "+e+" does not exist during user removal")}))):(o.usercount--,s.groups.forEach((e=>{t.groups.find((t=>t.id===e)).disabled--})));break;default:b.A.error(`Unknown action type in updateUserCounts: '${r}'`)}},setUserData(t,e){let{userid:s,key:r,value:i}=e;if("quota"===r){const e=(0,d.lT)(i,!0);t.users.find((t=>t.id===s))[r][r]=null!==e?e:i}else t.users.find((t=>t.id===s))[r]=i},resetUsers(t){t.users=[],t.usersOffset=0,t.disabledUsersOffset=0},setShowConfig(t,e){let{key:s,value:r}=e;y.setItem(`account_settings__${s}`,JSON.stringify(r)),t.showConfig[s]=r},setGroupSorting(e,s){const r=e.orderBy;e.orderBy=s,p.Ay.post((0,u.Jv)("/settings/users/preferences/group.sortBy"),{value:String(s)}).catch((s=>{e.orderBy=r,(0,c.Qg)(t("settings","Could not set group sorting")),b.A.error(s)}))}},w={getUsers:t=>t.users,getGroups:t=>t.groups,getSubadminGroups:t=>t.groups.filter((t=>"admin"!==t.id&&"__nc_internal_recent"!==t.id&&"disabled"!==t.id)),getSortedGroups(t){const e=[...t.groups];return t.orderBy===l.q.UserCount?e.sort(((t,e)=>{const s=t.usercount-t.disabled,r=e.usercount-e.disabled;return s<r?1:r<s?-1:t.name.localeCompare(e.name)})):e.sort(((t,e)=>t.name.localeCompare(e.name)))},getGroupSorting:t=>t.orderBy,getPasswordPolicyMinLength:t=>t.minPasswordLength,getUsersOffset:t=>t.usersOffset,getUsersLimit:t=>t.usersLimit,getDisabledUsersOffset:t=>t.disabledUsersOffset,getDisabledUsersLimit:t=>t.disabledUsersLimit,getUserCount:t=>t.userCount,getShowConfig:t=>t.showConfig},O=p.Ay.CancelToken;let P=null;const _={state:v,mutations:R,getters:w,actions:{searchUsers(t,e){let{offset:s,limit:r,search:i}=e;return i="string"==typeof i?i:"",f((0,u.KT)("cloud/users/details?offset={offset}&limit={limit}&search={search}",{offset:s,limit:r,search:i})).catch((e=>{p.Ay.isCancel(e)||t.commit("API_FAILURE",e)}))},getUser:(t,e)=>f((0,u.KT)(`cloud/users/${e}`)).catch((e=>{p.Ay.isCancel(e)||t.commit("API_FAILURE",e)})),getUsers(t,e){let{offset:s,limit:r,search:i,group:o}=e;return P&&P.cancel("Operation canceled by another search request."),P=O.source(),i="string"==typeof i?i:"",i=i.replace(/in:[^\s]+/g,"").trim(),o="string"==typeof o?o:"",""!==o?f((0,u.KT)("cloud/groups/{group}/users/details?offset={offset}&limit={limit}&search={search}",{group:encodeURIComponent(o),offset:s,limit:r,search:i}),{cancelToken:P.token}).then((e=>{const s=Object.keys(e.data.ocs.data.users).length;return s>0&&t.commit("appendUsers",e.data.ocs.data.users),s})).catch((e=>{p.Ay.isCancel(e)||t.commit("API_FAILURE",e)})):f((0,u.KT)("cloud/users/details?offset={offset}&limit={limit}&search={search}",{offset:s,limit:r,search:i}),{cancelToken:P.token}).then((e=>{const s=Object.keys(e.data.ocs.data.users).length;return s>0&&t.commit("appendUsers",e.data.ocs.data.users),s})).catch((e=>{p.Ay.isCancel(e)||t.commit("API_FAILURE",e)}))},async getRecentUsers(t,e){let{offset:s,limit:r,search:i}=e;const o=(0,u.KT)("cloud/users/recent?offset={offset}&limit={limit}&search={search}",{offset:s,limit:r,search:i});try{const e=await f(o),s=Object.keys(e.data.ocs.data.users).length;return s>0&&t.commit("appendUsers",e.data.ocs.data.users),s}catch(e){t.commit("API_FAILURE",e)}},async getDisabledUsers(t,e){let{offset:s,limit:r,search:i}=e;const o=(0,u.KT)("cloud/users/disabled?offset={offset}&limit={limit}&search={search}",{offset:s,limit:r,search:i});try{const e=await f(o),s=Object.keys(e.data.ocs.data.users).length;return s>0&&(t.commit("appendUsers",e.data.ocs.data.users),t.commit("updateDisabledUsers",e.data.ocs.data.users)),s}catch(e){t.commit("API_FAILURE",e)}},getGroups(t,e){let{offset:s,limit:r,search:i}=e;i="string"==typeof i?i:"";const o=-1===r?"":`&limit=${r}`;return f((0,u.KT)("cloud/groups?offset={offset}&search={search}",{offset:s,search:i})+o).then((e=>Object.keys(e.data.ocs.data.groups).length>0&&(e.data.ocs.data.groups.forEach((function(e){t.commit("addGroup",{gid:e,displayName:e})})),!0))).catch((e=>t.commit("API_FAILURE",e)))},getUsersFromList(t,e){let{offset:s,limit:r,search:i}=e;return i="string"==typeof i?i:"",f((0,u.KT)("cloud/users/details?offset={offset}&limit={limit}&search={search}",{offset:s,limit:r,search:i})).then((e=>Object.keys(e.data.ocs.data.users).length>0&&(t.commit("appendUsers",e.data.ocs.data.users),!0))).catch((e=>t.commit("API_FAILURE",e)))},getUsersFromGroup(t,e){let{groupid:s,offset:r,limit:i}=e;return f((0,u.KT)("cloud/users/{groupId}/details?offset={offset}&limit={limit}",{groupId:encodeURIComponent(s),offset:r,limit:i})).then((e=>t.commit("getUsersFromList",e.data.ocs.data.users))).catch((e=>t.commit("API_FAILURE",e)))},getPasswordPolicyMinLength:t=>!(!(0,a.F)().password_policy||!(0,a.F)().password_policy.minLength)&&(t.commit("setPasswordPolicyMinLength",(0,a.F)().password_policy.minLength),(0,a.F)().password_policy.minLength),addGroup:(t,e)=>g().then((s=>E((0,u.KT)("cloud/groups"),{groupid:e}).then((s=>(t.commit("addGroup",{gid:e,displayName:e}),{gid:e,displayName:e}))).catch((t=>{throw t})))).catch((s=>{throw t.commit("API_FAILURE",{gid:e,error:s}),s})),renameGroup(t,e){let{groupid:s,displayName:r}=e;return g().then((e=>A((0,u.KT)("cloud/groups/{groupId}",{groupId:encodeURIComponent(s)}),{key:"displayname",value:r}).then((e=>(t.commit("renameGroup",{gid:s,displayName:r}),{groupid:s,displayName:r}))).catch((t=>{throw t})))).catch((e=>{throw t.commit("API_FAILURE",{groupid:s,error:e}),e}))},removeGroup:(t,e)=>g().then((s=>I((0,u.KT)("cloud/groups/{groupId}",{groupId:encodeURIComponent(e)})).then((s=>t.commit("removeGroup",e))).catch((t=>{throw t})))).catch((s=>t.commit("API_FAILURE",{gid:e,error:s}))),addUserGroup(t,e){let{userid:s,gid:r}=e;return g().then((e=>E((0,u.KT)("cloud/users/{userid}/groups",{userid:s}),{groupid:r}).then((e=>t.commit("addUserGroup",{userid:s,gid:r}))).catch((t=>{throw t})))).catch((e=>t.commit("API_FAILURE",{userid:s,error:e})))},removeUserGroup(t,e){let{userid:s,gid:r}=e;return g().then((e=>I((0,u.KT)("cloud/users/{userid}/groups",{userid:s}),{groupid:r}).then((e=>t.commit("removeUserGroup",{userid:s,gid:r}))).catch((t=>{throw t})))).catch((e=>{throw t.commit("API_FAILURE",{userid:s,error:e}),e}))},addUserSubAdmin(t,e){let{userid:s,gid:r}=e;return g().then((e=>E((0,u.KT)("cloud/users/{userid}/subadmins",{userid:s}),{groupid:r}).then((e=>t.commit("addUserSubAdmin",{userid:s,gid:r}))).catch((t=>{throw t})))).catch((e=>t.commit("API_FAILURE",{userid:s,error:e})))},removeUserSubAdmin(t,e){let{userid:s,gid:r}=e;return g().then((e=>I((0,u.KT)("cloud/users/{userid}/subadmins",{userid:s}),{groupid:r}).then((e=>t.commit("removeUserSubAdmin",{userid:s,gid:r}))).catch((t=>{throw t})))).catch((e=>t.commit("API_FAILURE",{userid:s,error:e})))},async wipeUserDevices(t,e){try{return await g(),await E((0,u.KT)("cloud/users/{userid}/wipe",{userid:e}))}catch(s){return t.commit("API_FAILURE",{userid:e,error:s}),Promise.reject(new Error("Failed to wipe user devices"))}},deleteUser:(t,e)=>g().then((s=>I((0,u.KT)("cloud/users/{userid}",{userid:e})).then((s=>t.commit("deleteUser",e))).catch((t=>{throw t})))).catch((s=>t.commit("API_FAILURE",{userid:e,error:s}))),addUser(t,e){let{commit:s,dispatch:r}=t,{userid:i,password:o,displayName:n,email:a,groups:d,subadmin:c,quota:p,language:l,manager:m}=e;return g().then((t=>E((0,u.KT)("cloud/users"),{userid:i,password:o,displayName:n,email:a,groups:d,subadmin:c,quota:p,language:l,manager:m}).then((t=>r("addUserData",i||t.data.ocs.data.id))).catch((t=>{throw t})))).catch((t=>{throw s("API_FAILURE",{userid:i,error:t}),t}))},addUserData:(t,e)=>g().then((s=>f((0,u.KT)("cloud/users/{userid}",{userid:e})).then((e=>t.commit("addUserData",e))).catch((t=>{throw t})))).catch((s=>t.commit("API_FAILURE",{userid:e,error:s}))),enableDisableUser(t,e){let{userid:s,enabled:r=!0}=e;const i=r?"enable":"disable";return g().then((e=>A((0,u.KT)("cloud/users/{userid}/{userStatus}",{userid:s,userStatus:i})).then((e=>t.commit("enableDisableUser",{userid:s,enabled:r}))).catch((t=>{throw t})))).catch((e=>t.commit("API_FAILURE",{userid:s,error:e})))},async setUserData(t,e){let{userid:s,key:r,value:i}=e;const o=["email","displayname","manager"];if(-1!==["email","language","quota","displayname","password","manager"].indexOf(r)&&"string"==typeof i&&(-1===o.indexOf(r)&&i.length>0||-1!==o.indexOf(r)))try{return await g(),await A((0,u.KT)("cloud/users/{userid}",{userid:s}),{key:r,value:i}),t.commit("setUserData",{userid:s,key:r,value:i})}catch(e){t.commit("API_FAILURE",{userid:s,error:e})}return Promise.reject(new Error("Invalid request data"))},sendWelcomeMail:(t,e)=>g().then((t=>E((0,u.KT)("cloud/users/{userid}/welcome",{userid:e})).then((t=>!0)).catch((t=>{throw t})))).catch((s=>t.commit("API_FAILURE",{userid:e,error:s})))}};var U=r(32981),T=r(96763);const C={apps:[],bundles:(0,U.C)("settings","appstoreBundles",[]),categories:[],updateCount:(0,U.C)("settings","appstoreUpdateCount",0),loading:{},gettingCategoriesPromise:null},$={APPS_API_FAILURE(e,s){(0,c.Qg)(t("settings","An error occurred during the request. Unable to proceed.")+"<br>"+s.error.response.data.data.message,{isHTML:!0}),T.error(e,s)},initCategories(t,e){let{categories:s,updateCount:r}=e;t.categories=s,t.updateCount=r},updateCategories(t,e){t.gettingCategoriesPromise=e},setUpdateCount(t,e){t.updateCount=e},addCategory(t,e){t.categories.push(e)},appendCategories(t,e){t.categories=e},setAllApps(t,e){t.apps=e},setError(t,e){let{appId:s,error:r}=e;Array.isArray(s)||(s=[s]),s.forEach((e=>{t.apps.find((t=>t.id===e)).error=r}))},clearError(t,e){let{appId:s,error:r}=e;t.apps.find((t=>t.id===s)).error=null},enableApp(t,e){let{appId:s,groups:r}=e;const i=t.apps.find((t=>t.id===s));i.active=!0,i.groups=r},setInstallState(t,e){let{appId:s,canInstall:r}=e;const i=t.apps.find((t=>t.id===s));i&&(i.canInstall=!0===r)},disableApp(t,e){const s=t.apps.find((t=>t.id===e));s.active=!1,s.groups=[],s.removable&&(s.canUnInstall=!0)},uninstallApp(t,e){t.apps.find((t=>t.id===e)).active=!1,t.apps.find((t=>t.id===e)).groups=[],t.apps.find((t=>t.id===e)).needsDownload=!0,t.apps.find((t=>t.id===e)).installed=!1,t.apps.find((t=>t.id===e)).canUnInstall=!1,t.apps.find((t=>t.id===e)).canInstall=!0},updateApp(t,e){const s=t.apps.find((t=>t.id===e)),r=s.update;s.update=null,s.version=r,t.updateCount--},resetApps(t){t.apps=[]},reset(t){t.apps=[],t.categories=[],t.updateCount=0},startLoading(t,e){Array.isArray(e)?e.forEach((e=>{i.Ay.set(t.loading,e,!0)})):i.Ay.set(t.loading,e,!0)},stopLoading(t,e){Array.isArray(e)?e.forEach((e=>{i.Ay.set(t.loading,e,!1)})):i.Ay.set(t.loading,e,!1)}},F={enableApp(e,s){let r,{appId:i,groups:o}=s;return r=Array.isArray(i)?i:[i],g().then((s=>(e.commit("startLoading",r),e.commit("startLoading","install"),E((0,u.Jv)("settings/apps/enable"),{appIds:r,groups:o}).then((s=>(e.commit("stopLoading",r),e.commit("stopLoading","install"),r.forEach((t=>{e.commit("enableApp",{appId:t,groups:o})})),f((0,u.Jv)("apps/files/")).then((()=>{s.data.update_required&&((0,c.cf)(t("settings","The app has been enabled but needs to be updated. You will be redirected to the update page in 5 seconds."),{onClick:()=>window.location.reload(),close:!1}),setTimeout((function(){location.reload()}),5e3))})).catch((()=>{Array.isArray(i)||((0,c.Qg)(t("settings","Error: This app cannot be enabled because it makes the server unstable")),e.commit("setError",{appId:r,error:t("settings","Error: This app cannot be enabled because it makes the server unstable")}),e.dispatch("disableApp",{appId:i}))}))))).catch((t=>{e.commit("stopLoading",r),e.commit("stopLoading","install"),e.commit("setError",{appId:r,error:t.response.data.data.message}),e.commit("APPS_API_FAILURE",{appId:i,error:t})}))))).catch((t=>e.commit("API_FAILURE",{appId:i,error:t})))},forceEnableApp(t,e){let s,{appId:r,groups:i}=e;return s=Array.isArray(r)?r:[r],g().then((()=>(t.commit("startLoading",s),t.commit("startLoading","install"),E((0,u.Jv)("settings/apps/force"),{appId:r}).then((e=>{t.commit("setInstallState",{appId:r,canInstall:!0})})).catch((e=>{t.commit("stopLoading",s),t.commit("stopLoading","install"),t.commit("setError",{appId:s,error:e.response.data.data.message}),t.commit("APPS_API_FAILURE",{appId:r,error:e})})).finally((()=>{t.commit("stopLoading",s),t.commit("stopLoading","install")}))))).catch((e=>t.commit("API_FAILURE",{appId:r,error:e})))},disableApp(t,e){let s,{appId:r}=e;return s=Array.isArray(r)?r:[r],g().then((e=>(t.commit("startLoading",s),E((0,u.Jv)("settings/apps/disable"),{appIds:s}).then((e=>(t.commit("stopLoading",s),s.forEach((e=>{t.commit("disableApp",e)})),!0))).catch((e=>{t.commit("stopLoading",s),t.commit("APPS_API_FAILURE",{appId:r,error:e})}))))).catch((e=>t.commit("API_FAILURE",{appId:r,error:e})))},uninstallApp(t,e){let{appId:s}=e;return g().then((e=>(t.commit("startLoading",s),f((0,u.Jv)(`settings/apps/uninstall/${s}`)).then((e=>(t.commit("stopLoading",s),t.commit("uninstallApp",s),!0))).catch((e=>{t.commit("stopLoading",s),t.commit("APPS_API_FAILURE",{appId:s,error:e})}))))).catch((e=>t.commit("API_FAILURE",{appId:s,error:e})))},updateApp(t,e){let{appId:s}=e;return g().then((e=>(t.commit("startLoading",s),t.commit("startLoading","install"),f((0,u.Jv)(`settings/apps/update/${s}`)).then((e=>(t.commit("stopLoading","install"),t.commit("stopLoading",s),t.commit("updateApp",s),!0))).catch((e=>{t.commit("stopLoading",s),t.commit("stopLoading","install"),t.commit("APPS_API_FAILURE",{appId:s,error:e})}))))).catch((e=>t.commit("API_FAILURE",{appId:s,error:e})))},getAllApps:t=>(t.commit("startLoading","list"),f((0,u.Jv)("settings/apps/list")).then((e=>(t.commit("setAllApps",e.data.apps),t.commit("stopLoading","list"),!0))).catch((e=>t.commit("API_FAILURE",e)))),async getCategories(t){let{shouldRefetchCategories:e=!1}=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(e||!t.state.gettingCategoriesPromise){t.commit("startLoading","categories");try{const e=f((0,u.Jv)("settings/apps/categories"));t.commit("updateCategories",e);const s=await e;return s.data.length>0?(t.commit("appendCategories",s.data),t.commit("stopLoading","categories"),!0):(t.commit("stopLoading","categories"),!1)}catch(e){t.commit("API_FAILURE",e)}}return t.state.gettingCategoriesPromise}},S={state:C,mutations:$,getters:{loading:t=>function(e){return t.loading[e]},getCategories:t=>t.categories,getAllApps:t=>t.apps,getAppBundles:t=>t.bundles,getUpdateCount:t=>t.updateCount,getCategoryById:t=>e=>t.categories.find((t=>t.id===e))},actions:F},x={serverData:(0,U.C)("settings","usersSettings",{})},D={setServerData(t,e){t.serverData=e}},G={state:x,mutations:D,getters:{getServerData:t=>t.serverData},actions:{}},M={state:{},mutations:{},getters:{},actions:{setAppConfig(t,e){let{app:s,key:r,value:i}=e;return g().then((t=>E((0,u.KT)("apps/provisioning_api/api/v1/config/apps/{app}/{key}",{app:s,key:r}),{value:i}).catch((t=>{throw t})))).catch((e=>t.commit("API_FAILURE",{app:s,key:r,value:i,error:e})))}}};var j=r(96763);i.Ay.use(o.Ay);const k={API_FAILURE(e,s){try{const e=s.error.response.data.ocs.meta.message;(0,c.Qg)(t("settings","An error occurred during the request. Unable to proceed.")+"<br>"+e,{isHTML:!0})}catch(e){(0,c.Qg)(t("settings","An error occurred during the request. Unable to proceed."))}j.error(e,s)}};let B=null;const X=()=>(null===B&&(B=new o.il({modules:{users:_,apps:S,settings:G,oc:M},strict:!1,mutations:k})),B)},15916:(t,e,s)=>{"use strict";var r;s.d(e,{q:()=>r}),function(t){t[t.UserCount=1]="UserCount",t[t.GroupName=2]="GroupName"}(r||(r={}))},36620:(t,e,s)=>{"use strict";s.d(e,{A:()=>r});const r=(0,s(35947).YK)().setApp("settings").detectUser().build()},18539:(t,e,s)=>{"use strict";var r=s(85471),i=s(80284),o=s(58723),n=s(53334),a=s(22378);const d=(0,r.pM)({__name:"SettingsApp",setup:t=>({__sfc:!0,NcContent:a.A})}),c=(0,s(14486).A)(d,(function(){var t=this,e=t._self._c;return e(t._self._setupProxy.NcContent,{attrs:{"app-name":"settings"}},[e("router-view",{attrs:{name:"navigation"}}),t._v(" "),e("router-view"),t._v(" "),e("router-view",{attrs:{name:"sidebar"}})],1)}),[],!1,null,null,null).exports;var u=s(40173),p=s(63814);const l=[{name:"users",path:"/:index(index.php/)?settings/users",components:{default:()=>Promise.all([s.e(4208),s.e(7265),s.e(3239)]).then(s.bind(s,53603)),navigation:()=>Promise.all([s.e(4208),s.e(7265),s.e(3239)]).then(s.bind(s,39603))},props:!0,children:[{path:":selectedGroup",name:"group"}]},{path:"/:index(index.php/)?settings/apps",name:"apps",redirect:{name:"apps-category",params:{category:"discover"}},components:{default:()=>Promise.all([s.e(4208),s.e(7265),s.e(4529)]).then(s.bind(s,91114)),navigation:()=>Promise.all([s.e(4208),s.e(7265),s.e(4529)]).then(s.bind(s,53809)),sidebar:()=>Promise.all([s.e(4208),s.e(7265),s.e(4529)]).then(s.bind(s,36710))},children:[{path:":category",name:"apps-category",children:[{path:":id",name:"apps-details"}]}]}];r.Ay.use(u.Ay);const m=new u.Ay({mode:"history",base:(0,p.Jv)(""),linkActiveClass:"active",routes:l});var h=s(31755),g=s(21777),f=s(65899);r.Ay.use(i.Ay,{defaultHtml:!1});const E=(0,h.P)();(0,o.O)(E,m),s.nc=(0,g.aV)(),r.Ay.prototype.t=n.Tl,r.Ay.prototype.n=n.zw,r.Ay.use(f.R2);const A=(0,f.Ey)();new r.Ay({router:m,store:E,pinia:A,render:t=>t(c),el:"#content"})},58723:(t,e)=>{function s(t,e){var r={name:t.name,path:t.path,hash:t.hash,query:t.query,params:t.params,fullPath:t.fullPath,meta:t.meta};return e&&(r.from=s(e)),Object.freeze(r)}e.O=function(t,e,r){var i=(r||{}).moduleName||"route";t.registerModule(i,{namespaced:!0,state:s(e.currentRoute),mutations:{ROUTE_CHANGED:function(e,r){t.state[i]=s(r.to,r.from)}}});var o,n=!1,a=t.watch((function(t){return t[i]}),(function(t){var s=t.fullPath;s!==o&&(null!=o&&(n=!0,e.push(t)),o=s)}),{sync:!0}),d=e.afterEach((function(e,s){n?n=!1:(o=e.fullPath,t.commit(i+"/ROUTE_CHANGED",{to:e,from:s}))}));return function(){null!=d&&d(),null!=a&&a(),t.unregisterModule(i)}}},35810:(t,e,s)=>{"use strict";s.d(e,{Al:()=>F,H4:()=>C,Q$:()=>$,R3:()=>y,VL:()=>N,lJ:()=>U,lT:()=>G,pt:()=>L,ur:()=>j,v7:()=>D});var r=s(35947),i=s(21777),o=s(43627),n=s(71225),a=s(63814),d=s(36117),c=s(44719),u=s(82680),p=(s(87485),s(53334)),l=s(380),m=s(65606),h=s(96763);const g=(0,r.YK)().setApp("@nextcloud/files").detectUser().build();var f=(t=>(t[t.NONE=0]="NONE",t[t.CREATE=4]="CREATE",t[t.READ=1]="READ",t[t.UPDATE=2]="UPDATE",t[t.DELETE=8]="DELETE",t[t.SHARE=16]="SHARE",t[t.ALL=31]="ALL",t))(f||{});const E=["d:getcontentlength","d:getcontenttype","d:getetag","d:getlastmodified","d:creationdate","d:displayname","d:quota-available-bytes","d:resourcetype","nc:has-preview","nc:is-encrypted","nc:mount-type","oc:comments-unread","oc:favorite","oc:fileid","oc:owner-display-name","oc:owner-id","oc:permissions","oc:size"],A={d:"DAV:",nc:"http://nextcloud.org/ns",oc:"http://owncloud.org/ns",ocs:"http://open-collaboration-services.org/ns"},I=function(){return void 0===window._nc_dav_properties&&(window._nc_dav_properties=[...E]),window._nc_dav_properties.map((t=>`<${t} />`)).join(" ")},b=function(){return void 0===window._nc_dav_namespaces&&(window._nc_dav_namespaces={...A}),Object.keys(window._nc_dav_namespaces).map((t=>`xmlns:${t}="${window._nc_dav_namespaces?.[t]}"`)).join(" ")},N=function(){return`<?xml version="1.0"?>\n\t\t<d:propfind ${b()}>\n\t\t\t<d:prop>\n\t\t\t\t${I()}\n\t\t\t</d:prop>\n\t\t</d:propfind>`},y=function(t){return`<?xml version="1.0" encoding="UTF-8"?>\n<d:searchrequest ${b()}\n\txmlns:ns="https://github.com/icewind1991/SearchDAV/ns">\n\t<d:basicsearch>\n\t\t<d:select>\n\t\t\t<d:prop>\n\t\t\t\t${I()}\n\t\t\t</d:prop>\n\t\t</d:select>\n\t\t<d:from>\n\t\t\t<d:scope>\n\t\t\t\t<d:href>/files/${(0,i.HW)()?.uid}/</d:href>\n\t\t\t\t<d:depth>infinity</d:depth>\n\t\t\t</d:scope>\n\t\t</d:from>\n\t\t<d:where>\n\t\t\t<d:and>\n\t\t\t\t<d:or>\n\t\t\t\t\t<d:not>\n\t\t\t\t\t\t<d:eq>\n\t\t\t\t\t\t\t<d:prop>\n\t\t\t\t\t\t\t\t<d:getcontenttype/>\n\t\t\t\t\t\t\t</d:prop>\n\t\t\t\t\t\t\t<d:literal>httpd/unix-directory</d:literal>\n\t\t\t\t\t\t</d:eq>\n\t\t\t\t\t</d:not>\n\t\t\t\t\t<d:eq>\n\t\t\t\t\t\t<d:prop>\n\t\t\t\t\t\t\t<oc:size/>\n\t\t\t\t\t\t</d:prop>\n\t\t\t\t\t\t<d:literal>0</d:literal>\n\t\t\t\t\t</d:eq>\n\t\t\t\t</d:or>\n\t\t\t\t<d:gt>\n\t\t\t\t\t<d:prop>\n\t\t\t\t\t\t<d:getlastmodified/>\n\t\t\t\t\t</d:prop>\n\t\t\t\t\t<d:literal>${t}</d:literal>\n\t\t\t\t</d:gt>\n\t\t\t</d:and>\n\t\t</d:where>\n\t\t<d:orderby>\n\t\t\t<d:order>\n\t\t\t\t<d:prop>\n\t\t\t\t\t<d:getlastmodified/>\n\t\t\t\t</d:prop>\n\t\t\t\t<d:descending/>\n\t\t\t</d:order>\n\t\t</d:orderby>\n\t\t<d:limit>\n\t\t\t<d:nresults>100</d:nresults>\n\t\t\t<ns:firstresult>0</ns:firstresult>\n\t\t</d:limit>\n\t</d:basicsearch>\n</d:searchrequest>`};var L=(t=>(t.Folder="folder",t.File="file",t))(L||{});const v=function(t,e){return null!==t.match(e)},R=(t,e)=>{if(t.id&&"number"!=typeof t.id)throw new Error("Invalid id type of value");if(!t.source)throw new Error("Missing mandatory source");try{new URL(t.source)}catch(t){throw new Error("Invalid source format, source must be a valid URL")}if(!t.source.startsWith("http"))throw new Error("Invalid source format, only http(s) is supported");if(t.displayname&&"string"!=typeof t.displayname)throw new Error("Invalid displayname type");if(t.mtime&&!(t.mtime instanceof Date))throw new Error("Invalid mtime type");if(t.crtime&&!(t.crtime instanceof Date))throw new Error("Invalid crtime type");if(!t.mime||"string"!=typeof t.mime||!t.mime.match(/^[-\w.]+\/[-+\w.]+$/gi))throw new Error("Missing or invalid mandatory mime");if("size"in t&&"number"!=typeof t.size&&void 0!==t.size)throw new Error("Invalid size type");if("permissions"in t&&void 0!==t.permissions&&!("number"==typeof t.permissions&&t.permissions>=f.NONE&&t.permissions<=f.ALL))throw new Error("Invalid permissions");if(t.owner&&null!==t.owner&&"string"!=typeof t.owner)throw new Error("Invalid owner type");if(t.attributes&&"object"!=typeof t.attributes)throw new Error("Invalid attributes type");if(t.root&&"string"!=typeof t.root)throw new Error("Invalid root type");if(t.root&&!t.root.startsWith("/"))throw new Error("Root must start with a leading slash");if(t.root&&!t.source.includes(t.root))throw new Error("Root must be part of the source");if(t.root&&v(t.source,e)){const s=t.source.match(e)[0];if(!t.source.includes((0,o.join)(s,t.root)))throw new Error("The root must be relative to the service. e.g /files/emma")}if(t.status&&!Object.values(w).includes(t.status))throw new Error("Status must be a valid NodeStatus")};var w=(t=>(t.NEW="new",t.FAILED="failed",t.LOADING="loading",t.LOCKED="locked",t))(w||{});class O{_data;_attributes;_knownDavService=/(remote|public)\.php\/(web)?dav/i;readonlyAttributes=Object.entries(Object.getOwnPropertyDescriptors(O.prototype)).filter((t=>"function"==typeof t[1].get&&"__proto__"!==t[0])).map((t=>t[0]));handler={set:(t,e,s)=>!this.readonlyAttributes.includes(e)&&Reflect.set(t,e,s),deleteProperty:(t,e)=>!this.readonlyAttributes.includes(e)&&Reflect.deleteProperty(t,e),get:(t,e,s)=>this.readonlyAttributes.includes(e)?(g.warn(`Accessing "Node.attributes.${e}" is deprecated, access it directly on the Node instance.`),Reflect.get(this,e)):Reflect.get(t,e,s)};constructor(t,e){R(t,e||this._knownDavService),this._data={displayname:t.attributes?.displayname,...t,attributes:{}},this._attributes=new Proxy(this._data.attributes,this.handler),this.update(t.attributes??{}),e&&(this._knownDavService=e)}get source(){return this._data.source.replace(/\/$/i,"")}get encodedSource(){const{origin:t}=new URL(this.source);return t+(0,n.O0)(this.source.slice(t.length))}get basename(){return(0,o.basename)(this.source)}get displayname(){return this._data.displayname||this.basename}set displayname(t){this._data.displayname=t}get extension(){return(0,o.extname)(this.source)}get dirname(){if(this.root){let t=this.source;this.isDavRessource&&(t=t.split(this._knownDavService).pop());const e=t.indexOf(this.root),s=this.root.replace(/\/$/,"");return(0,o.dirname)(t.slice(e+s.length)||"/")}const t=new URL(this.source);return(0,o.dirname)(t.pathname)}get mime(){return this._data.mime}get mtime(){return this._data.mtime}set mtime(t){this._data.mtime=t}get crtime(){return this._data.crtime}get size(){return this._data.size}set size(t){this.updateMtime(),this._data.size=t}get attributes(){return this._attributes}get permissions(){return null!==this.owner||this.isDavRessource?void 0!==this._data.permissions?this._data.permissions:f.NONE:f.READ}set permissions(t){this.updateMtime(),this._data.permissions=t}get owner(){return this.isDavRessource?this._data.owner:null}get isDavRessource(){return v(this.source,this._knownDavService)}get root(){return this._data.root?this._data.root.replace(/^(.+)\/$/,"$1"):this.isDavRessource&&(0,o.dirname)(this.source).split(this._knownDavService).pop()||null}get path(){if(this.root){let t=this.source;this.isDavRessource&&(t=t.split(this._knownDavService).pop());const e=t.indexOf(this.root),s=this.root.replace(/\/$/,"");return t.slice(e+s.length)||"/"}return(this.dirname+"/"+this.basename).replace(/\/\//g,"/")}get fileid(){return this._data?.id}get status(){return this._data?.status}set status(t){this._data.status=t}move(t){R({...this._data,source:t},this._knownDavService);const e=this.basename;this._data.source=t,this.displayname===e&&this.basename!==e&&(this.displayname=this.basename),this.updateMtime()}rename(t){if(t.includes("/"))throw new Error("Invalid basename");this.move((0,o.dirname)(this.source)+"/"+t)}updateMtime(){this._data.mtime&&(this._data.mtime=new Date)}update(t){for(const[e,s]of Object.entries(t))try{void 0===s?delete this.attributes[e]:this.attributes[e]=s}catch(t){if(t instanceof TypeError)continue;throw t}}}class P extends O{get type(){return L.File}}class _ extends O{constructor(t){super({...t,mime:"httpd/unix-directory"})}get type(){return L.Folder}get extension(){return null}get mime(){return"httpd/unix-directory"}}const U=(0,u.f)()?`/files/${(0,u.G)()}`:`/files/${(0,i.HW)()?.uid}`,T=function(){const t=(0,a.dC)("dav");return(0,u.f)()?t.replace("remote.php","public.php"):t}(),C=function(t=T,e={}){const s=(0,c.UU)(t,{headers:e});function r(t){s.setHeaders({...e,"X-Requested-With":"XMLHttpRequest",requesttoken:t??""})}return(0,i.zo)(r),r((0,i.do)()),(0,c.Gu)().patch("fetch",((t,e)=>{const s=e.headers;return s?.method&&(e.method=s.method,delete s.method),fetch(t,e)})),s},$=(t,e="/",s=U)=>{const r=new AbortController;return new d.CancelablePromise((async(i,o,n)=>{n((()=>r.abort()));try{i((await t.getDirectoryContents(`${s}${e}`,{signal:r.signal,details:!0,data:`<?xml version="1.0"?>\n\t\t<oc:filter-files ${b()}>\n\t\t\t<d:prop>\n\t\t\t\t${I()}\n\t\t\t</d:prop>\n\t\t\t<oc:filter-rules>\n\t\t\t\t<oc:favorite>1</oc:favorite>\n\t\t\t</oc:filter-rules>\n\t\t</oc:filter-files>`,headers:{method:"REPORT"},includeSelf:!0})).data.filter((t=>t.filename!==e)).map((t=>F(t,s))))}catch(t){o(t)}}))},F=function(t,e=U,s=T){let r=(0,i.HW)()?.uid;if((0,u.f)())r=r??"anonymous";else if(!r)throw new Error("No user id found");const o=t.props,n=function(t=""){let e=f.NONE;return t?((t.includes("C")||t.includes("K"))&&(e|=f.CREATE),t.includes("G")&&(e|=f.READ),(t.includes("W")||t.includes("N")||t.includes("V"))&&(e|=f.UPDATE),t.includes("D")&&(e|=f.DELETE),t.includes("R")&&(e|=f.SHARE),e):e}(o?.permissions),a=String(o?.["owner-id"]||r),d=o.fileid||0,c={id:d,source:`${s}${t.filename}`,mtime:new Date(Date.parse(t.lastmod)),mime:t.mime||"application/octet-stream",displayname:void 0!==o.displayname?String(o.displayname):void 0,size:o?.size||Number.parseInt(o.getcontentlength||"0"),status:d<0?w.FAILED:void 0,permissions:n,owner:a,root:e,attributes:{...t,...o,hasPreview:o?.["has-preview"]}};return delete c.attributes?.props,"file"===t.type?new P(c):new _(c)};Error;const S=["B","KB","MB","GB","TB","PB"],x=["B","KiB","MiB","GiB","TiB","PiB"];function D(t,e=!1,s=!1,r=!1){s=s&&!r,"string"==typeof t&&(t=Number(t));let i=t>0?Math.floor(Math.log(t)/Math.log(r?1e3:1024)):0;i=Math.min((s?x.length:S.length)-1,i);const o=s?x[i]:S[i];let n=(t/Math.pow(r?1e3:1024,i)).toFixed(1);return!0===e&&0===i?("0.0"!==n?"< 1 ":"0 ")+(s?x[1]:S[1]):(n=i<2?parseFloat(n).toFixed(0):parseFloat(n).toLocaleString((0,p.lO)()),n+" "+o)}function G(t,e=!1){try{t=`${t}`.toLocaleLowerCase().replaceAll(/\s+/g,"").replaceAll(",",".")}catch(t){return null}const s=t.match(/^([0-9]*(\.[0-9]*)?)([kmgtp]?)(i?)b?$/);if(null===s||"."===s[1]||""===s[1])return null;const r=`${s[1]}`,i="i"===s[4]||e?1024:1e3;return Math.round(Number.parseFloat(r)*i**{"":0,k:1,m:2,g:3,t:4,p:5,e:6}[s[3]])}function M(t){return t instanceof Date?t.toISOString():String(t)}function j(t,e={}){const s={sortingMode:"basename",sortingOrder:"asc",...e};return function(t,e,s){s=s??[];const r=(e=e??[t=>t]).map(((t,e)=>"asc"===(s[e]??"asc")?1:-1)),i=Intl.Collator([(0,p.Z0)(),(0,p.lO)()],{numeric:!0,usage:"sort"});return[...t].sort(((t,s)=>{for(const[o,n]of e.entries()){const e=i.compare(M(n(t)),M(n(s)));if(0!==e)return e*r[o]}return 0}))}(t,[...s.sortFavoritesFirst?[t=>1!==t.attributes?.favorite]:[],...s.sortFoldersFirst?[t=>"folder"!==t.type]:[],..."basename"!==s.sortingMode?[t=>t[s.sortingMode]]:[],t=>{return(e=t.attributes?.displayname||t.basename).lastIndexOf(".")>0?e.slice(0,e.lastIndexOf(".")):e;var e},t=>t.basename],[...s.sortFavoritesFirst?["asc"]:[],...s.sortFoldersFirst?["asc"]:[],..."mtime"===s.sortingMode?["asc"===s.sortingOrder?"desc":"asc"]:[],..."mtime"!==s.sortingMode&&"basename"!==s.sortingMode?[s.sortingOrder]:[],s.sortingOrder,s.sortingOrder])}var k={};!function(t){const e=":A-Za-z_\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD",s="["+e+"]["+e+"\\-.\\d\\u00B7\\u0300-\\u036F\\u203F-\\u2040]*",r=new RegExp("^"+s+"$");t.isExist=function(t){return void 0!==t},t.isEmptyObject=function(t){return 0===Object.keys(t).length},t.merge=function(t,e,s){if(e){const r=Object.keys(e),i=r.length;for(let o=0;o<i;o++)t[r[o]]="strict"===s?[e[r[o]]]:e[r[o]]}},t.getValue=function(e){return t.isExist(e)?e:""},t.isName=function(t){return!(null==r.exec(t))},t.getAllMatches=function(t,e){const s=[];let r=e.exec(t);for(;r;){const i=[];i.startIndex=e.lastIndex-r[0].length;const o=r.length;for(let t=0;t<o;t++)i.push(r[t]);s.push(i),r=e.exec(t)}return s},t.nameRegexp=s}(k);new RegExp("(\\s*)([^\\s=]+)(\\s*=)?(\\s*(['\"])(([\\s\\S])*?)\\5)?","g");var B={};const X={preserveOrder:!1,attributeNamePrefix:"@_",attributesGroupName:!1,textNodeName:"#text",ignoreAttributes:!0,removeNSPrefix:!1,allowBooleanAttributes:!1,parseTagValue:!0,parseAttributeValue:!1,trimValues:!0,cdataPropName:!1,numberParseOptions:{hex:!0,leadingZeros:!0,eNotation:!0},tagValueProcessor:function(t,e){return e},attributeValueProcessor:function(t,e){return e},stopNodes:[],alwaysCreateTextNode:!1,isArray:()=>!1,commentPropName:!1,unpairedTags:[],processEntities:!0,htmlEntities:!1,ignoreDeclaration:!1,ignorePiTags:!1,transformTagName:!1,transformAttributeName:!1,updateTag:function(t,e,s){return t}};B.buildOptions=function(t){return Object.assign({},X,t)},B.defaultOptions=X,!Number.parseInt&&window.parseInt&&(Number.parseInt=window.parseInt),!Number.parseFloat&&window.parseFloat&&(Number.parseFloat=window.parseFloat),new RegExp("([^\\s=]+)\\s*(=\\s*(['\"])([\\s\\S]*?)\\3)?","gm");var V={};function K(t,e,s){let r;const i={};for(let o=0;o<t.length;o++){const n=t[o],a=q(n);let d="";if(d=void 0===s?a:s+"."+a,a===e.textNodeName)void 0===r?r=n[a]:r+=""+n[a];else{if(void 0===a)continue;if(n[a]){let t=K(n[a],e,d);const s=z(t,e);n[":@"]?H(t,n[":@"],d,e):1!==Object.keys(t).length||void 0===t[e.textNodeName]||e.alwaysCreateTextNode?0===Object.keys(t).length&&(e.alwaysCreateTextNode?t[e.textNodeName]="":t=""):t=t[e.textNodeName],void 0!==i[a]&&i.hasOwnProperty(a)?(Array.isArray(i[a])||(i[a]=[i[a]]),i[a].push(t)):e.isArray(a,d,s)?i[a]=[t]:i[a]=t}}}return"string"==typeof r?r.length>0&&(i[e.textNodeName]=r):void 0!==r&&(i[e.textNodeName]=r),i}function q(t){const e=Object.keys(t);for(let t=0;t<e.length;t++){const s=e[t];if(":@"!==s)return s}}function H(t,e,s,r){if(e){const i=Object.keys(e),o=i.length;for(let n=0;n<o;n++){const o=i[n];r.isArray(o,s+"."+o,!0,!0)?t[o]=[e[o]]:t[o]=e[o]}}}function z(t,e){const{textNodeName:s}=e,r=Object.keys(t).length;return 0===r||!(1!==r||!t[s]&&"boolean"!=typeof t[s]&&0!==t[s])}V.prettify=function(t,e){return K(t,e)};const{buildOptions:J}=B,{prettify:W}=V;function Q(t,e,s,r){let i="",o=!1;for(let n=0;n<t.length;n++){const a=t[n],d=Y(a);if(void 0===d)continue;let c="";if(c=0===s.length?d:`${s}.${d}`,d===e.textNodeName){let t=a[d];tt(c,e)||(t=e.tagValueProcessor(d,t),t=et(t,e)),o&&(i+=r),i+=t,o=!1;continue}if(d===e.cdataPropName){o&&(i+=r),i+=`<![CDATA[${a[d][0][e.textNodeName]}]]>`,o=!1;continue}if(d===e.commentPropName){i+=r+`\x3c!--${a[d][0][e.textNodeName]}--\x3e`,o=!0;continue}if("?"===d[0]){const t=Z(a[":@"],e),s="?xml"===d?"":r;let n=a[d][0][e.textNodeName];n=0!==n.length?" "+n:"",i+=s+`<${d}${n}${t}?>`,o=!0;continue}let u=r;""!==u&&(u+=e.indentBy);const p=r+`<${d}${Z(a[":@"],e)}`,l=Q(a[d],e,c,u);-1!==e.unpairedTags.indexOf(d)?e.suppressUnpairedNode?i+=p+">":i+=p+"/>":l&&0!==l.length||!e.suppressEmptyNode?l&&l.endsWith(">")?i+=p+`>${l}${r}</${d}>`:(i+=p+">",l&&""!==r&&(l.includes("/>")||l.includes("</"))?i+=r+e.indentBy+l+r:i+=l,i+=`</${d}>`):i+=p+"/>",o=!0}return i}function Y(t){const e=Object.keys(t);for(let s=0;s<e.length;s++){const r=e[s];if(t.hasOwnProperty(r)&&":@"!==r)return r}}function Z(t,e){let s="";if(t&&!e.ignoreAttributes)for(let r in t){if(!t.hasOwnProperty(r))continue;let i=e.attributeValueProcessor(r,t[r]);i=et(i,e),!0===i&&e.suppressBooleanAttributes?s+=` ${r.substr(e.attributeNamePrefix.length)}`:s+=` ${r.substr(e.attributeNamePrefix.length)}="${i}"`}return s}function tt(t,e){let s=(t=t.substr(0,t.length-e.textNodeName.length-1)).substr(t.lastIndexOf(".")+1);for(let r in e.stopNodes)if(e.stopNodes[r]===t||e.stopNodes[r]==="*."+s)return!0;return!1}function et(t,e){if(t&&t.length>0&&e.processEntities)for(let s=0;s<e.entities.length;s++){const r=e.entities[s];t=t.replace(r.regex,r.val)}return t}const st=function(t,e){let s="";return e.format&&e.indentBy.length>0&&(s="\n"),Q(t,e,"",s)},rt={attributeNamePrefix:"@_",attributesGroupName:!1,textNodeName:"#text",ignoreAttributes:!0,cdataPropName:!1,format:!1,indentBy:" ",suppressEmptyNode:!1,suppressUnpairedNode:!0,suppressBooleanAttributes:!0,tagValueProcessor:function(t,e){return e},attributeValueProcessor:function(t,e){return e},preserveOrder:!1,commentPropName:!1,unpairedTags:[],entities:[{regex:new RegExp("&","g"),val:"&amp;"},{regex:new RegExp(">","g"),val:"&gt;"},{regex:new RegExp("<","g"),val:"&lt;"},{regex:new RegExp("'","g"),val:"&apos;"},{regex:new RegExp('"',"g"),val:"&quot;"}],processEntities:!0,stopNodes:[],oneListGroup:!1};function it(t){this.options=Object.assign({},rt,t),this.options.ignoreAttributes||this.options.attributesGroupName?this.isAttribute=function(){return!1}:(this.attrPrefixLen=this.options.attributeNamePrefix.length,this.isAttribute=at),this.processTextOrObjNode=ot,this.options.format?(this.indentate=nt,this.tagEndChar=">\n",this.newLine="\n"):(this.indentate=function(){return""},this.tagEndChar=">",this.newLine="")}function ot(t,e,s){const r=this.j2x(t,s+1);return void 0!==t[this.options.textNodeName]&&1===Object.keys(t).length?this.buildTextValNode(t[this.options.textNodeName],e,r.attrStr,s):this.buildObjectNode(r.val,e,r.attrStr,s)}function nt(t){return this.options.indentBy.repeat(t)}function at(t){return!(!t.startsWith(this.options.attributeNamePrefix)||t===this.options.textNodeName)&&t.substr(this.attrPrefixLen)}it.prototype.build=function(t){return this.options.preserveOrder?st(t,this.options):(Array.isArray(t)&&this.options.arrayNodeName&&this.options.arrayNodeName.length>1&&(t={[this.options.arrayNodeName]:t}),this.j2x(t,0).val)},it.prototype.j2x=function(t,e){let s="",r="";for(let i in t)if(Object.prototype.hasOwnProperty.call(t,i))if(void 0===t[i])this.isAttribute(i)&&(r+="");else if(null===t[i])this.isAttribute(i)?r+="":"?"===i[0]?r+=this.indentate(e)+"<"+i+"?"+this.tagEndChar:r+=this.indentate(e)+"<"+i+"/"+this.tagEndChar;else if(t[i]instanceof Date)r+=this.buildTextValNode(t[i],i,"",e);else if("object"!=typeof t[i]){const o=this.isAttribute(i);if(o)s+=this.buildAttrPairStr(o,""+t[i]);else if(i===this.options.textNodeName){let e=this.options.tagValueProcessor(i,""+t[i]);r+=this.replaceEntitiesValue(e)}else r+=this.buildTextValNode(t[i],i,"",e)}else if(Array.isArray(t[i])){const s=t[i].length;let o="",n="";for(let a=0;a<s;a++){const s=t[i][a];if(void 0===s);else if(null===s)"?"===i[0]?r+=this.indentate(e)+"<"+i+"?"+this.tagEndChar:r+=this.indentate(e)+"<"+i+"/"+this.tagEndChar;else if("object"==typeof s)if(this.options.oneListGroup){const t=this.j2x(s,e+1);o+=t.val,this.options.attributesGroupName&&s.hasOwnProperty(this.options.attributesGroupName)&&(n+=t.attrStr)}else o+=this.processTextOrObjNode(s,i,e);else if(this.options.oneListGroup){let t=this.options.tagValueProcessor(i,s);t=this.replaceEntitiesValue(t),o+=t}else o+=this.buildTextValNode(s,i,"",e)}this.options.oneListGroup&&(o=this.buildObjectNode(o,i,n,e)),r+=o}else if(this.options.attributesGroupName&&i===this.options.attributesGroupName){const e=Object.keys(t[i]),r=e.length;for(let o=0;o<r;o++)s+=this.buildAttrPairStr(e[o],""+t[i][e[o]])}else r+=this.processTextOrObjNode(t[i],i,e);return{attrStr:s,val:r}},it.prototype.buildAttrPairStr=function(t,e){return e=this.options.attributeValueProcessor(t,""+e),e=this.replaceEntitiesValue(e),this.options.suppressBooleanAttributes&&"true"===e?" "+t:" "+t+'="'+e+'"'},it.prototype.buildObjectNode=function(t,e,s,r){if(""===t)return"?"===e[0]?this.indentate(r)+"<"+e+s+"?"+this.tagEndChar:this.indentate(r)+"<"+e+s+this.closeTag(e)+this.tagEndChar;{let i="</"+e+this.tagEndChar,o="";return"?"===e[0]&&(o="?",i=""),!s&&""!==s||-1!==t.indexOf("<")?!1!==this.options.commentPropName&&e===this.options.commentPropName&&0===o.length?this.indentate(r)+`\x3c!--${t}--\x3e`+this.newLine:this.indentate(r)+"<"+e+s+o+this.tagEndChar+t+this.indentate(r)+i:this.indentate(r)+"<"+e+s+o+">"+t+i}},it.prototype.closeTag=function(t){let e="";return-1!==this.options.unpairedTags.indexOf(t)?this.options.suppressUnpairedNode||(e="/"):e=this.options.suppressEmptyNode?"/":`></${t}`,e},it.prototype.buildTextValNode=function(t,e,s,r){if(!1!==this.options.cdataPropName&&e===this.options.cdataPropName)return this.indentate(r)+`<![CDATA[${t}]]>`+this.newLine;if(!1!==this.options.commentPropName&&e===this.options.commentPropName)return this.indentate(r)+`\x3c!--${t}--\x3e`+this.newLine;if("?"===e[0])return this.indentate(r)+"<"+e+s+"?"+this.tagEndChar;{let i=this.options.tagValueProcessor(e,t);return i=this.replaceEntitiesValue(i),""===i?this.indentate(r)+"<"+e+s+this.closeTag(e)+this.tagEndChar:this.indentate(r)+"<"+e+s+">"+i+"</"+e+this.tagEndChar}},it.prototype.replaceEntitiesValue=function(t){if(t&&t.length>0&&this.options.processEntities)for(let e=0;e<this.options.entities.length;e++){const s=this.options.entities[e];t=t.replace(s.regex,s.val)}return t};var dt="object"==typeof m&&m.env&&m.env.NODE_DEBUG&&/\bsemver\b/i.test(m.env.NODE_DEBUG)?(...t)=>h.error("SEMVER",...t):()=>{},ct={MAX_LENGTH:256,MAX_SAFE_COMPONENT_LENGTH:16,MAX_SAFE_BUILD_LENGTH:250,MAX_SAFE_INTEGER:Number.MAX_SAFE_INTEGER||9007199254740991,RELEASE_TYPES:["major","premajor","minor","preminor","patch","prepatch","prerelease"],SEMVER_SPEC_VERSION:"2.0.0",FLAG_INCLUDE_PRERELEASE:1,FLAG_LOOSE:2},ut={exports:{}};!function(t,e){const{MAX_SAFE_COMPONENT_LENGTH:s,MAX_SAFE_BUILD_LENGTH:r,MAX_LENGTH:i}=ct,o=dt,n=(e=t.exports={}).re=[],a=e.safeRe=[],d=e.src=[],c=e.t={};let u=0;const p="[a-zA-Z0-9-]",l=[["\\s",1],["\\d",i],[p,r]],m=(t,e,s)=>{const r=(t=>{for(const[e,s]of l)t=t.split(`${e}*`).join(`${e}{0,${s}}`).split(`${e}+`).join(`${e}{1,${s}}`);return t})(e),i=u++;o(t,i,e),c[t]=i,d[i]=e,n[i]=new RegExp(e,s?"g":void 0),a[i]=new RegExp(r,s?"g":void 0)};m("NUMERICIDENTIFIER","0|[1-9]\\d*"),m("NUMERICIDENTIFIERLOOSE","\\d+"),m("NONNUMERICIDENTIFIER",`\\d*[a-zA-Z-]${p}*`),m("MAINVERSION",`(${d[c.NUMERICIDENTIFIER]})\\.(${d[c.NUMERICIDENTIFIER]})\\.(${d[c.NUMERICIDENTIFIER]})`),m("MAINVERSIONLOOSE",`(${d[c.NUMERICIDENTIFIERLOOSE]})\\.(${d[c.NUMERICIDENTIFIERLOOSE]})\\.(${d[c.NUMERICIDENTIFIERLOOSE]})`),m("PRERELEASEIDENTIFIER",`(?:${d[c.NUMERICIDENTIFIER]}|${d[c.NONNUMERICIDENTIFIER]})`),m("PRERELEASEIDENTIFIERLOOSE",`(?:${d[c.NUMERICIDENTIFIERLOOSE]}|${d[c.NONNUMERICIDENTIFIER]})`),m("PRERELEASE",`(?:-(${d[c.PRERELEASEIDENTIFIER]}(?:\\.${d[c.PRERELEASEIDENTIFIER]})*))`),m("PRERELEASELOOSE",`(?:-?(${d[c.PRERELEASEIDENTIFIERLOOSE]}(?:\\.${d[c.PRERELEASEIDENTIFIERLOOSE]})*))`),m("BUILDIDENTIFIER",`${p}+`),m("BUILD",`(?:\\+(${d[c.BUILDIDENTIFIER]}(?:\\.${d[c.BUILDIDENTIFIER]})*))`),m("FULLPLAIN",`v?${d[c.MAINVERSION]}${d[c.PRERELEASE]}?${d[c.BUILD]}?`),m("FULL",`^${d[c.FULLPLAIN]}$`),m("LOOSEPLAIN",`[v=\\s]*${d[c.MAINVERSIONLOOSE]}${d[c.PRERELEASELOOSE]}?${d[c.BUILD]}?`),m("LOOSE",`^${d[c.LOOSEPLAIN]}$`),m("GTLT","((?:<|>)?=?)"),m("XRANGEIDENTIFIERLOOSE",`${d[c.NUMERICIDENTIFIERLOOSE]}|x|X|\\*`),m("XRANGEIDENTIFIER",`${d[c.NUMERICIDENTIFIER]}|x|X|\\*`),m("XRANGEPLAIN",`[v=\\s]*(${d[c.XRANGEIDENTIFIER]})(?:\\.(${d[c.XRANGEIDENTIFIER]})(?:\\.(${d[c.XRANGEIDENTIFIER]})(?:${d[c.PRERELEASE]})?${d[c.BUILD]}?)?)?`),m("XRANGEPLAINLOOSE",`[v=\\s]*(${d[c.XRANGEIDENTIFIERLOOSE]})(?:\\.(${d[c.XRANGEIDENTIFIERLOOSE]})(?:\\.(${d[c.XRANGEIDENTIFIERLOOSE]})(?:${d[c.PRERELEASELOOSE]})?${d[c.BUILD]}?)?)?`),m("XRANGE",`^${d[c.GTLT]}\\s*${d[c.XRANGEPLAIN]}$`),m("XRANGELOOSE",`^${d[c.GTLT]}\\s*${d[c.XRANGEPLAINLOOSE]}$`),m("COERCEPLAIN",`(^|[^\\d])(\\d{1,${s}})(?:\\.(\\d{1,${s}}))?(?:\\.(\\d{1,${s}}))?`),m("COERCE",`${d[c.COERCEPLAIN]}(?:$|[^\\d])`),m("COERCEFULL",d[c.COERCEPLAIN]+`(?:${d[c.PRERELEASE]})?(?:${d[c.BUILD]})?(?:$|[^\\d])`),m("COERCERTL",d[c.COERCE],!0),m("COERCERTLFULL",d[c.COERCEFULL],!0),m("LONETILDE","(?:~>?)"),m("TILDETRIM",`(\\s*)${d[c.LONETILDE]}\\s+`,!0),e.tildeTrimReplace="$1~",m("TILDE",`^${d[c.LONETILDE]}${d[c.XRANGEPLAIN]}$`),m("TILDELOOSE",`^${d[c.LONETILDE]}${d[c.XRANGEPLAINLOOSE]}$`),m("LONECARET","(?:\\^)"),m("CARETTRIM",`(\\s*)${d[c.LONECARET]}\\s+`,!0),e.caretTrimReplace="$1^",m("CARET",`^${d[c.LONECARET]}${d[c.XRANGEPLAIN]}$`),m("CARETLOOSE",`^${d[c.LONECARET]}${d[c.XRANGEPLAINLOOSE]}$`),m("COMPARATORLOOSE",`^${d[c.GTLT]}\\s*(${d[c.LOOSEPLAIN]})$|^$`),m("COMPARATOR",`^${d[c.GTLT]}\\s*(${d[c.FULLPLAIN]})$|^$`),m("COMPARATORTRIM",`(\\s*)${d[c.GTLT]}\\s*(${d[c.LOOSEPLAIN]}|${d[c.XRANGEPLAIN]})`,!0),e.comparatorTrimReplace="$1$2$3",m("HYPHENRANGE",`^\\s*(${d[c.XRANGEPLAIN]})\\s+-\\s+(${d[c.XRANGEPLAIN]})\\s*$`),m("HYPHENRANGELOOSE",`^\\s*(${d[c.XRANGEPLAINLOOSE]})\\s+-\\s+(${d[c.XRANGEPLAINLOOSE]})\\s*$`),m("STAR","(<|>)?=?\\s*\\*"),m("GTE0","^\\s*>=\\s*0\\.0\\.0\\s*$"),m("GTE0PRE","^\\s*>=\\s*0\\.0\\.0-0\\s*$")}(ut,ut.exports);var pt=ut.exports;Object.freeze({loose:!0}),Object.freeze({});const lt=/^[0-9]+$/,mt=(t,e)=>{const s=lt.test(t),r=lt.test(e);return s&&r&&(t=+t,e=+e),t===e?0:s&&!r?-1:r&&!s?1:t<e?-1:1};var ht={compareIdentifiers:mt,rcompareIdentifiers:(t,e)=>mt(e,t)};const{MAX_LENGTH:gt,MAX_SAFE_INTEGER:ft}=ct,{safeRe:Et,t:At}=pt,{compareIdentifiers:It}=ht;l.m}},o={};function n(t){var e=o[t];if(void 0!==e)return e.exports;var s=o[t]={id:t,loaded:!1,exports:{}};return i[t].call(s.exports,s,s.exports,n),s.loaded=!0,s.exports}n.m=i,e=[],n.O=(t,s,r,i)=>{if(!s){var o=1/0;for(u=0;u<e.length;u++){s=e[u][0],r=e[u][1],i=e[u][2];for(var a=!0,d=0;d<s.length;d++)(!1&i||o>=i)&&Object.keys(n.O).every((t=>n.O[t](s[d])))?s.splice(d--,1):(a=!1,i<o&&(o=i));if(a){e.splice(u--,1);var c=r();void 0!==c&&(t=c)}}return t}i=i||0;for(var u=e.length;u>0&&e[u-1][2]>i;u--)e[u]=e[u-1];e[u]=[s,r,i]},n.n=t=>{var e=t&&t.__esModule?()=>t.default:()=>t;return n.d(e,{a:e}),e},n.d=(t,e)=>{for(var s in e)n.o(e,s)&&!n.o(t,s)&&Object.defineProperty(t,s,{enumerable:!0,get:e[s]})},n.f={},n.e=t=>Promise.all(Object.keys(n.f).reduce(((e,s)=>(n.f[s](t,e),e)),[])),n.u=t=>(({3239:"settings-users",4529:"settings-apps-view"}[t]||t)+"-"+t+".js?v="+{802:"eddac441912aee9d7aa8",3239:"61490dd5ed1c5d8390cb",4529:"1ff3e764eab81081e54c",4546:"a06fb7f5c8fd8d53c2d3",7265:"715398afd1ab50836642",8737:"6a26621151e51d343a78",9291:"077955af818a227340aa",9972:"b7597ad74d36447b4184"}[t]),n.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(t){if("object"==typeof window)return window}}(),n.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),s={},r="nextcloud:",n.l=(t,e,i,o)=>{if(s[t])s[t].push(e);else{var a,d;if(void 0!==i)for(var c=document.getElementsByTagName("script"),u=0;u<c.length;u++){var p=c[u];if(p.getAttribute("src")==t||p.getAttribute("data-webpack")==r+i){a=p;break}}a||(d=!0,(a=document.createElement("script")).charset="utf-8",a.timeout=120,n.nc&&a.setAttribute("nonce",n.nc),a.setAttribute("data-webpack",r+i),a.src=t),s[t]=[e];var l=(e,r)=>{a.onerror=a.onload=null,clearTimeout(m);var i=s[t];if(delete s[t],a.parentNode&&a.parentNode.removeChild(a),i&&i.forEach((t=>t(r))),e)return e(r)},m=setTimeout(l.bind(null,void 0,{type:"timeout",target:a}),12e4);a.onerror=l.bind(null,a.onerror),a.onload=l.bind(null,a.onload),d&&document.head.appendChild(a)}},n.r=t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},n.nmd=t=>(t.paths=[],t.children||(t.children=[]),t),n.j=2689,(()=>{var t;n.g.importScripts&&(t=n.g.location+"");var e=n.g.document;if(!t&&e&&(e.currentScript&&"SCRIPT"===e.currentScript.tagName.toUpperCase()&&(t=e.currentScript.src),!t)){var s=e.getElementsByTagName("script");if(s.length)for(var r=s.length-1;r>-1&&(!t||!/^http(s?):/.test(t));)t=s[r--].src}if(!t)throw new Error("Automatic publicPath is not supported in this browser");t=t.replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),n.p=t})(),(()=>{n.b=document.baseURI||self.location.href;var t={2689:0};n.f.j=(e,s)=>{var r=n.o(t,e)?t[e]:void 0;if(0!==r)if(r)s.push(r[2]);else{var i=new Promise(((s,i)=>r=t[e]=[s,i]));s.push(r[2]=i);var o=n.p+n.u(e),a=new Error;n.l(o,(s=>{if(n.o(t,e)&&(0!==(r=t[e])&&(t[e]=void 0),r)){var i=s&&("load"===s.type?"missing":s.type),o=s&&s.target&&s.target.src;a.message="Loading chunk "+e+" failed.\n("+i+": "+o+")",a.name="ChunkLoadError",a.type=i,a.request=o,r[1](a)}}),"chunk-"+e,e)}},n.O.j=e=>0===t[e];var e=(e,s)=>{var r,i,o=s[0],a=s[1],d=s[2],c=0;if(o.some((e=>0!==t[e]))){for(r in a)n.o(a,r)&&(n.m[r]=a[r]);if(d)var u=d(n)}for(e&&e(s);c<o.length;c++)i=o[c],n.o(t,i)&&t[i]&&t[i][0](),t[i]=0;return n.O(u)},s=self.webpackChunknextcloud=self.webpackChunknextcloud||[];s.forEach(e.bind(null,0)),s.push=e.bind(null,s.push.bind(s))})(),n.nc=void 0;var a=n.O(void 0,[4208],(()=>n(18539)));a=n.O(a)})();
-//# sourceMappingURL=settings-vue-settings-apps-users-management.js.map?v=cf5e5a027a7d8730451c \ No newline at end of file
+(()=>{var e,s,r,i={31755:(e,s,r)=>{"use strict";r.d(s,{P:()=>X});var i=r(85471),o=r(95353),n=r(59097),a=r(87485),d=r(35810),c=r(85168),u=r(63814),p=r(65043),l=r(15916),m=r(56760);r(51257);const h=function(t){return t.replace(/\/$/,"")},g=()=>(0,m.C)(),f=(t,e)=>p.Ay.get(h(t),e),E=(t,e)=>p.Ay.post(h(t),e),A=(t,e)=>p.Ay.put(h(t),e),I=(t,e)=>p.Ay.delete(h(t),{params:e});var b=r(36620),N=r(96763);const y=(0,n.c0)("settings").persist(!0).build(),L={id:"",name:"",usercount:0,disabled:0,canAdd:!0,canRemove:!0},v={users:[],groups:[],orderBy:l.q.UserCount,minPasswordLength:0,usersOffset:0,usersLimit:25,disabledUsersOffset:0,disabledUsersLimit:25,userCount:0,showConfig:{showStoragePath:"true"===y.getItem("account_settings__showStoragePath"),showUserBackend:"true"===y.getItem("account_settings__showUserBackend"),showLastLogin:"true"===y.getItem("account_settings__showLastLogin"),showNewUserForm:"true"===y.getItem("account_settings__showNewUserForm"),showLanguages:"true"===y.getItem("account_settings__showLanguages")}},R={appendUsers(t,e){const s=t.users.map((t=>{let{id:e}=t;return e})),r=Object.values(e).filter((t=>{let{id:e}=t;return!s.includes(e)})),i=t.users.concat(r);t.usersOffset+=t.usersLimit,t.users=i},updateDisabledUsers(t,e){t.disabledUsersOffset+=t.disabledUsersLimit},setPasswordPolicyMinLength(t,e){t.minPasswordLength=""!==e?e:0},initGroups(t,e){let{groups:s,orderBy:r,userCount:i}=e;t.groups=s.map((t=>Object.assign({},L,t))),t.orderBy=r,t.userCount=i},addGroup(t,e){let{gid:s,displayName:r}=e;try{if(void 0!==t.groups.find((t=>t.id===s)))return;const e=Object.assign({},L,{id:s,name:r});t.groups.unshift(e)}catch(t){N.error("Can't create group",t)}},renameGroup(t,e){let{gid:s,displayName:r}=e;const i=t.groups.findIndex((t=>t.id===s));if(i>=0){const e=t.groups[i];e.name=r,t.groups.splice(i,1,e)}},removeGroup(t,e){const s=t.groups.findIndex((t=>t.id===e));s>=0&&t.groups.splice(s,1)},addUserGroup(t,e){let{userid:s,gid:r}=e;const i=t.groups.find((t=>t.id===r)),o=t.users.find((t=>t.id===s));i&&o.enabled&&t.userCount>0&&i.usercount++,o.groups.push(r)},removeUserGroup(t,e){let{userid:s,gid:r}=e;const i=t.groups.find((t=>t.id===r)),o=t.users.find((t=>t.id===s));i&&o.enabled&&t.userCount>0&&i.usercount--;const n=o.groups;n.splice(n.indexOf(r),1)},addUserSubAdmin(t,e){let{userid:s,gid:r}=e;t.users.find((t=>t.id===s)).subadmin.push(r)},removeUserSubAdmin(t,e){let{userid:s,gid:r}=e;const i=t.users.find((t=>t.id===s)).subadmin;i.splice(i.indexOf(r),1)},deleteUser(t,e){const s=t.users.findIndex((t=>t.id===e));this.commit("updateUserCounts",{user:t.users[s],actionType:"remove"}),t.users.splice(s,1)},addUserData(t,e){const s=e.data.ocs.data;t.users.unshift(s),this.commit("updateUserCounts",{user:s,actionType:"create"})},enableDisableUser(t,e){let{userid:s,enabled:r}=e;const i=t.users.find((t=>t.id===s));i.enabled=r,this.commit("updateUserCounts",{user:i,actionType:r?"enable":"disable"})},updateUserCounts(t,e){let{user:s,actionType:r}=e;if(0===t.userCount)return;const i=t.groups.find((t=>"__nc_internal_recent"===t.id)),o=t.groups.find((t=>"disabled"===t.id));switch(r){case"enable":case"disable":o.usercount+=s.enabled?-1:1,i.usercount+=s.enabled?1:-1,t.userCount+=s.enabled?1:-1,s.groups.forEach((e=>{t.groups.find((t=>t.id===e)).disabled+=s.enabled?-1:1}));break;case"create":i.usercount++,t.userCount++,s.groups.forEach((e=>{t.groups.find((t=>t.id===e)).usercount++}));break;case"remove":s.enabled?(i.usercount--,t.userCount--,s.groups.forEach((e=>{const s=t.groups.find((t=>t.id===e));s?s.usercount--:N.warn("User group "+e+" does not exist during user removal")}))):(o.usercount--,s.groups.forEach((e=>{t.groups.find((t=>t.id===e)).disabled--})));break;default:b.A.error(`Unknown action type in updateUserCounts: '${r}'`)}},setUserData(t,e){let{userid:s,key:r,value:i}=e;if("quota"===r){const e=(0,d.lT)(i,!0);t.users.find((t=>t.id===s))[r][r]=null!==e?e:i}else t.users.find((t=>t.id===s))[r]=i},resetUsers(t){t.users=[],t.usersOffset=0,t.disabledUsersOffset=0},setShowConfig(t,e){let{key:s,value:r}=e;y.setItem(`account_settings__${s}`,JSON.stringify(r)),t.showConfig[s]=r},setGroupSorting(e,s){const r=e.orderBy;e.orderBy=s,p.Ay.post((0,u.Jv)("/settings/users/preferences/group.sortBy"),{value:String(s)}).catch((s=>{e.orderBy=r,(0,c.Qg)(t("settings","Could not set group sorting")),b.A.error(s)}))}},w={getUsers:t=>t.users,getGroups:t=>t.groups,getSubadminGroups:t=>t.groups.filter((t=>"admin"!==t.id&&"__nc_internal_recent"!==t.id&&"disabled"!==t.id)),getSortedGroups(t){const e=[...t.groups];return t.orderBy===l.q.UserCount?e.sort(((t,e)=>{const s=t.usercount-t.disabled,r=e.usercount-e.disabled;return s<r?1:r<s?-1:t.name.localeCompare(e.name)})):e.sort(((t,e)=>t.name.localeCompare(e.name)))},getGroupSorting:t=>t.orderBy,getPasswordPolicyMinLength:t=>t.minPasswordLength,getUsersOffset:t=>t.usersOffset,getUsersLimit:t=>t.usersLimit,getDisabledUsersOffset:t=>t.disabledUsersOffset,getDisabledUsersLimit:t=>t.disabledUsersLimit,getUserCount:t=>t.userCount,getShowConfig:t=>t.showConfig},O=p.Ay.CancelToken;let P=null;const _={state:v,mutations:R,getters:w,actions:{searchUsers(t,e){let{offset:s,limit:r,search:i}=e;return i="string"==typeof i?i:"",f((0,u.KT)("cloud/users/details?offset={offset}&limit={limit}&search={search}",{offset:s,limit:r,search:i})).catch((e=>{p.Ay.isCancel(e)||t.commit("API_FAILURE",e)}))},getUser:(t,e)=>f((0,u.KT)(`cloud/users/${e}`)).catch((e=>{p.Ay.isCancel(e)||t.commit("API_FAILURE",e)})),getUsers(t,e){let{offset:s,limit:r,search:i,group:o}=e;return P&&P.cancel("Operation canceled by another search request."),P=O.source(),i="string"==typeof i?i:"",i=i.replace(/in:[^\s]+/g,"").trim(),o="string"==typeof o?o:"",""!==o?f((0,u.KT)("cloud/groups/{group}/users/details?offset={offset}&limit={limit}&search={search}",{group:encodeURIComponent(o),offset:s,limit:r,search:i}),{cancelToken:P.token}).then((e=>{const s=Object.keys(e.data.ocs.data.users).length;return s>0&&t.commit("appendUsers",e.data.ocs.data.users),s})).catch((e=>{p.Ay.isCancel(e)||t.commit("API_FAILURE",e)})):f((0,u.KT)("cloud/users/details?offset={offset}&limit={limit}&search={search}",{offset:s,limit:r,search:i}),{cancelToken:P.token}).then((e=>{const s=Object.keys(e.data.ocs.data.users).length;return s>0&&t.commit("appendUsers",e.data.ocs.data.users),s})).catch((e=>{p.Ay.isCancel(e)||t.commit("API_FAILURE",e)}))},async getRecentUsers(t,e){let{offset:s,limit:r,search:i}=e;const o=(0,u.KT)("cloud/users/recent?offset={offset}&limit={limit}&search={search}",{offset:s,limit:r,search:i});try{const e=await f(o),s=Object.keys(e.data.ocs.data.users).length;return s>0&&t.commit("appendUsers",e.data.ocs.data.users),s}catch(e){t.commit("API_FAILURE",e)}},async getDisabledUsers(t,e){let{offset:s,limit:r,search:i}=e;const o=(0,u.KT)("cloud/users/disabled?offset={offset}&limit={limit}&search={search}",{offset:s,limit:r,search:i});try{const e=await f(o),s=Object.keys(e.data.ocs.data.users).length;return s>0&&(t.commit("appendUsers",e.data.ocs.data.users),t.commit("updateDisabledUsers",e.data.ocs.data.users)),s}catch(e){t.commit("API_FAILURE",e)}},getGroups(t,e){let{offset:s,limit:r,search:i}=e;i="string"==typeof i?i:"";const o=-1===r?"":`&limit=${r}`;return f((0,u.KT)("cloud/groups?offset={offset}&search={search}",{offset:s,search:i})+o).then((e=>Object.keys(e.data.ocs.data.groups).length>0&&(e.data.ocs.data.groups.forEach((function(e){t.commit("addGroup",{gid:e,displayName:e})})),!0))).catch((e=>t.commit("API_FAILURE",e)))},getUsersFromList(t,e){let{offset:s,limit:r,search:i}=e;return i="string"==typeof i?i:"",f((0,u.KT)("cloud/users/details?offset={offset}&limit={limit}&search={search}",{offset:s,limit:r,search:i})).then((e=>Object.keys(e.data.ocs.data.users).length>0&&(t.commit("appendUsers",e.data.ocs.data.users),!0))).catch((e=>t.commit("API_FAILURE",e)))},getUsersFromGroup(t,e){let{groupid:s,offset:r,limit:i}=e;return f((0,u.KT)("cloud/users/{groupId}/details?offset={offset}&limit={limit}",{groupId:encodeURIComponent(s),offset:r,limit:i})).then((e=>t.commit("getUsersFromList",e.data.ocs.data.users))).catch((e=>t.commit("API_FAILURE",e)))},getPasswordPolicyMinLength:t=>!(!(0,a.F)().password_policy||!(0,a.F)().password_policy.minLength)&&(t.commit("setPasswordPolicyMinLength",(0,a.F)().password_policy.minLength),(0,a.F)().password_policy.minLength),addGroup:(t,e)=>g().then((s=>E((0,u.KT)("cloud/groups"),{groupid:e}).then((s=>(t.commit("addGroup",{gid:e,displayName:e}),{gid:e,displayName:e}))).catch((t=>{throw t})))).catch((s=>{throw t.commit("API_FAILURE",{gid:e,error:s}),s})),renameGroup(t,e){let{groupid:s,displayName:r}=e;return g().then((e=>A((0,u.KT)("cloud/groups/{groupId}",{groupId:encodeURIComponent(s)}),{key:"displayname",value:r}).then((e=>(t.commit("renameGroup",{gid:s,displayName:r}),{groupid:s,displayName:r}))).catch((t=>{throw t})))).catch((e=>{throw t.commit("API_FAILURE",{groupid:s,error:e}),e}))},removeGroup:(t,e)=>g().then((s=>I((0,u.KT)("cloud/groups/{groupId}",{groupId:encodeURIComponent(e)})).then((s=>t.commit("removeGroup",e))).catch((t=>{throw t})))).catch((s=>t.commit("API_FAILURE",{gid:e,error:s}))),addUserGroup(t,e){let{userid:s,gid:r}=e;return g().then((e=>E((0,u.KT)("cloud/users/{userid}/groups",{userid:s}),{groupid:r}).then((e=>t.commit("addUserGroup",{userid:s,gid:r}))).catch((t=>{throw t})))).catch((e=>t.commit("API_FAILURE",{userid:s,error:e})))},removeUserGroup(t,e){let{userid:s,gid:r}=e;return g().then((e=>I((0,u.KT)("cloud/users/{userid}/groups",{userid:s}),{groupid:r}).then((e=>t.commit("removeUserGroup",{userid:s,gid:r}))).catch((t=>{throw t})))).catch((e=>{throw t.commit("API_FAILURE",{userid:s,error:e}),e}))},addUserSubAdmin(t,e){let{userid:s,gid:r}=e;return g().then((e=>E((0,u.KT)("cloud/users/{userid}/subadmins",{userid:s}),{groupid:r}).then((e=>t.commit("addUserSubAdmin",{userid:s,gid:r}))).catch((t=>{throw t})))).catch((e=>t.commit("API_FAILURE",{userid:s,error:e})))},removeUserSubAdmin(t,e){let{userid:s,gid:r}=e;return g().then((e=>I((0,u.KT)("cloud/users/{userid}/subadmins",{userid:s}),{groupid:r}).then((e=>t.commit("removeUserSubAdmin",{userid:s,gid:r}))).catch((t=>{throw t})))).catch((e=>t.commit("API_FAILURE",{userid:s,error:e})))},async wipeUserDevices(t,e){try{return await g(),await E((0,u.KT)("cloud/users/{userid}/wipe",{userid:e}))}catch(s){return t.commit("API_FAILURE",{userid:e,error:s}),Promise.reject(new Error("Failed to wipe user devices"))}},deleteUser:(t,e)=>g().then((s=>I((0,u.KT)("cloud/users/{userid}",{userid:e})).then((s=>t.commit("deleteUser",e))).catch((t=>{throw t})))).catch((s=>t.commit("API_FAILURE",{userid:e,error:s}))),addUser(t,e){let{commit:s,dispatch:r}=t,{userid:i,password:o,displayName:n,email:a,groups:d,subadmin:c,quota:p,language:l,manager:m}=e;return g().then((t=>E((0,u.KT)("cloud/users"),{userid:i,password:o,displayName:n,email:a,groups:d,subadmin:c,quota:p,language:l,manager:m}).then((t=>r("addUserData",i||t.data.ocs.data.id))).catch((t=>{throw t})))).catch((t=>{throw s("API_FAILURE",{userid:i,error:t}),t}))},addUserData:(t,e)=>g().then((s=>f((0,u.KT)("cloud/users/{userid}",{userid:e})).then((e=>t.commit("addUserData",e))).catch((t=>{throw t})))).catch((s=>t.commit("API_FAILURE",{userid:e,error:s}))),enableDisableUser(t,e){let{userid:s,enabled:r=!0}=e;const i=r?"enable":"disable";return g().then((e=>A((0,u.KT)("cloud/users/{userid}/{userStatus}",{userid:s,userStatus:i})).then((e=>t.commit("enableDisableUser",{userid:s,enabled:r}))).catch((t=>{throw t})))).catch((e=>t.commit("API_FAILURE",{userid:s,error:e})))},async setUserData(t,e){let{userid:s,key:r,value:i}=e;const o=["email","displayname","manager"];if(-1!==["email","language","quota","displayname","password","manager"].indexOf(r)&&"string"==typeof i&&(-1===o.indexOf(r)&&i.length>0||-1!==o.indexOf(r)))try{return await g(),await A((0,u.KT)("cloud/users/{userid}",{userid:s}),{key:r,value:i}),t.commit("setUserData",{userid:s,key:r,value:i})}catch(e){t.commit("API_FAILURE",{userid:s,error:e})}return Promise.reject(new Error("Invalid request data"))},sendWelcomeMail:(t,e)=>g().then((t=>E((0,u.KT)("cloud/users/{userid}/welcome",{userid:e})).then((t=>!0)).catch((t=>{throw t})))).catch((s=>t.commit("API_FAILURE",{userid:e,error:s})))}};var U=r(32981),T=r(96763);const C={apps:[],bundles:(0,U.C)("settings","appstoreBundles",[]),categories:[],updateCount:(0,U.C)("settings","appstoreUpdateCount",0),loading:{},gettingCategoriesPromise:null},$={APPS_API_FAILURE(e,s){(0,c.Qg)(t("settings","An error occurred during the request. Unable to proceed.")+"<br>"+s.error.response.data.data.message,{isHTML:!0}),T.error(e,s)},initCategories(t,e){let{categories:s,updateCount:r}=e;t.categories=s,t.updateCount=r},updateCategories(t,e){t.gettingCategoriesPromise=e},setUpdateCount(t,e){t.updateCount=e},addCategory(t,e){t.categories.push(e)},appendCategories(t,e){t.categories=e},setAllApps(t,e){t.apps=e},setError(t,e){let{appId:s,error:r}=e;Array.isArray(s)||(s=[s]),s.forEach((e=>{t.apps.find((t=>t.id===e)).error=r}))},clearError(t,e){let{appId:s,error:r}=e;t.apps.find((t=>t.id===s)).error=null},enableApp(t,e){let{appId:s,groups:r}=e;const i=t.apps.find((t=>t.id===s));i.active=!0,i.groups=r},setInstallState(t,e){let{appId:s,canInstall:r}=e;const i=t.apps.find((t=>t.id===s));i&&(i.canInstall=!0===r)},disableApp(t,e){const s=t.apps.find((t=>t.id===e));s.active=!1,s.groups=[],s.removable&&(s.canUnInstall=!0)},uninstallApp(t,e){t.apps.find((t=>t.id===e)).active=!1,t.apps.find((t=>t.id===e)).groups=[],t.apps.find((t=>t.id===e)).needsDownload=!0,t.apps.find((t=>t.id===e)).installed=!1,t.apps.find((t=>t.id===e)).canUnInstall=!1,t.apps.find((t=>t.id===e)).canInstall=!0},updateApp(t,e){const s=t.apps.find((t=>t.id===e)),r=s.update;s.update=null,s.version=r,t.updateCount--},resetApps(t){t.apps=[]},reset(t){t.apps=[],t.categories=[],t.updateCount=0},startLoading(t,e){Array.isArray(e)?e.forEach((e=>{i.Ay.set(t.loading,e,!0)})):i.Ay.set(t.loading,e,!0)},stopLoading(t,e){Array.isArray(e)?e.forEach((e=>{i.Ay.set(t.loading,e,!1)})):i.Ay.set(t.loading,e,!1)}},F={enableApp(e,s){let r,{appId:i,groups:o}=s;return r=Array.isArray(i)?i:[i],g().then((s=>(e.commit("startLoading",r),e.commit("startLoading","install"),E((0,u.Jv)("settings/apps/enable"),{appIds:r,groups:o}).then((s=>(e.commit("stopLoading",r),e.commit("stopLoading","install"),r.forEach((t=>{e.commit("enableApp",{appId:t,groups:o})})),f((0,u.Jv)("apps/files/")).then((()=>{s.data.update_required&&((0,c.cf)(t("settings","The app has been enabled but needs to be updated. You will be redirected to the update page in 5 seconds."),{onClick:()=>window.location.reload(),close:!1}),setTimeout((function(){location.reload()}),5e3))})).catch((()=>{Array.isArray(i)||((0,c.Qg)(t("settings","Error: This app cannot be enabled because it makes the server unstable")),e.commit("setError",{appId:r,error:t("settings","Error: This app cannot be enabled because it makes the server unstable")}),e.dispatch("disableApp",{appId:i}))}))))).catch((t=>{e.commit("stopLoading",r),e.commit("stopLoading","install"),e.commit("setError",{appId:r,error:t.response.data.data.message}),e.commit("APPS_API_FAILURE",{appId:i,error:t})}))))).catch((t=>e.commit("API_FAILURE",{appId:i,error:t})))},forceEnableApp(t,e){let s,{appId:r,groups:i}=e;return s=Array.isArray(r)?r:[r],g().then((()=>(t.commit("startLoading",s),t.commit("startLoading","install"),E((0,u.Jv)("settings/apps/force"),{appId:r}).then((e=>{t.commit("setInstallState",{appId:r,canInstall:!0})})).catch((e=>{t.commit("stopLoading",s),t.commit("stopLoading","install"),t.commit("setError",{appId:s,error:e.response.data.data.message}),t.commit("APPS_API_FAILURE",{appId:r,error:e})})).finally((()=>{t.commit("stopLoading",s),t.commit("stopLoading","install")}))))).catch((e=>t.commit("API_FAILURE",{appId:r,error:e})))},disableApp(t,e){let s,{appId:r}=e;return s=Array.isArray(r)?r:[r],g().then((e=>(t.commit("startLoading",s),E((0,u.Jv)("settings/apps/disable"),{appIds:s}).then((e=>(t.commit("stopLoading",s),s.forEach((e=>{t.commit("disableApp",e)})),!0))).catch((e=>{t.commit("stopLoading",s),t.commit("APPS_API_FAILURE",{appId:r,error:e})}))))).catch((e=>t.commit("API_FAILURE",{appId:r,error:e})))},uninstallApp(t,e){let{appId:s}=e;return g().then((e=>(t.commit("startLoading",s),f((0,u.Jv)(`settings/apps/uninstall/${s}`)).then((e=>(t.commit("stopLoading",s),t.commit("uninstallApp",s),!0))).catch((e=>{t.commit("stopLoading",s),t.commit("APPS_API_FAILURE",{appId:s,error:e})}))))).catch((e=>t.commit("API_FAILURE",{appId:s,error:e})))},updateApp(t,e){let{appId:s}=e;return g().then((e=>(t.commit("startLoading",s),t.commit("startLoading","install"),f((0,u.Jv)(`settings/apps/update/${s}`)).then((e=>(t.commit("stopLoading","install"),t.commit("stopLoading",s),t.commit("updateApp",s),!0))).catch((e=>{t.commit("stopLoading",s),t.commit("stopLoading","install"),t.commit("APPS_API_FAILURE",{appId:s,error:e})}))))).catch((e=>t.commit("API_FAILURE",{appId:s,error:e})))},getAllApps:t=>(t.commit("startLoading","list"),f((0,u.Jv)("settings/apps/list")).then((e=>(t.commit("setAllApps",e.data.apps),t.commit("stopLoading","list"),!0))).catch((e=>t.commit("API_FAILURE",e)))),async getCategories(t){let{shouldRefetchCategories:e=!1}=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(e||!t.state.gettingCategoriesPromise){t.commit("startLoading","categories");try{const e=f((0,u.Jv)("settings/apps/categories"));t.commit("updateCategories",e);const s=await e;return s.data.length>0?(t.commit("appendCategories",s.data),t.commit("stopLoading","categories"),!0):(t.commit("stopLoading","categories"),!1)}catch(e){t.commit("API_FAILURE",e)}}return t.state.gettingCategoriesPromise}},S={state:C,mutations:$,getters:{loading:t=>function(e){return t.loading[e]},getCategories:t=>t.categories,getAllApps:t=>t.apps,getAppBundles:t=>t.bundles,getUpdateCount:t=>t.updateCount,getCategoryById:t=>e=>t.categories.find((t=>t.id===e))},actions:F},x={serverData:(0,U.C)("settings","usersSettings",{})},D={setServerData(t,e){t.serverData=e}},G={state:x,mutations:D,getters:{getServerData:t=>t.serverData},actions:{}},M={state:{},mutations:{},getters:{},actions:{setAppConfig(t,e){let{app:s,key:r,value:i}=e;return g().then((t=>E((0,u.KT)("apps/provisioning_api/api/v1/config/apps/{app}/{key}",{app:s,key:r}),{value:i}).catch((t=>{throw t})))).catch((e=>t.commit("API_FAILURE",{app:s,key:r,value:i,error:e})))}}};var j=r(96763);i.Ay.use(o.Ay);const k={API_FAILURE(e,s){try{const e=s.error.response.data.ocs.meta.message;(0,c.Qg)(t("settings","An error occurred during the request. Unable to proceed.")+"<br>"+e,{isHTML:!0})}catch(e){(0,c.Qg)(t("settings","An error occurred during the request. Unable to proceed."))}j.error(e,s)}};let B=null;const X=()=>(null===B&&(B=new o.il({modules:{users:_,apps:S,settings:G,oc:M},strict:!1,mutations:k})),B)},15916:(t,e,s)=>{"use strict";var r;s.d(e,{q:()=>r}),function(t){t[t.UserCount=1]="UserCount",t[t.GroupName=2]="GroupName"}(r||(r={}))},36620:(t,e,s)=>{"use strict";s.d(e,{A:()=>r});const r=(0,s(35947).YK)().setApp("settings").detectUser().build()},18539:(t,e,s)=>{"use strict";var r=s(85471),i=s(80284),o=s(58723),n=s(53334),a=s(22378);const d=(0,r.pM)({__name:"SettingsApp",setup:t=>({__sfc:!0,NcContent:a.A})}),c=(0,s(14486).A)(d,(function(){var t=this,e=t._self._c;return e(t._self._setupProxy.NcContent,{attrs:{"app-name":"settings"}},[e("router-view",{attrs:{name:"navigation"}}),t._v(" "),e("router-view"),t._v(" "),e("router-view",{attrs:{name:"sidebar"}})],1)}),[],!1,null,null,null).exports;var u=s(40173),p=s(63814);const l=[{name:"users",path:"/:index(index.php/)?settings/users",components:{default:()=>Promise.all([s.e(4208),s.e(7265),s.e(3239)]).then(s.bind(s,53603)),navigation:()=>Promise.all([s.e(4208),s.e(7265),s.e(3239)]).then(s.bind(s,39603))},props:!0,children:[{path:":selectedGroup",name:"group"}]},{path:"/:index(index.php/)?settings/apps",name:"apps",redirect:{name:"apps-category",params:{category:(0,s(32981).C)("settings","appstoreEnabled",!0)?"discover":"installed"}},components:{default:()=>Promise.all([s.e(4208),s.e(7265),s.e(4529)]).then(s.bind(s,91114)),navigation:()=>Promise.all([s.e(4208),s.e(7265),s.e(4529)]).then(s.bind(s,1615)),sidebar:()=>Promise.all([s.e(4208),s.e(7265),s.e(4529)]).then(s.bind(s,36710))},children:[{path:":category",name:"apps-category",children:[{path:":id",name:"apps-details"}]}]}];r.Ay.use(u.Ay);const m=new u.Ay({mode:"history",base:(0,p.Jv)(""),linkActiveClass:"active",routes:l});var h=s(31755),g=s(21777),f=s(65899);r.Ay.use(i.Ay,{defaultHtml:!1});const E=(0,h.P)();(0,o.O)(E,m),s.nc=(0,g.aV)(),r.Ay.prototype.t=n.Tl,r.Ay.prototype.n=n.zw,r.Ay.use(f.R2);const A=(0,f.Ey)();new r.Ay({router:m,store:E,pinia:A,render:t=>t(c),el:"#content"})},58723:(t,e)=>{function s(t,e){var r={name:t.name,path:t.path,hash:t.hash,query:t.query,params:t.params,fullPath:t.fullPath,meta:t.meta};return e&&(r.from=s(e)),Object.freeze(r)}e.O=function(t,e,r){var i=(r||{}).moduleName||"route";t.registerModule(i,{namespaced:!0,state:s(e.currentRoute),mutations:{ROUTE_CHANGED:function(e,r){t.state[i]=s(r.to,r.from)}}});var o,n=!1,a=t.watch((function(t){return t[i]}),(function(t){var s=t.fullPath;s!==o&&(null!=o&&(n=!0,e.push(t)),o=s)}),{sync:!0}),d=e.afterEach((function(e,s){n?n=!1:(o=e.fullPath,t.commit(i+"/ROUTE_CHANGED",{to:e,from:s}))}));return function(){null!=d&&d(),null!=a&&a(),t.unregisterModule(i)}}},35810:(t,e,s)=>{"use strict";s.d(e,{Al:()=>F,H4:()=>C,Q$:()=>$,R3:()=>y,VL:()=>N,lJ:()=>U,lT:()=>G,pt:()=>L,ur:()=>j,v7:()=>D});var r=s(35947),i=s(21777),o=s(43627),n=s(71225),a=s(63814),d=s(36117),c=s(44719),u=s(82680),p=(s(87485),s(53334)),l=s(380),m=s(65606),h=s(96763);const g=(0,r.YK)().setApp("@nextcloud/files").detectUser().build();var f=(t=>(t[t.NONE=0]="NONE",t[t.CREATE=4]="CREATE",t[t.READ=1]="READ",t[t.UPDATE=2]="UPDATE",t[t.DELETE=8]="DELETE",t[t.SHARE=16]="SHARE",t[t.ALL=31]="ALL",t))(f||{});const E=["d:getcontentlength","d:getcontenttype","d:getetag","d:getlastmodified","d:creationdate","d:displayname","d:quota-available-bytes","d:resourcetype","nc:has-preview","nc:is-encrypted","nc:mount-type","oc:comments-unread","oc:favorite","oc:fileid","oc:owner-display-name","oc:owner-id","oc:permissions","oc:size"],A={d:"DAV:",nc:"http://nextcloud.org/ns",oc:"http://owncloud.org/ns",ocs:"http://open-collaboration-services.org/ns"},I=function(){return void 0===window._nc_dav_properties&&(window._nc_dav_properties=[...E]),window._nc_dav_properties.map((t=>`<${t} />`)).join(" ")},b=function(){return void 0===window._nc_dav_namespaces&&(window._nc_dav_namespaces={...A}),Object.keys(window._nc_dav_namespaces).map((t=>`xmlns:${t}="${window._nc_dav_namespaces?.[t]}"`)).join(" ")},N=function(){return`<?xml version="1.0"?>\n\t\t<d:propfind ${b()}>\n\t\t\t<d:prop>\n\t\t\t\t${I()}\n\t\t\t</d:prop>\n\t\t</d:propfind>`},y=function(t){return`<?xml version="1.0" encoding="UTF-8"?>\n<d:searchrequest ${b()}\n\txmlns:ns="https://github.com/icewind1991/SearchDAV/ns">\n\t<d:basicsearch>\n\t\t<d:select>\n\t\t\t<d:prop>\n\t\t\t\t${I()}\n\t\t\t</d:prop>\n\t\t</d:select>\n\t\t<d:from>\n\t\t\t<d:scope>\n\t\t\t\t<d:href>/files/${(0,i.HW)()?.uid}/</d:href>\n\t\t\t\t<d:depth>infinity</d:depth>\n\t\t\t</d:scope>\n\t\t</d:from>\n\t\t<d:where>\n\t\t\t<d:and>\n\t\t\t\t<d:or>\n\t\t\t\t\t<d:not>\n\t\t\t\t\t\t<d:eq>\n\t\t\t\t\t\t\t<d:prop>\n\t\t\t\t\t\t\t\t<d:getcontenttype/>\n\t\t\t\t\t\t\t</d:prop>\n\t\t\t\t\t\t\t<d:literal>httpd/unix-directory</d:literal>\n\t\t\t\t\t\t</d:eq>\n\t\t\t\t\t</d:not>\n\t\t\t\t\t<d:eq>\n\t\t\t\t\t\t<d:prop>\n\t\t\t\t\t\t\t<oc:size/>\n\t\t\t\t\t\t</d:prop>\n\t\t\t\t\t\t<d:literal>0</d:literal>\n\t\t\t\t\t</d:eq>\n\t\t\t\t</d:or>\n\t\t\t\t<d:gt>\n\t\t\t\t\t<d:prop>\n\t\t\t\t\t\t<d:getlastmodified/>\n\t\t\t\t\t</d:prop>\n\t\t\t\t\t<d:literal>${t}</d:literal>\n\t\t\t\t</d:gt>\n\t\t\t</d:and>\n\t\t</d:where>\n\t\t<d:orderby>\n\t\t\t<d:order>\n\t\t\t\t<d:prop>\n\t\t\t\t\t<d:getlastmodified/>\n\t\t\t\t</d:prop>\n\t\t\t\t<d:descending/>\n\t\t\t</d:order>\n\t\t</d:orderby>\n\t\t<d:limit>\n\t\t\t<d:nresults>100</d:nresults>\n\t\t\t<ns:firstresult>0</ns:firstresult>\n\t\t</d:limit>\n\t</d:basicsearch>\n</d:searchrequest>`};var L=(t=>(t.Folder="folder",t.File="file",t))(L||{});const v=function(t,e){return null!==t.match(e)},R=(t,e)=>{if(t.id&&"number"!=typeof t.id)throw new Error("Invalid id type of value");if(!t.source)throw new Error("Missing mandatory source");try{new URL(t.source)}catch(t){throw new Error("Invalid source format, source must be a valid URL")}if(!t.source.startsWith("http"))throw new Error("Invalid source format, only http(s) is supported");if(t.displayname&&"string"!=typeof t.displayname)throw new Error("Invalid displayname type");if(t.mtime&&!(t.mtime instanceof Date))throw new Error("Invalid mtime type");if(t.crtime&&!(t.crtime instanceof Date))throw new Error("Invalid crtime type");if(!t.mime||"string"!=typeof t.mime||!t.mime.match(/^[-\w.]+\/[-+\w.]+$/gi))throw new Error("Missing or invalid mandatory mime");if("size"in t&&"number"!=typeof t.size&&void 0!==t.size)throw new Error("Invalid size type");if("permissions"in t&&void 0!==t.permissions&&!("number"==typeof t.permissions&&t.permissions>=f.NONE&&t.permissions<=f.ALL))throw new Error("Invalid permissions");if(t.owner&&null!==t.owner&&"string"!=typeof t.owner)throw new Error("Invalid owner type");if(t.attributes&&"object"!=typeof t.attributes)throw new Error("Invalid attributes type");if(t.root&&"string"!=typeof t.root)throw new Error("Invalid root type");if(t.root&&!t.root.startsWith("/"))throw new Error("Root must start with a leading slash");if(t.root&&!t.source.includes(t.root))throw new Error("Root must be part of the source");if(t.root&&v(t.source,e)){const s=t.source.match(e)[0];if(!t.source.includes((0,o.join)(s,t.root)))throw new Error("The root must be relative to the service. e.g /files/emma")}if(t.status&&!Object.values(w).includes(t.status))throw new Error("Status must be a valid NodeStatus")};var w=(t=>(t.NEW="new",t.FAILED="failed",t.LOADING="loading",t.LOCKED="locked",t))(w||{});class O{_data;_attributes;_knownDavService=/(remote|public)\.php\/(web)?dav/i;readonlyAttributes=Object.entries(Object.getOwnPropertyDescriptors(O.prototype)).filter((t=>"function"==typeof t[1].get&&"__proto__"!==t[0])).map((t=>t[0]));handler={set:(t,e,s)=>!this.readonlyAttributes.includes(e)&&Reflect.set(t,e,s),deleteProperty:(t,e)=>!this.readonlyAttributes.includes(e)&&Reflect.deleteProperty(t,e),get:(t,e,s)=>this.readonlyAttributes.includes(e)?(g.warn(`Accessing "Node.attributes.${e}" is deprecated, access it directly on the Node instance.`),Reflect.get(this,e)):Reflect.get(t,e,s)};constructor(t,e){R(t,e||this._knownDavService),this._data={displayname:t.attributes?.displayname,...t,attributes:{}},this._attributes=new Proxy(this._data.attributes,this.handler),this.update(t.attributes??{}),e&&(this._knownDavService=e)}get source(){return this._data.source.replace(/\/$/i,"")}get encodedSource(){const{origin:t}=new URL(this.source);return t+(0,n.O0)(this.source.slice(t.length))}get basename(){return(0,o.basename)(this.source)}get displayname(){return this._data.displayname||this.basename}set displayname(t){this._data.displayname=t}get extension(){return(0,o.extname)(this.source)}get dirname(){if(this.root){let t=this.source;this.isDavRessource&&(t=t.split(this._knownDavService).pop());const e=t.indexOf(this.root),s=this.root.replace(/\/$/,"");return(0,o.dirname)(t.slice(e+s.length)||"/")}const t=new URL(this.source);return(0,o.dirname)(t.pathname)}get mime(){return this._data.mime}get mtime(){return this._data.mtime}set mtime(t){this._data.mtime=t}get crtime(){return this._data.crtime}get size(){return this._data.size}set size(t){this.updateMtime(),this._data.size=t}get attributes(){return this._attributes}get permissions(){return null!==this.owner||this.isDavRessource?void 0!==this._data.permissions?this._data.permissions:f.NONE:f.READ}set permissions(t){this.updateMtime(),this._data.permissions=t}get owner(){return this.isDavRessource?this._data.owner:null}get isDavRessource(){return v(this.source,this._knownDavService)}get root(){return this._data.root?this._data.root.replace(/^(.+)\/$/,"$1"):this.isDavRessource&&(0,o.dirname)(this.source).split(this._knownDavService).pop()||null}get path(){if(this.root){let t=this.source;this.isDavRessource&&(t=t.split(this._knownDavService).pop());const e=t.indexOf(this.root),s=this.root.replace(/\/$/,"");return t.slice(e+s.length)||"/"}return(this.dirname+"/"+this.basename).replace(/\/\//g,"/")}get fileid(){return this._data?.id}get status(){return this._data?.status}set status(t){this._data.status=t}move(t){R({...this._data,source:t},this._knownDavService);const e=this.basename;this._data.source=t,this.displayname===e&&this.basename!==e&&(this.displayname=this.basename),this.updateMtime()}rename(t){if(t.includes("/"))throw new Error("Invalid basename");this.move((0,o.dirname)(this.source)+"/"+t)}updateMtime(){this._data.mtime&&(this._data.mtime=new Date)}update(t){for(const[e,s]of Object.entries(t))try{void 0===s?delete this.attributes[e]:this.attributes[e]=s}catch(t){if(t instanceof TypeError)continue;throw t}}}class P extends O{get type(){return L.File}}class _ extends O{constructor(t){super({...t,mime:"httpd/unix-directory"})}get type(){return L.Folder}get extension(){return null}get mime(){return"httpd/unix-directory"}}const U=(0,u.f)()?`/files/${(0,u.G)()}`:`/files/${(0,i.HW)()?.uid}`,T=function(){const t=(0,a.dC)("dav");return(0,u.f)()?t.replace("remote.php","public.php"):t}(),C=function(t=T,e={}){const s=(0,c.UU)(t,{headers:e});function r(t){s.setHeaders({...e,"X-Requested-With":"XMLHttpRequest",requesttoken:t??""})}return(0,i.zo)(r),r((0,i.do)()),(0,c.Gu)().patch("fetch",((t,e)=>{const s=e.headers;return s?.method&&(e.method=s.method,delete s.method),fetch(t,e)})),s},$=(t,e="/",s=U)=>{const r=new AbortController;return new d.CancelablePromise((async(i,o,n)=>{n((()=>r.abort()));try{i((await t.getDirectoryContents(`${s}${e}`,{signal:r.signal,details:!0,data:`<?xml version="1.0"?>\n\t\t<oc:filter-files ${b()}>\n\t\t\t<d:prop>\n\t\t\t\t${I()}\n\t\t\t</d:prop>\n\t\t\t<oc:filter-rules>\n\t\t\t\t<oc:favorite>1</oc:favorite>\n\t\t\t</oc:filter-rules>\n\t\t</oc:filter-files>`,headers:{method:"REPORT"},includeSelf:!0})).data.filter((t=>t.filename!==e)).map((t=>F(t,s))))}catch(t){o(t)}}))},F=function(t,e=U,s=T){let r=(0,i.HW)()?.uid;if((0,u.f)())r=r??"anonymous";else if(!r)throw new Error("No user id found");const o=t.props,n=function(t=""){let e=f.NONE;return t?((t.includes("C")||t.includes("K"))&&(e|=f.CREATE),t.includes("G")&&(e|=f.READ),(t.includes("W")||t.includes("N")||t.includes("V"))&&(e|=f.UPDATE),t.includes("D")&&(e|=f.DELETE),t.includes("R")&&(e|=f.SHARE),e):e}(o?.permissions),a=String(o?.["owner-id"]||r),d=o.fileid||0,c={id:d,source:`${s}${t.filename}`,mtime:new Date(Date.parse(t.lastmod)),mime:t.mime||"application/octet-stream",displayname:void 0!==o.displayname?String(o.displayname):void 0,size:o?.size||Number.parseInt(o.getcontentlength||"0"),status:d<0?w.FAILED:void 0,permissions:n,owner:a,root:e,attributes:{...t,...o,hasPreview:o?.["has-preview"]}};return delete c.attributes?.props,"file"===t.type?new P(c):new _(c)};Error;const S=["B","KB","MB","GB","TB","PB"],x=["B","KiB","MiB","GiB","TiB","PiB"];function D(t,e=!1,s=!1,r=!1){s=s&&!r,"string"==typeof t&&(t=Number(t));let i=t>0?Math.floor(Math.log(t)/Math.log(r?1e3:1024)):0;i=Math.min((s?x.length:S.length)-1,i);const o=s?x[i]:S[i];let n=(t/Math.pow(r?1e3:1024,i)).toFixed(1);return!0===e&&0===i?("0.0"!==n?"< 1 ":"0 ")+(s?x[1]:S[1]):(n=i<2?parseFloat(n).toFixed(0):parseFloat(n).toLocaleString((0,p.lO)()),n+" "+o)}function G(t,e=!1){try{t=`${t}`.toLocaleLowerCase().replaceAll(/\s+/g,"").replaceAll(",",".")}catch(t){return null}const s=t.match(/^([0-9]*(\.[0-9]*)?)([kmgtp]?)(i?)b?$/);if(null===s||"."===s[1]||""===s[1])return null;const r=`${s[1]}`,i="i"===s[4]||e?1024:1e3;return Math.round(Number.parseFloat(r)*i**{"":0,k:1,m:2,g:3,t:4,p:5,e:6}[s[3]])}function M(t){return t instanceof Date?t.toISOString():String(t)}function j(t,e={}){const s={sortingMode:"basename",sortingOrder:"asc",...e};return function(t,e,s){s=s??[];const r=(e=e??[t=>t]).map(((t,e)=>"asc"===(s[e]??"asc")?1:-1)),i=Intl.Collator([(0,p.Z0)(),(0,p.lO)()],{numeric:!0,usage:"sort"});return[...t].sort(((t,s)=>{for(const[o,n]of e.entries()){const e=i.compare(M(n(t)),M(n(s)));if(0!==e)return e*r[o]}return 0}))}(t,[...s.sortFavoritesFirst?[t=>1!==t.attributes?.favorite]:[],...s.sortFoldersFirst?[t=>"folder"!==t.type]:[],..."basename"!==s.sortingMode?[t=>t[s.sortingMode]]:[],t=>{return(e=t.attributes?.displayname||t.basename).lastIndexOf(".")>0?e.slice(0,e.lastIndexOf(".")):e;var e},t=>t.basename],[...s.sortFavoritesFirst?["asc"]:[],...s.sortFoldersFirst?["asc"]:[],..."mtime"===s.sortingMode?["asc"===s.sortingOrder?"desc":"asc"]:[],..."mtime"!==s.sortingMode&&"basename"!==s.sortingMode?[s.sortingOrder]:[],s.sortingOrder,s.sortingOrder])}var k={};!function(t){const e=":A-Za-z_\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD",s="["+e+"]["+e+"\\-.\\d\\u00B7\\u0300-\\u036F\\u203F-\\u2040]*",r=new RegExp("^"+s+"$");t.isExist=function(t){return void 0!==t},t.isEmptyObject=function(t){return 0===Object.keys(t).length},t.merge=function(t,e,s){if(e){const r=Object.keys(e),i=r.length;for(let o=0;o<i;o++)t[r[o]]="strict"===s?[e[r[o]]]:e[r[o]]}},t.getValue=function(e){return t.isExist(e)?e:""},t.isName=function(t){return!(null==r.exec(t))},t.getAllMatches=function(t,e){const s=[];let r=e.exec(t);for(;r;){const i=[];i.startIndex=e.lastIndex-r[0].length;const o=r.length;for(let t=0;t<o;t++)i.push(r[t]);s.push(i),r=e.exec(t)}return s},t.nameRegexp=s}(k);new RegExp("(\\s*)([^\\s=]+)(\\s*=)?(\\s*(['\"])(([\\s\\S])*?)\\5)?","g");var B={};const X={preserveOrder:!1,attributeNamePrefix:"@_",attributesGroupName:!1,textNodeName:"#text",ignoreAttributes:!0,removeNSPrefix:!1,allowBooleanAttributes:!1,parseTagValue:!0,parseAttributeValue:!1,trimValues:!0,cdataPropName:!1,numberParseOptions:{hex:!0,leadingZeros:!0,eNotation:!0},tagValueProcessor:function(t,e){return e},attributeValueProcessor:function(t,e){return e},stopNodes:[],alwaysCreateTextNode:!1,isArray:()=>!1,commentPropName:!1,unpairedTags:[],processEntities:!0,htmlEntities:!1,ignoreDeclaration:!1,ignorePiTags:!1,transformTagName:!1,transformAttributeName:!1,updateTag:function(t,e,s){return t}};B.buildOptions=function(t){return Object.assign({},X,t)},B.defaultOptions=X,!Number.parseInt&&window.parseInt&&(Number.parseInt=window.parseInt),!Number.parseFloat&&window.parseFloat&&(Number.parseFloat=window.parseFloat),new RegExp("([^\\s=]+)\\s*(=\\s*(['\"])([\\s\\S]*?)\\3)?","gm");var V={};function K(t,e,s){let r;const i={};for(let o=0;o<t.length;o++){const n=t[o],a=q(n);let d="";if(d=void 0===s?a:s+"."+a,a===e.textNodeName)void 0===r?r=n[a]:r+=""+n[a];else{if(void 0===a)continue;if(n[a]){let t=K(n[a],e,d);const s=z(t,e);n[":@"]?H(t,n[":@"],d,e):1!==Object.keys(t).length||void 0===t[e.textNodeName]||e.alwaysCreateTextNode?0===Object.keys(t).length&&(e.alwaysCreateTextNode?t[e.textNodeName]="":t=""):t=t[e.textNodeName],void 0!==i[a]&&i.hasOwnProperty(a)?(Array.isArray(i[a])||(i[a]=[i[a]]),i[a].push(t)):e.isArray(a,d,s)?i[a]=[t]:i[a]=t}}}return"string"==typeof r?r.length>0&&(i[e.textNodeName]=r):void 0!==r&&(i[e.textNodeName]=r),i}function q(t){const e=Object.keys(t);for(let t=0;t<e.length;t++){const s=e[t];if(":@"!==s)return s}}function H(t,e,s,r){if(e){const i=Object.keys(e),o=i.length;for(let n=0;n<o;n++){const o=i[n];r.isArray(o,s+"."+o,!0,!0)?t[o]=[e[o]]:t[o]=e[o]}}}function z(t,e){const{textNodeName:s}=e,r=Object.keys(t).length;return 0===r||!(1!==r||!t[s]&&"boolean"!=typeof t[s]&&0!==t[s])}V.prettify=function(t,e){return K(t,e)};const{buildOptions:J}=B,{prettify:W}=V;function Q(t,e,s,r){let i="",o=!1;for(let n=0;n<t.length;n++){const a=t[n],d=Y(a);if(void 0===d)continue;let c="";if(c=0===s.length?d:`${s}.${d}`,d===e.textNodeName){let t=a[d];tt(c,e)||(t=e.tagValueProcessor(d,t),t=et(t,e)),o&&(i+=r),i+=t,o=!1;continue}if(d===e.cdataPropName){o&&(i+=r),i+=`<![CDATA[${a[d][0][e.textNodeName]}]]>`,o=!1;continue}if(d===e.commentPropName){i+=r+`\x3c!--${a[d][0][e.textNodeName]}--\x3e`,o=!0;continue}if("?"===d[0]){const t=Z(a[":@"],e),s="?xml"===d?"":r;let n=a[d][0][e.textNodeName];n=0!==n.length?" "+n:"",i+=s+`<${d}${n}${t}?>`,o=!0;continue}let u=r;""!==u&&(u+=e.indentBy);const p=r+`<${d}${Z(a[":@"],e)}`,l=Q(a[d],e,c,u);-1!==e.unpairedTags.indexOf(d)?e.suppressUnpairedNode?i+=p+">":i+=p+"/>":l&&0!==l.length||!e.suppressEmptyNode?l&&l.endsWith(">")?i+=p+`>${l}${r}</${d}>`:(i+=p+">",l&&""!==r&&(l.includes("/>")||l.includes("</"))?i+=r+e.indentBy+l+r:i+=l,i+=`</${d}>`):i+=p+"/>",o=!0}return i}function Y(t){const e=Object.keys(t);for(let s=0;s<e.length;s++){const r=e[s];if(t.hasOwnProperty(r)&&":@"!==r)return r}}function Z(t,e){let s="";if(t&&!e.ignoreAttributes)for(let r in t){if(!t.hasOwnProperty(r))continue;let i=e.attributeValueProcessor(r,t[r]);i=et(i,e),!0===i&&e.suppressBooleanAttributes?s+=` ${r.substr(e.attributeNamePrefix.length)}`:s+=` ${r.substr(e.attributeNamePrefix.length)}="${i}"`}return s}function tt(t,e){let s=(t=t.substr(0,t.length-e.textNodeName.length-1)).substr(t.lastIndexOf(".")+1);for(let r in e.stopNodes)if(e.stopNodes[r]===t||e.stopNodes[r]==="*."+s)return!0;return!1}function et(t,e){if(t&&t.length>0&&e.processEntities)for(let s=0;s<e.entities.length;s++){const r=e.entities[s];t=t.replace(r.regex,r.val)}return t}const st=function(t,e){let s="";return e.format&&e.indentBy.length>0&&(s="\n"),Q(t,e,"",s)},rt={attributeNamePrefix:"@_",attributesGroupName:!1,textNodeName:"#text",ignoreAttributes:!0,cdataPropName:!1,format:!1,indentBy:" ",suppressEmptyNode:!1,suppressUnpairedNode:!0,suppressBooleanAttributes:!0,tagValueProcessor:function(t,e){return e},attributeValueProcessor:function(t,e){return e},preserveOrder:!1,commentPropName:!1,unpairedTags:[],entities:[{regex:new RegExp("&","g"),val:"&amp;"},{regex:new RegExp(">","g"),val:"&gt;"},{regex:new RegExp("<","g"),val:"&lt;"},{regex:new RegExp("'","g"),val:"&apos;"},{regex:new RegExp('"',"g"),val:"&quot;"}],processEntities:!0,stopNodes:[],oneListGroup:!1};function it(t){this.options=Object.assign({},rt,t),this.options.ignoreAttributes||this.options.attributesGroupName?this.isAttribute=function(){return!1}:(this.attrPrefixLen=this.options.attributeNamePrefix.length,this.isAttribute=at),this.processTextOrObjNode=ot,this.options.format?(this.indentate=nt,this.tagEndChar=">\n",this.newLine="\n"):(this.indentate=function(){return""},this.tagEndChar=">",this.newLine="")}function ot(t,e,s){const r=this.j2x(t,s+1);return void 0!==t[this.options.textNodeName]&&1===Object.keys(t).length?this.buildTextValNode(t[this.options.textNodeName],e,r.attrStr,s):this.buildObjectNode(r.val,e,r.attrStr,s)}function nt(t){return this.options.indentBy.repeat(t)}function at(t){return!(!t.startsWith(this.options.attributeNamePrefix)||t===this.options.textNodeName)&&t.substr(this.attrPrefixLen)}it.prototype.build=function(t){return this.options.preserveOrder?st(t,this.options):(Array.isArray(t)&&this.options.arrayNodeName&&this.options.arrayNodeName.length>1&&(t={[this.options.arrayNodeName]:t}),this.j2x(t,0).val)},it.prototype.j2x=function(t,e){let s="",r="";for(let i in t)if(Object.prototype.hasOwnProperty.call(t,i))if(void 0===t[i])this.isAttribute(i)&&(r+="");else if(null===t[i])this.isAttribute(i)?r+="":"?"===i[0]?r+=this.indentate(e)+"<"+i+"?"+this.tagEndChar:r+=this.indentate(e)+"<"+i+"/"+this.tagEndChar;else if(t[i]instanceof Date)r+=this.buildTextValNode(t[i],i,"",e);else if("object"!=typeof t[i]){const o=this.isAttribute(i);if(o)s+=this.buildAttrPairStr(o,""+t[i]);else if(i===this.options.textNodeName){let e=this.options.tagValueProcessor(i,""+t[i]);r+=this.replaceEntitiesValue(e)}else r+=this.buildTextValNode(t[i],i,"",e)}else if(Array.isArray(t[i])){const s=t[i].length;let o="",n="";for(let a=0;a<s;a++){const s=t[i][a];if(void 0===s);else if(null===s)"?"===i[0]?r+=this.indentate(e)+"<"+i+"?"+this.tagEndChar:r+=this.indentate(e)+"<"+i+"/"+this.tagEndChar;else if("object"==typeof s)if(this.options.oneListGroup){const t=this.j2x(s,e+1);o+=t.val,this.options.attributesGroupName&&s.hasOwnProperty(this.options.attributesGroupName)&&(n+=t.attrStr)}else o+=this.processTextOrObjNode(s,i,e);else if(this.options.oneListGroup){let t=this.options.tagValueProcessor(i,s);t=this.replaceEntitiesValue(t),o+=t}else o+=this.buildTextValNode(s,i,"",e)}this.options.oneListGroup&&(o=this.buildObjectNode(o,i,n,e)),r+=o}else if(this.options.attributesGroupName&&i===this.options.attributesGroupName){const e=Object.keys(t[i]),r=e.length;for(let o=0;o<r;o++)s+=this.buildAttrPairStr(e[o],""+t[i][e[o]])}else r+=this.processTextOrObjNode(t[i],i,e);return{attrStr:s,val:r}},it.prototype.buildAttrPairStr=function(t,e){return e=this.options.attributeValueProcessor(t,""+e),e=this.replaceEntitiesValue(e),this.options.suppressBooleanAttributes&&"true"===e?" "+t:" "+t+'="'+e+'"'},it.prototype.buildObjectNode=function(t,e,s,r){if(""===t)return"?"===e[0]?this.indentate(r)+"<"+e+s+"?"+this.tagEndChar:this.indentate(r)+"<"+e+s+this.closeTag(e)+this.tagEndChar;{let i="</"+e+this.tagEndChar,o="";return"?"===e[0]&&(o="?",i=""),!s&&""!==s||-1!==t.indexOf("<")?!1!==this.options.commentPropName&&e===this.options.commentPropName&&0===o.length?this.indentate(r)+`\x3c!--${t}--\x3e`+this.newLine:this.indentate(r)+"<"+e+s+o+this.tagEndChar+t+this.indentate(r)+i:this.indentate(r)+"<"+e+s+o+">"+t+i}},it.prototype.closeTag=function(t){let e="";return-1!==this.options.unpairedTags.indexOf(t)?this.options.suppressUnpairedNode||(e="/"):e=this.options.suppressEmptyNode?"/":`></${t}`,e},it.prototype.buildTextValNode=function(t,e,s,r){if(!1!==this.options.cdataPropName&&e===this.options.cdataPropName)return this.indentate(r)+`<![CDATA[${t}]]>`+this.newLine;if(!1!==this.options.commentPropName&&e===this.options.commentPropName)return this.indentate(r)+`\x3c!--${t}--\x3e`+this.newLine;if("?"===e[0])return this.indentate(r)+"<"+e+s+"?"+this.tagEndChar;{let i=this.options.tagValueProcessor(e,t);return i=this.replaceEntitiesValue(i),""===i?this.indentate(r)+"<"+e+s+this.closeTag(e)+this.tagEndChar:this.indentate(r)+"<"+e+s+">"+i+"</"+e+this.tagEndChar}},it.prototype.replaceEntitiesValue=function(t){if(t&&t.length>0&&this.options.processEntities)for(let e=0;e<this.options.entities.length;e++){const s=this.options.entities[e];t=t.replace(s.regex,s.val)}return t};var dt="object"==typeof m&&m.env&&m.env.NODE_DEBUG&&/\bsemver\b/i.test(m.env.NODE_DEBUG)?(...t)=>h.error("SEMVER",...t):()=>{},ct={MAX_LENGTH:256,MAX_SAFE_COMPONENT_LENGTH:16,MAX_SAFE_BUILD_LENGTH:250,MAX_SAFE_INTEGER:Number.MAX_SAFE_INTEGER||9007199254740991,RELEASE_TYPES:["major","premajor","minor","preminor","patch","prepatch","prerelease"],SEMVER_SPEC_VERSION:"2.0.0",FLAG_INCLUDE_PRERELEASE:1,FLAG_LOOSE:2},ut={exports:{}};!function(t,e){const{MAX_SAFE_COMPONENT_LENGTH:s,MAX_SAFE_BUILD_LENGTH:r,MAX_LENGTH:i}=ct,o=dt,n=(e=t.exports={}).re=[],a=e.safeRe=[],d=e.src=[],c=e.t={};let u=0;const p="[a-zA-Z0-9-]",l=[["\\s",1],["\\d",i],[p,r]],m=(t,e,s)=>{const r=(t=>{for(const[e,s]of l)t=t.split(`${e}*`).join(`${e}{0,${s}}`).split(`${e}+`).join(`${e}{1,${s}}`);return t})(e),i=u++;o(t,i,e),c[t]=i,d[i]=e,n[i]=new RegExp(e,s?"g":void 0),a[i]=new RegExp(r,s?"g":void 0)};m("NUMERICIDENTIFIER","0|[1-9]\\d*"),m("NUMERICIDENTIFIERLOOSE","\\d+"),m("NONNUMERICIDENTIFIER",`\\d*[a-zA-Z-]${p}*`),m("MAINVERSION",`(${d[c.NUMERICIDENTIFIER]})\\.(${d[c.NUMERICIDENTIFIER]})\\.(${d[c.NUMERICIDENTIFIER]})`),m("MAINVERSIONLOOSE",`(${d[c.NUMERICIDENTIFIERLOOSE]})\\.(${d[c.NUMERICIDENTIFIERLOOSE]})\\.(${d[c.NUMERICIDENTIFIERLOOSE]})`),m("PRERELEASEIDENTIFIER",`(?:${d[c.NUMERICIDENTIFIER]}|${d[c.NONNUMERICIDENTIFIER]})`),m("PRERELEASEIDENTIFIERLOOSE",`(?:${d[c.NUMERICIDENTIFIERLOOSE]}|${d[c.NONNUMERICIDENTIFIER]})`),m("PRERELEASE",`(?:-(${d[c.PRERELEASEIDENTIFIER]}(?:\\.${d[c.PRERELEASEIDENTIFIER]})*))`),m("PRERELEASELOOSE",`(?:-?(${d[c.PRERELEASEIDENTIFIERLOOSE]}(?:\\.${d[c.PRERELEASEIDENTIFIERLOOSE]})*))`),m("BUILDIDENTIFIER",`${p}+`),m("BUILD",`(?:\\+(${d[c.BUILDIDENTIFIER]}(?:\\.${d[c.BUILDIDENTIFIER]})*))`),m("FULLPLAIN",`v?${d[c.MAINVERSION]}${d[c.PRERELEASE]}?${d[c.BUILD]}?`),m("FULL",`^${d[c.FULLPLAIN]}$`),m("LOOSEPLAIN",`[v=\\s]*${d[c.MAINVERSIONLOOSE]}${d[c.PRERELEASELOOSE]}?${d[c.BUILD]}?`),m("LOOSE",`^${d[c.LOOSEPLAIN]}$`),m("GTLT","((?:<|>)?=?)"),m("XRANGEIDENTIFIERLOOSE",`${d[c.NUMERICIDENTIFIERLOOSE]}|x|X|\\*`),m("XRANGEIDENTIFIER",`${d[c.NUMERICIDENTIFIER]}|x|X|\\*`),m("XRANGEPLAIN",`[v=\\s]*(${d[c.XRANGEIDENTIFIER]})(?:\\.(${d[c.XRANGEIDENTIFIER]})(?:\\.(${d[c.XRANGEIDENTIFIER]})(?:${d[c.PRERELEASE]})?${d[c.BUILD]}?)?)?`),m("XRANGEPLAINLOOSE",`[v=\\s]*(${d[c.XRANGEIDENTIFIERLOOSE]})(?:\\.(${d[c.XRANGEIDENTIFIERLOOSE]})(?:\\.(${d[c.XRANGEIDENTIFIERLOOSE]})(?:${d[c.PRERELEASELOOSE]})?${d[c.BUILD]}?)?)?`),m("XRANGE",`^${d[c.GTLT]}\\s*${d[c.XRANGEPLAIN]}$`),m("XRANGELOOSE",`^${d[c.GTLT]}\\s*${d[c.XRANGEPLAINLOOSE]}$`),m("COERCEPLAIN",`(^|[^\\d])(\\d{1,${s}})(?:\\.(\\d{1,${s}}))?(?:\\.(\\d{1,${s}}))?`),m("COERCE",`${d[c.COERCEPLAIN]}(?:$|[^\\d])`),m("COERCEFULL",d[c.COERCEPLAIN]+`(?:${d[c.PRERELEASE]})?(?:${d[c.BUILD]})?(?:$|[^\\d])`),m("COERCERTL",d[c.COERCE],!0),m("COERCERTLFULL",d[c.COERCEFULL],!0),m("LONETILDE","(?:~>?)"),m("TILDETRIM",`(\\s*)${d[c.LONETILDE]}\\s+`,!0),e.tildeTrimReplace="$1~",m("TILDE",`^${d[c.LONETILDE]}${d[c.XRANGEPLAIN]}$`),m("TILDELOOSE",`^${d[c.LONETILDE]}${d[c.XRANGEPLAINLOOSE]}$`),m("LONECARET","(?:\\^)"),m("CARETTRIM",`(\\s*)${d[c.LONECARET]}\\s+`,!0),e.caretTrimReplace="$1^",m("CARET",`^${d[c.LONECARET]}${d[c.XRANGEPLAIN]}$`),m("CARETLOOSE",`^${d[c.LONECARET]}${d[c.XRANGEPLAINLOOSE]}$`),m("COMPARATORLOOSE",`^${d[c.GTLT]}\\s*(${d[c.LOOSEPLAIN]})$|^$`),m("COMPARATOR",`^${d[c.GTLT]}\\s*(${d[c.FULLPLAIN]})$|^$`),m("COMPARATORTRIM",`(\\s*)${d[c.GTLT]}\\s*(${d[c.LOOSEPLAIN]}|${d[c.XRANGEPLAIN]})`,!0),e.comparatorTrimReplace="$1$2$3",m("HYPHENRANGE",`^\\s*(${d[c.XRANGEPLAIN]})\\s+-\\s+(${d[c.XRANGEPLAIN]})\\s*$`),m("HYPHENRANGELOOSE",`^\\s*(${d[c.XRANGEPLAINLOOSE]})\\s+-\\s+(${d[c.XRANGEPLAINLOOSE]})\\s*$`),m("STAR","(<|>)?=?\\s*\\*"),m("GTE0","^\\s*>=\\s*0\\.0\\.0\\s*$"),m("GTE0PRE","^\\s*>=\\s*0\\.0\\.0-0\\s*$")}(ut,ut.exports);var pt=ut.exports;Object.freeze({loose:!0}),Object.freeze({});const lt=/^[0-9]+$/,mt=(t,e)=>{const s=lt.test(t),r=lt.test(e);return s&&r&&(t=+t,e=+e),t===e?0:s&&!r?-1:r&&!s?1:t<e?-1:1};var ht={compareIdentifiers:mt,rcompareIdentifiers:(t,e)=>mt(e,t)};const{MAX_LENGTH:gt,MAX_SAFE_INTEGER:ft}=ct,{safeRe:Et,t:At}=pt,{compareIdentifiers:It}=ht;l.m}},o={};function n(t){var e=o[t];if(void 0!==e)return e.exports;var s=o[t]={id:t,loaded:!1,exports:{}};return i[t].call(s.exports,s,s.exports,n),s.loaded=!0,s.exports}n.m=i,e=[],n.O=(t,s,r,i)=>{if(!s){var o=1/0;for(u=0;u<e.length;u++){s=e[u][0],r=e[u][1],i=e[u][2];for(var a=!0,d=0;d<s.length;d++)(!1&i||o>=i)&&Object.keys(n.O).every((t=>n.O[t](s[d])))?s.splice(d--,1):(a=!1,i<o&&(o=i));if(a){e.splice(u--,1);var c=r();void 0!==c&&(t=c)}}return t}i=i||0;for(var u=e.length;u>0&&e[u-1][2]>i;u--)e[u]=e[u-1];e[u]=[s,r,i]},n.n=t=>{var e=t&&t.__esModule?()=>t.default:()=>t;return n.d(e,{a:e}),e},n.d=(t,e)=>{for(var s in e)n.o(e,s)&&!n.o(t,s)&&Object.defineProperty(t,s,{enumerable:!0,get:e[s]})},n.f={},n.e=t=>Promise.all(Object.keys(n.f).reduce(((e,s)=>(n.f[s](t,e),e)),[])),n.u=t=>(({3239:"settings-users",4529:"settings-apps-view"}[t]||t)+"-"+t+".js?v="+{802:"eddac441912aee9d7aa8",3239:"61490dd5ed1c5d8390cb",4529:"80559dd00b323f234969",4546:"a06fb7f5c8fd8d53c2d3",7265:"715398afd1ab50836642",8737:"6a26621151e51d343a78",9291:"077955af818a227340aa",9972:"b7597ad74d36447b4184"}[t]),n.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(t){if("object"==typeof window)return window}}(),n.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),s={},r="nextcloud:",n.l=(t,e,i,o)=>{if(s[t])s[t].push(e);else{var a,d;if(void 0!==i)for(var c=document.getElementsByTagName("script"),u=0;u<c.length;u++){var p=c[u];if(p.getAttribute("src")==t||p.getAttribute("data-webpack")==r+i){a=p;break}}a||(d=!0,(a=document.createElement("script")).charset="utf-8",a.timeout=120,n.nc&&a.setAttribute("nonce",n.nc),a.setAttribute("data-webpack",r+i),a.src=t),s[t]=[e];var l=(e,r)=>{a.onerror=a.onload=null,clearTimeout(m);var i=s[t];if(delete s[t],a.parentNode&&a.parentNode.removeChild(a),i&&i.forEach((t=>t(r))),e)return e(r)},m=setTimeout(l.bind(null,void 0,{type:"timeout",target:a}),12e4);a.onerror=l.bind(null,a.onerror),a.onload=l.bind(null,a.onload),d&&document.head.appendChild(a)}},n.r=t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},n.nmd=t=>(t.paths=[],t.children||(t.children=[]),t),n.j=2689,(()=>{var t;n.g.importScripts&&(t=n.g.location+"");var e=n.g.document;if(!t&&e&&(e.currentScript&&"SCRIPT"===e.currentScript.tagName.toUpperCase()&&(t=e.currentScript.src),!t)){var s=e.getElementsByTagName("script");if(s.length)for(var r=s.length-1;r>-1&&(!t||!/^http(s?):/.test(t));)t=s[r--].src}if(!t)throw new Error("Automatic publicPath is not supported in this browser");t=t.replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),n.p=t})(),(()=>{n.b=document.baseURI||self.location.href;var t={2689:0};n.f.j=(e,s)=>{var r=n.o(t,e)?t[e]:void 0;if(0!==r)if(r)s.push(r[2]);else{var i=new Promise(((s,i)=>r=t[e]=[s,i]));s.push(r[2]=i);var o=n.p+n.u(e),a=new Error;n.l(o,(s=>{if(n.o(t,e)&&(0!==(r=t[e])&&(t[e]=void 0),r)){var i=s&&("load"===s.type?"missing":s.type),o=s&&s.target&&s.target.src;a.message="Loading chunk "+e+" failed.\n("+i+": "+o+")",a.name="ChunkLoadError",a.type=i,a.request=o,r[1](a)}}),"chunk-"+e,e)}},n.O.j=e=>0===t[e];var e=(e,s)=>{var r,i,o=s[0],a=s[1],d=s[2],c=0;if(o.some((e=>0!==t[e]))){for(r in a)n.o(a,r)&&(n.m[r]=a[r]);if(d)var u=d(n)}for(e&&e(s);c<o.length;c++)i=o[c],n.o(t,i)&&t[i]&&t[i][0](),t[i]=0;return n.O(u)},s=self.webpackChunknextcloud=self.webpackChunknextcloud||[];s.forEach(e.bind(null,0)),s.push=e.bind(null,s.push.bind(s))})(),n.nc=void 0;var a=n.O(void 0,[4208],(()=>n(18539)));a=n.O(a)})();
+//# sourceMappingURL=settings-vue-settings-apps-users-management.js.map?v=c65cbb5872f6e7777ff8 \ No newline at end of file
diff --git a/dist/settings-vue-settings-apps-users-management.js.map b/dist/settings-vue-settings-apps-users-management.js.map
index e6dfb28b844..9737ce5e386 100644
--- a/dist/settings-vue-settings-apps-users-management.js.map
+++ b/dist/settings-vue-settings-apps-users-management.js.map
@@ -1 +1 @@
-{"version":3,"file":"settings-vue-settings-apps-users-management.js?v=cf5e5a027a7d8730451c","mappings":"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","sources":["webpack:///nextcloud/webpack/runtime/chunk loaded","webpack:///nextcloud/webpack/runtime/load script","webpack:///nextcloud/apps/settings/src/store/api.js","webpack:///nextcloud/apps/settings/src/store/users.js","webpack:///nextcloud/apps/settings/src/store/apps.js","webpack:///nextcloud/apps/settings/src/store/users-settings.js","webpack:///nextcloud/apps/settings/src/store/oc.js","webpack:///nextcloud/apps/settings/src/store/index.js","webpack:///nextcloud/apps/settings/src/constants/GroupManagement.ts","webpack:///nextcloud/apps/settings/src/logger.ts","webpack:///nextcloud/apps/settings/src/views/SettingsApp.vue","webpack:///nextcloud/apps/settings/src/views/SettingsApp.vue?vue&type=script&setup=true&lang=ts","webpack://nextcloud/./apps/settings/src/views/SettingsApp.vue?3a67","webpack:///nextcloud/apps/settings/src/router/routes.ts","webpack:///nextcloud/apps/settings/src/router/index.ts","webpack:///nextcloud/apps/settings/src/main-apps-users-management.ts","webpack:///nextcloud/node_modules/vuex-router-sync/index.js","webpack:///nextcloud/node_modules/@nextcloud/files/dist/index.mjs","webpack:///nextcloud/webpack/bootstrap","webpack:///nextcloud/webpack/runtime/compat get default export","webpack:///nextcloud/webpack/runtime/define property getters","webpack:///nextcloud/webpack/runtime/ensure chunk","webpack:///nextcloud/webpack/runtime/get javascript chunk filename","webpack:///nextcloud/webpack/runtime/global","webpack:///nextcloud/webpack/runtime/hasOwnProperty shorthand","webpack:///nextcloud/webpack/runtime/make namespace object","webpack:///nextcloud/webpack/runtime/node module decorator","webpack:///nextcloud/webpack/runtime/runtimeId","webpack:///nextcloud/webpack/runtime/publicPath","webpack:///nextcloud/webpack/runtime/jsonp chunk loading","webpack:///nextcloud/webpack/runtime/nonce","webpack:///nextcloud/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = (result, chunkIds, fn, priority) => {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar chunkIds = deferred[i][0];\n\t\tvar fn = deferred[i][1];\n\t\tvar priority = deferred[i][2];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","var inProgress = {};\nvar dataWebpackPrefix = \"nextcloud:\";\n// loadScript function to load a script via script tag\n__webpack_require__.l = (url, done, key, chunkId) => {\n\tif(inProgress[url]) { inProgress[url].push(done); return; }\n\tvar script, needAttach;\n\tif(key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor(var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif(s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) { script = s; break; }\n\t\t}\n\t}\n\tif(!script) {\n\t\tneedAttach = true;\n\t\tscript = document.createElement('script');\n\n\t\tscript.charset = 'utf-8';\n\t\tscript.timeout = 120;\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n\n\t\tscript.src = url;\n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = (prev, event) => {\n\t\t// avoid mem leaks in IE.\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns && doneFns.forEach((fn) => (fn(event)));\n\t\tif(prev) return prev(event);\n\t}\n\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};","/**\n * SPDX-FileCopyrightText: 2018 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport axios from '@nextcloud/axios'\nimport { confirmPassword } from '@nextcloud/password-confirmation'\nimport '@nextcloud/password-confirmation/dist/style.css'\n\nconst sanitize = function(url) {\n\treturn url.replace(/\\/$/, '') // Remove last url slash\n}\n\nexport default {\n\n\t/**\n\t * This Promise is used to chain a request that require an admin password confirmation\n\t * Since chaining Promise have a very precise behavior concerning catch and then,\n\t * you'll need to be careful when using it.\n\t * e.g\n\t * // store\n\t * action(context) {\n\t * return api.requireAdmin().then((response) => {\n\t * return api.get('url')\n\t * .then((response) => {API success})\n\t * .catch((error) => {API failure});\n\t * }).catch((error) => {requireAdmin failure});\n\t * }\n\t * // vue\n\t * this.$store.dispatch('action').then(() => {always executed})\n\t *\n\t * Since Promise.then().catch().then() will always execute the last then\n\t * this.$store.dispatch('action').then will always be executed\n\t *\n\t * If you want requireAdmin failure to also catch the API request failure\n\t * you will need to throw a new error in the api.get.catch()\n\t *\n\t * e.g\n\t * api.requireAdmin().then((response) => {\n\t * api.get('url')\n\t * .then((response) => {API success})\n\t * .catch((error) => {throw error;});\n\t * }).catch((error) => {requireAdmin OR API failure});\n\t *\n\t * @return {Promise}\n\t */\n\trequireAdmin() {\n\t\treturn confirmPassword()\n\t},\n\tget(url, options) {\n\t\treturn axios.get(sanitize(url), options)\n\t},\n\tpost(url, data) {\n\t\treturn axios.post(sanitize(url), data)\n\t},\n\tpatch(url, data) {\n\t\treturn axios.patch(sanitize(url), data)\n\t},\n\tput(url, data) {\n\t\treturn axios.put(sanitize(url), data)\n\t},\n\tdelete(url, data) {\n\t\treturn axios.delete(sanitize(url), { params: data })\n\t},\n}\n","/**\n * SPDX-FileCopyrightText: 2018 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport { getBuilder } from '@nextcloud/browser-storage'\nimport { getCapabilities } from '@nextcloud/capabilities'\nimport { parseFileSize } from '@nextcloud/files'\nimport { showError } from '@nextcloud/dialogs'\nimport { generateOcsUrl, generateUrl } from '@nextcloud/router'\nimport axios from '@nextcloud/axios'\n\nimport { GroupSorting } from '../constants/GroupManagement.ts'\nimport api from './api.js'\nimport logger from '../logger.ts'\n\nconst localStorage = getBuilder('settings').persist(true).build()\n\nconst defaults = {\n\tgroup: {\n\t\tid: '',\n\t\tname: '',\n\t\tusercount: 0,\n\t\tdisabled: 0,\n\t\tcanAdd: true,\n\t\tcanRemove: true,\n\t},\n}\n\nconst state = {\n\tusers: [],\n\tgroups: [],\n\torderBy: GroupSorting.UserCount,\n\tminPasswordLength: 0,\n\tusersOffset: 0,\n\tusersLimit: 25,\n\tdisabledUsersOffset: 0,\n\tdisabledUsersLimit: 25,\n\tuserCount: 0,\n\tshowConfig: {\n\t\tshowStoragePath: localStorage.getItem('account_settings__showStoragePath') === 'true',\n\t\tshowUserBackend: localStorage.getItem('account_settings__showUserBackend') === 'true',\n\t\tshowLastLogin: localStorage.getItem('account_settings__showLastLogin') === 'true',\n\t\tshowNewUserForm: localStorage.getItem('account_settings__showNewUserForm') === 'true',\n\t\tshowLanguages: localStorage.getItem('account_settings__showLanguages') === 'true',\n\t},\n}\n\nconst mutations = {\n\tappendUsers(state, usersObj) {\n\t\tconst existingUsers = state.users.map(({ id }) => id)\n\t\tconst newUsers = Object.values(usersObj)\n\t\t\t.filter(({ id }) => !existingUsers.includes(id))\n\n\t\tconst users = state.users.concat(newUsers)\n\t\tstate.usersOffset += state.usersLimit\n\t\tstate.users = users\n\t},\n\tupdateDisabledUsers(state, _usersObj) {\n\t\tstate.disabledUsersOffset += state.disabledUsersLimit\n\t},\n\tsetPasswordPolicyMinLength(state, length) {\n\t\tstate.minPasswordLength = length !== '' ? length : 0\n\t},\n\tinitGroups(state, { groups, orderBy, userCount }) {\n\t\tstate.groups = groups.map(group => Object.assign({}, defaults.group, group))\n\t\tstate.orderBy = orderBy\n\t\tstate.userCount = userCount\n\t},\n\taddGroup(state, { gid, displayName }) {\n\t\ttry {\n\t\t\tif (typeof state.groups.find((group) => group.id === gid) !== 'undefined') {\n\t\t\t\treturn\n\t\t\t}\n\t\t\t// extend group to default values\n\t\t\tconst group = Object.assign({}, defaults.group, {\n\t\t\t\tid: gid,\n\t\t\t\tname: displayName,\n\t\t\t})\n\t\t\tstate.groups.unshift(group)\n\t\t} catch (e) {\n\t\t\tconsole.error('Can\\'t create group', e)\n\t\t}\n\t},\n\trenameGroup(state, { gid, displayName }) {\n\t\tconst groupIndex = state.groups.findIndex(groupSearch => groupSearch.id === gid)\n\t\tif (groupIndex >= 0) {\n\t\t\tconst updatedGroup = state.groups[groupIndex]\n\t\t\tupdatedGroup.name = displayName\n\t\t\tstate.groups.splice(groupIndex, 1, updatedGroup)\n\t\t}\n\t},\n\tremoveGroup(state, gid) {\n\t\tconst groupIndex = state.groups.findIndex(groupSearch => groupSearch.id === gid)\n\t\tif (groupIndex >= 0) {\n\t\t\tstate.groups.splice(groupIndex, 1)\n\t\t}\n\t},\n\taddUserGroup(state, { userid, gid }) {\n\t\tconst group = state.groups.find(groupSearch => groupSearch.id === gid)\n\t\tconst user = state.users.find(user => user.id === userid)\n\t\t// increase count if user is enabled\n\t\tif (group && user.enabled && state.userCount > 0) {\n\t\t\tgroup.usercount++\n\t\t}\n\t\tconst groups = user.groups\n\t\tgroups.push(gid)\n\t},\n\tremoveUserGroup(state, { userid, gid }) {\n\t\tconst group = state.groups.find(groupSearch => groupSearch.id === gid)\n\t\tconst user = state.users.find(user => user.id === userid)\n\t\t// lower count if user is enabled\n\t\tif (group && user.enabled && state.userCount > 0) {\n\t\t\tgroup.usercount--\n\t\t}\n\t\tconst groups = user.groups\n\t\tgroups.splice(groups.indexOf(gid), 1)\n\t},\n\taddUserSubAdmin(state, { userid, gid }) {\n\t\tconst groups = state.users.find(user => user.id === userid).subadmin\n\t\tgroups.push(gid)\n\t},\n\tremoveUserSubAdmin(state, { userid, gid }) {\n\t\tconst groups = state.users.find(user => user.id === userid).subadmin\n\t\tgroups.splice(groups.indexOf(gid), 1)\n\t},\n\tdeleteUser(state, userid) {\n\t\tconst userIndex = state.users.findIndex(user => user.id === userid)\n\t\tthis.commit('updateUserCounts', { user: state.users[userIndex], actionType: 'remove' })\n\t\tstate.users.splice(userIndex, 1)\n\t},\n\taddUserData(state, response) {\n\t\tconst user = response.data.ocs.data\n\t\tstate.users.unshift(user)\n\t\tthis.commit('updateUserCounts', { user, actionType: 'create' })\n\t},\n\tenableDisableUser(state, { userid, enabled }) {\n\t\tconst user = state.users.find(user => user.id === userid)\n\t\tuser.enabled = enabled\n\t\tthis.commit('updateUserCounts', { user, actionType: enabled ? 'enable' : 'disable' })\n\t},\n\t// update active/disabled counts, groups counts\n\tupdateUserCounts(state, { user, actionType }) {\n\t\t// 0 is a special value\n\t\tif (state.userCount === 0) {\n\t\t\treturn\n\t\t}\n\n\t\tconst recentGroup = state.groups.find(group => group.id === '__nc_internal_recent')\n\t\tconst disabledGroup = state.groups.find(group => group.id === 'disabled')\n\t\tswitch (actionType) {\n\t\tcase 'enable':\n\t\tcase 'disable':\n\t\t\tdisabledGroup.usercount += user.enabled ? -1 : 1 // update Disabled Users count\n\t\t\trecentGroup.usercount += user.enabled ? 1 : -1\n\t\t\tstate.userCount += user.enabled ? 1 : -1 // update Active Users count\n\t\t\tuser.groups.forEach(userGroup => {\n\t\t\t\tconst group = state.groups.find(groupSearch => groupSearch.id === userGroup)\n\t\t\t\tgroup.disabled += user.enabled ? -1 : 1 // update group disabled count\n\t\t\t})\n\t\t\tbreak\n\t\tcase 'create':\n\t\t\trecentGroup.usercount++\n\t\t\tstate.userCount++ // increment Active Users count\n\n\t\t\tuser.groups.forEach(userGroup => {\n\t\t\t\tstate.groups\n\t\t\t\t\t.find(groupSearch => groupSearch.id === userGroup)\n\t\t\t\t .usercount++ // increment group total count\n\t\t\t})\n\t\t\tbreak\n\t\tcase 'remove':\n\t\t\tif (user.enabled) {\n\t\t\t\trecentGroup.usercount--\n\t\t\t\tstate.userCount-- // decrement Active Users count\n\t\t\t\tuser.groups.forEach(userGroup => {\n\t\t\t\t\tconst group = state.groups.find(groupSearch => groupSearch.id === userGroup)\n\t\t\t\t\tif (!group) {\n\t\t\t\t\t\tconsole.warn('User group ' + userGroup + ' does not exist during user removal')\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t\tgroup.usercount-- // decrement group total count\n\t\t\t\t})\n\t\t\t} else {\n\t\t\t\tdisabledGroup.usercount-- // decrement Disabled Users count\n\t\t\t\tuser.groups.forEach(userGroup => {\n\t\t\t\t\tconst group = state.groups.find(groupSearch => groupSearch.id === userGroup)\n\t\t\t\t\tgroup.disabled-- // decrement group disabled count\n\t\t\t\t})\n\t\t\t}\n\t\t\tbreak\n\t\tdefault:\n\t\t\tlogger.error(`Unknown action type in updateUserCounts: '${actionType}'`)\n\t\t\t// not throwing error to interrupt execution as this is not fatal\n\t\t}\n\t},\n\tsetUserData(state, { userid, key, value }) {\n\t\tif (key === 'quota') {\n\t\t\tconst humanValue = parseFileSize(value, true)\n\t\t\tstate.users.find(user => user.id === userid)[key][key] = humanValue !== null ? humanValue : value\n\t\t} else {\n\t\t\tstate.users.find(user => user.id === userid)[key] = value\n\t\t}\n\t},\n\n\t/**\n\t * Reset users list\n\t *\n\t * @param {object} state the store state\n\t */\n\tresetUsers(state) {\n\t\tstate.users = []\n\t\tstate.usersOffset = 0\n\t\tstate.disabledUsersOffset = 0\n\t},\n\n\tsetShowConfig(state, { key, value }) {\n\t\tlocalStorage.setItem(`account_settings__${key}`, JSON.stringify(value))\n\t\tstate.showConfig[key] = value\n\t},\n\n\tsetGroupSorting(state, sorting) {\n\t\tconst oldValue = state.orderBy\n\t\tstate.orderBy = sorting\n\n\t\t// Persist the value on the server\n\t\taxios.post(\n\t\t\tgenerateUrl('/settings/users/preferences/group.sortBy'),\n\t\t\t{\n\t\t\t\tvalue: String(sorting),\n\t\t\t},\n\t\t).catch((error) => {\n\t\t\tstate.orderBy = oldValue\n\t\t\tshowError(t('settings', 'Could not set group sorting'))\n\t\t\tlogger.error(error)\n\t\t})\n\t},\n}\n\nconst getters = {\n\tgetUsers(state) {\n\t\treturn state.users\n\t},\n\tgetGroups(state) {\n\t\treturn state.groups\n\t},\n\tgetSubadminGroups(state) {\n\t\t// Can't be subadmin of admin, recent, or disabled\n\t\treturn state.groups.filter(group => group.id !== 'admin' && group.id !== '__nc_internal_recent' && group.id !== 'disabled')\n\t},\n\tgetSortedGroups(state) {\n\t\tconst groups = [...state.groups]\n\t\tif (state.orderBy === GroupSorting.UserCount) {\n\t\t\treturn groups.sort((a, b) => {\n\t\t\t\tconst numA = a.usercount - a.disabled\n\t\t\t\tconst numB = b.usercount - b.disabled\n\t\t\t\treturn (numA < numB) ? 1 : (numB < numA ? -1 : a.name.localeCompare(b.name))\n\t\t\t})\n\t\t} else {\n\t\t\treturn groups.sort((a, b) => a.name.localeCompare(b.name))\n\t\t}\n\t},\n\tgetGroupSorting(state) {\n\t\treturn state.orderBy\n\t},\n\tgetPasswordPolicyMinLength(state) {\n\t\treturn state.minPasswordLength\n\t},\n\tgetUsersOffset(state) {\n\t\treturn state.usersOffset\n\t},\n\tgetUsersLimit(state) {\n\t\treturn state.usersLimit\n\t},\n\tgetDisabledUsersOffset(state) {\n\t\treturn state.disabledUsersOffset\n\t},\n\tgetDisabledUsersLimit(state) {\n\t\treturn state.disabledUsersLimit\n\t},\n\tgetUserCount(state) {\n\t\treturn state.userCount\n\t},\n\tgetShowConfig(state) {\n\t\treturn state.showConfig\n\t},\n}\n\nconst CancelToken = axios.CancelToken\nlet searchRequestCancelSource = null\n\nconst actions = {\n\n\t/**\n\t * search users\n\t *\n\t * @param {object} context store context\n\t * @param {object} options destructuring object\n\t * @param {number} options.offset List offset to request\n\t * @param {number} options.limit List number to return from offset\n\t * @param {string} options.search Search amongst users\n\t * @return {Promise}\n\t */\n\tsearchUsers(context, { offset, limit, search }) {\n\t\tsearch = typeof search === 'string' ? search : ''\n\n\t\treturn api.get(generateOcsUrl('cloud/users/details?offset={offset}&limit={limit}&search={search}', { offset, limit, search })).catch((error) => {\n\t\t\tif (!axios.isCancel(error)) {\n\t\t\t\tcontext.commit('API_FAILURE', error)\n\t\t\t}\n\t\t})\n\t},\n\n\t/**\n\t * Get user details\n\t *\n\t * @param {object} context store context\n\t * @param {string} userId user id\n\t * @return {Promise}\n\t */\n\tgetUser(context, userId) {\n\t\treturn api.get(generateOcsUrl(`cloud/users/${userId}`)).catch((error) => {\n\t\t\tif (!axios.isCancel(error)) {\n\t\t\t\tcontext.commit('API_FAILURE', error)\n\t\t\t}\n\t\t})\n\t},\n\n\t/**\n\t * Get all users with full details\n\t *\n\t * @param {object} context store context\n\t * @param {object} options destructuring object\n\t * @param {number} options.offset List offset to request\n\t * @param {number} options.limit List number to return from offset\n\t * @param {string} options.search Search amongst users\n\t * @param {string} options.group Get users from group\n\t * @return {Promise}\n\t */\n\tgetUsers(context, { offset, limit, search, group }) {\n\t\tif (searchRequestCancelSource) {\n\t\t\tsearchRequestCancelSource.cancel('Operation canceled by another search request.')\n\t\t}\n\t\tsearchRequestCancelSource = CancelToken.source()\n\t\tsearch = typeof search === 'string' ? search : ''\n\n\t\t/**\n\t\t * Adding filters in the search bar such as in:files, in:users, etc.\n\t\t * collides with this particular search, so we need to remove them\n\t\t * here and leave only the original search query\n\t\t */\n\t\tsearch = search.replace(/in:[^\\s]+/g, '').trim()\n\n\t\tgroup = typeof group === 'string' ? group : ''\n\t\tif (group !== '') {\n\t\t\treturn api.get(generateOcsUrl('cloud/groups/{group}/users/details?offset={offset}&limit={limit}&search={search}', { group: encodeURIComponent(group), offset, limit, search }), {\n\t\t\t\tcancelToken: searchRequestCancelSource.token,\n\t\t\t})\n\t\t\t\t.then((response) => {\n\t\t\t\t\tconst usersCount = Object.keys(response.data.ocs.data.users).length\n\t\t\t\t\tif (usersCount > 0) {\n\t\t\t\t\t\tcontext.commit('appendUsers', response.data.ocs.data.users)\n\t\t\t\t\t}\n\t\t\t\t\treturn usersCount\n\t\t\t\t})\n\t\t\t\t.catch((error) => {\n\t\t\t\t\tif (!axios.isCancel(error)) {\n\t\t\t\t\t\tcontext.commit('API_FAILURE', error)\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t}\n\n\t\treturn api.get(generateOcsUrl('cloud/users/details?offset={offset}&limit={limit}&search={search}', { offset, limit, search }), {\n\t\t\tcancelToken: searchRequestCancelSource.token,\n\t\t})\n\t\t\t.then((response) => {\n\t\t\t\tconst usersCount = Object.keys(response.data.ocs.data.users).length\n\t\t\t\tif (usersCount > 0) {\n\t\t\t\t\tcontext.commit('appendUsers', response.data.ocs.data.users)\n\t\t\t\t}\n\t\t\t\treturn usersCount\n\t\t\t})\n\t\t\t.catch((error) => {\n\t\t\t\tif (!axios.isCancel(error)) {\n\t\t\t\t\tcontext.commit('API_FAILURE', error)\n\t\t\t\t}\n\t\t\t})\n\t},\n\n\t/**\n\t * Get recent users with full details\n\t *\n\t * @param {object} context store context\n\t * @param {object} options destructuring object\n\t * @param {number} options.offset List offset to request\n\t * @param {number} options.limit List number to return from offset\n\t * @param {string} options.search Search query\n\t * @return {Promise<number>}\n\t */\n\tasync getRecentUsers(context, { offset, limit, search }) {\n\t\tconst url = generateOcsUrl('cloud/users/recent?offset={offset}&limit={limit}&search={search}', { offset, limit, search })\n\t\ttry {\n\t\t\tconst response = await api.get(url)\n\t\t\tconst usersCount = Object.keys(response.data.ocs.data.users).length\n\t\t\tif (usersCount > 0) {\n\t\t\t\tcontext.commit('appendUsers', response.data.ocs.data.users)\n\t\t\t}\n\t\t\treturn usersCount\n\t\t} catch (error) {\n\t\t\tcontext.commit('API_FAILURE', error)\n\t\t}\n\t},\n\n\t/**\n\t * Get disabled users with full details\n\t *\n\t * @param {object} context store context\n\t * @param {object} options destructuring object\n\t * @param {number} options.offset List offset to request\n\t * @param {number} options.limit List number to return from offset\n\t * @param options.search\n\t * @return {Promise<number>}\n\t */\n\tasync getDisabledUsers(context, { offset, limit, search }) {\n\t\tconst url = generateOcsUrl('cloud/users/disabled?offset={offset}&limit={limit}&search={search}', { offset, limit, search })\n\t\ttry {\n\t\t\tconst response = await api.get(url)\n\t\t\tconst usersCount = Object.keys(response.data.ocs.data.users).length\n\t\t\tif (usersCount > 0) {\n\t\t\t\tcontext.commit('appendUsers', response.data.ocs.data.users)\n\t\t\t\tcontext.commit('updateDisabledUsers', response.data.ocs.data.users)\n\t\t\t}\n\t\t\treturn usersCount\n\t\t} catch (error) {\n\t\t\tcontext.commit('API_FAILURE', error)\n\t\t}\n\t},\n\n\tgetGroups(context, { offset, limit, search }) {\n\t\tsearch = typeof search === 'string' ? search : ''\n\t\tconst limitParam = limit === -1 ? '' : `&limit=${limit}`\n\t\treturn api.get(generateOcsUrl('cloud/groups?offset={offset}&search={search}', { offset, search }) + limitParam)\n\t\t\t.then((response) => {\n\t\t\t\tif (Object.keys(response.data.ocs.data.groups).length > 0) {\n\t\t\t\t\tresponse.data.ocs.data.groups.forEach(function(group) {\n\t\t\t\t\t\tcontext.commit('addGroup', { gid: group, displayName: group })\n\t\t\t\t\t})\n\t\t\t\t\treturn true\n\t\t\t\t}\n\t\t\t\treturn false\n\t\t\t})\n\t\t\t.catch((error) => context.commit('API_FAILURE', error))\n\t},\n\n\t/**\n\t * Get all users with full details\n\t *\n\t * @param {object} context store context\n\t * @param {object} options destructuring object\n\t * @param {number} options.offset List offset to request\n\t * @param {number} options.limit List number to return from offset\n\t * @param {string} options.search -\n\t * @return {Promise}\n\t */\n\tgetUsersFromList(context, { offset, limit, search }) {\n\t\tsearch = typeof search === 'string' ? search : ''\n\t\treturn api.get(generateOcsUrl('cloud/users/details?offset={offset}&limit={limit}&search={search}', { offset, limit, search }))\n\t\t\t.then((response) => {\n\t\t\t\tif (Object.keys(response.data.ocs.data.users).length > 0) {\n\t\t\t\t\tcontext.commit('appendUsers', response.data.ocs.data.users)\n\t\t\t\t\treturn true\n\t\t\t\t}\n\t\t\t\treturn false\n\t\t\t})\n\t\t\t.catch((error) => context.commit('API_FAILURE', error))\n\t},\n\n\t/**\n\t * Get all users with full details from a groupid\n\t *\n\t * @param {object} context store context\n\t * @param {object} options destructuring object\n\t * @param {number} options.offset List offset to request\n\t * @param {number} options.limit List number to return from offset\n\t * @param {string} options.groupid -\n\t * @return {Promise}\n\t */\n\tgetUsersFromGroup(context, { groupid, offset, limit }) {\n\t\treturn api.get(generateOcsUrl('cloud/users/{groupId}/details?offset={offset}&limit={limit}', { groupId: encodeURIComponent(groupid), offset, limit }))\n\t\t\t.then((response) => context.commit('getUsersFromList', response.data.ocs.data.users))\n\t\t\t.catch((error) => context.commit('API_FAILURE', error))\n\t},\n\n\tgetPasswordPolicyMinLength(context) {\n\t\tif (getCapabilities().password_policy && getCapabilities().password_policy.minLength) {\n\t\t\tcontext.commit('setPasswordPolicyMinLength', getCapabilities().password_policy.minLength)\n\t\t\treturn getCapabilities().password_policy.minLength\n\t\t}\n\t\treturn false\n\t},\n\n\t/**\n\t * Add group\n\t *\n\t * @param {object} context store context\n\t * @param {string} gid Group id\n\t * @return {Promise}\n\t */\n\taddGroup(context, gid) {\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\treturn api.post(generateOcsUrl('cloud/groups'), { groupid: gid })\n\t\t\t\t.then((response) => {\n\t\t\t\t\tcontext.commit('addGroup', { gid, displayName: gid })\n\t\t\t\t\treturn { gid, displayName: gid }\n\t\t\t\t})\n\t\t\t\t.catch((error) => { throw error })\n\t\t}).catch((error) => {\n\t\t\tcontext.commit('API_FAILURE', { gid, error })\n\t\t\t// let's throw one more time to prevent the view\n\t\t\t// from adding the user to a group that doesn't exists\n\t\t\tthrow error\n\t\t})\n\t},\n\n\t/**\n\t * Rename group\n\t *\n\t * @param {object} context store context\n\t * @param {string} groupid Group id\n\t * @param {string} displayName Group display name\n\t * @return {Promise}\n\t */\n\trenameGroup(context, { groupid, displayName }) {\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\treturn api.put(generateOcsUrl('cloud/groups/{groupId}', { groupId: encodeURIComponent(groupid) }), { key: 'displayname', value: displayName })\n\t\t\t\t.then((response) => {\n\t\t\t\t\tcontext.commit('renameGroup', { gid: groupid, displayName })\n\t\t\t\t\treturn { groupid, displayName }\n\t\t\t\t})\n\t\t\t\t.catch((error) => { throw error })\n\t\t}).catch((error) => {\n\t\t\tcontext.commit('API_FAILURE', { groupid, error })\n\t\t\t// let's throw one more time to prevent the view\n\t\t\t// from renaming the group\n\t\t\tthrow error\n\t\t})\n\t},\n\n\t/**\n\t * Remove group\n\t *\n\t * @param {object} context store context\n\t * @param {string} gid Group id\n\t * @return {Promise}\n\t */\n\tremoveGroup(context, gid) {\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\treturn api.delete(generateOcsUrl('cloud/groups/{groupId}', { groupId: encodeURIComponent(gid) }))\n\t\t\t\t.then((response) => context.commit('removeGroup', gid))\n\t\t\t\t.catch((error) => { throw error })\n\t\t}).catch((error) => context.commit('API_FAILURE', { gid, error }))\n\t},\n\n\t/**\n\t * Add user to group\n\t *\n\t * @param {object} context store context\n\t * @param {object} options destructuring object\n\t * @param {string} options.userid User id\n\t * @param {string} options.gid Group id\n\t * @return {Promise}\n\t */\n\taddUserGroup(context, { userid, gid }) {\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\treturn api.post(generateOcsUrl('cloud/users/{userid}/groups', { userid }), { groupid: gid })\n\t\t\t\t.then((response) => context.commit('addUserGroup', { userid, gid }))\n\t\t\t\t.catch((error) => { throw error })\n\t\t}).catch((error) => context.commit('API_FAILURE', { userid, error }))\n\t},\n\n\t/**\n\t * Remove user from group\n\t *\n\t * @param {object} context store context\n\t * @param {object} options destructuring object\n\t * @param {string} options.userid User id\n\t * @param {string} options.gid Group id\n\t * @return {Promise}\n\t */\n\tremoveUserGroup(context, { userid, gid }) {\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\treturn api.delete(generateOcsUrl('cloud/users/{userid}/groups', { userid }), { groupid: gid })\n\t\t\t\t.then((response) => context.commit('removeUserGroup', { userid, gid }))\n\t\t\t\t.catch((error) => { throw error })\n\t\t}).catch((error) => {\n\t\t\tcontext.commit('API_FAILURE', { userid, error })\n\t\t\t// let's throw one more time to prevent\n\t\t\t// the view from removing the user row on failure\n\t\t\tthrow error\n\t\t})\n\t},\n\n\t/**\n\t * Add user to group admin\n\t *\n\t * @param {object} context store context\n\t * @param {object} options destructuring object\n\t * @param {string} options.userid User id\n\t * @param {string} options.gid Group id\n\t * @return {Promise}\n\t */\n\taddUserSubAdmin(context, { userid, gid }) {\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\treturn api.post(generateOcsUrl('cloud/users/{userid}/subadmins', { userid }), { groupid: gid })\n\t\t\t\t.then((response) => context.commit('addUserSubAdmin', { userid, gid }))\n\t\t\t\t.catch((error) => { throw error })\n\t\t}).catch((error) => context.commit('API_FAILURE', { userid, error }))\n\t},\n\n\t/**\n\t * Remove user from group admin\n\t *\n\t * @param {object} context store context\n\t * @param {object} options destructuring object\n\t * @param {string} options.userid User id\n\t * @param {string} options.gid Group id\n\t * @return {Promise}\n\t */\n\tremoveUserSubAdmin(context, { userid, gid }) {\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\treturn api.delete(generateOcsUrl('cloud/users/{userid}/subadmins', { userid }), { groupid: gid })\n\t\t\t\t.then((response) => context.commit('removeUserSubAdmin', { userid, gid }))\n\t\t\t\t.catch((error) => { throw error })\n\t\t}).catch((error) => context.commit('API_FAILURE', { userid, error }))\n\t},\n\n\t/**\n\t * Mark all user devices for remote wipe\n\t *\n\t * @param {object} context store context\n\t * @param {string} userid User id\n\t * @return {Promise}\n\t */\n\tasync wipeUserDevices(context, userid) {\n\t\ttry {\n\t\t\tawait api.requireAdmin()\n\t\t\treturn await api.post(generateOcsUrl('cloud/users/{userid}/wipe', { userid }))\n\t\t} catch (error) {\n\t\t\tcontext.commit('API_FAILURE', { userid, error })\n\t\t\treturn Promise.reject(new Error('Failed to wipe user devices'))\n\t\t}\n\t},\n\n\t/**\n\t * Delete a user\n\t *\n\t * @param {object} context store context\n\t * @param {string} userid User id\n\t * @return {Promise}\n\t */\n\tdeleteUser(context, userid) {\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\treturn api.delete(generateOcsUrl('cloud/users/{userid}', { userid }))\n\t\t\t\t.then((response) => context.commit('deleteUser', userid))\n\t\t\t\t.catch((error) => { throw error })\n\t\t}).catch((error) => context.commit('API_FAILURE', { userid, error }))\n\t},\n\n\t/**\n\t * Add a user\n\t *\n\t * @param {object} context store context\n\t * @param {Function} context.commit -\n\t * @param {Function} context.dispatch -\n\t * @param {object} options destructuring object\n\t * @param {string} options.userid User id\n\t * @param {string} options.password User password\n\t * @param {string} options.displayName User display name\n\t * @param {string} options.email User email\n\t * @param {string} options.groups User groups\n\t * @param {string} options.subadmin User subadmin groups\n\t * @param {string} options.quota User email\n\t * @param {string} options.language User language\n\t * @param {string} options.manager User manager\n\t * @return {Promise}\n\t */\n\taddUser({ commit, dispatch }, { userid, password, displayName, email, groups, subadmin, quota, language, manager }) {\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\treturn api.post(generateOcsUrl('cloud/users'), { userid, password, displayName, email, groups, subadmin, quota, language, manager })\n\t\t\t\t.then((response) => dispatch('addUserData', userid || response.data.ocs.data.id))\n\t\t\t\t.catch((error) => { throw error })\n\t\t}).catch((error) => {\n\t\t\tcommit('API_FAILURE', { userid, error })\n\t\t\tthrow error\n\t\t})\n\t},\n\n\t/**\n\t * Get user data and commit addition\n\t *\n\t * @param {object} context store context\n\t * @param {string} userid User id\n\t * @return {Promise}\n\t */\n\taddUserData(context, userid) {\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\treturn api.get(generateOcsUrl('cloud/users/{userid}', { userid }))\n\t\t\t\t.then((response) => context.commit('addUserData', response))\n\t\t\t\t.catch((error) => { throw error })\n\t\t}).catch((error) => context.commit('API_FAILURE', { userid, error }))\n\t},\n\n\t/**\n\t * Enable or disable user\n\t *\n\t * @param {object} context store context\n\t * @param {object} options destructuring object\n\t * @param {string} options.userid User id\n\t * @param {boolean} options.enabled User enablement status\n\t * @return {Promise}\n\t */\n\tenableDisableUser(context, { userid, enabled = true }) {\n\t\tconst userStatus = enabled ? 'enable' : 'disable'\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\treturn api.put(generateOcsUrl('cloud/users/{userid}/{userStatus}', { userid, userStatus }))\n\t\t\t\t.then((response) => context.commit('enableDisableUser', { userid, enabled }))\n\t\t\t\t.catch((error) => { throw error })\n\t\t}).catch((error) => context.commit('API_FAILURE', { userid, error }))\n\t},\n\n\t/**\n\t * Edit user data\n\t *\n\t * @param {object} context store context\n\t * @param {object} options destructuring object\n\t * @param {string} options.userid User id\n\t * @param {string} options.key User field to edit\n\t * @param {string} options.value Value of the change\n\t * @return {Promise}\n\t */\n\tasync setUserData(context, { userid, key, value }) {\n\t\tconst allowedEmpty = ['email', 'displayname', 'manager']\n\t\tif (['email', 'language', 'quota', 'displayname', 'password', 'manager'].indexOf(key) !== -1) {\n\t\t\t// We allow empty email or displayname\n\t\t\tif (typeof value === 'string'\n\t\t\t\t&& (\n\t\t\t\t\t(allowedEmpty.indexOf(key) === -1 && value.length > 0)\n\t\t\t\t\t|| allowedEmpty.indexOf(key) !== -1\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\ttry {\n\t\t\t\t\tawait api.requireAdmin()\n\t\t\t\t\tawait api.put(generateOcsUrl('cloud/users/{userid}', { userid }), { key, value })\n\t\t\t\t\treturn context.commit('setUserData', { userid, key, value })\n\t\t\t\t} catch (error) {\n\t\t\t\t\tcontext.commit('API_FAILURE', { userid, error })\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn Promise.reject(new Error('Invalid request data'))\n\t},\n\n\t/**\n\t * Send welcome mail\n\t *\n\t * @param {object} context store context\n\t * @param {string} userid User id\n\t * @return {Promise}\n\t */\n\tsendWelcomeMail(context, userid) {\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\treturn api.post(generateOcsUrl('cloud/users/{userid}/welcome', { userid }))\n\t\t\t\t.then(response => true)\n\t\t\t\t.catch((error) => { throw error })\n\t\t}).catch((error) => context.commit('API_FAILURE', { userid, error }))\n\t},\n}\n\nexport default { state, mutations, getters, actions }\n","/**\n * SPDX-FileCopyrightText: 2018 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport api from './api.js'\nimport Vue from 'vue'\nimport { generateUrl } from '@nextcloud/router'\nimport { showError, showInfo } from '@nextcloud/dialogs'\nimport { loadState } from '@nextcloud/initial-state'\n\nconst state = {\n\tapps: [],\n\tbundles: loadState('settings', 'appstoreBundles', []),\n\tcategories: [],\n\tupdateCount: loadState('settings', 'appstoreUpdateCount', 0),\n\tloading: {},\n\tgettingCategoriesPromise: null,\n}\n\nconst mutations = {\n\n\tAPPS_API_FAILURE(state, error) {\n\t\tshowError(t('settings', 'An error occurred during the request. Unable to proceed.') + '<br>' + error.error.response.data.data.message, { isHTML: true })\n\t\tconsole.error(state, error)\n\t},\n\n\tinitCategories(state, { categories, updateCount }) {\n\t\tstate.categories = categories\n\t\tstate.updateCount = updateCount\n\t},\n\n\tupdateCategories(state, categoriesPromise) {\n\t\tstate.gettingCategoriesPromise = categoriesPromise\n\t},\n\n\tsetUpdateCount(state, updateCount) {\n\t\tstate.updateCount = updateCount\n\t},\n\n\taddCategory(state, category) {\n\t\tstate.categories.push(category)\n\t},\n\n\tappendCategories(state, categoriesArray) {\n\t\t// convert obj to array\n\t\tstate.categories = categoriesArray\n\t},\n\n\tsetAllApps(state, apps) {\n\t\tstate.apps = apps\n\t},\n\n\tsetError(state, { appId, error }) {\n\t\tif (!Array.isArray(appId)) {\n\t\t\tappId = [appId]\n\t\t}\n\t\tappId.forEach((_id) => {\n\t\t\tconst app = state.apps.find(app => app.id === _id)\n\t\t\tapp.error = error\n\t\t})\n\t},\n\n\tclearError(state, { appId, error }) {\n\t\tconst app = state.apps.find(app => app.id === appId)\n\t\tapp.error = null\n\t},\n\n\tenableApp(state, { appId, groups }) {\n\t\tconst app = state.apps.find(app => app.id === appId)\n\t\tapp.active = true\n\t\tapp.groups = groups\n\t},\n\n\tsetInstallState(state, { appId, canInstall }) {\n\t\tconst app = state.apps.find(app => app.id === appId)\n\t\tif (app) {\n\t\t\tapp.canInstall = canInstall === true\n\t\t}\n\t},\n\n\tdisableApp(state, appId) {\n\t\tconst app = state.apps.find(app => app.id === appId)\n\t\tapp.active = false\n\t\tapp.groups = []\n\t\tif (app.removable) {\n\t\t\tapp.canUnInstall = true\n\t\t}\n\t},\n\n\tuninstallApp(state, appId) {\n\t\tstate.apps.find(app => app.id === appId).active = false\n\t\tstate.apps.find(app => app.id === appId).groups = []\n\t\tstate.apps.find(app => app.id === appId).needsDownload = true\n\t\tstate.apps.find(app => app.id === appId).installed = false\n\t\tstate.apps.find(app => app.id === appId).canUnInstall = false\n\t\tstate.apps.find(app => app.id === appId).canInstall = true\n\t},\n\n\tupdateApp(state, appId) {\n\t\tconst app = state.apps.find(app => app.id === appId)\n\t\tconst version = app.update\n\t\tapp.update = null\n\t\tapp.version = version\n\t\tstate.updateCount--\n\n\t},\n\n\tresetApps(state) {\n\t\tstate.apps = []\n\t},\n\treset(state) {\n\t\tstate.apps = []\n\t\tstate.categories = []\n\t\tstate.updateCount = 0\n\t},\n\tstartLoading(state, id) {\n\t\tif (Array.isArray(id)) {\n\t\t\tid.forEach((_id) => {\n\t\t\t\tVue.set(state.loading, _id, true)\n\t\t\t})\n\t\t} else {\n\t\t\tVue.set(state.loading, id, true)\n\t\t}\n\t},\n\tstopLoading(state, id) {\n\t\tif (Array.isArray(id)) {\n\t\t\tid.forEach((_id) => {\n\t\t\t\tVue.set(state.loading, _id, false)\n\t\t\t})\n\t\t} else {\n\t\t\tVue.set(state.loading, id, false)\n\t\t}\n\t},\n}\n\nconst getters = {\n\tloading(state) {\n\t\treturn function(id) {\n\t\t\treturn state.loading[id]\n\t\t}\n\t},\n\tgetCategories(state) {\n\t\treturn state.categories\n\t},\n\tgetAllApps(state) {\n\t\treturn state.apps\n\t},\n\tgetAppBundles(state) {\n\t\treturn state.bundles\n\t},\n\tgetUpdateCount(state) {\n\t\treturn state.updateCount\n\t},\n\tgetCategoryById: (state) => (selectedCategoryId) => {\n\t\treturn state.categories.find((category) => category.id === selectedCategoryId)\n\t},\n}\n\nconst actions = {\n\n\tenableApp(context, { appId, groups }) {\n\t\tlet apps\n\t\tif (Array.isArray(appId)) {\n\t\t\tapps = appId\n\t\t} else {\n\t\t\tapps = [appId]\n\t\t}\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\tcontext.commit('startLoading', apps)\n\t\t\tcontext.commit('startLoading', 'install')\n\t\t\treturn api.post(generateUrl('settings/apps/enable'), { appIds: apps, groups })\n\t\t\t\t.then((response) => {\n\t\t\t\t\tcontext.commit('stopLoading', apps)\n\t\t\t\t\tcontext.commit('stopLoading', 'install')\n\t\t\t\t\tapps.forEach(_appId => {\n\t\t\t\t\t\tcontext.commit('enableApp', { appId: _appId, groups })\n\t\t\t\t\t})\n\n\t\t\t\t\t// check for server health\n\t\t\t\t\treturn api.get(generateUrl('apps/files/'))\n\t\t\t\t\t\t.then(() => {\n\t\t\t\t\t\t\tif (response.data.update_required) {\n\t\t\t\t\t\t\t\tshowInfo(\n\t\t\t\t\t\t\t\t\tt(\n\t\t\t\t\t\t\t\t\t\t'settings',\n\t\t\t\t\t\t\t\t\t\t'The app has been enabled but needs to be updated. You will be redirected to the update page in 5 seconds.',\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tonClick: () => window.location.reload(),\n\t\t\t\t\t\t\t\t\t\tclose: false,\n\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\tsetTimeout(function() {\n\t\t\t\t\t\t\t\t\tlocation.reload()\n\t\t\t\t\t\t\t\t}, 5000)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.catch(() => {\n\t\t\t\t\t\t\tif (!Array.isArray(appId)) {\n\t\t\t\t\t\t\t\tshowError(t('settings', 'Error: This app cannot be enabled because it makes the server unstable'))\n\t\t\t\t\t\t\t\tcontext.commit('setError', {\n\t\t\t\t\t\t\t\t\tappId: apps,\n\t\t\t\t\t\t\t\t\terror: t('settings', 'Error: This app cannot be enabled because it makes the server unstable'),\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\tcontext.dispatch('disableApp', { appId })\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t})\n\t\t\t\t})\n\t\t\t\t.catch((error) => {\n\t\t\t\t\tcontext.commit('stopLoading', apps)\n\t\t\t\t\tcontext.commit('stopLoading', 'install')\n\t\t\t\t\tcontext.commit('setError', {\n\t\t\t\t\t\tappId: apps,\n\t\t\t\t\t\terror: error.response.data.data.message,\n\t\t\t\t\t})\n\t\t\t\t\tcontext.commit('APPS_API_FAILURE', { appId, error })\n\t\t\t\t})\n\t\t}).catch((error) => context.commit('API_FAILURE', { appId, error }))\n\t},\n\tforceEnableApp(context, { appId, groups }) {\n\t\tlet apps\n\t\tif (Array.isArray(appId)) {\n\t\t\tapps = appId\n\t\t} else {\n\t\t\tapps = [appId]\n\t\t}\n\t\treturn api.requireAdmin().then(() => {\n\t\t\tcontext.commit('startLoading', apps)\n\t\t\tcontext.commit('startLoading', 'install')\n\t\t\treturn api.post(generateUrl('settings/apps/force'), { appId })\n\t\t\t\t.then((response) => {\n\t\t\t\t\tcontext.commit('setInstallState', { appId, canInstall: true })\n\t\t\t\t})\n\t\t\t\t.catch((error) => {\n\t\t\t\t\tcontext.commit('stopLoading', apps)\n\t\t\t\t\tcontext.commit('stopLoading', 'install')\n\t\t\t\t\tcontext.commit('setError', {\n\t\t\t\t\t\tappId: apps,\n\t\t\t\t\t\terror: error.response.data.data.message,\n\t\t\t\t\t})\n\t\t\t\t\tcontext.commit('APPS_API_FAILURE', { appId, error })\n\t\t\t\t})\n\t\t\t\t.finally(() => {\n\t\t\t\t\tcontext.commit('stopLoading', apps)\n\t\t\t\t\tcontext.commit('stopLoading', 'install')\n\t\t\t\t})\n\t\t}).catch((error) => context.commit('API_FAILURE', { appId, error }))\n\t},\n\tdisableApp(context, { appId }) {\n\t\tlet apps\n\t\tif (Array.isArray(appId)) {\n\t\t\tapps = appId\n\t\t} else {\n\t\t\tapps = [appId]\n\t\t}\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\tcontext.commit('startLoading', apps)\n\t\t\treturn api.post(generateUrl('settings/apps/disable'), { appIds: apps })\n\t\t\t\t.then((response) => {\n\t\t\t\t\tcontext.commit('stopLoading', apps)\n\t\t\t\t\tapps.forEach(_appId => {\n\t\t\t\t\t\tcontext.commit('disableApp', _appId)\n\t\t\t\t\t})\n\t\t\t\t\treturn true\n\t\t\t\t})\n\t\t\t\t.catch((error) => {\n\t\t\t\t\tcontext.commit('stopLoading', apps)\n\t\t\t\t\tcontext.commit('APPS_API_FAILURE', { appId, error })\n\t\t\t\t})\n\t\t}).catch((error) => context.commit('API_FAILURE', { appId, error }))\n\t},\n\tuninstallApp(context, { appId }) {\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\tcontext.commit('startLoading', appId)\n\t\t\treturn api.get(generateUrl(`settings/apps/uninstall/${appId}`))\n\t\t\t\t.then((response) => {\n\t\t\t\t\tcontext.commit('stopLoading', appId)\n\t\t\t\t\tcontext.commit('uninstallApp', appId)\n\t\t\t\t\treturn true\n\t\t\t\t})\n\t\t\t\t.catch((error) => {\n\t\t\t\t\tcontext.commit('stopLoading', appId)\n\t\t\t\t\tcontext.commit('APPS_API_FAILURE', { appId, error })\n\t\t\t\t})\n\t\t}).catch((error) => context.commit('API_FAILURE', { appId, error }))\n\t},\n\n\tupdateApp(context, { appId }) {\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\tcontext.commit('startLoading', appId)\n\t\t\tcontext.commit('startLoading', 'install')\n\t\t\treturn api.get(generateUrl(`settings/apps/update/${appId}`))\n\t\t\t\t.then((response) => {\n\t\t\t\t\tcontext.commit('stopLoading', 'install')\n\t\t\t\t\tcontext.commit('stopLoading', appId)\n\t\t\t\t\tcontext.commit('updateApp', appId)\n\t\t\t\t\treturn true\n\t\t\t\t})\n\t\t\t\t.catch((error) => {\n\t\t\t\t\tcontext.commit('stopLoading', appId)\n\t\t\t\t\tcontext.commit('stopLoading', 'install')\n\t\t\t\t\tcontext.commit('APPS_API_FAILURE', { appId, error })\n\t\t\t\t})\n\t\t}).catch((error) => context.commit('API_FAILURE', { appId, error }))\n\t},\n\n\tgetAllApps(context) {\n\t\tcontext.commit('startLoading', 'list')\n\t\treturn api.get(generateUrl('settings/apps/list'))\n\t\t\t.then((response) => {\n\t\t\t\tcontext.commit('setAllApps', response.data.apps)\n\t\t\t\tcontext.commit('stopLoading', 'list')\n\t\t\t\treturn true\n\t\t\t})\n\t\t\t.catch((error) => context.commit('API_FAILURE', error))\n\t},\n\n\tasync getCategories(context, { shouldRefetchCategories = false } = {}) {\n\t\tif (shouldRefetchCategories || !context.state.gettingCategoriesPromise) {\n\t\t\tcontext.commit('startLoading', 'categories')\n\t\t\ttry {\n\t\t\t\tconst categoriesPromise = api.get(generateUrl('settings/apps/categories'))\n\t\t\t\tcontext.commit('updateCategories', categoriesPromise)\n\t\t\t\tconst categoriesPromiseResponse = await categoriesPromise\n\t\t\t\tif (categoriesPromiseResponse.data.length > 0) {\n\t\t\t\t\tcontext.commit('appendCategories', categoriesPromiseResponse.data)\n\t\t\t\t\tcontext.commit('stopLoading', 'categories')\n\t\t\t\t\treturn true\n\t\t\t\t}\n\t\t\t\tcontext.commit('stopLoading', 'categories')\n\t\t\t\treturn false\n\t\t\t} catch (error) {\n\t\t\t\tcontext.commit('API_FAILURE', error)\n\t\t\t}\n\t\t}\n\t\treturn context.state.gettingCategoriesPromise\n\t},\n\n}\n\nexport default { state, mutations, getters, actions }\n","/**\n * SPDX-FileCopyrightText: 2018 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport { loadState } from '@nextcloud/initial-state'\n\nconst state = {\n\tserverData: loadState('settings', 'usersSettings', {}),\n}\nconst mutations = {\n\tsetServerData(state, data) {\n\t\tstate.serverData = data\n\t},\n}\nconst getters = {\n\tgetServerData(state) {\n\t\treturn state.serverData\n\t},\n}\nconst actions = {}\n\nexport default { state, mutations, getters, actions }\n","/**\n * SPDX-FileCopyrightText: 2018 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport api from './api.js'\nimport { generateOcsUrl } from '@nextcloud/router'\n\nconst state = {}\nconst mutations = {}\nconst getters = {}\nconst actions = {\n\t/**\n\t * Set application config in database\n\t *\n\t * @param {object} context store context\n\t * @param {object} options destructuring object\n\t * @param {string} options.app Application name\n\t * @param {boolean} options.key Config key\n\t * @param {boolean} options.value Value to set\n\t * @return {Promise}\n\t */\n\tsetAppConfig(context, { app, key, value }) {\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\treturn api.post(generateOcsUrl('apps/provisioning_api/api/v1/config/apps/{app}/{key}', { app, key }), { value })\n\t\t\t\t.catch((error) => { throw error })\n\t\t}).catch((error) => context.commit('API_FAILURE', { app, key, value, error }))\n\t},\n}\n\nexport default { state, mutations, getters, actions }\n","/**\n * SPDX-FileCopyrightText: 2018 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport Vue from 'vue'\nimport Vuex, { Store } from 'vuex'\nimport users from './users.js'\nimport apps from './apps.js'\nimport settings from './users-settings.js'\nimport oc from './oc.js'\nimport { showError } from '@nextcloud/dialogs'\n\nVue.use(Vuex)\n\nconst debug = process.env.NODE_ENV !== 'production'\n\nconst mutations = {\n\tAPI_FAILURE(state, error) {\n\t\ttry {\n\t\t\tconst message = error.error.response.data.ocs.meta.message\n\t\t\tshowError(t('settings', 'An error occurred during the request. Unable to proceed.') + '<br>' + message, { isHTML: true })\n\t\t} catch (e) {\n\t\t\tshowError(t('settings', 'An error occurred during the request. Unable to proceed.'))\n\t\t}\n\t\tconsole.error(state, error)\n\t},\n}\n\nlet store = null\n\nexport const useStore = () => {\n\tif (store === null) {\n\t\tstore = new Store({\n\t\t\tmodules: {\n\t\t\t\tusers,\n\t\t\t\tapps,\n\t\t\t\tsettings,\n\t\t\t\toc,\n\t\t\t},\n\t\t\tstrict: debug,\n\t\t\tmutations,\n\t\t})\n\t}\n\treturn store\n}\n","/**\n * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n/**\n * https://github.com/nextcloud/server/blob/208e38e84e1a07a49699aa90dc5b7272d24489f0/lib/private/Group/MetaData.php#L34\n */\nexport var GroupSorting;\n(function (GroupSorting) {\n GroupSorting[GroupSorting[\"UserCount\"] = 1] = \"UserCount\";\n GroupSorting[GroupSorting[\"GroupName\"] = 2] = \"GroupName\";\n})(GroupSorting || (GroupSorting = {}));\n","/**\n * SPDX-FileCopyrightText: 2020 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\nimport { getLoggerBuilder } from '@nextcloud/logger';\nexport default getLoggerBuilder()\n .setApp('settings')\n .detectUser()\n .build();\n","var render = function render(){var _vm=this,_c=_vm._self._c,_setup=_vm._self._setupProxy;return _c(_setup.NcContent,{attrs:{\"app-name\":\"settings\"}},[_c('router-view',{attrs:{\"name\":\"navigation\"}}),_vm._v(\" \"),_c('router-view'),_vm._v(\" \"),_c('router-view',{attrs:{\"name\":\"sidebar\"}})],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/ts-loader/index.js??clonedRuleSet-4.use[1]!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SettingsApp.vue?vue&type=script&setup=true&lang=ts\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/ts-loader/index.js??clonedRuleSet-4.use[1]!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SettingsApp.vue?vue&type=script&setup=true&lang=ts\"","import { render, staticRenderFns } from \"./SettingsApp.vue?vue&type=template&id=02c6e0e9\"\nimport script from \"./SettingsApp.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./SettingsApp.vue?vue&type=script&setup=true&lang=ts\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","// Dynamic loading\nconst AppStore = () => import(/* webpackChunkName: 'settings-apps-view' */ '../views/AppStore.vue');\nconst AppStoreNavigation = () => import(/* webpackChunkName: 'settings-apps-view' */ '../views/AppStoreNavigation.vue');\nconst AppStoreSidebar = () => import(/* webpackChunkName: 'settings-apps-view' */ '../views/AppStoreSidebar.vue');\nconst UserManagement = () => import(/* webpackChunkName: 'settings-users' */ '../views/UserManagement.vue');\nconst UserManagementNavigation = () => import(/* webpackChunkName: 'settings-users' */ '../views/UserManagementNavigation.vue');\nconst routes = [\n {\n name: 'users',\n path: '/:index(index.php/)?settings/users',\n components: {\n default: UserManagement,\n navigation: UserManagementNavigation,\n },\n props: true,\n children: [\n {\n path: ':selectedGroup',\n name: 'group',\n },\n ],\n },\n {\n path: '/:index(index.php/)?settings/apps',\n name: 'apps',\n // redirect to our default route - the app discover section\n redirect: {\n name: 'apps-category',\n params: {\n category: 'discover',\n },\n },\n components: {\n default: AppStore,\n navigation: AppStoreNavigation,\n sidebar: AppStoreSidebar,\n },\n children: [\n {\n path: ':category',\n name: 'apps-category',\n children: [\n {\n path: ':id',\n name: 'apps-details',\n },\n ],\n },\n ],\n },\n];\nexport default routes;\n","/**\n * SPDX-FileCopyrightText: 2018 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\nimport Vue from 'vue';\nimport Router from 'vue-router';\nimport { generateUrl } from '@nextcloud/router';\nimport routes from './routes.ts';\nVue.use(Router);\nconst router = new Router({\n mode: 'history',\n // if index.php is in the url AND we got this far, then it's working:\n // let's keep using index.php in the url\n base: generateUrl(''),\n linkActiveClass: 'active',\n routes,\n});\nexport default router;\n","/**\n * SPDX-FileCopyrightText: 2018 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\nimport Vue from 'vue';\nimport VTooltip from 'v-tooltip';\nimport { sync } from 'vuex-router-sync';\nimport { translate as t, translatePlural as n } from '@nextcloud/l10n';\nimport SettingsApp from './views/SettingsApp.vue';\nimport router from './router/index.ts';\nimport { useStore } from './store/index.js';\nimport { getCSPNonce } from '@nextcloud/auth';\nimport { PiniaVuePlugin, createPinia } from 'pinia';\nVue.use(VTooltip, { defaultHtml: false });\nconst store = useStore();\nsync(store, router);\n// CSP config for webpack dynamic chunk loading\n// eslint-disable-next-line camelcase\n__webpack_nonce__ = getCSPNonce();\n// bind to window\nVue.prototype.t = t;\nVue.prototype.n = n;\nVue.use(PiniaVuePlugin);\nconst pinia = createPinia();\nexport default new Vue({\n router,\n store,\n pinia,\n render: h => h(SettingsApp),\n el: '#content',\n});\n","exports.sync = function (store, router, options) {\n var moduleName = (options || {}).moduleName || 'route'\n\n store.registerModule(moduleName, {\n namespaced: true,\n state: cloneRoute(router.currentRoute),\n mutations: {\n 'ROUTE_CHANGED': function ROUTE_CHANGED (state, transition) {\n store.state[moduleName] = cloneRoute(transition.to, transition.from)\n }\n }\n })\n\n var isTimeTraveling = false\n var currentPath\n\n // sync router on store change\n var storeUnwatch = store.watch(\n function (state) { return state[moduleName]; },\n function (route) {\n var fullPath = route.fullPath;\n if (fullPath === currentPath) {\n return\n }\n if (currentPath != null) {\n isTimeTraveling = true\n router.push(route)\n }\n currentPath = fullPath\n },\n { sync: true }\n )\n\n // sync store on router navigation\n var afterEachUnHook = router.afterEach(function (to, from) {\n if (isTimeTraveling) {\n isTimeTraveling = false\n return\n }\n currentPath = to.fullPath\n store.commit(moduleName + '/ROUTE_CHANGED', { to: to, from: from })\n })\n\n return function unsync () {\n // On unsync, remove router hook\n if (afterEachUnHook != null) {\n afterEachUnHook()\n }\n\n // On unsync, remove store watch\n if (storeUnwatch != null) {\n storeUnwatch()\n }\n\n // On unsync, unregister Module with store\n store.unregisterModule(moduleName)\n }\n}\n\nfunction cloneRoute (to, from) {\n var clone = {\n name: to.name,\n path: to.path,\n hash: to.hash,\n query: to.query,\n params: to.params,\n fullPath: to.fullPath,\n meta: to.meta\n }\n if (from) {\n clone.from = cloneRoute(from)\n }\n return Object.freeze(clone)\n}\n\n","import { getLoggerBuilder } from \"@nextcloud/logger\";\nimport { getCurrentUser, onRequestTokenUpdate, getRequestToken } from \"@nextcloud/auth\";\nimport { join, basename, extname, dirname } from \"path\";\nimport { encodePath } from \"@nextcloud/paths\";\nimport { generateRemoteUrl } from \"@nextcloud/router\";\nimport { CancelablePromise } from \"cancelable-promise\";\nimport { createClient, getPatcher } from \"webdav\";\nimport { isPublicShare, getSharingToken } from \"@nextcloud/sharing/public\";\nimport { getCapabilities } from \"@nextcloud/capabilities\";\nimport { getCanonicalLocale, getLanguage } from \"@nextcloud/l10n\";\nimport { TypedEventTarget } from \"typescript-event-target\";\nconst logger = getLoggerBuilder().setApp(\"@nextcloud/files\").detectUser().build();\nvar NewMenuEntryCategory = /* @__PURE__ */ ((NewMenuEntryCategory2) => {\n NewMenuEntryCategory2[NewMenuEntryCategory2[\"UploadFromDevice\"] = 0] = \"UploadFromDevice\";\n NewMenuEntryCategory2[NewMenuEntryCategory2[\"CreateNew\"] = 1] = \"CreateNew\";\n NewMenuEntryCategory2[NewMenuEntryCategory2[\"Other\"] = 2] = \"Other\";\n return NewMenuEntryCategory2;\n})(NewMenuEntryCategory || {});\nclass NewFileMenu {\n _entries = [];\n registerEntry(entry) {\n this.validateEntry(entry);\n entry.category = entry.category ?? 1;\n this._entries.push(entry);\n }\n unregisterEntry(entry) {\n const entryIndex = typeof entry === \"string\" ? this.getEntryIndex(entry) : this.getEntryIndex(entry.id);\n if (entryIndex === -1) {\n logger.warn(\"Entry not found, nothing removed\", { entry, entries: this.getEntries() });\n return;\n }\n this._entries.splice(entryIndex, 1);\n }\n /**\n * Get the list of registered entries\n *\n * @param {Folder} context the creation context. Usually the current folder\n */\n getEntries(context) {\n if (context) {\n return this._entries.filter((entry) => typeof entry.enabled === \"function\" ? entry.enabled(context) : true);\n }\n return this._entries;\n }\n getEntryIndex(id) {\n return this._entries.findIndex((entry) => entry.id === id);\n }\n validateEntry(entry) {\n if (!entry.id || !entry.displayName || !(entry.iconSvgInline || entry.iconClass) || !entry.handler) {\n throw new Error(\"Invalid entry\");\n }\n if (typeof entry.id !== \"string\" || typeof entry.displayName !== \"string\") {\n throw new Error(\"Invalid id or displayName property\");\n }\n if (entry.iconClass && typeof entry.iconClass !== \"string\" || entry.iconSvgInline && typeof entry.iconSvgInline !== \"string\") {\n throw new Error(\"Invalid icon provided\");\n }\n if (entry.enabled !== void 0 && typeof entry.enabled !== \"function\") {\n throw new Error(\"Invalid enabled property\");\n }\n if (typeof entry.handler !== \"function\") {\n throw new Error(\"Invalid handler property\");\n }\n if (\"order\" in entry && typeof entry.order !== \"number\") {\n throw new Error(\"Invalid order property\");\n }\n if (this.getEntryIndex(entry.id) !== -1) {\n throw new Error(\"Duplicate entry\");\n }\n }\n}\nconst getNewFileMenu = function() {\n if (typeof window._nc_newfilemenu === \"undefined\") {\n window._nc_newfilemenu = new NewFileMenu();\n logger.debug(\"NewFileMenu initialized\");\n }\n return window._nc_newfilemenu;\n};\nvar DefaultType = /* @__PURE__ */ ((DefaultType2) => {\n DefaultType2[\"DEFAULT\"] = \"default\";\n DefaultType2[\"HIDDEN\"] = \"hidden\";\n return DefaultType2;\n})(DefaultType || {});\nclass FileAction {\n _action;\n constructor(action) {\n this.validateAction(action);\n this._action = action;\n }\n get id() {\n return this._action.id;\n }\n get displayName() {\n return this._action.displayName;\n }\n get title() {\n return this._action.title;\n }\n get iconSvgInline() {\n return this._action.iconSvgInline;\n }\n get enabled() {\n return this._action.enabled;\n }\n get exec() {\n return this._action.exec;\n }\n get execBatch() {\n return this._action.execBatch;\n }\n get order() {\n return this._action.order;\n }\n get parent() {\n return this._action.parent;\n }\n get default() {\n return this._action.default;\n }\n get inline() {\n return this._action.inline;\n }\n get renderInline() {\n return this._action.renderInline;\n }\n validateAction(action) {\n if (!action.id || typeof action.id !== \"string\") {\n throw new Error(\"Invalid id\");\n }\n if (!action.displayName || typeof action.displayName !== \"function\") {\n throw new Error(\"Invalid displayName function\");\n }\n if (\"title\" in action && typeof action.title !== \"function\") {\n throw new Error(\"Invalid title function\");\n }\n if (!action.iconSvgInline || typeof action.iconSvgInline !== \"function\") {\n throw new Error(\"Invalid iconSvgInline function\");\n }\n if (!action.exec || typeof action.exec !== \"function\") {\n throw new Error(\"Invalid exec function\");\n }\n if (\"enabled\" in action && typeof action.enabled !== \"function\") {\n throw new Error(\"Invalid enabled function\");\n }\n if (\"execBatch\" in action && typeof action.execBatch !== \"function\") {\n throw new Error(\"Invalid execBatch function\");\n }\n if (\"order\" in action && typeof action.order !== \"number\") {\n throw new Error(\"Invalid order\");\n }\n if (\"parent\" in action && typeof action.parent !== \"string\") {\n throw new Error(\"Invalid parent\");\n }\n if (action.default && !Object.values(DefaultType).includes(action.default)) {\n throw new Error(\"Invalid default\");\n }\n if (\"inline\" in action && typeof action.inline !== \"function\") {\n throw new Error(\"Invalid inline function\");\n }\n if (\"renderInline\" in action && typeof action.renderInline !== \"function\") {\n throw new Error(\"Invalid renderInline function\");\n }\n }\n}\nconst registerFileAction = function(action) {\n if (typeof window._nc_fileactions === \"undefined\") {\n window._nc_fileactions = [];\n logger.debug(\"FileActions initialized\");\n }\n if (window._nc_fileactions.find((search) => search.id === action.id)) {\n logger.error(`FileAction ${action.id} already registered`, { action });\n return;\n }\n window._nc_fileactions.push(action);\n};\nconst getFileActions = function() {\n if (typeof window._nc_fileactions === \"undefined\") {\n window._nc_fileactions = [];\n logger.debug(\"FileActions initialized\");\n }\n return window._nc_fileactions;\n};\nclass Header {\n _header;\n constructor(header) {\n this.validateHeader(header);\n this._header = header;\n }\n get id() {\n return this._header.id;\n }\n get order() {\n return this._header.order;\n }\n get enabled() {\n return this._header.enabled;\n }\n get render() {\n return this._header.render;\n }\n get updated() {\n return this._header.updated;\n }\n validateHeader(header) {\n if (!header.id || !header.render || !header.updated) {\n throw new Error(\"Invalid header: id, render and updated are required\");\n }\n if (typeof header.id !== \"string\") {\n throw new Error(\"Invalid id property\");\n }\n if (header.enabled !== void 0 && typeof header.enabled !== \"function\") {\n throw new Error(\"Invalid enabled property\");\n }\n if (header.render && typeof header.render !== \"function\") {\n throw new Error(\"Invalid render property\");\n }\n if (header.updated && typeof header.updated !== \"function\") {\n throw new Error(\"Invalid updated property\");\n }\n }\n}\nconst registerFileListHeaders = function(header) {\n if (typeof window._nc_filelistheader === \"undefined\") {\n window._nc_filelistheader = [];\n logger.debug(\"FileListHeaders initialized\");\n }\n if (window._nc_filelistheader.find((search) => search.id === header.id)) {\n logger.error(`Header ${header.id} already registered`, { header });\n return;\n }\n window._nc_filelistheader.push(header);\n};\nconst getFileListHeaders = function() {\n if (typeof window._nc_filelistheader === \"undefined\") {\n window._nc_filelistheader = [];\n logger.debug(\"FileListHeaders initialized\");\n }\n return window._nc_filelistheader;\n};\nvar Permission = /* @__PURE__ */ ((Permission2) => {\n Permission2[Permission2[\"NONE\"] = 0] = \"NONE\";\n Permission2[Permission2[\"CREATE\"] = 4] = \"CREATE\";\n Permission2[Permission2[\"READ\"] = 1] = \"READ\";\n Permission2[Permission2[\"UPDATE\"] = 2] = \"UPDATE\";\n Permission2[Permission2[\"DELETE\"] = 8] = \"DELETE\";\n Permission2[Permission2[\"SHARE\"] = 16] = \"SHARE\";\n Permission2[Permission2[\"ALL\"] = 31] = \"ALL\";\n return Permission2;\n})(Permission || {});\nconst defaultDavProperties = [\n \"d:getcontentlength\",\n \"d:getcontenttype\",\n \"d:getetag\",\n \"d:getlastmodified\",\n \"d:creationdate\",\n \"d:displayname\",\n \"d:quota-available-bytes\",\n \"d:resourcetype\",\n \"nc:has-preview\",\n \"nc:is-encrypted\",\n \"nc:mount-type\",\n \"oc:comments-unread\",\n \"oc:favorite\",\n \"oc:fileid\",\n \"oc:owner-display-name\",\n \"oc:owner-id\",\n \"oc:permissions\",\n \"oc:size\"\n];\nconst defaultDavNamespaces = {\n d: \"DAV:\",\n nc: \"http://nextcloud.org/ns\",\n oc: \"http://owncloud.org/ns\",\n ocs: \"http://open-collaboration-services.org/ns\"\n};\nconst registerDavProperty = function(prop, namespace = { nc: \"http://nextcloud.org/ns\" }) {\n if (typeof window._nc_dav_properties === \"undefined\") {\n window._nc_dav_properties = [...defaultDavProperties];\n window._nc_dav_namespaces = { ...defaultDavNamespaces };\n }\n const namespaces = { ...window._nc_dav_namespaces, ...namespace };\n if (window._nc_dav_properties.find((search) => search === prop)) {\n logger.warn(`${prop} already registered`, { prop });\n return false;\n }\n if (prop.startsWith(\"<\") || prop.split(\":\").length !== 2) {\n logger.error(`${prop} is not valid. See example: 'oc:fileid'`, { prop });\n return false;\n }\n const ns = prop.split(\":\")[0];\n if (!namespaces[ns]) {\n logger.error(`${prop} namespace unknown`, { prop, namespaces });\n return false;\n }\n window._nc_dav_properties.push(prop);\n window._nc_dav_namespaces = namespaces;\n return true;\n};\nconst getDavProperties = function() {\n if (typeof window._nc_dav_properties === \"undefined\") {\n window._nc_dav_properties = [...defaultDavProperties];\n }\n return window._nc_dav_properties.map((prop) => `<${prop} />`).join(\" \");\n};\nconst getDavNameSpaces = function() {\n if (typeof window._nc_dav_namespaces === \"undefined\") {\n window._nc_dav_namespaces = { ...defaultDavNamespaces };\n }\n return Object.keys(window._nc_dav_namespaces).map((ns) => `xmlns:${ns}=\"${window._nc_dav_namespaces?.[ns]}\"`).join(\" \");\n};\nconst davGetDefaultPropfind = function() {\n return `<?xml version=\"1.0\"?>\n\t\t<d:propfind ${getDavNameSpaces()}>\n\t\t\t<d:prop>\n\t\t\t\t${getDavProperties()}\n\t\t\t</d:prop>\n\t\t</d:propfind>`;\n};\nconst davGetFavoritesReport = function() {\n return `<?xml version=\"1.0\"?>\n\t\t<oc:filter-files ${getDavNameSpaces()}>\n\t\t\t<d:prop>\n\t\t\t\t${getDavProperties()}\n\t\t\t</d:prop>\n\t\t\t<oc:filter-rules>\n\t\t\t\t<oc:favorite>1</oc:favorite>\n\t\t\t</oc:filter-rules>\n\t\t</oc:filter-files>`;\n};\nconst davGetRecentSearch = function(lastModified) {\n return `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<d:searchrequest ${getDavNameSpaces()}\n\txmlns:ns=\"https://github.com/icewind1991/SearchDAV/ns\">\n\t<d:basicsearch>\n\t\t<d:select>\n\t\t\t<d:prop>\n\t\t\t\t${getDavProperties()}\n\t\t\t</d:prop>\n\t\t</d:select>\n\t\t<d:from>\n\t\t\t<d:scope>\n\t\t\t\t<d:href>/files/${getCurrentUser()?.uid}/</d:href>\n\t\t\t\t<d:depth>infinity</d:depth>\n\t\t\t</d:scope>\n\t\t</d:from>\n\t\t<d:where>\n\t\t\t<d:and>\n\t\t\t\t<d:or>\n\t\t\t\t\t<d:not>\n\t\t\t\t\t\t<d:eq>\n\t\t\t\t\t\t\t<d:prop>\n\t\t\t\t\t\t\t\t<d:getcontenttype/>\n\t\t\t\t\t\t\t</d:prop>\n\t\t\t\t\t\t\t<d:literal>httpd/unix-directory</d:literal>\n\t\t\t\t\t\t</d:eq>\n\t\t\t\t\t</d:not>\n\t\t\t\t\t<d:eq>\n\t\t\t\t\t\t<d:prop>\n\t\t\t\t\t\t\t<oc:size/>\n\t\t\t\t\t\t</d:prop>\n\t\t\t\t\t\t<d:literal>0</d:literal>\n\t\t\t\t\t</d:eq>\n\t\t\t\t</d:or>\n\t\t\t\t<d:gt>\n\t\t\t\t\t<d:prop>\n\t\t\t\t\t\t<d:getlastmodified/>\n\t\t\t\t\t</d:prop>\n\t\t\t\t\t<d:literal>${lastModified}</d:literal>\n\t\t\t\t</d:gt>\n\t\t\t</d:and>\n\t\t</d:where>\n\t\t<d:orderby>\n\t\t\t<d:order>\n\t\t\t\t<d:prop>\n\t\t\t\t\t<d:getlastmodified/>\n\t\t\t\t</d:prop>\n\t\t\t\t<d:descending/>\n\t\t\t</d:order>\n\t\t</d:orderby>\n\t\t<d:limit>\n\t\t\t<d:nresults>100</d:nresults>\n\t\t\t<ns:firstresult>0</ns:firstresult>\n\t\t</d:limit>\n\t</d:basicsearch>\n</d:searchrequest>`;\n};\nconst davParsePermissions = function(permString = \"\") {\n let permissions = Permission.NONE;\n if (!permString) {\n return permissions;\n }\n if (permString.includes(\"C\") || permString.includes(\"K\")) {\n permissions |= Permission.CREATE;\n }\n if (permString.includes(\"G\")) {\n permissions |= Permission.READ;\n }\n if (permString.includes(\"W\") || permString.includes(\"N\") || permString.includes(\"V\")) {\n permissions |= Permission.UPDATE;\n }\n if (permString.includes(\"D\")) {\n permissions |= Permission.DELETE;\n }\n if (permString.includes(\"R\")) {\n permissions |= Permission.SHARE;\n }\n return permissions;\n};\nvar FileType = /* @__PURE__ */ ((FileType2) => {\n FileType2[\"Folder\"] = \"folder\";\n FileType2[\"File\"] = \"file\";\n return FileType2;\n})(FileType || {});\nconst isDavRessource = function(source, davService) {\n return source.match(davService) !== null;\n};\nconst validateData = (data, davService) => {\n if (data.id && typeof data.id !== \"number\") {\n throw new Error(\"Invalid id type of value\");\n }\n if (!data.source) {\n throw new Error(\"Missing mandatory source\");\n }\n try {\n new URL(data.source);\n } catch (e) {\n throw new Error(\"Invalid source format, source must be a valid URL\");\n }\n if (!data.source.startsWith(\"http\")) {\n throw new Error(\"Invalid source format, only http(s) is supported\");\n }\n if (data.displayname && typeof data.displayname !== \"string\") {\n throw new Error(\"Invalid displayname type\");\n }\n if (data.mtime && !(data.mtime instanceof Date)) {\n throw new Error(\"Invalid mtime type\");\n }\n if (data.crtime && !(data.crtime instanceof Date)) {\n throw new Error(\"Invalid crtime type\");\n }\n if (!data.mime || typeof data.mime !== \"string\" || !data.mime.match(/^[-\\w.]+\\/[-+\\w.]+$/gi)) {\n throw new Error(\"Missing or invalid mandatory mime\");\n }\n if (\"size\" in data && typeof data.size !== \"number\" && data.size !== void 0) {\n throw new Error(\"Invalid size type\");\n }\n if (\"permissions\" in data && data.permissions !== void 0 && !(typeof data.permissions === \"number\" && data.permissions >= Permission.NONE && data.permissions <= Permission.ALL)) {\n throw new Error(\"Invalid permissions\");\n }\n if (data.owner && data.owner !== null && typeof data.owner !== \"string\") {\n throw new Error(\"Invalid owner type\");\n }\n if (data.attributes && typeof data.attributes !== \"object\") {\n throw new Error(\"Invalid attributes type\");\n }\n if (data.root && typeof data.root !== \"string\") {\n throw new Error(\"Invalid root type\");\n }\n if (data.root && !data.root.startsWith(\"/\")) {\n throw new Error(\"Root must start with a leading slash\");\n }\n if (data.root && !data.source.includes(data.root)) {\n throw new Error(\"Root must be part of the source\");\n }\n if (data.root && isDavRessource(data.source, davService)) {\n const service = data.source.match(davService)[0];\n if (!data.source.includes(join(service, data.root))) {\n throw new Error(\"The root must be relative to the service. e.g /files/emma\");\n }\n }\n if (data.status && !Object.values(NodeStatus).includes(data.status)) {\n throw new Error(\"Status must be a valid NodeStatus\");\n }\n};\nvar NodeStatus = /* @__PURE__ */ ((NodeStatus2) => {\n NodeStatus2[\"NEW\"] = \"new\";\n NodeStatus2[\"FAILED\"] = \"failed\";\n NodeStatus2[\"LOADING\"] = \"loading\";\n NodeStatus2[\"LOCKED\"] = \"locked\";\n return NodeStatus2;\n})(NodeStatus || {});\nclass Node {\n _data;\n _attributes;\n _knownDavService = /(remote|public)\\.php\\/(web)?dav/i;\n readonlyAttributes = Object.entries(Object.getOwnPropertyDescriptors(Node.prototype)).filter((e) => typeof e[1].get === \"function\" && e[0] !== \"__proto__\").map((e) => e[0]);\n handler = {\n set: (target, prop, value) => {\n if (this.readonlyAttributes.includes(prop)) {\n return false;\n }\n return Reflect.set(target, prop, value);\n },\n deleteProperty: (target, prop) => {\n if (this.readonlyAttributes.includes(prop)) {\n return false;\n }\n return Reflect.deleteProperty(target, prop);\n },\n // TODO: This is deprecated and only needed for files v3\n get: (target, prop, receiver) => {\n if (this.readonlyAttributes.includes(prop)) {\n logger.warn(`Accessing \"Node.attributes.${prop}\" is deprecated, access it directly on the Node instance.`);\n return Reflect.get(this, prop);\n }\n return Reflect.get(target, prop, receiver);\n }\n };\n constructor(data, davService) {\n validateData(data, davService || this._knownDavService);\n this._data = {\n // TODO: Remove with next major release, this is just for compatibility\n displayname: data.attributes?.displayname,\n ...data,\n attributes: {}\n };\n this._attributes = new Proxy(this._data.attributes, this.handler);\n this.update(data.attributes ?? {});\n if (davService) {\n this._knownDavService = davService;\n }\n }\n /**\n * Get the source url to this object\n * There is no setter as the source is not meant to be changed manually.\n * You can use the rename or move method to change the source.\n */\n get source() {\n return this._data.source.replace(/\\/$/i, \"\");\n }\n /**\n * Get the encoded source url to this object for requests purposes\n */\n get encodedSource() {\n const { origin } = new URL(this.source);\n return origin + encodePath(this.source.slice(origin.length));\n }\n /**\n * Get this object name\n * There is no setter as the source is not meant to be changed manually.\n * You can use the rename or move method to change the source.\n */\n get basename() {\n return basename(this.source);\n }\n /**\n * The nodes displayname\n * By default the display name and the `basename` are identical,\n * but it is possible to have a different name. This happens\n * on the files app for example for shared folders.\n */\n get displayname() {\n return this._data.displayname || this.basename;\n }\n /**\n * Set the displayname\n */\n set displayname(displayname) {\n this._data.displayname = displayname;\n }\n /**\n * Get this object's extension\n * There is no setter as the source is not meant to be changed manually.\n * You can use the rename or move method to change the source.\n */\n get extension() {\n return extname(this.source);\n }\n /**\n * Get the directory path leading to this object\n * Will use the relative path to root if available\n *\n * There is no setter as the source is not meant to be changed manually.\n * You can use the rename or move method to change the source.\n */\n get dirname() {\n if (this.root) {\n let source = this.source;\n if (this.isDavRessource) {\n source = source.split(this._knownDavService).pop();\n }\n const firstMatch = source.indexOf(this.root);\n const root = this.root.replace(/\\/$/, \"\");\n return dirname(source.slice(firstMatch + root.length) || \"/\");\n }\n const url = new URL(this.source);\n return dirname(url.pathname);\n }\n /**\n * Get the file mime\n * There is no setter as the mime is not meant to be changed\n */\n get mime() {\n return this._data.mime;\n }\n /**\n * Get the file modification time\n */\n get mtime() {\n return this._data.mtime;\n }\n /**\n * Set the file modification time\n */\n set mtime(mtime) {\n this._data.mtime = mtime;\n }\n /**\n * Get the file creation time\n * There is no setter as the creation time is not meant to be changed\n */\n get crtime() {\n return this._data.crtime;\n }\n /**\n * Get the file size\n */\n get size() {\n return this._data.size;\n }\n /**\n * Set the file size\n */\n set size(size) {\n this.updateMtime();\n this._data.size = size;\n }\n /**\n * Get the file attribute\n * This contains all additional attributes not provided by the Node class\n */\n get attributes() {\n return this._attributes;\n }\n /**\n * Get the file permissions\n */\n get permissions() {\n if (this.owner === null && !this.isDavRessource) {\n return Permission.READ;\n }\n return this._data.permissions !== void 0 ? this._data.permissions : Permission.NONE;\n }\n /**\n * Set the file permissions\n */\n set permissions(permissions) {\n this.updateMtime();\n this._data.permissions = permissions;\n }\n /**\n * Get the file owner\n * There is no setter as the owner is not meant to be changed\n */\n get owner() {\n if (!this.isDavRessource) {\n return null;\n }\n return this._data.owner;\n }\n /**\n * Is this a dav-related ressource ?\n */\n get isDavRessource() {\n return isDavRessource(this.source, this._knownDavService);\n }\n /**\n * Get the dav root of this object\n * There is no setter as the root is not meant to be changed\n */\n get root() {\n if (this._data.root) {\n return this._data.root.replace(/^(.+)\\/$/, \"$1\");\n }\n if (this.isDavRessource) {\n const root = dirname(this.source);\n return root.split(this._knownDavService).pop() || null;\n }\n return null;\n }\n /**\n * Get the absolute path of this object relative to the root\n */\n get path() {\n if (this.root) {\n let source = this.source;\n if (this.isDavRessource) {\n source = source.split(this._knownDavService).pop();\n }\n const firstMatch = source.indexOf(this.root);\n const root = this.root.replace(/\\/$/, \"\");\n return source.slice(firstMatch + root.length) || \"/\";\n }\n return (this.dirname + \"/\" + this.basename).replace(/\\/\\//g, \"/\");\n }\n /**\n * Get the node id if defined.\n * There is no setter as the fileid is not meant to be changed\n */\n get fileid() {\n return this._data?.id;\n }\n /**\n * Get the node status.\n */\n get status() {\n return this._data?.status;\n }\n /**\n * Set the node status.\n */\n set status(status) {\n this._data.status = status;\n }\n /**\n * Move the node to a new destination\n *\n * @param {string} destination the new source.\n * e.g. https://cloud.domain.com/remote.php/dav/files/emma/Photos/picture.jpg\n */\n move(destination) {\n validateData({ ...this._data, source: destination }, this._knownDavService);\n const oldBasename = this.basename;\n this._data.source = destination;\n if (this.displayname === oldBasename && this.basename !== oldBasename) {\n this.displayname = this.basename;\n }\n this.updateMtime();\n }\n /**\n * Rename the node\n * This aliases the move method for easier usage\n *\n * @param basename The new name of the node\n */\n rename(basename2) {\n if (basename2.includes(\"/\")) {\n throw new Error(\"Invalid basename\");\n }\n this.move(dirname(this.source) + \"/\" + basename2);\n }\n /**\n * Update the mtime if exists\n */\n updateMtime() {\n if (this._data.mtime) {\n this._data.mtime = /* @__PURE__ */ new Date();\n }\n }\n /**\n * Update the attributes of the node\n * Warning, updating attributes will NOT automatically update the mtime.\n *\n * @param attributes The new attributes to update on the Node attributes\n */\n update(attributes) {\n for (const [name, value] of Object.entries(attributes)) {\n try {\n if (value === void 0) {\n delete this.attributes[name];\n } else {\n this.attributes[name] = value;\n }\n } catch (e) {\n if (e instanceof TypeError) {\n continue;\n }\n throw e;\n }\n }\n }\n}\nclass File extends Node {\n get type() {\n return FileType.File;\n }\n}\nclass Folder extends Node {\n constructor(data) {\n super({\n ...data,\n mime: \"httpd/unix-directory\"\n });\n }\n get type() {\n return FileType.Folder;\n }\n get extension() {\n return null;\n }\n get mime() {\n return \"httpd/unix-directory\";\n }\n}\nfunction davGetRootPath() {\n if (isPublicShare()) {\n return `/files/${getSharingToken()}`;\n }\n return `/files/${getCurrentUser()?.uid}`;\n}\nconst davRootPath = davGetRootPath();\nfunction davGetRemoteURL() {\n const url = generateRemoteUrl(\"dav\");\n if (isPublicShare()) {\n return url.replace(\"remote.php\", \"public.php\");\n }\n return url;\n}\nconst davRemoteURL = davGetRemoteURL();\nconst davGetClient = function(remoteURL = davRemoteURL, headers = {}) {\n const client = createClient(remoteURL, { headers });\n function setHeaders(token) {\n client.setHeaders({\n ...headers,\n // Add this so the server knows it is an request from the browser\n \"X-Requested-With\": \"XMLHttpRequest\",\n // Inject user auth\n requesttoken: token ?? \"\"\n });\n }\n onRequestTokenUpdate(setHeaders);\n setHeaders(getRequestToken());\n const patcher = getPatcher();\n patcher.patch(\"fetch\", (url, options) => {\n const headers2 = options.headers;\n if (headers2?.method) {\n options.method = headers2.method;\n delete headers2.method;\n }\n return fetch(url, options);\n });\n return client;\n};\nconst getFavoriteNodes = (davClient, path = \"/\", davRoot = davRootPath) => {\n const controller = new AbortController();\n return new CancelablePromise(async (resolve, reject, onCancel) => {\n onCancel(() => controller.abort());\n try {\n const contentsResponse = await davClient.getDirectoryContents(`${davRoot}${path}`, {\n signal: controller.signal,\n details: true,\n data: davGetFavoritesReport(),\n headers: {\n // see davGetClient for patched webdav client\n method: \"REPORT\"\n },\n includeSelf: true\n });\n const nodes = contentsResponse.data.filter((node) => node.filename !== path).map((result) => davResultToNode(result, davRoot));\n resolve(nodes);\n } catch (error) {\n reject(error);\n }\n });\n};\nconst davResultToNode = function(node, filesRoot = davRootPath, remoteURL = davRemoteURL) {\n let userId = getCurrentUser()?.uid;\n if (isPublicShare()) {\n userId = userId ?? \"anonymous\";\n } else if (!userId) {\n throw new Error(\"No user id found\");\n }\n const props = node.props;\n const permissions = davParsePermissions(props?.permissions);\n const owner = String(props?.[\"owner-id\"] || userId);\n const id = props.fileid || 0;\n const nodeData = {\n id,\n source: `${remoteURL}${node.filename}`,\n mtime: new Date(Date.parse(node.lastmod)),\n mime: node.mime || \"application/octet-stream\",\n // Manually cast to work around for https://github.com/perry-mitchell/webdav-client/pull/380\n displayname: props.displayname !== void 0 ? String(props.displayname) : void 0,\n size: props?.size || Number.parseInt(props.getcontentlength || \"0\"),\n // The fileid is set to -1 for failed requests\n status: id < 0 ? NodeStatus.FAILED : void 0,\n permissions,\n owner,\n root: filesRoot,\n attributes: {\n ...node,\n ...props,\n hasPreview: props?.[\"has-preview\"]\n }\n };\n delete nodeData.attributes?.props;\n return node.type === \"file\" ? new File(nodeData) : new Folder(nodeData);\n};\nvar InvalidFilenameErrorReason = /* @__PURE__ */ ((InvalidFilenameErrorReason2) => {\n InvalidFilenameErrorReason2[\"ReservedName\"] = \"reserved name\";\n InvalidFilenameErrorReason2[\"Character\"] = \"character\";\n InvalidFilenameErrorReason2[\"Extension\"] = \"extension\";\n return InvalidFilenameErrorReason2;\n})(InvalidFilenameErrorReason || {});\nclass InvalidFilenameError extends Error {\n constructor(options) {\n super(`Invalid ${options.reason} '${options.segment}' in filename '${options.filename}'`, { cause: options });\n }\n /**\n * The filename that was validated\n */\n get filename() {\n return this.cause.filename;\n }\n /**\n * Reason why the validation failed\n */\n get reason() {\n return this.cause.reason;\n }\n /**\n * Part of the filename that caused this error\n */\n get segment() {\n return this.cause.segment;\n }\n}\nfunction validateFilename(filename) {\n const capabilities = getCapabilities().files;\n const forbiddenCharacters = capabilities.forbidden_filename_characters ?? window._oc_config?.forbidden_filenames_characters ?? [\"/\", \"\\\\\"];\n for (const character of forbiddenCharacters) {\n if (filename.includes(character)) {\n throw new InvalidFilenameError({ segment: character, reason: \"character\", filename });\n }\n }\n filename = filename.toLocaleLowerCase();\n const forbiddenFilenames = capabilities.forbidden_filenames ?? [\".htaccess\"];\n if (forbiddenFilenames.includes(filename)) {\n throw new InvalidFilenameError({\n filename,\n segment: filename,\n reason: \"reserved name\"\n /* ReservedName */\n });\n }\n const endOfBasename = filename.indexOf(\".\", 1);\n const basename2 = filename.substring(0, endOfBasename === -1 ? void 0 : endOfBasename);\n const forbiddenFilenameBasenames = capabilities.forbidden_filename_basenames ?? [];\n if (forbiddenFilenameBasenames.includes(basename2)) {\n throw new InvalidFilenameError({\n filename,\n segment: basename2,\n reason: \"reserved name\"\n /* ReservedName */\n });\n }\n const forbiddenFilenameExtensions = capabilities.forbidden_filename_extensions ?? [\".part\", \".filepart\"];\n for (const extension of forbiddenFilenameExtensions) {\n if (filename.length > extension.length && filename.endsWith(extension)) {\n throw new InvalidFilenameError({ segment: extension, reason: \"extension\", filename });\n }\n }\n}\nfunction isFilenameValid(filename) {\n try {\n validateFilename(filename);\n return true;\n } catch (error) {\n if (error instanceof InvalidFilenameError) {\n return false;\n }\n throw error;\n }\n}\nfunction getUniqueName(name, otherNames, options) {\n const opts = {\n suffix: (n) => `(${n})`,\n ignoreFileExtension: false,\n ...options\n };\n let newName = name;\n let i = 1;\n while (otherNames.includes(newName)) {\n const ext = opts.ignoreFileExtension ? \"\" : extname(name);\n const base = basename(name, ext);\n newName = `${base} ${opts.suffix(i++)}${ext}`;\n }\n return newName;\n}\nconst humanList = [\"B\", \"KB\", \"MB\", \"GB\", \"TB\", \"PB\"];\nconst humanListBinary = [\"B\", \"KiB\", \"MiB\", \"GiB\", \"TiB\", \"PiB\"];\nfunction formatFileSize(size, skipSmallSizes = false, binaryPrefixes = false, base1000 = false) {\n binaryPrefixes = binaryPrefixes && !base1000;\n if (typeof size === \"string\") {\n size = Number(size);\n }\n let order = size > 0 ? Math.floor(Math.log(size) / Math.log(base1000 ? 1e3 : 1024)) : 0;\n order = Math.min((binaryPrefixes ? humanListBinary.length : humanList.length) - 1, order);\n const readableFormat = binaryPrefixes ? humanListBinary[order] : humanList[order];\n let relativeSize = (size / Math.pow(base1000 ? 1e3 : 1024, order)).toFixed(1);\n if (skipSmallSizes === true && order === 0) {\n return (relativeSize !== \"0.0\" ? \"< 1 \" : \"0 \") + (binaryPrefixes ? humanListBinary[1] : humanList[1]);\n }\n if (order < 2) {\n relativeSize = parseFloat(relativeSize).toFixed(0);\n } else {\n relativeSize = parseFloat(relativeSize).toLocaleString(getCanonicalLocale());\n }\n return relativeSize + \" \" + readableFormat;\n}\nfunction parseFileSize(value, forceBinary = false) {\n try {\n value = `${value}`.toLocaleLowerCase().replaceAll(/\\s+/g, \"\").replaceAll(\",\", \".\");\n } catch (e) {\n return null;\n }\n const match = value.match(/^([0-9]*(\\.[0-9]*)?)([kmgtp]?)(i?)b?$/);\n if (match === null || match[1] === \".\" || match[1] === \"\") {\n return null;\n }\n const bytesArray = {\n \"\": 0,\n k: 1,\n m: 2,\n g: 3,\n t: 4,\n p: 5,\n e: 6\n };\n const decimalString = `${match[1]}`;\n const base = match[4] === \"i\" || forceBinary ? 1024 : 1e3;\n return Math.round(Number.parseFloat(decimalString) * base ** bytesArray[match[3]]);\n}\nfunction stringify(value) {\n if (value instanceof Date) {\n return value.toISOString();\n }\n return String(value);\n}\nfunction orderBy(collection, identifiers2, orders) {\n identifiers2 = identifiers2 ?? [(value) => value];\n orders = orders ?? [];\n const sorting = identifiers2.map((_, index) => (orders[index] ?? \"asc\") === \"asc\" ? 1 : -1);\n const collator = Intl.Collator(\n [getLanguage(), getCanonicalLocale()],\n {\n // handle 10 as ten and not as one-zero\n numeric: true,\n usage: \"sort\"\n }\n );\n return [...collection].sort((a, b) => {\n for (const [index, identifier] of identifiers2.entries()) {\n const value = collator.compare(stringify(identifier(a)), stringify(identifier(b)));\n if (value !== 0) {\n return value * sorting[index];\n }\n }\n return 0;\n });\n}\nvar FilesSortingMode = /* @__PURE__ */ ((FilesSortingMode2) => {\n FilesSortingMode2[\"Name\"] = \"basename\";\n FilesSortingMode2[\"Modified\"] = \"mtime\";\n FilesSortingMode2[\"Size\"] = \"size\";\n return FilesSortingMode2;\n})(FilesSortingMode || {});\nfunction sortNodes(nodes, options = {}) {\n const sortingOptions = {\n // Default to sort by name\n sortingMode: \"basename\",\n // Default to sort ascending\n sortingOrder: \"asc\",\n ...options\n };\n const basename2 = (name) => name.lastIndexOf(\".\") > 0 ? name.slice(0, name.lastIndexOf(\".\")) : name;\n const identifiers2 = [\n // 1: Sort favorites first if enabled\n ...sortingOptions.sortFavoritesFirst ? [(v) => v.attributes?.favorite !== 1] : [],\n // 2: Sort folders first if sorting by name\n ...sortingOptions.sortFoldersFirst ? [(v) => v.type !== \"folder\"] : [],\n // 3: Use sorting mode if NOT basename (to be able to use display name too)\n ...sortingOptions.sortingMode !== \"basename\" ? [(v) => v[sortingOptions.sortingMode]] : [],\n // 4: Use display name if available, fallback to name\n (v) => basename2(v.attributes?.displayname || v.basename),\n // 5: Finally, use basename if all previous sorting methods failed\n (v) => v.basename\n ];\n const orders = [\n // (for 1): always sort favorites before normal files\n ...sortingOptions.sortFavoritesFirst ? [\"asc\"] : [],\n // (for 2): always sort folders before files\n ...sortingOptions.sortFoldersFirst ? [\"asc\"] : [],\n // (for 3): Reverse if sorting by mtime as mtime higher means edited more recent -> lower\n ...sortingOptions.sortingMode === \"mtime\" ? [sortingOptions.sortingOrder === \"asc\" ? \"desc\" : \"asc\"] : [],\n // (also for 3 so make sure not to conflict with 2 and 3)\n ...sortingOptions.sortingMode !== \"mtime\" && sortingOptions.sortingMode !== \"basename\" ? [sortingOptions.sortingOrder] : [],\n // for 4: use configured sorting direction\n sortingOptions.sortingOrder,\n // for 5: use configured sorting direction\n sortingOptions.sortingOrder\n ];\n return orderBy(nodes, identifiers2, orders);\n}\nclass Navigation extends TypedEventTarget {\n _views = [];\n _currentView = null;\n /**\n * Register a new view on the navigation\n * @param view The view to register\n * @throws `Error` is thrown if a view with the same id is already registered\n */\n register(view) {\n if (this._views.find((search) => search.id === view.id)) {\n throw new Error(`View id ${view.id} is already registered`);\n }\n this._views.push(view);\n this.dispatchTypedEvent(\"update\", new CustomEvent(\"update\"));\n }\n /**\n * Remove a registered view\n * @param id The id of the view to remove\n */\n remove(id) {\n const index = this._views.findIndex((view) => view.id === id);\n if (index !== -1) {\n this._views.splice(index, 1);\n this.dispatchTypedEvent(\"update\", new CustomEvent(\"update\"));\n }\n }\n /**\n * Set the currently active view\n * @fires UpdateActiveViewEvent\n * @param view New active view\n */\n setActive(view) {\n this._currentView = view;\n const event = new CustomEvent(\"updateActive\", { detail: view });\n this.dispatchTypedEvent(\"updateActive\", event);\n }\n /**\n * The currently active files view\n */\n get active() {\n return this._currentView;\n }\n /**\n * All registered views\n */\n get views() {\n return this._views;\n }\n}\nconst getNavigation = function() {\n if (typeof window._nc_navigation === \"undefined\") {\n window._nc_navigation = new Navigation();\n logger.debug(\"Navigation service initialized\");\n }\n return window._nc_navigation;\n};\nclass Column {\n _column;\n constructor(column) {\n isValidColumn(column);\n this._column = column;\n }\n get id() {\n return this._column.id;\n }\n get title() {\n return this._column.title;\n }\n get render() {\n return this._column.render;\n }\n get sort() {\n return this._column.sort;\n }\n get summary() {\n return this._column.summary;\n }\n}\nconst isValidColumn = function(column) {\n if (!column.id || typeof column.id !== \"string\") {\n throw new Error(\"A column id is required\");\n }\n if (!column.title || typeof column.title !== \"string\") {\n throw new Error(\"A column title is required\");\n }\n if (!column.render || typeof column.render !== \"function\") {\n throw new Error(\"A render function is required\");\n }\n if (column.sort && typeof column.sort !== \"function\") {\n throw new Error(\"Column sortFunction must be a function\");\n }\n if (column.summary && typeof column.summary !== \"function\") {\n throw new Error(\"Column summary must be a function\");\n }\n return true;\n};\nfunction getDefaultExportFromCjs(x) {\n return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, \"default\") ? x[\"default\"] : x;\n}\nvar validator$2 = {};\nvar util$3 = {};\n(function(exports) {\n const nameStartChar = \":A-Za-z_\\\\u00C0-\\\\u00D6\\\\u00D8-\\\\u00F6\\\\u00F8-\\\\u02FF\\\\u0370-\\\\u037D\\\\u037F-\\\\u1FFF\\\\u200C-\\\\u200D\\\\u2070-\\\\u218F\\\\u2C00-\\\\u2FEF\\\\u3001-\\\\uD7FF\\\\uF900-\\\\uFDCF\\\\uFDF0-\\\\uFFFD\";\n const nameChar = nameStartChar + \"\\\\-.\\\\d\\\\u00B7\\\\u0300-\\\\u036F\\\\u203F-\\\\u2040\";\n const nameRegexp = \"[\" + nameStartChar + \"][\" + nameChar + \"]*\";\n const regexName = new RegExp(\"^\" + nameRegexp + \"$\");\n const getAllMatches = function(string, regex) {\n const matches = [];\n let match = regex.exec(string);\n while (match) {\n const allmatches = [];\n allmatches.startIndex = regex.lastIndex - match[0].length;\n const len = match.length;\n for (let index = 0; index < len; index++) {\n allmatches.push(match[index]);\n }\n matches.push(allmatches);\n match = regex.exec(string);\n }\n return matches;\n };\n const isName = function(string) {\n const match = regexName.exec(string);\n return !(match === null || typeof match === \"undefined\");\n };\n exports.isExist = function(v) {\n return typeof v !== \"undefined\";\n };\n exports.isEmptyObject = function(obj) {\n return Object.keys(obj).length === 0;\n };\n exports.merge = function(target, a, arrayMode) {\n if (a) {\n const keys = Object.keys(a);\n const len = keys.length;\n for (let i = 0; i < len; i++) {\n if (arrayMode === \"strict\") {\n target[keys[i]] = [a[keys[i]]];\n } else {\n target[keys[i]] = a[keys[i]];\n }\n }\n }\n };\n exports.getValue = function(v) {\n if (exports.isExist(v)) {\n return v;\n } else {\n return \"\";\n }\n };\n exports.isName = isName;\n exports.getAllMatches = getAllMatches;\n exports.nameRegexp = nameRegexp;\n})(util$3);\nconst util$2 = util$3;\nconst defaultOptions$2 = {\n allowBooleanAttributes: false,\n //A tag can have attributes without any value\n unpairedTags: []\n};\nvalidator$2.validate = function(xmlData, options) {\n options = Object.assign({}, defaultOptions$2, options);\n const tags = [];\n let tagFound = false;\n let reachedRoot = false;\n if (xmlData[0] === \"\\uFEFF\") {\n xmlData = xmlData.substr(1);\n }\n for (let i = 0; i < xmlData.length; i++) {\n if (xmlData[i] === \"<\" && xmlData[i + 1] === \"?\") {\n i += 2;\n i = readPI(xmlData, i);\n if (i.err) return i;\n } else if (xmlData[i] === \"<\") {\n let tagStartPos = i;\n i++;\n if (xmlData[i] === \"!\") {\n i = readCommentAndCDATA(xmlData, i);\n continue;\n } else {\n let closingTag = false;\n if (xmlData[i] === \"/\") {\n closingTag = true;\n i++;\n }\n let tagName = \"\";\n for (; i < xmlData.length && xmlData[i] !== \">\" && xmlData[i] !== \" \" && xmlData[i] !== \"\t\" && xmlData[i] !== \"\\n\" && xmlData[i] !== \"\\r\"; i++) {\n tagName += xmlData[i];\n }\n tagName = tagName.trim();\n if (tagName[tagName.length - 1] === \"/\") {\n tagName = tagName.substring(0, tagName.length - 1);\n i--;\n }\n if (!validateTagName(tagName)) {\n let msg;\n if (tagName.trim().length === 0) {\n msg = \"Invalid space after '<'.\";\n } else {\n msg = \"Tag '\" + tagName + \"' is an invalid name.\";\n }\n return getErrorObject(\"InvalidTag\", msg, getLineNumberForPosition(xmlData, i));\n }\n const result = readAttributeStr(xmlData, i);\n if (result === false) {\n return getErrorObject(\"InvalidAttr\", \"Attributes for '\" + tagName + \"' have open quote.\", getLineNumberForPosition(xmlData, i));\n }\n let attrStr = result.value;\n i = result.index;\n if (attrStr[attrStr.length - 1] === \"/\") {\n const attrStrStart = i - attrStr.length;\n attrStr = attrStr.substring(0, attrStr.length - 1);\n const isValid = validateAttributeString(attrStr, options);\n if (isValid === true) {\n tagFound = true;\n } else {\n return getErrorObject(isValid.err.code, isValid.err.msg, getLineNumberForPosition(xmlData, attrStrStart + isValid.err.line));\n }\n } else if (closingTag) {\n if (!result.tagClosed) {\n return getErrorObject(\"InvalidTag\", \"Closing tag '\" + tagName + \"' doesn't have proper closing.\", getLineNumberForPosition(xmlData, i));\n } else if (attrStr.trim().length > 0) {\n return getErrorObject(\"InvalidTag\", \"Closing tag '\" + tagName + \"' can't have attributes or invalid starting.\", getLineNumberForPosition(xmlData, tagStartPos));\n } else if (tags.length === 0) {\n return getErrorObject(\"InvalidTag\", \"Closing tag '\" + tagName + \"' has not been opened.\", getLineNumberForPosition(xmlData, tagStartPos));\n } else {\n const otg = tags.pop();\n if (tagName !== otg.tagName) {\n let openPos = getLineNumberForPosition(xmlData, otg.tagStartPos);\n return getErrorObject(\n \"InvalidTag\",\n \"Expected closing tag '\" + otg.tagName + \"' (opened in line \" + openPos.line + \", col \" + openPos.col + \") instead of closing tag '\" + tagName + \"'.\",\n getLineNumberForPosition(xmlData, tagStartPos)\n );\n }\n if (tags.length == 0) {\n reachedRoot = true;\n }\n }\n } else {\n const isValid = validateAttributeString(attrStr, options);\n if (isValid !== true) {\n return getErrorObject(isValid.err.code, isValid.err.msg, getLineNumberForPosition(xmlData, i - attrStr.length + isValid.err.line));\n }\n if (reachedRoot === true) {\n return getErrorObject(\"InvalidXml\", \"Multiple possible root nodes found.\", getLineNumberForPosition(xmlData, i));\n } else if (options.unpairedTags.indexOf(tagName) !== -1) ;\n else {\n tags.push({ tagName, tagStartPos });\n }\n tagFound = true;\n }\n for (i++; i < xmlData.length; i++) {\n if (xmlData[i] === \"<\") {\n if (xmlData[i + 1] === \"!\") {\n i++;\n i = readCommentAndCDATA(xmlData, i);\n continue;\n } else if (xmlData[i + 1] === \"?\") {\n i = readPI(xmlData, ++i);\n if (i.err) return i;\n } else {\n break;\n }\n } else if (xmlData[i] === \"&\") {\n const afterAmp = validateAmpersand(xmlData, i);\n if (afterAmp == -1)\n return getErrorObject(\"InvalidChar\", \"char '&' is not expected.\", getLineNumberForPosition(xmlData, i));\n i = afterAmp;\n } else {\n if (reachedRoot === true && !isWhiteSpace(xmlData[i])) {\n return getErrorObject(\"InvalidXml\", \"Extra text at the end\", getLineNumberForPosition(xmlData, i));\n }\n }\n }\n if (xmlData[i] === \"<\") {\n i--;\n }\n }\n } else {\n if (isWhiteSpace(xmlData[i])) {\n continue;\n }\n return getErrorObject(\"InvalidChar\", \"char '\" + xmlData[i] + \"' is not expected.\", getLineNumberForPosition(xmlData, i));\n }\n }\n if (!tagFound) {\n return getErrorObject(\"InvalidXml\", \"Start tag expected.\", 1);\n } else if (tags.length == 1) {\n return getErrorObject(\"InvalidTag\", \"Unclosed tag '\" + tags[0].tagName + \"'.\", getLineNumberForPosition(xmlData, tags[0].tagStartPos));\n } else if (tags.length > 0) {\n return getErrorObject(\"InvalidXml\", \"Invalid '\" + JSON.stringify(tags.map((t2) => t2.tagName), null, 4).replace(/\\r?\\n/g, \"\") + \"' found.\", { line: 1, col: 1 });\n }\n return true;\n};\nfunction isWhiteSpace(char) {\n return char === \" \" || char === \"\t\" || char === \"\\n\" || char === \"\\r\";\n}\nfunction readPI(xmlData, i) {\n const start = i;\n for (; i < xmlData.length; i++) {\n if (xmlData[i] == \"?\" || xmlData[i] == \" \") {\n const tagname = xmlData.substr(start, i - start);\n if (i > 5 && tagname === \"xml\") {\n return getErrorObject(\"InvalidXml\", \"XML declaration allowed only at the start of the document.\", getLineNumberForPosition(xmlData, i));\n } else if (xmlData[i] == \"?\" && xmlData[i + 1] == \">\") {\n i++;\n break;\n } else {\n continue;\n }\n }\n }\n return i;\n}\nfunction readCommentAndCDATA(xmlData, i) {\n if (xmlData.length > i + 5 && xmlData[i + 1] === \"-\" && xmlData[i + 2] === \"-\") {\n for (i += 3; i < xmlData.length; i++) {\n if (xmlData[i] === \"-\" && xmlData[i + 1] === \"-\" && xmlData[i + 2] === \">\") {\n i += 2;\n break;\n }\n }\n } else if (xmlData.length > i + 8 && xmlData[i + 1] === \"D\" && xmlData[i + 2] === \"O\" && xmlData[i + 3] === \"C\" && xmlData[i + 4] === \"T\" && xmlData[i + 5] === \"Y\" && xmlData[i + 6] === \"P\" && xmlData[i + 7] === \"E\") {\n let angleBracketsCount = 1;\n for (i += 8; i < xmlData.length; i++) {\n if (xmlData[i] === \"<\") {\n angleBracketsCount++;\n } else if (xmlData[i] === \">\") {\n angleBracketsCount--;\n if (angleBracketsCount === 0) {\n break;\n }\n }\n }\n } else if (xmlData.length > i + 9 && xmlData[i + 1] === \"[\" && xmlData[i + 2] === \"C\" && xmlData[i + 3] === \"D\" && xmlData[i + 4] === \"A\" && xmlData[i + 5] === \"T\" && xmlData[i + 6] === \"A\" && xmlData[i + 7] === \"[\") {\n for (i += 8; i < xmlData.length; i++) {\n if (xmlData[i] === \"]\" && xmlData[i + 1] === \"]\" && xmlData[i + 2] === \">\") {\n i += 2;\n break;\n }\n }\n }\n return i;\n}\nconst doubleQuote = '\"';\nconst singleQuote = \"'\";\nfunction readAttributeStr(xmlData, i) {\n let attrStr = \"\";\n let startChar = \"\";\n let tagClosed = false;\n for (; i < xmlData.length; i++) {\n if (xmlData[i] === doubleQuote || xmlData[i] === singleQuote) {\n if (startChar === \"\") {\n startChar = xmlData[i];\n } else if (startChar !== xmlData[i]) ;\n else {\n startChar = \"\";\n }\n } else if (xmlData[i] === \">\") {\n if (startChar === \"\") {\n tagClosed = true;\n break;\n }\n }\n attrStr += xmlData[i];\n }\n if (startChar !== \"\") {\n return false;\n }\n return {\n value: attrStr,\n index: i,\n tagClosed\n };\n}\nconst validAttrStrRegxp = new RegExp(`(\\\\s*)([^\\\\s=]+)(\\\\s*=)?(\\\\s*(['\"])(([\\\\s\\\\S])*?)\\\\5)?`, \"g\");\nfunction validateAttributeString(attrStr, options) {\n const matches = util$2.getAllMatches(attrStr, validAttrStrRegxp);\n const attrNames = {};\n for (let i = 0; i < matches.length; i++) {\n if (matches[i][1].length === 0) {\n return getErrorObject(\"InvalidAttr\", \"Attribute '\" + matches[i][2] + \"' has no space in starting.\", getPositionFromMatch(matches[i]));\n } else if (matches[i][3] !== void 0 && matches[i][4] === void 0) {\n return getErrorObject(\"InvalidAttr\", \"Attribute '\" + matches[i][2] + \"' is without value.\", getPositionFromMatch(matches[i]));\n } else if (matches[i][3] === void 0 && !options.allowBooleanAttributes) {\n return getErrorObject(\"InvalidAttr\", \"boolean attribute '\" + matches[i][2] + \"' is not allowed.\", getPositionFromMatch(matches[i]));\n }\n const attrName = matches[i][2];\n if (!validateAttrName(attrName)) {\n return getErrorObject(\"InvalidAttr\", \"Attribute '\" + attrName + \"' is an invalid name.\", getPositionFromMatch(matches[i]));\n }\n if (!attrNames.hasOwnProperty(attrName)) {\n attrNames[attrName] = 1;\n } else {\n return getErrorObject(\"InvalidAttr\", \"Attribute '\" + attrName + \"' is repeated.\", getPositionFromMatch(matches[i]));\n }\n }\n return true;\n}\nfunction validateNumberAmpersand(xmlData, i) {\n let re2 = /\\d/;\n if (xmlData[i] === \"x\") {\n i++;\n re2 = /[\\da-fA-F]/;\n }\n for (; i < xmlData.length; i++) {\n if (xmlData[i] === \";\")\n return i;\n if (!xmlData[i].match(re2))\n break;\n }\n return -1;\n}\nfunction validateAmpersand(xmlData, i) {\n i++;\n if (xmlData[i] === \";\")\n return -1;\n if (xmlData[i] === \"#\") {\n i++;\n return validateNumberAmpersand(xmlData, i);\n }\n let count = 0;\n for (; i < xmlData.length; i++, count++) {\n if (xmlData[i].match(/\\w/) && count < 20)\n continue;\n if (xmlData[i] === \";\")\n break;\n return -1;\n }\n return i;\n}\nfunction getErrorObject(code, message, lineNumber) {\n return {\n err: {\n code,\n msg: message,\n line: lineNumber.line || lineNumber,\n col: lineNumber.col\n }\n };\n}\nfunction validateAttrName(attrName) {\n return util$2.isName(attrName);\n}\nfunction validateTagName(tagname) {\n return util$2.isName(tagname);\n}\nfunction getLineNumberForPosition(xmlData, index) {\n const lines = xmlData.substring(0, index).split(/\\r?\\n/);\n return {\n line: lines.length,\n // column number is last line's length + 1, because column numbering starts at 1:\n col: lines[lines.length - 1].length + 1\n };\n}\nfunction getPositionFromMatch(match) {\n return match.startIndex + match[1].length;\n}\nvar OptionsBuilder = {};\nconst defaultOptions$1 = {\n preserveOrder: false,\n attributeNamePrefix: \"@_\",\n attributesGroupName: false,\n textNodeName: \"#text\",\n ignoreAttributes: true,\n removeNSPrefix: false,\n // remove NS from tag name or attribute name if true\n allowBooleanAttributes: false,\n //a tag can have attributes without any value\n //ignoreRootElement : false,\n parseTagValue: true,\n parseAttributeValue: false,\n trimValues: true,\n //Trim string values of tag and attributes\n cdataPropName: false,\n numberParseOptions: {\n hex: true,\n leadingZeros: true,\n eNotation: true\n },\n tagValueProcessor: function(tagName, val2) {\n return val2;\n },\n attributeValueProcessor: function(attrName, val2) {\n return val2;\n },\n stopNodes: [],\n //nested tags will not be parsed even for errors\n alwaysCreateTextNode: false,\n isArray: () => false,\n commentPropName: false,\n unpairedTags: [],\n processEntities: true,\n htmlEntities: false,\n ignoreDeclaration: false,\n ignorePiTags: false,\n transformTagName: false,\n transformAttributeName: false,\n updateTag: function(tagName, jPath, attrs) {\n return tagName;\n }\n // skipEmptyListItem: false\n};\nconst buildOptions$1 = function(options) {\n return Object.assign({}, defaultOptions$1, options);\n};\nOptionsBuilder.buildOptions = buildOptions$1;\nOptionsBuilder.defaultOptions = defaultOptions$1;\nclass XmlNode {\n constructor(tagname) {\n this.tagname = tagname;\n this.child = [];\n this[\":@\"] = {};\n }\n add(key, val2) {\n if (key === \"__proto__\") key = \"#__proto__\";\n this.child.push({ [key]: val2 });\n }\n addChild(node) {\n if (node.tagname === \"__proto__\") node.tagname = \"#__proto__\";\n if (node[\":@\"] && Object.keys(node[\":@\"]).length > 0) {\n this.child.push({ [node.tagname]: node.child, [\":@\"]: node[\":@\"] });\n } else {\n this.child.push({ [node.tagname]: node.child });\n }\n }\n}\nvar xmlNode$1 = XmlNode;\nconst util$1 = util$3;\nfunction readDocType$1(xmlData, i) {\n const entities = {};\n if (xmlData[i + 3] === \"O\" && xmlData[i + 4] === \"C\" && xmlData[i + 5] === \"T\" && xmlData[i + 6] === \"Y\" && xmlData[i + 7] === \"P\" && xmlData[i + 8] === \"E\") {\n i = i + 9;\n let angleBracketsCount = 1;\n let hasBody = false, comment = false;\n let exp = \"\";\n for (; i < xmlData.length; i++) {\n if (xmlData[i] === \"<\" && !comment) {\n if (hasBody && isEntity(xmlData, i)) {\n i += 7;\n [entityName, val, i] = readEntityExp(xmlData, i + 1);\n if (val.indexOf(\"&\") === -1)\n entities[validateEntityName(entityName)] = {\n regx: RegExp(`&${entityName};`, \"g\"),\n val\n };\n } else if (hasBody && isElement(xmlData, i)) i += 8;\n else if (hasBody && isAttlist(xmlData, i)) i += 8;\n else if (hasBody && isNotation(xmlData, i)) i += 9;\n else if (isComment) comment = true;\n else throw new Error(\"Invalid DOCTYPE\");\n angleBracketsCount++;\n exp = \"\";\n } else if (xmlData[i] === \">\") {\n if (comment) {\n if (xmlData[i - 1] === \"-\" && xmlData[i - 2] === \"-\") {\n comment = false;\n angleBracketsCount--;\n }\n } else {\n angleBracketsCount--;\n }\n if (angleBracketsCount === 0) {\n break;\n }\n } else if (xmlData[i] === \"[\") {\n hasBody = true;\n } else {\n exp += xmlData[i];\n }\n }\n if (angleBracketsCount !== 0) {\n throw new Error(`Unclosed DOCTYPE`);\n }\n } else {\n throw new Error(`Invalid Tag instead of DOCTYPE`);\n }\n return { entities, i };\n}\nfunction readEntityExp(xmlData, i) {\n let entityName2 = \"\";\n for (; i < xmlData.length && (xmlData[i] !== \"'\" && xmlData[i] !== '\"'); i++) {\n entityName2 += xmlData[i];\n }\n entityName2 = entityName2.trim();\n if (entityName2.indexOf(\" \") !== -1) throw new Error(\"External entites are not supported\");\n const startChar = xmlData[i++];\n let val2 = \"\";\n for (; i < xmlData.length && xmlData[i] !== startChar; i++) {\n val2 += xmlData[i];\n }\n return [entityName2, val2, i];\n}\nfunction isComment(xmlData, i) {\n if (xmlData[i + 1] === \"!\" && xmlData[i + 2] === \"-\" && xmlData[i + 3] === \"-\") return true;\n return false;\n}\nfunction isEntity(xmlData, i) {\n if (xmlData[i + 1] === \"!\" && xmlData[i + 2] === \"E\" && xmlData[i + 3] === \"N\" && xmlData[i + 4] === \"T\" && xmlData[i + 5] === \"I\" && xmlData[i + 6] === \"T\" && xmlData[i + 7] === \"Y\") return true;\n return false;\n}\nfunction isElement(xmlData, i) {\n if (xmlData[i + 1] === \"!\" && xmlData[i + 2] === \"E\" && xmlData[i + 3] === \"L\" && xmlData[i + 4] === \"E\" && xmlData[i + 5] === \"M\" && xmlData[i + 6] === \"E\" && xmlData[i + 7] === \"N\" && xmlData[i + 8] === \"T\") return true;\n return false;\n}\nfunction isAttlist(xmlData, i) {\n if (xmlData[i + 1] === \"!\" && xmlData[i + 2] === \"A\" && xmlData[i + 3] === \"T\" && xmlData[i + 4] === \"T\" && xmlData[i + 5] === \"L\" && xmlData[i + 6] === \"I\" && xmlData[i + 7] === \"S\" && xmlData[i + 8] === \"T\") return true;\n return false;\n}\nfunction isNotation(xmlData, i) {\n if (xmlData[i + 1] === \"!\" && xmlData[i + 2] === \"N\" && xmlData[i + 3] === \"O\" && xmlData[i + 4] === \"T\" && xmlData[i + 5] === \"A\" && xmlData[i + 6] === \"T\" && xmlData[i + 7] === \"I\" && xmlData[i + 8] === \"O\" && xmlData[i + 9] === \"N\") return true;\n return false;\n}\nfunction validateEntityName(name) {\n if (util$1.isName(name))\n return name;\n else\n throw new Error(`Invalid entity name ${name}`);\n}\nvar DocTypeReader = readDocType$1;\nconst hexRegex = /^[-+]?0x[a-fA-F0-9]+$/;\nconst numRegex = /^([\\-\\+])?(0*)(\\.[0-9]+([eE]\\-?[0-9]+)?|[0-9]+(\\.[0-9]+([eE]\\-?[0-9]+)?)?)$/;\nif (!Number.parseInt && window.parseInt) {\n Number.parseInt = window.parseInt;\n}\nif (!Number.parseFloat && window.parseFloat) {\n Number.parseFloat = window.parseFloat;\n}\nconst consider = {\n hex: true,\n leadingZeros: true,\n decimalPoint: \".\",\n eNotation: true\n //skipLike: /regex/\n};\nfunction toNumber$1(str, options = {}) {\n options = Object.assign({}, consider, options);\n if (!str || typeof str !== \"string\") return str;\n let trimmedStr = str.trim();\n if (options.skipLike !== void 0 && options.skipLike.test(trimmedStr)) return str;\n else if (options.hex && hexRegex.test(trimmedStr)) {\n return Number.parseInt(trimmedStr, 16);\n } else {\n const match = numRegex.exec(trimmedStr);\n if (match) {\n const sign = match[1];\n const leadingZeros = match[2];\n let numTrimmedByZeros = trimZeros(match[3]);\n const eNotation = match[4] || match[6];\n if (!options.leadingZeros && leadingZeros.length > 0 && sign && trimmedStr[2] !== \".\") return str;\n else if (!options.leadingZeros && leadingZeros.length > 0 && !sign && trimmedStr[1] !== \".\") return str;\n else {\n const num = Number(trimmedStr);\n const numStr = \"\" + num;\n if (numStr.search(/[eE]/) !== -1) {\n if (options.eNotation) return num;\n else return str;\n } else if (eNotation) {\n if (options.eNotation) return num;\n else return str;\n } else if (trimmedStr.indexOf(\".\") !== -1) {\n if (numStr === \"0\" && numTrimmedByZeros === \"\") return num;\n else if (numStr === numTrimmedByZeros) return num;\n else if (sign && numStr === \"-\" + numTrimmedByZeros) return num;\n else return str;\n }\n if (leadingZeros) {\n if (numTrimmedByZeros === numStr) return num;\n else if (sign + numTrimmedByZeros === numStr) return num;\n else return str;\n }\n if (trimmedStr === numStr) return num;\n else if (trimmedStr === sign + numStr) return num;\n return str;\n }\n } else {\n return str;\n }\n }\n}\nfunction trimZeros(numStr) {\n if (numStr && numStr.indexOf(\".\") !== -1) {\n numStr = numStr.replace(/0+$/, \"\");\n if (numStr === \".\") numStr = \"0\";\n else if (numStr[0] === \".\") numStr = \"0\" + numStr;\n else if (numStr[numStr.length - 1] === \".\") numStr = numStr.substr(0, numStr.length - 1);\n return numStr;\n }\n return numStr;\n}\nvar strnum = toNumber$1;\nconst util = util$3;\nconst xmlNode = xmlNode$1;\nconst readDocType = DocTypeReader;\nconst toNumber = strnum;\nlet OrderedObjParser$1 = class OrderedObjParser {\n constructor(options) {\n this.options = options;\n this.currentNode = null;\n this.tagsNodeStack = [];\n this.docTypeEntities = {};\n this.lastEntities = {\n \"apos\": { regex: /&(apos|#39|#x27);/g, val: \"'\" },\n \"gt\": { regex: /&(gt|#62|#x3E);/g, val: \">\" },\n \"lt\": { regex: /&(lt|#60|#x3C);/g, val: \"<\" },\n \"quot\": { regex: /&(quot|#34|#x22);/g, val: '\"' }\n };\n this.ampEntity = { regex: /&(amp|#38|#x26);/g, val: \"&\" };\n this.htmlEntities = {\n \"space\": { regex: /&(nbsp|#160);/g, val: \" \" },\n // \"lt\" : { regex: /&(lt|#60);/g, val: \"<\" },\n // \"gt\" : { regex: /&(gt|#62);/g, val: \">\" },\n // \"amp\" : { regex: /&(amp|#38);/g, val: \"&\" },\n // \"quot\" : { regex: /&(quot|#34);/g, val: \"\\\"\" },\n // \"apos\" : { regex: /&(apos|#39);/g, val: \"'\" },\n \"cent\": { regex: /&(cent|#162);/g, val: \"¢\" },\n \"pound\": { regex: /&(pound|#163);/g, val: \"£\" },\n \"yen\": { regex: /&(yen|#165);/g, val: \"¥\" },\n \"euro\": { regex: /&(euro|#8364);/g, val: \"€\" },\n \"copyright\": { regex: /&(copy|#169);/g, val: \"©\" },\n \"reg\": { regex: /&(reg|#174);/g, val: \"®\" },\n \"inr\": { regex: /&(inr|#8377);/g, val: \"₹\" },\n \"num_dec\": { regex: /&#([0-9]{1,7});/g, val: (_, str) => String.fromCharCode(Number.parseInt(str, 10)) },\n \"num_hex\": { regex: /&#x([0-9a-fA-F]{1,6});/g, val: (_, str) => String.fromCharCode(Number.parseInt(str, 16)) }\n };\n this.addExternalEntities = addExternalEntities;\n this.parseXml = parseXml;\n this.parseTextData = parseTextData;\n this.resolveNameSpace = resolveNameSpace;\n this.buildAttributesMap = buildAttributesMap;\n this.isItStopNode = isItStopNode;\n this.replaceEntitiesValue = replaceEntitiesValue$1;\n this.readStopNodeData = readStopNodeData;\n this.saveTextToParentTag = saveTextToParentTag;\n this.addChild = addChild;\n }\n};\nfunction addExternalEntities(externalEntities) {\n const entKeys = Object.keys(externalEntities);\n for (let i = 0; i < entKeys.length; i++) {\n const ent = entKeys[i];\n this.lastEntities[ent] = {\n regex: new RegExp(\"&\" + ent + \";\", \"g\"),\n val: externalEntities[ent]\n };\n }\n}\nfunction parseTextData(val2, tagName, jPath, dontTrim, hasAttributes, isLeafNode, escapeEntities) {\n if (val2 !== void 0) {\n if (this.options.trimValues && !dontTrim) {\n val2 = val2.trim();\n }\n if (val2.length > 0) {\n if (!escapeEntities) val2 = this.replaceEntitiesValue(val2);\n const newval = this.options.tagValueProcessor(tagName, val2, jPath, hasAttributes, isLeafNode);\n if (newval === null || newval === void 0) {\n return val2;\n } else if (typeof newval !== typeof val2 || newval !== val2) {\n return newval;\n } else if (this.options.trimValues) {\n return parseValue(val2, this.options.parseTagValue, this.options.numberParseOptions);\n } else {\n const trimmedVal = val2.trim();\n if (trimmedVal === val2) {\n return parseValue(val2, this.options.parseTagValue, this.options.numberParseOptions);\n } else {\n return val2;\n }\n }\n }\n }\n}\nfunction resolveNameSpace(tagname) {\n if (this.options.removeNSPrefix) {\n const tags = tagname.split(\":\");\n const prefix = tagname.charAt(0) === \"/\" ? \"/\" : \"\";\n if (tags[0] === \"xmlns\") {\n return \"\";\n }\n if (tags.length === 2) {\n tagname = prefix + tags[1];\n }\n }\n return tagname;\n}\nconst attrsRegx = new RegExp(`([^\\\\s=]+)\\\\s*(=\\\\s*(['\"])([\\\\s\\\\S]*?)\\\\3)?`, \"gm\");\nfunction buildAttributesMap(attrStr, jPath, tagName) {\n if (!this.options.ignoreAttributes && typeof attrStr === \"string\") {\n const matches = util.getAllMatches(attrStr, attrsRegx);\n const len = matches.length;\n const attrs = {};\n for (let i = 0; i < len; i++) {\n const attrName = this.resolveNameSpace(matches[i][1]);\n let oldVal = matches[i][4];\n let aName = this.options.attributeNamePrefix + attrName;\n if (attrName.length) {\n if (this.options.transformAttributeName) {\n aName = this.options.transformAttributeName(aName);\n }\n if (aName === \"__proto__\") aName = \"#__proto__\";\n if (oldVal !== void 0) {\n if (this.options.trimValues) {\n oldVal = oldVal.trim();\n }\n oldVal = this.replaceEntitiesValue(oldVal);\n const newVal = this.options.attributeValueProcessor(attrName, oldVal, jPath);\n if (newVal === null || newVal === void 0) {\n attrs[aName] = oldVal;\n } else if (typeof newVal !== typeof oldVal || newVal !== oldVal) {\n attrs[aName] = newVal;\n } else {\n attrs[aName] = parseValue(\n oldVal,\n this.options.parseAttributeValue,\n this.options.numberParseOptions\n );\n }\n } else if (this.options.allowBooleanAttributes) {\n attrs[aName] = true;\n }\n }\n }\n if (!Object.keys(attrs).length) {\n return;\n }\n if (this.options.attributesGroupName) {\n const attrCollection = {};\n attrCollection[this.options.attributesGroupName] = attrs;\n return attrCollection;\n }\n return attrs;\n }\n}\nconst parseXml = function(xmlData) {\n xmlData = xmlData.replace(/\\r\\n?/g, \"\\n\");\n const xmlObj = new xmlNode(\"!xml\");\n let currentNode = xmlObj;\n let textData = \"\";\n let jPath = \"\";\n for (let i = 0; i < xmlData.length; i++) {\n const ch = xmlData[i];\n if (ch === \"<\") {\n if (xmlData[i + 1] === \"/\") {\n const closeIndex = findClosingIndex(xmlData, \">\", i, \"Closing Tag is not closed.\");\n let tagName = xmlData.substring(i + 2, closeIndex).trim();\n if (this.options.removeNSPrefix) {\n const colonIndex = tagName.indexOf(\":\");\n if (colonIndex !== -1) {\n tagName = tagName.substr(colonIndex + 1);\n }\n }\n if (this.options.transformTagName) {\n tagName = this.options.transformTagName(tagName);\n }\n if (currentNode) {\n textData = this.saveTextToParentTag(textData, currentNode, jPath);\n }\n const lastTagName = jPath.substring(jPath.lastIndexOf(\".\") + 1);\n if (tagName && this.options.unpairedTags.indexOf(tagName) !== -1) {\n throw new Error(`Unpaired tag can not be used as closing tag: </${tagName}>`);\n }\n let propIndex = 0;\n if (lastTagName && this.options.unpairedTags.indexOf(lastTagName) !== -1) {\n propIndex = jPath.lastIndexOf(\".\", jPath.lastIndexOf(\".\") - 1);\n this.tagsNodeStack.pop();\n } else {\n propIndex = jPath.lastIndexOf(\".\");\n }\n jPath = jPath.substring(0, propIndex);\n currentNode = this.tagsNodeStack.pop();\n textData = \"\";\n i = closeIndex;\n } else if (xmlData[i + 1] === \"?\") {\n let tagData = readTagExp(xmlData, i, false, \"?>\");\n if (!tagData) throw new Error(\"Pi Tag is not closed.\");\n textData = this.saveTextToParentTag(textData, currentNode, jPath);\n if (this.options.ignoreDeclaration && tagData.tagName === \"?xml\" || this.options.ignorePiTags) ;\n else {\n const childNode = new xmlNode(tagData.tagName);\n childNode.add(this.options.textNodeName, \"\");\n if (tagData.tagName !== tagData.tagExp && tagData.attrExpPresent) {\n childNode[\":@\"] = this.buildAttributesMap(tagData.tagExp, jPath, tagData.tagName);\n }\n this.addChild(currentNode, childNode, jPath);\n }\n i = tagData.closeIndex + 1;\n } else if (xmlData.substr(i + 1, 3) === \"!--\") {\n const endIndex = findClosingIndex(xmlData, \"-->\", i + 4, \"Comment is not closed.\");\n if (this.options.commentPropName) {\n const comment = xmlData.substring(i + 4, endIndex - 2);\n textData = this.saveTextToParentTag(textData, currentNode, jPath);\n currentNode.add(this.options.commentPropName, [{ [this.options.textNodeName]: comment }]);\n }\n i = endIndex;\n } else if (xmlData.substr(i + 1, 2) === \"!D\") {\n const result = readDocType(xmlData, i);\n this.docTypeEntities = result.entities;\n i = result.i;\n } else if (xmlData.substr(i + 1, 2) === \"![\") {\n const closeIndex = findClosingIndex(xmlData, \"]]>\", i, \"CDATA is not closed.\") - 2;\n const tagExp = xmlData.substring(i + 9, closeIndex);\n textData = this.saveTextToParentTag(textData, currentNode, jPath);\n let val2 = this.parseTextData(tagExp, currentNode.tagname, jPath, true, false, true, true);\n if (val2 == void 0) val2 = \"\";\n if (this.options.cdataPropName) {\n currentNode.add(this.options.cdataPropName, [{ [this.options.textNodeName]: tagExp }]);\n } else {\n currentNode.add(this.options.textNodeName, val2);\n }\n i = closeIndex + 2;\n } else {\n let result = readTagExp(xmlData, i, this.options.removeNSPrefix);\n let tagName = result.tagName;\n const rawTagName = result.rawTagName;\n let tagExp = result.tagExp;\n let attrExpPresent = result.attrExpPresent;\n let closeIndex = result.closeIndex;\n if (this.options.transformTagName) {\n tagName = this.options.transformTagName(tagName);\n }\n if (currentNode && textData) {\n if (currentNode.tagname !== \"!xml\") {\n textData = this.saveTextToParentTag(textData, currentNode, jPath, false);\n }\n }\n const lastTag = currentNode;\n if (lastTag && this.options.unpairedTags.indexOf(lastTag.tagname) !== -1) {\n currentNode = this.tagsNodeStack.pop();\n jPath = jPath.substring(0, jPath.lastIndexOf(\".\"));\n }\n if (tagName !== xmlObj.tagname) {\n jPath += jPath ? \".\" + tagName : tagName;\n }\n if (this.isItStopNode(this.options.stopNodes, jPath, tagName)) {\n let tagContent = \"\";\n if (tagExp.length > 0 && tagExp.lastIndexOf(\"/\") === tagExp.length - 1) {\n if (tagName[tagName.length - 1] === \"/\") {\n tagName = tagName.substr(0, tagName.length - 1);\n jPath = jPath.substr(0, jPath.length - 1);\n tagExp = tagName;\n } else {\n tagExp = tagExp.substr(0, tagExp.length - 1);\n }\n i = result.closeIndex;\n } else if (this.options.unpairedTags.indexOf(tagName) !== -1) {\n i = result.closeIndex;\n } else {\n const result2 = this.readStopNodeData(xmlData, rawTagName, closeIndex + 1);\n if (!result2) throw new Error(`Unexpected end of ${rawTagName}`);\n i = result2.i;\n tagContent = result2.tagContent;\n }\n const childNode = new xmlNode(tagName);\n if (tagName !== tagExp && attrExpPresent) {\n childNode[\":@\"] = this.buildAttributesMap(tagExp, jPath, tagName);\n }\n if (tagContent) {\n tagContent = this.parseTextData(tagContent, tagName, jPath, true, attrExpPresent, true, true);\n }\n jPath = jPath.substr(0, jPath.lastIndexOf(\".\"));\n childNode.add(this.options.textNodeName, tagContent);\n this.addChild(currentNode, childNode, jPath);\n } else {\n if (tagExp.length > 0 && tagExp.lastIndexOf(\"/\") === tagExp.length - 1) {\n if (tagName[tagName.length - 1] === \"/\") {\n tagName = tagName.substr(0, tagName.length - 1);\n jPath = jPath.substr(0, jPath.length - 1);\n tagExp = tagName;\n } else {\n tagExp = tagExp.substr(0, tagExp.length - 1);\n }\n if (this.options.transformTagName) {\n tagName = this.options.transformTagName(tagName);\n }\n const childNode = new xmlNode(tagName);\n if (tagName !== tagExp && attrExpPresent) {\n childNode[\":@\"] = this.buildAttributesMap(tagExp, jPath, tagName);\n }\n this.addChild(currentNode, childNode, jPath);\n jPath = jPath.substr(0, jPath.lastIndexOf(\".\"));\n } else {\n const childNode = new xmlNode(tagName);\n this.tagsNodeStack.push(currentNode);\n if (tagName !== tagExp && attrExpPresent) {\n childNode[\":@\"] = this.buildAttributesMap(tagExp, jPath, tagName);\n }\n this.addChild(currentNode, childNode, jPath);\n currentNode = childNode;\n }\n textData = \"\";\n i = closeIndex;\n }\n }\n } else {\n textData += xmlData[i];\n }\n }\n return xmlObj.child;\n};\nfunction addChild(currentNode, childNode, jPath) {\n const result = this.options.updateTag(childNode.tagname, jPath, childNode[\":@\"]);\n if (result === false) ;\n else if (typeof result === \"string\") {\n childNode.tagname = result;\n currentNode.addChild(childNode);\n } else {\n currentNode.addChild(childNode);\n }\n}\nconst replaceEntitiesValue$1 = function(val2) {\n if (this.options.processEntities) {\n for (let entityName2 in this.docTypeEntities) {\n const entity = this.docTypeEntities[entityName2];\n val2 = val2.replace(entity.regx, entity.val);\n }\n for (let entityName2 in this.lastEntities) {\n const entity = this.lastEntities[entityName2];\n val2 = val2.replace(entity.regex, entity.val);\n }\n if (this.options.htmlEntities) {\n for (let entityName2 in this.htmlEntities) {\n const entity = this.htmlEntities[entityName2];\n val2 = val2.replace(entity.regex, entity.val);\n }\n }\n val2 = val2.replace(this.ampEntity.regex, this.ampEntity.val);\n }\n return val2;\n};\nfunction saveTextToParentTag(textData, currentNode, jPath, isLeafNode) {\n if (textData) {\n if (isLeafNode === void 0) isLeafNode = Object.keys(currentNode.child).length === 0;\n textData = this.parseTextData(\n textData,\n currentNode.tagname,\n jPath,\n false,\n currentNode[\":@\"] ? Object.keys(currentNode[\":@\"]).length !== 0 : false,\n isLeafNode\n );\n if (textData !== void 0 && textData !== \"\")\n currentNode.add(this.options.textNodeName, textData);\n textData = \"\";\n }\n return textData;\n}\nfunction isItStopNode(stopNodes, jPath, currentTagName) {\n const allNodesExp = \"*.\" + currentTagName;\n for (const stopNodePath in stopNodes) {\n const stopNodeExp = stopNodes[stopNodePath];\n if (allNodesExp === stopNodeExp || jPath === stopNodeExp) return true;\n }\n return false;\n}\nfunction tagExpWithClosingIndex(xmlData, i, closingChar = \">\") {\n let attrBoundary;\n let tagExp = \"\";\n for (let index = i; index < xmlData.length; index++) {\n let ch = xmlData[index];\n if (attrBoundary) {\n if (ch === attrBoundary) attrBoundary = \"\";\n } else if (ch === '\"' || ch === \"'\") {\n attrBoundary = ch;\n } else if (ch === closingChar[0]) {\n if (closingChar[1]) {\n if (xmlData[index + 1] === closingChar[1]) {\n return {\n data: tagExp,\n index\n };\n }\n } else {\n return {\n data: tagExp,\n index\n };\n }\n } else if (ch === \"\t\") {\n ch = \" \";\n }\n tagExp += ch;\n }\n}\nfunction findClosingIndex(xmlData, str, i, errMsg) {\n const closingIndex = xmlData.indexOf(str, i);\n if (closingIndex === -1) {\n throw new Error(errMsg);\n } else {\n return closingIndex + str.length - 1;\n }\n}\nfunction readTagExp(xmlData, i, removeNSPrefix, closingChar = \">\") {\n const result = tagExpWithClosingIndex(xmlData, i + 1, closingChar);\n if (!result) return;\n let tagExp = result.data;\n const closeIndex = result.index;\n const separatorIndex = tagExp.search(/\\s/);\n let tagName = tagExp;\n let attrExpPresent = true;\n if (separatorIndex !== -1) {\n tagName = tagExp.substring(0, separatorIndex);\n tagExp = tagExp.substring(separatorIndex + 1).trimStart();\n }\n const rawTagName = tagName;\n if (removeNSPrefix) {\n const colonIndex = tagName.indexOf(\":\");\n if (colonIndex !== -1) {\n tagName = tagName.substr(colonIndex + 1);\n attrExpPresent = tagName !== result.data.substr(colonIndex + 1);\n }\n }\n return {\n tagName,\n tagExp,\n closeIndex,\n attrExpPresent,\n rawTagName\n };\n}\nfunction readStopNodeData(xmlData, tagName, i) {\n const startIndex = i;\n let openTagCount = 1;\n for (; i < xmlData.length; i++) {\n if (xmlData[i] === \"<\") {\n if (xmlData[i + 1] === \"/\") {\n const closeIndex = findClosingIndex(xmlData, \">\", i, `${tagName} is not closed`);\n let closeTagName = xmlData.substring(i + 2, closeIndex).trim();\n if (closeTagName === tagName) {\n openTagCount--;\n if (openTagCount === 0) {\n return {\n tagContent: xmlData.substring(startIndex, i),\n i: closeIndex\n };\n }\n }\n i = closeIndex;\n } else if (xmlData[i + 1] === \"?\") {\n const closeIndex = findClosingIndex(xmlData, \"?>\", i + 1, \"StopNode is not closed.\");\n i = closeIndex;\n } else if (xmlData.substr(i + 1, 3) === \"!--\") {\n const closeIndex = findClosingIndex(xmlData, \"-->\", i + 3, \"StopNode is not closed.\");\n i = closeIndex;\n } else if (xmlData.substr(i + 1, 2) === \"![\") {\n const closeIndex = findClosingIndex(xmlData, \"]]>\", i, \"StopNode is not closed.\") - 2;\n i = closeIndex;\n } else {\n const tagData = readTagExp(xmlData, i, \">\");\n if (tagData) {\n const openTagName = tagData && tagData.tagName;\n if (openTagName === tagName && tagData.tagExp[tagData.tagExp.length - 1] !== \"/\") {\n openTagCount++;\n }\n i = tagData.closeIndex;\n }\n }\n }\n }\n}\nfunction parseValue(val2, shouldParse, options) {\n if (shouldParse && typeof val2 === \"string\") {\n const newval = val2.trim();\n if (newval === \"true\") return true;\n else if (newval === \"false\") return false;\n else return toNumber(val2, options);\n } else {\n if (util.isExist(val2)) {\n return val2;\n } else {\n return \"\";\n }\n }\n}\nvar OrderedObjParser_1 = OrderedObjParser$1;\nvar node2json = {};\nfunction prettify$1(node, options) {\n return compress(node, options);\n}\nfunction compress(arr, options, jPath) {\n let text;\n const compressedObj = {};\n for (let i = 0; i < arr.length; i++) {\n const tagObj = arr[i];\n const property = propName$1(tagObj);\n let newJpath = \"\";\n if (jPath === void 0) newJpath = property;\n else newJpath = jPath + \".\" + property;\n if (property === options.textNodeName) {\n if (text === void 0) text = tagObj[property];\n else text += \"\" + tagObj[property];\n } else if (property === void 0) {\n continue;\n } else if (tagObj[property]) {\n let val2 = compress(tagObj[property], options, newJpath);\n const isLeaf = isLeafTag(val2, options);\n if (tagObj[\":@\"]) {\n assignAttributes(val2, tagObj[\":@\"], newJpath, options);\n } else if (Object.keys(val2).length === 1 && val2[options.textNodeName] !== void 0 && !options.alwaysCreateTextNode) {\n val2 = val2[options.textNodeName];\n } else if (Object.keys(val2).length === 0) {\n if (options.alwaysCreateTextNode) val2[options.textNodeName] = \"\";\n else val2 = \"\";\n }\n if (compressedObj[property] !== void 0 && compressedObj.hasOwnProperty(property)) {\n if (!Array.isArray(compressedObj[property])) {\n compressedObj[property] = [compressedObj[property]];\n }\n compressedObj[property].push(val2);\n } else {\n if (options.isArray(property, newJpath, isLeaf)) {\n compressedObj[property] = [val2];\n } else {\n compressedObj[property] = val2;\n }\n }\n }\n }\n if (typeof text === \"string\") {\n if (text.length > 0) compressedObj[options.textNodeName] = text;\n } else if (text !== void 0) compressedObj[options.textNodeName] = text;\n return compressedObj;\n}\nfunction propName$1(obj) {\n const keys = Object.keys(obj);\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n if (key !== \":@\") return key;\n }\n}\nfunction assignAttributes(obj, attrMap, jpath, options) {\n if (attrMap) {\n const keys = Object.keys(attrMap);\n const len = keys.length;\n for (let i = 0; i < len; i++) {\n const atrrName = keys[i];\n if (options.isArray(atrrName, jpath + \".\" + atrrName, true, true)) {\n obj[atrrName] = [attrMap[atrrName]];\n } else {\n obj[atrrName] = attrMap[atrrName];\n }\n }\n }\n}\nfunction isLeafTag(obj, options) {\n const { textNodeName } = options;\n const propCount = Object.keys(obj).length;\n if (propCount === 0) {\n return true;\n }\n if (propCount === 1 && (obj[textNodeName] || typeof obj[textNodeName] === \"boolean\" || obj[textNodeName] === 0)) {\n return true;\n }\n return false;\n}\nnode2json.prettify = prettify$1;\nconst { buildOptions } = OptionsBuilder;\nconst OrderedObjParser2 = OrderedObjParser_1;\nconst { prettify } = node2json;\nconst validator$1 = validator$2;\nlet XMLParser$1 = class XMLParser {\n constructor(options) {\n this.externalEntities = {};\n this.options = buildOptions(options);\n }\n /**\n * Parse XML dats to JS object \n * @param {string|Buffer} xmlData \n * @param {boolean|Object} validationOption \n */\n parse(xmlData, validationOption) {\n if (typeof xmlData === \"string\") ;\n else if (xmlData.toString) {\n xmlData = xmlData.toString();\n } else {\n throw new Error(\"XML data is accepted in String or Bytes[] form.\");\n }\n if (validationOption) {\n if (validationOption === true) validationOption = {};\n const result = validator$1.validate(xmlData, validationOption);\n if (result !== true) {\n throw Error(`${result.err.msg}:${result.err.line}:${result.err.col}`);\n }\n }\n const orderedObjParser = new OrderedObjParser2(this.options);\n orderedObjParser.addExternalEntities(this.externalEntities);\n const orderedResult = orderedObjParser.parseXml(xmlData);\n if (this.options.preserveOrder || orderedResult === void 0) return orderedResult;\n else return prettify(orderedResult, this.options);\n }\n /**\n * Add Entity which is not by default supported by this library\n * @param {string} key \n * @param {string} value \n */\n addEntity(key, value) {\n if (value.indexOf(\"&\") !== -1) {\n throw new Error(\"Entity value can't have '&'\");\n } else if (key.indexOf(\"&\") !== -1 || key.indexOf(\";\") !== -1) {\n throw new Error(\"An entity must be set without '&' and ';'. Eg. use '#xD' for '&#xD;'\");\n } else if (value === \"&\") {\n throw new Error(\"An entity with value '&' is not permitted\");\n } else {\n this.externalEntities[key] = value;\n }\n }\n};\nvar XMLParser_1 = XMLParser$1;\nconst EOL = \"\\n\";\nfunction toXml(jArray, options) {\n let indentation = \"\";\n if (options.format && options.indentBy.length > 0) {\n indentation = EOL;\n }\n return arrToStr(jArray, options, \"\", indentation);\n}\nfunction arrToStr(arr, options, jPath, indentation) {\n let xmlStr = \"\";\n let isPreviousElementTag = false;\n for (let i = 0; i < arr.length; i++) {\n const tagObj = arr[i];\n const tagName = propName(tagObj);\n if (tagName === void 0) continue;\n let newJPath = \"\";\n if (jPath.length === 0) newJPath = tagName;\n else newJPath = `${jPath}.${tagName}`;\n if (tagName === options.textNodeName) {\n let tagText = tagObj[tagName];\n if (!isStopNode(newJPath, options)) {\n tagText = options.tagValueProcessor(tagName, tagText);\n tagText = replaceEntitiesValue(tagText, options);\n }\n if (isPreviousElementTag) {\n xmlStr += indentation;\n }\n xmlStr += tagText;\n isPreviousElementTag = false;\n continue;\n } else if (tagName === options.cdataPropName) {\n if (isPreviousElementTag) {\n xmlStr += indentation;\n }\n xmlStr += `<![CDATA[${tagObj[tagName][0][options.textNodeName]}]]>`;\n isPreviousElementTag = false;\n continue;\n } else if (tagName === options.commentPropName) {\n xmlStr += indentation + `<!--${tagObj[tagName][0][options.textNodeName]}-->`;\n isPreviousElementTag = true;\n continue;\n } else if (tagName[0] === \"?\") {\n const attStr2 = attr_to_str(tagObj[\":@\"], options);\n const tempInd = tagName === \"?xml\" ? \"\" : indentation;\n let piTextNodeName = tagObj[tagName][0][options.textNodeName];\n piTextNodeName = piTextNodeName.length !== 0 ? \" \" + piTextNodeName : \"\";\n xmlStr += tempInd + `<${tagName}${piTextNodeName}${attStr2}?>`;\n isPreviousElementTag = true;\n continue;\n }\n let newIdentation = indentation;\n if (newIdentation !== \"\") {\n newIdentation += options.indentBy;\n }\n const attStr = attr_to_str(tagObj[\":@\"], options);\n const tagStart = indentation + `<${tagName}${attStr}`;\n const tagValue = arrToStr(tagObj[tagName], options, newJPath, newIdentation);\n if (options.unpairedTags.indexOf(tagName) !== -1) {\n if (options.suppressUnpairedNode) xmlStr += tagStart + \">\";\n else xmlStr += tagStart + \"/>\";\n } else if ((!tagValue || tagValue.length === 0) && options.suppressEmptyNode) {\n xmlStr += tagStart + \"/>\";\n } else if (tagValue && tagValue.endsWith(\">\")) {\n xmlStr += tagStart + `>${tagValue}${indentation}</${tagName}>`;\n } else {\n xmlStr += tagStart + \">\";\n if (tagValue && indentation !== \"\" && (tagValue.includes(\"/>\") || tagValue.includes(\"</\"))) {\n xmlStr += indentation + options.indentBy + tagValue + indentation;\n } else {\n xmlStr += tagValue;\n }\n xmlStr += `</${tagName}>`;\n }\n isPreviousElementTag = true;\n }\n return xmlStr;\n}\nfunction propName(obj) {\n const keys = Object.keys(obj);\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n if (!obj.hasOwnProperty(key)) continue;\n if (key !== \":@\") return key;\n }\n}\nfunction attr_to_str(attrMap, options) {\n let attrStr = \"\";\n if (attrMap && !options.ignoreAttributes) {\n for (let attr in attrMap) {\n if (!attrMap.hasOwnProperty(attr)) continue;\n let attrVal = options.attributeValueProcessor(attr, attrMap[attr]);\n attrVal = replaceEntitiesValue(attrVal, options);\n if (attrVal === true && options.suppressBooleanAttributes) {\n attrStr += ` ${attr.substr(options.attributeNamePrefix.length)}`;\n } else {\n attrStr += ` ${attr.substr(options.attributeNamePrefix.length)}=\"${attrVal}\"`;\n }\n }\n }\n return attrStr;\n}\nfunction isStopNode(jPath, options) {\n jPath = jPath.substr(0, jPath.length - options.textNodeName.length - 1);\n let tagName = jPath.substr(jPath.lastIndexOf(\".\") + 1);\n for (let index in options.stopNodes) {\n if (options.stopNodes[index] === jPath || options.stopNodes[index] === \"*.\" + tagName) return true;\n }\n return false;\n}\nfunction replaceEntitiesValue(textValue, options) {\n if (textValue && textValue.length > 0 && options.processEntities) {\n for (let i = 0; i < options.entities.length; i++) {\n const entity = options.entities[i];\n textValue = textValue.replace(entity.regex, entity.val);\n }\n }\n return textValue;\n}\nvar orderedJs2Xml = toXml;\nconst buildFromOrderedJs = orderedJs2Xml;\nconst defaultOptions = {\n attributeNamePrefix: \"@_\",\n attributesGroupName: false,\n textNodeName: \"#text\",\n ignoreAttributes: true,\n cdataPropName: false,\n format: false,\n indentBy: \" \",\n suppressEmptyNode: false,\n suppressUnpairedNode: true,\n suppressBooleanAttributes: true,\n tagValueProcessor: function(key, a) {\n return a;\n },\n attributeValueProcessor: function(attrName, a) {\n return a;\n },\n preserveOrder: false,\n commentPropName: false,\n unpairedTags: [],\n entities: [\n { regex: new RegExp(\"&\", \"g\"), val: \"&amp;\" },\n //it must be on top\n { regex: new RegExp(\">\", \"g\"), val: \"&gt;\" },\n { regex: new RegExp(\"<\", \"g\"), val: \"&lt;\" },\n { regex: new RegExp(\"'\", \"g\"), val: \"&apos;\" },\n { regex: new RegExp('\"', \"g\"), val: \"&quot;\" }\n ],\n processEntities: true,\n stopNodes: [],\n // transformTagName: false,\n // transformAttributeName: false,\n oneListGroup: false\n};\nfunction Builder(options) {\n this.options = Object.assign({}, defaultOptions, options);\n if (this.options.ignoreAttributes || this.options.attributesGroupName) {\n this.isAttribute = function() {\n return false;\n };\n } else {\n this.attrPrefixLen = this.options.attributeNamePrefix.length;\n this.isAttribute = isAttribute;\n }\n this.processTextOrObjNode = processTextOrObjNode;\n if (this.options.format) {\n this.indentate = indentate;\n this.tagEndChar = \">\\n\";\n this.newLine = \"\\n\";\n } else {\n this.indentate = function() {\n return \"\";\n };\n this.tagEndChar = \">\";\n this.newLine = \"\";\n }\n}\nBuilder.prototype.build = function(jObj) {\n if (this.options.preserveOrder) {\n return buildFromOrderedJs(jObj, this.options);\n } else {\n if (Array.isArray(jObj) && this.options.arrayNodeName && this.options.arrayNodeName.length > 1) {\n jObj = {\n [this.options.arrayNodeName]: jObj\n };\n }\n return this.j2x(jObj, 0).val;\n }\n};\nBuilder.prototype.j2x = function(jObj, level) {\n let attrStr = \"\";\n let val2 = \"\";\n for (let key in jObj) {\n if (!Object.prototype.hasOwnProperty.call(jObj, key)) continue;\n if (typeof jObj[key] === \"undefined\") {\n if (this.isAttribute(key)) {\n val2 += \"\";\n }\n } else if (jObj[key] === null) {\n if (this.isAttribute(key)) {\n val2 += \"\";\n } else if (key[0] === \"?\") {\n val2 += this.indentate(level) + \"<\" + key + \"?\" + this.tagEndChar;\n } else {\n val2 += this.indentate(level) + \"<\" + key + \"/\" + this.tagEndChar;\n }\n } else if (jObj[key] instanceof Date) {\n val2 += this.buildTextValNode(jObj[key], key, \"\", level);\n } else if (typeof jObj[key] !== \"object\") {\n const attr = this.isAttribute(key);\n if (attr) {\n attrStr += this.buildAttrPairStr(attr, \"\" + jObj[key]);\n } else {\n if (key === this.options.textNodeName) {\n let newval = this.options.tagValueProcessor(key, \"\" + jObj[key]);\n val2 += this.replaceEntitiesValue(newval);\n } else {\n val2 += this.buildTextValNode(jObj[key], key, \"\", level);\n }\n }\n } else if (Array.isArray(jObj[key])) {\n const arrLen = jObj[key].length;\n let listTagVal = \"\";\n let listTagAttr = \"\";\n for (let j = 0; j < arrLen; j++) {\n const item = jObj[key][j];\n if (typeof item === \"undefined\") ;\n else if (item === null) {\n if (key[0] === \"?\") val2 += this.indentate(level) + \"<\" + key + \"?\" + this.tagEndChar;\n else val2 += this.indentate(level) + \"<\" + key + \"/\" + this.tagEndChar;\n } else if (typeof item === \"object\") {\n if (this.options.oneListGroup) {\n const result = this.j2x(item, level + 1);\n listTagVal += result.val;\n if (this.options.attributesGroupName && item.hasOwnProperty(this.options.attributesGroupName)) {\n listTagAttr += result.attrStr;\n }\n } else {\n listTagVal += this.processTextOrObjNode(item, key, level);\n }\n } else {\n if (this.options.oneListGroup) {\n let textValue = this.options.tagValueProcessor(key, item);\n textValue = this.replaceEntitiesValue(textValue);\n listTagVal += textValue;\n } else {\n listTagVal += this.buildTextValNode(item, key, \"\", level);\n }\n }\n }\n if (this.options.oneListGroup) {\n listTagVal = this.buildObjectNode(listTagVal, key, listTagAttr, level);\n }\n val2 += listTagVal;\n } else {\n if (this.options.attributesGroupName && key === this.options.attributesGroupName) {\n const Ks = Object.keys(jObj[key]);\n const L = Ks.length;\n for (let j = 0; j < L; j++) {\n attrStr += this.buildAttrPairStr(Ks[j], \"\" + jObj[key][Ks[j]]);\n }\n } else {\n val2 += this.processTextOrObjNode(jObj[key], key, level);\n }\n }\n }\n return { attrStr, val: val2 };\n};\nBuilder.prototype.buildAttrPairStr = function(attrName, val2) {\n val2 = this.options.attributeValueProcessor(attrName, \"\" + val2);\n val2 = this.replaceEntitiesValue(val2);\n if (this.options.suppressBooleanAttributes && val2 === \"true\") {\n return \" \" + attrName;\n } else return \" \" + attrName + '=\"' + val2 + '\"';\n};\nfunction processTextOrObjNode(object, key, level) {\n const result = this.j2x(object, level + 1);\n if (object[this.options.textNodeName] !== void 0 && Object.keys(object).length === 1) {\n return this.buildTextValNode(object[this.options.textNodeName], key, result.attrStr, level);\n } else {\n return this.buildObjectNode(result.val, key, result.attrStr, level);\n }\n}\nBuilder.prototype.buildObjectNode = function(val2, key, attrStr, level) {\n if (val2 === \"\") {\n if (key[0] === \"?\") return this.indentate(level) + \"<\" + key + attrStr + \"?\" + this.tagEndChar;\n else {\n return this.indentate(level) + \"<\" + key + attrStr + this.closeTag(key) + this.tagEndChar;\n }\n } else {\n let tagEndExp = \"</\" + key + this.tagEndChar;\n let piClosingChar = \"\";\n if (key[0] === \"?\") {\n piClosingChar = \"?\";\n tagEndExp = \"\";\n }\n if ((attrStr || attrStr === \"\") && val2.indexOf(\"<\") === -1) {\n return this.indentate(level) + \"<\" + key + attrStr + piClosingChar + \">\" + val2 + tagEndExp;\n } else if (this.options.commentPropName !== false && key === this.options.commentPropName && piClosingChar.length === 0) {\n return this.indentate(level) + `<!--${val2}-->` + this.newLine;\n } else {\n return this.indentate(level) + \"<\" + key + attrStr + piClosingChar + this.tagEndChar + val2 + this.indentate(level) + tagEndExp;\n }\n }\n};\nBuilder.prototype.closeTag = function(key) {\n let closeTag = \"\";\n if (this.options.unpairedTags.indexOf(key) !== -1) {\n if (!this.options.suppressUnpairedNode) closeTag = \"/\";\n } else if (this.options.suppressEmptyNode) {\n closeTag = \"/\";\n } else {\n closeTag = `></${key}`;\n }\n return closeTag;\n};\nBuilder.prototype.buildTextValNode = function(val2, key, attrStr, level) {\n if (this.options.cdataPropName !== false && key === this.options.cdataPropName) {\n return this.indentate(level) + `<![CDATA[${val2}]]>` + this.newLine;\n } else if (this.options.commentPropName !== false && key === this.options.commentPropName) {\n return this.indentate(level) + `<!--${val2}-->` + this.newLine;\n } else if (key[0] === \"?\") {\n return this.indentate(level) + \"<\" + key + attrStr + \"?\" + this.tagEndChar;\n } else {\n let textValue = this.options.tagValueProcessor(key, val2);\n textValue = this.replaceEntitiesValue(textValue);\n if (textValue === \"\") {\n return this.indentate(level) + \"<\" + key + attrStr + this.closeTag(key) + this.tagEndChar;\n } else {\n return this.indentate(level) + \"<\" + key + attrStr + \">\" + textValue + \"</\" + key + this.tagEndChar;\n }\n }\n};\nBuilder.prototype.replaceEntitiesValue = function(textValue) {\n if (textValue && textValue.length > 0 && this.options.processEntities) {\n for (let i = 0; i < this.options.entities.length; i++) {\n const entity = this.options.entities[i];\n textValue = textValue.replace(entity.regex, entity.val);\n }\n }\n return textValue;\n};\nfunction indentate(level) {\n return this.options.indentBy.repeat(level);\n}\nfunction isAttribute(name) {\n if (name.startsWith(this.options.attributeNamePrefix) && name !== this.options.textNodeName) {\n return name.substr(this.attrPrefixLen);\n } else {\n return false;\n }\n}\nvar json2xml = Builder;\nconst validator = validator$2;\nconst XMLParser2 = XMLParser_1;\nconst XMLBuilder = json2xml;\nvar fxp = {\n XMLParser: XMLParser2,\n XMLValidator: validator,\n XMLBuilder\n};\nfunction isSvg(string) {\n if (typeof string !== \"string\") {\n throw new TypeError(`Expected a \\`string\\`, got \\`${typeof string}\\``);\n }\n string = string.trim();\n if (string.length === 0) {\n return false;\n }\n if (fxp.XMLValidator.validate(string) !== true) {\n return false;\n }\n let jsonObject;\n const parser = new fxp.XMLParser();\n try {\n jsonObject = parser.parse(string);\n } catch {\n return false;\n }\n if (!jsonObject) {\n return false;\n }\n if (!Object.keys(jsonObject).some((x) => x.toLowerCase() === \"svg\")) {\n return false;\n }\n return true;\n}\nclass View {\n _view;\n constructor(view) {\n isValidView(view);\n this._view = view;\n }\n get id() {\n return this._view.id;\n }\n get name() {\n return this._view.name;\n }\n get caption() {\n return this._view.caption;\n }\n get emptyTitle() {\n return this._view.emptyTitle;\n }\n get emptyCaption() {\n return this._view.emptyCaption;\n }\n get getContents() {\n return this._view.getContents;\n }\n get icon() {\n return this._view.icon;\n }\n set icon(icon) {\n this._view.icon = icon;\n }\n get order() {\n return this._view.order;\n }\n set order(order) {\n this._view.order = order;\n }\n get params() {\n return this._view.params;\n }\n set params(params) {\n this._view.params = params;\n }\n get columns() {\n return this._view.columns;\n }\n get emptyView() {\n return this._view.emptyView;\n }\n get parent() {\n return this._view.parent;\n }\n get sticky() {\n return this._view.sticky;\n }\n get expanded() {\n return this._view.expanded;\n }\n set expanded(expanded) {\n this._view.expanded = expanded;\n }\n get defaultSortKey() {\n return this._view.defaultSortKey;\n }\n get loadChildViews() {\n return this._view.loadChildViews;\n }\n}\nconst isValidView = function(view) {\n if (!view.id || typeof view.id !== \"string\") {\n throw new Error(\"View id is required and must be a string\");\n }\n if (!view.name || typeof view.name !== \"string\") {\n throw new Error(\"View name is required and must be a string\");\n }\n if (view.columns && view.columns.length > 0 && (!view.caption || typeof view.caption !== \"string\")) {\n throw new Error(\"View caption is required for top-level views and must be a string\");\n }\n if (!view.getContents || typeof view.getContents !== \"function\") {\n throw new Error(\"View getContents is required and must be a function\");\n }\n if (!view.icon || typeof view.icon !== \"string\" || !isSvg(view.icon)) {\n throw new Error(\"View icon is required and must be a valid svg string\");\n }\n if (\"order\" in view && typeof view.order !== \"number\") {\n throw new Error(\"View order must be a number\");\n }\n if (view.columns) {\n view.columns.forEach((column) => {\n if (!(column instanceof Column)) {\n throw new Error(\"View columns must be an array of Column. Invalid column found\");\n }\n });\n }\n if (view.emptyView && typeof view.emptyView !== \"function\") {\n throw new Error(\"View emptyView must be a function\");\n }\n if (view.parent && typeof view.parent !== \"string\") {\n throw new Error(\"View parent must be a string\");\n }\n if (\"sticky\" in view && typeof view.sticky !== \"boolean\") {\n throw new Error(\"View sticky must be a boolean\");\n }\n if (\"expanded\" in view && typeof view.expanded !== \"boolean\") {\n throw new Error(\"View expanded must be a boolean\");\n }\n if (view.defaultSortKey && typeof view.defaultSortKey !== \"string\") {\n throw new Error(\"View defaultSortKey must be a string\");\n }\n if (view.loadChildViews && typeof view.loadChildViews !== \"function\") {\n throw new Error(\"View loadChildViews must be a function\");\n }\n return true;\n};\nconst debug$1 = typeof process === \"object\" && process.env && process.env.NODE_DEBUG && /\\bsemver\\b/i.test(process.env.NODE_DEBUG) ? (...args) => console.error(\"SEMVER\", ...args) : () => {\n};\nvar debug_1 = debug$1;\nconst SEMVER_SPEC_VERSION = \"2.0.0\";\nconst MAX_LENGTH$1 = 256;\nconst MAX_SAFE_INTEGER$1 = Number.MAX_SAFE_INTEGER || /* istanbul ignore next */\n9007199254740991;\nconst MAX_SAFE_COMPONENT_LENGTH = 16;\nconst MAX_SAFE_BUILD_LENGTH = MAX_LENGTH$1 - 6;\nconst RELEASE_TYPES = [\n \"major\",\n \"premajor\",\n \"minor\",\n \"preminor\",\n \"patch\",\n \"prepatch\",\n \"prerelease\"\n];\nvar constants = {\n MAX_LENGTH: MAX_LENGTH$1,\n MAX_SAFE_COMPONENT_LENGTH,\n MAX_SAFE_BUILD_LENGTH,\n MAX_SAFE_INTEGER: MAX_SAFE_INTEGER$1,\n RELEASE_TYPES,\n SEMVER_SPEC_VERSION,\n FLAG_INCLUDE_PRERELEASE: 1,\n FLAG_LOOSE: 2\n};\nvar re$1 = { exports: {} };\n(function(module, exports) {\n const {\n MAX_SAFE_COMPONENT_LENGTH: MAX_SAFE_COMPONENT_LENGTH2,\n MAX_SAFE_BUILD_LENGTH: MAX_SAFE_BUILD_LENGTH2,\n MAX_LENGTH: MAX_LENGTH2\n } = constants;\n const debug2 = debug_1;\n exports = module.exports = {};\n const re2 = exports.re = [];\n const safeRe = exports.safeRe = [];\n const src = exports.src = [];\n const t2 = exports.t = {};\n let R = 0;\n const LETTERDASHNUMBER = \"[a-zA-Z0-9-]\";\n const safeRegexReplacements = [\n [\"\\\\s\", 1],\n [\"\\\\d\", MAX_LENGTH2],\n [LETTERDASHNUMBER, MAX_SAFE_BUILD_LENGTH2]\n ];\n const makeSafeRegex = (value) => {\n for (const [token, max] of safeRegexReplacements) {\n value = value.split(`${token}*`).join(`${token}{0,${max}}`).split(`${token}+`).join(`${token}{1,${max}}`);\n }\n return value;\n };\n const createToken = (name, value, isGlobal) => {\n const safe = makeSafeRegex(value);\n const index = R++;\n debug2(name, index, value);\n t2[name] = index;\n src[index] = value;\n re2[index] = new RegExp(value, isGlobal ? \"g\" : void 0);\n safeRe[index] = new RegExp(safe, isGlobal ? \"g\" : void 0);\n };\n createToken(\"NUMERICIDENTIFIER\", \"0|[1-9]\\\\d*\");\n createToken(\"NUMERICIDENTIFIERLOOSE\", \"\\\\d+\");\n createToken(\"NONNUMERICIDENTIFIER\", `\\\\d*[a-zA-Z-]${LETTERDASHNUMBER}*`);\n createToken(\"MAINVERSION\", `(${src[t2.NUMERICIDENTIFIER]})\\\\.(${src[t2.NUMERICIDENTIFIER]})\\\\.(${src[t2.NUMERICIDENTIFIER]})`);\n createToken(\"MAINVERSIONLOOSE\", `(${src[t2.NUMERICIDENTIFIERLOOSE]})\\\\.(${src[t2.NUMERICIDENTIFIERLOOSE]})\\\\.(${src[t2.NUMERICIDENTIFIERLOOSE]})`);\n createToken(\"PRERELEASEIDENTIFIER\", `(?:${src[t2.NUMERICIDENTIFIER]}|${src[t2.NONNUMERICIDENTIFIER]})`);\n createToken(\"PRERELEASEIDENTIFIERLOOSE\", `(?:${src[t2.NUMERICIDENTIFIERLOOSE]}|${src[t2.NONNUMERICIDENTIFIER]})`);\n createToken(\"PRERELEASE\", `(?:-(${src[t2.PRERELEASEIDENTIFIER]}(?:\\\\.${src[t2.PRERELEASEIDENTIFIER]})*))`);\n createToken(\"PRERELEASELOOSE\", `(?:-?(${src[t2.PRERELEASEIDENTIFIERLOOSE]}(?:\\\\.${src[t2.PRERELEASEIDENTIFIERLOOSE]})*))`);\n createToken(\"BUILDIDENTIFIER\", `${LETTERDASHNUMBER}+`);\n createToken(\"BUILD\", `(?:\\\\+(${src[t2.BUILDIDENTIFIER]}(?:\\\\.${src[t2.BUILDIDENTIFIER]})*))`);\n createToken(\"FULLPLAIN\", `v?${src[t2.MAINVERSION]}${src[t2.PRERELEASE]}?${src[t2.BUILD]}?`);\n createToken(\"FULL\", `^${src[t2.FULLPLAIN]}$`);\n createToken(\"LOOSEPLAIN\", `[v=\\\\s]*${src[t2.MAINVERSIONLOOSE]}${src[t2.PRERELEASELOOSE]}?${src[t2.BUILD]}?`);\n createToken(\"LOOSE\", `^${src[t2.LOOSEPLAIN]}$`);\n createToken(\"GTLT\", \"((?:<|>)?=?)\");\n createToken(\"XRANGEIDENTIFIERLOOSE\", `${src[t2.NUMERICIDENTIFIERLOOSE]}|x|X|\\\\*`);\n createToken(\"XRANGEIDENTIFIER\", `${src[t2.NUMERICIDENTIFIER]}|x|X|\\\\*`);\n createToken(\"XRANGEPLAIN\", `[v=\\\\s]*(${src[t2.XRANGEIDENTIFIER]})(?:\\\\.(${src[t2.XRANGEIDENTIFIER]})(?:\\\\.(${src[t2.XRANGEIDENTIFIER]})(?:${src[t2.PRERELEASE]})?${src[t2.BUILD]}?)?)?`);\n createToken(\"XRANGEPLAINLOOSE\", `[v=\\\\s]*(${src[t2.XRANGEIDENTIFIERLOOSE]})(?:\\\\.(${src[t2.XRANGEIDENTIFIERLOOSE]})(?:\\\\.(${src[t2.XRANGEIDENTIFIERLOOSE]})(?:${src[t2.PRERELEASELOOSE]})?${src[t2.BUILD]}?)?)?`);\n createToken(\"XRANGE\", `^${src[t2.GTLT]}\\\\s*${src[t2.XRANGEPLAIN]}$`);\n createToken(\"XRANGELOOSE\", `^${src[t2.GTLT]}\\\\s*${src[t2.XRANGEPLAINLOOSE]}$`);\n createToken(\"COERCEPLAIN\", `${\"(^|[^\\\\d])(\\\\d{1,\"}${MAX_SAFE_COMPONENT_LENGTH2}})(?:\\\\.(\\\\d{1,${MAX_SAFE_COMPONENT_LENGTH2}}))?(?:\\\\.(\\\\d{1,${MAX_SAFE_COMPONENT_LENGTH2}}))?`);\n createToken(\"COERCE\", `${src[t2.COERCEPLAIN]}(?:$|[^\\\\d])`);\n createToken(\"COERCEFULL\", src[t2.COERCEPLAIN] + `(?:${src[t2.PRERELEASE]})?(?:${src[t2.BUILD]})?(?:$|[^\\\\d])`);\n createToken(\"COERCERTL\", src[t2.COERCE], true);\n createToken(\"COERCERTLFULL\", src[t2.COERCEFULL], true);\n createToken(\"LONETILDE\", \"(?:~>?)\");\n createToken(\"TILDETRIM\", `(\\\\s*)${src[t2.LONETILDE]}\\\\s+`, true);\n exports.tildeTrimReplace = \"$1~\";\n createToken(\"TILDE\", `^${src[t2.LONETILDE]}${src[t2.XRANGEPLAIN]}$`);\n createToken(\"TILDELOOSE\", `^${src[t2.LONETILDE]}${src[t2.XRANGEPLAINLOOSE]}$`);\n createToken(\"LONECARET\", \"(?:\\\\^)\");\n createToken(\"CARETTRIM\", `(\\\\s*)${src[t2.LONECARET]}\\\\s+`, true);\n exports.caretTrimReplace = \"$1^\";\n createToken(\"CARET\", `^${src[t2.LONECARET]}${src[t2.XRANGEPLAIN]}$`);\n createToken(\"CARETLOOSE\", `^${src[t2.LONECARET]}${src[t2.XRANGEPLAINLOOSE]}$`);\n createToken(\"COMPARATORLOOSE\", `^${src[t2.GTLT]}\\\\s*(${src[t2.LOOSEPLAIN]})$|^$`);\n createToken(\"COMPARATOR\", `^${src[t2.GTLT]}\\\\s*(${src[t2.FULLPLAIN]})$|^$`);\n createToken(\"COMPARATORTRIM\", `(\\\\s*)${src[t2.GTLT]}\\\\s*(${src[t2.LOOSEPLAIN]}|${src[t2.XRANGEPLAIN]})`, true);\n exports.comparatorTrimReplace = \"$1$2$3\";\n createToken(\"HYPHENRANGE\", `^\\\\s*(${src[t2.XRANGEPLAIN]})\\\\s+-\\\\s+(${src[t2.XRANGEPLAIN]})\\\\s*$`);\n createToken(\"HYPHENRANGELOOSE\", `^\\\\s*(${src[t2.XRANGEPLAINLOOSE]})\\\\s+-\\\\s+(${src[t2.XRANGEPLAINLOOSE]})\\\\s*$`);\n createToken(\"STAR\", \"(<|>)?=?\\\\s*\\\\*\");\n createToken(\"GTE0\", \"^\\\\s*>=\\\\s*0\\\\.0\\\\.0\\\\s*$\");\n createToken(\"GTE0PRE\", \"^\\\\s*>=\\\\s*0\\\\.0\\\\.0-0\\\\s*$\");\n})(re$1, re$1.exports);\nvar reExports = re$1.exports;\nconst looseOption = Object.freeze({ loose: true });\nconst emptyOpts = Object.freeze({});\nconst parseOptions$1 = (options) => {\n if (!options) {\n return emptyOpts;\n }\n if (typeof options !== \"object\") {\n return looseOption;\n }\n return options;\n};\nvar parseOptions_1 = parseOptions$1;\nconst numeric = /^[0-9]+$/;\nconst compareIdentifiers$1 = (a, b) => {\n const anum = numeric.test(a);\n const bnum = numeric.test(b);\n if (anum && bnum) {\n a = +a;\n b = +b;\n }\n return a === b ? 0 : anum && !bnum ? -1 : bnum && !anum ? 1 : a < b ? -1 : 1;\n};\nconst rcompareIdentifiers = (a, b) => compareIdentifiers$1(b, a);\nvar identifiers = {\n compareIdentifiers: compareIdentifiers$1,\n rcompareIdentifiers\n};\nconst debug = debug_1;\nconst { MAX_LENGTH, MAX_SAFE_INTEGER } = constants;\nconst { safeRe: re, t } = reExports;\nconst parseOptions = parseOptions_1;\nconst { compareIdentifiers } = identifiers;\nlet SemVer$2 = class SemVer {\n constructor(version, options) {\n options = parseOptions(options);\n if (version instanceof SemVer) {\n if (version.loose === !!options.loose && version.includePrerelease === !!options.includePrerelease) {\n return version;\n } else {\n version = version.version;\n }\n } else if (typeof version !== \"string\") {\n throw new TypeError(`Invalid version. Must be a string. Got type \"${typeof version}\".`);\n }\n if (version.length > MAX_LENGTH) {\n throw new TypeError(\n `version is longer than ${MAX_LENGTH} characters`\n );\n }\n debug(\"SemVer\", version, options);\n this.options = options;\n this.loose = !!options.loose;\n this.includePrerelease = !!options.includePrerelease;\n const m = version.trim().match(options.loose ? re[t.LOOSE] : re[t.FULL]);\n if (!m) {\n throw new TypeError(`Invalid Version: ${version}`);\n }\n this.raw = version;\n this.major = +m[1];\n this.minor = +m[2];\n this.patch = +m[3];\n if (this.major > MAX_SAFE_INTEGER || this.major < 0) {\n throw new TypeError(\"Invalid major version\");\n }\n if (this.minor > MAX_SAFE_INTEGER || this.minor < 0) {\n throw new TypeError(\"Invalid minor version\");\n }\n if (this.patch > MAX_SAFE_INTEGER || this.patch < 0) {\n throw new TypeError(\"Invalid patch version\");\n }\n if (!m[4]) {\n this.prerelease = [];\n } else {\n this.prerelease = m[4].split(\".\").map((id) => {\n if (/^[0-9]+$/.test(id)) {\n const num = +id;\n if (num >= 0 && num < MAX_SAFE_INTEGER) {\n return num;\n }\n }\n return id;\n });\n }\n this.build = m[5] ? m[5].split(\".\") : [];\n this.format();\n }\n format() {\n this.version = `${this.major}.${this.minor}.${this.patch}`;\n if (this.prerelease.length) {\n this.version += `-${this.prerelease.join(\".\")}`;\n }\n return this.version;\n }\n toString() {\n return this.version;\n }\n compare(other) {\n debug(\"SemVer.compare\", this.version, this.options, other);\n if (!(other instanceof SemVer)) {\n if (typeof other === \"string\" && other === this.version) {\n return 0;\n }\n other = new SemVer(other, this.options);\n }\n if (other.version === this.version) {\n return 0;\n }\n return this.compareMain(other) || this.comparePre(other);\n }\n compareMain(other) {\n if (!(other instanceof SemVer)) {\n other = new SemVer(other, this.options);\n }\n return compareIdentifiers(this.major, other.major) || compareIdentifiers(this.minor, other.minor) || compareIdentifiers(this.patch, other.patch);\n }\n comparePre(other) {\n if (!(other instanceof SemVer)) {\n other = new SemVer(other, this.options);\n }\n if (this.prerelease.length && !other.prerelease.length) {\n return -1;\n } else if (!this.prerelease.length && other.prerelease.length) {\n return 1;\n } else if (!this.prerelease.length && !other.prerelease.length) {\n return 0;\n }\n let i = 0;\n do {\n const a = this.prerelease[i];\n const b = other.prerelease[i];\n debug(\"prerelease compare\", i, a, b);\n if (a === void 0 && b === void 0) {\n return 0;\n } else if (b === void 0) {\n return 1;\n } else if (a === void 0) {\n return -1;\n } else if (a === b) {\n continue;\n } else {\n return compareIdentifiers(a, b);\n }\n } while (++i);\n }\n compareBuild(other) {\n if (!(other instanceof SemVer)) {\n other = new SemVer(other, this.options);\n }\n let i = 0;\n do {\n const a = this.build[i];\n const b = other.build[i];\n debug(\"build compare\", i, a, b);\n if (a === void 0 && b === void 0) {\n return 0;\n } else if (b === void 0) {\n return 1;\n } else if (a === void 0) {\n return -1;\n } else if (a === b) {\n continue;\n } else {\n return compareIdentifiers(a, b);\n }\n } while (++i);\n }\n // preminor will bump the version up to the next minor release, and immediately\n // down to pre-release. premajor and prepatch work the same way.\n inc(release, identifier, identifierBase) {\n switch (release) {\n case \"premajor\":\n this.prerelease.length = 0;\n this.patch = 0;\n this.minor = 0;\n this.major++;\n this.inc(\"pre\", identifier, identifierBase);\n break;\n case \"preminor\":\n this.prerelease.length = 0;\n this.patch = 0;\n this.minor++;\n this.inc(\"pre\", identifier, identifierBase);\n break;\n case \"prepatch\":\n this.prerelease.length = 0;\n this.inc(\"patch\", identifier, identifierBase);\n this.inc(\"pre\", identifier, identifierBase);\n break;\n case \"prerelease\":\n if (this.prerelease.length === 0) {\n this.inc(\"patch\", identifier, identifierBase);\n }\n this.inc(\"pre\", identifier, identifierBase);\n break;\n case \"major\":\n if (this.minor !== 0 || this.patch !== 0 || this.prerelease.length === 0) {\n this.major++;\n }\n this.minor = 0;\n this.patch = 0;\n this.prerelease = [];\n break;\n case \"minor\":\n if (this.patch !== 0 || this.prerelease.length === 0) {\n this.minor++;\n }\n this.patch = 0;\n this.prerelease = [];\n break;\n case \"patch\":\n if (this.prerelease.length === 0) {\n this.patch++;\n }\n this.prerelease = [];\n break;\n case \"pre\": {\n const base = Number(identifierBase) ? 1 : 0;\n if (!identifier && identifierBase === false) {\n throw new Error(\"invalid increment argument: identifier is empty\");\n }\n if (this.prerelease.length === 0) {\n this.prerelease = [base];\n } else {\n let i = this.prerelease.length;\n while (--i >= 0) {\n if (typeof this.prerelease[i] === \"number\") {\n this.prerelease[i]++;\n i = -2;\n }\n }\n if (i === -1) {\n if (identifier === this.prerelease.join(\".\") && identifierBase === false) {\n throw new Error(\"invalid increment argument: identifier already exists\");\n }\n this.prerelease.push(base);\n }\n }\n if (identifier) {\n let prerelease = [identifier, base];\n if (identifierBase === false) {\n prerelease = [identifier];\n }\n if (compareIdentifiers(this.prerelease[0], identifier) === 0) {\n if (isNaN(this.prerelease[1])) {\n this.prerelease = prerelease;\n }\n } else {\n this.prerelease = prerelease;\n }\n }\n break;\n }\n default:\n throw new Error(`invalid increment argument: ${release}`);\n }\n this.raw = this.format();\n if (this.build.length) {\n this.raw += `+${this.build.join(\".\")}`;\n }\n return this;\n }\n};\nvar semver = SemVer$2;\nconst SemVer$1 = semver;\nconst parse$1 = (version, options, throwErrors = false) => {\n if (version instanceof SemVer$1) {\n return version;\n }\n try {\n return new SemVer$1(version, options);\n } catch (er) {\n if (!throwErrors) {\n return null;\n }\n throw er;\n }\n};\nvar parse_1 = parse$1;\nconst parse = parse_1;\nconst valid = (version, options) => {\n const v = parse(version, options);\n return v ? v.version : null;\n};\nvar valid_1 = valid;\nconst valid$1 = /* @__PURE__ */ getDefaultExportFromCjs(valid_1);\nconst SemVer2 = semver;\nconst major = (a, loose) => new SemVer2(a, loose).major;\nvar major_1 = major;\nconst major$1 = /* @__PURE__ */ getDefaultExportFromCjs(major_1);\nclass ProxyBus {\n bus;\n constructor(bus2) {\n if (typeof bus2.getVersion !== \"function\" || !valid$1(bus2.getVersion())) {\n console.warn(\"Proxying an event bus with an unknown or invalid version\");\n } else if (major$1(bus2.getVersion()) !== major$1(this.getVersion())) {\n console.warn(\n \"Proxying an event bus of version \" + bus2.getVersion() + \" with \" + this.getVersion()\n );\n }\n this.bus = bus2;\n }\n getVersion() {\n return \"3.3.1\";\n }\n subscribe(name, handler) {\n this.bus.subscribe(name, handler);\n }\n unsubscribe(name, handler) {\n this.bus.unsubscribe(name, handler);\n }\n emit(name, event) {\n this.bus.emit(name, event);\n }\n}\nclass SimpleBus {\n handlers = /* @__PURE__ */ new Map();\n getVersion() {\n return \"3.3.1\";\n }\n subscribe(name, handler) {\n this.handlers.set(\n name,\n (this.handlers.get(name) || []).concat(\n handler\n )\n );\n }\n unsubscribe(name, handler) {\n this.handlers.set(\n name,\n (this.handlers.get(name) || []).filter((h) => h !== handler)\n );\n }\n emit(name, event) {\n (this.handlers.get(name) || []).forEach((h) => {\n try {\n h(event);\n } catch (e) {\n console.error(\"could not invoke event listener\", e);\n }\n });\n }\n}\nlet bus = null;\nfunction getBus() {\n if (bus !== null) {\n return bus;\n }\n if (typeof window === \"undefined\") {\n return new Proxy({}, {\n get: () => {\n return () => console.error(\n \"Window not available, EventBus can not be established!\"\n );\n }\n });\n }\n if (window.OC?._eventBus && typeof window._nc_event_bus === \"undefined\") {\n console.warn(\n \"found old event bus instance at OC._eventBus. Update your version!\"\n );\n window._nc_event_bus = window.OC._eventBus;\n }\n if (typeof window?._nc_event_bus !== \"undefined\") {\n bus = new ProxyBus(window._nc_event_bus);\n } else {\n bus = window._nc_event_bus = new SimpleBus();\n }\n return bus;\n}\nfunction emit(name, event) {\n getBus().emit(name, event);\n}\n/*!\n * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\nclass FileListFilter extends TypedEventTarget {\n id;\n order;\n constructor(id, order = 100) {\n super();\n this.id = id;\n this.order = order;\n }\n filter(nodes) {\n throw new Error(\"Not implemented\");\n }\n updateChips(chips) {\n this.dispatchTypedEvent(\"update:chips\", new CustomEvent(\"update:chips\", { detail: chips }));\n }\n filterUpdated() {\n this.dispatchTypedEvent(\"update:filter\", new CustomEvent(\"update:filter\"));\n }\n}\nfunction registerFileListFilter(filter) {\n if (!window._nc_filelist_filters) {\n window._nc_filelist_filters = /* @__PURE__ */ new Map();\n }\n if (window._nc_filelist_filters.has(filter.id)) {\n throw new Error(`File list filter \"${filter.id}\" already registered`);\n }\n window._nc_filelist_filters.set(filter.id, filter);\n emit(\"files:filter:added\", filter);\n}\nfunction unregisterFileListFilter(filterId) {\n if (window._nc_filelist_filters && window._nc_filelist_filters.has(filterId)) {\n window._nc_filelist_filters.delete(filterId);\n emit(\"files:filter:removed\", filterId);\n }\n}\nfunction getFileListFilters() {\n if (!window._nc_filelist_filters) {\n return [];\n }\n return [...window._nc_filelist_filters.values()];\n}\nconst addNewFileMenuEntry = function(entry) {\n const newFileMenu = getNewFileMenu();\n return newFileMenu.registerEntry(entry);\n};\nconst removeNewFileMenuEntry = function(entry) {\n const newFileMenu = getNewFileMenu();\n return newFileMenu.unregisterEntry(entry);\n};\nconst getNewFileMenuEntries = function(context) {\n const newFileMenu = getNewFileMenu();\n return newFileMenu.getEntries(context).sort((a, b) => {\n if (a.order !== void 0 && b.order !== void 0 && a.order !== b.order) {\n return a.order - b.order;\n }\n return a.displayName.localeCompare(b.displayName, void 0, { numeric: true, sensitivity: \"base\" });\n });\n};\nexport {\n Column,\n DefaultType,\n File,\n FileAction,\n FileListFilter,\n FileType,\n FilesSortingMode,\n Folder,\n Header,\n InvalidFilenameError,\n InvalidFilenameErrorReason,\n Navigation,\n NewMenuEntryCategory,\n Node,\n NodeStatus,\n Permission,\n View,\n addNewFileMenuEntry,\n davGetClient,\n davGetDefaultPropfind,\n davGetFavoritesReport,\n davGetRecentSearch,\n davGetRemoteURL,\n davGetRootPath,\n davParsePermissions,\n davRemoteURL,\n davResultToNode,\n davRootPath,\n defaultDavNamespaces,\n defaultDavProperties,\n formatFileSize,\n getDavNameSpaces,\n getDavProperties,\n getFavoriteNodes,\n getFileActions,\n getFileListFilters,\n getFileListHeaders,\n getNavigation,\n getNewFileMenuEntries,\n getUniqueName,\n isFilenameValid,\n orderBy,\n parseFileSize,\n registerDavProperty,\n registerFileAction,\n registerFileListFilter,\n registerFileListHeaders,\n removeNewFileMenuEntry,\n sortNodes,\n unregisterFileListFilter,\n validateFilename\n};\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\tloaded: false,\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Flag the module as loaded\n\tmodule.loaded = true;\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames based on template\n\treturn \"\" + ({\"3239\":\"settings-users\",\"4529\":\"settings-apps-view\"}[chunkId] || chunkId) + \"-\" + chunkId + \".js?v=\" + {\"802\":\"eddac441912aee9d7aa8\",\"3239\":\"61490dd5ed1c5d8390cb\",\"4529\":\"1ff3e764eab81081e54c\",\"4546\":\"a06fb7f5c8fd8d53c2d3\",\"7265\":\"715398afd1ab50836642\",\"8737\":\"6a26621151e51d343a78\",\"9291\":\"077955af818a227340aa\",\"9972\":\"b7597ad74d36447b4184\"}[chunkId] + \"\";\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.nmd = (module) => {\n\tmodule.paths = [];\n\tif (!module.children) module.children = [];\n\treturn module;\n};","__webpack_require__.j = 2689;","var scriptUrl;\nif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\nvar document = __webpack_require__.g.document;\nif (!scriptUrl && document) {\n\tif (document.currentScript && document.currentScript.tagName.toUpperCase() === 'SCRIPT')\n\t\tscriptUrl = document.currentScript.src;\n\tif (!scriptUrl) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tif(scripts.length) {\n\t\t\tvar i = scripts.length - 1;\n\t\t\twhile (i > -1 && (!scriptUrl || !/^http(s?):/.test(scriptUrl))) scriptUrl = scripts[i--].src;\n\t\t}\n\t}\n}\n// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\nif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\nscriptUrl = scriptUrl.replace(/#.*$/, \"\").replace(/\\?.*$/, \"\").replace(/\\/[^\\/]+$/, \"/\");\n__webpack_require__.p = scriptUrl;","__webpack_require__.b = document.baseURI || self.location.href;\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t2689: 0\n};\n\n__webpack_require__.f.j = (chunkId, promises) => {\n\t\t// JSONP chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\n\t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n\t\t\t// a Promise means \"currently loading\".\n\t\t\tif(installedChunkData) {\n\t\t\t\tpromises.push(installedChunkData[2]);\n\t\t\t} else {\n\t\t\t\tif(true) { // all chunks have JS\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = new Promise((resolve, reject) => (installedChunkData = installedChunks[chunkId] = [resolve, reject]));\n\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n\t\t\t\t\t// start chunk loading\n\t\t\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\t\t\tvar error = new Error();\n\t\t\t\t\tvar loadingEnded = (event) => {\n\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\t\tif(installedChunkData) {\n\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n};\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = (chunkId) => (installedChunks[chunkId] === 0);\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = (parentChunkLoadingFunction, data) => {\n\tvar chunkIds = data[0];\n\tvar moreModules = data[1];\n\tvar runtime = data[2];\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some((id) => (installedChunks[id] !== 0))) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunknextcloud\"] = self[\"webpackChunknextcloud\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","__webpack_require__.nc = undefined;","// startup\n// Load entry module and return exports\n// This entry module depends on other loaded chunks and execution need to be delayed\nvar __webpack_exports__ = __webpack_require__.O(undefined, [4208], () => (__webpack_require__(18539)))\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["deferred","inProgress","dataWebpackPrefix","sanitize","url","replace","requireAdmin","confirmPassword","get","options","axios","post","data","put","delete","params","localStorage","getBuilder","persist","build","defaults","id","name","usercount","disabled","canAdd","canRemove","state","users","groups","orderBy","GroupSorting","UserCount","minPasswordLength","usersOffset","usersLimit","disabledUsersOffset","disabledUsersLimit","userCount","showConfig","showStoragePath","getItem","showUserBackend","showLastLogin","showNewUserForm","showLanguages","mutations","appendUsers","usersObj","existingUsers","map","_ref","newUsers","Object","values","filter","_ref2","includes","concat","updateDisabledUsers","_usersObj","setPasswordPolicyMinLength","length","initGroups","_ref3","group","assign","addGroup","_ref4","gid","displayName","find","unshift","e","console","error","renameGroup","_ref5","groupIndex","findIndex","groupSearch","updatedGroup","splice","removeGroup","addUserGroup","_ref6","userid","user","enabled","push","removeUserGroup","_ref7","indexOf","addUserSubAdmin","_ref8","subadmin","removeUserSubAdmin","_ref9","deleteUser","userIndex","this","commit","actionType","addUserData","response","ocs","enableDisableUser","_ref10","updateUserCounts","_ref11","recentGroup","disabledGroup","forEach","userGroup","warn","logger","setUserData","_ref12","key","value","humanValue","parseFileSize","resetUsers","setShowConfig","_ref13","setItem","JSON","stringify","setGroupSorting","sorting","oldValue","generateUrl","String","catch","showError","t","getters","getUsers","getGroups","getSubadminGroups","getSortedGroups","sort","a","b","numA","numB","localeCompare","getGroupSorting","getPasswordPolicyMinLength","getUsersOffset","getUsersLimit","getDisabledUsersOffset","getDisabledUsersLimit","getUserCount","getShowConfig","CancelToken","searchRequestCancelSource","actions","searchUsers","context","_ref14","offset","limit","search","api","generateOcsUrl","getUser","userId","_ref15","cancel","source","trim","encodeURIComponent","cancelToken","token","then","usersCount","keys","getRecentUsers","_ref16","getDisabledUsers","_ref17","_ref18","limitParam","getUsersFromList","_ref19","getUsersFromGroup","_ref20","groupid","groupId","getCapabilities","password_policy","minLength","_ref21","_ref22","_ref23","_ref24","_ref25","wipeUserDevices","Promise","reject","Error","addUser","_ref26","_ref27","dispatch","password","email","quota","language","manager","_ref28","userStatus","_ref29","allowedEmpty","sendWelcomeMail","apps","bundles","loadState","categories","updateCount","loading","gettingCategoriesPromise","APPS_API_FAILURE","message","isHTML","initCategories","updateCategories","categoriesPromise","setUpdateCount","addCategory","category","appendCategories","categoriesArray","setAllApps","setError","appId","Array","isArray","_id","app","clearError","enableApp","active","setInstallState","canInstall","disableApp","removable","canUnInstall","uninstallApp","needsDownload","installed","updateApp","version","update","resetApps","reset","startLoading","Vue","stopLoading","appIds","_appId","update_required","showInfo","onClick","window","location","reload","close","setTimeout","forceEnableApp","finally","getAllApps","getCategories","shouldRefetchCategories","arguments","undefined","categoriesPromiseResponse","getAppBundles","getUpdateCount","getCategoryById","selectedCategoryId","serverData","setServerData","getServerData","setAppConfig","use","Vuex","API_FAILURE","meta","store","useStore","Store","modules","settings","oc","strict","process","getLoggerBuilder","setApp","detectUser","_defineComponent","__name","setup","__props","__sfc","NcContent","_vm","_c","_self","_setupProxy","attrs","_v","path","components","default","UserManagement","navigation","UserManagementNavigation","props","children","redirect","AppStore","AppStoreNavigation","sidebar","AppStoreSidebar","Router","mode","base","linkActiveClass","routes","VTooltip","defaultHtml","sync","router","__webpack_nonce__","getCSPNonce","prototype","n","PiniaVuePlugin","pinia","createPinia","render","h","SettingsApp","el","cloneRoute","to","from","clone","hash","query","fullPath","freeze","exports","moduleName","registerModule","namespaced","currentRoute","transition","currentPath","isTimeTraveling","storeUnwatch","watch","route","afterEachUnHook","afterEach","unregisterModule","Permission","Permission2","defaultDavProperties","defaultDavNamespaces","d","nc","getDavProperties","_nc_dav_properties","prop","join","getDavNameSpaces","_nc_dav_namespaces","ns","davGetDefaultPropfind","davGetRecentSearch","lastModified","uid","FileType","FileType2","isDavRessource","davService","match","validateData","URL","startsWith","displayname","mtime","Date","crtime","mime","size","permissions","NONE","ALL","owner","attributes","root","service","status","NodeStatus","NodeStatus2","Node","_data","_attributes","_knownDavService","readonlyAttributes","entries","getOwnPropertyDescriptors","handler","set","target","Reflect","deleteProperty","receiver","constructor","Proxy","encodedSource","origin","slice","basename","extension","extname","dirname","split","pop","firstMatch","pathname","updateMtime","READ","fileid","move","destination","oldBasename","rename","basename2","TypeError","File","type","Folder","super","davRootPath","davRemoteURL","davGetRemoteURL","davGetClient","remoteURL","headers","client","setHeaders","requesttoken","patch","headers2","method","fetch","getFavoriteNodes","davClient","davRoot","controller","AbortController","CancelablePromise","async","resolve","onCancel","abort","getDirectoryContents","signal","details","includeSelf","node","filename","result","davResultToNode","filesRoot","permString","CREATE","UPDATE","DELETE","SHARE","davParsePermissions","nodeData","parse","lastmod","Number","parseInt","getcontentlength","FAILED","hasPreview","humanList","humanListBinary","formatFileSize","skipSmallSizes","binaryPrefixes","base1000","order","Math","floor","log","min","readableFormat","relativeSize","pow","toFixed","parseFloat","toLocaleString","forceBinary","toLocaleLowerCase","replaceAll","decimalString","round","k","m","g","p","toISOString","sortNodes","nodes","sortingOptions","sortingMode","sortingOrder","collection","identifiers2","orders","_","index","collator","Intl","Collator","numeric","usage","identifier","compare","sortFavoritesFirst","v","favorite","sortFoldersFirst","lastIndexOf","util$3","nameStartChar","nameRegexp","regexName","RegExp","isExist","isEmptyObject","obj","merge","arrayMode","len","i","getValue","isName","string","exec","getAllMatches","regex","matches","allmatches","startIndex","lastIndex","OptionsBuilder","defaultOptions$1","preserveOrder","attributeNamePrefix","attributesGroupName","textNodeName","ignoreAttributes","removeNSPrefix","allowBooleanAttributes","parseTagValue","parseAttributeValue","trimValues","cdataPropName","numberParseOptions","hex","leadingZeros","eNotation","tagValueProcessor","tagName","val2","attributeValueProcessor","attrName","stopNodes","alwaysCreateTextNode","commentPropName","unpairedTags","processEntities","htmlEntities","ignoreDeclaration","ignorePiTags","transformTagName","transformAttributeName","updateTag","jPath","buildOptions","defaultOptions","node2json","compress","arr","text","compressedObj","tagObj","property","propName$1","newJpath","isLeaf","isLeafTag","assignAttributes","hasOwnProperty","attrMap","jpath","atrrName","propCount","prettify","arrToStr","indentation","xmlStr","isPreviousElementTag","propName","newJPath","tagText","isStopNode","replaceEntitiesValue","attStr2","attr_to_str","tempInd","piTextNodeName","newIdentation","indentBy","tagStart","tagValue","suppressUnpairedNode","suppressEmptyNode","endsWith","attrStr","attr","attrVal","suppressBooleanAttributes","substr","textValue","entities","entity","val","buildFromOrderedJs","jArray","format","oneListGroup","Builder","isAttribute","attrPrefixLen","processTextOrObjNode","indentate","tagEndChar","newLine","object","level","j2x","buildTextValNode","buildObjectNode","repeat","jObj","arrayNodeName","call","buildAttrPairStr","newval","arrLen","listTagVal","listTagAttr","j","item","Ks","L","closeTag","tagEndExp","piClosingChar","debug_1","env","NODE_DEBUG","test","args","constants","MAX_LENGTH","MAX_SAFE_COMPONENT_LENGTH","MAX_SAFE_BUILD_LENGTH","MAX_LENGTH$1","MAX_SAFE_INTEGER","RELEASE_TYPES","SEMVER_SPEC_VERSION","FLAG_INCLUDE_PRERELEASE","FLAG_LOOSE","re$1","module","MAX_SAFE_COMPONENT_LENGTH2","MAX_SAFE_BUILD_LENGTH2","MAX_LENGTH2","debug2","re2","re","safeRe","src","t2","R","LETTERDASHNUMBER","safeRegexReplacements","createToken","isGlobal","safe","max","makeSafeRegex","NUMERICIDENTIFIER","NUMERICIDENTIFIERLOOSE","NONNUMERICIDENTIFIER","PRERELEASEIDENTIFIER","PRERELEASEIDENTIFIERLOOSE","BUILDIDENTIFIER","MAINVERSION","PRERELEASE","BUILD","FULLPLAIN","MAINVERSIONLOOSE","PRERELEASELOOSE","LOOSEPLAIN","XRANGEIDENTIFIER","XRANGEIDENTIFIERLOOSE","GTLT","XRANGEPLAIN","XRANGEPLAINLOOSE","COERCEPLAIN","COERCE","COERCEFULL","LONETILDE","tildeTrimReplace","LONECARET","caretTrimReplace","comparatorTrimReplace","reExports","loose","compareIdentifiers$1","anum","bnum","identifiers","compareIdentifiers","rcompareIdentifiers","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","loaded","__webpack_modules__","O","chunkIds","fn","priority","notFulfilled","Infinity","fulfilled","every","r","getter","__esModule","definition","o","defineProperty","enumerable","f","chunkId","all","reduce","promises","u","globalThis","Function","l","done","script","needAttach","scripts","document","getElementsByTagName","s","getAttribute","createElement","charset","timeout","setAttribute","onScriptComplete","prev","event","onerror","onload","clearTimeout","doneFns","parentNode","removeChild","bind","head","appendChild","Symbol","toStringTag","nmd","paths","scriptUrl","importScripts","currentScript","toUpperCase","baseURI","self","href","installedChunks","installedChunkData","promise","errorType","realSrc","request","webpackJsonpCallback","parentChunkLoadingFunction","moreModules","runtime","some","chunkLoadingGlobal","__webpack_exports__"],"sourceRoot":""} \ No newline at end of file
+{"version":3,"file":"settings-vue-settings-apps-users-management.js?v=c65cbb5872f6e7777ff8","mappings":"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","sources":["webpack:///nextcloud/webpack/runtime/chunk loaded","webpack:///nextcloud/webpack/runtime/load script","webpack:///nextcloud/apps/settings/src/store/api.js","webpack:///nextcloud/apps/settings/src/store/users.js","webpack:///nextcloud/apps/settings/src/store/apps.js","webpack:///nextcloud/apps/settings/src/store/users-settings.js","webpack:///nextcloud/apps/settings/src/store/oc.js","webpack:///nextcloud/apps/settings/src/store/index.js","webpack:///nextcloud/apps/settings/src/constants/GroupManagement.ts","webpack:///nextcloud/apps/settings/src/logger.ts","webpack:///nextcloud/apps/settings/src/views/SettingsApp.vue","webpack:///nextcloud/apps/settings/src/views/SettingsApp.vue?vue&type=script&setup=true&lang=ts","webpack://nextcloud/./apps/settings/src/views/SettingsApp.vue?3a67","webpack:///nextcloud/apps/settings/src/router/routes.ts","webpack:///nextcloud/apps/settings/src/router/index.ts","webpack:///nextcloud/apps/settings/src/main-apps-users-management.ts","webpack:///nextcloud/node_modules/vuex-router-sync/index.js","webpack:///nextcloud/node_modules/@nextcloud/files/dist/index.mjs","webpack:///nextcloud/webpack/bootstrap","webpack:///nextcloud/webpack/runtime/compat get default export","webpack:///nextcloud/webpack/runtime/define property getters","webpack:///nextcloud/webpack/runtime/ensure chunk","webpack:///nextcloud/webpack/runtime/get javascript chunk filename","webpack:///nextcloud/webpack/runtime/global","webpack:///nextcloud/webpack/runtime/hasOwnProperty shorthand","webpack:///nextcloud/webpack/runtime/make namespace object","webpack:///nextcloud/webpack/runtime/node module decorator","webpack:///nextcloud/webpack/runtime/runtimeId","webpack:///nextcloud/webpack/runtime/publicPath","webpack:///nextcloud/webpack/runtime/jsonp chunk loading","webpack:///nextcloud/webpack/runtime/nonce","webpack:///nextcloud/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = (result, chunkIds, fn, priority) => {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar chunkIds = deferred[i][0];\n\t\tvar fn = deferred[i][1];\n\t\tvar priority = deferred[i][2];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","var inProgress = {};\nvar dataWebpackPrefix = \"nextcloud:\";\n// loadScript function to load a script via script tag\n__webpack_require__.l = (url, done, key, chunkId) => {\n\tif(inProgress[url]) { inProgress[url].push(done); return; }\n\tvar script, needAttach;\n\tif(key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor(var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif(s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) { script = s; break; }\n\t\t}\n\t}\n\tif(!script) {\n\t\tneedAttach = true;\n\t\tscript = document.createElement('script');\n\n\t\tscript.charset = 'utf-8';\n\t\tscript.timeout = 120;\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n\n\t\tscript.src = url;\n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = (prev, event) => {\n\t\t// avoid mem leaks in IE.\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns && doneFns.forEach((fn) => (fn(event)));\n\t\tif(prev) return prev(event);\n\t}\n\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};","/**\n * SPDX-FileCopyrightText: 2018 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport axios from '@nextcloud/axios'\nimport { confirmPassword } from '@nextcloud/password-confirmation'\nimport '@nextcloud/password-confirmation/dist/style.css'\n\nconst sanitize = function(url) {\n\treturn url.replace(/\\/$/, '') // Remove last url slash\n}\n\nexport default {\n\n\t/**\n\t * This Promise is used to chain a request that require an admin password confirmation\n\t * Since chaining Promise have a very precise behavior concerning catch and then,\n\t * you'll need to be careful when using it.\n\t * e.g\n\t * // store\n\t * action(context) {\n\t * return api.requireAdmin().then((response) => {\n\t * return api.get('url')\n\t * .then((response) => {API success})\n\t * .catch((error) => {API failure});\n\t * }).catch((error) => {requireAdmin failure});\n\t * }\n\t * // vue\n\t * this.$store.dispatch('action').then(() => {always executed})\n\t *\n\t * Since Promise.then().catch().then() will always execute the last then\n\t * this.$store.dispatch('action').then will always be executed\n\t *\n\t * If you want requireAdmin failure to also catch the API request failure\n\t * you will need to throw a new error in the api.get.catch()\n\t *\n\t * e.g\n\t * api.requireAdmin().then((response) => {\n\t * api.get('url')\n\t * .then((response) => {API success})\n\t * .catch((error) => {throw error;});\n\t * }).catch((error) => {requireAdmin OR API failure});\n\t *\n\t * @return {Promise}\n\t */\n\trequireAdmin() {\n\t\treturn confirmPassword()\n\t},\n\tget(url, options) {\n\t\treturn axios.get(sanitize(url), options)\n\t},\n\tpost(url, data) {\n\t\treturn axios.post(sanitize(url), data)\n\t},\n\tpatch(url, data) {\n\t\treturn axios.patch(sanitize(url), data)\n\t},\n\tput(url, data) {\n\t\treturn axios.put(sanitize(url), data)\n\t},\n\tdelete(url, data) {\n\t\treturn axios.delete(sanitize(url), { params: data })\n\t},\n}\n","/**\n * SPDX-FileCopyrightText: 2018 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport { getBuilder } from '@nextcloud/browser-storage'\nimport { getCapabilities } from '@nextcloud/capabilities'\nimport { parseFileSize } from '@nextcloud/files'\nimport { showError } from '@nextcloud/dialogs'\nimport { generateOcsUrl, generateUrl } from '@nextcloud/router'\nimport axios from '@nextcloud/axios'\n\nimport { GroupSorting } from '../constants/GroupManagement.ts'\nimport api from './api.js'\nimport logger from '../logger.ts'\n\nconst localStorage = getBuilder('settings').persist(true).build()\n\nconst defaults = {\n\tgroup: {\n\t\tid: '',\n\t\tname: '',\n\t\tusercount: 0,\n\t\tdisabled: 0,\n\t\tcanAdd: true,\n\t\tcanRemove: true,\n\t},\n}\n\nconst state = {\n\tusers: [],\n\tgroups: [],\n\torderBy: GroupSorting.UserCount,\n\tminPasswordLength: 0,\n\tusersOffset: 0,\n\tusersLimit: 25,\n\tdisabledUsersOffset: 0,\n\tdisabledUsersLimit: 25,\n\tuserCount: 0,\n\tshowConfig: {\n\t\tshowStoragePath: localStorage.getItem('account_settings__showStoragePath') === 'true',\n\t\tshowUserBackend: localStorage.getItem('account_settings__showUserBackend') === 'true',\n\t\tshowLastLogin: localStorage.getItem('account_settings__showLastLogin') === 'true',\n\t\tshowNewUserForm: localStorage.getItem('account_settings__showNewUserForm') === 'true',\n\t\tshowLanguages: localStorage.getItem('account_settings__showLanguages') === 'true',\n\t},\n}\n\nconst mutations = {\n\tappendUsers(state, usersObj) {\n\t\tconst existingUsers = state.users.map(({ id }) => id)\n\t\tconst newUsers = Object.values(usersObj)\n\t\t\t.filter(({ id }) => !existingUsers.includes(id))\n\n\t\tconst users = state.users.concat(newUsers)\n\t\tstate.usersOffset += state.usersLimit\n\t\tstate.users = users\n\t},\n\tupdateDisabledUsers(state, _usersObj) {\n\t\tstate.disabledUsersOffset += state.disabledUsersLimit\n\t},\n\tsetPasswordPolicyMinLength(state, length) {\n\t\tstate.minPasswordLength = length !== '' ? length : 0\n\t},\n\tinitGroups(state, { groups, orderBy, userCount }) {\n\t\tstate.groups = groups.map(group => Object.assign({}, defaults.group, group))\n\t\tstate.orderBy = orderBy\n\t\tstate.userCount = userCount\n\t},\n\taddGroup(state, { gid, displayName }) {\n\t\ttry {\n\t\t\tif (typeof state.groups.find((group) => group.id === gid) !== 'undefined') {\n\t\t\t\treturn\n\t\t\t}\n\t\t\t// extend group to default values\n\t\t\tconst group = Object.assign({}, defaults.group, {\n\t\t\t\tid: gid,\n\t\t\t\tname: displayName,\n\t\t\t})\n\t\t\tstate.groups.unshift(group)\n\t\t} catch (e) {\n\t\t\tconsole.error('Can\\'t create group', e)\n\t\t}\n\t},\n\trenameGroup(state, { gid, displayName }) {\n\t\tconst groupIndex = state.groups.findIndex(groupSearch => groupSearch.id === gid)\n\t\tif (groupIndex >= 0) {\n\t\t\tconst updatedGroup = state.groups[groupIndex]\n\t\t\tupdatedGroup.name = displayName\n\t\t\tstate.groups.splice(groupIndex, 1, updatedGroup)\n\t\t}\n\t},\n\tremoveGroup(state, gid) {\n\t\tconst groupIndex = state.groups.findIndex(groupSearch => groupSearch.id === gid)\n\t\tif (groupIndex >= 0) {\n\t\t\tstate.groups.splice(groupIndex, 1)\n\t\t}\n\t},\n\taddUserGroup(state, { userid, gid }) {\n\t\tconst group = state.groups.find(groupSearch => groupSearch.id === gid)\n\t\tconst user = state.users.find(user => user.id === userid)\n\t\t// increase count if user is enabled\n\t\tif (group && user.enabled && state.userCount > 0) {\n\t\t\tgroup.usercount++\n\t\t}\n\t\tconst groups = user.groups\n\t\tgroups.push(gid)\n\t},\n\tremoveUserGroup(state, { userid, gid }) {\n\t\tconst group = state.groups.find(groupSearch => groupSearch.id === gid)\n\t\tconst user = state.users.find(user => user.id === userid)\n\t\t// lower count if user is enabled\n\t\tif (group && user.enabled && state.userCount > 0) {\n\t\t\tgroup.usercount--\n\t\t}\n\t\tconst groups = user.groups\n\t\tgroups.splice(groups.indexOf(gid), 1)\n\t},\n\taddUserSubAdmin(state, { userid, gid }) {\n\t\tconst groups = state.users.find(user => user.id === userid).subadmin\n\t\tgroups.push(gid)\n\t},\n\tremoveUserSubAdmin(state, { userid, gid }) {\n\t\tconst groups = state.users.find(user => user.id === userid).subadmin\n\t\tgroups.splice(groups.indexOf(gid), 1)\n\t},\n\tdeleteUser(state, userid) {\n\t\tconst userIndex = state.users.findIndex(user => user.id === userid)\n\t\tthis.commit('updateUserCounts', { user: state.users[userIndex], actionType: 'remove' })\n\t\tstate.users.splice(userIndex, 1)\n\t},\n\taddUserData(state, response) {\n\t\tconst user = response.data.ocs.data\n\t\tstate.users.unshift(user)\n\t\tthis.commit('updateUserCounts', { user, actionType: 'create' })\n\t},\n\tenableDisableUser(state, { userid, enabled }) {\n\t\tconst user = state.users.find(user => user.id === userid)\n\t\tuser.enabled = enabled\n\t\tthis.commit('updateUserCounts', { user, actionType: enabled ? 'enable' : 'disable' })\n\t},\n\t// update active/disabled counts, groups counts\n\tupdateUserCounts(state, { user, actionType }) {\n\t\t// 0 is a special value\n\t\tif (state.userCount === 0) {\n\t\t\treturn\n\t\t}\n\n\t\tconst recentGroup = state.groups.find(group => group.id === '__nc_internal_recent')\n\t\tconst disabledGroup = state.groups.find(group => group.id === 'disabled')\n\t\tswitch (actionType) {\n\t\tcase 'enable':\n\t\tcase 'disable':\n\t\t\tdisabledGroup.usercount += user.enabled ? -1 : 1 // update Disabled Users count\n\t\t\trecentGroup.usercount += user.enabled ? 1 : -1\n\t\t\tstate.userCount += user.enabled ? 1 : -1 // update Active Users count\n\t\t\tuser.groups.forEach(userGroup => {\n\t\t\t\tconst group = state.groups.find(groupSearch => groupSearch.id === userGroup)\n\t\t\t\tgroup.disabled += user.enabled ? -1 : 1 // update group disabled count\n\t\t\t})\n\t\t\tbreak\n\t\tcase 'create':\n\t\t\trecentGroup.usercount++\n\t\t\tstate.userCount++ // increment Active Users count\n\n\t\t\tuser.groups.forEach(userGroup => {\n\t\t\t\tstate.groups\n\t\t\t\t\t.find(groupSearch => groupSearch.id === userGroup)\n\t\t\t\t .usercount++ // increment group total count\n\t\t\t})\n\t\t\tbreak\n\t\tcase 'remove':\n\t\t\tif (user.enabled) {\n\t\t\t\trecentGroup.usercount--\n\t\t\t\tstate.userCount-- // decrement Active Users count\n\t\t\t\tuser.groups.forEach(userGroup => {\n\t\t\t\t\tconst group = state.groups.find(groupSearch => groupSearch.id === userGroup)\n\t\t\t\t\tif (!group) {\n\t\t\t\t\t\tconsole.warn('User group ' + userGroup + ' does not exist during user removal')\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t\tgroup.usercount-- // decrement group total count\n\t\t\t\t})\n\t\t\t} else {\n\t\t\t\tdisabledGroup.usercount-- // decrement Disabled Users count\n\t\t\t\tuser.groups.forEach(userGroup => {\n\t\t\t\t\tconst group = state.groups.find(groupSearch => groupSearch.id === userGroup)\n\t\t\t\t\tgroup.disabled-- // decrement group disabled count\n\t\t\t\t})\n\t\t\t}\n\t\t\tbreak\n\t\tdefault:\n\t\t\tlogger.error(`Unknown action type in updateUserCounts: '${actionType}'`)\n\t\t\t// not throwing error to interrupt execution as this is not fatal\n\t\t}\n\t},\n\tsetUserData(state, { userid, key, value }) {\n\t\tif (key === 'quota') {\n\t\t\tconst humanValue = parseFileSize(value, true)\n\t\t\tstate.users.find(user => user.id === userid)[key][key] = humanValue !== null ? humanValue : value\n\t\t} else {\n\t\t\tstate.users.find(user => user.id === userid)[key] = value\n\t\t}\n\t},\n\n\t/**\n\t * Reset users list\n\t *\n\t * @param {object} state the store state\n\t */\n\tresetUsers(state) {\n\t\tstate.users = []\n\t\tstate.usersOffset = 0\n\t\tstate.disabledUsersOffset = 0\n\t},\n\n\tsetShowConfig(state, { key, value }) {\n\t\tlocalStorage.setItem(`account_settings__${key}`, JSON.stringify(value))\n\t\tstate.showConfig[key] = value\n\t},\n\n\tsetGroupSorting(state, sorting) {\n\t\tconst oldValue = state.orderBy\n\t\tstate.orderBy = sorting\n\n\t\t// Persist the value on the server\n\t\taxios.post(\n\t\t\tgenerateUrl('/settings/users/preferences/group.sortBy'),\n\t\t\t{\n\t\t\t\tvalue: String(sorting),\n\t\t\t},\n\t\t).catch((error) => {\n\t\t\tstate.orderBy = oldValue\n\t\t\tshowError(t('settings', 'Could not set group sorting'))\n\t\t\tlogger.error(error)\n\t\t})\n\t},\n}\n\nconst getters = {\n\tgetUsers(state) {\n\t\treturn state.users\n\t},\n\tgetGroups(state) {\n\t\treturn state.groups\n\t},\n\tgetSubadminGroups(state) {\n\t\t// Can't be subadmin of admin, recent, or disabled\n\t\treturn state.groups.filter(group => group.id !== 'admin' && group.id !== '__nc_internal_recent' && group.id !== 'disabled')\n\t},\n\tgetSortedGroups(state) {\n\t\tconst groups = [...state.groups]\n\t\tif (state.orderBy === GroupSorting.UserCount) {\n\t\t\treturn groups.sort((a, b) => {\n\t\t\t\tconst numA = a.usercount - a.disabled\n\t\t\t\tconst numB = b.usercount - b.disabled\n\t\t\t\treturn (numA < numB) ? 1 : (numB < numA ? -1 : a.name.localeCompare(b.name))\n\t\t\t})\n\t\t} else {\n\t\t\treturn groups.sort((a, b) => a.name.localeCompare(b.name))\n\t\t}\n\t},\n\tgetGroupSorting(state) {\n\t\treturn state.orderBy\n\t},\n\tgetPasswordPolicyMinLength(state) {\n\t\treturn state.minPasswordLength\n\t},\n\tgetUsersOffset(state) {\n\t\treturn state.usersOffset\n\t},\n\tgetUsersLimit(state) {\n\t\treturn state.usersLimit\n\t},\n\tgetDisabledUsersOffset(state) {\n\t\treturn state.disabledUsersOffset\n\t},\n\tgetDisabledUsersLimit(state) {\n\t\treturn state.disabledUsersLimit\n\t},\n\tgetUserCount(state) {\n\t\treturn state.userCount\n\t},\n\tgetShowConfig(state) {\n\t\treturn state.showConfig\n\t},\n}\n\nconst CancelToken = axios.CancelToken\nlet searchRequestCancelSource = null\n\nconst actions = {\n\n\t/**\n\t * search users\n\t *\n\t * @param {object} context store context\n\t * @param {object} options destructuring object\n\t * @param {number} options.offset List offset to request\n\t * @param {number} options.limit List number to return from offset\n\t * @param {string} options.search Search amongst users\n\t * @return {Promise}\n\t */\n\tsearchUsers(context, { offset, limit, search }) {\n\t\tsearch = typeof search === 'string' ? search : ''\n\n\t\treturn api.get(generateOcsUrl('cloud/users/details?offset={offset}&limit={limit}&search={search}', { offset, limit, search })).catch((error) => {\n\t\t\tif (!axios.isCancel(error)) {\n\t\t\t\tcontext.commit('API_FAILURE', error)\n\t\t\t}\n\t\t})\n\t},\n\n\t/**\n\t * Get user details\n\t *\n\t * @param {object} context store context\n\t * @param {string} userId user id\n\t * @return {Promise}\n\t */\n\tgetUser(context, userId) {\n\t\treturn api.get(generateOcsUrl(`cloud/users/${userId}`)).catch((error) => {\n\t\t\tif (!axios.isCancel(error)) {\n\t\t\t\tcontext.commit('API_FAILURE', error)\n\t\t\t}\n\t\t})\n\t},\n\n\t/**\n\t * Get all users with full details\n\t *\n\t * @param {object} context store context\n\t * @param {object} options destructuring object\n\t * @param {number} options.offset List offset to request\n\t * @param {number} options.limit List number to return from offset\n\t * @param {string} options.search Search amongst users\n\t * @param {string} options.group Get users from group\n\t * @return {Promise}\n\t */\n\tgetUsers(context, { offset, limit, search, group }) {\n\t\tif (searchRequestCancelSource) {\n\t\t\tsearchRequestCancelSource.cancel('Operation canceled by another search request.')\n\t\t}\n\t\tsearchRequestCancelSource = CancelToken.source()\n\t\tsearch = typeof search === 'string' ? search : ''\n\n\t\t/**\n\t\t * Adding filters in the search bar such as in:files, in:users, etc.\n\t\t * collides with this particular search, so we need to remove them\n\t\t * here and leave only the original search query\n\t\t */\n\t\tsearch = search.replace(/in:[^\\s]+/g, '').trim()\n\n\t\tgroup = typeof group === 'string' ? group : ''\n\t\tif (group !== '') {\n\t\t\treturn api.get(generateOcsUrl('cloud/groups/{group}/users/details?offset={offset}&limit={limit}&search={search}', { group: encodeURIComponent(group), offset, limit, search }), {\n\t\t\t\tcancelToken: searchRequestCancelSource.token,\n\t\t\t})\n\t\t\t\t.then((response) => {\n\t\t\t\t\tconst usersCount = Object.keys(response.data.ocs.data.users).length\n\t\t\t\t\tif (usersCount > 0) {\n\t\t\t\t\t\tcontext.commit('appendUsers', response.data.ocs.data.users)\n\t\t\t\t\t}\n\t\t\t\t\treturn usersCount\n\t\t\t\t})\n\t\t\t\t.catch((error) => {\n\t\t\t\t\tif (!axios.isCancel(error)) {\n\t\t\t\t\t\tcontext.commit('API_FAILURE', error)\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t}\n\n\t\treturn api.get(generateOcsUrl('cloud/users/details?offset={offset}&limit={limit}&search={search}', { offset, limit, search }), {\n\t\t\tcancelToken: searchRequestCancelSource.token,\n\t\t})\n\t\t\t.then((response) => {\n\t\t\t\tconst usersCount = Object.keys(response.data.ocs.data.users).length\n\t\t\t\tif (usersCount > 0) {\n\t\t\t\t\tcontext.commit('appendUsers', response.data.ocs.data.users)\n\t\t\t\t}\n\t\t\t\treturn usersCount\n\t\t\t})\n\t\t\t.catch((error) => {\n\t\t\t\tif (!axios.isCancel(error)) {\n\t\t\t\t\tcontext.commit('API_FAILURE', error)\n\t\t\t\t}\n\t\t\t})\n\t},\n\n\t/**\n\t * Get recent users with full details\n\t *\n\t * @param {object} context store context\n\t * @param {object} options destructuring object\n\t * @param {number} options.offset List offset to request\n\t * @param {number} options.limit List number to return from offset\n\t * @param {string} options.search Search query\n\t * @return {Promise<number>}\n\t */\n\tasync getRecentUsers(context, { offset, limit, search }) {\n\t\tconst url = generateOcsUrl('cloud/users/recent?offset={offset}&limit={limit}&search={search}', { offset, limit, search })\n\t\ttry {\n\t\t\tconst response = await api.get(url)\n\t\t\tconst usersCount = Object.keys(response.data.ocs.data.users).length\n\t\t\tif (usersCount > 0) {\n\t\t\t\tcontext.commit('appendUsers', response.data.ocs.data.users)\n\t\t\t}\n\t\t\treturn usersCount\n\t\t} catch (error) {\n\t\t\tcontext.commit('API_FAILURE', error)\n\t\t}\n\t},\n\n\t/**\n\t * Get disabled users with full details\n\t *\n\t * @param {object} context store context\n\t * @param {object} options destructuring object\n\t * @param {number} options.offset List offset to request\n\t * @param {number} options.limit List number to return from offset\n\t * @param options.search\n\t * @return {Promise<number>}\n\t */\n\tasync getDisabledUsers(context, { offset, limit, search }) {\n\t\tconst url = generateOcsUrl('cloud/users/disabled?offset={offset}&limit={limit}&search={search}', { offset, limit, search })\n\t\ttry {\n\t\t\tconst response = await api.get(url)\n\t\t\tconst usersCount = Object.keys(response.data.ocs.data.users).length\n\t\t\tif (usersCount > 0) {\n\t\t\t\tcontext.commit('appendUsers', response.data.ocs.data.users)\n\t\t\t\tcontext.commit('updateDisabledUsers', response.data.ocs.data.users)\n\t\t\t}\n\t\t\treturn usersCount\n\t\t} catch (error) {\n\t\t\tcontext.commit('API_FAILURE', error)\n\t\t}\n\t},\n\n\tgetGroups(context, { offset, limit, search }) {\n\t\tsearch = typeof search === 'string' ? search : ''\n\t\tconst limitParam = limit === -1 ? '' : `&limit=${limit}`\n\t\treturn api.get(generateOcsUrl('cloud/groups?offset={offset}&search={search}', { offset, search }) + limitParam)\n\t\t\t.then((response) => {\n\t\t\t\tif (Object.keys(response.data.ocs.data.groups).length > 0) {\n\t\t\t\t\tresponse.data.ocs.data.groups.forEach(function(group) {\n\t\t\t\t\t\tcontext.commit('addGroup', { gid: group, displayName: group })\n\t\t\t\t\t})\n\t\t\t\t\treturn true\n\t\t\t\t}\n\t\t\t\treturn false\n\t\t\t})\n\t\t\t.catch((error) => context.commit('API_FAILURE', error))\n\t},\n\n\t/**\n\t * Get all users with full details\n\t *\n\t * @param {object} context store context\n\t * @param {object} options destructuring object\n\t * @param {number} options.offset List offset to request\n\t * @param {number} options.limit List number to return from offset\n\t * @param {string} options.search -\n\t * @return {Promise}\n\t */\n\tgetUsersFromList(context, { offset, limit, search }) {\n\t\tsearch = typeof search === 'string' ? search : ''\n\t\treturn api.get(generateOcsUrl('cloud/users/details?offset={offset}&limit={limit}&search={search}', { offset, limit, search }))\n\t\t\t.then((response) => {\n\t\t\t\tif (Object.keys(response.data.ocs.data.users).length > 0) {\n\t\t\t\t\tcontext.commit('appendUsers', response.data.ocs.data.users)\n\t\t\t\t\treturn true\n\t\t\t\t}\n\t\t\t\treturn false\n\t\t\t})\n\t\t\t.catch((error) => context.commit('API_FAILURE', error))\n\t},\n\n\t/**\n\t * Get all users with full details from a groupid\n\t *\n\t * @param {object} context store context\n\t * @param {object} options destructuring object\n\t * @param {number} options.offset List offset to request\n\t * @param {number} options.limit List number to return from offset\n\t * @param {string} options.groupid -\n\t * @return {Promise}\n\t */\n\tgetUsersFromGroup(context, { groupid, offset, limit }) {\n\t\treturn api.get(generateOcsUrl('cloud/users/{groupId}/details?offset={offset}&limit={limit}', { groupId: encodeURIComponent(groupid), offset, limit }))\n\t\t\t.then((response) => context.commit('getUsersFromList', response.data.ocs.data.users))\n\t\t\t.catch((error) => context.commit('API_FAILURE', error))\n\t},\n\n\tgetPasswordPolicyMinLength(context) {\n\t\tif (getCapabilities().password_policy && getCapabilities().password_policy.minLength) {\n\t\t\tcontext.commit('setPasswordPolicyMinLength', getCapabilities().password_policy.minLength)\n\t\t\treturn getCapabilities().password_policy.minLength\n\t\t}\n\t\treturn false\n\t},\n\n\t/**\n\t * Add group\n\t *\n\t * @param {object} context store context\n\t * @param {string} gid Group id\n\t * @return {Promise}\n\t */\n\taddGroup(context, gid) {\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\treturn api.post(generateOcsUrl('cloud/groups'), { groupid: gid })\n\t\t\t\t.then((response) => {\n\t\t\t\t\tcontext.commit('addGroup', { gid, displayName: gid })\n\t\t\t\t\treturn { gid, displayName: gid }\n\t\t\t\t})\n\t\t\t\t.catch((error) => { throw error })\n\t\t}).catch((error) => {\n\t\t\tcontext.commit('API_FAILURE', { gid, error })\n\t\t\t// let's throw one more time to prevent the view\n\t\t\t// from adding the user to a group that doesn't exists\n\t\t\tthrow error\n\t\t})\n\t},\n\n\t/**\n\t * Rename group\n\t *\n\t * @param {object} context store context\n\t * @param {string} groupid Group id\n\t * @param {string} displayName Group display name\n\t * @return {Promise}\n\t */\n\trenameGroup(context, { groupid, displayName }) {\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\treturn api.put(generateOcsUrl('cloud/groups/{groupId}', { groupId: encodeURIComponent(groupid) }), { key: 'displayname', value: displayName })\n\t\t\t\t.then((response) => {\n\t\t\t\t\tcontext.commit('renameGroup', { gid: groupid, displayName })\n\t\t\t\t\treturn { groupid, displayName }\n\t\t\t\t})\n\t\t\t\t.catch((error) => { throw error })\n\t\t}).catch((error) => {\n\t\t\tcontext.commit('API_FAILURE', { groupid, error })\n\t\t\t// let's throw one more time to prevent the view\n\t\t\t// from renaming the group\n\t\t\tthrow error\n\t\t})\n\t},\n\n\t/**\n\t * Remove group\n\t *\n\t * @param {object} context store context\n\t * @param {string} gid Group id\n\t * @return {Promise}\n\t */\n\tremoveGroup(context, gid) {\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\treturn api.delete(generateOcsUrl('cloud/groups/{groupId}', { groupId: encodeURIComponent(gid) }))\n\t\t\t\t.then((response) => context.commit('removeGroup', gid))\n\t\t\t\t.catch((error) => { throw error })\n\t\t}).catch((error) => context.commit('API_FAILURE', { gid, error }))\n\t},\n\n\t/**\n\t * Add user to group\n\t *\n\t * @param {object} context store context\n\t * @param {object} options destructuring object\n\t * @param {string} options.userid User id\n\t * @param {string} options.gid Group id\n\t * @return {Promise}\n\t */\n\taddUserGroup(context, { userid, gid }) {\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\treturn api.post(generateOcsUrl('cloud/users/{userid}/groups', { userid }), { groupid: gid })\n\t\t\t\t.then((response) => context.commit('addUserGroup', { userid, gid }))\n\t\t\t\t.catch((error) => { throw error })\n\t\t}).catch((error) => context.commit('API_FAILURE', { userid, error }))\n\t},\n\n\t/**\n\t * Remove user from group\n\t *\n\t * @param {object} context store context\n\t * @param {object} options destructuring object\n\t * @param {string} options.userid User id\n\t * @param {string} options.gid Group id\n\t * @return {Promise}\n\t */\n\tremoveUserGroup(context, { userid, gid }) {\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\treturn api.delete(generateOcsUrl('cloud/users/{userid}/groups', { userid }), { groupid: gid })\n\t\t\t\t.then((response) => context.commit('removeUserGroup', { userid, gid }))\n\t\t\t\t.catch((error) => { throw error })\n\t\t}).catch((error) => {\n\t\t\tcontext.commit('API_FAILURE', { userid, error })\n\t\t\t// let's throw one more time to prevent\n\t\t\t// the view from removing the user row on failure\n\t\t\tthrow error\n\t\t})\n\t},\n\n\t/**\n\t * Add user to group admin\n\t *\n\t * @param {object} context store context\n\t * @param {object} options destructuring object\n\t * @param {string} options.userid User id\n\t * @param {string} options.gid Group id\n\t * @return {Promise}\n\t */\n\taddUserSubAdmin(context, { userid, gid }) {\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\treturn api.post(generateOcsUrl('cloud/users/{userid}/subadmins', { userid }), { groupid: gid })\n\t\t\t\t.then((response) => context.commit('addUserSubAdmin', { userid, gid }))\n\t\t\t\t.catch((error) => { throw error })\n\t\t}).catch((error) => context.commit('API_FAILURE', { userid, error }))\n\t},\n\n\t/**\n\t * Remove user from group admin\n\t *\n\t * @param {object} context store context\n\t * @param {object} options destructuring object\n\t * @param {string} options.userid User id\n\t * @param {string} options.gid Group id\n\t * @return {Promise}\n\t */\n\tremoveUserSubAdmin(context, { userid, gid }) {\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\treturn api.delete(generateOcsUrl('cloud/users/{userid}/subadmins', { userid }), { groupid: gid })\n\t\t\t\t.then((response) => context.commit('removeUserSubAdmin', { userid, gid }))\n\t\t\t\t.catch((error) => { throw error })\n\t\t}).catch((error) => context.commit('API_FAILURE', { userid, error }))\n\t},\n\n\t/**\n\t * Mark all user devices for remote wipe\n\t *\n\t * @param {object} context store context\n\t * @param {string} userid User id\n\t * @return {Promise}\n\t */\n\tasync wipeUserDevices(context, userid) {\n\t\ttry {\n\t\t\tawait api.requireAdmin()\n\t\t\treturn await api.post(generateOcsUrl('cloud/users/{userid}/wipe', { userid }))\n\t\t} catch (error) {\n\t\t\tcontext.commit('API_FAILURE', { userid, error })\n\t\t\treturn Promise.reject(new Error('Failed to wipe user devices'))\n\t\t}\n\t},\n\n\t/**\n\t * Delete a user\n\t *\n\t * @param {object} context store context\n\t * @param {string} userid User id\n\t * @return {Promise}\n\t */\n\tdeleteUser(context, userid) {\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\treturn api.delete(generateOcsUrl('cloud/users/{userid}', { userid }))\n\t\t\t\t.then((response) => context.commit('deleteUser', userid))\n\t\t\t\t.catch((error) => { throw error })\n\t\t}).catch((error) => context.commit('API_FAILURE', { userid, error }))\n\t},\n\n\t/**\n\t * Add a user\n\t *\n\t * @param {object} context store context\n\t * @param {Function} context.commit -\n\t * @param {Function} context.dispatch -\n\t * @param {object} options destructuring object\n\t * @param {string} options.userid User id\n\t * @param {string} options.password User password\n\t * @param {string} options.displayName User display name\n\t * @param {string} options.email User email\n\t * @param {string} options.groups User groups\n\t * @param {string} options.subadmin User subadmin groups\n\t * @param {string} options.quota User email\n\t * @param {string} options.language User language\n\t * @param {string} options.manager User manager\n\t * @return {Promise}\n\t */\n\taddUser({ commit, dispatch }, { userid, password, displayName, email, groups, subadmin, quota, language, manager }) {\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\treturn api.post(generateOcsUrl('cloud/users'), { userid, password, displayName, email, groups, subadmin, quota, language, manager })\n\t\t\t\t.then((response) => dispatch('addUserData', userid || response.data.ocs.data.id))\n\t\t\t\t.catch((error) => { throw error })\n\t\t}).catch((error) => {\n\t\t\tcommit('API_FAILURE', { userid, error })\n\t\t\tthrow error\n\t\t})\n\t},\n\n\t/**\n\t * Get user data and commit addition\n\t *\n\t * @param {object} context store context\n\t * @param {string} userid User id\n\t * @return {Promise}\n\t */\n\taddUserData(context, userid) {\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\treturn api.get(generateOcsUrl('cloud/users/{userid}', { userid }))\n\t\t\t\t.then((response) => context.commit('addUserData', response))\n\t\t\t\t.catch((error) => { throw error })\n\t\t}).catch((error) => context.commit('API_FAILURE', { userid, error }))\n\t},\n\n\t/**\n\t * Enable or disable user\n\t *\n\t * @param {object} context store context\n\t * @param {object} options destructuring object\n\t * @param {string} options.userid User id\n\t * @param {boolean} options.enabled User enablement status\n\t * @return {Promise}\n\t */\n\tenableDisableUser(context, { userid, enabled = true }) {\n\t\tconst userStatus = enabled ? 'enable' : 'disable'\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\treturn api.put(generateOcsUrl('cloud/users/{userid}/{userStatus}', { userid, userStatus }))\n\t\t\t\t.then((response) => context.commit('enableDisableUser', { userid, enabled }))\n\t\t\t\t.catch((error) => { throw error })\n\t\t}).catch((error) => context.commit('API_FAILURE', { userid, error }))\n\t},\n\n\t/**\n\t * Edit user data\n\t *\n\t * @param {object} context store context\n\t * @param {object} options destructuring object\n\t * @param {string} options.userid User id\n\t * @param {string} options.key User field to edit\n\t * @param {string} options.value Value of the change\n\t * @return {Promise}\n\t */\n\tasync setUserData(context, { userid, key, value }) {\n\t\tconst allowedEmpty = ['email', 'displayname', 'manager']\n\t\tif (['email', 'language', 'quota', 'displayname', 'password', 'manager'].indexOf(key) !== -1) {\n\t\t\t// We allow empty email or displayname\n\t\t\tif (typeof value === 'string'\n\t\t\t\t&& (\n\t\t\t\t\t(allowedEmpty.indexOf(key) === -1 && value.length > 0)\n\t\t\t\t\t|| allowedEmpty.indexOf(key) !== -1\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\ttry {\n\t\t\t\t\tawait api.requireAdmin()\n\t\t\t\t\tawait api.put(generateOcsUrl('cloud/users/{userid}', { userid }), { key, value })\n\t\t\t\t\treturn context.commit('setUserData', { userid, key, value })\n\t\t\t\t} catch (error) {\n\t\t\t\t\tcontext.commit('API_FAILURE', { userid, error })\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn Promise.reject(new Error('Invalid request data'))\n\t},\n\n\t/**\n\t * Send welcome mail\n\t *\n\t * @param {object} context store context\n\t * @param {string} userid User id\n\t * @return {Promise}\n\t */\n\tsendWelcomeMail(context, userid) {\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\treturn api.post(generateOcsUrl('cloud/users/{userid}/welcome', { userid }))\n\t\t\t\t.then(response => true)\n\t\t\t\t.catch((error) => { throw error })\n\t\t}).catch((error) => context.commit('API_FAILURE', { userid, error }))\n\t},\n}\n\nexport default { state, mutations, getters, actions }\n","/**\n * SPDX-FileCopyrightText: 2018 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport api from './api.js'\nimport Vue from 'vue'\nimport { generateUrl } from '@nextcloud/router'\nimport { showError, showInfo } from '@nextcloud/dialogs'\nimport { loadState } from '@nextcloud/initial-state'\n\nconst state = {\n\tapps: [],\n\tbundles: loadState('settings', 'appstoreBundles', []),\n\tcategories: [],\n\tupdateCount: loadState('settings', 'appstoreUpdateCount', 0),\n\tloading: {},\n\tgettingCategoriesPromise: null,\n}\n\nconst mutations = {\n\n\tAPPS_API_FAILURE(state, error) {\n\t\tshowError(t('settings', 'An error occurred during the request. Unable to proceed.') + '<br>' + error.error.response.data.data.message, { isHTML: true })\n\t\tconsole.error(state, error)\n\t},\n\n\tinitCategories(state, { categories, updateCount }) {\n\t\tstate.categories = categories\n\t\tstate.updateCount = updateCount\n\t},\n\n\tupdateCategories(state, categoriesPromise) {\n\t\tstate.gettingCategoriesPromise = categoriesPromise\n\t},\n\n\tsetUpdateCount(state, updateCount) {\n\t\tstate.updateCount = updateCount\n\t},\n\n\taddCategory(state, category) {\n\t\tstate.categories.push(category)\n\t},\n\n\tappendCategories(state, categoriesArray) {\n\t\t// convert obj to array\n\t\tstate.categories = categoriesArray\n\t},\n\n\tsetAllApps(state, apps) {\n\t\tstate.apps = apps\n\t},\n\n\tsetError(state, { appId, error }) {\n\t\tif (!Array.isArray(appId)) {\n\t\t\tappId = [appId]\n\t\t}\n\t\tappId.forEach((_id) => {\n\t\t\tconst app = state.apps.find(app => app.id === _id)\n\t\t\tapp.error = error\n\t\t})\n\t},\n\n\tclearError(state, { appId, error }) {\n\t\tconst app = state.apps.find(app => app.id === appId)\n\t\tapp.error = null\n\t},\n\n\tenableApp(state, { appId, groups }) {\n\t\tconst app = state.apps.find(app => app.id === appId)\n\t\tapp.active = true\n\t\tapp.groups = groups\n\t},\n\n\tsetInstallState(state, { appId, canInstall }) {\n\t\tconst app = state.apps.find(app => app.id === appId)\n\t\tif (app) {\n\t\t\tapp.canInstall = canInstall === true\n\t\t}\n\t},\n\n\tdisableApp(state, appId) {\n\t\tconst app = state.apps.find(app => app.id === appId)\n\t\tapp.active = false\n\t\tapp.groups = []\n\t\tif (app.removable) {\n\t\t\tapp.canUnInstall = true\n\t\t}\n\t},\n\n\tuninstallApp(state, appId) {\n\t\tstate.apps.find(app => app.id === appId).active = false\n\t\tstate.apps.find(app => app.id === appId).groups = []\n\t\tstate.apps.find(app => app.id === appId).needsDownload = true\n\t\tstate.apps.find(app => app.id === appId).installed = false\n\t\tstate.apps.find(app => app.id === appId).canUnInstall = false\n\t\tstate.apps.find(app => app.id === appId).canInstall = true\n\t},\n\n\tupdateApp(state, appId) {\n\t\tconst app = state.apps.find(app => app.id === appId)\n\t\tconst version = app.update\n\t\tapp.update = null\n\t\tapp.version = version\n\t\tstate.updateCount--\n\n\t},\n\n\tresetApps(state) {\n\t\tstate.apps = []\n\t},\n\treset(state) {\n\t\tstate.apps = []\n\t\tstate.categories = []\n\t\tstate.updateCount = 0\n\t},\n\tstartLoading(state, id) {\n\t\tif (Array.isArray(id)) {\n\t\t\tid.forEach((_id) => {\n\t\t\t\tVue.set(state.loading, _id, true)\n\t\t\t})\n\t\t} else {\n\t\t\tVue.set(state.loading, id, true)\n\t\t}\n\t},\n\tstopLoading(state, id) {\n\t\tif (Array.isArray(id)) {\n\t\t\tid.forEach((_id) => {\n\t\t\t\tVue.set(state.loading, _id, false)\n\t\t\t})\n\t\t} else {\n\t\t\tVue.set(state.loading, id, false)\n\t\t}\n\t},\n}\n\nconst getters = {\n\tloading(state) {\n\t\treturn function(id) {\n\t\t\treturn state.loading[id]\n\t\t}\n\t},\n\tgetCategories(state) {\n\t\treturn state.categories\n\t},\n\tgetAllApps(state) {\n\t\treturn state.apps\n\t},\n\tgetAppBundles(state) {\n\t\treturn state.bundles\n\t},\n\tgetUpdateCount(state) {\n\t\treturn state.updateCount\n\t},\n\tgetCategoryById: (state) => (selectedCategoryId) => {\n\t\treturn state.categories.find((category) => category.id === selectedCategoryId)\n\t},\n}\n\nconst actions = {\n\n\tenableApp(context, { appId, groups }) {\n\t\tlet apps\n\t\tif (Array.isArray(appId)) {\n\t\t\tapps = appId\n\t\t} else {\n\t\t\tapps = [appId]\n\t\t}\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\tcontext.commit('startLoading', apps)\n\t\t\tcontext.commit('startLoading', 'install')\n\t\t\treturn api.post(generateUrl('settings/apps/enable'), { appIds: apps, groups })\n\t\t\t\t.then((response) => {\n\t\t\t\t\tcontext.commit('stopLoading', apps)\n\t\t\t\t\tcontext.commit('stopLoading', 'install')\n\t\t\t\t\tapps.forEach(_appId => {\n\t\t\t\t\t\tcontext.commit('enableApp', { appId: _appId, groups })\n\t\t\t\t\t})\n\n\t\t\t\t\t// check for server health\n\t\t\t\t\treturn api.get(generateUrl('apps/files/'))\n\t\t\t\t\t\t.then(() => {\n\t\t\t\t\t\t\tif (response.data.update_required) {\n\t\t\t\t\t\t\t\tshowInfo(\n\t\t\t\t\t\t\t\t\tt(\n\t\t\t\t\t\t\t\t\t\t'settings',\n\t\t\t\t\t\t\t\t\t\t'The app has been enabled but needs to be updated. You will be redirected to the update page in 5 seconds.',\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tonClick: () => window.location.reload(),\n\t\t\t\t\t\t\t\t\t\tclose: false,\n\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\tsetTimeout(function() {\n\t\t\t\t\t\t\t\t\tlocation.reload()\n\t\t\t\t\t\t\t\t}, 5000)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.catch(() => {\n\t\t\t\t\t\t\tif (!Array.isArray(appId)) {\n\t\t\t\t\t\t\t\tshowError(t('settings', 'Error: This app cannot be enabled because it makes the server unstable'))\n\t\t\t\t\t\t\t\tcontext.commit('setError', {\n\t\t\t\t\t\t\t\t\tappId: apps,\n\t\t\t\t\t\t\t\t\terror: t('settings', 'Error: This app cannot be enabled because it makes the server unstable'),\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\tcontext.dispatch('disableApp', { appId })\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t})\n\t\t\t\t})\n\t\t\t\t.catch((error) => {\n\t\t\t\t\tcontext.commit('stopLoading', apps)\n\t\t\t\t\tcontext.commit('stopLoading', 'install')\n\t\t\t\t\tcontext.commit('setError', {\n\t\t\t\t\t\tappId: apps,\n\t\t\t\t\t\terror: error.response.data.data.message,\n\t\t\t\t\t})\n\t\t\t\t\tcontext.commit('APPS_API_FAILURE', { appId, error })\n\t\t\t\t})\n\t\t}).catch((error) => context.commit('API_FAILURE', { appId, error }))\n\t},\n\tforceEnableApp(context, { appId, groups }) {\n\t\tlet apps\n\t\tif (Array.isArray(appId)) {\n\t\t\tapps = appId\n\t\t} else {\n\t\t\tapps = [appId]\n\t\t}\n\t\treturn api.requireAdmin().then(() => {\n\t\t\tcontext.commit('startLoading', apps)\n\t\t\tcontext.commit('startLoading', 'install')\n\t\t\treturn api.post(generateUrl('settings/apps/force'), { appId })\n\t\t\t\t.then((response) => {\n\t\t\t\t\tcontext.commit('setInstallState', { appId, canInstall: true })\n\t\t\t\t})\n\t\t\t\t.catch((error) => {\n\t\t\t\t\tcontext.commit('stopLoading', apps)\n\t\t\t\t\tcontext.commit('stopLoading', 'install')\n\t\t\t\t\tcontext.commit('setError', {\n\t\t\t\t\t\tappId: apps,\n\t\t\t\t\t\terror: error.response.data.data.message,\n\t\t\t\t\t})\n\t\t\t\t\tcontext.commit('APPS_API_FAILURE', { appId, error })\n\t\t\t\t})\n\t\t\t\t.finally(() => {\n\t\t\t\t\tcontext.commit('stopLoading', apps)\n\t\t\t\t\tcontext.commit('stopLoading', 'install')\n\t\t\t\t})\n\t\t}).catch((error) => context.commit('API_FAILURE', { appId, error }))\n\t},\n\tdisableApp(context, { appId }) {\n\t\tlet apps\n\t\tif (Array.isArray(appId)) {\n\t\t\tapps = appId\n\t\t} else {\n\t\t\tapps = [appId]\n\t\t}\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\tcontext.commit('startLoading', apps)\n\t\t\treturn api.post(generateUrl('settings/apps/disable'), { appIds: apps })\n\t\t\t\t.then((response) => {\n\t\t\t\t\tcontext.commit('stopLoading', apps)\n\t\t\t\t\tapps.forEach(_appId => {\n\t\t\t\t\t\tcontext.commit('disableApp', _appId)\n\t\t\t\t\t})\n\t\t\t\t\treturn true\n\t\t\t\t})\n\t\t\t\t.catch((error) => {\n\t\t\t\t\tcontext.commit('stopLoading', apps)\n\t\t\t\t\tcontext.commit('APPS_API_FAILURE', { appId, error })\n\t\t\t\t})\n\t\t}).catch((error) => context.commit('API_FAILURE', { appId, error }))\n\t},\n\tuninstallApp(context, { appId }) {\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\tcontext.commit('startLoading', appId)\n\t\t\treturn api.get(generateUrl(`settings/apps/uninstall/${appId}`))\n\t\t\t\t.then((response) => {\n\t\t\t\t\tcontext.commit('stopLoading', appId)\n\t\t\t\t\tcontext.commit('uninstallApp', appId)\n\t\t\t\t\treturn true\n\t\t\t\t})\n\t\t\t\t.catch((error) => {\n\t\t\t\t\tcontext.commit('stopLoading', appId)\n\t\t\t\t\tcontext.commit('APPS_API_FAILURE', { appId, error })\n\t\t\t\t})\n\t\t}).catch((error) => context.commit('API_FAILURE', { appId, error }))\n\t},\n\n\tupdateApp(context, { appId }) {\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\tcontext.commit('startLoading', appId)\n\t\t\tcontext.commit('startLoading', 'install')\n\t\t\treturn api.get(generateUrl(`settings/apps/update/${appId}`))\n\t\t\t\t.then((response) => {\n\t\t\t\t\tcontext.commit('stopLoading', 'install')\n\t\t\t\t\tcontext.commit('stopLoading', appId)\n\t\t\t\t\tcontext.commit('updateApp', appId)\n\t\t\t\t\treturn true\n\t\t\t\t})\n\t\t\t\t.catch((error) => {\n\t\t\t\t\tcontext.commit('stopLoading', appId)\n\t\t\t\t\tcontext.commit('stopLoading', 'install')\n\t\t\t\t\tcontext.commit('APPS_API_FAILURE', { appId, error })\n\t\t\t\t})\n\t\t}).catch((error) => context.commit('API_FAILURE', { appId, error }))\n\t},\n\n\tgetAllApps(context) {\n\t\tcontext.commit('startLoading', 'list')\n\t\treturn api.get(generateUrl('settings/apps/list'))\n\t\t\t.then((response) => {\n\t\t\t\tcontext.commit('setAllApps', response.data.apps)\n\t\t\t\tcontext.commit('stopLoading', 'list')\n\t\t\t\treturn true\n\t\t\t})\n\t\t\t.catch((error) => context.commit('API_FAILURE', error))\n\t},\n\n\tasync getCategories(context, { shouldRefetchCategories = false } = {}) {\n\t\tif (shouldRefetchCategories || !context.state.gettingCategoriesPromise) {\n\t\t\tcontext.commit('startLoading', 'categories')\n\t\t\ttry {\n\t\t\t\tconst categoriesPromise = api.get(generateUrl('settings/apps/categories'))\n\t\t\t\tcontext.commit('updateCategories', categoriesPromise)\n\t\t\t\tconst categoriesPromiseResponse = await categoriesPromise\n\t\t\t\tif (categoriesPromiseResponse.data.length > 0) {\n\t\t\t\t\tcontext.commit('appendCategories', categoriesPromiseResponse.data)\n\t\t\t\t\tcontext.commit('stopLoading', 'categories')\n\t\t\t\t\treturn true\n\t\t\t\t}\n\t\t\t\tcontext.commit('stopLoading', 'categories')\n\t\t\t\treturn false\n\t\t\t} catch (error) {\n\t\t\t\tcontext.commit('API_FAILURE', error)\n\t\t\t}\n\t\t}\n\t\treturn context.state.gettingCategoriesPromise\n\t},\n\n}\n\nexport default { state, mutations, getters, actions }\n","/**\n * SPDX-FileCopyrightText: 2018 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport { loadState } from '@nextcloud/initial-state'\n\nconst state = {\n\tserverData: loadState('settings', 'usersSettings', {}),\n}\nconst mutations = {\n\tsetServerData(state, data) {\n\t\tstate.serverData = data\n\t},\n}\nconst getters = {\n\tgetServerData(state) {\n\t\treturn state.serverData\n\t},\n}\nconst actions = {}\n\nexport default { state, mutations, getters, actions }\n","/**\n * SPDX-FileCopyrightText: 2018 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport api from './api.js'\nimport { generateOcsUrl } from '@nextcloud/router'\n\nconst state = {}\nconst mutations = {}\nconst getters = {}\nconst actions = {\n\t/**\n\t * Set application config in database\n\t *\n\t * @param {object} context store context\n\t * @param {object} options destructuring object\n\t * @param {string} options.app Application name\n\t * @param {boolean} options.key Config key\n\t * @param {boolean} options.value Value to set\n\t * @return {Promise}\n\t */\n\tsetAppConfig(context, { app, key, value }) {\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\treturn api.post(generateOcsUrl('apps/provisioning_api/api/v1/config/apps/{app}/{key}', { app, key }), { value })\n\t\t\t\t.catch((error) => { throw error })\n\t\t}).catch((error) => context.commit('API_FAILURE', { app, key, value, error }))\n\t},\n}\n\nexport default { state, mutations, getters, actions }\n","/**\n * SPDX-FileCopyrightText: 2018 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport Vue from 'vue'\nimport Vuex, { Store } from 'vuex'\nimport users from './users.js'\nimport apps from './apps.js'\nimport settings from './users-settings.js'\nimport oc from './oc.js'\nimport { showError } from '@nextcloud/dialogs'\n\nVue.use(Vuex)\n\nconst debug = process.env.NODE_ENV !== 'production'\n\nconst mutations = {\n\tAPI_FAILURE(state, error) {\n\t\ttry {\n\t\t\tconst message = error.error.response.data.ocs.meta.message\n\t\t\tshowError(t('settings', 'An error occurred during the request. Unable to proceed.') + '<br>' + message, { isHTML: true })\n\t\t} catch (e) {\n\t\t\tshowError(t('settings', 'An error occurred during the request. Unable to proceed.'))\n\t\t}\n\t\tconsole.error(state, error)\n\t},\n}\n\nlet store = null\n\nexport const useStore = () => {\n\tif (store === null) {\n\t\tstore = new Store({\n\t\t\tmodules: {\n\t\t\t\tusers,\n\t\t\t\tapps,\n\t\t\t\tsettings,\n\t\t\t\toc,\n\t\t\t},\n\t\t\tstrict: debug,\n\t\t\tmutations,\n\t\t})\n\t}\n\treturn store\n}\n","/**\n * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n/**\n * https://github.com/nextcloud/server/blob/208e38e84e1a07a49699aa90dc5b7272d24489f0/lib/private/Group/MetaData.php#L34\n */\nexport var GroupSorting;\n(function (GroupSorting) {\n GroupSorting[GroupSorting[\"UserCount\"] = 1] = \"UserCount\";\n GroupSorting[GroupSorting[\"GroupName\"] = 2] = \"GroupName\";\n})(GroupSorting || (GroupSorting = {}));\n","/**\n * SPDX-FileCopyrightText: 2020 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\nimport { getLoggerBuilder } from '@nextcloud/logger';\nexport default getLoggerBuilder()\n .setApp('settings')\n .detectUser()\n .build();\n","var render = function render(){var _vm=this,_c=_vm._self._c,_setup=_vm._self._setupProxy;return _c(_setup.NcContent,{attrs:{\"app-name\":\"settings\"}},[_c('router-view',{attrs:{\"name\":\"navigation\"}}),_vm._v(\" \"),_c('router-view'),_vm._v(\" \"),_c('router-view',{attrs:{\"name\":\"sidebar\"}})],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/ts-loader/index.js??clonedRuleSet-4.use[1]!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SettingsApp.vue?vue&type=script&setup=true&lang=ts\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/ts-loader/index.js??clonedRuleSet-4.use[1]!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SettingsApp.vue?vue&type=script&setup=true&lang=ts\"","import { render, staticRenderFns } from \"./SettingsApp.vue?vue&type=template&id=02c6e0e9\"\nimport script from \"./SettingsApp.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./SettingsApp.vue?vue&type=script&setup=true&lang=ts\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","import { loadState } from '@nextcloud/initial-state';\nconst appstoreEnabled = loadState('settings', 'appstoreEnabled', true);\n// Dynamic loading\nconst AppStore = () => import(/* webpackChunkName: 'settings-apps-view' */ '../views/AppStore.vue');\nconst AppStoreNavigation = () => import(/* webpackChunkName: 'settings-apps-view' */ '../views/AppStoreNavigation.vue');\nconst AppStoreSidebar = () => import(/* webpackChunkName: 'settings-apps-view' */ '../views/AppStoreSidebar.vue');\nconst UserManagement = () => import(/* webpackChunkName: 'settings-users' */ '../views/UserManagement.vue');\nconst UserManagementNavigation = () => import(/* webpackChunkName: 'settings-users' */ '../views/UserManagementNavigation.vue');\nconst routes = [\n {\n name: 'users',\n path: '/:index(index.php/)?settings/users',\n components: {\n default: UserManagement,\n navigation: UserManagementNavigation,\n },\n props: true,\n children: [\n {\n path: ':selectedGroup',\n name: 'group',\n },\n ],\n },\n {\n path: '/:index(index.php/)?settings/apps',\n name: 'apps',\n redirect: {\n name: 'apps-category',\n params: {\n category: appstoreEnabled ? 'discover' : 'installed',\n },\n },\n components: {\n default: AppStore,\n navigation: AppStoreNavigation,\n sidebar: AppStoreSidebar,\n },\n children: [\n {\n path: ':category',\n name: 'apps-category',\n children: [\n {\n path: ':id',\n name: 'apps-details',\n },\n ],\n },\n ],\n },\n];\nexport default routes;\n","/**\n * SPDX-FileCopyrightText: 2018 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\nimport Vue from 'vue';\nimport Router from 'vue-router';\nimport { generateUrl } from '@nextcloud/router';\nimport routes from './routes.ts';\nVue.use(Router);\nconst router = new Router({\n mode: 'history',\n // if index.php is in the url AND we got this far, then it's working:\n // let's keep using index.php in the url\n base: generateUrl(''),\n linkActiveClass: 'active',\n routes,\n});\nexport default router;\n","/**\n * SPDX-FileCopyrightText: 2018 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\nimport Vue from 'vue';\nimport VTooltip from 'v-tooltip';\nimport { sync } from 'vuex-router-sync';\nimport { translate as t, translatePlural as n } from '@nextcloud/l10n';\nimport SettingsApp from './views/SettingsApp.vue';\nimport router from './router/index.ts';\nimport { useStore } from './store/index.js';\nimport { getCSPNonce } from '@nextcloud/auth';\nimport { PiniaVuePlugin, createPinia } from 'pinia';\nVue.use(VTooltip, { defaultHtml: false });\nconst store = useStore();\nsync(store, router);\n// CSP config for webpack dynamic chunk loading\n// eslint-disable-next-line camelcase\n__webpack_nonce__ = getCSPNonce();\n// bind to window\nVue.prototype.t = t;\nVue.prototype.n = n;\nVue.use(PiniaVuePlugin);\nconst pinia = createPinia();\nexport default new Vue({\n router,\n store,\n pinia,\n render: h => h(SettingsApp),\n el: '#content',\n});\n","exports.sync = function (store, router, options) {\n var moduleName = (options || {}).moduleName || 'route'\n\n store.registerModule(moduleName, {\n namespaced: true,\n state: cloneRoute(router.currentRoute),\n mutations: {\n 'ROUTE_CHANGED': function ROUTE_CHANGED (state, transition) {\n store.state[moduleName] = cloneRoute(transition.to, transition.from)\n }\n }\n })\n\n var isTimeTraveling = false\n var currentPath\n\n // sync router on store change\n var storeUnwatch = store.watch(\n function (state) { return state[moduleName]; },\n function (route) {\n var fullPath = route.fullPath;\n if (fullPath === currentPath) {\n return\n }\n if (currentPath != null) {\n isTimeTraveling = true\n router.push(route)\n }\n currentPath = fullPath\n },\n { sync: true }\n )\n\n // sync store on router navigation\n var afterEachUnHook = router.afterEach(function (to, from) {\n if (isTimeTraveling) {\n isTimeTraveling = false\n return\n }\n currentPath = to.fullPath\n store.commit(moduleName + '/ROUTE_CHANGED', { to: to, from: from })\n })\n\n return function unsync () {\n // On unsync, remove router hook\n if (afterEachUnHook != null) {\n afterEachUnHook()\n }\n\n // On unsync, remove store watch\n if (storeUnwatch != null) {\n storeUnwatch()\n }\n\n // On unsync, unregister Module with store\n store.unregisterModule(moduleName)\n }\n}\n\nfunction cloneRoute (to, from) {\n var clone = {\n name: to.name,\n path: to.path,\n hash: to.hash,\n query: to.query,\n params: to.params,\n fullPath: to.fullPath,\n meta: to.meta\n }\n if (from) {\n clone.from = cloneRoute(from)\n }\n return Object.freeze(clone)\n}\n\n","import { getLoggerBuilder } from \"@nextcloud/logger\";\nimport { getCurrentUser, onRequestTokenUpdate, getRequestToken } from \"@nextcloud/auth\";\nimport { join, basename, extname, dirname } from \"path\";\nimport { encodePath } from \"@nextcloud/paths\";\nimport { generateRemoteUrl } from \"@nextcloud/router\";\nimport { CancelablePromise } from \"cancelable-promise\";\nimport { createClient, getPatcher } from \"webdav\";\nimport { isPublicShare, getSharingToken } from \"@nextcloud/sharing/public\";\nimport { getCapabilities } from \"@nextcloud/capabilities\";\nimport { getCanonicalLocale, getLanguage } from \"@nextcloud/l10n\";\nimport { TypedEventTarget } from \"typescript-event-target\";\nconst logger = getLoggerBuilder().setApp(\"@nextcloud/files\").detectUser().build();\nvar NewMenuEntryCategory = /* @__PURE__ */ ((NewMenuEntryCategory2) => {\n NewMenuEntryCategory2[NewMenuEntryCategory2[\"UploadFromDevice\"] = 0] = \"UploadFromDevice\";\n NewMenuEntryCategory2[NewMenuEntryCategory2[\"CreateNew\"] = 1] = \"CreateNew\";\n NewMenuEntryCategory2[NewMenuEntryCategory2[\"Other\"] = 2] = \"Other\";\n return NewMenuEntryCategory2;\n})(NewMenuEntryCategory || {});\nclass NewFileMenu {\n _entries = [];\n registerEntry(entry) {\n this.validateEntry(entry);\n entry.category = entry.category ?? 1;\n this._entries.push(entry);\n }\n unregisterEntry(entry) {\n const entryIndex = typeof entry === \"string\" ? this.getEntryIndex(entry) : this.getEntryIndex(entry.id);\n if (entryIndex === -1) {\n logger.warn(\"Entry not found, nothing removed\", { entry, entries: this.getEntries() });\n return;\n }\n this._entries.splice(entryIndex, 1);\n }\n /**\n * Get the list of registered entries\n *\n * @param {Folder} context the creation context. Usually the current folder\n */\n getEntries(context) {\n if (context) {\n return this._entries.filter((entry) => typeof entry.enabled === \"function\" ? entry.enabled(context) : true);\n }\n return this._entries;\n }\n getEntryIndex(id) {\n return this._entries.findIndex((entry) => entry.id === id);\n }\n validateEntry(entry) {\n if (!entry.id || !entry.displayName || !(entry.iconSvgInline || entry.iconClass) || !entry.handler) {\n throw new Error(\"Invalid entry\");\n }\n if (typeof entry.id !== \"string\" || typeof entry.displayName !== \"string\") {\n throw new Error(\"Invalid id or displayName property\");\n }\n if (entry.iconClass && typeof entry.iconClass !== \"string\" || entry.iconSvgInline && typeof entry.iconSvgInline !== \"string\") {\n throw new Error(\"Invalid icon provided\");\n }\n if (entry.enabled !== void 0 && typeof entry.enabled !== \"function\") {\n throw new Error(\"Invalid enabled property\");\n }\n if (typeof entry.handler !== \"function\") {\n throw new Error(\"Invalid handler property\");\n }\n if (\"order\" in entry && typeof entry.order !== \"number\") {\n throw new Error(\"Invalid order property\");\n }\n if (this.getEntryIndex(entry.id) !== -1) {\n throw new Error(\"Duplicate entry\");\n }\n }\n}\nconst getNewFileMenu = function() {\n if (typeof window._nc_newfilemenu === \"undefined\") {\n window._nc_newfilemenu = new NewFileMenu();\n logger.debug(\"NewFileMenu initialized\");\n }\n return window._nc_newfilemenu;\n};\nvar DefaultType = /* @__PURE__ */ ((DefaultType2) => {\n DefaultType2[\"DEFAULT\"] = \"default\";\n DefaultType2[\"HIDDEN\"] = \"hidden\";\n return DefaultType2;\n})(DefaultType || {});\nclass FileAction {\n _action;\n constructor(action) {\n this.validateAction(action);\n this._action = action;\n }\n get id() {\n return this._action.id;\n }\n get displayName() {\n return this._action.displayName;\n }\n get title() {\n return this._action.title;\n }\n get iconSvgInline() {\n return this._action.iconSvgInline;\n }\n get enabled() {\n return this._action.enabled;\n }\n get exec() {\n return this._action.exec;\n }\n get execBatch() {\n return this._action.execBatch;\n }\n get order() {\n return this._action.order;\n }\n get parent() {\n return this._action.parent;\n }\n get default() {\n return this._action.default;\n }\n get inline() {\n return this._action.inline;\n }\n get renderInline() {\n return this._action.renderInline;\n }\n validateAction(action) {\n if (!action.id || typeof action.id !== \"string\") {\n throw new Error(\"Invalid id\");\n }\n if (!action.displayName || typeof action.displayName !== \"function\") {\n throw new Error(\"Invalid displayName function\");\n }\n if (\"title\" in action && typeof action.title !== \"function\") {\n throw new Error(\"Invalid title function\");\n }\n if (!action.iconSvgInline || typeof action.iconSvgInline !== \"function\") {\n throw new Error(\"Invalid iconSvgInline function\");\n }\n if (!action.exec || typeof action.exec !== \"function\") {\n throw new Error(\"Invalid exec function\");\n }\n if (\"enabled\" in action && typeof action.enabled !== \"function\") {\n throw new Error(\"Invalid enabled function\");\n }\n if (\"execBatch\" in action && typeof action.execBatch !== \"function\") {\n throw new Error(\"Invalid execBatch function\");\n }\n if (\"order\" in action && typeof action.order !== \"number\") {\n throw new Error(\"Invalid order\");\n }\n if (\"parent\" in action && typeof action.parent !== \"string\") {\n throw new Error(\"Invalid parent\");\n }\n if (action.default && !Object.values(DefaultType).includes(action.default)) {\n throw new Error(\"Invalid default\");\n }\n if (\"inline\" in action && typeof action.inline !== \"function\") {\n throw new Error(\"Invalid inline function\");\n }\n if (\"renderInline\" in action && typeof action.renderInline !== \"function\") {\n throw new Error(\"Invalid renderInline function\");\n }\n }\n}\nconst registerFileAction = function(action) {\n if (typeof window._nc_fileactions === \"undefined\") {\n window._nc_fileactions = [];\n logger.debug(\"FileActions initialized\");\n }\n if (window._nc_fileactions.find((search) => search.id === action.id)) {\n logger.error(`FileAction ${action.id} already registered`, { action });\n return;\n }\n window._nc_fileactions.push(action);\n};\nconst getFileActions = function() {\n if (typeof window._nc_fileactions === \"undefined\") {\n window._nc_fileactions = [];\n logger.debug(\"FileActions initialized\");\n }\n return window._nc_fileactions;\n};\nclass Header {\n _header;\n constructor(header) {\n this.validateHeader(header);\n this._header = header;\n }\n get id() {\n return this._header.id;\n }\n get order() {\n return this._header.order;\n }\n get enabled() {\n return this._header.enabled;\n }\n get render() {\n return this._header.render;\n }\n get updated() {\n return this._header.updated;\n }\n validateHeader(header) {\n if (!header.id || !header.render || !header.updated) {\n throw new Error(\"Invalid header: id, render and updated are required\");\n }\n if (typeof header.id !== \"string\") {\n throw new Error(\"Invalid id property\");\n }\n if (header.enabled !== void 0 && typeof header.enabled !== \"function\") {\n throw new Error(\"Invalid enabled property\");\n }\n if (header.render && typeof header.render !== \"function\") {\n throw new Error(\"Invalid render property\");\n }\n if (header.updated && typeof header.updated !== \"function\") {\n throw new Error(\"Invalid updated property\");\n }\n }\n}\nconst registerFileListHeaders = function(header) {\n if (typeof window._nc_filelistheader === \"undefined\") {\n window._nc_filelistheader = [];\n logger.debug(\"FileListHeaders initialized\");\n }\n if (window._nc_filelistheader.find((search) => search.id === header.id)) {\n logger.error(`Header ${header.id} already registered`, { header });\n return;\n }\n window._nc_filelistheader.push(header);\n};\nconst getFileListHeaders = function() {\n if (typeof window._nc_filelistheader === \"undefined\") {\n window._nc_filelistheader = [];\n logger.debug(\"FileListHeaders initialized\");\n }\n return window._nc_filelistheader;\n};\nvar Permission = /* @__PURE__ */ ((Permission2) => {\n Permission2[Permission2[\"NONE\"] = 0] = \"NONE\";\n Permission2[Permission2[\"CREATE\"] = 4] = \"CREATE\";\n Permission2[Permission2[\"READ\"] = 1] = \"READ\";\n Permission2[Permission2[\"UPDATE\"] = 2] = \"UPDATE\";\n Permission2[Permission2[\"DELETE\"] = 8] = \"DELETE\";\n Permission2[Permission2[\"SHARE\"] = 16] = \"SHARE\";\n Permission2[Permission2[\"ALL\"] = 31] = \"ALL\";\n return Permission2;\n})(Permission || {});\nconst defaultDavProperties = [\n \"d:getcontentlength\",\n \"d:getcontenttype\",\n \"d:getetag\",\n \"d:getlastmodified\",\n \"d:creationdate\",\n \"d:displayname\",\n \"d:quota-available-bytes\",\n \"d:resourcetype\",\n \"nc:has-preview\",\n \"nc:is-encrypted\",\n \"nc:mount-type\",\n \"oc:comments-unread\",\n \"oc:favorite\",\n \"oc:fileid\",\n \"oc:owner-display-name\",\n \"oc:owner-id\",\n \"oc:permissions\",\n \"oc:size\"\n];\nconst defaultDavNamespaces = {\n d: \"DAV:\",\n nc: \"http://nextcloud.org/ns\",\n oc: \"http://owncloud.org/ns\",\n ocs: \"http://open-collaboration-services.org/ns\"\n};\nconst registerDavProperty = function(prop, namespace = { nc: \"http://nextcloud.org/ns\" }) {\n if (typeof window._nc_dav_properties === \"undefined\") {\n window._nc_dav_properties = [...defaultDavProperties];\n window._nc_dav_namespaces = { ...defaultDavNamespaces };\n }\n const namespaces = { ...window._nc_dav_namespaces, ...namespace };\n if (window._nc_dav_properties.find((search) => search === prop)) {\n logger.warn(`${prop} already registered`, { prop });\n return false;\n }\n if (prop.startsWith(\"<\") || prop.split(\":\").length !== 2) {\n logger.error(`${prop} is not valid. See example: 'oc:fileid'`, { prop });\n return false;\n }\n const ns = prop.split(\":\")[0];\n if (!namespaces[ns]) {\n logger.error(`${prop} namespace unknown`, { prop, namespaces });\n return false;\n }\n window._nc_dav_properties.push(prop);\n window._nc_dav_namespaces = namespaces;\n return true;\n};\nconst getDavProperties = function() {\n if (typeof window._nc_dav_properties === \"undefined\") {\n window._nc_dav_properties = [...defaultDavProperties];\n }\n return window._nc_dav_properties.map((prop) => `<${prop} />`).join(\" \");\n};\nconst getDavNameSpaces = function() {\n if (typeof window._nc_dav_namespaces === \"undefined\") {\n window._nc_dav_namespaces = { ...defaultDavNamespaces };\n }\n return Object.keys(window._nc_dav_namespaces).map((ns) => `xmlns:${ns}=\"${window._nc_dav_namespaces?.[ns]}\"`).join(\" \");\n};\nconst davGetDefaultPropfind = function() {\n return `<?xml version=\"1.0\"?>\n\t\t<d:propfind ${getDavNameSpaces()}>\n\t\t\t<d:prop>\n\t\t\t\t${getDavProperties()}\n\t\t\t</d:prop>\n\t\t</d:propfind>`;\n};\nconst davGetFavoritesReport = function() {\n return `<?xml version=\"1.0\"?>\n\t\t<oc:filter-files ${getDavNameSpaces()}>\n\t\t\t<d:prop>\n\t\t\t\t${getDavProperties()}\n\t\t\t</d:prop>\n\t\t\t<oc:filter-rules>\n\t\t\t\t<oc:favorite>1</oc:favorite>\n\t\t\t</oc:filter-rules>\n\t\t</oc:filter-files>`;\n};\nconst davGetRecentSearch = function(lastModified) {\n return `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<d:searchrequest ${getDavNameSpaces()}\n\txmlns:ns=\"https://github.com/icewind1991/SearchDAV/ns\">\n\t<d:basicsearch>\n\t\t<d:select>\n\t\t\t<d:prop>\n\t\t\t\t${getDavProperties()}\n\t\t\t</d:prop>\n\t\t</d:select>\n\t\t<d:from>\n\t\t\t<d:scope>\n\t\t\t\t<d:href>/files/${getCurrentUser()?.uid}/</d:href>\n\t\t\t\t<d:depth>infinity</d:depth>\n\t\t\t</d:scope>\n\t\t</d:from>\n\t\t<d:where>\n\t\t\t<d:and>\n\t\t\t\t<d:or>\n\t\t\t\t\t<d:not>\n\t\t\t\t\t\t<d:eq>\n\t\t\t\t\t\t\t<d:prop>\n\t\t\t\t\t\t\t\t<d:getcontenttype/>\n\t\t\t\t\t\t\t</d:prop>\n\t\t\t\t\t\t\t<d:literal>httpd/unix-directory</d:literal>\n\t\t\t\t\t\t</d:eq>\n\t\t\t\t\t</d:not>\n\t\t\t\t\t<d:eq>\n\t\t\t\t\t\t<d:prop>\n\t\t\t\t\t\t\t<oc:size/>\n\t\t\t\t\t\t</d:prop>\n\t\t\t\t\t\t<d:literal>0</d:literal>\n\t\t\t\t\t</d:eq>\n\t\t\t\t</d:or>\n\t\t\t\t<d:gt>\n\t\t\t\t\t<d:prop>\n\t\t\t\t\t\t<d:getlastmodified/>\n\t\t\t\t\t</d:prop>\n\t\t\t\t\t<d:literal>${lastModified}</d:literal>\n\t\t\t\t</d:gt>\n\t\t\t</d:and>\n\t\t</d:where>\n\t\t<d:orderby>\n\t\t\t<d:order>\n\t\t\t\t<d:prop>\n\t\t\t\t\t<d:getlastmodified/>\n\t\t\t\t</d:prop>\n\t\t\t\t<d:descending/>\n\t\t\t</d:order>\n\t\t</d:orderby>\n\t\t<d:limit>\n\t\t\t<d:nresults>100</d:nresults>\n\t\t\t<ns:firstresult>0</ns:firstresult>\n\t\t</d:limit>\n\t</d:basicsearch>\n</d:searchrequest>`;\n};\nconst davParsePermissions = function(permString = \"\") {\n let permissions = Permission.NONE;\n if (!permString) {\n return permissions;\n }\n if (permString.includes(\"C\") || permString.includes(\"K\")) {\n permissions |= Permission.CREATE;\n }\n if (permString.includes(\"G\")) {\n permissions |= Permission.READ;\n }\n if (permString.includes(\"W\") || permString.includes(\"N\") || permString.includes(\"V\")) {\n permissions |= Permission.UPDATE;\n }\n if (permString.includes(\"D\")) {\n permissions |= Permission.DELETE;\n }\n if (permString.includes(\"R\")) {\n permissions |= Permission.SHARE;\n }\n return permissions;\n};\nvar FileType = /* @__PURE__ */ ((FileType2) => {\n FileType2[\"Folder\"] = \"folder\";\n FileType2[\"File\"] = \"file\";\n return FileType2;\n})(FileType || {});\nconst isDavRessource = function(source, davService) {\n return source.match(davService) !== null;\n};\nconst validateData = (data, davService) => {\n if (data.id && typeof data.id !== \"number\") {\n throw new Error(\"Invalid id type of value\");\n }\n if (!data.source) {\n throw new Error(\"Missing mandatory source\");\n }\n try {\n new URL(data.source);\n } catch (e) {\n throw new Error(\"Invalid source format, source must be a valid URL\");\n }\n if (!data.source.startsWith(\"http\")) {\n throw new Error(\"Invalid source format, only http(s) is supported\");\n }\n if (data.displayname && typeof data.displayname !== \"string\") {\n throw new Error(\"Invalid displayname type\");\n }\n if (data.mtime && !(data.mtime instanceof Date)) {\n throw new Error(\"Invalid mtime type\");\n }\n if (data.crtime && !(data.crtime instanceof Date)) {\n throw new Error(\"Invalid crtime type\");\n }\n if (!data.mime || typeof data.mime !== \"string\" || !data.mime.match(/^[-\\w.]+\\/[-+\\w.]+$/gi)) {\n throw new Error(\"Missing or invalid mandatory mime\");\n }\n if (\"size\" in data && typeof data.size !== \"number\" && data.size !== void 0) {\n throw new Error(\"Invalid size type\");\n }\n if (\"permissions\" in data && data.permissions !== void 0 && !(typeof data.permissions === \"number\" && data.permissions >= Permission.NONE && data.permissions <= Permission.ALL)) {\n throw new Error(\"Invalid permissions\");\n }\n if (data.owner && data.owner !== null && typeof data.owner !== \"string\") {\n throw new Error(\"Invalid owner type\");\n }\n if (data.attributes && typeof data.attributes !== \"object\") {\n throw new Error(\"Invalid attributes type\");\n }\n if (data.root && typeof data.root !== \"string\") {\n throw new Error(\"Invalid root type\");\n }\n if (data.root && !data.root.startsWith(\"/\")) {\n throw new Error(\"Root must start with a leading slash\");\n }\n if (data.root && !data.source.includes(data.root)) {\n throw new Error(\"Root must be part of the source\");\n }\n if (data.root && isDavRessource(data.source, davService)) {\n const service = data.source.match(davService)[0];\n if (!data.source.includes(join(service, data.root))) {\n throw new Error(\"The root must be relative to the service. e.g /files/emma\");\n }\n }\n if (data.status && !Object.values(NodeStatus).includes(data.status)) {\n throw new Error(\"Status must be a valid NodeStatus\");\n }\n};\nvar NodeStatus = /* @__PURE__ */ ((NodeStatus2) => {\n NodeStatus2[\"NEW\"] = \"new\";\n NodeStatus2[\"FAILED\"] = \"failed\";\n NodeStatus2[\"LOADING\"] = \"loading\";\n NodeStatus2[\"LOCKED\"] = \"locked\";\n return NodeStatus2;\n})(NodeStatus || {});\nclass Node {\n _data;\n _attributes;\n _knownDavService = /(remote|public)\\.php\\/(web)?dav/i;\n readonlyAttributes = Object.entries(Object.getOwnPropertyDescriptors(Node.prototype)).filter((e) => typeof e[1].get === \"function\" && e[0] !== \"__proto__\").map((e) => e[0]);\n handler = {\n set: (target, prop, value) => {\n if (this.readonlyAttributes.includes(prop)) {\n return false;\n }\n return Reflect.set(target, prop, value);\n },\n deleteProperty: (target, prop) => {\n if (this.readonlyAttributes.includes(prop)) {\n return false;\n }\n return Reflect.deleteProperty(target, prop);\n },\n // TODO: This is deprecated and only needed for files v3\n get: (target, prop, receiver) => {\n if (this.readonlyAttributes.includes(prop)) {\n logger.warn(`Accessing \"Node.attributes.${prop}\" is deprecated, access it directly on the Node instance.`);\n return Reflect.get(this, prop);\n }\n return Reflect.get(target, prop, receiver);\n }\n };\n constructor(data, davService) {\n validateData(data, davService || this._knownDavService);\n this._data = {\n // TODO: Remove with next major release, this is just for compatibility\n displayname: data.attributes?.displayname,\n ...data,\n attributes: {}\n };\n this._attributes = new Proxy(this._data.attributes, this.handler);\n this.update(data.attributes ?? {});\n if (davService) {\n this._knownDavService = davService;\n }\n }\n /**\n * Get the source url to this object\n * There is no setter as the source is not meant to be changed manually.\n * You can use the rename or move method to change the source.\n */\n get source() {\n return this._data.source.replace(/\\/$/i, \"\");\n }\n /**\n * Get the encoded source url to this object for requests purposes\n */\n get encodedSource() {\n const { origin } = new URL(this.source);\n return origin + encodePath(this.source.slice(origin.length));\n }\n /**\n * Get this object name\n * There is no setter as the source is not meant to be changed manually.\n * You can use the rename or move method to change the source.\n */\n get basename() {\n return basename(this.source);\n }\n /**\n * The nodes displayname\n * By default the display name and the `basename` are identical,\n * but it is possible to have a different name. This happens\n * on the files app for example for shared folders.\n */\n get displayname() {\n return this._data.displayname || this.basename;\n }\n /**\n * Set the displayname\n */\n set displayname(displayname) {\n this._data.displayname = displayname;\n }\n /**\n * Get this object's extension\n * There is no setter as the source is not meant to be changed manually.\n * You can use the rename or move method to change the source.\n */\n get extension() {\n return extname(this.source);\n }\n /**\n * Get the directory path leading to this object\n * Will use the relative path to root if available\n *\n * There is no setter as the source is not meant to be changed manually.\n * You can use the rename or move method to change the source.\n */\n get dirname() {\n if (this.root) {\n let source = this.source;\n if (this.isDavRessource) {\n source = source.split(this._knownDavService).pop();\n }\n const firstMatch = source.indexOf(this.root);\n const root = this.root.replace(/\\/$/, \"\");\n return dirname(source.slice(firstMatch + root.length) || \"/\");\n }\n const url = new URL(this.source);\n return dirname(url.pathname);\n }\n /**\n * Get the file mime\n * There is no setter as the mime is not meant to be changed\n */\n get mime() {\n return this._data.mime;\n }\n /**\n * Get the file modification time\n */\n get mtime() {\n return this._data.mtime;\n }\n /**\n * Set the file modification time\n */\n set mtime(mtime) {\n this._data.mtime = mtime;\n }\n /**\n * Get the file creation time\n * There is no setter as the creation time is not meant to be changed\n */\n get crtime() {\n return this._data.crtime;\n }\n /**\n * Get the file size\n */\n get size() {\n return this._data.size;\n }\n /**\n * Set the file size\n */\n set size(size) {\n this.updateMtime();\n this._data.size = size;\n }\n /**\n * Get the file attribute\n * This contains all additional attributes not provided by the Node class\n */\n get attributes() {\n return this._attributes;\n }\n /**\n * Get the file permissions\n */\n get permissions() {\n if (this.owner === null && !this.isDavRessource) {\n return Permission.READ;\n }\n return this._data.permissions !== void 0 ? this._data.permissions : Permission.NONE;\n }\n /**\n * Set the file permissions\n */\n set permissions(permissions) {\n this.updateMtime();\n this._data.permissions = permissions;\n }\n /**\n * Get the file owner\n * There is no setter as the owner is not meant to be changed\n */\n get owner() {\n if (!this.isDavRessource) {\n return null;\n }\n return this._data.owner;\n }\n /**\n * Is this a dav-related ressource ?\n */\n get isDavRessource() {\n return isDavRessource(this.source, this._knownDavService);\n }\n /**\n * Get the dav root of this object\n * There is no setter as the root is not meant to be changed\n */\n get root() {\n if (this._data.root) {\n return this._data.root.replace(/^(.+)\\/$/, \"$1\");\n }\n if (this.isDavRessource) {\n const root = dirname(this.source);\n return root.split(this._knownDavService).pop() || null;\n }\n return null;\n }\n /**\n * Get the absolute path of this object relative to the root\n */\n get path() {\n if (this.root) {\n let source = this.source;\n if (this.isDavRessource) {\n source = source.split(this._knownDavService).pop();\n }\n const firstMatch = source.indexOf(this.root);\n const root = this.root.replace(/\\/$/, \"\");\n return source.slice(firstMatch + root.length) || \"/\";\n }\n return (this.dirname + \"/\" + this.basename).replace(/\\/\\//g, \"/\");\n }\n /**\n * Get the node id if defined.\n * There is no setter as the fileid is not meant to be changed\n */\n get fileid() {\n return this._data?.id;\n }\n /**\n * Get the node status.\n */\n get status() {\n return this._data?.status;\n }\n /**\n * Set the node status.\n */\n set status(status) {\n this._data.status = status;\n }\n /**\n * Move the node to a new destination\n *\n * @param {string} destination the new source.\n * e.g. https://cloud.domain.com/remote.php/dav/files/emma/Photos/picture.jpg\n */\n move(destination) {\n validateData({ ...this._data, source: destination }, this._knownDavService);\n const oldBasename = this.basename;\n this._data.source = destination;\n if (this.displayname === oldBasename && this.basename !== oldBasename) {\n this.displayname = this.basename;\n }\n this.updateMtime();\n }\n /**\n * Rename the node\n * This aliases the move method for easier usage\n *\n * @param basename The new name of the node\n */\n rename(basename2) {\n if (basename2.includes(\"/\")) {\n throw new Error(\"Invalid basename\");\n }\n this.move(dirname(this.source) + \"/\" + basename2);\n }\n /**\n * Update the mtime if exists\n */\n updateMtime() {\n if (this._data.mtime) {\n this._data.mtime = /* @__PURE__ */ new Date();\n }\n }\n /**\n * Update the attributes of the node\n * Warning, updating attributes will NOT automatically update the mtime.\n *\n * @param attributes The new attributes to update on the Node attributes\n */\n update(attributes) {\n for (const [name, value] of Object.entries(attributes)) {\n try {\n if (value === void 0) {\n delete this.attributes[name];\n } else {\n this.attributes[name] = value;\n }\n } catch (e) {\n if (e instanceof TypeError) {\n continue;\n }\n throw e;\n }\n }\n }\n}\nclass File extends Node {\n get type() {\n return FileType.File;\n }\n}\nclass Folder extends Node {\n constructor(data) {\n super({\n ...data,\n mime: \"httpd/unix-directory\"\n });\n }\n get type() {\n return FileType.Folder;\n }\n get extension() {\n return null;\n }\n get mime() {\n return \"httpd/unix-directory\";\n }\n}\nfunction davGetRootPath() {\n if (isPublicShare()) {\n return `/files/${getSharingToken()}`;\n }\n return `/files/${getCurrentUser()?.uid}`;\n}\nconst davRootPath = davGetRootPath();\nfunction davGetRemoteURL() {\n const url = generateRemoteUrl(\"dav\");\n if (isPublicShare()) {\n return url.replace(\"remote.php\", \"public.php\");\n }\n return url;\n}\nconst davRemoteURL = davGetRemoteURL();\nconst davGetClient = function(remoteURL = davRemoteURL, headers = {}) {\n const client = createClient(remoteURL, { headers });\n function setHeaders(token) {\n client.setHeaders({\n ...headers,\n // Add this so the server knows it is an request from the browser\n \"X-Requested-With\": \"XMLHttpRequest\",\n // Inject user auth\n requesttoken: token ?? \"\"\n });\n }\n onRequestTokenUpdate(setHeaders);\n setHeaders(getRequestToken());\n const patcher = getPatcher();\n patcher.patch(\"fetch\", (url, options) => {\n const headers2 = options.headers;\n if (headers2?.method) {\n options.method = headers2.method;\n delete headers2.method;\n }\n return fetch(url, options);\n });\n return client;\n};\nconst getFavoriteNodes = (davClient, path = \"/\", davRoot = davRootPath) => {\n const controller = new AbortController();\n return new CancelablePromise(async (resolve, reject, onCancel) => {\n onCancel(() => controller.abort());\n try {\n const contentsResponse = await davClient.getDirectoryContents(`${davRoot}${path}`, {\n signal: controller.signal,\n details: true,\n data: davGetFavoritesReport(),\n headers: {\n // see davGetClient for patched webdav client\n method: \"REPORT\"\n },\n includeSelf: true\n });\n const nodes = contentsResponse.data.filter((node) => node.filename !== path).map((result) => davResultToNode(result, davRoot));\n resolve(nodes);\n } catch (error) {\n reject(error);\n }\n });\n};\nconst davResultToNode = function(node, filesRoot = davRootPath, remoteURL = davRemoteURL) {\n let userId = getCurrentUser()?.uid;\n if (isPublicShare()) {\n userId = userId ?? \"anonymous\";\n } else if (!userId) {\n throw new Error(\"No user id found\");\n }\n const props = node.props;\n const permissions = davParsePermissions(props?.permissions);\n const owner = String(props?.[\"owner-id\"] || userId);\n const id = props.fileid || 0;\n const nodeData = {\n id,\n source: `${remoteURL}${node.filename}`,\n mtime: new Date(Date.parse(node.lastmod)),\n mime: node.mime || \"application/octet-stream\",\n // Manually cast to work around for https://github.com/perry-mitchell/webdav-client/pull/380\n displayname: props.displayname !== void 0 ? String(props.displayname) : void 0,\n size: props?.size || Number.parseInt(props.getcontentlength || \"0\"),\n // The fileid is set to -1 for failed requests\n status: id < 0 ? NodeStatus.FAILED : void 0,\n permissions,\n owner,\n root: filesRoot,\n attributes: {\n ...node,\n ...props,\n hasPreview: props?.[\"has-preview\"]\n }\n };\n delete nodeData.attributes?.props;\n return node.type === \"file\" ? new File(nodeData) : new Folder(nodeData);\n};\nvar InvalidFilenameErrorReason = /* @__PURE__ */ ((InvalidFilenameErrorReason2) => {\n InvalidFilenameErrorReason2[\"ReservedName\"] = \"reserved name\";\n InvalidFilenameErrorReason2[\"Character\"] = \"character\";\n InvalidFilenameErrorReason2[\"Extension\"] = \"extension\";\n return InvalidFilenameErrorReason2;\n})(InvalidFilenameErrorReason || {});\nclass InvalidFilenameError extends Error {\n constructor(options) {\n super(`Invalid ${options.reason} '${options.segment}' in filename '${options.filename}'`, { cause: options });\n }\n /**\n * The filename that was validated\n */\n get filename() {\n return this.cause.filename;\n }\n /**\n * Reason why the validation failed\n */\n get reason() {\n return this.cause.reason;\n }\n /**\n * Part of the filename that caused this error\n */\n get segment() {\n return this.cause.segment;\n }\n}\nfunction validateFilename(filename) {\n const capabilities = getCapabilities().files;\n const forbiddenCharacters = capabilities.forbidden_filename_characters ?? window._oc_config?.forbidden_filenames_characters ?? [\"/\", \"\\\\\"];\n for (const character of forbiddenCharacters) {\n if (filename.includes(character)) {\n throw new InvalidFilenameError({ segment: character, reason: \"character\", filename });\n }\n }\n filename = filename.toLocaleLowerCase();\n const forbiddenFilenames = capabilities.forbidden_filenames ?? [\".htaccess\"];\n if (forbiddenFilenames.includes(filename)) {\n throw new InvalidFilenameError({\n filename,\n segment: filename,\n reason: \"reserved name\"\n /* ReservedName */\n });\n }\n const endOfBasename = filename.indexOf(\".\", 1);\n const basename2 = filename.substring(0, endOfBasename === -1 ? void 0 : endOfBasename);\n const forbiddenFilenameBasenames = capabilities.forbidden_filename_basenames ?? [];\n if (forbiddenFilenameBasenames.includes(basename2)) {\n throw new InvalidFilenameError({\n filename,\n segment: basename2,\n reason: \"reserved name\"\n /* ReservedName */\n });\n }\n const forbiddenFilenameExtensions = capabilities.forbidden_filename_extensions ?? [\".part\", \".filepart\"];\n for (const extension of forbiddenFilenameExtensions) {\n if (filename.length > extension.length && filename.endsWith(extension)) {\n throw new InvalidFilenameError({ segment: extension, reason: \"extension\", filename });\n }\n }\n}\nfunction isFilenameValid(filename) {\n try {\n validateFilename(filename);\n return true;\n } catch (error) {\n if (error instanceof InvalidFilenameError) {\n return false;\n }\n throw error;\n }\n}\nfunction getUniqueName(name, otherNames, options) {\n const opts = {\n suffix: (n) => `(${n})`,\n ignoreFileExtension: false,\n ...options\n };\n let newName = name;\n let i = 1;\n while (otherNames.includes(newName)) {\n const ext = opts.ignoreFileExtension ? \"\" : extname(name);\n const base = basename(name, ext);\n newName = `${base} ${opts.suffix(i++)}${ext}`;\n }\n return newName;\n}\nconst humanList = [\"B\", \"KB\", \"MB\", \"GB\", \"TB\", \"PB\"];\nconst humanListBinary = [\"B\", \"KiB\", \"MiB\", \"GiB\", \"TiB\", \"PiB\"];\nfunction formatFileSize(size, skipSmallSizes = false, binaryPrefixes = false, base1000 = false) {\n binaryPrefixes = binaryPrefixes && !base1000;\n if (typeof size === \"string\") {\n size = Number(size);\n }\n let order = size > 0 ? Math.floor(Math.log(size) / Math.log(base1000 ? 1e3 : 1024)) : 0;\n order = Math.min((binaryPrefixes ? humanListBinary.length : humanList.length) - 1, order);\n const readableFormat = binaryPrefixes ? humanListBinary[order] : humanList[order];\n let relativeSize = (size / Math.pow(base1000 ? 1e3 : 1024, order)).toFixed(1);\n if (skipSmallSizes === true && order === 0) {\n return (relativeSize !== \"0.0\" ? \"< 1 \" : \"0 \") + (binaryPrefixes ? humanListBinary[1] : humanList[1]);\n }\n if (order < 2) {\n relativeSize = parseFloat(relativeSize).toFixed(0);\n } else {\n relativeSize = parseFloat(relativeSize).toLocaleString(getCanonicalLocale());\n }\n return relativeSize + \" \" + readableFormat;\n}\nfunction parseFileSize(value, forceBinary = false) {\n try {\n value = `${value}`.toLocaleLowerCase().replaceAll(/\\s+/g, \"\").replaceAll(\",\", \".\");\n } catch (e) {\n return null;\n }\n const match = value.match(/^([0-9]*(\\.[0-9]*)?)([kmgtp]?)(i?)b?$/);\n if (match === null || match[1] === \".\" || match[1] === \"\") {\n return null;\n }\n const bytesArray = {\n \"\": 0,\n k: 1,\n m: 2,\n g: 3,\n t: 4,\n p: 5,\n e: 6\n };\n const decimalString = `${match[1]}`;\n const base = match[4] === \"i\" || forceBinary ? 1024 : 1e3;\n return Math.round(Number.parseFloat(decimalString) * base ** bytesArray[match[3]]);\n}\nfunction stringify(value) {\n if (value instanceof Date) {\n return value.toISOString();\n }\n return String(value);\n}\nfunction orderBy(collection, identifiers2, orders) {\n identifiers2 = identifiers2 ?? [(value) => value];\n orders = orders ?? [];\n const sorting = identifiers2.map((_, index) => (orders[index] ?? \"asc\") === \"asc\" ? 1 : -1);\n const collator = Intl.Collator(\n [getLanguage(), getCanonicalLocale()],\n {\n // handle 10 as ten and not as one-zero\n numeric: true,\n usage: \"sort\"\n }\n );\n return [...collection].sort((a, b) => {\n for (const [index, identifier] of identifiers2.entries()) {\n const value = collator.compare(stringify(identifier(a)), stringify(identifier(b)));\n if (value !== 0) {\n return value * sorting[index];\n }\n }\n return 0;\n });\n}\nvar FilesSortingMode = /* @__PURE__ */ ((FilesSortingMode2) => {\n FilesSortingMode2[\"Name\"] = \"basename\";\n FilesSortingMode2[\"Modified\"] = \"mtime\";\n FilesSortingMode2[\"Size\"] = \"size\";\n return FilesSortingMode2;\n})(FilesSortingMode || {});\nfunction sortNodes(nodes, options = {}) {\n const sortingOptions = {\n // Default to sort by name\n sortingMode: \"basename\",\n // Default to sort ascending\n sortingOrder: \"asc\",\n ...options\n };\n const basename2 = (name) => name.lastIndexOf(\".\") > 0 ? name.slice(0, name.lastIndexOf(\".\")) : name;\n const identifiers2 = [\n // 1: Sort favorites first if enabled\n ...sortingOptions.sortFavoritesFirst ? [(v) => v.attributes?.favorite !== 1] : [],\n // 2: Sort folders first if sorting by name\n ...sortingOptions.sortFoldersFirst ? [(v) => v.type !== \"folder\"] : [],\n // 3: Use sorting mode if NOT basename (to be able to use display name too)\n ...sortingOptions.sortingMode !== \"basename\" ? [(v) => v[sortingOptions.sortingMode]] : [],\n // 4: Use display name if available, fallback to name\n (v) => basename2(v.attributes?.displayname || v.basename),\n // 5: Finally, use basename if all previous sorting methods failed\n (v) => v.basename\n ];\n const orders = [\n // (for 1): always sort favorites before normal files\n ...sortingOptions.sortFavoritesFirst ? [\"asc\"] : [],\n // (for 2): always sort folders before files\n ...sortingOptions.sortFoldersFirst ? [\"asc\"] : [],\n // (for 3): Reverse if sorting by mtime as mtime higher means edited more recent -> lower\n ...sortingOptions.sortingMode === \"mtime\" ? [sortingOptions.sortingOrder === \"asc\" ? \"desc\" : \"asc\"] : [],\n // (also for 3 so make sure not to conflict with 2 and 3)\n ...sortingOptions.sortingMode !== \"mtime\" && sortingOptions.sortingMode !== \"basename\" ? [sortingOptions.sortingOrder] : [],\n // for 4: use configured sorting direction\n sortingOptions.sortingOrder,\n // for 5: use configured sorting direction\n sortingOptions.sortingOrder\n ];\n return orderBy(nodes, identifiers2, orders);\n}\nclass Navigation extends TypedEventTarget {\n _views = [];\n _currentView = null;\n /**\n * Register a new view on the navigation\n * @param view The view to register\n * @throws `Error` is thrown if a view with the same id is already registered\n */\n register(view) {\n if (this._views.find((search) => search.id === view.id)) {\n throw new Error(`View id ${view.id} is already registered`);\n }\n this._views.push(view);\n this.dispatchTypedEvent(\"update\", new CustomEvent(\"update\"));\n }\n /**\n * Remove a registered view\n * @param id The id of the view to remove\n */\n remove(id) {\n const index = this._views.findIndex((view) => view.id === id);\n if (index !== -1) {\n this._views.splice(index, 1);\n this.dispatchTypedEvent(\"update\", new CustomEvent(\"update\"));\n }\n }\n /**\n * Set the currently active view\n * @fires UpdateActiveViewEvent\n * @param view New active view\n */\n setActive(view) {\n this._currentView = view;\n const event = new CustomEvent(\"updateActive\", { detail: view });\n this.dispatchTypedEvent(\"updateActive\", event);\n }\n /**\n * The currently active files view\n */\n get active() {\n return this._currentView;\n }\n /**\n * All registered views\n */\n get views() {\n return this._views;\n }\n}\nconst getNavigation = function() {\n if (typeof window._nc_navigation === \"undefined\") {\n window._nc_navigation = new Navigation();\n logger.debug(\"Navigation service initialized\");\n }\n return window._nc_navigation;\n};\nclass Column {\n _column;\n constructor(column) {\n isValidColumn(column);\n this._column = column;\n }\n get id() {\n return this._column.id;\n }\n get title() {\n return this._column.title;\n }\n get render() {\n return this._column.render;\n }\n get sort() {\n return this._column.sort;\n }\n get summary() {\n return this._column.summary;\n }\n}\nconst isValidColumn = function(column) {\n if (!column.id || typeof column.id !== \"string\") {\n throw new Error(\"A column id is required\");\n }\n if (!column.title || typeof column.title !== \"string\") {\n throw new Error(\"A column title is required\");\n }\n if (!column.render || typeof column.render !== \"function\") {\n throw new Error(\"A render function is required\");\n }\n if (column.sort && typeof column.sort !== \"function\") {\n throw new Error(\"Column sortFunction must be a function\");\n }\n if (column.summary && typeof column.summary !== \"function\") {\n throw new Error(\"Column summary must be a function\");\n }\n return true;\n};\nfunction getDefaultExportFromCjs(x) {\n return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, \"default\") ? x[\"default\"] : x;\n}\nvar validator$2 = {};\nvar util$3 = {};\n(function(exports) {\n const nameStartChar = \":A-Za-z_\\\\u00C0-\\\\u00D6\\\\u00D8-\\\\u00F6\\\\u00F8-\\\\u02FF\\\\u0370-\\\\u037D\\\\u037F-\\\\u1FFF\\\\u200C-\\\\u200D\\\\u2070-\\\\u218F\\\\u2C00-\\\\u2FEF\\\\u3001-\\\\uD7FF\\\\uF900-\\\\uFDCF\\\\uFDF0-\\\\uFFFD\";\n const nameChar = nameStartChar + \"\\\\-.\\\\d\\\\u00B7\\\\u0300-\\\\u036F\\\\u203F-\\\\u2040\";\n const nameRegexp = \"[\" + nameStartChar + \"][\" + nameChar + \"]*\";\n const regexName = new RegExp(\"^\" + nameRegexp + \"$\");\n const getAllMatches = function(string, regex) {\n const matches = [];\n let match = regex.exec(string);\n while (match) {\n const allmatches = [];\n allmatches.startIndex = regex.lastIndex - match[0].length;\n const len = match.length;\n for (let index = 0; index < len; index++) {\n allmatches.push(match[index]);\n }\n matches.push(allmatches);\n match = regex.exec(string);\n }\n return matches;\n };\n const isName = function(string) {\n const match = regexName.exec(string);\n return !(match === null || typeof match === \"undefined\");\n };\n exports.isExist = function(v) {\n return typeof v !== \"undefined\";\n };\n exports.isEmptyObject = function(obj) {\n return Object.keys(obj).length === 0;\n };\n exports.merge = function(target, a, arrayMode) {\n if (a) {\n const keys = Object.keys(a);\n const len = keys.length;\n for (let i = 0; i < len; i++) {\n if (arrayMode === \"strict\") {\n target[keys[i]] = [a[keys[i]]];\n } else {\n target[keys[i]] = a[keys[i]];\n }\n }\n }\n };\n exports.getValue = function(v) {\n if (exports.isExist(v)) {\n return v;\n } else {\n return \"\";\n }\n };\n exports.isName = isName;\n exports.getAllMatches = getAllMatches;\n exports.nameRegexp = nameRegexp;\n})(util$3);\nconst util$2 = util$3;\nconst defaultOptions$2 = {\n allowBooleanAttributes: false,\n //A tag can have attributes without any value\n unpairedTags: []\n};\nvalidator$2.validate = function(xmlData, options) {\n options = Object.assign({}, defaultOptions$2, options);\n const tags = [];\n let tagFound = false;\n let reachedRoot = false;\n if (xmlData[0] === \"\\uFEFF\") {\n xmlData = xmlData.substr(1);\n }\n for (let i = 0; i < xmlData.length; i++) {\n if (xmlData[i] === \"<\" && xmlData[i + 1] === \"?\") {\n i += 2;\n i = readPI(xmlData, i);\n if (i.err) return i;\n } else if (xmlData[i] === \"<\") {\n let tagStartPos = i;\n i++;\n if (xmlData[i] === \"!\") {\n i = readCommentAndCDATA(xmlData, i);\n continue;\n } else {\n let closingTag = false;\n if (xmlData[i] === \"/\") {\n closingTag = true;\n i++;\n }\n let tagName = \"\";\n for (; i < xmlData.length && xmlData[i] !== \">\" && xmlData[i] !== \" \" && xmlData[i] !== \"\t\" && xmlData[i] !== \"\\n\" && xmlData[i] !== \"\\r\"; i++) {\n tagName += xmlData[i];\n }\n tagName = tagName.trim();\n if (tagName[tagName.length - 1] === \"/\") {\n tagName = tagName.substring(0, tagName.length - 1);\n i--;\n }\n if (!validateTagName(tagName)) {\n let msg;\n if (tagName.trim().length === 0) {\n msg = \"Invalid space after '<'.\";\n } else {\n msg = \"Tag '\" + tagName + \"' is an invalid name.\";\n }\n return getErrorObject(\"InvalidTag\", msg, getLineNumberForPosition(xmlData, i));\n }\n const result = readAttributeStr(xmlData, i);\n if (result === false) {\n return getErrorObject(\"InvalidAttr\", \"Attributes for '\" + tagName + \"' have open quote.\", getLineNumberForPosition(xmlData, i));\n }\n let attrStr = result.value;\n i = result.index;\n if (attrStr[attrStr.length - 1] === \"/\") {\n const attrStrStart = i - attrStr.length;\n attrStr = attrStr.substring(0, attrStr.length - 1);\n const isValid = validateAttributeString(attrStr, options);\n if (isValid === true) {\n tagFound = true;\n } else {\n return getErrorObject(isValid.err.code, isValid.err.msg, getLineNumberForPosition(xmlData, attrStrStart + isValid.err.line));\n }\n } else if (closingTag) {\n if (!result.tagClosed) {\n return getErrorObject(\"InvalidTag\", \"Closing tag '\" + tagName + \"' doesn't have proper closing.\", getLineNumberForPosition(xmlData, i));\n } else if (attrStr.trim().length > 0) {\n return getErrorObject(\"InvalidTag\", \"Closing tag '\" + tagName + \"' can't have attributes or invalid starting.\", getLineNumberForPosition(xmlData, tagStartPos));\n } else if (tags.length === 0) {\n return getErrorObject(\"InvalidTag\", \"Closing tag '\" + tagName + \"' has not been opened.\", getLineNumberForPosition(xmlData, tagStartPos));\n } else {\n const otg = tags.pop();\n if (tagName !== otg.tagName) {\n let openPos = getLineNumberForPosition(xmlData, otg.tagStartPos);\n return getErrorObject(\n \"InvalidTag\",\n \"Expected closing tag '\" + otg.tagName + \"' (opened in line \" + openPos.line + \", col \" + openPos.col + \") instead of closing tag '\" + tagName + \"'.\",\n getLineNumberForPosition(xmlData, tagStartPos)\n );\n }\n if (tags.length == 0) {\n reachedRoot = true;\n }\n }\n } else {\n const isValid = validateAttributeString(attrStr, options);\n if (isValid !== true) {\n return getErrorObject(isValid.err.code, isValid.err.msg, getLineNumberForPosition(xmlData, i - attrStr.length + isValid.err.line));\n }\n if (reachedRoot === true) {\n return getErrorObject(\"InvalidXml\", \"Multiple possible root nodes found.\", getLineNumberForPosition(xmlData, i));\n } else if (options.unpairedTags.indexOf(tagName) !== -1) ;\n else {\n tags.push({ tagName, tagStartPos });\n }\n tagFound = true;\n }\n for (i++; i < xmlData.length; i++) {\n if (xmlData[i] === \"<\") {\n if (xmlData[i + 1] === \"!\") {\n i++;\n i = readCommentAndCDATA(xmlData, i);\n continue;\n } else if (xmlData[i + 1] === \"?\") {\n i = readPI(xmlData, ++i);\n if (i.err) return i;\n } else {\n break;\n }\n } else if (xmlData[i] === \"&\") {\n const afterAmp = validateAmpersand(xmlData, i);\n if (afterAmp == -1)\n return getErrorObject(\"InvalidChar\", \"char '&' is not expected.\", getLineNumberForPosition(xmlData, i));\n i = afterAmp;\n } else {\n if (reachedRoot === true && !isWhiteSpace(xmlData[i])) {\n return getErrorObject(\"InvalidXml\", \"Extra text at the end\", getLineNumberForPosition(xmlData, i));\n }\n }\n }\n if (xmlData[i] === \"<\") {\n i--;\n }\n }\n } else {\n if (isWhiteSpace(xmlData[i])) {\n continue;\n }\n return getErrorObject(\"InvalidChar\", \"char '\" + xmlData[i] + \"' is not expected.\", getLineNumberForPosition(xmlData, i));\n }\n }\n if (!tagFound) {\n return getErrorObject(\"InvalidXml\", \"Start tag expected.\", 1);\n } else if (tags.length == 1) {\n return getErrorObject(\"InvalidTag\", \"Unclosed tag '\" + tags[0].tagName + \"'.\", getLineNumberForPosition(xmlData, tags[0].tagStartPos));\n } else if (tags.length > 0) {\n return getErrorObject(\"InvalidXml\", \"Invalid '\" + JSON.stringify(tags.map((t2) => t2.tagName), null, 4).replace(/\\r?\\n/g, \"\") + \"' found.\", { line: 1, col: 1 });\n }\n return true;\n};\nfunction isWhiteSpace(char) {\n return char === \" \" || char === \"\t\" || char === \"\\n\" || char === \"\\r\";\n}\nfunction readPI(xmlData, i) {\n const start = i;\n for (; i < xmlData.length; i++) {\n if (xmlData[i] == \"?\" || xmlData[i] == \" \") {\n const tagname = xmlData.substr(start, i - start);\n if (i > 5 && tagname === \"xml\") {\n return getErrorObject(\"InvalidXml\", \"XML declaration allowed only at the start of the document.\", getLineNumberForPosition(xmlData, i));\n } else if (xmlData[i] == \"?\" && xmlData[i + 1] == \">\") {\n i++;\n break;\n } else {\n continue;\n }\n }\n }\n return i;\n}\nfunction readCommentAndCDATA(xmlData, i) {\n if (xmlData.length > i + 5 && xmlData[i + 1] === \"-\" && xmlData[i + 2] === \"-\") {\n for (i += 3; i < xmlData.length; i++) {\n if (xmlData[i] === \"-\" && xmlData[i + 1] === \"-\" && xmlData[i + 2] === \">\") {\n i += 2;\n break;\n }\n }\n } else if (xmlData.length > i + 8 && xmlData[i + 1] === \"D\" && xmlData[i + 2] === \"O\" && xmlData[i + 3] === \"C\" && xmlData[i + 4] === \"T\" && xmlData[i + 5] === \"Y\" && xmlData[i + 6] === \"P\" && xmlData[i + 7] === \"E\") {\n let angleBracketsCount = 1;\n for (i += 8; i < xmlData.length; i++) {\n if (xmlData[i] === \"<\") {\n angleBracketsCount++;\n } else if (xmlData[i] === \">\") {\n angleBracketsCount--;\n if (angleBracketsCount === 0) {\n break;\n }\n }\n }\n } else if (xmlData.length > i + 9 && xmlData[i + 1] === \"[\" && xmlData[i + 2] === \"C\" && xmlData[i + 3] === \"D\" && xmlData[i + 4] === \"A\" && xmlData[i + 5] === \"T\" && xmlData[i + 6] === \"A\" && xmlData[i + 7] === \"[\") {\n for (i += 8; i < xmlData.length; i++) {\n if (xmlData[i] === \"]\" && xmlData[i + 1] === \"]\" && xmlData[i + 2] === \">\") {\n i += 2;\n break;\n }\n }\n }\n return i;\n}\nconst doubleQuote = '\"';\nconst singleQuote = \"'\";\nfunction readAttributeStr(xmlData, i) {\n let attrStr = \"\";\n let startChar = \"\";\n let tagClosed = false;\n for (; i < xmlData.length; i++) {\n if (xmlData[i] === doubleQuote || xmlData[i] === singleQuote) {\n if (startChar === \"\") {\n startChar = xmlData[i];\n } else if (startChar !== xmlData[i]) ;\n else {\n startChar = \"\";\n }\n } else if (xmlData[i] === \">\") {\n if (startChar === \"\") {\n tagClosed = true;\n break;\n }\n }\n attrStr += xmlData[i];\n }\n if (startChar !== \"\") {\n return false;\n }\n return {\n value: attrStr,\n index: i,\n tagClosed\n };\n}\nconst validAttrStrRegxp = new RegExp(`(\\\\s*)([^\\\\s=]+)(\\\\s*=)?(\\\\s*(['\"])(([\\\\s\\\\S])*?)\\\\5)?`, \"g\");\nfunction validateAttributeString(attrStr, options) {\n const matches = util$2.getAllMatches(attrStr, validAttrStrRegxp);\n const attrNames = {};\n for (let i = 0; i < matches.length; i++) {\n if (matches[i][1].length === 0) {\n return getErrorObject(\"InvalidAttr\", \"Attribute '\" + matches[i][2] + \"' has no space in starting.\", getPositionFromMatch(matches[i]));\n } else if (matches[i][3] !== void 0 && matches[i][4] === void 0) {\n return getErrorObject(\"InvalidAttr\", \"Attribute '\" + matches[i][2] + \"' is without value.\", getPositionFromMatch(matches[i]));\n } else if (matches[i][3] === void 0 && !options.allowBooleanAttributes) {\n return getErrorObject(\"InvalidAttr\", \"boolean attribute '\" + matches[i][2] + \"' is not allowed.\", getPositionFromMatch(matches[i]));\n }\n const attrName = matches[i][2];\n if (!validateAttrName(attrName)) {\n return getErrorObject(\"InvalidAttr\", \"Attribute '\" + attrName + \"' is an invalid name.\", getPositionFromMatch(matches[i]));\n }\n if (!attrNames.hasOwnProperty(attrName)) {\n attrNames[attrName] = 1;\n } else {\n return getErrorObject(\"InvalidAttr\", \"Attribute '\" + attrName + \"' is repeated.\", getPositionFromMatch(matches[i]));\n }\n }\n return true;\n}\nfunction validateNumberAmpersand(xmlData, i) {\n let re2 = /\\d/;\n if (xmlData[i] === \"x\") {\n i++;\n re2 = /[\\da-fA-F]/;\n }\n for (; i < xmlData.length; i++) {\n if (xmlData[i] === \";\")\n return i;\n if (!xmlData[i].match(re2))\n break;\n }\n return -1;\n}\nfunction validateAmpersand(xmlData, i) {\n i++;\n if (xmlData[i] === \";\")\n return -1;\n if (xmlData[i] === \"#\") {\n i++;\n return validateNumberAmpersand(xmlData, i);\n }\n let count = 0;\n for (; i < xmlData.length; i++, count++) {\n if (xmlData[i].match(/\\w/) && count < 20)\n continue;\n if (xmlData[i] === \";\")\n break;\n return -1;\n }\n return i;\n}\nfunction getErrorObject(code, message, lineNumber) {\n return {\n err: {\n code,\n msg: message,\n line: lineNumber.line || lineNumber,\n col: lineNumber.col\n }\n };\n}\nfunction validateAttrName(attrName) {\n return util$2.isName(attrName);\n}\nfunction validateTagName(tagname) {\n return util$2.isName(tagname);\n}\nfunction getLineNumberForPosition(xmlData, index) {\n const lines = xmlData.substring(0, index).split(/\\r?\\n/);\n return {\n line: lines.length,\n // column number is last line's length + 1, because column numbering starts at 1:\n col: lines[lines.length - 1].length + 1\n };\n}\nfunction getPositionFromMatch(match) {\n return match.startIndex + match[1].length;\n}\nvar OptionsBuilder = {};\nconst defaultOptions$1 = {\n preserveOrder: false,\n attributeNamePrefix: \"@_\",\n attributesGroupName: false,\n textNodeName: \"#text\",\n ignoreAttributes: true,\n removeNSPrefix: false,\n // remove NS from tag name or attribute name if true\n allowBooleanAttributes: false,\n //a tag can have attributes without any value\n //ignoreRootElement : false,\n parseTagValue: true,\n parseAttributeValue: false,\n trimValues: true,\n //Trim string values of tag and attributes\n cdataPropName: false,\n numberParseOptions: {\n hex: true,\n leadingZeros: true,\n eNotation: true\n },\n tagValueProcessor: function(tagName, val2) {\n return val2;\n },\n attributeValueProcessor: function(attrName, val2) {\n return val2;\n },\n stopNodes: [],\n //nested tags will not be parsed even for errors\n alwaysCreateTextNode: false,\n isArray: () => false,\n commentPropName: false,\n unpairedTags: [],\n processEntities: true,\n htmlEntities: false,\n ignoreDeclaration: false,\n ignorePiTags: false,\n transformTagName: false,\n transformAttributeName: false,\n updateTag: function(tagName, jPath, attrs) {\n return tagName;\n }\n // skipEmptyListItem: false\n};\nconst buildOptions$1 = function(options) {\n return Object.assign({}, defaultOptions$1, options);\n};\nOptionsBuilder.buildOptions = buildOptions$1;\nOptionsBuilder.defaultOptions = defaultOptions$1;\nclass XmlNode {\n constructor(tagname) {\n this.tagname = tagname;\n this.child = [];\n this[\":@\"] = {};\n }\n add(key, val2) {\n if (key === \"__proto__\") key = \"#__proto__\";\n this.child.push({ [key]: val2 });\n }\n addChild(node) {\n if (node.tagname === \"__proto__\") node.tagname = \"#__proto__\";\n if (node[\":@\"] && Object.keys(node[\":@\"]).length > 0) {\n this.child.push({ [node.tagname]: node.child, [\":@\"]: node[\":@\"] });\n } else {\n this.child.push({ [node.tagname]: node.child });\n }\n }\n}\nvar xmlNode$1 = XmlNode;\nconst util$1 = util$3;\nfunction readDocType$1(xmlData, i) {\n const entities = {};\n if (xmlData[i + 3] === \"O\" && xmlData[i + 4] === \"C\" && xmlData[i + 5] === \"T\" && xmlData[i + 6] === \"Y\" && xmlData[i + 7] === \"P\" && xmlData[i + 8] === \"E\") {\n i = i + 9;\n let angleBracketsCount = 1;\n let hasBody = false, comment = false;\n let exp = \"\";\n for (; i < xmlData.length; i++) {\n if (xmlData[i] === \"<\" && !comment) {\n if (hasBody && isEntity(xmlData, i)) {\n i += 7;\n [entityName, val, i] = readEntityExp(xmlData, i + 1);\n if (val.indexOf(\"&\") === -1)\n entities[validateEntityName(entityName)] = {\n regx: RegExp(`&${entityName};`, \"g\"),\n val\n };\n } else if (hasBody && isElement(xmlData, i)) i += 8;\n else if (hasBody && isAttlist(xmlData, i)) i += 8;\n else if (hasBody && isNotation(xmlData, i)) i += 9;\n else if (isComment) comment = true;\n else throw new Error(\"Invalid DOCTYPE\");\n angleBracketsCount++;\n exp = \"\";\n } else if (xmlData[i] === \">\") {\n if (comment) {\n if (xmlData[i - 1] === \"-\" && xmlData[i - 2] === \"-\") {\n comment = false;\n angleBracketsCount--;\n }\n } else {\n angleBracketsCount--;\n }\n if (angleBracketsCount === 0) {\n break;\n }\n } else if (xmlData[i] === \"[\") {\n hasBody = true;\n } else {\n exp += xmlData[i];\n }\n }\n if (angleBracketsCount !== 0) {\n throw new Error(`Unclosed DOCTYPE`);\n }\n } else {\n throw new Error(`Invalid Tag instead of DOCTYPE`);\n }\n return { entities, i };\n}\nfunction readEntityExp(xmlData, i) {\n let entityName2 = \"\";\n for (; i < xmlData.length && (xmlData[i] !== \"'\" && xmlData[i] !== '\"'); i++) {\n entityName2 += xmlData[i];\n }\n entityName2 = entityName2.trim();\n if (entityName2.indexOf(\" \") !== -1) throw new Error(\"External entites are not supported\");\n const startChar = xmlData[i++];\n let val2 = \"\";\n for (; i < xmlData.length && xmlData[i] !== startChar; i++) {\n val2 += xmlData[i];\n }\n return [entityName2, val2, i];\n}\nfunction isComment(xmlData, i) {\n if (xmlData[i + 1] === \"!\" && xmlData[i + 2] === \"-\" && xmlData[i + 3] === \"-\") return true;\n return false;\n}\nfunction isEntity(xmlData, i) {\n if (xmlData[i + 1] === \"!\" && xmlData[i + 2] === \"E\" && xmlData[i + 3] === \"N\" && xmlData[i + 4] === \"T\" && xmlData[i + 5] === \"I\" && xmlData[i + 6] === \"T\" && xmlData[i + 7] === \"Y\") return true;\n return false;\n}\nfunction isElement(xmlData, i) {\n if (xmlData[i + 1] === \"!\" && xmlData[i + 2] === \"E\" && xmlData[i + 3] === \"L\" && xmlData[i + 4] === \"E\" && xmlData[i + 5] === \"M\" && xmlData[i + 6] === \"E\" && xmlData[i + 7] === \"N\" && xmlData[i + 8] === \"T\") return true;\n return false;\n}\nfunction isAttlist(xmlData, i) {\n if (xmlData[i + 1] === \"!\" && xmlData[i + 2] === \"A\" && xmlData[i + 3] === \"T\" && xmlData[i + 4] === \"T\" && xmlData[i + 5] === \"L\" && xmlData[i + 6] === \"I\" && xmlData[i + 7] === \"S\" && xmlData[i + 8] === \"T\") return true;\n return false;\n}\nfunction isNotation(xmlData, i) {\n if (xmlData[i + 1] === \"!\" && xmlData[i + 2] === \"N\" && xmlData[i + 3] === \"O\" && xmlData[i + 4] === \"T\" && xmlData[i + 5] === \"A\" && xmlData[i + 6] === \"T\" && xmlData[i + 7] === \"I\" && xmlData[i + 8] === \"O\" && xmlData[i + 9] === \"N\") return true;\n return false;\n}\nfunction validateEntityName(name) {\n if (util$1.isName(name))\n return name;\n else\n throw new Error(`Invalid entity name ${name}`);\n}\nvar DocTypeReader = readDocType$1;\nconst hexRegex = /^[-+]?0x[a-fA-F0-9]+$/;\nconst numRegex = /^([\\-\\+])?(0*)(\\.[0-9]+([eE]\\-?[0-9]+)?|[0-9]+(\\.[0-9]+([eE]\\-?[0-9]+)?)?)$/;\nif (!Number.parseInt && window.parseInt) {\n Number.parseInt = window.parseInt;\n}\nif (!Number.parseFloat && window.parseFloat) {\n Number.parseFloat = window.parseFloat;\n}\nconst consider = {\n hex: true,\n leadingZeros: true,\n decimalPoint: \".\",\n eNotation: true\n //skipLike: /regex/\n};\nfunction toNumber$1(str, options = {}) {\n options = Object.assign({}, consider, options);\n if (!str || typeof str !== \"string\") return str;\n let trimmedStr = str.trim();\n if (options.skipLike !== void 0 && options.skipLike.test(trimmedStr)) return str;\n else if (options.hex && hexRegex.test(trimmedStr)) {\n return Number.parseInt(trimmedStr, 16);\n } else {\n const match = numRegex.exec(trimmedStr);\n if (match) {\n const sign = match[1];\n const leadingZeros = match[2];\n let numTrimmedByZeros = trimZeros(match[3]);\n const eNotation = match[4] || match[6];\n if (!options.leadingZeros && leadingZeros.length > 0 && sign && trimmedStr[2] !== \".\") return str;\n else if (!options.leadingZeros && leadingZeros.length > 0 && !sign && trimmedStr[1] !== \".\") return str;\n else {\n const num = Number(trimmedStr);\n const numStr = \"\" + num;\n if (numStr.search(/[eE]/) !== -1) {\n if (options.eNotation) return num;\n else return str;\n } else if (eNotation) {\n if (options.eNotation) return num;\n else return str;\n } else if (trimmedStr.indexOf(\".\") !== -1) {\n if (numStr === \"0\" && numTrimmedByZeros === \"\") return num;\n else if (numStr === numTrimmedByZeros) return num;\n else if (sign && numStr === \"-\" + numTrimmedByZeros) return num;\n else return str;\n }\n if (leadingZeros) {\n if (numTrimmedByZeros === numStr) return num;\n else if (sign + numTrimmedByZeros === numStr) return num;\n else return str;\n }\n if (trimmedStr === numStr) return num;\n else if (trimmedStr === sign + numStr) return num;\n return str;\n }\n } else {\n return str;\n }\n }\n}\nfunction trimZeros(numStr) {\n if (numStr && numStr.indexOf(\".\") !== -1) {\n numStr = numStr.replace(/0+$/, \"\");\n if (numStr === \".\") numStr = \"0\";\n else if (numStr[0] === \".\") numStr = \"0\" + numStr;\n else if (numStr[numStr.length - 1] === \".\") numStr = numStr.substr(0, numStr.length - 1);\n return numStr;\n }\n return numStr;\n}\nvar strnum = toNumber$1;\nconst util = util$3;\nconst xmlNode = xmlNode$1;\nconst readDocType = DocTypeReader;\nconst toNumber = strnum;\nlet OrderedObjParser$1 = class OrderedObjParser {\n constructor(options) {\n this.options = options;\n this.currentNode = null;\n this.tagsNodeStack = [];\n this.docTypeEntities = {};\n this.lastEntities = {\n \"apos\": { regex: /&(apos|#39|#x27);/g, val: \"'\" },\n \"gt\": { regex: /&(gt|#62|#x3E);/g, val: \">\" },\n \"lt\": { regex: /&(lt|#60|#x3C);/g, val: \"<\" },\n \"quot\": { regex: /&(quot|#34|#x22);/g, val: '\"' }\n };\n this.ampEntity = { regex: /&(amp|#38|#x26);/g, val: \"&\" };\n this.htmlEntities = {\n \"space\": { regex: /&(nbsp|#160);/g, val: \" \" },\n // \"lt\" : { regex: /&(lt|#60);/g, val: \"<\" },\n // \"gt\" : { regex: /&(gt|#62);/g, val: \">\" },\n // \"amp\" : { regex: /&(amp|#38);/g, val: \"&\" },\n // \"quot\" : { regex: /&(quot|#34);/g, val: \"\\\"\" },\n // \"apos\" : { regex: /&(apos|#39);/g, val: \"'\" },\n \"cent\": { regex: /&(cent|#162);/g, val: \"¢\" },\n \"pound\": { regex: /&(pound|#163);/g, val: \"£\" },\n \"yen\": { regex: /&(yen|#165);/g, val: \"¥\" },\n \"euro\": { regex: /&(euro|#8364);/g, val: \"€\" },\n \"copyright\": { regex: /&(copy|#169);/g, val: \"©\" },\n \"reg\": { regex: /&(reg|#174);/g, val: \"®\" },\n \"inr\": { regex: /&(inr|#8377);/g, val: \"₹\" },\n \"num_dec\": { regex: /&#([0-9]{1,7});/g, val: (_, str) => String.fromCharCode(Number.parseInt(str, 10)) },\n \"num_hex\": { regex: /&#x([0-9a-fA-F]{1,6});/g, val: (_, str) => String.fromCharCode(Number.parseInt(str, 16)) }\n };\n this.addExternalEntities = addExternalEntities;\n this.parseXml = parseXml;\n this.parseTextData = parseTextData;\n this.resolveNameSpace = resolveNameSpace;\n this.buildAttributesMap = buildAttributesMap;\n this.isItStopNode = isItStopNode;\n this.replaceEntitiesValue = replaceEntitiesValue$1;\n this.readStopNodeData = readStopNodeData;\n this.saveTextToParentTag = saveTextToParentTag;\n this.addChild = addChild;\n }\n};\nfunction addExternalEntities(externalEntities) {\n const entKeys = Object.keys(externalEntities);\n for (let i = 0; i < entKeys.length; i++) {\n const ent = entKeys[i];\n this.lastEntities[ent] = {\n regex: new RegExp(\"&\" + ent + \";\", \"g\"),\n val: externalEntities[ent]\n };\n }\n}\nfunction parseTextData(val2, tagName, jPath, dontTrim, hasAttributes, isLeafNode, escapeEntities) {\n if (val2 !== void 0) {\n if (this.options.trimValues && !dontTrim) {\n val2 = val2.trim();\n }\n if (val2.length > 0) {\n if (!escapeEntities) val2 = this.replaceEntitiesValue(val2);\n const newval = this.options.tagValueProcessor(tagName, val2, jPath, hasAttributes, isLeafNode);\n if (newval === null || newval === void 0) {\n return val2;\n } else if (typeof newval !== typeof val2 || newval !== val2) {\n return newval;\n } else if (this.options.trimValues) {\n return parseValue(val2, this.options.parseTagValue, this.options.numberParseOptions);\n } else {\n const trimmedVal = val2.trim();\n if (trimmedVal === val2) {\n return parseValue(val2, this.options.parseTagValue, this.options.numberParseOptions);\n } else {\n return val2;\n }\n }\n }\n }\n}\nfunction resolveNameSpace(tagname) {\n if (this.options.removeNSPrefix) {\n const tags = tagname.split(\":\");\n const prefix = tagname.charAt(0) === \"/\" ? \"/\" : \"\";\n if (tags[0] === \"xmlns\") {\n return \"\";\n }\n if (tags.length === 2) {\n tagname = prefix + tags[1];\n }\n }\n return tagname;\n}\nconst attrsRegx = new RegExp(`([^\\\\s=]+)\\\\s*(=\\\\s*(['\"])([\\\\s\\\\S]*?)\\\\3)?`, \"gm\");\nfunction buildAttributesMap(attrStr, jPath, tagName) {\n if (!this.options.ignoreAttributes && typeof attrStr === \"string\") {\n const matches = util.getAllMatches(attrStr, attrsRegx);\n const len = matches.length;\n const attrs = {};\n for (let i = 0; i < len; i++) {\n const attrName = this.resolveNameSpace(matches[i][1]);\n let oldVal = matches[i][4];\n let aName = this.options.attributeNamePrefix + attrName;\n if (attrName.length) {\n if (this.options.transformAttributeName) {\n aName = this.options.transformAttributeName(aName);\n }\n if (aName === \"__proto__\") aName = \"#__proto__\";\n if (oldVal !== void 0) {\n if (this.options.trimValues) {\n oldVal = oldVal.trim();\n }\n oldVal = this.replaceEntitiesValue(oldVal);\n const newVal = this.options.attributeValueProcessor(attrName, oldVal, jPath);\n if (newVal === null || newVal === void 0) {\n attrs[aName] = oldVal;\n } else if (typeof newVal !== typeof oldVal || newVal !== oldVal) {\n attrs[aName] = newVal;\n } else {\n attrs[aName] = parseValue(\n oldVal,\n this.options.parseAttributeValue,\n this.options.numberParseOptions\n );\n }\n } else if (this.options.allowBooleanAttributes) {\n attrs[aName] = true;\n }\n }\n }\n if (!Object.keys(attrs).length) {\n return;\n }\n if (this.options.attributesGroupName) {\n const attrCollection = {};\n attrCollection[this.options.attributesGroupName] = attrs;\n return attrCollection;\n }\n return attrs;\n }\n}\nconst parseXml = function(xmlData) {\n xmlData = xmlData.replace(/\\r\\n?/g, \"\\n\");\n const xmlObj = new xmlNode(\"!xml\");\n let currentNode = xmlObj;\n let textData = \"\";\n let jPath = \"\";\n for (let i = 0; i < xmlData.length; i++) {\n const ch = xmlData[i];\n if (ch === \"<\") {\n if (xmlData[i + 1] === \"/\") {\n const closeIndex = findClosingIndex(xmlData, \">\", i, \"Closing Tag is not closed.\");\n let tagName = xmlData.substring(i + 2, closeIndex).trim();\n if (this.options.removeNSPrefix) {\n const colonIndex = tagName.indexOf(\":\");\n if (colonIndex !== -1) {\n tagName = tagName.substr(colonIndex + 1);\n }\n }\n if (this.options.transformTagName) {\n tagName = this.options.transformTagName(tagName);\n }\n if (currentNode) {\n textData = this.saveTextToParentTag(textData, currentNode, jPath);\n }\n const lastTagName = jPath.substring(jPath.lastIndexOf(\".\") + 1);\n if (tagName && this.options.unpairedTags.indexOf(tagName) !== -1) {\n throw new Error(`Unpaired tag can not be used as closing tag: </${tagName}>`);\n }\n let propIndex = 0;\n if (lastTagName && this.options.unpairedTags.indexOf(lastTagName) !== -1) {\n propIndex = jPath.lastIndexOf(\".\", jPath.lastIndexOf(\".\") - 1);\n this.tagsNodeStack.pop();\n } else {\n propIndex = jPath.lastIndexOf(\".\");\n }\n jPath = jPath.substring(0, propIndex);\n currentNode = this.tagsNodeStack.pop();\n textData = \"\";\n i = closeIndex;\n } else if (xmlData[i + 1] === \"?\") {\n let tagData = readTagExp(xmlData, i, false, \"?>\");\n if (!tagData) throw new Error(\"Pi Tag is not closed.\");\n textData = this.saveTextToParentTag(textData, currentNode, jPath);\n if (this.options.ignoreDeclaration && tagData.tagName === \"?xml\" || this.options.ignorePiTags) ;\n else {\n const childNode = new xmlNode(tagData.tagName);\n childNode.add(this.options.textNodeName, \"\");\n if (tagData.tagName !== tagData.tagExp && tagData.attrExpPresent) {\n childNode[\":@\"] = this.buildAttributesMap(tagData.tagExp, jPath, tagData.tagName);\n }\n this.addChild(currentNode, childNode, jPath);\n }\n i = tagData.closeIndex + 1;\n } else if (xmlData.substr(i + 1, 3) === \"!--\") {\n const endIndex = findClosingIndex(xmlData, \"-->\", i + 4, \"Comment is not closed.\");\n if (this.options.commentPropName) {\n const comment = xmlData.substring(i + 4, endIndex - 2);\n textData = this.saveTextToParentTag(textData, currentNode, jPath);\n currentNode.add(this.options.commentPropName, [{ [this.options.textNodeName]: comment }]);\n }\n i = endIndex;\n } else if (xmlData.substr(i + 1, 2) === \"!D\") {\n const result = readDocType(xmlData, i);\n this.docTypeEntities = result.entities;\n i = result.i;\n } else if (xmlData.substr(i + 1, 2) === \"![\") {\n const closeIndex = findClosingIndex(xmlData, \"]]>\", i, \"CDATA is not closed.\") - 2;\n const tagExp = xmlData.substring(i + 9, closeIndex);\n textData = this.saveTextToParentTag(textData, currentNode, jPath);\n let val2 = this.parseTextData(tagExp, currentNode.tagname, jPath, true, false, true, true);\n if (val2 == void 0) val2 = \"\";\n if (this.options.cdataPropName) {\n currentNode.add(this.options.cdataPropName, [{ [this.options.textNodeName]: tagExp }]);\n } else {\n currentNode.add(this.options.textNodeName, val2);\n }\n i = closeIndex + 2;\n } else {\n let result = readTagExp(xmlData, i, this.options.removeNSPrefix);\n let tagName = result.tagName;\n const rawTagName = result.rawTagName;\n let tagExp = result.tagExp;\n let attrExpPresent = result.attrExpPresent;\n let closeIndex = result.closeIndex;\n if (this.options.transformTagName) {\n tagName = this.options.transformTagName(tagName);\n }\n if (currentNode && textData) {\n if (currentNode.tagname !== \"!xml\") {\n textData = this.saveTextToParentTag(textData, currentNode, jPath, false);\n }\n }\n const lastTag = currentNode;\n if (lastTag && this.options.unpairedTags.indexOf(lastTag.tagname) !== -1) {\n currentNode = this.tagsNodeStack.pop();\n jPath = jPath.substring(0, jPath.lastIndexOf(\".\"));\n }\n if (tagName !== xmlObj.tagname) {\n jPath += jPath ? \".\" + tagName : tagName;\n }\n if (this.isItStopNode(this.options.stopNodes, jPath, tagName)) {\n let tagContent = \"\";\n if (tagExp.length > 0 && tagExp.lastIndexOf(\"/\") === tagExp.length - 1) {\n if (tagName[tagName.length - 1] === \"/\") {\n tagName = tagName.substr(0, tagName.length - 1);\n jPath = jPath.substr(0, jPath.length - 1);\n tagExp = tagName;\n } else {\n tagExp = tagExp.substr(0, tagExp.length - 1);\n }\n i = result.closeIndex;\n } else if (this.options.unpairedTags.indexOf(tagName) !== -1) {\n i = result.closeIndex;\n } else {\n const result2 = this.readStopNodeData(xmlData, rawTagName, closeIndex + 1);\n if (!result2) throw new Error(`Unexpected end of ${rawTagName}`);\n i = result2.i;\n tagContent = result2.tagContent;\n }\n const childNode = new xmlNode(tagName);\n if (tagName !== tagExp && attrExpPresent) {\n childNode[\":@\"] = this.buildAttributesMap(tagExp, jPath, tagName);\n }\n if (tagContent) {\n tagContent = this.parseTextData(tagContent, tagName, jPath, true, attrExpPresent, true, true);\n }\n jPath = jPath.substr(0, jPath.lastIndexOf(\".\"));\n childNode.add(this.options.textNodeName, tagContent);\n this.addChild(currentNode, childNode, jPath);\n } else {\n if (tagExp.length > 0 && tagExp.lastIndexOf(\"/\") === tagExp.length - 1) {\n if (tagName[tagName.length - 1] === \"/\") {\n tagName = tagName.substr(0, tagName.length - 1);\n jPath = jPath.substr(0, jPath.length - 1);\n tagExp = tagName;\n } else {\n tagExp = tagExp.substr(0, tagExp.length - 1);\n }\n if (this.options.transformTagName) {\n tagName = this.options.transformTagName(tagName);\n }\n const childNode = new xmlNode(tagName);\n if (tagName !== tagExp && attrExpPresent) {\n childNode[\":@\"] = this.buildAttributesMap(tagExp, jPath, tagName);\n }\n this.addChild(currentNode, childNode, jPath);\n jPath = jPath.substr(0, jPath.lastIndexOf(\".\"));\n } else {\n const childNode = new xmlNode(tagName);\n this.tagsNodeStack.push(currentNode);\n if (tagName !== tagExp && attrExpPresent) {\n childNode[\":@\"] = this.buildAttributesMap(tagExp, jPath, tagName);\n }\n this.addChild(currentNode, childNode, jPath);\n currentNode = childNode;\n }\n textData = \"\";\n i = closeIndex;\n }\n }\n } else {\n textData += xmlData[i];\n }\n }\n return xmlObj.child;\n};\nfunction addChild(currentNode, childNode, jPath) {\n const result = this.options.updateTag(childNode.tagname, jPath, childNode[\":@\"]);\n if (result === false) ;\n else if (typeof result === \"string\") {\n childNode.tagname = result;\n currentNode.addChild(childNode);\n } else {\n currentNode.addChild(childNode);\n }\n}\nconst replaceEntitiesValue$1 = function(val2) {\n if (this.options.processEntities) {\n for (let entityName2 in this.docTypeEntities) {\n const entity = this.docTypeEntities[entityName2];\n val2 = val2.replace(entity.regx, entity.val);\n }\n for (let entityName2 in this.lastEntities) {\n const entity = this.lastEntities[entityName2];\n val2 = val2.replace(entity.regex, entity.val);\n }\n if (this.options.htmlEntities) {\n for (let entityName2 in this.htmlEntities) {\n const entity = this.htmlEntities[entityName2];\n val2 = val2.replace(entity.regex, entity.val);\n }\n }\n val2 = val2.replace(this.ampEntity.regex, this.ampEntity.val);\n }\n return val2;\n};\nfunction saveTextToParentTag(textData, currentNode, jPath, isLeafNode) {\n if (textData) {\n if (isLeafNode === void 0) isLeafNode = Object.keys(currentNode.child).length === 0;\n textData = this.parseTextData(\n textData,\n currentNode.tagname,\n jPath,\n false,\n currentNode[\":@\"] ? Object.keys(currentNode[\":@\"]).length !== 0 : false,\n isLeafNode\n );\n if (textData !== void 0 && textData !== \"\")\n currentNode.add(this.options.textNodeName, textData);\n textData = \"\";\n }\n return textData;\n}\nfunction isItStopNode(stopNodes, jPath, currentTagName) {\n const allNodesExp = \"*.\" + currentTagName;\n for (const stopNodePath in stopNodes) {\n const stopNodeExp = stopNodes[stopNodePath];\n if (allNodesExp === stopNodeExp || jPath === stopNodeExp) return true;\n }\n return false;\n}\nfunction tagExpWithClosingIndex(xmlData, i, closingChar = \">\") {\n let attrBoundary;\n let tagExp = \"\";\n for (let index = i; index < xmlData.length; index++) {\n let ch = xmlData[index];\n if (attrBoundary) {\n if (ch === attrBoundary) attrBoundary = \"\";\n } else if (ch === '\"' || ch === \"'\") {\n attrBoundary = ch;\n } else if (ch === closingChar[0]) {\n if (closingChar[1]) {\n if (xmlData[index + 1] === closingChar[1]) {\n return {\n data: tagExp,\n index\n };\n }\n } else {\n return {\n data: tagExp,\n index\n };\n }\n } else if (ch === \"\t\") {\n ch = \" \";\n }\n tagExp += ch;\n }\n}\nfunction findClosingIndex(xmlData, str, i, errMsg) {\n const closingIndex = xmlData.indexOf(str, i);\n if (closingIndex === -1) {\n throw new Error(errMsg);\n } else {\n return closingIndex + str.length - 1;\n }\n}\nfunction readTagExp(xmlData, i, removeNSPrefix, closingChar = \">\") {\n const result = tagExpWithClosingIndex(xmlData, i + 1, closingChar);\n if (!result) return;\n let tagExp = result.data;\n const closeIndex = result.index;\n const separatorIndex = tagExp.search(/\\s/);\n let tagName = tagExp;\n let attrExpPresent = true;\n if (separatorIndex !== -1) {\n tagName = tagExp.substring(0, separatorIndex);\n tagExp = tagExp.substring(separatorIndex + 1).trimStart();\n }\n const rawTagName = tagName;\n if (removeNSPrefix) {\n const colonIndex = tagName.indexOf(\":\");\n if (colonIndex !== -1) {\n tagName = tagName.substr(colonIndex + 1);\n attrExpPresent = tagName !== result.data.substr(colonIndex + 1);\n }\n }\n return {\n tagName,\n tagExp,\n closeIndex,\n attrExpPresent,\n rawTagName\n };\n}\nfunction readStopNodeData(xmlData, tagName, i) {\n const startIndex = i;\n let openTagCount = 1;\n for (; i < xmlData.length; i++) {\n if (xmlData[i] === \"<\") {\n if (xmlData[i + 1] === \"/\") {\n const closeIndex = findClosingIndex(xmlData, \">\", i, `${tagName} is not closed`);\n let closeTagName = xmlData.substring(i + 2, closeIndex).trim();\n if (closeTagName === tagName) {\n openTagCount--;\n if (openTagCount === 0) {\n return {\n tagContent: xmlData.substring(startIndex, i),\n i: closeIndex\n };\n }\n }\n i = closeIndex;\n } else if (xmlData[i + 1] === \"?\") {\n const closeIndex = findClosingIndex(xmlData, \"?>\", i + 1, \"StopNode is not closed.\");\n i = closeIndex;\n } else if (xmlData.substr(i + 1, 3) === \"!--\") {\n const closeIndex = findClosingIndex(xmlData, \"-->\", i + 3, \"StopNode is not closed.\");\n i = closeIndex;\n } else if (xmlData.substr(i + 1, 2) === \"![\") {\n const closeIndex = findClosingIndex(xmlData, \"]]>\", i, \"StopNode is not closed.\") - 2;\n i = closeIndex;\n } else {\n const tagData = readTagExp(xmlData, i, \">\");\n if (tagData) {\n const openTagName = tagData && tagData.tagName;\n if (openTagName === tagName && tagData.tagExp[tagData.tagExp.length - 1] !== \"/\") {\n openTagCount++;\n }\n i = tagData.closeIndex;\n }\n }\n }\n }\n}\nfunction parseValue(val2, shouldParse, options) {\n if (shouldParse && typeof val2 === \"string\") {\n const newval = val2.trim();\n if (newval === \"true\") return true;\n else if (newval === \"false\") return false;\n else return toNumber(val2, options);\n } else {\n if (util.isExist(val2)) {\n return val2;\n } else {\n return \"\";\n }\n }\n}\nvar OrderedObjParser_1 = OrderedObjParser$1;\nvar node2json = {};\nfunction prettify$1(node, options) {\n return compress(node, options);\n}\nfunction compress(arr, options, jPath) {\n let text;\n const compressedObj = {};\n for (let i = 0; i < arr.length; i++) {\n const tagObj = arr[i];\n const property = propName$1(tagObj);\n let newJpath = \"\";\n if (jPath === void 0) newJpath = property;\n else newJpath = jPath + \".\" + property;\n if (property === options.textNodeName) {\n if (text === void 0) text = tagObj[property];\n else text += \"\" + tagObj[property];\n } else if (property === void 0) {\n continue;\n } else if (tagObj[property]) {\n let val2 = compress(tagObj[property], options, newJpath);\n const isLeaf = isLeafTag(val2, options);\n if (tagObj[\":@\"]) {\n assignAttributes(val2, tagObj[\":@\"], newJpath, options);\n } else if (Object.keys(val2).length === 1 && val2[options.textNodeName] !== void 0 && !options.alwaysCreateTextNode) {\n val2 = val2[options.textNodeName];\n } else if (Object.keys(val2).length === 0) {\n if (options.alwaysCreateTextNode) val2[options.textNodeName] = \"\";\n else val2 = \"\";\n }\n if (compressedObj[property] !== void 0 && compressedObj.hasOwnProperty(property)) {\n if (!Array.isArray(compressedObj[property])) {\n compressedObj[property] = [compressedObj[property]];\n }\n compressedObj[property].push(val2);\n } else {\n if (options.isArray(property, newJpath, isLeaf)) {\n compressedObj[property] = [val2];\n } else {\n compressedObj[property] = val2;\n }\n }\n }\n }\n if (typeof text === \"string\") {\n if (text.length > 0) compressedObj[options.textNodeName] = text;\n } else if (text !== void 0) compressedObj[options.textNodeName] = text;\n return compressedObj;\n}\nfunction propName$1(obj) {\n const keys = Object.keys(obj);\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n if (key !== \":@\") return key;\n }\n}\nfunction assignAttributes(obj, attrMap, jpath, options) {\n if (attrMap) {\n const keys = Object.keys(attrMap);\n const len = keys.length;\n for (let i = 0; i < len; i++) {\n const atrrName = keys[i];\n if (options.isArray(atrrName, jpath + \".\" + atrrName, true, true)) {\n obj[atrrName] = [attrMap[atrrName]];\n } else {\n obj[atrrName] = attrMap[atrrName];\n }\n }\n }\n}\nfunction isLeafTag(obj, options) {\n const { textNodeName } = options;\n const propCount = Object.keys(obj).length;\n if (propCount === 0) {\n return true;\n }\n if (propCount === 1 && (obj[textNodeName] || typeof obj[textNodeName] === \"boolean\" || obj[textNodeName] === 0)) {\n return true;\n }\n return false;\n}\nnode2json.prettify = prettify$1;\nconst { buildOptions } = OptionsBuilder;\nconst OrderedObjParser2 = OrderedObjParser_1;\nconst { prettify } = node2json;\nconst validator$1 = validator$2;\nlet XMLParser$1 = class XMLParser {\n constructor(options) {\n this.externalEntities = {};\n this.options = buildOptions(options);\n }\n /**\n * Parse XML dats to JS object \n * @param {string|Buffer} xmlData \n * @param {boolean|Object} validationOption \n */\n parse(xmlData, validationOption) {\n if (typeof xmlData === \"string\") ;\n else if (xmlData.toString) {\n xmlData = xmlData.toString();\n } else {\n throw new Error(\"XML data is accepted in String or Bytes[] form.\");\n }\n if (validationOption) {\n if (validationOption === true) validationOption = {};\n const result = validator$1.validate(xmlData, validationOption);\n if (result !== true) {\n throw Error(`${result.err.msg}:${result.err.line}:${result.err.col}`);\n }\n }\n const orderedObjParser = new OrderedObjParser2(this.options);\n orderedObjParser.addExternalEntities(this.externalEntities);\n const orderedResult = orderedObjParser.parseXml(xmlData);\n if (this.options.preserveOrder || orderedResult === void 0) return orderedResult;\n else return prettify(orderedResult, this.options);\n }\n /**\n * Add Entity which is not by default supported by this library\n * @param {string} key \n * @param {string} value \n */\n addEntity(key, value) {\n if (value.indexOf(\"&\") !== -1) {\n throw new Error(\"Entity value can't have '&'\");\n } else if (key.indexOf(\"&\") !== -1 || key.indexOf(\";\") !== -1) {\n throw new Error(\"An entity must be set without '&' and ';'. Eg. use '#xD' for '&#xD;'\");\n } else if (value === \"&\") {\n throw new Error(\"An entity with value '&' is not permitted\");\n } else {\n this.externalEntities[key] = value;\n }\n }\n};\nvar XMLParser_1 = XMLParser$1;\nconst EOL = \"\\n\";\nfunction toXml(jArray, options) {\n let indentation = \"\";\n if (options.format && options.indentBy.length > 0) {\n indentation = EOL;\n }\n return arrToStr(jArray, options, \"\", indentation);\n}\nfunction arrToStr(arr, options, jPath, indentation) {\n let xmlStr = \"\";\n let isPreviousElementTag = false;\n for (let i = 0; i < arr.length; i++) {\n const tagObj = arr[i];\n const tagName = propName(tagObj);\n if (tagName === void 0) continue;\n let newJPath = \"\";\n if (jPath.length === 0) newJPath = tagName;\n else newJPath = `${jPath}.${tagName}`;\n if (tagName === options.textNodeName) {\n let tagText = tagObj[tagName];\n if (!isStopNode(newJPath, options)) {\n tagText = options.tagValueProcessor(tagName, tagText);\n tagText = replaceEntitiesValue(tagText, options);\n }\n if (isPreviousElementTag) {\n xmlStr += indentation;\n }\n xmlStr += tagText;\n isPreviousElementTag = false;\n continue;\n } else if (tagName === options.cdataPropName) {\n if (isPreviousElementTag) {\n xmlStr += indentation;\n }\n xmlStr += `<![CDATA[${tagObj[tagName][0][options.textNodeName]}]]>`;\n isPreviousElementTag = false;\n continue;\n } else if (tagName === options.commentPropName) {\n xmlStr += indentation + `<!--${tagObj[tagName][0][options.textNodeName]}-->`;\n isPreviousElementTag = true;\n continue;\n } else if (tagName[0] === \"?\") {\n const attStr2 = attr_to_str(tagObj[\":@\"], options);\n const tempInd = tagName === \"?xml\" ? \"\" : indentation;\n let piTextNodeName = tagObj[tagName][0][options.textNodeName];\n piTextNodeName = piTextNodeName.length !== 0 ? \" \" + piTextNodeName : \"\";\n xmlStr += tempInd + `<${tagName}${piTextNodeName}${attStr2}?>`;\n isPreviousElementTag = true;\n continue;\n }\n let newIdentation = indentation;\n if (newIdentation !== \"\") {\n newIdentation += options.indentBy;\n }\n const attStr = attr_to_str(tagObj[\":@\"], options);\n const tagStart = indentation + `<${tagName}${attStr}`;\n const tagValue = arrToStr(tagObj[tagName], options, newJPath, newIdentation);\n if (options.unpairedTags.indexOf(tagName) !== -1) {\n if (options.suppressUnpairedNode) xmlStr += tagStart + \">\";\n else xmlStr += tagStart + \"/>\";\n } else if ((!tagValue || tagValue.length === 0) && options.suppressEmptyNode) {\n xmlStr += tagStart + \"/>\";\n } else if (tagValue && tagValue.endsWith(\">\")) {\n xmlStr += tagStart + `>${tagValue}${indentation}</${tagName}>`;\n } else {\n xmlStr += tagStart + \">\";\n if (tagValue && indentation !== \"\" && (tagValue.includes(\"/>\") || tagValue.includes(\"</\"))) {\n xmlStr += indentation + options.indentBy + tagValue + indentation;\n } else {\n xmlStr += tagValue;\n }\n xmlStr += `</${tagName}>`;\n }\n isPreviousElementTag = true;\n }\n return xmlStr;\n}\nfunction propName(obj) {\n const keys = Object.keys(obj);\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n if (!obj.hasOwnProperty(key)) continue;\n if (key !== \":@\") return key;\n }\n}\nfunction attr_to_str(attrMap, options) {\n let attrStr = \"\";\n if (attrMap && !options.ignoreAttributes) {\n for (let attr in attrMap) {\n if (!attrMap.hasOwnProperty(attr)) continue;\n let attrVal = options.attributeValueProcessor(attr, attrMap[attr]);\n attrVal = replaceEntitiesValue(attrVal, options);\n if (attrVal === true && options.suppressBooleanAttributes) {\n attrStr += ` ${attr.substr(options.attributeNamePrefix.length)}`;\n } else {\n attrStr += ` ${attr.substr(options.attributeNamePrefix.length)}=\"${attrVal}\"`;\n }\n }\n }\n return attrStr;\n}\nfunction isStopNode(jPath, options) {\n jPath = jPath.substr(0, jPath.length - options.textNodeName.length - 1);\n let tagName = jPath.substr(jPath.lastIndexOf(\".\") + 1);\n for (let index in options.stopNodes) {\n if (options.stopNodes[index] === jPath || options.stopNodes[index] === \"*.\" + tagName) return true;\n }\n return false;\n}\nfunction replaceEntitiesValue(textValue, options) {\n if (textValue && textValue.length > 0 && options.processEntities) {\n for (let i = 0; i < options.entities.length; i++) {\n const entity = options.entities[i];\n textValue = textValue.replace(entity.regex, entity.val);\n }\n }\n return textValue;\n}\nvar orderedJs2Xml = toXml;\nconst buildFromOrderedJs = orderedJs2Xml;\nconst defaultOptions = {\n attributeNamePrefix: \"@_\",\n attributesGroupName: false,\n textNodeName: \"#text\",\n ignoreAttributes: true,\n cdataPropName: false,\n format: false,\n indentBy: \" \",\n suppressEmptyNode: false,\n suppressUnpairedNode: true,\n suppressBooleanAttributes: true,\n tagValueProcessor: function(key, a) {\n return a;\n },\n attributeValueProcessor: function(attrName, a) {\n return a;\n },\n preserveOrder: false,\n commentPropName: false,\n unpairedTags: [],\n entities: [\n { regex: new RegExp(\"&\", \"g\"), val: \"&amp;\" },\n //it must be on top\n { regex: new RegExp(\">\", \"g\"), val: \"&gt;\" },\n { regex: new RegExp(\"<\", \"g\"), val: \"&lt;\" },\n { regex: new RegExp(\"'\", \"g\"), val: \"&apos;\" },\n { regex: new RegExp('\"', \"g\"), val: \"&quot;\" }\n ],\n processEntities: true,\n stopNodes: [],\n // transformTagName: false,\n // transformAttributeName: false,\n oneListGroup: false\n};\nfunction Builder(options) {\n this.options = Object.assign({}, defaultOptions, options);\n if (this.options.ignoreAttributes || this.options.attributesGroupName) {\n this.isAttribute = function() {\n return false;\n };\n } else {\n this.attrPrefixLen = this.options.attributeNamePrefix.length;\n this.isAttribute = isAttribute;\n }\n this.processTextOrObjNode = processTextOrObjNode;\n if (this.options.format) {\n this.indentate = indentate;\n this.tagEndChar = \">\\n\";\n this.newLine = \"\\n\";\n } else {\n this.indentate = function() {\n return \"\";\n };\n this.tagEndChar = \">\";\n this.newLine = \"\";\n }\n}\nBuilder.prototype.build = function(jObj) {\n if (this.options.preserveOrder) {\n return buildFromOrderedJs(jObj, this.options);\n } else {\n if (Array.isArray(jObj) && this.options.arrayNodeName && this.options.arrayNodeName.length > 1) {\n jObj = {\n [this.options.arrayNodeName]: jObj\n };\n }\n return this.j2x(jObj, 0).val;\n }\n};\nBuilder.prototype.j2x = function(jObj, level) {\n let attrStr = \"\";\n let val2 = \"\";\n for (let key in jObj) {\n if (!Object.prototype.hasOwnProperty.call(jObj, key)) continue;\n if (typeof jObj[key] === \"undefined\") {\n if (this.isAttribute(key)) {\n val2 += \"\";\n }\n } else if (jObj[key] === null) {\n if (this.isAttribute(key)) {\n val2 += \"\";\n } else if (key[0] === \"?\") {\n val2 += this.indentate(level) + \"<\" + key + \"?\" + this.tagEndChar;\n } else {\n val2 += this.indentate(level) + \"<\" + key + \"/\" + this.tagEndChar;\n }\n } else if (jObj[key] instanceof Date) {\n val2 += this.buildTextValNode(jObj[key], key, \"\", level);\n } else if (typeof jObj[key] !== \"object\") {\n const attr = this.isAttribute(key);\n if (attr) {\n attrStr += this.buildAttrPairStr(attr, \"\" + jObj[key]);\n } else {\n if (key === this.options.textNodeName) {\n let newval = this.options.tagValueProcessor(key, \"\" + jObj[key]);\n val2 += this.replaceEntitiesValue(newval);\n } else {\n val2 += this.buildTextValNode(jObj[key], key, \"\", level);\n }\n }\n } else if (Array.isArray(jObj[key])) {\n const arrLen = jObj[key].length;\n let listTagVal = \"\";\n let listTagAttr = \"\";\n for (let j = 0; j < arrLen; j++) {\n const item = jObj[key][j];\n if (typeof item === \"undefined\") ;\n else if (item === null) {\n if (key[0] === \"?\") val2 += this.indentate(level) + \"<\" + key + \"?\" + this.tagEndChar;\n else val2 += this.indentate(level) + \"<\" + key + \"/\" + this.tagEndChar;\n } else if (typeof item === \"object\") {\n if (this.options.oneListGroup) {\n const result = this.j2x(item, level + 1);\n listTagVal += result.val;\n if (this.options.attributesGroupName && item.hasOwnProperty(this.options.attributesGroupName)) {\n listTagAttr += result.attrStr;\n }\n } else {\n listTagVal += this.processTextOrObjNode(item, key, level);\n }\n } else {\n if (this.options.oneListGroup) {\n let textValue = this.options.tagValueProcessor(key, item);\n textValue = this.replaceEntitiesValue(textValue);\n listTagVal += textValue;\n } else {\n listTagVal += this.buildTextValNode(item, key, \"\", level);\n }\n }\n }\n if (this.options.oneListGroup) {\n listTagVal = this.buildObjectNode(listTagVal, key, listTagAttr, level);\n }\n val2 += listTagVal;\n } else {\n if (this.options.attributesGroupName && key === this.options.attributesGroupName) {\n const Ks = Object.keys(jObj[key]);\n const L = Ks.length;\n for (let j = 0; j < L; j++) {\n attrStr += this.buildAttrPairStr(Ks[j], \"\" + jObj[key][Ks[j]]);\n }\n } else {\n val2 += this.processTextOrObjNode(jObj[key], key, level);\n }\n }\n }\n return { attrStr, val: val2 };\n};\nBuilder.prototype.buildAttrPairStr = function(attrName, val2) {\n val2 = this.options.attributeValueProcessor(attrName, \"\" + val2);\n val2 = this.replaceEntitiesValue(val2);\n if (this.options.suppressBooleanAttributes && val2 === \"true\") {\n return \" \" + attrName;\n } else return \" \" + attrName + '=\"' + val2 + '\"';\n};\nfunction processTextOrObjNode(object, key, level) {\n const result = this.j2x(object, level + 1);\n if (object[this.options.textNodeName] !== void 0 && Object.keys(object).length === 1) {\n return this.buildTextValNode(object[this.options.textNodeName], key, result.attrStr, level);\n } else {\n return this.buildObjectNode(result.val, key, result.attrStr, level);\n }\n}\nBuilder.prototype.buildObjectNode = function(val2, key, attrStr, level) {\n if (val2 === \"\") {\n if (key[0] === \"?\") return this.indentate(level) + \"<\" + key + attrStr + \"?\" + this.tagEndChar;\n else {\n return this.indentate(level) + \"<\" + key + attrStr + this.closeTag(key) + this.tagEndChar;\n }\n } else {\n let tagEndExp = \"</\" + key + this.tagEndChar;\n let piClosingChar = \"\";\n if (key[0] === \"?\") {\n piClosingChar = \"?\";\n tagEndExp = \"\";\n }\n if ((attrStr || attrStr === \"\") && val2.indexOf(\"<\") === -1) {\n return this.indentate(level) + \"<\" + key + attrStr + piClosingChar + \">\" + val2 + tagEndExp;\n } else if (this.options.commentPropName !== false && key === this.options.commentPropName && piClosingChar.length === 0) {\n return this.indentate(level) + `<!--${val2}-->` + this.newLine;\n } else {\n return this.indentate(level) + \"<\" + key + attrStr + piClosingChar + this.tagEndChar + val2 + this.indentate(level) + tagEndExp;\n }\n }\n};\nBuilder.prototype.closeTag = function(key) {\n let closeTag = \"\";\n if (this.options.unpairedTags.indexOf(key) !== -1) {\n if (!this.options.suppressUnpairedNode) closeTag = \"/\";\n } else if (this.options.suppressEmptyNode) {\n closeTag = \"/\";\n } else {\n closeTag = `></${key}`;\n }\n return closeTag;\n};\nBuilder.prototype.buildTextValNode = function(val2, key, attrStr, level) {\n if (this.options.cdataPropName !== false && key === this.options.cdataPropName) {\n return this.indentate(level) + `<![CDATA[${val2}]]>` + this.newLine;\n } else if (this.options.commentPropName !== false && key === this.options.commentPropName) {\n return this.indentate(level) + `<!--${val2}-->` + this.newLine;\n } else if (key[0] === \"?\") {\n return this.indentate(level) + \"<\" + key + attrStr + \"?\" + this.tagEndChar;\n } else {\n let textValue = this.options.tagValueProcessor(key, val2);\n textValue = this.replaceEntitiesValue(textValue);\n if (textValue === \"\") {\n return this.indentate(level) + \"<\" + key + attrStr + this.closeTag(key) + this.tagEndChar;\n } else {\n return this.indentate(level) + \"<\" + key + attrStr + \">\" + textValue + \"</\" + key + this.tagEndChar;\n }\n }\n};\nBuilder.prototype.replaceEntitiesValue = function(textValue) {\n if (textValue && textValue.length > 0 && this.options.processEntities) {\n for (let i = 0; i < this.options.entities.length; i++) {\n const entity = this.options.entities[i];\n textValue = textValue.replace(entity.regex, entity.val);\n }\n }\n return textValue;\n};\nfunction indentate(level) {\n return this.options.indentBy.repeat(level);\n}\nfunction isAttribute(name) {\n if (name.startsWith(this.options.attributeNamePrefix) && name !== this.options.textNodeName) {\n return name.substr(this.attrPrefixLen);\n } else {\n return false;\n }\n}\nvar json2xml = Builder;\nconst validator = validator$2;\nconst XMLParser2 = XMLParser_1;\nconst XMLBuilder = json2xml;\nvar fxp = {\n XMLParser: XMLParser2,\n XMLValidator: validator,\n XMLBuilder\n};\nfunction isSvg(string) {\n if (typeof string !== \"string\") {\n throw new TypeError(`Expected a \\`string\\`, got \\`${typeof string}\\``);\n }\n string = string.trim();\n if (string.length === 0) {\n return false;\n }\n if (fxp.XMLValidator.validate(string) !== true) {\n return false;\n }\n let jsonObject;\n const parser = new fxp.XMLParser();\n try {\n jsonObject = parser.parse(string);\n } catch {\n return false;\n }\n if (!jsonObject) {\n return false;\n }\n if (!Object.keys(jsonObject).some((x) => x.toLowerCase() === \"svg\")) {\n return false;\n }\n return true;\n}\nclass View {\n _view;\n constructor(view) {\n isValidView(view);\n this._view = view;\n }\n get id() {\n return this._view.id;\n }\n get name() {\n return this._view.name;\n }\n get caption() {\n return this._view.caption;\n }\n get emptyTitle() {\n return this._view.emptyTitle;\n }\n get emptyCaption() {\n return this._view.emptyCaption;\n }\n get getContents() {\n return this._view.getContents;\n }\n get icon() {\n return this._view.icon;\n }\n set icon(icon) {\n this._view.icon = icon;\n }\n get order() {\n return this._view.order;\n }\n set order(order) {\n this._view.order = order;\n }\n get params() {\n return this._view.params;\n }\n set params(params) {\n this._view.params = params;\n }\n get columns() {\n return this._view.columns;\n }\n get emptyView() {\n return this._view.emptyView;\n }\n get parent() {\n return this._view.parent;\n }\n get sticky() {\n return this._view.sticky;\n }\n get expanded() {\n return this._view.expanded;\n }\n set expanded(expanded) {\n this._view.expanded = expanded;\n }\n get defaultSortKey() {\n return this._view.defaultSortKey;\n }\n get loadChildViews() {\n return this._view.loadChildViews;\n }\n}\nconst isValidView = function(view) {\n if (!view.id || typeof view.id !== \"string\") {\n throw new Error(\"View id is required and must be a string\");\n }\n if (!view.name || typeof view.name !== \"string\") {\n throw new Error(\"View name is required and must be a string\");\n }\n if (view.columns && view.columns.length > 0 && (!view.caption || typeof view.caption !== \"string\")) {\n throw new Error(\"View caption is required for top-level views and must be a string\");\n }\n if (!view.getContents || typeof view.getContents !== \"function\") {\n throw new Error(\"View getContents is required and must be a function\");\n }\n if (!view.icon || typeof view.icon !== \"string\" || !isSvg(view.icon)) {\n throw new Error(\"View icon is required and must be a valid svg string\");\n }\n if (\"order\" in view && typeof view.order !== \"number\") {\n throw new Error(\"View order must be a number\");\n }\n if (view.columns) {\n view.columns.forEach((column) => {\n if (!(column instanceof Column)) {\n throw new Error(\"View columns must be an array of Column. Invalid column found\");\n }\n });\n }\n if (view.emptyView && typeof view.emptyView !== \"function\") {\n throw new Error(\"View emptyView must be a function\");\n }\n if (view.parent && typeof view.parent !== \"string\") {\n throw new Error(\"View parent must be a string\");\n }\n if (\"sticky\" in view && typeof view.sticky !== \"boolean\") {\n throw new Error(\"View sticky must be a boolean\");\n }\n if (\"expanded\" in view && typeof view.expanded !== \"boolean\") {\n throw new Error(\"View expanded must be a boolean\");\n }\n if (view.defaultSortKey && typeof view.defaultSortKey !== \"string\") {\n throw new Error(\"View defaultSortKey must be a string\");\n }\n if (view.loadChildViews && typeof view.loadChildViews !== \"function\") {\n throw new Error(\"View loadChildViews must be a function\");\n }\n return true;\n};\nconst debug$1 = typeof process === \"object\" && process.env && process.env.NODE_DEBUG && /\\bsemver\\b/i.test(process.env.NODE_DEBUG) ? (...args) => console.error(\"SEMVER\", ...args) : () => {\n};\nvar debug_1 = debug$1;\nconst SEMVER_SPEC_VERSION = \"2.0.0\";\nconst MAX_LENGTH$1 = 256;\nconst MAX_SAFE_INTEGER$1 = Number.MAX_SAFE_INTEGER || /* istanbul ignore next */\n9007199254740991;\nconst MAX_SAFE_COMPONENT_LENGTH = 16;\nconst MAX_SAFE_BUILD_LENGTH = MAX_LENGTH$1 - 6;\nconst RELEASE_TYPES = [\n \"major\",\n \"premajor\",\n \"minor\",\n \"preminor\",\n \"patch\",\n \"prepatch\",\n \"prerelease\"\n];\nvar constants = {\n MAX_LENGTH: MAX_LENGTH$1,\n MAX_SAFE_COMPONENT_LENGTH,\n MAX_SAFE_BUILD_LENGTH,\n MAX_SAFE_INTEGER: MAX_SAFE_INTEGER$1,\n RELEASE_TYPES,\n SEMVER_SPEC_VERSION,\n FLAG_INCLUDE_PRERELEASE: 1,\n FLAG_LOOSE: 2\n};\nvar re$1 = { exports: {} };\n(function(module, exports) {\n const {\n MAX_SAFE_COMPONENT_LENGTH: MAX_SAFE_COMPONENT_LENGTH2,\n MAX_SAFE_BUILD_LENGTH: MAX_SAFE_BUILD_LENGTH2,\n MAX_LENGTH: MAX_LENGTH2\n } = constants;\n const debug2 = debug_1;\n exports = module.exports = {};\n const re2 = exports.re = [];\n const safeRe = exports.safeRe = [];\n const src = exports.src = [];\n const t2 = exports.t = {};\n let R = 0;\n const LETTERDASHNUMBER = \"[a-zA-Z0-9-]\";\n const safeRegexReplacements = [\n [\"\\\\s\", 1],\n [\"\\\\d\", MAX_LENGTH2],\n [LETTERDASHNUMBER, MAX_SAFE_BUILD_LENGTH2]\n ];\n const makeSafeRegex = (value) => {\n for (const [token, max] of safeRegexReplacements) {\n value = value.split(`${token}*`).join(`${token}{0,${max}}`).split(`${token}+`).join(`${token}{1,${max}}`);\n }\n return value;\n };\n const createToken = (name, value, isGlobal) => {\n const safe = makeSafeRegex(value);\n const index = R++;\n debug2(name, index, value);\n t2[name] = index;\n src[index] = value;\n re2[index] = new RegExp(value, isGlobal ? \"g\" : void 0);\n safeRe[index] = new RegExp(safe, isGlobal ? \"g\" : void 0);\n };\n createToken(\"NUMERICIDENTIFIER\", \"0|[1-9]\\\\d*\");\n createToken(\"NUMERICIDENTIFIERLOOSE\", \"\\\\d+\");\n createToken(\"NONNUMERICIDENTIFIER\", `\\\\d*[a-zA-Z-]${LETTERDASHNUMBER}*`);\n createToken(\"MAINVERSION\", `(${src[t2.NUMERICIDENTIFIER]})\\\\.(${src[t2.NUMERICIDENTIFIER]})\\\\.(${src[t2.NUMERICIDENTIFIER]})`);\n createToken(\"MAINVERSIONLOOSE\", `(${src[t2.NUMERICIDENTIFIERLOOSE]})\\\\.(${src[t2.NUMERICIDENTIFIERLOOSE]})\\\\.(${src[t2.NUMERICIDENTIFIERLOOSE]})`);\n createToken(\"PRERELEASEIDENTIFIER\", `(?:${src[t2.NUMERICIDENTIFIER]}|${src[t2.NONNUMERICIDENTIFIER]})`);\n createToken(\"PRERELEASEIDENTIFIERLOOSE\", `(?:${src[t2.NUMERICIDENTIFIERLOOSE]}|${src[t2.NONNUMERICIDENTIFIER]})`);\n createToken(\"PRERELEASE\", `(?:-(${src[t2.PRERELEASEIDENTIFIER]}(?:\\\\.${src[t2.PRERELEASEIDENTIFIER]})*))`);\n createToken(\"PRERELEASELOOSE\", `(?:-?(${src[t2.PRERELEASEIDENTIFIERLOOSE]}(?:\\\\.${src[t2.PRERELEASEIDENTIFIERLOOSE]})*))`);\n createToken(\"BUILDIDENTIFIER\", `${LETTERDASHNUMBER}+`);\n createToken(\"BUILD\", `(?:\\\\+(${src[t2.BUILDIDENTIFIER]}(?:\\\\.${src[t2.BUILDIDENTIFIER]})*))`);\n createToken(\"FULLPLAIN\", `v?${src[t2.MAINVERSION]}${src[t2.PRERELEASE]}?${src[t2.BUILD]}?`);\n createToken(\"FULL\", `^${src[t2.FULLPLAIN]}$`);\n createToken(\"LOOSEPLAIN\", `[v=\\\\s]*${src[t2.MAINVERSIONLOOSE]}${src[t2.PRERELEASELOOSE]}?${src[t2.BUILD]}?`);\n createToken(\"LOOSE\", `^${src[t2.LOOSEPLAIN]}$`);\n createToken(\"GTLT\", \"((?:<|>)?=?)\");\n createToken(\"XRANGEIDENTIFIERLOOSE\", `${src[t2.NUMERICIDENTIFIERLOOSE]}|x|X|\\\\*`);\n createToken(\"XRANGEIDENTIFIER\", `${src[t2.NUMERICIDENTIFIER]}|x|X|\\\\*`);\n createToken(\"XRANGEPLAIN\", `[v=\\\\s]*(${src[t2.XRANGEIDENTIFIER]})(?:\\\\.(${src[t2.XRANGEIDENTIFIER]})(?:\\\\.(${src[t2.XRANGEIDENTIFIER]})(?:${src[t2.PRERELEASE]})?${src[t2.BUILD]}?)?)?`);\n createToken(\"XRANGEPLAINLOOSE\", `[v=\\\\s]*(${src[t2.XRANGEIDENTIFIERLOOSE]})(?:\\\\.(${src[t2.XRANGEIDENTIFIERLOOSE]})(?:\\\\.(${src[t2.XRANGEIDENTIFIERLOOSE]})(?:${src[t2.PRERELEASELOOSE]})?${src[t2.BUILD]}?)?)?`);\n createToken(\"XRANGE\", `^${src[t2.GTLT]}\\\\s*${src[t2.XRANGEPLAIN]}$`);\n createToken(\"XRANGELOOSE\", `^${src[t2.GTLT]}\\\\s*${src[t2.XRANGEPLAINLOOSE]}$`);\n createToken(\"COERCEPLAIN\", `${\"(^|[^\\\\d])(\\\\d{1,\"}${MAX_SAFE_COMPONENT_LENGTH2}})(?:\\\\.(\\\\d{1,${MAX_SAFE_COMPONENT_LENGTH2}}))?(?:\\\\.(\\\\d{1,${MAX_SAFE_COMPONENT_LENGTH2}}))?`);\n createToken(\"COERCE\", `${src[t2.COERCEPLAIN]}(?:$|[^\\\\d])`);\n createToken(\"COERCEFULL\", src[t2.COERCEPLAIN] + `(?:${src[t2.PRERELEASE]})?(?:${src[t2.BUILD]})?(?:$|[^\\\\d])`);\n createToken(\"COERCERTL\", src[t2.COERCE], true);\n createToken(\"COERCERTLFULL\", src[t2.COERCEFULL], true);\n createToken(\"LONETILDE\", \"(?:~>?)\");\n createToken(\"TILDETRIM\", `(\\\\s*)${src[t2.LONETILDE]}\\\\s+`, true);\n exports.tildeTrimReplace = \"$1~\";\n createToken(\"TILDE\", `^${src[t2.LONETILDE]}${src[t2.XRANGEPLAIN]}$`);\n createToken(\"TILDELOOSE\", `^${src[t2.LONETILDE]}${src[t2.XRANGEPLAINLOOSE]}$`);\n createToken(\"LONECARET\", \"(?:\\\\^)\");\n createToken(\"CARETTRIM\", `(\\\\s*)${src[t2.LONECARET]}\\\\s+`, true);\n exports.caretTrimReplace = \"$1^\";\n createToken(\"CARET\", `^${src[t2.LONECARET]}${src[t2.XRANGEPLAIN]}$`);\n createToken(\"CARETLOOSE\", `^${src[t2.LONECARET]}${src[t2.XRANGEPLAINLOOSE]}$`);\n createToken(\"COMPARATORLOOSE\", `^${src[t2.GTLT]}\\\\s*(${src[t2.LOOSEPLAIN]})$|^$`);\n createToken(\"COMPARATOR\", `^${src[t2.GTLT]}\\\\s*(${src[t2.FULLPLAIN]})$|^$`);\n createToken(\"COMPARATORTRIM\", `(\\\\s*)${src[t2.GTLT]}\\\\s*(${src[t2.LOOSEPLAIN]}|${src[t2.XRANGEPLAIN]})`, true);\n exports.comparatorTrimReplace = \"$1$2$3\";\n createToken(\"HYPHENRANGE\", `^\\\\s*(${src[t2.XRANGEPLAIN]})\\\\s+-\\\\s+(${src[t2.XRANGEPLAIN]})\\\\s*$`);\n createToken(\"HYPHENRANGELOOSE\", `^\\\\s*(${src[t2.XRANGEPLAINLOOSE]})\\\\s+-\\\\s+(${src[t2.XRANGEPLAINLOOSE]})\\\\s*$`);\n createToken(\"STAR\", \"(<|>)?=?\\\\s*\\\\*\");\n createToken(\"GTE0\", \"^\\\\s*>=\\\\s*0\\\\.0\\\\.0\\\\s*$\");\n createToken(\"GTE0PRE\", \"^\\\\s*>=\\\\s*0\\\\.0\\\\.0-0\\\\s*$\");\n})(re$1, re$1.exports);\nvar reExports = re$1.exports;\nconst looseOption = Object.freeze({ loose: true });\nconst emptyOpts = Object.freeze({});\nconst parseOptions$1 = (options) => {\n if (!options) {\n return emptyOpts;\n }\n if (typeof options !== \"object\") {\n return looseOption;\n }\n return options;\n};\nvar parseOptions_1 = parseOptions$1;\nconst numeric = /^[0-9]+$/;\nconst compareIdentifiers$1 = (a, b) => {\n const anum = numeric.test(a);\n const bnum = numeric.test(b);\n if (anum && bnum) {\n a = +a;\n b = +b;\n }\n return a === b ? 0 : anum && !bnum ? -1 : bnum && !anum ? 1 : a < b ? -1 : 1;\n};\nconst rcompareIdentifiers = (a, b) => compareIdentifiers$1(b, a);\nvar identifiers = {\n compareIdentifiers: compareIdentifiers$1,\n rcompareIdentifiers\n};\nconst debug = debug_1;\nconst { MAX_LENGTH, MAX_SAFE_INTEGER } = constants;\nconst { safeRe: re, t } = reExports;\nconst parseOptions = parseOptions_1;\nconst { compareIdentifiers } = identifiers;\nlet SemVer$2 = class SemVer {\n constructor(version, options) {\n options = parseOptions(options);\n if (version instanceof SemVer) {\n if (version.loose === !!options.loose && version.includePrerelease === !!options.includePrerelease) {\n return version;\n } else {\n version = version.version;\n }\n } else if (typeof version !== \"string\") {\n throw new TypeError(`Invalid version. Must be a string. Got type \"${typeof version}\".`);\n }\n if (version.length > MAX_LENGTH) {\n throw new TypeError(\n `version is longer than ${MAX_LENGTH} characters`\n );\n }\n debug(\"SemVer\", version, options);\n this.options = options;\n this.loose = !!options.loose;\n this.includePrerelease = !!options.includePrerelease;\n const m = version.trim().match(options.loose ? re[t.LOOSE] : re[t.FULL]);\n if (!m) {\n throw new TypeError(`Invalid Version: ${version}`);\n }\n this.raw = version;\n this.major = +m[1];\n this.minor = +m[2];\n this.patch = +m[3];\n if (this.major > MAX_SAFE_INTEGER || this.major < 0) {\n throw new TypeError(\"Invalid major version\");\n }\n if (this.minor > MAX_SAFE_INTEGER || this.minor < 0) {\n throw new TypeError(\"Invalid minor version\");\n }\n if (this.patch > MAX_SAFE_INTEGER || this.patch < 0) {\n throw new TypeError(\"Invalid patch version\");\n }\n if (!m[4]) {\n this.prerelease = [];\n } else {\n this.prerelease = m[4].split(\".\").map((id) => {\n if (/^[0-9]+$/.test(id)) {\n const num = +id;\n if (num >= 0 && num < MAX_SAFE_INTEGER) {\n return num;\n }\n }\n return id;\n });\n }\n this.build = m[5] ? m[5].split(\".\") : [];\n this.format();\n }\n format() {\n this.version = `${this.major}.${this.minor}.${this.patch}`;\n if (this.prerelease.length) {\n this.version += `-${this.prerelease.join(\".\")}`;\n }\n return this.version;\n }\n toString() {\n return this.version;\n }\n compare(other) {\n debug(\"SemVer.compare\", this.version, this.options, other);\n if (!(other instanceof SemVer)) {\n if (typeof other === \"string\" && other === this.version) {\n return 0;\n }\n other = new SemVer(other, this.options);\n }\n if (other.version === this.version) {\n return 0;\n }\n return this.compareMain(other) || this.comparePre(other);\n }\n compareMain(other) {\n if (!(other instanceof SemVer)) {\n other = new SemVer(other, this.options);\n }\n return compareIdentifiers(this.major, other.major) || compareIdentifiers(this.minor, other.minor) || compareIdentifiers(this.patch, other.patch);\n }\n comparePre(other) {\n if (!(other instanceof SemVer)) {\n other = new SemVer(other, this.options);\n }\n if (this.prerelease.length && !other.prerelease.length) {\n return -1;\n } else if (!this.prerelease.length && other.prerelease.length) {\n return 1;\n } else if (!this.prerelease.length && !other.prerelease.length) {\n return 0;\n }\n let i = 0;\n do {\n const a = this.prerelease[i];\n const b = other.prerelease[i];\n debug(\"prerelease compare\", i, a, b);\n if (a === void 0 && b === void 0) {\n return 0;\n } else if (b === void 0) {\n return 1;\n } else if (a === void 0) {\n return -1;\n } else if (a === b) {\n continue;\n } else {\n return compareIdentifiers(a, b);\n }\n } while (++i);\n }\n compareBuild(other) {\n if (!(other instanceof SemVer)) {\n other = new SemVer(other, this.options);\n }\n let i = 0;\n do {\n const a = this.build[i];\n const b = other.build[i];\n debug(\"build compare\", i, a, b);\n if (a === void 0 && b === void 0) {\n return 0;\n } else if (b === void 0) {\n return 1;\n } else if (a === void 0) {\n return -1;\n } else if (a === b) {\n continue;\n } else {\n return compareIdentifiers(a, b);\n }\n } while (++i);\n }\n // preminor will bump the version up to the next minor release, and immediately\n // down to pre-release. premajor and prepatch work the same way.\n inc(release, identifier, identifierBase) {\n switch (release) {\n case \"premajor\":\n this.prerelease.length = 0;\n this.patch = 0;\n this.minor = 0;\n this.major++;\n this.inc(\"pre\", identifier, identifierBase);\n break;\n case \"preminor\":\n this.prerelease.length = 0;\n this.patch = 0;\n this.minor++;\n this.inc(\"pre\", identifier, identifierBase);\n break;\n case \"prepatch\":\n this.prerelease.length = 0;\n this.inc(\"patch\", identifier, identifierBase);\n this.inc(\"pre\", identifier, identifierBase);\n break;\n case \"prerelease\":\n if (this.prerelease.length === 0) {\n this.inc(\"patch\", identifier, identifierBase);\n }\n this.inc(\"pre\", identifier, identifierBase);\n break;\n case \"major\":\n if (this.minor !== 0 || this.patch !== 0 || this.prerelease.length === 0) {\n this.major++;\n }\n this.minor = 0;\n this.patch = 0;\n this.prerelease = [];\n break;\n case \"minor\":\n if (this.patch !== 0 || this.prerelease.length === 0) {\n this.minor++;\n }\n this.patch = 0;\n this.prerelease = [];\n break;\n case \"patch\":\n if (this.prerelease.length === 0) {\n this.patch++;\n }\n this.prerelease = [];\n break;\n case \"pre\": {\n const base = Number(identifierBase) ? 1 : 0;\n if (!identifier && identifierBase === false) {\n throw new Error(\"invalid increment argument: identifier is empty\");\n }\n if (this.prerelease.length === 0) {\n this.prerelease = [base];\n } else {\n let i = this.prerelease.length;\n while (--i >= 0) {\n if (typeof this.prerelease[i] === \"number\") {\n this.prerelease[i]++;\n i = -2;\n }\n }\n if (i === -1) {\n if (identifier === this.prerelease.join(\".\") && identifierBase === false) {\n throw new Error(\"invalid increment argument: identifier already exists\");\n }\n this.prerelease.push(base);\n }\n }\n if (identifier) {\n let prerelease = [identifier, base];\n if (identifierBase === false) {\n prerelease = [identifier];\n }\n if (compareIdentifiers(this.prerelease[0], identifier) === 0) {\n if (isNaN(this.prerelease[1])) {\n this.prerelease = prerelease;\n }\n } else {\n this.prerelease = prerelease;\n }\n }\n break;\n }\n default:\n throw new Error(`invalid increment argument: ${release}`);\n }\n this.raw = this.format();\n if (this.build.length) {\n this.raw += `+${this.build.join(\".\")}`;\n }\n return this;\n }\n};\nvar semver = SemVer$2;\nconst SemVer$1 = semver;\nconst parse$1 = (version, options, throwErrors = false) => {\n if (version instanceof SemVer$1) {\n return version;\n }\n try {\n return new SemVer$1(version, options);\n } catch (er) {\n if (!throwErrors) {\n return null;\n }\n throw er;\n }\n};\nvar parse_1 = parse$1;\nconst parse = parse_1;\nconst valid = (version, options) => {\n const v = parse(version, options);\n return v ? v.version : null;\n};\nvar valid_1 = valid;\nconst valid$1 = /* @__PURE__ */ getDefaultExportFromCjs(valid_1);\nconst SemVer2 = semver;\nconst major = (a, loose) => new SemVer2(a, loose).major;\nvar major_1 = major;\nconst major$1 = /* @__PURE__ */ getDefaultExportFromCjs(major_1);\nclass ProxyBus {\n bus;\n constructor(bus2) {\n if (typeof bus2.getVersion !== \"function\" || !valid$1(bus2.getVersion())) {\n console.warn(\"Proxying an event bus with an unknown or invalid version\");\n } else if (major$1(bus2.getVersion()) !== major$1(this.getVersion())) {\n console.warn(\n \"Proxying an event bus of version \" + bus2.getVersion() + \" with \" + this.getVersion()\n );\n }\n this.bus = bus2;\n }\n getVersion() {\n return \"3.3.1\";\n }\n subscribe(name, handler) {\n this.bus.subscribe(name, handler);\n }\n unsubscribe(name, handler) {\n this.bus.unsubscribe(name, handler);\n }\n emit(name, event) {\n this.bus.emit(name, event);\n }\n}\nclass SimpleBus {\n handlers = /* @__PURE__ */ new Map();\n getVersion() {\n return \"3.3.1\";\n }\n subscribe(name, handler) {\n this.handlers.set(\n name,\n (this.handlers.get(name) || []).concat(\n handler\n )\n );\n }\n unsubscribe(name, handler) {\n this.handlers.set(\n name,\n (this.handlers.get(name) || []).filter((h) => h !== handler)\n );\n }\n emit(name, event) {\n (this.handlers.get(name) || []).forEach((h) => {\n try {\n h(event);\n } catch (e) {\n console.error(\"could not invoke event listener\", e);\n }\n });\n }\n}\nlet bus = null;\nfunction getBus() {\n if (bus !== null) {\n return bus;\n }\n if (typeof window === \"undefined\") {\n return new Proxy({}, {\n get: () => {\n return () => console.error(\n \"Window not available, EventBus can not be established!\"\n );\n }\n });\n }\n if (window.OC?._eventBus && typeof window._nc_event_bus === \"undefined\") {\n console.warn(\n \"found old event bus instance at OC._eventBus. Update your version!\"\n );\n window._nc_event_bus = window.OC._eventBus;\n }\n if (typeof window?._nc_event_bus !== \"undefined\") {\n bus = new ProxyBus(window._nc_event_bus);\n } else {\n bus = window._nc_event_bus = new SimpleBus();\n }\n return bus;\n}\nfunction emit(name, event) {\n getBus().emit(name, event);\n}\n/*!\n * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\nclass FileListFilter extends TypedEventTarget {\n id;\n order;\n constructor(id, order = 100) {\n super();\n this.id = id;\n this.order = order;\n }\n filter(nodes) {\n throw new Error(\"Not implemented\");\n }\n updateChips(chips) {\n this.dispatchTypedEvent(\"update:chips\", new CustomEvent(\"update:chips\", { detail: chips }));\n }\n filterUpdated() {\n this.dispatchTypedEvent(\"update:filter\", new CustomEvent(\"update:filter\"));\n }\n}\nfunction registerFileListFilter(filter) {\n if (!window._nc_filelist_filters) {\n window._nc_filelist_filters = /* @__PURE__ */ new Map();\n }\n if (window._nc_filelist_filters.has(filter.id)) {\n throw new Error(`File list filter \"${filter.id}\" already registered`);\n }\n window._nc_filelist_filters.set(filter.id, filter);\n emit(\"files:filter:added\", filter);\n}\nfunction unregisterFileListFilter(filterId) {\n if (window._nc_filelist_filters && window._nc_filelist_filters.has(filterId)) {\n window._nc_filelist_filters.delete(filterId);\n emit(\"files:filter:removed\", filterId);\n }\n}\nfunction getFileListFilters() {\n if (!window._nc_filelist_filters) {\n return [];\n }\n return [...window._nc_filelist_filters.values()];\n}\nconst addNewFileMenuEntry = function(entry) {\n const newFileMenu = getNewFileMenu();\n return newFileMenu.registerEntry(entry);\n};\nconst removeNewFileMenuEntry = function(entry) {\n const newFileMenu = getNewFileMenu();\n return newFileMenu.unregisterEntry(entry);\n};\nconst getNewFileMenuEntries = function(context) {\n const newFileMenu = getNewFileMenu();\n return newFileMenu.getEntries(context).sort((a, b) => {\n if (a.order !== void 0 && b.order !== void 0 && a.order !== b.order) {\n return a.order - b.order;\n }\n return a.displayName.localeCompare(b.displayName, void 0, { numeric: true, sensitivity: \"base\" });\n });\n};\nexport {\n Column,\n DefaultType,\n File,\n FileAction,\n FileListFilter,\n FileType,\n FilesSortingMode,\n Folder,\n Header,\n InvalidFilenameError,\n InvalidFilenameErrorReason,\n Navigation,\n NewMenuEntryCategory,\n Node,\n NodeStatus,\n Permission,\n View,\n addNewFileMenuEntry,\n davGetClient,\n davGetDefaultPropfind,\n davGetFavoritesReport,\n davGetRecentSearch,\n davGetRemoteURL,\n davGetRootPath,\n davParsePermissions,\n davRemoteURL,\n davResultToNode,\n davRootPath,\n defaultDavNamespaces,\n defaultDavProperties,\n formatFileSize,\n getDavNameSpaces,\n getDavProperties,\n getFavoriteNodes,\n getFileActions,\n getFileListFilters,\n getFileListHeaders,\n getNavigation,\n getNewFileMenuEntries,\n getUniqueName,\n isFilenameValid,\n orderBy,\n parseFileSize,\n registerDavProperty,\n registerFileAction,\n registerFileListFilter,\n registerFileListHeaders,\n removeNewFileMenuEntry,\n sortNodes,\n unregisterFileListFilter,\n validateFilename\n};\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\tloaded: false,\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Flag the module as loaded\n\tmodule.loaded = true;\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames based on template\n\treturn \"\" + ({\"3239\":\"settings-users\",\"4529\":\"settings-apps-view\"}[chunkId] || chunkId) + \"-\" + chunkId + \".js?v=\" + {\"802\":\"eddac441912aee9d7aa8\",\"3239\":\"61490dd5ed1c5d8390cb\",\"4529\":\"80559dd00b323f234969\",\"4546\":\"a06fb7f5c8fd8d53c2d3\",\"7265\":\"715398afd1ab50836642\",\"8737\":\"6a26621151e51d343a78\",\"9291\":\"077955af818a227340aa\",\"9972\":\"b7597ad74d36447b4184\"}[chunkId] + \"\";\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.nmd = (module) => {\n\tmodule.paths = [];\n\tif (!module.children) module.children = [];\n\treturn module;\n};","__webpack_require__.j = 2689;","var scriptUrl;\nif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\nvar document = __webpack_require__.g.document;\nif (!scriptUrl && document) {\n\tif (document.currentScript && document.currentScript.tagName.toUpperCase() === 'SCRIPT')\n\t\tscriptUrl = document.currentScript.src;\n\tif (!scriptUrl) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tif(scripts.length) {\n\t\t\tvar i = scripts.length - 1;\n\t\t\twhile (i > -1 && (!scriptUrl || !/^http(s?):/.test(scriptUrl))) scriptUrl = scripts[i--].src;\n\t\t}\n\t}\n}\n// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\nif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\nscriptUrl = scriptUrl.replace(/#.*$/, \"\").replace(/\\?.*$/, \"\").replace(/\\/[^\\/]+$/, \"/\");\n__webpack_require__.p = scriptUrl;","__webpack_require__.b = document.baseURI || self.location.href;\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t2689: 0\n};\n\n__webpack_require__.f.j = (chunkId, promises) => {\n\t\t// JSONP chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\n\t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n\t\t\t// a Promise means \"currently loading\".\n\t\t\tif(installedChunkData) {\n\t\t\t\tpromises.push(installedChunkData[2]);\n\t\t\t} else {\n\t\t\t\tif(true) { // all chunks have JS\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = new Promise((resolve, reject) => (installedChunkData = installedChunks[chunkId] = [resolve, reject]));\n\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n\t\t\t\t\t// start chunk loading\n\t\t\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\t\t\tvar error = new Error();\n\t\t\t\t\tvar loadingEnded = (event) => {\n\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\t\tif(installedChunkData) {\n\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n};\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = (chunkId) => (installedChunks[chunkId] === 0);\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = (parentChunkLoadingFunction, data) => {\n\tvar chunkIds = data[0];\n\tvar moreModules = data[1];\n\tvar runtime = data[2];\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some((id) => (installedChunks[id] !== 0))) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunknextcloud\"] = self[\"webpackChunknextcloud\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","__webpack_require__.nc = undefined;","// startup\n// Load entry module and return exports\n// This entry module depends on other loaded chunks and execution need to be delayed\nvar __webpack_exports__ = __webpack_require__.O(undefined, [4208], () => (__webpack_require__(18539)))\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["deferred","inProgress","dataWebpackPrefix","sanitize","url","replace","requireAdmin","confirmPassword","get","options","axios","post","data","put","delete","params","localStorage","getBuilder","persist","build","defaults","id","name","usercount","disabled","canAdd","canRemove","state","users","groups","orderBy","GroupSorting","UserCount","minPasswordLength","usersOffset","usersLimit","disabledUsersOffset","disabledUsersLimit","userCount","showConfig","showStoragePath","getItem","showUserBackend","showLastLogin","showNewUserForm","showLanguages","mutations","appendUsers","usersObj","existingUsers","map","_ref","newUsers","Object","values","filter","_ref2","includes","concat","updateDisabledUsers","_usersObj","setPasswordPolicyMinLength","length","initGroups","_ref3","group","assign","addGroup","_ref4","gid","displayName","find","unshift","e","console","error","renameGroup","_ref5","groupIndex","findIndex","groupSearch","updatedGroup","splice","removeGroup","addUserGroup","_ref6","userid","user","enabled","push","removeUserGroup","_ref7","indexOf","addUserSubAdmin","_ref8","subadmin","removeUserSubAdmin","_ref9","deleteUser","userIndex","this","commit","actionType","addUserData","response","ocs","enableDisableUser","_ref10","updateUserCounts","_ref11","recentGroup","disabledGroup","forEach","userGroup","warn","logger","setUserData","_ref12","key","value","humanValue","parseFileSize","resetUsers","setShowConfig","_ref13","setItem","JSON","stringify","setGroupSorting","sorting","oldValue","generateUrl","String","catch","showError","t","getters","getUsers","getGroups","getSubadminGroups","getSortedGroups","sort","a","b","numA","numB","localeCompare","getGroupSorting","getPasswordPolicyMinLength","getUsersOffset","getUsersLimit","getDisabledUsersOffset","getDisabledUsersLimit","getUserCount","getShowConfig","CancelToken","searchRequestCancelSource","actions","searchUsers","context","_ref14","offset","limit","search","api","generateOcsUrl","getUser","userId","_ref15","cancel","source","trim","encodeURIComponent","cancelToken","token","then","usersCount","keys","getRecentUsers","_ref16","getDisabledUsers","_ref17","_ref18","limitParam","getUsersFromList","_ref19","getUsersFromGroup","_ref20","groupid","groupId","getCapabilities","password_policy","minLength","_ref21","_ref22","_ref23","_ref24","_ref25","wipeUserDevices","Promise","reject","Error","addUser","_ref26","_ref27","dispatch","password","email","quota","language","manager","_ref28","userStatus","_ref29","allowedEmpty","sendWelcomeMail","apps","bundles","loadState","categories","updateCount","loading","gettingCategoriesPromise","APPS_API_FAILURE","message","isHTML","initCategories","updateCategories","categoriesPromise","setUpdateCount","addCategory","category","appendCategories","categoriesArray","setAllApps","setError","appId","Array","isArray","_id","app","clearError","enableApp","active","setInstallState","canInstall","disableApp","removable","canUnInstall","uninstallApp","needsDownload","installed","updateApp","version","update","resetApps","reset","startLoading","Vue","stopLoading","appIds","_appId","update_required","showInfo","onClick","window","location","reload","close","setTimeout","forceEnableApp","finally","getAllApps","getCategories","shouldRefetchCategories","arguments","undefined","categoriesPromiseResponse","getAppBundles","getUpdateCount","getCategoryById","selectedCategoryId","serverData","setServerData","getServerData","setAppConfig","use","Vuex","API_FAILURE","meta","store","useStore","Store","modules","settings","oc","strict","process","getLoggerBuilder","setApp","detectUser","_defineComponent","__name","setup","__props","__sfc","NcContent","_vm","_c","_self","_setupProxy","attrs","_v","path","components","default","UserManagement","navigation","UserManagementNavigation","props","children","redirect","AppStore","AppStoreNavigation","sidebar","AppStoreSidebar","Router","mode","base","linkActiveClass","routes","VTooltip","defaultHtml","sync","router","__webpack_nonce__","getCSPNonce","prototype","n","PiniaVuePlugin","pinia","createPinia","render","h","SettingsApp","el","cloneRoute","to","from","clone","hash","query","fullPath","freeze","exports","moduleName","registerModule","namespaced","currentRoute","transition","currentPath","isTimeTraveling","storeUnwatch","watch","route","afterEachUnHook","afterEach","unregisterModule","Permission","Permission2","defaultDavProperties","defaultDavNamespaces","d","nc","getDavProperties","_nc_dav_properties","prop","join","getDavNameSpaces","_nc_dav_namespaces","ns","davGetDefaultPropfind","davGetRecentSearch","lastModified","uid","FileType","FileType2","isDavRessource","davService","match","validateData","URL","startsWith","displayname","mtime","Date","crtime","mime","size","permissions","NONE","ALL","owner","attributes","root","service","status","NodeStatus","NodeStatus2","Node","_data","_attributes","_knownDavService","readonlyAttributes","entries","getOwnPropertyDescriptors","handler","set","target","Reflect","deleteProperty","receiver","constructor","Proxy","encodedSource","origin","slice","basename","extension","extname","dirname","split","pop","firstMatch","pathname","updateMtime","READ","fileid","move","destination","oldBasename","rename","basename2","TypeError","File","type","Folder","super","davRootPath","davRemoteURL","davGetRemoteURL","davGetClient","remoteURL","headers","client","setHeaders","requesttoken","patch","headers2","method","fetch","getFavoriteNodes","davClient","davRoot","controller","AbortController","CancelablePromise","async","resolve","onCancel","abort","getDirectoryContents","signal","details","includeSelf","node","filename","result","davResultToNode","filesRoot","permString","CREATE","UPDATE","DELETE","SHARE","davParsePermissions","nodeData","parse","lastmod","Number","parseInt","getcontentlength","FAILED","hasPreview","humanList","humanListBinary","formatFileSize","skipSmallSizes","binaryPrefixes","base1000","order","Math","floor","log","min","readableFormat","relativeSize","pow","toFixed","parseFloat","toLocaleString","forceBinary","toLocaleLowerCase","replaceAll","decimalString","round","k","m","g","p","toISOString","sortNodes","nodes","sortingOptions","sortingMode","sortingOrder","collection","identifiers2","orders","_","index","collator","Intl","Collator","numeric","usage","identifier","compare","sortFavoritesFirst","v","favorite","sortFoldersFirst","lastIndexOf","util$3","nameStartChar","nameRegexp","regexName","RegExp","isExist","isEmptyObject","obj","merge","arrayMode","len","i","getValue","isName","string","exec","getAllMatches","regex","matches","allmatches","startIndex","lastIndex","OptionsBuilder","defaultOptions$1","preserveOrder","attributeNamePrefix","attributesGroupName","textNodeName","ignoreAttributes","removeNSPrefix","allowBooleanAttributes","parseTagValue","parseAttributeValue","trimValues","cdataPropName","numberParseOptions","hex","leadingZeros","eNotation","tagValueProcessor","tagName","val2","attributeValueProcessor","attrName","stopNodes","alwaysCreateTextNode","commentPropName","unpairedTags","processEntities","htmlEntities","ignoreDeclaration","ignorePiTags","transformTagName","transformAttributeName","updateTag","jPath","buildOptions","defaultOptions","node2json","compress","arr","text","compressedObj","tagObj","property","propName$1","newJpath","isLeaf","isLeafTag","assignAttributes","hasOwnProperty","attrMap","jpath","atrrName","propCount","prettify","arrToStr","indentation","xmlStr","isPreviousElementTag","propName","newJPath","tagText","isStopNode","replaceEntitiesValue","attStr2","attr_to_str","tempInd","piTextNodeName","newIdentation","indentBy","tagStart","tagValue","suppressUnpairedNode","suppressEmptyNode","endsWith","attrStr","attr","attrVal","suppressBooleanAttributes","substr","textValue","entities","entity","val","buildFromOrderedJs","jArray","format","oneListGroup","Builder","isAttribute","attrPrefixLen","processTextOrObjNode","indentate","tagEndChar","newLine","object","level","j2x","buildTextValNode","buildObjectNode","repeat","jObj","arrayNodeName","call","buildAttrPairStr","newval","arrLen","listTagVal","listTagAttr","j","item","Ks","L","closeTag","tagEndExp","piClosingChar","debug_1","env","NODE_DEBUG","test","args","constants","MAX_LENGTH","MAX_SAFE_COMPONENT_LENGTH","MAX_SAFE_BUILD_LENGTH","MAX_LENGTH$1","MAX_SAFE_INTEGER","RELEASE_TYPES","SEMVER_SPEC_VERSION","FLAG_INCLUDE_PRERELEASE","FLAG_LOOSE","re$1","module","MAX_SAFE_COMPONENT_LENGTH2","MAX_SAFE_BUILD_LENGTH2","MAX_LENGTH2","debug2","re2","re","safeRe","src","t2","R","LETTERDASHNUMBER","safeRegexReplacements","createToken","isGlobal","safe","max","makeSafeRegex","NUMERICIDENTIFIER","NUMERICIDENTIFIERLOOSE","NONNUMERICIDENTIFIER","PRERELEASEIDENTIFIER","PRERELEASEIDENTIFIERLOOSE","BUILDIDENTIFIER","MAINVERSION","PRERELEASE","BUILD","FULLPLAIN","MAINVERSIONLOOSE","PRERELEASELOOSE","LOOSEPLAIN","XRANGEIDENTIFIER","XRANGEIDENTIFIERLOOSE","GTLT","XRANGEPLAIN","XRANGEPLAINLOOSE","COERCEPLAIN","COERCE","COERCEFULL","LONETILDE","tildeTrimReplace","LONECARET","caretTrimReplace","comparatorTrimReplace","reExports","loose","compareIdentifiers$1","anum","bnum","identifiers","compareIdentifiers","rcompareIdentifiers","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","loaded","__webpack_modules__","O","chunkIds","fn","priority","notFulfilled","Infinity","fulfilled","every","r","getter","__esModule","definition","o","defineProperty","enumerable","f","chunkId","all","reduce","promises","u","globalThis","Function","l","done","script","needAttach","scripts","document","getElementsByTagName","s","getAttribute","createElement","charset","timeout","setAttribute","onScriptComplete","prev","event","onerror","onload","clearTimeout","doneFns","parentNode","removeChild","bind","head","appendChild","Symbol","toStringTag","nmd","paths","scriptUrl","importScripts","currentScript","toUpperCase","baseURI","self","href","installedChunks","installedChunkData","promise","errorType","realSrc","request","webpackJsonpCallback","parentChunkLoadingFunction","moreModules","runtime","some","chunkLoadingGlobal","__webpack_exports__"],"sourceRoot":""} \ No newline at end of file
diff --git a/lib/composer/composer/autoload_classmap.php b/lib/composer/composer/autoload_classmap.php
index 37013ecc1ae..78aca5fe883 100644
--- a/lib/composer/composer/autoload_classmap.php
+++ b/lib/composer/composer/autoload_classmap.php
@@ -421,7 +421,6 @@ return array(
'OCP\\Files\\SimpleFS\\ISimpleFolder' => $baseDir . '/lib/public/Files/SimpleFS/ISimpleFolder.php',
'OCP\\Files\\SimpleFS\\ISimpleRoot' => $baseDir . '/lib/public/Files/SimpleFS/ISimpleRoot.php',
'OCP\\Files\\SimpleFS\\InMemoryFile' => $baseDir . '/lib/public/Files/SimpleFS/InMemoryFile.php',
- 'OCP\\Files\\Storage' => $baseDir . '/lib/public/Files/Storage.php',
'OCP\\Files\\StorageAuthException' => $baseDir . '/lib/public/Files/StorageAuthException.php',
'OCP\\Files\\StorageBadConfigException' => $baseDir . '/lib/public/Files/StorageBadConfigException.php',
'OCP\\Files\\StorageConnectionException' => $baseDir . '/lib/public/Files/StorageConnectionException.php',
@@ -700,6 +699,7 @@ return array(
'OCP\\Settings\\IManager' => $baseDir . '/lib/public/Settings/IManager.php',
'OCP\\Settings\\ISettings' => $baseDir . '/lib/public/Settings/ISettings.php',
'OCP\\Settings\\ISubAdminSettings' => $baseDir . '/lib/public/Settings/ISubAdminSettings.php',
+ 'OCP\\SetupCheck\\CheckServerResponseTrait' => $baseDir . '/lib/public/SetupCheck/CheckServerResponseTrait.php',
'OCP\\SetupCheck\\ISetupCheck' => $baseDir . '/lib/public/SetupCheck/ISetupCheck.php',
'OCP\\SetupCheck\\ISetupCheckManager' => $baseDir . '/lib/public/SetupCheck/ISetupCheckManager.php',
'OCP\\SetupCheck\\SetupResult' => $baseDir . '/lib/public/SetupCheck/SetupResult.php',
diff --git a/lib/composer/composer/autoload_static.php b/lib/composer/composer/autoload_static.php
index 293e79f80c6..6a17bc4ff31 100644
--- a/lib/composer/composer/autoload_static.php
+++ b/lib/composer/composer/autoload_static.php
@@ -454,7 +454,6 @@ class ComposerStaticInit749170dad3f5e7f9ca158f5a9f04f6a2
'OCP\\Files\\SimpleFS\\ISimpleFolder' => __DIR__ . '/../../..' . '/lib/public/Files/SimpleFS/ISimpleFolder.php',
'OCP\\Files\\SimpleFS\\ISimpleRoot' => __DIR__ . '/../../..' . '/lib/public/Files/SimpleFS/ISimpleRoot.php',
'OCP\\Files\\SimpleFS\\InMemoryFile' => __DIR__ . '/../../..' . '/lib/public/Files/SimpleFS/InMemoryFile.php',
- 'OCP\\Files\\Storage' => __DIR__ . '/../../..' . '/lib/public/Files/Storage.php',
'OCP\\Files\\StorageAuthException' => __DIR__ . '/../../..' . '/lib/public/Files/StorageAuthException.php',
'OCP\\Files\\StorageBadConfigException' => __DIR__ . '/../../..' . '/lib/public/Files/StorageBadConfigException.php',
'OCP\\Files\\StorageConnectionException' => __DIR__ . '/../../..' . '/lib/public/Files/StorageConnectionException.php',
@@ -733,6 +732,7 @@ class ComposerStaticInit749170dad3f5e7f9ca158f5a9f04f6a2
'OCP\\Settings\\IManager' => __DIR__ . '/../../..' . '/lib/public/Settings/IManager.php',
'OCP\\Settings\\ISettings' => __DIR__ . '/../../..' . '/lib/public/Settings/ISettings.php',
'OCP\\Settings\\ISubAdminSettings' => __DIR__ . '/../../..' . '/lib/public/Settings/ISubAdminSettings.php',
+ 'OCP\\SetupCheck\\CheckServerResponseTrait' => __DIR__ . '/../../..' . '/lib/public/SetupCheck/CheckServerResponseTrait.php',
'OCP\\SetupCheck\\ISetupCheck' => __DIR__ . '/../../..' . '/lib/public/SetupCheck/ISetupCheck.php',
'OCP\\SetupCheck\\ISetupCheckManager' => __DIR__ . '/../../..' . '/lib/public/SetupCheck/ISetupCheckManager.php',
'OCP\\SetupCheck\\SetupResult' => __DIR__ . '/../../..' . '/lib/public/SetupCheck/SetupResult.php',
diff --git a/lib/l10n/ar.js b/lib/l10n/ar.js
index 692a8337843..a74b732b514 100644
--- a/lib/l10n/ar.js
+++ b/lib/l10n/ar.js
@@ -306,6 +306,7 @@ OC.L10N.register(
"Storage connection error. %s" : "خطأ في اتصال التخزين. %s ",
"Storage is temporarily not available" : "وحدة التخزين غير متوفرة",
"Storage connection timeout. %s" : "انتهت مهلة الاتصال بالتخزين. %s",
+ "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "للسماح بتشغيل هذا الفحص، عليك التأكد من أن خادوم الويب خاصّتك يمكنه الاتصال بنفسه. لذلك، يجب أن يكون قادراً على حل المشكلة والاتصال بواحد على الأقل من \"النطاقات_الموثوقة\" أو \"overwrite.cli.url\". قد يكون هذا الفشل نتيجة لعدم تطابق DNS من جانب الخادوم أو قاعدة صادرة لجدار الحماية.",
"Transcribe audio" : "تحويل الكلام لنص",
"Transcribe the things said in an audio" : "تحويل الكلام المحكي في المقطع الصوتي إلى نص",
"Audio input" : "المدخلات الصوتية",
diff --git a/lib/l10n/ar.json b/lib/l10n/ar.json
index befa4669278..669d13c34b6 100644
--- a/lib/l10n/ar.json
+++ b/lib/l10n/ar.json
@@ -304,6 +304,7 @@
"Storage connection error. %s" : "خطأ في اتصال التخزين. %s ",
"Storage is temporarily not available" : "وحدة التخزين غير متوفرة",
"Storage connection timeout. %s" : "انتهت مهلة الاتصال بالتخزين. %s",
+ "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "للسماح بتشغيل هذا الفحص، عليك التأكد من أن خادوم الويب خاصّتك يمكنه الاتصال بنفسه. لذلك، يجب أن يكون قادراً على حل المشكلة والاتصال بواحد على الأقل من \"النطاقات_الموثوقة\" أو \"overwrite.cli.url\". قد يكون هذا الفشل نتيجة لعدم تطابق DNS من جانب الخادوم أو قاعدة صادرة لجدار الحماية.",
"Transcribe audio" : "تحويل الكلام لنص",
"Transcribe the things said in an audio" : "تحويل الكلام المحكي في المقطع الصوتي إلى نص",
"Audio input" : "المدخلات الصوتية",
diff --git a/lib/l10n/da.js b/lib/l10n/da.js
index 3daf3dece10..a24bb26bdda 100644
--- a/lib/l10n/da.js
+++ b/lib/l10n/da.js
@@ -239,6 +239,7 @@ OC.L10N.register(
"Storage connection error. %s" : "Forbindelses fejl til lageret. %s",
"Storage is temporarily not available" : "Lagerplads er midlertidigt ikke tilgængeligt",
"Storage connection timeout. %s" : "Lageret svarer ikke. %s",
+ "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "For at tillade at denne kontrol køres så skal du sikre dig at din webserver kan forbinde til sig selv. Derfor skal den kunne opløse og forbinde til mindst en af dets `trusted_domains` eller `overwrite.cli.url`. Denne fejl kan være resultatet af en server-side DNS mismatch eller udadgående firewall regel.",
"Chat" : "cHAT",
"Generates a possible headline for a text." : "Genererer en mulig overskrift til en tekst.",
"Summarize" : "Opsummer",
diff --git a/lib/l10n/da.json b/lib/l10n/da.json
index 992ac03801c..dd83c814e23 100644
--- a/lib/l10n/da.json
+++ b/lib/l10n/da.json
@@ -237,6 +237,7 @@
"Storage connection error. %s" : "Forbindelses fejl til lageret. %s",
"Storage is temporarily not available" : "Lagerplads er midlertidigt ikke tilgængeligt",
"Storage connection timeout. %s" : "Lageret svarer ikke. %s",
+ "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "For at tillade at denne kontrol køres så skal du sikre dig at din webserver kan forbinde til sig selv. Derfor skal den kunne opløse og forbinde til mindst en af dets `trusted_domains` eller `overwrite.cli.url`. Denne fejl kan være resultatet af en server-side DNS mismatch eller udadgående firewall regel.",
"Chat" : "cHAT",
"Generates a possible headline for a text." : "Genererer en mulig overskrift til en tekst.",
"Summarize" : "Opsummer",
diff --git a/lib/l10n/de.js b/lib/l10n/de.js
index 651d66800af..d0bb5cdc795 100644
--- a/lib/l10n/de.js
+++ b/lib/l10n/de.js
@@ -306,6 +306,7 @@ OC.L10N.register(
"Storage connection error. %s" : "Verbindungsfehler zum Speicherplatz. %s",
"Storage is temporarily not available" : "Speicher ist vorübergehend nicht verfügbar",
"Storage connection timeout. %s" : "Zeitüberschreitung der Verbindung zum Speicherplatz. %s",
+ "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "Damit diese Prüfung ausgeführt werden kann, musst du sicherstellen, dass dein Webserver eine Verbindung zu sich selbst herstellen kann. Daher muss er in der Lage sein, mindestens eine seiner `trusted_domains` oder `overwrite.cli.url` aufzulösen und eine Verbindung zu ihnen herzustellen. Dieser Fehler kann das Ergebnis einer serverseitigen DNS-Nichtübereinstimmung oder einer ausgehenden Firewall-Regel sein.",
"Transcribe audio" : "Audio transkribieren",
"Transcribe the things said in an audio" : "Inhalt der Audiodatei transkribieren",
"Audio input" : "Audioeingang",
diff --git a/lib/l10n/de.json b/lib/l10n/de.json
index 49030ec45cc..aa7583d5773 100644
--- a/lib/l10n/de.json
+++ b/lib/l10n/de.json
@@ -304,6 +304,7 @@
"Storage connection error. %s" : "Verbindungsfehler zum Speicherplatz. %s",
"Storage is temporarily not available" : "Speicher ist vorübergehend nicht verfügbar",
"Storage connection timeout. %s" : "Zeitüberschreitung der Verbindung zum Speicherplatz. %s",
+ "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "Damit diese Prüfung ausgeführt werden kann, musst du sicherstellen, dass dein Webserver eine Verbindung zu sich selbst herstellen kann. Daher muss er in der Lage sein, mindestens eine seiner `trusted_domains` oder `overwrite.cli.url` aufzulösen und eine Verbindung zu ihnen herzustellen. Dieser Fehler kann das Ergebnis einer serverseitigen DNS-Nichtübereinstimmung oder einer ausgehenden Firewall-Regel sein.",
"Transcribe audio" : "Audio transkribieren",
"Transcribe the things said in an audio" : "Inhalt der Audiodatei transkribieren",
"Audio input" : "Audioeingang",
diff --git a/lib/l10n/de_DE.js b/lib/l10n/de_DE.js
index ed39aa48dc1..f783ea7b280 100644
--- a/lib/l10n/de_DE.js
+++ b/lib/l10n/de_DE.js
@@ -306,6 +306,7 @@ OC.L10N.register(
"Storage connection error. %s" : "Verbindungsfehler zum Speicherplatz. %s",
"Storage is temporarily not available" : "Speicher ist vorübergehend nicht verfügbar",
"Storage connection timeout. %s" : "Zeitüberschreitung der Verbindung zum Speicherplatz. %s",
+ "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "Damit diese Prüfung ausgeführt werden kann, müssen Sie sicherstellen, dass Ihr Webserver eine Verbindung zu sich selbst herstellen kann. Daher muss er in der Lage sein, mindestens eine seiner `trusted_domains` oder `overwrite.cli.url` aufzulösen und eine Verbindung zu ihnen herzustellen. Dieser Fehler kann das Ergebnis einer serverseitigen DNS-Nichtübereinstimmung oder einer ausgehenden Firewall-Regel sein.",
"Transcribe audio" : "Audio transkribieren",
"Transcribe the things said in an audio" : "Inhalt der Audiodatei transkribieren",
"Audio input" : "Audioeingang",
diff --git a/lib/l10n/de_DE.json b/lib/l10n/de_DE.json
index 0e3264afc52..43dfb53258b 100644
--- a/lib/l10n/de_DE.json
+++ b/lib/l10n/de_DE.json
@@ -304,6 +304,7 @@
"Storage connection error. %s" : "Verbindungsfehler zum Speicherplatz. %s",
"Storage is temporarily not available" : "Speicher ist vorübergehend nicht verfügbar",
"Storage connection timeout. %s" : "Zeitüberschreitung der Verbindung zum Speicherplatz. %s",
+ "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "Damit diese Prüfung ausgeführt werden kann, müssen Sie sicherstellen, dass Ihr Webserver eine Verbindung zu sich selbst herstellen kann. Daher muss er in der Lage sein, mindestens eine seiner `trusted_domains` oder `overwrite.cli.url` aufzulösen und eine Verbindung zu ihnen herzustellen. Dieser Fehler kann das Ergebnis einer serverseitigen DNS-Nichtübereinstimmung oder einer ausgehenden Firewall-Regel sein.",
"Transcribe audio" : "Audio transkribieren",
"Transcribe the things said in an audio" : "Inhalt der Audiodatei transkribieren",
"Audio input" : "Audioeingang",
diff --git a/lib/l10n/en_GB.js b/lib/l10n/en_GB.js
index 92810367d14..73577b23c1b 100644
--- a/lib/l10n/en_GB.js
+++ b/lib/l10n/en_GB.js
@@ -306,6 +306,7 @@ OC.L10N.register(
"Storage connection error. %s" : "Storage connection error. %s",
"Storage is temporarily not available" : "Storage is temporarily not available",
"Storage connection timeout. %s" : "Storage connection timeout. %s",
+ "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule.",
"Transcribe audio" : "Transcribe audio",
"Transcribe the things said in an audio" : "Transcribe the things said in an audio",
"Audio input" : "Audio input",
diff --git a/lib/l10n/en_GB.json b/lib/l10n/en_GB.json
index 9516dcd7709..79ca7845d67 100644
--- a/lib/l10n/en_GB.json
+++ b/lib/l10n/en_GB.json
@@ -304,6 +304,7 @@
"Storage connection error. %s" : "Storage connection error. %s",
"Storage is temporarily not available" : "Storage is temporarily not available",
"Storage connection timeout. %s" : "Storage connection timeout. %s",
+ "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule.",
"Transcribe audio" : "Transcribe audio",
"Transcribe the things said in an audio" : "Transcribe the things said in an audio",
"Audio input" : "Audio input",
diff --git a/lib/l10n/es.js b/lib/l10n/es.js
index 1e361819686..e95aa593ff6 100644
--- a/lib/l10n/es.js
+++ b/lib/l10n/es.js
@@ -259,6 +259,7 @@ OC.L10N.register(
"Storage connection error. %s" : "Error de conexión de almacenamiento. %s",
"Storage is temporarily not available" : "El almacenamiento no esta disponible temporalmente",
"Storage connection timeout. %s" : "Tiempo de conexión de almacenamiento agotado. %s",
+ "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "Para permitir que este chequeo se lleve a cabo, debe asegurarse que su servidor pueda conectarse a sí mismo. Por tanto, este debe poder resolver y conectarse a alguno de sus `trusted_domains` o al url definido en `overwrite.cli.url`. Este fallo puede ser resultado de una inconsistencia DNS del lado del servidor o una regla de salida del cortafuegos.",
"Audio input" : "Entrada de audio",
"Context write" : "Escribir contexto",
"Writes text in a given style based on the provided source material." : "Escribe el texto en un estilo dado basándose en el material fuente proporcionado.",
diff --git a/lib/l10n/es.json b/lib/l10n/es.json
index 7922cd73598..7d528faa12e 100644
--- a/lib/l10n/es.json
+++ b/lib/l10n/es.json
@@ -257,6 +257,7 @@
"Storage connection error. %s" : "Error de conexión de almacenamiento. %s",
"Storage is temporarily not available" : "El almacenamiento no esta disponible temporalmente",
"Storage connection timeout. %s" : "Tiempo de conexión de almacenamiento agotado. %s",
+ "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "Para permitir que este chequeo se lleve a cabo, debe asegurarse que su servidor pueda conectarse a sí mismo. Por tanto, este debe poder resolver y conectarse a alguno de sus `trusted_domains` o al url definido en `overwrite.cli.url`. Este fallo puede ser resultado de una inconsistencia DNS del lado del servidor o una regla de salida del cortafuegos.",
"Audio input" : "Entrada de audio",
"Context write" : "Escribir contexto",
"Writes text in a given style based on the provided source material." : "Escribe el texto en un estilo dado basándose en el material fuente proporcionado.",
diff --git a/lib/l10n/eu.js b/lib/l10n/eu.js
index 5eae9133d2e..e423b76950c 100644
--- a/lib/l10n/eu.js
+++ b/lib/l10n/eu.js
@@ -271,6 +271,7 @@ OC.L10N.register(
"Storage connection error. %s" : "Biltegiratze-konexioaren errorea. %s",
"Storage is temporarily not available" : "Biltegia ez dago erabilgarri aldi baterako",
"Storage connection timeout. %s" : "Biltegiratze-konexioa denboraz kanpo geratu da. %s",
+ "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "Egiaztapen hau exekuta dadin ziurtatu behar duzu zure web zerbitzaria bere buruarekin konektatu daitekeela. Hori dela eta, bere `trusted_domains` edo `overwrite.cli.url`ra gutxienez ebatzi eta konektatzeko gai izan behar du. Baliteke hutsegite hau zerbitzariaren aldeko DNS ez bat etortzea edo irteerako suebakiaren arauaren ondorioa izatea.",
"Transcribe audio" : "Audioa transkribatu",
"Transcribe the things said in an audio" : "Audio batean esandako gauzak transkribatu",
"Audio input" : "Audio sarrera",
diff --git a/lib/l10n/eu.json b/lib/l10n/eu.json
index af74d6d39c4..7ab3e83432c 100644
--- a/lib/l10n/eu.json
+++ b/lib/l10n/eu.json
@@ -269,6 +269,7 @@
"Storage connection error. %s" : "Biltegiratze-konexioaren errorea. %s",
"Storage is temporarily not available" : "Biltegia ez dago erabilgarri aldi baterako",
"Storage connection timeout. %s" : "Biltegiratze-konexioa denboraz kanpo geratu da. %s",
+ "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "Egiaztapen hau exekuta dadin ziurtatu behar duzu zure web zerbitzaria bere buruarekin konektatu daitekeela. Hori dela eta, bere `trusted_domains` edo `overwrite.cli.url`ra gutxienez ebatzi eta konektatzeko gai izan behar du. Baliteke hutsegite hau zerbitzariaren aldeko DNS ez bat etortzea edo irteerako suebakiaren arauaren ondorioa izatea.",
"Transcribe audio" : "Audioa transkribatu",
"Transcribe the things said in an audio" : "Audio batean esandako gauzak transkribatu",
"Audio input" : "Audio sarrera",
diff --git a/lib/l10n/fr.js b/lib/l10n/fr.js
index a01dcd43ed9..00970b4e600 100644
--- a/lib/l10n/fr.js
+++ b/lib/l10n/fr.js
@@ -273,6 +273,7 @@ OC.L10N.register(
"Storage connection error. %s" : "Erreur de connexion à l’espace stockage. %s",
"Storage is temporarily not available" : "Le support de stockage est temporairement indisponible",
"Storage connection timeout. %s" : "Le délai d'attente pour la connexion à l'espace de stockage a été dépassé. %s",
+ "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "Pour autoriser cette vérification, pour devez vous assurer que votre serveur web peut se connecter à lui-même. Il doit donc être capable de résoudre et de se connecter à au moins un de ses `trusted_domains` ou à l'URL `overwrite.cli.url`. Cet échec peut être le résultat d'une erreur de DNS côté serveur ou d'une règle de pare-feu sortante.",
"Transcribe audio" : "Transcrire l'audio",
"Transcribe the things said in an audio" : "Transcrire les propos exprimés dans un fichier audio",
"Audio input" : "Entrée audio",
diff --git a/lib/l10n/fr.json b/lib/l10n/fr.json
index b81e3f901eb..0efc2236147 100644
--- a/lib/l10n/fr.json
+++ b/lib/l10n/fr.json
@@ -271,6 +271,7 @@
"Storage connection error. %s" : "Erreur de connexion à l’espace stockage. %s",
"Storage is temporarily not available" : "Le support de stockage est temporairement indisponible",
"Storage connection timeout. %s" : "Le délai d'attente pour la connexion à l'espace de stockage a été dépassé. %s",
+ "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "Pour autoriser cette vérification, pour devez vous assurer que votre serveur web peut se connecter à lui-même. Il doit donc être capable de résoudre et de se connecter à au moins un de ses `trusted_domains` ou à l'URL `overwrite.cli.url`. Cet échec peut être le résultat d'une erreur de DNS côté serveur ou d'une règle de pare-feu sortante.",
"Transcribe audio" : "Transcrire l'audio",
"Transcribe the things said in an audio" : "Transcrire les propos exprimés dans un fichier audio",
"Audio input" : "Entrée audio",
diff --git a/lib/l10n/ga.js b/lib/l10n/ga.js
index 223823d0030..7f2bed308f0 100644
--- a/lib/l10n/ga.js
+++ b/lib/l10n/ga.js
@@ -306,6 +306,7 @@ OC.L10N.register(
"Storage connection error. %s" : "Earráid nasc stórála. %s",
"Storage is temporarily not available" : "Níl stóráil ar fáil go sealadach",
"Storage connection timeout. %s" : "Teorainn ama ceangail stórála. %s",
+ "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "Le gur féidir an tseiceáil seo a rith caithfidh tú a chinntiú gur féidir le do fhreastalaí Gréasáin nascadh leis féin. Mar sin caithfidh sé a bheith in ann réiteach agus ceangal a dhéanamh le ceann amháin ar a laghad dá chuid `fearainn_iontaofa` nó an `overwrite.cli.url`. D'fhéadfadh an teip seo a bheith mar thoradh ar mhímheaitseáil DNS ar thaobh an fhreastalaí nó riail balla dóiteáin amach.",
"Transcribe audio" : "Trascríobh fuaime",
"Transcribe the things said in an audio" : "Tras-scríobh na rudaí a dúradh i bhfuaim",
"Audio input" : "Ionchur fuaime",
diff --git a/lib/l10n/ga.json b/lib/l10n/ga.json
index 80cf1916fce..1f21bc8d23c 100644
--- a/lib/l10n/ga.json
+++ b/lib/l10n/ga.json
@@ -304,6 +304,7 @@
"Storage connection error. %s" : "Earráid nasc stórála. %s",
"Storage is temporarily not available" : "Níl stóráil ar fáil go sealadach",
"Storage connection timeout. %s" : "Teorainn ama ceangail stórála. %s",
+ "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "Le gur féidir an tseiceáil seo a rith caithfidh tú a chinntiú gur féidir le do fhreastalaí Gréasáin nascadh leis féin. Mar sin caithfidh sé a bheith in ann réiteach agus ceangal a dhéanamh le ceann amháin ar a laghad dá chuid `fearainn_iontaofa` nó an `overwrite.cli.url`. D'fhéadfadh an teip seo a bheith mar thoradh ar mhímheaitseáil DNS ar thaobh an fhreastalaí nó riail balla dóiteáin amach.",
"Transcribe audio" : "Trascríobh fuaime",
"Transcribe the things said in an audio" : "Tras-scríobh na rudaí a dúradh i bhfuaim",
"Audio input" : "Ionchur fuaime",
diff --git a/lib/l10n/gl.js b/lib/l10n/gl.js
index fe718f37cac..15a9b989ca8 100644
--- a/lib/l10n/gl.js
+++ b/lib/l10n/gl.js
@@ -306,6 +306,7 @@ OC.L10N.register(
"Storage connection error. %s" : "Produciuse un erro na conexión ao almacenamento. %s",
"Storage is temporarily not available" : "O almacenamento non está dispoñíbel temporalmente",
"Storage connection timeout. %s" : "Esgotouse o tempo de conexión co almacenamento. %s",
+ "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "Para permitir que esta comprobación se execute, debe asegurarse de que o seu servidor web poida conectarse a si mesmo. Por tanto, debe ser quen de resolver e conectarse a polo menos un dos seus «trusted_domains» ou ao «overwrite.cli.url». Este fallo pode ser o resultado dunha falta de coincidencia de DNS do servidor ou dunha regra da devasa de saída.",
"Transcribe audio" : "Transcribir son",
"Transcribe the things said in an audio" : "Transcribir as cousas ditas nun ficheiro de son",
"Audio input" : "Entrada de son",
diff --git a/lib/l10n/gl.json b/lib/l10n/gl.json
index 4c74a5fb946..bec8af2a5bc 100644
--- a/lib/l10n/gl.json
+++ b/lib/l10n/gl.json
@@ -304,6 +304,7 @@
"Storage connection error. %s" : "Produciuse un erro na conexión ao almacenamento. %s",
"Storage is temporarily not available" : "O almacenamento non está dispoñíbel temporalmente",
"Storage connection timeout. %s" : "Esgotouse o tempo de conexión co almacenamento. %s",
+ "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "Para permitir que esta comprobación se execute, debe asegurarse de que o seu servidor web poida conectarse a si mesmo. Por tanto, debe ser quen de resolver e conectarse a polo menos un dos seus «trusted_domains» ou ao «overwrite.cli.url». Este fallo pode ser o resultado dunha falta de coincidencia de DNS do servidor ou dunha regra da devasa de saída.",
"Transcribe audio" : "Transcribir son",
"Transcribe the things said in an audio" : "Transcribir as cousas ditas nun ficheiro de son",
"Audio input" : "Entrada de son",
diff --git a/lib/l10n/ja.js b/lib/l10n/ja.js
index 805d2b29559..f148fcadf4b 100644
--- a/lib/l10n/ja.js
+++ b/lib/l10n/ja.js
@@ -306,6 +306,7 @@ OC.L10N.register(
"Storage connection error. %s" : "ストレージへの接続エラー。 %s",
"Storage is temporarily not available" : "ストレージは一時的に利用できません",
"Storage connection timeout. %s" : "ストレージへの接続がタイムアウト。 %s",
+ "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "このチェックを実行させるには、Webサーバーが自分自身に接続できることを確認しなければならない。そのため、少なくとも一つの `trusted_domains` または `overwrite.cli.url` を解決して接続できなければなりません。この失敗は、サーバ側のDNSの不一致やアウトバウンドファイアウォールルールの結果かもしれません。",
"Transcribe audio" : "音声の書き起こし",
"Transcribe the things said in an audio" : "音声で言ったことを書き起こす",
"Audio input" : "音声入力",
diff --git a/lib/l10n/ja.json b/lib/l10n/ja.json
index a1e56860774..549e11415d3 100644
--- a/lib/l10n/ja.json
+++ b/lib/l10n/ja.json
@@ -304,6 +304,7 @@
"Storage connection error. %s" : "ストレージへの接続エラー。 %s",
"Storage is temporarily not available" : "ストレージは一時的に利用できません",
"Storage connection timeout. %s" : "ストレージへの接続がタイムアウト。 %s",
+ "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "このチェックを実行させるには、Webサーバーが自分自身に接続できることを確認しなければならない。そのため、少なくとも一つの `trusted_domains` または `overwrite.cli.url` を解決して接続できなければなりません。この失敗は、サーバ側のDNSの不一致やアウトバウンドファイアウォールルールの結果かもしれません。",
"Transcribe audio" : "音声の書き起こし",
"Transcribe the things said in an audio" : "音声で言ったことを書き起こす",
"Audio input" : "音声入力",
diff --git a/lib/l10n/nb.js b/lib/l10n/nb.js
index a527c10932b..a38140c289b 100644
--- a/lib/l10n/nb.js
+++ b/lib/l10n/nb.js
@@ -273,6 +273,7 @@ OC.L10N.register(
"Storage connection error. %s" : "Tilkoblingsfeil for lager. %s",
"Storage is temporarily not available" : "Lagring er midlertidig utilgjengelig",
"Storage connection timeout. %s" : "Tidsavbrudd ved tilkobling av lager: %s",
+ "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "For å la denne kontrollen kjøre, må du sørge for at webserveren din kan koble til seg selv. Derfor må den kunne løse og koble til minst en dens 'trusted_domains' eller 'overwrite.cli.url'. Denne feilen kan være et resultat av ikke-DNS-samsvar på serversiden eller en regel for utgående brannmur.",
"Transcribe audio" : "Transkriber lyd",
"Transcribe the things said in an audio" : "Transkriber tingene som blir sagt i en lyd",
"Audio input" : "Lydinndata",
diff --git a/lib/l10n/nb.json b/lib/l10n/nb.json
index 5a810e14020..2a77f186ffc 100644
--- a/lib/l10n/nb.json
+++ b/lib/l10n/nb.json
@@ -271,6 +271,7 @@
"Storage connection error. %s" : "Tilkoblingsfeil for lager. %s",
"Storage is temporarily not available" : "Lagring er midlertidig utilgjengelig",
"Storage connection timeout. %s" : "Tidsavbrudd ved tilkobling av lager: %s",
+ "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "For å la denne kontrollen kjøre, må du sørge for at webserveren din kan koble til seg selv. Derfor må den kunne løse og koble til minst en dens 'trusted_domains' eller 'overwrite.cli.url'. Denne feilen kan være et resultat av ikke-DNS-samsvar på serversiden eller en regel for utgående brannmur.",
"Transcribe audio" : "Transkriber lyd",
"Transcribe the things said in an audio" : "Transkriber tingene som blir sagt i en lyd",
"Audio input" : "Lydinndata",
diff --git a/lib/l10n/pt_BR.js b/lib/l10n/pt_BR.js
index c750601e4c4..6cae9cc6e47 100644
--- a/lib/l10n/pt_BR.js
+++ b/lib/l10n/pt_BR.js
@@ -306,6 +306,7 @@ OC.L10N.register(
"Storage connection error. %s" : "Erro na conexão de armazenamento. %s",
"Storage is temporarily not available" : "Armazenamento temporariamente indisponível",
"Storage connection timeout. %s" : "Atingido o tempo limite de conexão ao armazenamento. %s",
+ "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "Para permitir que esta verificação seja executada, você deve certificar-se de que seu servidor Web pode se conectar a si mesmo. Portanto, ele deve ser capaz de resolver e conectar-se a pelo menos um de seus `trusted_domains` ou `overwrite.cli.url`. Essa falha pode ser o resultado de uma incompatibilidade de DNS no servidor ou de uma regra de firewall de saída.",
"Transcribe audio" : "Transcrever áudio",
"Transcribe the things said in an audio" : "Transcreva as coisas ditas em um áudio",
"Audio input" : "Entrada de áudio",
diff --git a/lib/l10n/pt_BR.json b/lib/l10n/pt_BR.json
index 6ddfc036043..c53e5a2f4d5 100644
--- a/lib/l10n/pt_BR.json
+++ b/lib/l10n/pt_BR.json
@@ -304,6 +304,7 @@
"Storage connection error. %s" : "Erro na conexão de armazenamento. %s",
"Storage is temporarily not available" : "Armazenamento temporariamente indisponível",
"Storage connection timeout. %s" : "Atingido o tempo limite de conexão ao armazenamento. %s",
+ "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "Para permitir que esta verificação seja executada, você deve certificar-se de que seu servidor Web pode se conectar a si mesmo. Portanto, ele deve ser capaz de resolver e conectar-se a pelo menos um de seus `trusted_domains` ou `overwrite.cli.url`. Essa falha pode ser o resultado de uma incompatibilidade de DNS no servidor ou de uma regra de firewall de saída.",
"Transcribe audio" : "Transcrever áudio",
"Transcribe the things said in an audio" : "Transcreva as coisas ditas em um áudio",
"Audio input" : "Entrada de áudio",
diff --git a/lib/l10n/ru.js b/lib/l10n/ru.js
index afa886d111e..7390eb7407c 100644
--- a/lib/l10n/ru.js
+++ b/lib/l10n/ru.js
@@ -300,6 +300,7 @@ OC.L10N.register(
"Storage connection error. %s" : "Ошибка подключения к хранилищу. %s",
"Storage is temporarily not available" : "Хранилище временно недоступно",
"Storage connection timeout. %s" : "Истекло время ожидания подключения к хранилищу. %s",
+ "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "Чтобы разрешить эту проверку, вам нужно убедиться, что ваш веб-сервер может подключаться к себе. Поэтому он должен иметь возможность разрешать и подключаться по крайней мере к одному из своих `trusted_domains` или `overwrite.cli.url`. Эта ошибка может быть результатом несоответствия DNS на стороне сервера или исходящего правила брандмауэра.",
"Transcribe audio" : "Транскрибировать аудио",
"Transcribe the things said in an audio" : "Запишите то, что было сказано в аудиозаписи",
"Audio input" : "Аудиовход",
diff --git a/lib/l10n/ru.json b/lib/l10n/ru.json
index 6308ae25585..8394dc961da 100644
--- a/lib/l10n/ru.json
+++ b/lib/l10n/ru.json
@@ -298,6 +298,7 @@
"Storage connection error. %s" : "Ошибка подключения к хранилищу. %s",
"Storage is temporarily not available" : "Хранилище временно недоступно",
"Storage connection timeout. %s" : "Истекло время ожидания подключения к хранилищу. %s",
+ "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "Чтобы разрешить эту проверку, вам нужно убедиться, что ваш веб-сервер может подключаться к себе. Поэтому он должен иметь возможность разрешать и подключаться по крайней мере к одному из своих `trusted_domains` или `overwrite.cli.url`. Эта ошибка может быть результатом несоответствия DNS на стороне сервера или исходящего правила брандмауэра.",
"Transcribe audio" : "Транскрибировать аудио",
"Transcribe the things said in an audio" : "Запишите то, что было сказано в аудиозаписи",
"Audio input" : "Аудиовход",
diff --git a/lib/l10n/sk.js b/lib/l10n/sk.js
index 90a3f0fb1e1..b2bb6464ad0 100644
--- a/lib/l10n/sk.js
+++ b/lib/l10n/sk.js
@@ -265,6 +265,7 @@ OC.L10N.register(
"Storage connection error. %s" : "Chyba pripojenia k úložisku. %s",
"Storage is temporarily not available" : "Úložisko je dočasne nedostupné",
"Storage connection timeout. %s" : "Vypršanie pripojenia k úložisku. %s",
+ "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "Ak chcete povoliť spustenie tejto kontroly, musíte sa uistiť, že váš webový server sa môže pripojiť sám k sebe. Preto musí byť schopný rozpoznať a pripojiť sa aspoň k jednej zo svojich `trusted_domains` alebo `overwrite.cli.url`. Výsledkom nesprávneho nastavenia môže byť nesúlad DNS na strane servera alebo pravidla brány firewall pre výstup.",
"Audio input" : "Audio vstup",
"Generates a possible headline for a text." : "Generuje možný nadpis pre text.",
"Summarize" : "Zhrnutie",
diff --git a/lib/l10n/sk.json b/lib/l10n/sk.json
index c3a5e6df74a..fd905b9ab37 100644
--- a/lib/l10n/sk.json
+++ b/lib/l10n/sk.json
@@ -263,6 +263,7 @@
"Storage connection error. %s" : "Chyba pripojenia k úložisku. %s",
"Storage is temporarily not available" : "Úložisko je dočasne nedostupné",
"Storage connection timeout. %s" : "Vypršanie pripojenia k úložisku. %s",
+ "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "Ak chcete povoliť spustenie tejto kontroly, musíte sa uistiť, že váš webový server sa môže pripojiť sám k sebe. Preto musí byť schopný rozpoznať a pripojiť sa aspoň k jednej zo svojich `trusted_domains` alebo `overwrite.cli.url`. Výsledkom nesprávneho nastavenia môže byť nesúlad DNS na strane servera alebo pravidla brány firewall pre výstup.",
"Audio input" : "Audio vstup",
"Generates a possible headline for a text." : "Generuje možný nadpis pre text.",
"Summarize" : "Zhrnutie",
diff --git a/lib/l10n/sl.js b/lib/l10n/sl.js
index 3fe4bcbecf3..eb70468070c 100644
--- a/lib/l10n/sl.js
+++ b/lib/l10n/sl.js
@@ -229,6 +229,7 @@ OC.L10N.register(
"Storage connection error. %s" : "Napaka povezave do shrambe. %s",
"Storage is temporarily not available" : "Shramba trenutno ni na voljo",
"Storage connection timeout. %s" : "Povezava do shrambe je časovno potekla. %s",
+ "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "Če želite omogočiti izvajanje tega preverjanja, je treba zagotoviti, da se spletni strežnik lahko poveže sam s seboj. Zato mora biti nastavljen za povezovanje z vsaj eno od določenih »varnih domen« (trusted_domains) ali naslovov za prepis »vmesnika ukazne vrstice« (overwrite.cli.url). Spodletelo preverjanje je lahko posledica neujemanja imen DNS na strani strežnika oziroma pravila požarnega zidu.",
"Writing style" : "Slog pisanja",
"Generate image" : "Ustvari sliko",
"Summary" : "Povzetek",
diff --git a/lib/l10n/sl.json b/lib/l10n/sl.json
index b3752071adf..fb4557f0ff3 100644
--- a/lib/l10n/sl.json
+++ b/lib/l10n/sl.json
@@ -227,6 +227,7 @@
"Storage connection error. %s" : "Napaka povezave do shrambe. %s",
"Storage is temporarily not available" : "Shramba trenutno ni na voljo",
"Storage connection timeout. %s" : "Povezava do shrambe je časovno potekla. %s",
+ "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "Če želite omogočiti izvajanje tega preverjanja, je treba zagotoviti, da se spletni strežnik lahko poveže sam s seboj. Zato mora biti nastavljen za povezovanje z vsaj eno od določenih »varnih domen« (trusted_domains) ali naslovov za prepis »vmesnika ukazne vrstice« (overwrite.cli.url). Spodletelo preverjanje je lahko posledica neujemanja imen DNS na strani strežnika oziroma pravila požarnega zidu.",
"Writing style" : "Slog pisanja",
"Generate image" : "Ustvari sliko",
"Summary" : "Povzetek",
diff --git a/lib/l10n/sr.js b/lib/l10n/sr.js
index 953b0d20ecf..139a4b77603 100644
--- a/lib/l10n/sr.js
+++ b/lib/l10n/sr.js
@@ -82,12 +82,20 @@ OC.L10N.register(
"Empty file" : "Празан фајл",
"Module with ID: %s does not exist. Please enable it in your apps settings or contact your administrator." : "Модул са идентификацијом: %s не постоји. Омогућите га у подешавањима апликација или контактирајте администратора.",
"Dot files are not allowed" : "Фајлови са почетном тачком нису дозвољени",
+ "\"%1$s\" is a forbidden file or folder name." : "„%1$s” је забрањено име фајла или фолдера.",
+ "\"%1$s\" is a forbidden prefix for file or folder names." : "„%1$s” је забрањени префикс имена фајла или фолдера.",
+ "\"%1$s\" is not allowed inside a file or folder name." : "„%1$s” није дозвољено у имену фајла или фолдера.",
+ "\"%1$s\" is a forbidden file type." : "„%1$s” је забрањен тип фајла.",
+ "Filenames must not end with \"%1$s\"." : "Имена фајлова не смеју да се завршавају са „%1$s”.",
+ "Invalid parent path" : "Неисправна путања родитеља",
"File already exists" : "Фајл већ постоји",
"Invalid path" : "Неисправна путања",
"Failed to create file from template" : "Није успело креирање фајла из шаблона",
"Templates" : "Шаблони",
"Path contains invalid segments" : "Путања садржи неисправне сегменте",
+ "Filename is a reserved word" : "Име фајла је резервисана реч",
"Filename contains at least one invalid character" : "Назив фајла садржи бар један недозвољен знак",
+ "Filename is too long" : "Име фајла је сувише дугачко",
"Empty filename is not allowed" : "Празан назив није дозвољен",
"App \"%s\" cannot be installed because appinfo file cannot be read." : "Апликација \"%s\" не може бити инсталирана јер appinfo фајл не може да се прочита.",
"App \"%s\" cannot be installed because it is not compatible with this version of the server." : "Апликација \"%s\" не може бити инсталирана јер није компатибилна са овом верзијом сервера.",
@@ -147,15 +155,48 @@ OC.L10N.register(
"%1$s shared »%2$s« with you and wants to add:" : "%1$s је поделио „%2$s“ са Вама и жели да дода:",
"%1$s shared »%2$s« with you and wants to add" : "%1$s је поделио „%2$s“ са Вама и жели да дода",
"»%s« added a note to a file shared with you" : "\"%s\" је додао белешку на фајл који дели са Вама",
+ "Passwords are enforced for link and mail shares" : "За дељења линком и поштом је обавезна заштита лозинком",
+ "SharedWith is not a valid user" : "SharedWith није исправан корисник",
+ "SharedWith is not a valid group" : "SharedWith није исправна група",
+ "SharedWith should be empty" : "SharedWith би требало да буде празно",
+ "SharedWith should not be empty" : "SharedWith не би требало да буде празно",
+ "SharedWith is not a valid circle" : "SharedWith није исправан круг",
"Unknown share type" : "Непознат тип дељења",
+ "SharedBy should be set" : "SharedBy би требало да буде постављено",
+ "Cannot share with yourself" : "Не можете да делите са самим собом",
+ "Path should be set" : "Путања би требало да буде постављена",
+ "Path should be either a file or a folder" : "Путања би требало да буде или фајл или фолдер",
+ "You cannot share your root folder" : "Не можете да делите свој корени фолдер",
"You are not allowed to share %s" : "Није вам дозвољено да делите %s",
+ "A share requires permissions" : "За дељење су потребне дозволе",
"Cannot increase permissions of %s" : "Не могу да повећам привилегије за %s",
+ "Shares need at least read permissions" : "Дељења морају да имају барем право читања",
"Files cannot be shared with delete permissions" : "Фајлови не могу да се деле са дозволама за брисање",
"Files cannot be shared with create permissions" : "Фајлови не могу да се деле са дозволама за креирање",
"Expiration date is in the past" : "Датум истека је у прошлости",
+ "Expiration date is enforced" : "Форсиран је датум истека",
"_Cannot set expiration date more than %n day in the future_::_Cannot set expiration date more than %n days in the future_" : ["Датум истека не може да се постави више од %n дан у будућност","Датум истека не може да се постави више од %n дана у будућност","Датум истека не може да се постави више од %n дана у будућност"],
"Sharing is only allowed with group members" : "Дељење је дозвољено само са члановима групе",
"Sharing %s failed, because this item is already shared with the account %s" : "Дељење %s није успело зато што се ова ставка већ дели са налогом %s",
+ "Group sharing is now allowed" : "Сада је дозвољено дељење са групом",
+ "Sharing is only allowed within your own groups" : "Дељење је дозвољено само унутар ваших група",
+ "Path is already shared with this group" : "Путања се већ дели са овом групом",
+ "Link sharing is not allowed" : "Није дозвољено дељење линком",
+ "Public upload is not allowed" : "Није дозвољено јавно отпремање",
+ "Path contains files shared with you" : "Путања садржи фајлове који су подељени са вама",
+ "Sharing is disabled" : "Дељење је искључено",
+ "Sharing is disabled for you" : "Дељење је за вас искључено",
+ "Cannot share with the share owner" : "Не може да се дели са власником дељења",
+ "Share does not have a full ID" : "Дељење не поседује комплетан ID",
+ "Cannot change share type" : "Тип дељења не може да се промени",
+ "Can only update recipient on user shares" : "На корисничким дељењима може да се ажурира само прималац",
+ "Cannot enable sending the password by Talk with an empty password" : "Празном лозинком не може да се укључи слање лозинке апликацијом Talk",
+ "Cannot enable sending the password by Talk without setting a new password" : "Без постављања нове лозинке не може да се укључи слање лозинке апликацијом Talk",
+ "Cannot disable sending the password by Talk without setting a new password" : "Без постављања нове лозинке не може да се искључи слање лозинке апликацијом Talk",
+ "Share provider does not support accepting" : "Пружалац услуге дељења не подржава прихватање",
+ "Cannot change target of link share" : "Не може да се промени циљ дељења линком",
+ "Invalid recipient" : "Неисправан прималац",
+ "Group \"%s\" does not exist" : "Група „%s” не постоји",
"The requested share does not exist anymore" : "Захтевано дељење више не постоји",
"The requested share comes from a disabled user" : "Захтевано дељење долази од искљученог корисника",
"The user was not created because the user limit has been reached. Check your notifications to learn more." : "Корисник није креиран јер је достигнуто ограничење броја корисника. За више детаља, погледајте своја обавештења.",
@@ -265,6 +306,7 @@ OC.L10N.register(
"Storage connection error. %s" : "Грешка приликом повезивања на складиште. %s",
"Storage is temporarily not available" : "Складиште привремено није доступно",
"Storage connection timeout. %s" : "Истекло је време за повезивање на складиште. %s",
+ "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "Ако желите да се ова провера изврши, морате обезбедити да ваш веб сервер може да се повеже на самог себе. То значи да мора бити у стању да разреши и да се повеже барем на један од својих `trusted_domains` или `overwrite.cli.url`. Ова грешка може да буде резултат DNS неподударања на страни сервера или одлазно правило заштитног зида.",
"Transcribe audio" : "Транскрибуј звук",
"Transcribe the things said in an audio" : "Транскрибује оно што се каже у звуку",
"Audio input" : "Аудио улаз",
diff --git a/lib/l10n/sr.json b/lib/l10n/sr.json
index ac2001208e6..bd36483a8d0 100644
--- a/lib/l10n/sr.json
+++ b/lib/l10n/sr.json
@@ -80,12 +80,20 @@
"Empty file" : "Празан фајл",
"Module with ID: %s does not exist. Please enable it in your apps settings or contact your administrator." : "Модул са идентификацијом: %s не постоји. Омогућите га у подешавањима апликација или контактирајте администратора.",
"Dot files are not allowed" : "Фајлови са почетном тачком нису дозвољени",
+ "\"%1$s\" is a forbidden file or folder name." : "„%1$s” је забрањено име фајла или фолдера.",
+ "\"%1$s\" is a forbidden prefix for file or folder names." : "„%1$s” је забрањени префикс имена фајла или фолдера.",
+ "\"%1$s\" is not allowed inside a file or folder name." : "„%1$s” није дозвољено у имену фајла или фолдера.",
+ "\"%1$s\" is a forbidden file type." : "„%1$s” је забрањен тип фајла.",
+ "Filenames must not end with \"%1$s\"." : "Имена фајлова не смеју да се завршавају са „%1$s”.",
+ "Invalid parent path" : "Неисправна путања родитеља",
"File already exists" : "Фајл већ постоји",
"Invalid path" : "Неисправна путања",
"Failed to create file from template" : "Није успело креирање фајла из шаблона",
"Templates" : "Шаблони",
"Path contains invalid segments" : "Путања садржи неисправне сегменте",
+ "Filename is a reserved word" : "Име фајла је резервисана реч",
"Filename contains at least one invalid character" : "Назив фајла садржи бар један недозвољен знак",
+ "Filename is too long" : "Име фајла је сувише дугачко",
"Empty filename is not allowed" : "Празан назив није дозвољен",
"App \"%s\" cannot be installed because appinfo file cannot be read." : "Апликација \"%s\" не може бити инсталирана јер appinfo фајл не може да се прочита.",
"App \"%s\" cannot be installed because it is not compatible with this version of the server." : "Апликација \"%s\" не може бити инсталирана јер није компатибилна са овом верзијом сервера.",
@@ -145,15 +153,48 @@
"%1$s shared »%2$s« with you and wants to add:" : "%1$s је поделио „%2$s“ са Вама и жели да дода:",
"%1$s shared »%2$s« with you and wants to add" : "%1$s је поделио „%2$s“ са Вама и жели да дода",
"»%s« added a note to a file shared with you" : "\"%s\" је додао белешку на фајл који дели са Вама",
+ "Passwords are enforced for link and mail shares" : "За дељења линком и поштом је обавезна заштита лозинком",
+ "SharedWith is not a valid user" : "SharedWith није исправан корисник",
+ "SharedWith is not a valid group" : "SharedWith није исправна група",
+ "SharedWith should be empty" : "SharedWith би требало да буде празно",
+ "SharedWith should not be empty" : "SharedWith не би требало да буде празно",
+ "SharedWith is not a valid circle" : "SharedWith није исправан круг",
"Unknown share type" : "Непознат тип дељења",
+ "SharedBy should be set" : "SharedBy би требало да буде постављено",
+ "Cannot share with yourself" : "Не можете да делите са самим собом",
+ "Path should be set" : "Путања би требало да буде постављена",
+ "Path should be either a file or a folder" : "Путања би требало да буде или фајл или фолдер",
+ "You cannot share your root folder" : "Не можете да делите свој корени фолдер",
"You are not allowed to share %s" : "Није вам дозвољено да делите %s",
+ "A share requires permissions" : "За дељење су потребне дозволе",
"Cannot increase permissions of %s" : "Не могу да повећам привилегије за %s",
+ "Shares need at least read permissions" : "Дељења морају да имају барем право читања",
"Files cannot be shared with delete permissions" : "Фајлови не могу да се деле са дозволама за брисање",
"Files cannot be shared with create permissions" : "Фајлови не могу да се деле са дозволама за креирање",
"Expiration date is in the past" : "Датум истека је у прошлости",
+ "Expiration date is enforced" : "Форсиран је датум истека",
"_Cannot set expiration date more than %n day in the future_::_Cannot set expiration date more than %n days in the future_" : ["Датум истека не може да се постави више од %n дан у будућност","Датум истека не може да се постави више од %n дана у будућност","Датум истека не може да се постави више од %n дана у будућност"],
"Sharing is only allowed with group members" : "Дељење је дозвољено само са члановима групе",
"Sharing %s failed, because this item is already shared with the account %s" : "Дељење %s није успело зато што се ова ставка већ дели са налогом %s",
+ "Group sharing is now allowed" : "Сада је дозвољено дељење са групом",
+ "Sharing is only allowed within your own groups" : "Дељење је дозвољено само унутар ваших група",
+ "Path is already shared with this group" : "Путања се већ дели са овом групом",
+ "Link sharing is not allowed" : "Није дозвољено дељење линком",
+ "Public upload is not allowed" : "Није дозвољено јавно отпремање",
+ "Path contains files shared with you" : "Путања садржи фајлове који су подељени са вама",
+ "Sharing is disabled" : "Дељење је искључено",
+ "Sharing is disabled for you" : "Дељење је за вас искључено",
+ "Cannot share with the share owner" : "Не може да се дели са власником дељења",
+ "Share does not have a full ID" : "Дељење не поседује комплетан ID",
+ "Cannot change share type" : "Тип дељења не може да се промени",
+ "Can only update recipient on user shares" : "На корисничким дељењима може да се ажурира само прималац",
+ "Cannot enable sending the password by Talk with an empty password" : "Празном лозинком не може да се укључи слање лозинке апликацијом Talk",
+ "Cannot enable sending the password by Talk without setting a new password" : "Без постављања нове лозинке не може да се укључи слање лозинке апликацијом Talk",
+ "Cannot disable sending the password by Talk without setting a new password" : "Без постављања нове лозинке не може да се искључи слање лозинке апликацијом Talk",
+ "Share provider does not support accepting" : "Пружалац услуге дељења не подржава прихватање",
+ "Cannot change target of link share" : "Не може да се промени циљ дељења линком",
+ "Invalid recipient" : "Неисправан прималац",
+ "Group \"%s\" does not exist" : "Група „%s” не постоји",
"The requested share does not exist anymore" : "Захтевано дељење више не постоји",
"The requested share comes from a disabled user" : "Захтевано дељење долази од искљученог корисника",
"The user was not created because the user limit has been reached. Check your notifications to learn more." : "Корисник није креиран јер је достигнуто ограничење броја корисника. За више детаља, погледајте своја обавештења.",
@@ -263,6 +304,7 @@
"Storage connection error. %s" : "Грешка приликом повезивања на складиште. %s",
"Storage is temporarily not available" : "Складиште привремено није доступно",
"Storage connection timeout. %s" : "Истекло је време за повезивање на складиште. %s",
+ "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "Ако желите да се ова провера изврши, морате обезбедити да ваш веб сервер може да се повеже на самог себе. То значи да мора бити у стању да разреши и да се повеже барем на један од својих `trusted_domains` или `overwrite.cli.url`. Ова грешка може да буде резултат DNS неподударања на страни сервера или одлазно правило заштитног зида.",
"Transcribe audio" : "Транскрибуј звук",
"Transcribe the things said in an audio" : "Транскрибује оно што се каже у звуку",
"Audio input" : "Аудио улаз",
diff --git a/lib/l10n/tr.js b/lib/l10n/tr.js
index f8aa7323e63..16a84f25cf0 100644
--- a/lib/l10n/tr.js
+++ b/lib/l10n/tr.js
@@ -306,6 +306,7 @@ OC.L10N.register(
"Storage connection error. %s" : "Depolama bağlantısı sorunu. %s",
"Storage is temporarily not available" : "Depolama geçici olarak kullanılamıyor",
"Storage connection timeout. %s" : "Depolama bağlantısı zaman aşımı. %s",
+ "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "Bu denetimi çalıştırabilmek için site sunucunuzun kendisine bağlanabildiğinden emin olmanız gerekir. Bu nedenle, `trusted_domains` ya da `overwrite.cli.url` değerlerinden en az birini çözümleyebilmeli ve bunlara bağlanabilmelidir. Bu sorun, sunucu tarafındaki bir DNS uyumsuzluğunun veya giden güvenlik duvarı kuralının sonucu olabilir.",
"Transcribe audio" : "Sesten yazıya dönüştür.",
"Transcribe the things said in an audio" : "Bir sestekileri yazıya dönüştür",
"Audio input" : "Ses girişi",
diff --git a/lib/l10n/tr.json b/lib/l10n/tr.json
index ab8f59356ba..7e94faab690 100644
--- a/lib/l10n/tr.json
+++ b/lib/l10n/tr.json
@@ -304,6 +304,7 @@
"Storage connection error. %s" : "Depolama bağlantısı sorunu. %s",
"Storage is temporarily not available" : "Depolama geçici olarak kullanılamıyor",
"Storage connection timeout. %s" : "Depolama bağlantısı zaman aşımı. %s",
+ "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "Bu denetimi çalıştırabilmek için site sunucunuzun kendisine bağlanabildiğinden emin olmanız gerekir. Bu nedenle, `trusted_domains` ya da `overwrite.cli.url` değerlerinden en az birini çözümleyebilmeli ve bunlara bağlanabilmelidir. Bu sorun, sunucu tarafındaki bir DNS uyumsuzluğunun veya giden güvenlik duvarı kuralının sonucu olabilir.",
"Transcribe audio" : "Sesten yazıya dönüştür.",
"Transcribe the things said in an audio" : "Bir sestekileri yazıya dönüştür",
"Audio input" : "Ses girişi",
diff --git a/lib/l10n/zh_HK.js b/lib/l10n/zh_HK.js
index 64e06b38449..d28e463f425 100644
--- a/lib/l10n/zh_HK.js
+++ b/lib/l10n/zh_HK.js
@@ -300,6 +300,7 @@ OC.L10N.register(
"Storage connection error. %s" : "儲存空間連線錯誤。%s",
"Storage is temporarily not available" : "儲存空間暫時無法使用",
"Storage connection timeout. %s" : "儲存空間連線逾時。%s",
+ "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "若要允許執行此檢查,您必須確保您的網路伺服器可以連線到其自身。因此,其必須可以解析並連線到 `trusted_domains` 或 `overwrite.cli.url` 至少其中一個。此失敗可能是因為伺服器端 DNS 不符或連出防火牆規則造成的。",
"Transcribe audio" : "抄錄音頻為文字",
"Transcribe the things said in an audio" : "轉錄音訊中所說的話",
"Audio input" : "音頻輸入",
diff --git a/lib/l10n/zh_HK.json b/lib/l10n/zh_HK.json
index 1b5a28362b4..902115f2a78 100644
--- a/lib/l10n/zh_HK.json
+++ b/lib/l10n/zh_HK.json
@@ -298,6 +298,7 @@
"Storage connection error. %s" : "儲存空間連線錯誤。%s",
"Storage is temporarily not available" : "儲存空間暫時無法使用",
"Storage connection timeout. %s" : "儲存空間連線逾時。%s",
+ "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "若要允許執行此檢查,您必須確保您的網路伺服器可以連線到其自身。因此,其必須可以解析並連線到 `trusted_domains` 或 `overwrite.cli.url` 至少其中一個。此失敗可能是因為伺服器端 DNS 不符或連出防火牆規則造成的。",
"Transcribe audio" : "抄錄音頻為文字",
"Transcribe the things said in an audio" : "轉錄音訊中所說的話",
"Audio input" : "音頻輸入",
diff --git a/lib/l10n/zh_TW.js b/lib/l10n/zh_TW.js
index 7113638f6d8..4c9d8239118 100644
--- a/lib/l10n/zh_TW.js
+++ b/lib/l10n/zh_TW.js
@@ -306,6 +306,7 @@ OC.L10N.register(
"Storage connection error. %s" : "儲存空間連線錯誤。%s",
"Storage is temporarily not available" : "儲存空間暫時無法使用",
"Storage connection timeout. %s" : "儲存空間連線逾時。%s",
+ "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "若要允許執行此檢查,您必須確保您的網路伺服器可以連線到其自身。因此,其必須可以解析並連線到 `trusted_domains` 或 `overwrite.cli.url` 至少其中一個。此失敗可能是因為伺服器端 DNS 不符或連出防火牆規則造成的。",
"Transcribe audio" : "轉錄音訊",
"Transcribe the things said in an audio" : "轉錄音訊中所說的話",
"Audio input" : "音訊輸入",
diff --git a/lib/l10n/zh_TW.json b/lib/l10n/zh_TW.json
index ee22098e7a8..617b52e2c98 100644
--- a/lib/l10n/zh_TW.json
+++ b/lib/l10n/zh_TW.json
@@ -304,6 +304,7 @@
"Storage connection error. %s" : "儲存空間連線錯誤。%s",
"Storage is temporarily not available" : "儲存空間暫時無法使用",
"Storage connection timeout. %s" : "儲存空間連線逾時。%s",
+ "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "若要允許執行此檢查,您必須確保您的網路伺服器可以連線到其自身。因此,其必須可以解析並連線到 `trusted_domains` 或 `overwrite.cli.url` 至少其中一個。此失敗可能是因為伺服器端 DNS 不符或連出防火牆規則造成的。",
"Transcribe audio" : "轉錄音訊",
"Transcribe the things said in an audio" : "轉錄音訊中所說的話",
"Audio input" : "音訊輸入",
diff --git a/lib/private/App/AppStore/Fetcher/AppFetcher.php b/lib/private/App/AppStore/Fetcher/AppFetcher.php
index 4ef0b1eb51b..e7ab2f9c377 100644
--- a/lib/private/App/AppStore/Fetcher/AppFetcher.php
+++ b/lib/private/App/AppStore/Fetcher/AppFetcher.php
@@ -152,17 +152,8 @@ class AppFetcher extends Fetcher {
public function get($allowUnstable = false): array {
$allowPreReleases = $allowUnstable || $this->getChannel() === 'beta' || $this->getChannel() === 'daily' || $this->getChannel() === 'git';
- $appStoreEnabled = $this->config->getSystemValueBool('appstoreenabled', true);
- $internetAvailable = $this->config->getSystemValueBool('has_internet_connection', true);
-
- if (!$appStoreEnabled || !$internetAvailable) {
- $this->logger->info('AppStore is disabled or this instance has no Internet connection', ['app' => 'appstoreFetcher']);
- return [];
- }
-
$apps = parent::get($allowPreReleases);
if (empty($apps)) {
- $this->logger->warning('Could not get apps from the appstore', ['app' => 'appstoreFetcher']);
return [];
}
$allowList = $this->config->getSystemValue('appsallowlist');
diff --git a/lib/private/App/AppStore/Fetcher/Fetcher.php b/lib/private/App/AppStore/Fetcher/Fetcher.php
index bc85be662df..edb96b55f0a 100644
--- a/lib/private/App/AppStore/Fetcher/Fetcher.php
+++ b/lib/private/App/AppStore/Fetcher/Fetcher.php
@@ -121,6 +121,7 @@ abstract class Fetcher {
$isDefaultAppStore = $this->config->getSystemValueString('appstoreurl', self::APP_STORE_URL) === self::APP_STORE_URL;
if (!$appstoreenabled || (!$internetavailable && $isDefaultAppStore)) {
+ $this->logger->info('AppStore is disabled or this instance has no Internet connection to access the default app store', ['app' => 'appstoreFetcher']);
return [];
}
diff --git a/lib/private/Config.php b/lib/private/Config.php
index 6823ab7027f..08f9b028856 100644
--- a/lib/private/Config.php
+++ b/lib/private/Config.php
@@ -49,7 +49,7 @@ class Config {
* @return array an array of key names
*/
public function getKeys() {
- return array_keys($this->cache);
+ return array_merge(array_keys($this->cache), array_keys($this->envCache));
}
/**
@@ -64,9 +64,8 @@ class Config {
* @return mixed the value or $default
*/
public function getValue($key, $default = null) {
- $envKey = self::ENV_PREFIX . $key;
- if (isset($this->envCache[$envKey])) {
- return $this->envCache[$envKey];
+ if (isset($this->envCache[$key])) {
+ return $this->envCache[$key];
}
if (isset($this->cache[$key])) {
@@ -226,7 +225,16 @@ class Config {
}
}
- $this->envCache = getenv();
+ // grab any "NC_" environment variables
+ $envRaw = getenv();
+ // only save environment variables prefixed with "NC_" in the cache
+ $envPrefixLen = strlen(self::ENV_PREFIX);
+ foreach ($envRaw as $rawEnvKey => $rawEnvValue) {
+ if (str_starts_with($rawEnvKey, self::ENV_PREFIX)) {
+ $realKey = substr($rawEnvKey, $envPrefixLen);
+ $this->envCache[$realKey] = $rawEnvValue;
+ }
+ }
}
/**
diff --git a/lib/private/Files/Cache/Scanner.php b/lib/private/Files/Cache/Scanner.php
index c85104ac4b9..6e1c86eed47 100644
--- a/lib/private/Files/Cache/Scanner.php
+++ b/lib/private/Files/Cache/Scanner.php
@@ -15,6 +15,7 @@ use OC\SystemConfig;
use OCP\Files\Cache\IScanner;
use OCP\Files\ForbiddenException;
use OCP\Files\NotFoundException;
+use OCP\Files\Storage\ILockingStorage;
use OCP\Files\Storage\IReliableEtagStorage;
use OCP\IDBConnection;
use OCP\Lock\ILockingProvider;
@@ -125,7 +126,7 @@ class Scanner extends BasicEmitter implements IScanner {
if (!self::isPartialFile($file)) {
// acquire a lock
if ($lock) {
- if ($this->storage->instanceOfStorage('\OCP\Files\Storage\ILockingStorage')) {
+ if ($this->storage->instanceOfStorage(ILockingStorage::class)) {
$this->storage->acquireLock($file, ILockingProvider::LOCK_SHARED, $this->lockingProvider);
}
}
@@ -134,7 +135,7 @@ class Scanner extends BasicEmitter implements IScanner {
$data = $data ?? $this->getData($file);
} catch (ForbiddenException $e) {
if ($lock) {
- if ($this->storage->instanceOfStorage('\OCP\Files\Storage\ILockingStorage')) {
+ if ($this->storage->instanceOfStorage(ILockingStorage::class)) {
$this->storage->releaseLock($file, ILockingProvider::LOCK_SHARED, $this->lockingProvider);
}
}
@@ -233,7 +234,7 @@ class Scanner extends BasicEmitter implements IScanner {
}
} catch (\Exception $e) {
if ($lock) {
- if ($this->storage->instanceOfStorage('\OCP\Files\Storage\ILockingStorage')) {
+ if ($this->storage->instanceOfStorage(ILockingStorage::class)) {
$this->storage->releaseLock($file, ILockingProvider::LOCK_SHARED, $this->lockingProvider);
}
}
@@ -242,7 +243,7 @@ class Scanner extends BasicEmitter implements IScanner {
// release the acquired lock
if ($lock) {
- if ($this->storage->instanceOfStorage('\OCP\Files\Storage\ILockingStorage')) {
+ if ($this->storage->instanceOfStorage(ILockingStorage::class)) {
$this->storage->releaseLock($file, ILockingProvider::LOCK_SHARED, $this->lockingProvider);
}
}
@@ -319,7 +320,7 @@ class Scanner extends BasicEmitter implements IScanner {
$reuse = ($recursive === self::SCAN_SHALLOW) ? self::REUSE_ETAG | self::REUSE_SIZE : self::REUSE_ETAG;
}
if ($lock) {
- if ($this->storage->instanceOfStorage('\OCP\Files\Storage\ILockingStorage')) {
+ if ($this->storage->instanceOfStorage(ILockingStorage::class)) {
$this->storage->acquireLock('scanner::' . $path, ILockingProvider::LOCK_EXCLUSIVE, $this->lockingProvider);
$this->storage->acquireLock($path, ILockingProvider::LOCK_SHARED, $this->lockingProvider);
}
@@ -337,7 +338,7 @@ class Scanner extends BasicEmitter implements IScanner {
}
} finally {
if ($lock) {
- if ($this->storage->instanceOfStorage('\OCP\Files\Storage\ILockingStorage')) {
+ if ($this->storage->instanceOfStorage(ILockingStorage::class)) {
$this->storage->releaseLock($path, ILockingProvider::LOCK_SHARED, $this->lockingProvider);
$this->storage->releaseLock('scanner::' . $path, ILockingProvider::LOCK_EXCLUSIVE, $this->lockingProvider);
}
diff --git a/lib/private/Files/Node/Folder.php b/lib/private/Files/Node/Folder.php
index ca256b09d33..d8344f3d5bd 100644
--- a/lib/private/Files/Node/Folder.php
+++ b/lib/private/Files/Node/Folder.php
@@ -253,7 +253,7 @@ class Folder extends Node implements \OCP\Files\Folder {
$owner = null;
$ownerId = $storage->getOwner($cacheEntry['internalPath']);
- if (!empty($ownerId)) {
+ if ($ownerId !== false) {
// Cache the user manager (for performance)
if ($this->userManager === null) {
$this->userManager = \OCP\Server::get(IUserManager::class);
diff --git a/lib/private/Files/Node/Root.php b/lib/private/Files/Node/Root.php
index 416adc7f374..dbe03a4cfbf 100644
--- a/lib/private/Files/Node/Root.php
+++ b/lib/private/Files/Node/Root.php
@@ -28,6 +28,7 @@ use OCP\ICache;
use OCP\ICacheFactory;
use OCP\IUser;
use OCP\IUserManager;
+use OCP\Server;
use Psr\Log\LoggerInterface;
/**
@@ -477,9 +478,23 @@ class Root extends Folder implements IRootFolder {
$pathRelativeToMount = substr($internalPath, strlen($rootInternalPath));
$pathRelativeToMount = ltrim($pathRelativeToMount, '/');
$absolutePath = rtrim($mount->getMountPoint() . $pathRelativeToMount, '/');
+ $storage = $mount->getStorage();
+ if ($storage === null) {
+ return null;
+ }
+ $ownerId = $storage->getOwner($pathRelativeToMount);
+ if ($ownerId !== false) {
+ $owner = Server::get(IUserManager::class)->get($ownerId);
+ } else {
+ $owner = null;
+ }
return $this->createNode($absolutePath, new FileInfo(
- $absolutePath, $mount->getStorage(), $cacheEntry->getPath(), $cacheEntry, $mount,
- \OC::$server->getUserManager()->get($mount->getStorage()->getOwner($pathRelativeToMount))
+ $absolutePath,
+ $storage,
+ $cacheEntry->getPath(),
+ $cacheEntry,
+ $mount,
+ $owner,
));
}, $mountsContainingFile);
diff --git a/lib/private/Files/ObjectStore/HomeObjectStoreStorage.php b/lib/private/Files/ObjectStore/HomeObjectStoreStorage.php
index b543d223f4c..feca1f6b4f5 100644
--- a/lib/private/Files/ObjectStore/HomeObjectStoreStorage.php
+++ b/lib/private/Files/ObjectStore/HomeObjectStoreStorage.php
@@ -32,13 +32,7 @@ class HomeObjectStoreStorage extends ObjectStoreStorage implements IHomeStorage
return 'object::user:' . $this->user->getUID();
}
- /**
- * get the owner of a path
- *
- * @param string $path The path to get the owner
- * @return string uid
- */
- public function getOwner($path): string {
+ public function getOwner($path): string|false {
return $this->user->getUID();
}
diff --git a/lib/private/Files/ObjectStore/ObjectStoreStorage.php b/lib/private/Files/ObjectStore/ObjectStoreStorage.php
index 18a75e61b1c..1b55b4b3b44 100644
--- a/lib/private/Files/ObjectStore/ObjectStoreStorage.php
+++ b/lib/private/Files/ObjectStore/ObjectStoreStorage.php
@@ -129,10 +129,6 @@ class ObjectStoreStorage extends \OC\Files\Storage\Common implements IChunkedFil
/**
* Object Stores use a NoopScanner because metadata is directly stored in
* the file cache and cannot really scan the filesystem. The storage passed in is not used anywhere.
- *
- * @param string $path
- * @param \OC\Files\Storage\Storage (optional) the storage to pass to the scanner
- * @return \OC\Files\ObjectStore\ObjectStoreScanner
*/
public function getScanner($path = '', $storage = null) {
if (!$storage) {
@@ -141,6 +137,7 @@ class ObjectStoreStorage extends \OC\Files\Storage\Common implements IChunkedFil
if (!isset($this->scanner)) {
$this->scanner = new ObjectStoreScanner($storage);
}
+ /** @var \OC\Files\ObjectStore\ObjectStoreScanner */
return $this->scanner;
}
diff --git a/lib/private/Files/Storage/Common.php b/lib/private/Files/Storage/Common.php
index cefba66683b..b6f14321f61 100644
--- a/lib/private/Files/Storage/Common.php
+++ b/lib/private/Files/Storage/Common.php
@@ -44,14 +44,14 @@ use Psr\Log\LoggerInterface;
abstract class Common implements Storage, ILockingStorage, IWriteStreamStorage {
use LocalTempFileTrait;
- protected $cache;
- protected $scanner;
- protected $watcher;
- protected $propagator;
+ protected ?Cache $cache = null;
+ protected ?Scanner $scanner = null;
+ protected ?Watcher $watcher = null;
+ protected ?Propagator $propagator = null;
protected $storageCache;
- protected $updater;
+ protected ?Updater $updater = null;
- protected $mountOptions = [];
+ protected array $mountOptions = [];
protected $owner = null;
private ?bool $shouldLogLocks = null;
@@ -232,10 +232,6 @@ abstract class Common implements Storage, ILockingStorage, IWriteStreamStorage {
return hash_final($ctx, $raw);
}
- public function search($query) {
- return $this->searchInDir($query);
- }
-
public function getLocalFile($path) {
return $this->getCachedFile($path);
}
@@ -310,13 +306,19 @@ abstract class Common implements Storage, ILockingStorage, IWriteStreamStorage {
return $dependencies;
}
+ /**
+ * @return Cache
+ */
public function getCache($path = '', $storage = null) {
if (!$storage) {
$storage = $this;
}
+ /** @psalm-suppress NoInterfaceProperties The isset check is safe */
if (!isset($storage->cache)) {
$storage->cache = new Cache($storage, $this->getCacheDependencies());
}
+ /** @psalm-suppress NullableReturnStatement False-positive, as the if above avoids this being null */
+ /** @psalm-suppress NoInterfaceProperties Legacy */
return $storage->cache;
}
@@ -324,6 +326,9 @@ abstract class Common implements Storage, ILockingStorage, IWriteStreamStorage {
if (!$storage) {
$storage = $this;
}
+ if (!$storage->instanceOfStorage(self::class)) {
+ throw new \InvalidArgumentException('Storage is not of the correct class');
+ }
if (!isset($storage->scanner)) {
$storage->scanner = new Scanner($storage);
}
@@ -342,16 +347,14 @@ abstract class Common implements Storage, ILockingStorage, IWriteStreamStorage {
return $this->watcher;
}
- /**
- * get a propagator instance for the cache
- *
- * @param \OC\Files\Storage\Storage (optional) the storage to pass to the watcher
- * @return \OC\Files\Cache\Propagator
- */
public function getPropagator($storage = null) {
if (!$storage) {
$storage = $this;
}
+ if (!$storage->instanceOfStorage(self::class)) {
+ throw new \InvalidArgumentException('Storage is not of the correct class');
+ }
+ /** @var self $storage */
if (!isset($storage->propagator)) {
$config = \OC::$server->getSystemConfig();
$storage->propagator = new Propagator($storage, \OC::$server->getDatabaseConnection(), ['appdata_' . $config->getValue('instanceid')]);
@@ -359,10 +362,19 @@ abstract class Common implements Storage, ILockingStorage, IWriteStreamStorage {
return $storage->propagator;
}
+ /**
+ * get a propagator instance for the cache
+ *
+ * @param \OC\Files\Storage\Storage $storage (optional) the storage to pass to the watcher
+ * @return Updater
+ */
public function getUpdater($storage = null) {
if (!$storage) {
$storage = $this;
}
+ if (!$storage->instanceOfStorage(self::class)) {
+ throw new \InvalidArgumentException('Storage is not of the correct class');
+ }
if (!isset($storage->updater)) {
$storage->updater = new Updater($storage);
}
@@ -373,13 +385,7 @@ abstract class Common implements Storage, ILockingStorage, IWriteStreamStorage {
return $this->getCache($storage)->getStorageCache();
}
- /**
- * get the owner of a path
- *
- * @param string $path The path to get the owner
- * @return string|false uid or false
- */
- public function getOwner($path) {
+ public function getOwner($path): string|false {
if ($this->owner === null) {
$this->owner = \OC_User::getUser();
}
@@ -638,9 +644,6 @@ abstract class Common implements Storage, ILockingStorage, IWriteStreamStorage {
return $result;
}
- /**
- * @inheritdoc
- */
public function getMetaData($path) {
if (Filesystem::isFileBlacklisted($path)) {
throw new ForbiddenException('Invalid path: ' . $path, false);
@@ -671,12 +674,6 @@ abstract class Common implements Storage, ILockingStorage, IWriteStreamStorage {
return $data;
}
- /**
- * @param string $path
- * @param int $type \OCP\Lock\ILockingProvider::LOCK_SHARED or \OCP\Lock\ILockingProvider::LOCK_EXCLUSIVE
- * @param \OCP\Lock\ILockingProvider $provider
- * @throws \OCP\Lock\LockedException
- */
public function acquireLock($path, $type, ILockingProvider $provider) {
$logger = $this->getLockLogger();
if ($logger) {
@@ -704,12 +701,6 @@ abstract class Common implements Storage, ILockingStorage, IWriteStreamStorage {
}
}
- /**
- * @param string $path
- * @param int $type \OCP\Lock\ILockingProvider::LOCK_SHARED or \OCP\Lock\ILockingProvider::LOCK_EXCLUSIVE
- * @param \OCP\Lock\ILockingProvider $provider
- * @throws \OCP\Lock\LockedException
- */
public function releaseLock($path, $type, ILockingProvider $provider) {
$logger = $this->getLockLogger();
if ($logger) {
@@ -737,12 +728,6 @@ abstract class Common implements Storage, ILockingStorage, IWriteStreamStorage {
}
}
- /**
- * @param string $path
- * @param int $type \OCP\Lock\ILockingProvider::LOCK_SHARED or \OCP\Lock\ILockingProvider::LOCK_EXCLUSIVE
- * @param \OCP\Lock\ILockingProvider $provider
- * @throws \OCP\Lock\LockedException
- */
public function changeLock($path, $type, ILockingProvider $provider) {
$logger = $this->getLockLogger();
if ($logger) {
diff --git a/lib/private/Files/Storage/Home.php b/lib/private/Files/Storage/Home.php
index a8d1f82b987..fd1d287629f 100644
--- a/lib/private/Files/Storage/Home.php
+++ b/lib/private/Files/Storage/Home.php
@@ -52,15 +52,10 @@ class Home extends Local implements \OCP\Files\IHomeStorage {
if (!isset($this->cache)) {
$this->cache = new \OC\Files\Cache\HomeCache($storage, $this->getCacheDependencies());
}
+ /** @var \OC\Files\Cache\HomeCache */
return $this->cache;
}
- /**
- * get a propagator instance for the cache
- *
- * @param \OC\Files\Storage\Storage (optional) the storage to pass to the watcher
- * @return \OC\Files\Cache\Propagator
- */
public function getPropagator($storage = null) {
if (!$storage) {
$storage = $this;
@@ -68,6 +63,7 @@ class Home extends Local implements \OCP\Files\IHomeStorage {
if (!isset($this->propagator)) {
$this->propagator = new HomePropagator($storage, \OC::$server->getDatabaseConnection());
}
+ /** @var \OC\Files\Cache\Propagator */
return $this->propagator;
}
@@ -81,13 +77,7 @@ class Home extends Local implements \OCP\Files\IHomeStorage {
return $this->user;
}
- /**
- * get the owner of a path
- *
- * @param string $path The path to get the owner
- * @return string uid or false
- */
- public function getOwner($path) {
+ public function getOwner($path): string|false {
return $this->user->getUID();
}
}
diff --git a/lib/private/Files/Storage/Local.php b/lib/private/Files/Storage/Local.php
index 811a000ad6f..5b1dcb623ba 100644
--- a/lib/private/Files/Storage/Local.php
+++ b/lib/private/Files/Storage/Local.php
@@ -164,9 +164,6 @@ class Local extends \OC\Files\Storage\Common {
return $statResult;
}
- /**
- * @inheritdoc
- */
public function getMetaData($path) {
try {
$stat = $this->stat($path);
@@ -400,7 +397,7 @@ class Local extends \OC\Files\Storage\Common {
return $result;
}
- public function hash($type, $path, $raw = false) {
+ public function hash($type, $path, $raw = false): string|false {
return hash_file($type, $this->getSourcePath($path), $raw);
}
diff --git a/lib/private/Files/Storage/Storage.php b/lib/private/Files/Storage/Storage.php
index 44b1a52cfc0..d6d1d26c35a 100644
--- a/lib/private/Files/Storage/Storage.php
+++ b/lib/private/Files/Storage/Storage.php
@@ -5,65 +5,50 @@
* SPDX-FileCopyrightText: 2016 ownCloud, Inc.
* SPDX-License-Identifier: AGPL-3.0-only
*/
+
namespace OC\Files\Storage;
-use OCP\Lock\ILockingProvider;
+use OC\Files\Cache\Cache;
+use OC\Files\Cache\Propagator;
+use OC\Files\Cache\Scanner;
+use OC\Files\Cache\Updater;
+use OC\Files\Cache\Watcher;
+use OCP\Files\Storage\ILockingStorage;
+use OCP\Files\Storage\IStorage;
/**
* Provide a common interface to all different storage options
*
* All paths passed to the storage are relative to the storage and should NOT have a leading slash.
*/
-interface Storage extends \OCP\Files\Storage {
+interface Storage extends IStorage, ILockingStorage {
/**
- * get a cache instance for the storage
- *
- * @param string $path
- * @param \OC\Files\Storage\Storage|null (optional) the storage to pass to the cache
- * @return \OC\Files\Cache\Cache
+ * @inheritDoc
+ * @return Cache
*/
public function getCache($path = '', $storage = null);
/**
- * get a scanner instance for the storage
- *
- * @param string $path
- * @param \OC\Files\Storage\Storage (optional) the storage to pass to the scanner
- * @return \OC\Files\Cache\Scanner
+ * @inheritDoc
+ * @return Scanner
*/
public function getScanner($path = '', $storage = null);
-
/**
- * get the user id of the owner of a file or folder
- *
- * @param string $path
- * @return string
- */
- public function getOwner($path);
-
- /**
- * get a watcher instance for the cache
- *
- * @param string $path
- * @param \OC\Files\Storage\Storage (optional) the storage to pass to the watcher
- * @return \OC\Files\Cache\Watcher
+ * @inheritDoc
+ * @return Watcher
*/
public function getWatcher($path = '', $storage = null);
/**
- * get a propagator instance for the cache
- *
- * @param \OC\Files\Storage\Storage (optional) the storage to pass to the watcher
- * @return \OC\Files\Cache\Propagator
+ * @inheritDoc
+ * @return Propagator
*/
public function getPropagator($storage = null);
/**
- * get a updater instance for the cache
- *
- * @param \OC\Files\Storage\Storage (optional) the storage to pass to the watcher
- * @return \OC\Files\Cache\Updater
+ * @inheritDoc
+ * @return Updater
*/
public function getUpdater($storage = null);
@@ -79,30 +64,6 @@ interface Storage extends \OCP\Files\Storage {
public function getMetaData($path);
/**
- * @param string $path The path of the file to acquire the lock for
- * @param int $type \OCP\Lock\ILockingProvider::LOCK_SHARED or \OCP\Lock\ILockingProvider::LOCK_EXCLUSIVE
- * @param \OCP\Lock\ILockingProvider $provider
- * @throws \OCP\Lock\LockedException
- */
- public function acquireLock($path, $type, ILockingProvider $provider);
-
- /**
- * @param string $path The path of the file to release the lock for
- * @param int $type \OCP\Lock\ILockingProvider::LOCK_SHARED or \OCP\Lock\ILockingProvider::LOCK_EXCLUSIVE
- * @param \OCP\Lock\ILockingProvider $provider
- * @throws \OCP\Lock\LockedException
- */
- public function releaseLock($path, $type, ILockingProvider $provider);
-
- /**
- * @param string $path The path of the file to change the lock for
- * @param int $type \OCP\Lock\ILockingProvider::LOCK_SHARED or \OCP\Lock\ILockingProvider::LOCK_EXCLUSIVE
- * @param \OCP\Lock\ILockingProvider $provider
- * @throws \OCP\Lock\LockedException
- */
- public function changeLock($path, $type, ILockingProvider $provider);
-
- /**
* Get the contents of a directory with metadata
*
* @param string $directory
diff --git a/lib/private/Files/Storage/StorageFactory.php b/lib/private/Files/Storage/StorageFactory.php
index 612592e2d3a..590425f5b64 100644
--- a/lib/private/Files/Storage/StorageFactory.php
+++ b/lib/private/Files/Storage/StorageFactory.php
@@ -8,6 +8,7 @@
namespace OC\Files\Storage;
use OCP\Files\Mount\IMountPoint;
+use OCP\Files\Storage\IStorage;
use OCP\Files\Storage\IStorageFactory;
class StorageFactory implements IStorageFactory {
@@ -56,19 +57,17 @@ class StorageFactory implements IStorageFactory {
/**
* Create an instance of a storage and apply the registered storage wrappers
*
- * @param \OCP\Files\Mount\IMountPoint $mountPoint
* @param string $class
* @param array $arguments
- * @return \OCP\Files\Storage
+ * @return IStorage
*/
public function getInstance(IMountPoint $mountPoint, $class, $arguments) {
return $this->wrap($mountPoint, new $class($arguments));
}
/**
- * @param \OCP\Files\Mount\IMountPoint $mountPoint
- * @param \OCP\Files\Storage $storage
- * @return \OCP\Files\Storage
+ * @param IStorage $storage
+ * @return IStorage
*/
public function wrap(IMountPoint $mountPoint, $storage) {
$wrappers = array_values($this->storageWrappers);
@@ -81,7 +80,7 @@ class StorageFactory implements IStorageFactory {
}, $wrappers);
foreach ($wrappers as $wrapper) {
$storage = $wrapper($mountPoint->getMountPoint(), $storage, $mountPoint);
- if (!($storage instanceof \OCP\Files\Storage)) {
+ if (!($storage instanceof IStorage)) {
throw new \Exception('Invalid result from storage wrapper');
}
}
diff --git a/lib/private/Files/Storage/Temporary.php b/lib/private/Files/Storage/Temporary.php
index 95ae84cb7d9..6c7ef4260c1 100644
--- a/lib/private/Files/Storage/Temporary.php
+++ b/lib/private/Files/Storage/Temporary.php
@@ -11,7 +11,7 @@ namespace OC\Files\Storage;
* local storage backend in temporary folder for testing purpose
*/
class Temporary extends Local {
- public function __construct($arguments = null) {
+ public function __construct($arguments = []) {
parent::__construct(['datadir' => \OC::$server->getTempManager()->getTemporaryFolder()]);
}
diff --git a/lib/private/Files/Storage/Wrapper/Availability.php b/lib/private/Files/Storage/Wrapper/Availability.php
index 149cbbaa33b..aaf0acdc74f 100644
--- a/lib/private/Files/Storage/Wrapper/Availability.php
+++ b/lib/private/Files/Storage/Wrapper/Availability.php
@@ -315,6 +315,7 @@ class Availability extends Wrapper {
return parent::hash($type, $path, $raw);
} catch (StorageNotAvailableException $e) {
$this->setUnavailable($e);
+ return false;
}
}
@@ -372,12 +373,12 @@ class Availability extends Wrapper {
}
}
- /** {@inheritdoc} */
- public function getOwner($path) {
+ public function getOwner($path): string|false {
try {
return parent::getOwner($path);
} catch (StorageNotAvailableException $e) {
$this->setUnavailable($e);
+ return false;
}
}
@@ -421,7 +422,6 @@ class Availability extends Wrapper {
}
}
- /** {@inheritdoc} */
public function getMetaData($path) {
$this->checkAvailability();
try {
diff --git a/lib/private/Files/Storage/Wrapper/Encoding.php b/lib/private/Files/Storage/Wrapper/Encoding.php
index 11f21eb828e..48c6c38c848 100644
--- a/lib/private/Files/Storage/Wrapper/Encoding.php
+++ b/lib/private/Files/Storage/Wrapper/Encoding.php
@@ -382,16 +382,6 @@ class Encoding extends Wrapper {
}
/**
- * search for occurrences of $query in file names
- *
- * @param string $query
- * @return array|bool
- */
- public function search($query) {
- return $this->storage->search($query);
- }
-
- /**
* see https://www.php.net/manual/en/function.touch.php
* If the backend does not support the operation, false should be returned
*
@@ -428,13 +418,6 @@ class Encoding extends Wrapper {
return $this->storage->hasUpdated($this->findPathToUse($path), $time);
}
- /**
- * get a cache instance for the storage
- *
- * @param string $path
- * @param \OC\Files\Storage\Storage (optional) the storage to pass to the cache
- * @return \OC\Files\Cache\Cache
- */
public function getCache($path = '', $storage = null) {
if (!$storage) {
$storage = $this;
@@ -442,13 +425,6 @@ class Encoding extends Wrapper {
return $this->storage->getCache($this->findPathToUse($path), $storage);
}
- /**
- * get a scanner instance for the storage
- *
- * @param string $path
- * @param \OC\Files\Storage\Storage (optional) the storage to pass to the scanner
- * @return \OC\Files\Cache\Scanner
- */
public function getScanner($path = '', $storage = null) {
if (!$storage) {
$storage = $this;
diff --git a/lib/private/Files/Storage/Wrapper/Jail.php b/lib/private/Files/Storage/Wrapper/Jail.php
index 2e8306dc705..e61ded4bc38 100644
--- a/lib/private/Files/Storage/Wrapper/Jail.php
+++ b/lib/private/Files/Storage/Wrapper/Jail.php
@@ -322,16 +322,6 @@ class Jail extends Wrapper {
}
/**
- * search for occurrences of $query in file names
- *
- * @param string $query
- * @return array|bool
- */
- public function search($query) {
- return $this->getWrapperStorage()->search($query);
- }
-
- /**
* see https://www.php.net/manual/en/function.touch.php
* If the backend does not support the operation, false should be returned
*
@@ -368,35 +358,15 @@ class Jail extends Wrapper {
return $this->getWrapperStorage()->hasUpdated($this->getUnjailedPath($path), $time);
}
- /**
- * get a cache instance for the storage
- *
- * @param string $path
- * @param \OC\Files\Storage\Storage|null (optional) the storage to pass to the cache
- * @return \OC\Files\Cache\Cache
- */
public function getCache($path = '', $storage = null) {
$sourceCache = $this->getWrapperStorage()->getCache($this->getUnjailedPath($path));
return new CacheJail($sourceCache, $this->rootPath);
}
- /**
- * get the user id of the owner of a file or folder
- *
- * @param string $path
- * @return string
- */
- public function getOwner($path) {
+ public function getOwner($path): string|false {
return $this->getWrapperStorage()->getOwner($this->getUnjailedPath($path));
}
- /**
- * get a watcher instance for the cache
- *
- * @param string $path
- * @param \OC\Files\Storage\Storage (optional) the storage to pass to the watcher
- * @return \OC\Files\Cache\Watcher
- */
public function getWatcher($path = '', $storage = null) {
$sourceWatcher = $this->getWrapperStorage()->getWatcher($this->getUnjailedPath($path), $this->getWrapperStorage());
return new JailWatcher($sourceWatcher, $this->rootPath);
@@ -416,30 +386,14 @@ class Jail extends Wrapper {
return $this->getWrapperStorage()->getMetaData($this->getUnjailedPath($path));
}
- /**
- * @param string $path
- * @param int $type \OCP\Lock\ILockingProvider::LOCK_SHARED or \OCP\Lock\ILockingProvider::LOCK_EXCLUSIVE
- * @param \OCP\Lock\ILockingProvider $provider
- * @throws \OCP\Lock\LockedException
- */
public function acquireLock($path, $type, ILockingProvider $provider) {
$this->getWrapperStorage()->acquireLock($this->getUnjailedPath($path), $type, $provider);
}
- /**
- * @param string $path
- * @param int $type \OCP\Lock\ILockingProvider::LOCK_SHARED or \OCP\Lock\ILockingProvider::LOCK_EXCLUSIVE
- * @param \OCP\Lock\ILockingProvider $provider
- */
public function releaseLock($path, $type, ILockingProvider $provider) {
$this->getWrapperStorage()->releaseLock($this->getUnjailedPath($path), $type, $provider);
}
- /**
- * @param string $path
- * @param int $type \OCP\Lock\ILockingProvider::LOCK_SHARED or \OCP\Lock\ILockingProvider::LOCK_EXCLUSIVE
- * @param \OCP\Lock\ILockingProvider $provider
- */
public function changeLock($path, $type, ILockingProvider $provider) {
$this->getWrapperStorage()->changeLock($this->getUnjailedPath($path), $type, $provider);
}
diff --git a/lib/private/Files/Storage/Wrapper/PermissionsMask.php b/lib/private/Files/Storage/Wrapper/PermissionsMask.php
index c502de41a86..d6b745c0d31 100644
--- a/lib/private/Files/Storage/Wrapper/PermissionsMask.php
+++ b/lib/private/Files/Storage/Wrapper/PermissionsMask.php
@@ -101,13 +101,6 @@ class PermissionsMask extends Wrapper {
}
}
- /**
- * get a cache instance for the storage
- *
- * @param string $path
- * @param \OC\Files\Storage\Storage (optional) the storage to pass to the cache
- * @return \OC\Files\Cache\Cache
- */
public function getCache($path = '', $storage = null) {
if (!$storage) {
$storage = $this;
diff --git a/lib/private/Files/Storage/Wrapper/Wrapper.php b/lib/private/Files/Storage/Wrapper/Wrapper.php
index f8aa9d963dc..93dcacdfb42 100644
--- a/lib/private/Files/Storage/Wrapper/Wrapper.php
+++ b/lib/private/Files/Storage/Wrapper/Wrapper.php
@@ -317,16 +317,6 @@ class Wrapper implements \OC\Files\Storage\Storage, ILockingStorage, IWriteStrea
}
/**
- * search for occurrences of $query in file names
- *
- * @param string $query
- * @return array|bool
- */
- public function search($query) {
- return $this->getWrapperStorage()->search($query);
- }
-
- /**
* see https://www.php.net/manual/en/function.touch.php
* If the backend does not support the operation, false should be returned
*
@@ -363,13 +353,6 @@ class Wrapper implements \OC\Files\Storage\Storage, ILockingStorage, IWriteStrea
return $this->getWrapperStorage()->hasUpdated($path, $time);
}
- /**
- * get a cache instance for the storage
- *
- * @param string $path
- * @param \OC\Files\Storage\Storage|null (optional) the storage to pass to the cache
- * @return \OC\Files\Cache\Cache
- */
public function getCache($path = '', $storage = null) {
if (!$storage) {
$storage = $this;
@@ -377,13 +360,6 @@ class Wrapper implements \OC\Files\Storage\Storage, ILockingStorage, IWriteStrea
return $this->getWrapperStorage()->getCache($path, $storage);
}
- /**
- * get a scanner instance for the storage
- *
- * @param string $path
- * @param \OC\Files\Storage\Storage (optional) the storage to pass to the scanner
- * @return \OC\Files\Cache\Scanner
- */
public function getScanner($path = '', $storage = null) {
if (!$storage) {
$storage = $this;
@@ -391,24 +367,10 @@ class Wrapper implements \OC\Files\Storage\Storage, ILockingStorage, IWriteStrea
return $this->getWrapperStorage()->getScanner($path, $storage);
}
-
- /**
- * get the user id of the owner of a file or folder
- *
- * @param string $path
- * @return string
- */
- public function getOwner($path) {
+ public function getOwner($path): string|false {
return $this->getWrapperStorage()->getOwner($path);
}
- /**
- * get a watcher instance for the cache
- *
- * @param string $path
- * @param \OC\Files\Storage\Storage (optional) the storage to pass to the watcher
- * @return \OC\Files\Cache\Watcher
- */
public function getWatcher($path = '', $storage = null) {
if (!$storage) {
$storage = $this;
@@ -430,9 +392,6 @@ class Wrapper implements \OC\Files\Storage\Storage, ILockingStorage, IWriteStrea
return $this->getWrapperStorage()->getUpdater($storage);
}
- /**
- * @return \OC\Files\Cache\Storage
- */
public function getStorageCache() {
return $this->getWrapperStorage()->getStorageCache();
}
@@ -581,34 +540,18 @@ class Wrapper implements \OC\Files\Storage\Storage, ILockingStorage, IWriteStrea
return $this->getWrapperStorage()->getMetaData($path);
}
- /**
- * @param string $path
- * @param int $type \OCP\Lock\ILockingProvider::LOCK_SHARED or \OCP\Lock\ILockingProvider::LOCK_EXCLUSIVE
- * @param \OCP\Lock\ILockingProvider $provider
- * @throws \OCP\Lock\LockedException
- */
public function acquireLock($path, $type, ILockingProvider $provider) {
if ($this->getWrapperStorage()->instanceOfStorage('\OCP\Files\Storage\ILockingStorage')) {
$this->getWrapperStorage()->acquireLock($path, $type, $provider);
}
}
- /**
- * @param string $path
- * @param int $type \OCP\Lock\ILockingProvider::LOCK_SHARED or \OCP\Lock\ILockingProvider::LOCK_EXCLUSIVE
- * @param \OCP\Lock\ILockingProvider $provider
- */
public function releaseLock($path, $type, ILockingProvider $provider) {
if ($this->getWrapperStorage()->instanceOfStorage('\OCP\Files\Storage\ILockingStorage')) {
$this->getWrapperStorage()->releaseLock($path, $type, $provider);
}
}
- /**
- * @param string $path
- * @param int $type \OCP\Lock\ILockingProvider::LOCK_SHARED or \OCP\Lock\ILockingProvider::LOCK_EXCLUSIVE
- * @param \OCP\Lock\ILockingProvider $provider
- */
public function changeLock($path, $type, ILockingProvider $provider) {
if ($this->getWrapperStorage()->instanceOfStorage('\OCP\Files\Storage\ILockingStorage')) {
$this->getWrapperStorage()->changeLock($path, $type, $provider);
diff --git a/lib/private/Files/View.php b/lib/private/Files/View.php
index 336349c680b..80679a9481f 100644
--- a/lib/private/Files/View.php
+++ b/lib/private/Files/View.php
@@ -28,6 +28,7 @@ use OCP\Files\Mount\IMountPoint;
use OCP\Files\NotFoundException;
use OCP\Files\ReservedWordException;
use OCP\IUser;
+use OCP\IUserManager;
use OCP\Lock\ILockingProvider;
use OCP\Lock\LockedException;
use OCP\Server;
@@ -1364,7 +1365,7 @@ class View {
$ownerId = $storage->getOwner($internalPath);
$owner = null;
- if ($ownerId !== null && $ownerId !== false) {
+ if ($ownerId !== false) {
// ownerId might be null if files are accessed with an access token without file system access
$owner = $this->getUserObjectForOwner($ownerId);
}
@@ -1450,7 +1451,12 @@ class View {
if ($sharingDisabled) {
$content['permissions'] = $content['permissions'] & ~\OCP\Constants::PERMISSION_SHARE;
}
- $owner = $this->getUserObjectForOwner($storage->getOwner($content['path']));
+ $ownerId = $storage->getOwner($content['path']);
+ if ($ownerId !== false) {
+ $owner = $this->getUserObjectForOwner($ownerId);
+ } else {
+ $owner = null;
+ }
return new FileInfo($path . '/' . $content['name'], $storage, $content['path'], $content, $mount, $owner);
}, $contents);
$files = array_combine($fileNames, $fileInfos);
@@ -1527,7 +1533,12 @@ class View {
$rootEntry['permissions'] = $rootEntry['permissions'] & ~\OCP\Constants::PERMISSION_SHARE;
}
- $owner = $this->getUserObjectForOwner($subStorage->getOwner(''));
+ $ownerId = $subStorage->getOwner('');
+ if ($ownerId !== false) {
+ $owner = $this->getUserObjectForOwner($ownerId);
+ } else {
+ $owner = null;
+ }
$files[$rootEntry->getName()] = new FileInfo($path . '/' . $rootEntry['name'], $subStorage, '', $rootEntry, $mount, $owner);
}
}
@@ -1644,7 +1655,12 @@ class View {
$internalPath = $result['path'];
$path = $mountPoint . $result['path'];
$result['path'] = substr($mountPoint . $result['path'], $rootLength);
- $owner = $userManager->get($storage->getOwner($internalPath));
+ $ownerId = $storage->getOwner($internalPath);
+ if ($ownerId !== false) {
+ $owner = $userManager->get($ownerId);
+ } else {
+ $owner = null;
+ }
$files[] = new FileInfo($path, $storage, $internalPath, $result, $mount, $owner);
}
}
@@ -1663,7 +1679,12 @@ class View {
$internalPath = $result['path'];
$result['path'] = rtrim($relativeMountPoint . $result['path'], '/');
$path = rtrim($mountPoint . $internalPath, '/');
- $owner = $userManager->get($storage->getOwner($internalPath));
+ $ownerId = $storage->getOwner($internalPath);
+ if ($ownerId !== false) {
+ $owner = $userManager->get($ownerId);
+ } else {
+ $owner = null;
+ }
$files[] = new FileInfo($path, $storage, $internalPath, $result, $mount, $owner);
}
}
@@ -1676,11 +1697,9 @@ class View {
/**
* Get the owner for a file or folder
*
- * @param string $path
- * @return string the user id of the owner
* @throws NotFoundException
*/
- public function getOwner($path) {
+ public function getOwner(string $path): string {
$info = $this->getFileInfo($path);
if (!$info) {
throw new NotFoundException($path . ' not found while trying to get owner');
@@ -1813,7 +1832,12 @@ class View {
$mount = $this->getMount($path);
$storage = $mount->getStorage();
$internalPath = $mount->getInternalPath($this->getAbsolutePath($path));
- $owner = \OC::$server->getUserManager()->get($storage->getOwner($internalPath));
+ $ownerId = $storage->getOwner($internalPath);
+ if ($ownerId !== false) {
+ $owner = Server::get(IUserManager::class)->get($ownerId);
+ } else {
+ $owner = null;
+ }
return new FileInfo(
$this->getAbsolutePath($path),
$storage,
@@ -1848,7 +1872,7 @@ class View {
// Short cut for read-only validation
if ($readonly) {
- $validator = \OCP\Server::get(FilenameValidator::class);
+ $validator = Server::get(FilenameValidator::class);
if ($validator->isForbidden($fileName)) {
$l = \OCP\Util::getL10N('lib');
throw new InvalidPathException($l->t('Filename is a reserved word'));
diff --git a/lib/private/FilesMetadata/FilesMetadataManager.php b/lib/private/FilesMetadata/FilesMetadataManager.php
index 231fb2ec98f..5c1acb77ea7 100644
--- a/lib/private/FilesMetadata/FilesMetadataManager.php
+++ b/lib/private/FilesMetadata/FilesMetadataManager.php
@@ -104,7 +104,7 @@ class FilesMetadataManager implements IFilesMetadataManager {
return $this->refreshMetadata($node, self::PROCESS_BACKGROUND);
}
- $this->jobList->add(UpdateSingleMetadata::class, [$node->getOwner()->getUID(), $node->getId()]);
+ $this->jobList->add(UpdateSingleMetadata::class, [$node->getOwner()?->getUID(), $node->getId()]);
}
return $metadata;
diff --git a/lib/private/Lockdown/Filesystem/NullStorage.php b/lib/private/Lockdown/Filesystem/NullStorage.php
index 7175594a01d..00124877e9d 100644
--- a/lib/private/Lockdown/Filesystem/NullStorage.php
+++ b/lib/private/Lockdown/Filesystem/NullStorage.php
@@ -155,8 +155,8 @@ class NullStorage extends Common {
return true;
}
- public function getOwner($path) {
- return null;
+ public function getOwner($path): string|false {
+ return false;
}
public function getCache($path = '', $storage = null) {
diff --git a/lib/private/Mail/Mailer.php b/lib/private/Mail/Mailer.php
index 0a818b847aa..7497a8d9079 100644
--- a/lib/private/Mail/Mailer.php
+++ b/lib/private/Mail/Mailer.php
@@ -334,8 +334,10 @@ class Mailer implements IMailer {
break;
default:
$sendmail = \OCP\Server::get(IBinaryFinder::class)->findBinaryPath('sendmail');
- if ($sendmail === null) {
+ if ($sendmail === false) {
+ // fallback (though not sure what good it'll do)
$sendmail = '/usr/sbin/sendmail';
+ $this->logger->debug('sendmail binary search failed, using fallback ' . $sendmail, ['app' => 'core']);
}
$binaryPath = $sendmail;
break;
@@ -346,6 +348,7 @@ class Mailer implements IMailer {
default => ' -bs',
};
+ $this->logger->debug('Using sendmail binary: ' . $binaryPath, ['app' => 'core']);
return new SendmailTransport($binaryPath . $binaryParam, null, $this->logger);
}
}
diff --git a/lib/private/Repair.php b/lib/private/Repair.php
index 630ee249209..9d079aabd29 100644
--- a/lib/private/Repair.php
+++ b/lib/private/Repair.php
@@ -60,6 +60,9 @@ use OCP\AppFramework\QueryException;
use OCP\AppFramework\Utility\ITimeFactory;
use OCP\Collaboration\Resources\IManager;
use OCP\EventDispatcher\IEventDispatcher;
+use OCP\IAppConfig;
+use OCP\IConfig;
+use OCP\IDBConnection;
use OCP\Migration\IOutput;
use OCP\Migration\IRepairStep;
use OCP\Notification\IManager as INotificationManager;
@@ -201,7 +204,11 @@ class Repair implements IOutput {
public static function getExpensiveRepairSteps() {
return [
new OldGroupMembershipShares(\OC::$server->getDatabaseConnection(), \OC::$server->getGroupManager()),
- new RepairMimeTypes(\OC::$server->getConfig(), \OC::$server->getDatabaseConnection()),
+ new RepairMimeTypes(
+ \OCP\Server::get(IConfig::class),
+ \OCP\Server::get(IAppConfig::class),
+ \OCP\Server::get(IDBConnection::class)
+ ),
\OC::$server->get(ValidatePhoneNumber::class),
\OC::$server->get(DeleteSchedulingObjects::class),
];
diff --git a/lib/private/Repair/RepairMimeTypes.php b/lib/private/Repair/RepairMimeTypes.php
index 6932299dc4a..30ef11ab190 100644
--- a/lib/private/Repair/RepairMimeTypes.php
+++ b/lib/private/Repair/RepairMimeTypes.php
@@ -10,6 +10,7 @@ use OC\Migration\NullOutput;
use OCP\DB\Exception;
use OCP\DB\IResult;
use OCP\DB\QueryBuilder\IQueryBuilder;
+use OCP\IAppConfig;
use OCP\IConfig;
use OCP\IDBConnection;
use OCP\Migration\IOutput;
@@ -24,6 +25,7 @@ class RepairMimeTypes implements IRepairStep {
public function __construct(
protected IConfig $config,
+ protected IAppConfig $appConfig,
protected IDBConnection $connection
) {
}
@@ -91,29 +93,7 @@ class RepairMimeTypes implements IRepairStep {
/**
* @throws Exception
- */
- private function introduceExcalidrawType(): IResult|int|null {
- $updatedMimetypes = [
- 'excalidraw' => 'application/vnd.excalidraw+json',
- ];
-
- return $this->updateMimetypes($updatedMimetypes);
- }
-
- /**
- * @throws Exception
- */
- private function introduceAsciidocType(): IResult|int|null {
- $updatedMimetypes = [
- 'adoc' => 'text/asciidoc',
- 'asciidoc' => 'text/asciidoc',
- ];
-
- return $this->updateMimetypes($updatedMimetypes);
- }
-
- /**
- * @throws Exception
+ * @since 12.0.0.14
*/
private function introduceImageTypes(): IResult|int|null {
$updatedMimetypes = [
@@ -126,6 +106,7 @@ class RepairMimeTypes implements IRepairStep {
/**
* @throws Exception
+ * @since 12.0.0.13
*/
private function introduceWindowsProgramTypes(): IResult|int|null {
$updatedMimetypes = [
@@ -139,6 +120,7 @@ class RepairMimeTypes implements IRepairStep {
/**
* @throws Exception
+ * @since 13.0.0.0
*/
private function introduceLocationTypes(): IResult|int|null {
$updatedMimetypes = [
@@ -153,6 +135,7 @@ class RepairMimeTypes implements IRepairStep {
/**
* @throws Exception
+ * @since 13.0.0.3
*/
private function introduceInternetShortcutTypes(): IResult|int|null {
$updatedMimetypes = [
@@ -165,6 +148,7 @@ class RepairMimeTypes implements IRepairStep {
/**
* @throws Exception
+ * @since 13.0.0.6
*/
private function introduceStreamingTypes(): IResult|int|null {
$updatedMimetypes = [
@@ -178,6 +162,7 @@ class RepairMimeTypes implements IRepairStep {
/**
* @throws Exception
+ * @since 14.0.0.8
*/
private function introduceVisioTypes(): IResult|int|null {
$updatedMimetypes = [
@@ -194,6 +179,7 @@ class RepairMimeTypes implements IRepairStep {
/**
* @throws Exception
+ * @since 14.0.0.10
*/
private function introduceComicbookTypes(): IResult|int|null {
$updatedMimetypes = [
@@ -210,6 +196,7 @@ class RepairMimeTypes implements IRepairStep {
/**
* @throws Exception
+ * @since 20.0.0.5
*/
private function introduceOpenDocumentTemplates(): IResult|int|null {
$updatedMimetypes = [
@@ -224,6 +211,19 @@ class RepairMimeTypes implements IRepairStep {
/**
* @throws Exception
+ * @since 21.0.0.7
+ */
+ private function introduceOrgModeType(): IResult|int|null {
+ $updatedMimetypes = [
+ 'org' => 'text/org'
+ ];
+
+ return $this->updateMimetypes($updatedMimetypes);
+ }
+
+ /**
+ * @throws Exception
+ * @since 23.0.0.2
*/
private function introduceFlatOpenDocumentType(): IResult|int|null {
$updatedMimetypes = [
@@ -238,10 +238,12 @@ class RepairMimeTypes implements IRepairStep {
/**
* @throws Exception
+ * @since 25.0.0.2
*/
- private function introduceOrgModeType(): IResult|int|null {
+ private function introduceOnlyofficeFormType(): IResult|int|null {
$updatedMimetypes = [
- 'org' => 'text/org'
+ 'oform' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document.oform',
+ 'docxf' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document.docxf',
];
return $this->updateMimetypes($updatedMimetypes);
@@ -249,11 +251,12 @@ class RepairMimeTypes implements IRepairStep {
/**
* @throws Exception
+ * @since 26.0.0.1
*/
- private function introduceOnlyofficeFormType(): IResult|int|null {
+ private function introduceAsciidocType(): IResult|int|null {
$updatedMimetypes = [
- 'oform' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document.oform',
- 'docxf' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document.docxf',
+ 'adoc' => 'text/asciidoc',
+ 'asciidoc' => 'text/asciidoc',
];
return $this->updateMimetypes($updatedMimetypes);
@@ -261,6 +264,7 @@ class RepairMimeTypes implements IRepairStep {
/**
* @throws Exception
+ * @since 28.0.0.5
*/
private function introduceEnhancedMetafileFormatType(): IResult|int|null {
$updatedMimetypes = [
@@ -272,6 +276,7 @@ class RepairMimeTypes implements IRepairStep {
/**
* @throws Exception
+ * @since 29.0.0.2
*/
private function introduceEmlAndMsgFormatType(): IResult|int|null {
$updatedMimetypes = [
@@ -284,6 +289,7 @@ class RepairMimeTypes implements IRepairStep {
/**
* @throws Exception
+ * @since 29.0.0.6
*/
private function introduceAacAudioType(): IResult|int|null {
$updatedMimetypes = [
@@ -295,6 +301,7 @@ class RepairMimeTypes implements IRepairStep {
/**
* @throws Exception
+ * @since 29.0.10
*/
private function introduceReStructuredTextFormatType(): IResult|int|null {
$updatedMimetypes = [
@@ -306,6 +313,33 @@ class RepairMimeTypes implements IRepairStep {
/**
* @throws Exception
+ * @since 30.0.0
+ */
+ private function introduceExcalidrawType(): IResult|int|null {
+ $updatedMimetypes = [
+ 'excalidraw' => 'application/vnd.excalidraw+json',
+ ];
+
+ return $this->updateMimetypes($updatedMimetypes);
+ }
+
+
+ /**
+ * @throws Exception
+ * @since 31.0.0
+ */
+ private function introduceZstType(): IResult|int|null {
+ $updatedMimetypes = [
+ 'zst' => 'application/zstd',
+ ];
+
+ return $this->updateMimetypes($updatedMimetypes);
+ }
+
+ /**
+ * Check if there are any migrations available
+ *
+ * @throws Exception
*/
public function migrationsAvailable(): bool {
$this->dryRun = true;
@@ -314,11 +348,14 @@ class RepairMimeTypes implements IRepairStep {
return $this->changeCount > 0;
}
+ /**
+ * Get the current mimetype version
+ */
private function getMimeTypeVersion(): string {
$serverVersion = $this->config->getSystemValueString('version', '0.0.0');
// 29.0.0.10 is the last version with a mimetype migration before it was moved to a separate version number
if (version_compare($serverVersion, '29.0.0.10', '>')) {
- return $this->config->getAppValue('files', 'mimetype_version', '29.0.0.10');
+ return $this->appConfig->getValueString('files', 'mimetype_version', '29.0.0.10');
}
return $serverVersion;
@@ -335,6 +372,7 @@ class RepairMimeTypes implements IRepairStep {
// NOTE TO DEVELOPERS: when adding new mime types, please make sure to
// add a version comparison to avoid doing it every time
+ // PLEASE ALSO KEEP THE LIST SORTED BY VERSION NUMBER
if (version_compare($mimeTypeVersion, '12.0.0.14', '<') && $this->introduceImageTypes()) {
$out->info('Fixed image mime types');
@@ -404,8 +442,12 @@ class RepairMimeTypes implements IRepairStep {
$out->info('Fixed Excalidraw mime type');
}
+ if (version_compare($mimeTypeVersion, '31.0.0.0', '<') && $this->introduceZstType()) {
+ $out->info('Fixed zst mime type');
+ }
+
if (!$this->dryRun) {
- $this->config->setAppValue('files', 'mimetype_version', $serverVersion);
+ $this->appConfig->setValueString('files', 'mimetype_version', $serverVersion);
}
}
}
diff --git a/lib/private/Server.php b/lib/private/Server.php
index c514a4b93ff..7ecafdcd66c 100644
--- a/lib/private/Server.php
+++ b/lib/private/Server.php
@@ -11,7 +11,6 @@ use OC\Accounts\AccountManager;
use OC\App\AppManager;
use OC\App\AppStore\Bundles\BundleFetcher;
use OC\App\AppStore\Fetcher\AppFetcher;
-use OC\App\AppStore\Fetcher\CategoryFetcher;
use OC\AppFramework\Bootstrap\Coordinator;
use OC\AppFramework\Http\Request;
use OC\AppFramework\Http\RequestId;
@@ -112,7 +111,6 @@ use OC\Share20\ProviderFactory;
use OC\Share20\ShareHelper;
use OC\SpeechToText\SpeechToTextManager;
use OC\SystemTag\ManagerFactory as SystemTagManagerFactory;
-use OC\Tagging\TagMapper;
use OC\Talk\Broker;
use OC\Teams\TeamManager;
use OC\Template\JSCombiner;
@@ -273,20 +271,12 @@ class Server extends ServerContainer implements IServerContainer {
});
$this->registerAlias(\OCP\Calendar\IManager::class, \OC\Calendar\Manager::class);
- /** @deprecated 19.0.0 */
- $this->registerDeprecatedAlias('CalendarManager', \OC\Calendar\Manager::class);
$this->registerAlias(\OCP\Calendar\Resource\IManager::class, \OC\Calendar\Resource\Manager::class);
- /** @deprecated 19.0.0 */
- $this->registerDeprecatedAlias('CalendarResourceBackendManager', \OC\Calendar\Resource\Manager::class);
$this->registerAlias(\OCP\Calendar\Room\IManager::class, \OC\Calendar\Room\Manager::class);
- /** @deprecated 19.0.0 */
- $this->registerDeprecatedAlias('CalendarRoomBackendManager', \OC\Calendar\Room\Manager::class);
$this->registerAlias(\OCP\Contacts\IManager::class, \OC\ContactsManager::class);
- /** @deprecated 19.0.0 */
- $this->registerDeprecatedAlias('ContactsManager', \OCP\Contacts\IManager::class);
$this->registerAlias(\OCP\DirectEditing\IManager::class, \OC\DirectEditing\Manager::class);
$this->registerAlias(ITemplateManager::class, TemplateManager::class);
@@ -314,8 +304,6 @@ class Server extends ServerContainer implements IServerContainer {
$c->get(IMagickSupport::class)
);
});
- /** @deprecated 19.0.0 */
- $this->registerDeprecatedAlias('PreviewManager', IPreview::class);
$this->registerAlias(IMimeIconProvider::class, MimeIconProvider::class);
$this->registerService(\OC\Preview\Watcher::class, function (ContainerInterface $c) {
@@ -348,11 +336,7 @@ class Server extends ServerContainer implements IServerContainer {
new ArrayCache()
);
});
- /** @deprecated 19.0.0 */
- $this->registerDeprecatedAlias('EncryptionManager', \OCP\Encryption\IManager::class);
- /** @deprecated 21.0.0 */
- $this->registerDeprecatedAlias('EncryptionFileHelper', IFile::class);
$this->registerService(IFile::class, function (ContainerInterface $c) {
$util = new Encryption\Util(
new View(),
@@ -367,8 +351,6 @@ class Server extends ServerContainer implements IServerContainer {
);
});
- /** @deprecated 21.0.0 */
- $this->registerDeprecatedAlias('EncryptionKeyStorage', IStorage::class);
$this->registerService(IStorage::class, function (ContainerInterface $c) {
$view = new View();
$util = new Encryption\Util(
@@ -385,12 +367,8 @@ class Server extends ServerContainer implements IServerContainer {
$c->get(\OCP\IConfig::class)
);
});
- /** @deprecated 20.0.0 */
- $this->registerDeprecatedAlias('TagMapper', TagMapper::class);
$this->registerAlias(\OCP\ITagManager::class, TagManager::class);
- /** @deprecated 19.0.0 */
- $this->registerDeprecatedAlias('TagManager', \OCP\ITagManager::class);
$this->registerService('SystemTagManagerFactory', function (ContainerInterface $c) {
/** @var \OCP\IConfig $config */
@@ -441,19 +419,12 @@ class Server extends ServerContainer implements IServerContainer {
);
});
- /** @deprecated 19.0.0 */
- $this->registerDeprecatedAlias('SystemTagObjectMapper', ISystemTagObjectMapper::class);
-
$this->registerService(IRootFolder::class, function (ContainerInterface $c) {
return new LazyRoot(function () use ($c) {
return $c->get('RootFolder');
});
});
- /** @deprecated 19.0.0 */
- $this->registerDeprecatedAlias('LazyRootFolder', IRootFolder::class);
- /** @deprecated 19.0.0 */
- $this->registerDeprecatedAlias('UserManager', \OC\User\Manager::class);
$this->registerAlias(\OCP\IUserManager::class, \OC\User\Manager::class);
$this->registerService(DisplayNameCache::class, function (ContainerInterface $c) {
@@ -470,8 +441,6 @@ class Server extends ServerContainer implements IServerContainer {
);
return $groupManager;
});
- /** @deprecated 19.0.0 */
- $this->registerDeprecatedAlias('GroupManager', \OCP\IGroupManager::class);
$this->registerService(Store::class, function (ContainerInterface $c) {
$session = $c->get(ISession::class);
@@ -584,27 +553,17 @@ class Server extends ServerContainer implements IServerContainer {
return $userSession;
});
$this->registerAlias(\OCP\IUserSession::class, \OC\User\Session::class);
- /** @deprecated 19.0.0 */
- $this->registerDeprecatedAlias('UserSession', \OC\User\Session::class);
$this->registerAlias(\OCP\Authentication\TwoFactorAuth\IRegistry::class, \OC\Authentication\TwoFactorAuth\Registry::class);
$this->registerAlias(INavigationManager::class, \OC\NavigationManager::class);
- /** @deprecated 19.0.0 */
- $this->registerDeprecatedAlias('NavigationManager', INavigationManager::class);
- /** @deprecated 19.0.0 */
- $this->registerDeprecatedAlias('AllConfig', \OC\AllConfig::class);
$this->registerAlias(\OCP\IConfig::class, \OC\AllConfig::class);
$this->registerService(\OC\SystemConfig::class, function ($c) use ($config) {
return new \OC\SystemConfig($config);
});
- /** @deprecated 19.0.0 */
- $this->registerDeprecatedAlias('SystemConfig', \OC\SystemConfig::class);
- /** @deprecated 19.0.0 */
- $this->registerDeprecatedAlias('AppConfig', \OC\AppConfig::class);
$this->registerAlias(IAppConfig::class, \OC\AppConfig::class);
$this->registerService(IFactory::class, function (Server $c) {
@@ -617,23 +576,12 @@ class Server extends ServerContainer implements IServerContainer {
$c->get(IAppManager::class),
);
});
- /** @deprecated 19.0.0 */
- $this->registerDeprecatedAlias('L10NFactory', IFactory::class);
$this->registerAlias(IURLGenerator::class, URLGenerator::class);
- /** @deprecated 19.0.0 */
- $this->registerDeprecatedAlias('URLGenerator', IURLGenerator::class);
-
- /** @deprecated 19.0.0 */
- $this->registerDeprecatedAlias('AppFetcher', AppFetcher::class);
- /** @deprecated 19.0.0 */
- $this->registerDeprecatedAlias('CategoryFetcher', CategoryFetcher::class);
$this->registerService(ICache::class, function ($c) {
return new Cache\File();
});
- /** @deprecated 19.0.0 */
- $this->registerDeprecatedAlias('UserCache', ICache::class);
$this->registerService(Factory::class, function (Server $c) {
$profiler = $c->get(IProfiler::class);
@@ -686,8 +634,6 @@ class Server extends ServerContainer implements IServerContainer {
}
return $arrayCacheFactory;
});
- /** @deprecated 19.0.0 */
- $this->registerDeprecatedAlias('MemCacheFactory', Factory::class);
$this->registerAlias(ICacheFactory::class, Factory::class);
$this->registerService('RedisFactory', function (Server $c) {
@@ -705,8 +651,6 @@ class Server extends ServerContainer implements IServerContainer {
$l10n
);
});
- /** @deprecated 19.0.0 */
- $this->registerDeprecatedAlias('ActivityManager', \OCP\Activity\IManager::class);
$this->registerService(\OCP\Activity\IEventMerger::class, function (Server $c) {
return new \OC\Activity\EventMerger(
@@ -729,8 +673,6 @@ class Server extends ServerContainer implements IServerContainer {
});
$this->registerAlias(IAvatarManager::class, AvatarManager::class);
- /** @deprecated 19.0.0 */
- $this->registerDeprecatedAlias('AvatarManager', AvatarManager::class);
$this->registerAlias(\OCP\Support\CrashReport\IRegistry::class, \OC\Support\CrashReport\Registry::class);
$this->registerAlias(\OCP\Support\Subscription\IRegistry::class, \OC\Support\Subscription\Registry::class);
@@ -745,8 +687,6 @@ class Server extends ServerContainer implements IServerContainer {
return new Log($logger, $this->get(SystemConfig::class), crashReporters: $registry);
});
$this->registerAlias(ILogger::class, \OC\Log::class);
- /** @deprecated 19.0.0 */
- $this->registerDeprecatedAlias('Logger', \OC\Log::class);
// PSR-3 logger
$this->registerAlias(LoggerInterface::class, PsrLoggerAdapter::class);
@@ -755,8 +695,6 @@ class Server extends ServerContainer implements IServerContainer {
});
$this->registerAlias(IJobList::class, \OC\BackgroundJob\JobList::class);
- /** @deprecated 19.0.0 */
- $this->registerDeprecatedAlias('JobList', IJobList::class);
$this->registerService(Router::class, function (Server $c) {
$cacheFactory = $c->get(ICacheFactory::class);
@@ -768,8 +706,6 @@ class Server extends ServerContainer implements IServerContainer {
return $router;
});
$this->registerAlias(IRouter::class, Router::class);
- /** @deprecated 19.0.0 */
- $this->registerDeprecatedAlias('Router', IRouter::class);
$this->registerService(\OC\Security\RateLimiting\Backend\IBackend::class, function ($c) {
$config = $c->get(\OCP\IConfig::class);
@@ -791,22 +727,14 @@ class Server extends ServerContainer implements IServerContainer {
});
$this->registerAlias(\OCP\Security\ISecureRandom::class, SecureRandom::class);
- /** @deprecated 19.0.0 */
- $this->registerDeprecatedAlias('SecureRandom', \OCP\Security\ISecureRandom::class);
$this->registerAlias(\OCP\Security\IRemoteHostValidator::class, \OC\Security\RemoteHostValidator::class);
$this->registerAlias(IVerificationToken::class, VerificationToken::class);
$this->registerAlias(ICrypto::class, Crypto::class);
- /** @deprecated 19.0.0 */
- $this->registerDeprecatedAlias('Crypto', ICrypto::class);
$this->registerAlias(IHasher::class, Hasher::class);
- /** @deprecated 19.0.0 */
- $this->registerDeprecatedAlias('Hasher', IHasher::class);
$this->registerAlias(ICredentialsManager::class, CredentialsManager::class);
- /** @deprecated 19.0.0 */
- $this->registerDeprecatedAlias('CredentialsManager', ICredentialsManager::class);
$this->registerAlias(IDBConnection::class, ConnectionAdapter::class);
$this->registerService(Connection::class, function (Server $c) {
@@ -819,8 +747,6 @@ class Server extends ServerContainer implements IServerContainer {
$connection = $factory->getConnection($type, []);
return $connection;
});
- /** @deprecated 19.0.0 */
- $this->registerDeprecatedAlias('DatabaseConnection', IDBConnection::class);
$this->registerAlias(ICertificateManager::class, CertificateManager::class);
$this->registerAlias(IClientService::class, ClientService::class);
@@ -833,8 +759,6 @@ class Server extends ServerContainer implements IServerContainer {
$this->registerService(IEventLogger::class, function (ContainerInterface $c) {
return new EventLogger($c->get(SystemConfig::class), $c->get(LoggerInterface::class), $c->get(Log::class));
});
- /** @deprecated 19.0.0 */
- $this->registerDeprecatedAlias('EventLogger', IEventLogger::class);
$this->registerService(IQueryLogger::class, function (ContainerInterface $c) {
$queryLogger = new QueryLogger();
@@ -844,11 +768,7 @@ class Server extends ServerContainer implements IServerContainer {
}
return $queryLogger;
});
- /** @deprecated 19.0.0 */
- $this->registerDeprecatedAlias('QueryLogger', IQueryLogger::class);
- /** @deprecated 19.0.0 */
- $this->registerDeprecatedAlias('TempManager', TempManager::class);
$this->registerAlias(ITempManager::class, TempManager::class);
$this->registerService(AppManager::class, function (ContainerInterface $c) {
@@ -862,13 +782,9 @@ class Server extends ServerContainer implements IServerContainer {
$c->get(LoggerInterface::class),
);
});
- /** @deprecated 19.0.0 */
- $this->registerDeprecatedAlias('AppManager', AppManager::class);
$this->registerAlias(IAppManager::class, AppManager::class);
$this->registerAlias(IDateTimeZone::class, DateTimeZone::class);
- /** @deprecated 19.0.0 */
- $this->registerDeprecatedAlias('DateTimeZone', IDateTimeZone::class);
$this->registerService(IDateTimeFormatter::class, function (Server $c) {
$language = $c->get(\OCP\IConfig::class)->getUserValue($c->get(ISession::class)->get('user_id'), 'core', 'lang', null);
@@ -878,8 +794,6 @@ class Server extends ServerContainer implements IServerContainer {
$c->getL10N('lib', $language)
);
});
- /** @deprecated 19.0.0 */
- $this->registerDeprecatedAlias('DateTimeFormatter', IDateTimeFormatter::class);
$this->registerService(IUserMountCache::class, function (ContainerInterface $c) {
$mountCache = $c->get(UserMountCache::class);
@@ -887,8 +801,6 @@ class Server extends ServerContainer implements IServerContainer {
$listener->listen($c->get(IUserManager::class));
return $mountCache;
});
- /** @deprecated 19.0.0 */
- $this->registerDeprecatedAlias('UserMountCache', IUserMountCache::class);
$this->registerService(IMountProviderCollection::class, function (ContainerInterface $c) {
$loader = $c->get(IStorageFactory::class);
@@ -908,11 +820,7 @@ class Server extends ServerContainer implements IServerContainer {
return $manager;
});
- /** @deprecated 19.0.0 */
- $this->registerDeprecatedAlias('MountConfigManager', IMountProviderCollection::class);
- /** @deprecated 20.0.0 */
- $this->registerDeprecatedAlias('IniWrapper', IniGetWrapper::class);
$this->registerService(IBus::class, function (ContainerInterface $c) {
$busClass = $c->get(\OCP\IConfig::class)->getSystemValueString('commandbus');
if ($busClass) {
@@ -929,11 +837,7 @@ class Server extends ServerContainer implements IServerContainer {
}
});
$this->registerDeprecatedAlias('AsyncCommandBus', IBus::class);
- /** @deprecated 20.0.0 */
- $this->registerDeprecatedAlias('TrustedDomainHelper', TrustedDomainHelper::class);
$this->registerAlias(ITrustedDomainHelper::class, TrustedDomainHelper::class);
- /** @deprecated 19.0.0 */
- $this->registerDeprecatedAlias('Throttler', Throttler::class);
$this->registerAlias(IThrottler::class, Throttler::class);
$this->registerService(\OC\Security\Bruteforce\Backend\IBackend::class, function ($c) {
@@ -1004,8 +908,6 @@ class Server extends ServerContainer implements IServerContainer {
$stream
);
});
- /** @deprecated 19.0.0 */
- $this->registerDeprecatedAlias('Request', \OCP\IRequest::class);
$this->registerService(IRequestId::class, function (ContainerInterface $c): IRequestId {
return new RequestId(
@@ -1025,15 +927,10 @@ class Server extends ServerContainer implements IServerContainer {
$c->get(IFactory::class)
);
});
- /** @deprecated 19.0.0 */
- $this->registerDeprecatedAlias('Mailer', IMailer::class);
/** @since 30.0.0 */
$this->registerAlias(\OCP\Mail\Provider\IManager::class, \OC\Mail\Provider\Manager::class);
- /** @deprecated 21.0.0 */
- $this->registerDeprecatedAlias('LDAPProvider', ILDAPProvider::class);
-
$this->registerService(ILDAPProviderFactory::class, function (ContainerInterface $c) {
$config = $c->get(\OCP\IConfig::class);
$factoryClass = $config->getSystemValue('ldapProviderFactory', null);
@@ -1068,8 +965,6 @@ class Server extends ServerContainer implements IServerContainer {
}
return new NoopLockingProvider();
});
- /** @deprecated 19.0.0 */
- $this->registerDeprecatedAlias('LockingProvider', ILockingProvider::class);
$this->registerService(ILockManager::class, function (Server $c): LockManager {
return new LockManager();
@@ -1081,8 +976,6 @@ class Server extends ServerContainer implements IServerContainer {
return $c->get(\OC\Files\Mount\Manager::class)->getSetupManager();
});
$this->registerAlias(IMountManager::class, \OC\Files\Mount\Manager::class);
- /** @deprecated 19.0.0 */
- $this->registerDeprecatedAlias('MountManager', IMountManager::class);
$this->registerService(IMimeTypeDetector::class, function (ContainerInterface $c) {
return new \OC\Files\Type\Detection(
@@ -1092,18 +985,12 @@ class Server extends ServerContainer implements IServerContainer {
\OC::$SERVERROOT . '/resources/config/'
);
});
- /** @deprecated 19.0.0 */
- $this->registerDeprecatedAlias('MimeTypeDetector', IMimeTypeDetector::class);
$this->registerAlias(IMimeTypeLoader::class, Loader::class);
- /** @deprecated 19.0.0 */
- $this->registerDeprecatedAlias('MimeTypeLoader', IMimeTypeLoader::class);
$this->registerService(BundleFetcher::class, function () {
return new BundleFetcher($this->getL10N('lib'));
});
$this->registerAlias(\OCP\Notification\IManager::class, Manager::class);
- /** @deprecated 19.0.0 */
- $this->registerDeprecatedAlias('NotificationManager', \OCP\Notification\IManager::class);
$this->registerService(CapabilitiesManager::class, function (ContainerInterface $c) {
$manager = new CapabilitiesManager($c->get(LoggerInterface::class));
@@ -1115,8 +1002,6 @@ class Server extends ServerContainer implements IServerContainer {
});
return $manager;
});
- /** @deprecated 19.0.0 */
- $this->registerDeprecatedAlias('CapabilitiesManager', CapabilitiesManager::class);
$this->registerService(ICommentsManager::class, function (Server $c) {
$config = $c->get(\OCP\IConfig::class);
@@ -1137,8 +1022,6 @@ class Server extends ServerContainer implements IServerContainer {
return $manager;
});
- /** @deprecated 19.0.0 */
- $this->registerDeprecatedAlias('CommentsManager', ICommentsManager::class);
$this->registerAlias(\OC_Defaults::class, 'ThemingDefaults');
$this->registerService('ThemingDefaults', function (Server $c) {
@@ -1217,14 +1100,10 @@ class Server extends ServerContainer implements IServerContainer {
$request
);
});
- /** @deprecated 19.0.0 */
- $this->registerDeprecatedAlias('CsrfTokenManager', CsrfTokenManager::class);
$this->registerService(SessionStorage::class, function (ContainerInterface $c) {
return new SessionStorage($c->get(ISession::class));
});
$this->registerAlias(\OCP\Security\IContentSecurityPolicyManager::class, ContentSecurityPolicyManager::class);
- /** @deprecated 19.0.0 */
- $this->registerDeprecatedAlias('ContentSecurityPolicyManager', ContentSecurityPolicyManager::class);
$this->registerService(IProviderFactory::class, function (ContainerInterface $c) {
$config = $c->get(\OCP\IConfig::class);
@@ -1234,8 +1113,6 @@ class Server extends ServerContainer implements IServerContainer {
});
$this->registerAlias(\OCP\Share\IManager::class, \OC\Share20\Manager::class);
- /** @deprecated 19.0.0 */
- $this->registerDeprecatedAlias('ShareManager', \OCP\Share\IManager::class);
$this->registerService(\OCP\Collaboration\Collaborators\ISearch::class, function (Server $c) {
$instance = new Collaboration\Collaborators\Search($c);
@@ -1249,8 +1126,6 @@ class Server extends ServerContainer implements IServerContainer {
return $instance;
});
- /** @deprecated 19.0.0 */
- $this->registerDeprecatedAlias('CollaboratorSearch', \OCP\Collaboration\Collaborators\ISearch::class);
$this->registerAlias(\OCP\Collaboration\Collaborators\ISearchResult::class, \OC\Collaboration\Collaborators\SearchResult::class);
$this->registerAlias(\OCP\Collaboration\AutoComplete\IManager::class, \OC\Collaboration\AutoComplete\Manager::class);
@@ -1312,21 +1187,15 @@ class Server extends ServerContainer implements IServerContainer {
});
$this->registerAlias(\OCP\AppFramework\Utility\IControllerMethodReflector::class, \OC\AppFramework\Utility\ControllerMethodReflector::class);
- /** @deprecated 19.0.0 */
- $this->registerDeprecatedAlias('ControllerMethodReflector', \OCP\AppFramework\Utility\IControllerMethodReflector::class);
$this->registerAlias(\OCP\AppFramework\Utility\ITimeFactory::class, \OC\AppFramework\Utility\TimeFactory::class);
$this->registerAlias(\Psr\Clock\ClockInterface::class, \OCP\AppFramework\Utility\ITimeFactory::class);
- /** @deprecated 19.0.0 */
- $this->registerDeprecatedAlias('TimeFactory', \OCP\AppFramework\Utility\ITimeFactory::class);
$this->registerService(Defaults::class, function (Server $c) {
return new Defaults(
$c->get('ThemingDefaults')
);
});
- /** @deprecated 19.0.0 */
- $this->registerDeprecatedAlias('Defaults', \OCP\Defaults::class);
$this->registerService(\OCP\ISession::class, function (ContainerInterface $c) {
return $c->get(\OCP\IUserSession::class)->getSession();
diff --git a/lib/private/Settings/Manager.php b/lib/private/Settings/Manager.php
index c96b73474fa..3d4ea8ea39f 100644
--- a/lib/private/Settings/Manager.php
+++ b/lib/private/Settings/Manager.php
@@ -260,9 +260,7 @@ class Manager implements IManager {
$sections = [];
- $legacyForms = \OC_App::getForms('personal');
- if ((!empty($legacyForms) && $this->hasLegacyPersonalSettingsToRender($legacyForms))
- || count($this->getPersonalSettings('additional')) > 1) {
+ if (count($this->getPersonalSettings('additional')) > 1) {
$sections[98] = [new Section('additional', $this->l->t('Additional settings'), 0, $this->url->imagePath('core', 'actions/settings-dark.svg'))];
}
@@ -283,20 +281,6 @@ class Manager implements IManager {
}
/**
- * @param string[] $forms
- *
- * @return bool
- */
- private function hasLegacyPersonalSettingsToRender(array $forms): bool {
- foreach ($forms as $form) {
- if (trim($form) !== '') {
- return true;
- }
- }
- return false;
- }
-
- /**
* @inheritdoc
*/
public function getPersonalSettings(string $section): array {
diff --git a/lib/private/legacy/OC_App.php b/lib/private/legacy/OC_App.php
index ef84d35d7bc..0756f274a11 100644
--- a/lib/private/legacy/OC_App.php
+++ b/lib/private/legacy/OC_App.php
@@ -26,12 +26,10 @@ use function OCP\Log\logger;
/**
* This class manages the apps. It allows them to register and integrate in the
- * ownCloud ecosystem. Furthermore, this class is responsible for installing,
+ * Nextcloud ecosystem. Furthermore, this class is responsible for installing,
* upgrading and removing apps.
*/
class OC_App {
- private static $adminForms = [];
- private static $personalForms = [];
private static $altLogin = [];
private static $alreadyRegistered = [];
public const supportedApp = 300;
@@ -68,7 +66,7 @@ class OC_App {
* @param string[] $types
* @return bool
*
- * This function walks through the ownCloud directory and loads all apps
+ * This function walks through the Nextcloud directory and loads all apps
* it can find. A directory contains an app if the file /appinfo/info.xml
* exists.
*
@@ -386,28 +384,6 @@ class OC_App {
}
/**
- * @param string $type
- * @return array
- */
- public static function getForms(string $type): array {
- $forms = [];
- switch ($type) {
- case 'admin':
- $source = self::$adminForms;
- break;
- case 'personal':
- $source = self::$personalForms;
- break;
- default:
- return [];
- }
- foreach ($source as $form) {
- $forms[] = include $form;
- }
- return $forms;
- }
-
- /**
* @param array $entry
* @deprecated 20.0.0 Please register your alternative login option using the registerAlternativeLogin() on the RegistrationContext in your Application class implementing the OCP\Authentication\IAlternativeLogin interface
*/
@@ -611,7 +587,7 @@ class OC_App {
}
/**
- * Check whether the current ownCloud version matches the given
+ * Check whether the current Nextcloud version matches the given
* application's version requirements.
*
* The comparison is made based on the number of parts that the
@@ -621,7 +597,7 @@ class OC_App {
* This means that it's possible to specify "requiremin" => 6
* and "requiremax" => 6 and it will still match ownCloud 6.0.3.
*
- * @param string $ocVersion ownCloud version to check against
+ * @param string $ocVersion Nextcloud version to check against
* @param array $appInfo app info (from xml)
*
* @return boolean true if compatible, otherwise false
diff --git a/lib/private/legacy/OC_Helper.php b/lib/private/legacy/OC_Helper.php
index 33cc966da2a..6da063ef2ce 100644
--- a/lib/private/legacy/OC_Helper.php
+++ b/lib/private/legacy/OC_Helper.php
@@ -541,10 +541,9 @@ class OC_Helper {
$relative = 0;
}
- /** @var string $ownerId */
$ownerId = $storage->getOwner($path);
$ownerDisplayName = '';
- if ($ownerId) {
+ if ($ownerId !== false) {
$ownerDisplayName = \OC::$server->getUserManager()->getDisplayName($ownerId) ?? '';
}
diff --git a/lib/private/legacy/template/functions.php b/lib/private/legacy/template/functions.php
index 87b91639fd3..a9a1f10a116 100644
--- a/lib/private/legacy/template/functions.php
+++ b/lib/private/legacy/template/functions.php
@@ -5,6 +5,8 @@
* SPDX-FileCopyrightText: 2016 ownCloud, Inc.
* SPDX-License-Identifier: AGPL-3.0-only
*/
+
+use OCP\IDateTimeFormatter;
use OCP\Util;
function p($string) {
@@ -280,9 +282,8 @@ function strip_time($timestamp) {
* @param bool|null $dateOnly whether to strip time information
* @return string timestamp
*/
-function relative_modified_date($timestamp, $fromTime = null, $dateOnly = false) {
- /** @var \OC\DateTimeFormatter $formatter */
- $formatter = \OCP\Server::get('DateTimeFormatter');
+function relative_modified_date($timestamp, $fromTime = null, $dateOnly = false): string {
+ $formatter = \OCP\Server::get(IDateTimeFormatter::class);
if ($dateOnly) {
return $formatter->formatDateSpan($timestamp, $fromTime);
diff --git a/lib/public/Files/Storage.php b/lib/public/Files/Storage.php
deleted file mode 100644
index 049841075ca..00000000000
--- a/lib/public/Files/Storage.php
+++ /dev/null
@@ -1,445 +0,0 @@
-<?php
-
-/**
- * SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors
- * SPDX-FileCopyrightText: 2016 ownCloud, Inc.
- * SPDX-License-Identifier: AGPL-3.0-only
- */
-// use OCP namespace for all classes that are considered public.
-// This means that they should be used by apps instead of the internal Nextcloud classes
-
-namespace OCP\Files;
-
-use OCP\Files\Storage\IStorage;
-use OCP\Lock\ILockingProvider;
-
-/**
- * Provide a common interface to all different storage options
- *
- * All paths passed to the storage are relative to the storage and should NOT have a leading slash.
- *
- * @since 6.0.0
- * @deprecated 9.0.0 use \OCP\Files\Storage\IStorage instead
- */
-interface Storage extends IStorage {
- /**
- * $parameters is a free form array with the configuration options needed to construct the storage
- *
- * @param array $parameters
- * @since 6.0.0
- */
- public function __construct($parameters);
-
- /**
- * Get the identifier for the storage,
- * the returned id should be the same for every storage object that is created with the same parameters
- * and two storage objects with the same id should refer to two storages that display the same files.
- *
- * @return string
- * @since 6.0.0
- */
- public function getId();
-
- /**
- * see https://www.php.net/manual/en/function.mkdir.php
- * implementations need to implement a recursive mkdir
- *
- * @param string $path
- * @return bool
- * @since 6.0.0
- */
- public function mkdir($path);
-
- /**
- * see https://www.php.net/manual/en/function.rmdir.php
- *
- * @param string $path
- * @return bool
- * @since 6.0.0
- */
- public function rmdir($path);
-
- /**
- * see https://www.php.net/manual/en/function.opendir.php
- *
- * @param string $path
- * @return resource|false
- * @since 6.0.0
- */
- public function opendir($path);
-
- /**
- * see https://www.php.net/manual/en/function.is-dir.php
- *
- * @param string $path
- * @return bool
- * @since 6.0.0
- */
- public function is_dir($path);
-
- /**
- * see https://www.php.net/manual/en/function.is-file.php
- *
- * @param string $path
- * @return bool
- * @since 6.0.0
- */
- public function is_file($path);
-
- /**
- * see https://www.php.net/manual/en/function.stat.php
- * only the following keys are required in the result: size and mtime
- *
- * @param string $path
- * @return array|bool
- * @since 6.0.0
- */
- public function stat($path);
-
- /**
- * see https://www.php.net/manual/en/function.filetype.php
- *
- * @param string $path
- * @return string|bool
- * @since 6.0.0
- */
- public function filetype($path);
-
- /**
- * see https://www.php.net/manual/en/function.filesize.php
- * The result for filesize when called on a folder is required to be 0
- *
- * @param string $path
- * @return false|int|float
- * @since 6.0.0
- */
- public function filesize($path);
-
- /**
- * check if a file can be created in $path
- *
- * @param string $path
- * @return bool
- * @since 6.0.0
- */
- public function isCreatable($path);
-
- /**
- * check if a file can be read
- *
- * @param string $path
- * @return bool
- * @since 6.0.0
- */
- public function isReadable($path);
-
- /**
- * check if a file can be written to
- *
- * @param string $path
- * @return bool
- * @since 6.0.0
- */
- public function isUpdatable($path);
-
- /**
- * check if a file can be deleted
- *
- * @param string $path
- * @return bool
- * @since 6.0.0
- */
- public function isDeletable($path);
-
- /**
- * check if a file can be shared
- *
- * @param string $path
- * @return bool
- * @since 6.0.0
- */
- public function isSharable($path);
-
- /**
- * get the full permissions of a path.
- * Should return a combination of the PERMISSION_ constants defined in lib/public/constants.php
- *
- * @param string $path
- * @return int
- * @since 6.0.0
- */
- public function getPermissions($path);
-
- /**
- * see https://www.php.net/manual/en/function.file_exists.php
- *
- * @param string $path
- * @return bool
- * @since 6.0.0
- */
- public function file_exists($path);
-
- /**
- * see https://www.php.net/manual/en/function.filemtime.php
- *
- * @param string $path
- * @return int|bool
- * @since 6.0.0
- */
- public function filemtime($path);
-
- /**
- * see https://www.php.net/manual/en/function.file_get_contents.php
- *
- * @param string $path
- * @return string|false
- * @since 6.0.0
- */
- public function file_get_contents($path);
-
- /**
- * see https://www.php.net/manual/en/function.file_put_contents.php
- *
- * @param string $path
- * @param mixed $data
- * @return int|float|false
- * @since 6.0.0
- */
- public function file_put_contents($path, $data);
-
- /**
- * see https://www.php.net/manual/en/function.unlink.php
- *
- * @param string $path
- * @return bool
- * @since 6.0.0
- */
- public function unlink($path);
-
- /**
- * see https://www.php.net/manual/en/function.rename.php
- *
- * @param string $source
- * @param string $target
- * @return bool
- * @since 6.0.0
- */
- public function rename($source, $target);
-
- /**
- * see https://www.php.net/manual/en/function.copy.php
- *
- * @param string $source
- * @param string $target
- * @return bool
- * @since 6.0.0
- */
- public function copy($source, $target);
-
- /**
- * see https://www.php.net/manual/en/function.fopen.php
- *
- * @param string $path
- * @param string $mode
- * @return resource|bool
- * @since 6.0.0
- */
- public function fopen($path, $mode);
-
- /**
- * get the mimetype for a file or folder
- * The mimetype for a folder is required to be "httpd/unix-directory"
- *
- * @param string $path
- * @return string|bool
- * @since 6.0.0
- */
- public function getMimeType($path);
-
- /**
- * see https://www.php.net/manual/en/function.hash-file.php
- *
- * @param string $type
- * @param string $path
- * @param bool $raw
- * @return string|bool
- * @since 6.0.0
- */
- public function hash($type, $path, $raw = false);
-
- /**
- * see https://www.php.net/manual/en/function.disk-free-space.php
- *
- * @param string $path
- * @return int|float|bool
- * @since 6.0.0
- */
- public function free_space($path);
-
- /**
- * search for occurrences of $query in file names
- *
- * @param string $query
- * @return array|bool
- * @since 6.0.0
- */
- public function search($query);
-
- /**
- * see https://www.php.net/manual/en/function.touch.php
- * If the backend does not support the operation, false should be returned
- *
- * @param string $path
- * @param int $mtime
- * @return bool
- * @since 6.0.0
- */
- public function touch($path, $mtime = null);
-
- /**
- * get the path to a local version of the file.
- * The local version of the file can be temporary and doesn't have to be persistent across requests
- *
- * @param string $path
- * @return string|false
- * @since 6.0.0
- */
- public function getLocalFile($path);
-
- /**
- * check if a file or folder has been updated since $time
- *
- * @param string $path
- * @param int $time
- * @return bool
- * @since 6.0.0
- *
- * hasUpdated for folders should return at least true if a file inside the folder is add, removed or renamed.
- * returning true for other changes in the folder is optional
- */
- public function hasUpdated($path, $time);
-
- /**
- * get the ETag for a file or folder
- *
- * @param string $path
- * @return string|false
- * @since 6.0.0
- */
- public function getETag($path);
-
- /**
- * Returns whether the storage is local, which means that files
- * are stored on the local filesystem instead of remotely.
- * Calling getLocalFile() for local storages should always
- * return the local files, whereas for non-local storages
- * it might return a temporary file.
- *
- * @return bool true if the files are stored locally, false otherwise
- * @since 7.0.0
- */
- public function isLocal();
-
- /**
- * Check if the storage is an instance of $class or is a wrapper for a storage that is an instance of $class
- *
- * @template T of IStorage
- * @param string $class
- * @psalm-param class-string<T> $class
- * @return bool
- * @since 7.0.0
- * @psalm-assert-if-true T $this
- */
- public function instanceOfStorage($class);
-
- /**
- * A custom storage implementation can return an url for direct download of a give file.
- *
- * For now the returned array can hold the parameter url - in future more attributes might follow.
- *
- * @param string $path
- * @return array|bool
- * @since 8.0.0
- */
- public function getDirectDownload($path);
-
- /**
- * @param string $path the path of the target folder
- * @param string $fileName the name of the file itself
- * @return void
- * @throws InvalidPathException
- * @since 8.1.0
- */
- public function verifyPath($path, $fileName);
-
- /**
- * @param IStorage $sourceStorage
- * @param string $sourceInternalPath
- * @param string $targetInternalPath
- * @return bool
- * @since 8.1.0
- */
- public function copyFromStorage(IStorage $sourceStorage, $sourceInternalPath, $targetInternalPath);
-
- /**
- * @param IStorage $sourceStorage
- * @param string $sourceInternalPath
- * @param string $targetInternalPath
- * @return bool
- * @since 8.1.0
- */
- public function moveFromStorage(IStorage $sourceStorage, $sourceInternalPath, $targetInternalPath);
-
- /**
- * @param string $path The path of the file to acquire the lock for
- * @param int $type \OCP\Lock\ILockingProvider::LOCK_SHARED or \OCP\Lock\ILockingProvider::LOCK_EXCLUSIVE
- * @param \OCP\Lock\ILockingProvider $provider
- * @throws \OCP\Lock\LockedException
- * @since 8.1.0
- */
- public function acquireLock($path, $type, ILockingProvider $provider);
-
- /**
- * @param string $path The path of the file to acquire the lock for
- * @param int $type \OCP\Lock\ILockingProvider::LOCK_SHARED or \OCP\Lock\ILockingProvider::LOCK_EXCLUSIVE
- * @param \OCP\Lock\ILockingProvider $provider
- * @throws \OCP\Lock\LockedException
- * @since 8.1.0
- */
- public function releaseLock($path, $type, ILockingProvider $provider);
-
- /**
- * @param string $path The path of the file to change the lock for
- * @param int $type \OCP\Lock\ILockingProvider::LOCK_SHARED or \OCP\Lock\ILockingProvider::LOCK_EXCLUSIVE
- * @param \OCP\Lock\ILockingProvider $provider
- * @throws \OCP\Lock\LockedException
- * @since 8.1.0
- */
- public function changeLock($path, $type, ILockingProvider $provider);
-
- /**
- * Test a storage for availability
- *
- * @since 8.2.0
- * @return bool
- */
- public function test();
-
- /**
- * @since 8.2.0
- * @return array [ available, last_checked ]
- */
- public function getAvailability();
-
- /**
- * @since 8.2.0
- * @param bool $isAvailable
- */
- public function setAvailability($isAvailable);
-
- /**
- * @since 12.0.0
- * @return mixed
- */
- public function needsPartFile();
-}
diff --git a/lib/public/Files/Storage/IStorage.php b/lib/public/Files/Storage/IStorage.php
index e18d6768346..2016c273f91 100644
--- a/lib/public/Files/Storage/IStorage.php
+++ b/lib/public/Files/Storage/IStorage.php
@@ -401,11 +401,20 @@ interface IStorage {
/**
* @since 9.0.0
* @param bool $isAvailable
+ * @return void
*/
public function setAvailability($isAvailable);
/**
+ * @since 12.0.0
+ * @since 31.0.0 moved from Storage to IStorage
+ * @return bool
+ */
+ public function needsPartFile();
+
+ /**
* @param string $path path for which to retrieve the owner
+ * @return string|false
* @since 9.0.0
*/
public function getOwner($path);
diff --git a/lib/public/Files/Storage/IStorageFactory.php b/lib/public/Files/Storage/IStorageFactory.php
index e0ec3128876..6d44b39274e 100644
--- a/lib/public/Files/Storage/IStorageFactory.php
+++ b/lib/public/Files/Storage/IStorageFactory.php
@@ -28,10 +28,10 @@ interface IStorageFactory {
public function addStorageWrapper($wrapperName, $callback);
/**
- * @param \OCP\Files\Mount\IMountPoint $mountPoint
+ * @param IMountPoint $mountPoint
* @param string $class
* @param array $arguments
- * @return \OCP\Files\Storage
+ * @return IStorage
* @since 8.0.0
*/
public function getInstance(IMountPoint $mountPoint, $class, $arguments);
diff --git a/apps/settings/lib/SetupChecks/CheckServerResponseTrait.php b/lib/public/SetupCheck/CheckServerResponseTrait.php
index 3080829cb00..29a2215aa67 100644
--- a/apps/settings/lib/SetupChecks/CheckServerResponseTrait.php
+++ b/lib/public/SetupCheck/CheckServerResponseTrait.php
@@ -6,31 +6,33 @@ declare(strict_types=1);
* SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
-namespace OCA\Settings\SetupChecks;
+namespace OCP\SetupCheck;
use Generator;
use OCP\Http\Client\IClientService;
use OCP\Http\Client\IResponse;
use OCP\IConfig;
-use OCP\IL10N;
use OCP\IURLGenerator;
+use OCP\L10N\IFactory;
use Psr\Log\LoggerInterface;
/**
* Common trait for setup checks that need to use requests to the same server and check the response
+ * @since 31.0.0
*/
trait CheckServerResponseTrait {
protected IConfig $config;
protected IURLGenerator $urlGenerator;
protected IClientService $clientService;
- protected IL10N $l10n;
protected LoggerInterface $logger;
/**
* Common helper string in case a check could not fetch any results
+ * @since 31.0.0
*/
protected function serverConfigHelp(): string {
- return $this->l10n->t('To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule.');
+ $l10n = \OCP\Server::get(IFactory::class)->get('lib');
+ return $l10n->t('To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule.');
}
/**
@@ -40,6 +42,7 @@ trait CheckServerResponseTrait {
* @param string $url The absolute path (absolute URL without host but with web-root) to test starting with a /
* @param bool $isRootRequest Set to remove the web-root from URL and host (e.g. when requesting a path in the domain root like '/.well-known')
* @return list<string> List of possible absolute URLs
+ * @since 31.0.0
*/
protected function getTestUrls(string $url, bool $isRootRequest = false): array {
$url = '/' . ltrim($url, '/');
@@ -86,20 +89,6 @@ trait CheckServerResponseTrait {
}
/**
- * Strip a trailing slash and remove the webroot if requested.
- * @param string $url The URL to normalize. Should be an absolute URL containing scheme, host and optionally web-root.
- * @param bool $removeWebroot If set the web-root is removed from the URL and an absolute URL with only the scheme and host (optional port) is returned
- */
- protected function normalizeUrl(string $url, bool $removeWebroot): string {
- if ($removeWebroot) {
- $segments = parse_url($url);
- $port = isset($segments['port']) ? (':' . $segments['port']) : '';
- return $segments['scheme'] . '://' . $segments['host'] . $port;
- }
- return rtrim($url, '/');
- }
-
- /**
* Run a HTTP request to check header
* @param string $method The HTTP method to use
* @param string $url The absolute path (URL with webroot but without host) to check, can be the output of `IURLGenerator`
@@ -115,6 +104,7 @@ trait CheckServerResponseTrait {
* ]
*
* @return Generator<int, IResponse>
+ * @since 31.0.0
*/
protected function runRequest(string $method, string $url, array $options = [], bool $isRootRequest = false): Generator {
$options = array_merge(['ignoreSSL' => true, 'httpErrors' => true], $options);
@@ -133,17 +123,11 @@ trait CheckServerResponseTrait {
}
/**
- * Run a HEAD request to check header
- * @param string $url The relative URL to check (e.g. output of IURLGenerator)
- * @param bool $ignoreSSL Ignore SSL certificates
- * @param bool $httpErrors Ignore requests with HTTP errors (will not yield if request has a 4xx or 5xx response)
- * @return Generator<int, IResponse>
+ * Get HTTP client options
+ * @param bool $ignoreSSL If set SSL errors are ignored (e.g. self-signed certificates)
+ * @since 31.0.0
*/
- protected function runHEAD(string $url, bool $ignoreSSL = true, bool $httpErrors = true): Generator {
- return $this->runRequest('HEAD', $url, ['ignoreSSL' => $ignoreSSL, 'httpErrors' => $httpErrors]);
- }
-
- protected function getRequestOptions(bool $ignoreSSL, bool $httpErrors): array {
+ private function getRequestOptions(bool $ignoreSSL, bool $httpErrors): array {
$requestOptions = [
'connect_timeout' => 10,
'http_errors' => $httpErrors,
@@ -156,4 +140,23 @@ trait CheckServerResponseTrait {
}
return $requestOptions;
}
+
+ /**
+ * Strip a trailing slash and remove the webroot if requested.
+ * @param string $url The URL to normalize. Should be an absolute URL containing scheme, host and optionally web-root.
+ * @param bool $removeWebroot If set the web-root is removed from the URL and an absolute URL with only the scheme and host (optional port) is returned
+ * @since 31.0.0
+ */
+ private function normalizeUrl(string $url, bool $removeWebroot): string {
+ if ($removeWebroot) {
+ $segments = parse_url($url);
+ if (!isset($segments['scheme']) || !isset($segments['host'])) {
+ throw new \InvalidArgumentException('URL is missing scheme or host');
+ }
+
+ $port = isset($segments['port']) ? (':' . $segments['port']) : '';
+ return $segments['scheme'] . '://' . $segments['host'] . $port;
+ }
+ return rtrim($url, '/');
+ }
}
diff --git a/resources/config/mimetypealiases.dist.json b/resources/config/mimetypealiases.dist.json
index 6fe7db76318..05af6382e30 100644
--- a/resources/config/mimetypealiases.dist.json
+++ b/resources/config/mimetypealiases.dist.json
@@ -15,8 +15,10 @@
"application/gpx+xml": "location",
"application/gzip": "package/x-generic",
"application/illustrator": "image",
+ "application/internet-shortcut": "link",
"application/javascript": "text/code",
"application/json": "text/code",
+ "application/km": "mindmap",
"application/msaccess": "file",
"application/msexcel": "x-office/spreadsheet",
"application/msonenote": "x-office/document",
@@ -27,21 +29,21 @@
"application/rss+xml": "application/xml",
"application/vnd.android.package-archive": "package/x-generic",
"application/vnd.excalidraw+json": "whiteboard",
- "application/vnd.lotus-wordpro": "x-office/document",
"application/vnd.garmin.tcx+xml": "location",
"application/vnd.google-earth.kml+xml": "location",
"application/vnd.google-earth.kmz": "location",
- "application/vnd.ms-excel": "x-office/spreadsheet",
+ "application/vnd.lotus-wordpro": "x-office/document",
"application/vnd.ms-excel.addin.macroEnabled.12": "x-office/spreadsheet",
"application/vnd.ms-excel.sheet.binary.macroEnabled.12": "x-office/spreadsheet",
"application/vnd.ms-excel.sheet.macroEnabled.12": "x-office/spreadsheet",
"application/vnd.ms-excel.template.macroEnabled.12": "x-office/spreadsheet",
+ "application/vnd.ms-excel": "x-office/spreadsheet",
"application/vnd.ms-fontobject": "font",
- "application/vnd.ms-powerpoint": "x-office/presentation",
"application/vnd.ms-powerpoint.addin.macroEnabled.12": "x-office/presentation",
"application/vnd.ms-powerpoint.presentation.macroEnabled.12": "x-office/presentation",
"application/vnd.ms-powerpoint.slideshow.macroEnabled.12": "x-office/presentation",
"application/vnd.ms-powerpoint.template.macroEnabled.12": "x-office/presentation",
+ "application/vnd.ms-powerpoint": "x-office/presentation",
"application/vnd.ms-visio.drawing.macroEnabled.12": "application/vnd.visio",
"application/vnd.ms-visio.drawing": "application/vnd.visio",
"application/vnd.ms-visio.stencil.macroEnabled.12": "application/vnd.visio",
@@ -50,29 +52,32 @@
"application/vnd.ms-visio.template": "application/vnd.visio",
"application/vnd.ms-word.document.macroEnabled.12": "x-office/document",
"application/vnd.ms-word.template.macroEnabled.12": "x-office/document",
- "application/vnd.oasis.opendocument.presentation": "x-office/presentation",
+ "application/vnd.oasis.opendocument.graphics-flat-xml": "x-office/drawing",
+ "application/vnd.oasis.opendocument.graphics-template": "x-office/drawing",
+ "application/vnd.oasis.opendocument.graphics": "x-office/drawing",
+ "application/vnd.oasis.opendocument.presentation-flat-xml": "x-office/presentation",
"application/vnd.oasis.opendocument.presentation-template": "x-office/presentation",
- "application/vnd.oasis.opendocument.spreadsheet": "x-office/spreadsheet",
+ "application/vnd.oasis.opendocument.presentation": "x-office/presentation",
+ "application/vnd.oasis.opendocument.spreadsheet-flat-xml": "x-office/spreadsheet",
"application/vnd.oasis.opendocument.spreadsheet-template": "x-office/spreadsheet",
- "application/vnd.oasis.opendocument.text": "x-office/document",
+ "application/vnd.oasis.opendocument.spreadsheet": "x-office/spreadsheet",
+ "application/vnd.oasis.opendocument.text-flat-xml": "x-office/document",
"application/vnd.oasis.opendocument.text-master": "x-office/document",
"application/vnd.oasis.opendocument.text-template": "x-office/document",
- "application/vnd.oasis.opendocument.graphics": "x-office/drawing",
- "application/vnd.oasis.opendocument.graphics-template": "x-office/drawing",
"application/vnd.oasis.opendocument.text-web": "x-office/document",
- "application/vnd.oasis.opendocument.text-flat-xml": "x-office/document",
- "application/vnd.oasis.opendocument.spreadsheet-flat-xml": "x-office/spreadsheet",
- "application/vnd.oasis.opendocument.graphics-flat-xml": "x-office/drawing",
- "application/vnd.oasis.opendocument.presentation-flat-xml": "x-office/presentation",
+ "application/vnd.oasis.opendocument.text": "x-office/document",
"application/vnd.openxmlformats-officedocument.presentationml.presentation": "x-office/presentation",
"application/vnd.openxmlformats-officedocument.presentationml.slideshow": "x-office/presentation",
"application/vnd.openxmlformats-officedocument.presentationml.template": "x-office/presentation",
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet": "x-office/spreadsheet",
"application/vnd.openxmlformats-officedocument.spreadsheetml.template": "x-office/spreadsheet",
+ "application/vnd.openxmlformats-officedocument.wordprocessingml.document.docxf": "x-office/form-template",
+ "application/vnd.openxmlformats-officedocument.wordprocessingml.document.oform": "x-office/form",
"application/vnd.openxmlformats-officedocument.wordprocessingml.document": "x-office/document",
"application/vnd.openxmlformats-officedocument.wordprocessingml.template": "x-office/document",
"application/vnd.visio": "x-office/document",
"application/vnd.wordperfect": "x-office/document",
+ "application/vnd.xmind.workbook": "mindmap",
"application/x-7z-compressed": "package/x-generic",
"application/x-bzip2": "package/x-generic",
"application/x-cbr": "text",
@@ -81,6 +86,7 @@
"application/x-deb": "package/x-generic",
"application/x-fictionbook+xml": "text",
"application/x-font": "font",
+ "application/x-freemind": "mindmap",
"application/x-gimp": "image",
"application/x-gzip": "application/gzip",
"application/x-iwork-keynote-sffkey": "x-office/presentation",
@@ -96,8 +102,11 @@
"application/xml": "text/html",
"application/yaml": "text/code",
"application/zip": "package/x-generic",
+ "application/zstd": "package/x-generic",
"database": "file",
"httpd/unix-directory": "dir",
+ "image/targa": "image/tga",
+ "image/x-emf": "image/emf",
"text/css": "text/code",
"text/csv": "x-office/spreadsheet",
"text/html": "text/code",
@@ -109,13 +118,5 @@
"text/x-python": "text/code",
"text/x-rst": "text",
"text/x-shellscript": "text/code",
- "web": "text/code",
- "application/internet-shortcut": "link",
- "application/km": "mindmap",
- "application/x-freemind": "mindmap",
- "application/vnd.xmind.workbook": "mindmap",
- "image/targa": "image/tga",
- "application/vnd.openxmlformats-officedocument.wordprocessingml.document.oform": "x-office/form",
- "application/vnd.openxmlformats-officedocument.wordprocessingml.document.docxf": "x-office/form-template",
- "image/x-emf": "image/emf"
+ "web": "text/code"
}
diff --git a/resources/config/mimetypemapping.dist.json b/resources/config/mimetypemapping.dist.json
index ca515b2c578..6f1f25f2718 100644
--- a/resources/config/mimetypemapping.dist.json
+++ b/resources/config/mimetypemapping.dist.json
@@ -234,5 +234,6 @@
"xrf": ["image/x-dcraw"],
"yaml": ["application/yaml", "text/plain"],
"yml": ["application/yaml", "text/plain"],
- "zip": ["application/zip"]
+ "zip": ["application/zip"],
+ "zst": ["application/zstd"]
}
diff --git a/tests/data/integritycheck/mimetypeListModified/core/js/mimetypelist.js b/tests/data/integritycheck/mimetypeListModified/core/js/mimetypelist.js
index 25448c5b576..8abdedbe667 100644
--- a/tests/data/integritycheck/mimetypeListModified/core/js/mimetypelist.js
+++ b/tests/data/integritycheck/mimetypeListModified/core/js/mimetypelist.js
@@ -15,8 +15,10 @@ OC.MimeTypeList={
"application/gpx+xml": "location",
"application/gzip": "package/x-generic",
"application/illustrator": "image",
+ "application/internet-shortcut": "link",
"application/javascript": "text/code",
"application/json": "text/code",
+ "application/km": "mindmap",
"application/msaccess": "file",
"application/msexcel": "x-office/spreadsheet",
"application/msonenote": "x-office/document",
@@ -27,21 +29,21 @@ OC.MimeTypeList={
"application/rss+xml": "application/xml",
"application/vnd.android.package-archive": "package/x-generic",
"application/vnd.excalidraw+json": "whiteboard",
- "application/vnd.lotus-wordpro": "x-office/document",
"application/vnd.garmin.tcx+xml": "location",
"application/vnd.google-earth.kml+xml": "location",
"application/vnd.google-earth.kmz": "location",
- "application/vnd.ms-excel": "x-office/spreadsheet",
+ "application/vnd.lotus-wordpro": "x-office/document",
"application/vnd.ms-excel.addin.macroEnabled.12": "x-office/spreadsheet",
"application/vnd.ms-excel.sheet.binary.macroEnabled.12": "x-office/spreadsheet",
"application/vnd.ms-excel.sheet.macroEnabled.12": "x-office/spreadsheet",
"application/vnd.ms-excel.template.macroEnabled.12": "x-office/spreadsheet",
+ "application/vnd.ms-excel": "x-office/spreadsheet",
"application/vnd.ms-fontobject": "font",
- "application/vnd.ms-powerpoint": "x-office/presentation",
"application/vnd.ms-powerpoint.addin.macroEnabled.12": "x-office/presentation",
"application/vnd.ms-powerpoint.presentation.macroEnabled.12": "x-office/presentation",
"application/vnd.ms-powerpoint.slideshow.macroEnabled.12": "x-office/presentation",
"application/vnd.ms-powerpoint.template.macroEnabled.12": "x-office/presentation",
+ "application/vnd.ms-powerpoint": "x-office/presentation",
"application/vnd.ms-visio.drawing.macroEnabled.12": "application/vnd.visio",
"application/vnd.ms-visio.drawing": "application/vnd.visio",
"application/vnd.ms-visio.stencil.macroEnabled.12": "application/vnd.visio",
@@ -50,29 +52,32 @@ OC.MimeTypeList={
"application/vnd.ms-visio.template": "application/vnd.visio",
"application/vnd.ms-word.document.macroEnabled.12": "x-office/document",
"application/vnd.ms-word.template.macroEnabled.12": "x-office/document",
- "application/vnd.oasis.opendocument.presentation": "x-office/presentation",
+ "application/vnd.oasis.opendocument.graphics-flat-xml": "x-office/drawing",
+ "application/vnd.oasis.opendocument.graphics-template": "x-office/drawing",
+ "application/vnd.oasis.opendocument.graphics": "x-office/drawing",
+ "application/vnd.oasis.opendocument.presentation-flat-xml": "x-office/presentation",
"application/vnd.oasis.opendocument.presentation-template": "x-office/presentation",
- "application/vnd.oasis.opendocument.spreadsheet": "x-office/spreadsheet",
+ "application/vnd.oasis.opendocument.presentation": "x-office/presentation",
+ "application/vnd.oasis.opendocument.spreadsheet-flat-xml": "x-office/spreadsheet",
"application/vnd.oasis.opendocument.spreadsheet-template": "x-office/spreadsheet",
- "application/vnd.oasis.opendocument.text": "x-office/document",
+ "application/vnd.oasis.opendocument.spreadsheet": "x-office/spreadsheet",
+ "application/vnd.oasis.opendocument.text-flat-xml": "x-office/document",
"application/vnd.oasis.opendocument.text-master": "x-office/document",
"application/vnd.oasis.opendocument.text-template": "x-office/document",
- "application/vnd.oasis.opendocument.graphics": "x-office/drawing",
- "application/vnd.oasis.opendocument.graphics-template": "x-office/drawing",
"application/vnd.oasis.opendocument.text-web": "x-office/document",
- "application/vnd.oasis.opendocument.text-flat-xml": "x-office/document",
- "application/vnd.oasis.opendocument.spreadsheet-flat-xml": "x-office/spreadsheet",
- "application/vnd.oasis.opendocument.graphics-flat-xml": "x-office/drawing",
- "application/vnd.oasis.opendocument.presentation-flat-xml": "x-office/presentation",
+ "application/vnd.oasis.opendocument.text": "x-office/document",
"application/vnd.openxmlformats-officedocument.presentationml.presentation": "x-office/presentation",
"application/vnd.openxmlformats-officedocument.presentationml.slideshow": "x-office/presentation",
"application/vnd.openxmlformats-officedocument.presentationml.template": "x-office/presentation",
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet": "x-office/spreadsheet",
"application/vnd.openxmlformats-officedocument.spreadsheetml.template": "x-office/spreadsheet",
+ "application/vnd.openxmlformats-officedocument.wordprocessingml.document.docxf": "x-office/form-template",
+ "application/vnd.openxmlformats-officedocument.wordprocessingml.document.oform": "x-office/form",
"application/vnd.openxmlformats-officedocument.wordprocessingml.document": "x-office/document",
"application/vnd.openxmlformats-officedocument.wordprocessingml.template": "x-office/document",
"application/vnd.visio": "x-office/document",
"application/vnd.wordperfect": "x-office/document",
+ "application/vnd.xmind.workbook": "mindmap",
"application/x-7z-compressed": "package/x-generic",
"application/x-bzip2": "package/x-generic",
"application/x-cbr": "text",
@@ -81,6 +86,7 @@ OC.MimeTypeList={
"application/x-deb": "package/x-generic",
"application/x-fictionbook+xml": "text",
"application/x-font": "font",
+ "application/x-freemind": "mindmap",
"application/x-gimp": "image",
"application/x-gzip": "application/gzip",
"application/x-iwork-keynote-sffkey": "x-office/presentation",
@@ -96,8 +102,11 @@ OC.MimeTypeList={
"application/xml": "text/html",
"application/yaml": "text/code",
"application/zip": "package/x-generic",
+ "application/zstd": "package/x-generic",
"database": "file",
"httpd/unix-directory": "dir",
+ "image/targa": "image/tga",
+ "image/x-emf": "image/emf",
"text/css": "text/code",
"text/csv": "x-office/spreadsheet",
"text/html": "text/code",
@@ -110,14 +119,6 @@ OC.MimeTypeList={
"text/x-rst": "text",
"text/x-shellscript": "text/code",
"web": "text/code",
- "application/internet-shortcut": "link",
- "application/km": "mindmap",
- "application/x-freemind": "mindmap",
- "application/vnd.xmind.workbook": "mindmap",
- "image/targa": "image/tga",
- "application/vnd.openxmlformats-officedocument.wordprocessingml.document.oform": "x-office/form",
- "application/vnd.openxmlformats-officedocument.wordprocessingml.document.docxf": "x-office/form-template",
- "image/x-emf": "image/emf",
"my-custom/mimetype": "custom"
},
files: [
diff --git a/tests/data/integritycheck/mimetypeListModified/core/signature.json b/tests/data/integritycheck/mimetypeListModified/core/signature.json
index bea0a2647b8..92f8fceb817 100644
--- a/tests/data/integritycheck/mimetypeListModified/core/signature.json
+++ b/tests/data/integritycheck/mimetypeListModified/core/signature.json
@@ -1,7 +1,7 @@
{
"hashes": {
- "core\/js\/mimetypelist.js": "507bb72181a0213598eaa03dbb6f7290b367e06b706aa15873a921c491980a13165c9858924d9b4b478b8444e92bb5e4169f5f971d184b77a63c3fcc5b3acf59"
+ "core\/js\/mimetypelist.js": "00127c5b224ade81dbea7909013ba4aad1752206d9e47011250d2c2e488993e9ae6da590d8520fbaad0627959986d5cdfefcd74bd01d422f10e2e63ec5355c8f"
},
- "signature": "qGQx9Sy0ynziPeir6H7dIsTdSjjOrLEEbB+sf00sWpmQ\/izXW9Zd7jeTKgMHfrew+d+NyyR3O5V1m\/FkMtmp61LM1l22VpyuiRctFOs1qSxXmDRu27LLIP3d2yayLqpROOEdJSMgDoQU1yGV05bnK0u2yy3srxZa2XUjTaDRT5M+xRBPuc1CtEQ1azp07Xk7N2FnoGjc3\/TusodpHovlKwUg5uSX5nC5da7KJWJ9luM4B\/etl717Hrauw5xIgi+AryuIjhahaYvnIJcM0yZYkZ7KIqOa6Y\/SZFRC0+kB+KJdu3+ZJ4RTTnxmVVcQ4DN2fEozjr6ZDZGaRY+TnF8UaPopba5xDipHq8A4Qm0DWewOG9G4CFdJViGHYFTmIMWealugQLY6ucDcaYaw+kqa66Es7VX0Use0WJFymlleDchqaRWd1n18rEBjEBmDc8s4pQeXZRu8nCxngYUyKrImKWdLpTnxgThqFTukT\/zkaP6klXWydfISK07aKlil7ha84Ud83g71SwIsq3x4y7BSeXyZGRdkzImqlSwgz60u1ndG6m\/cG3Es01v6ao26H4Rs28deLQfBMR6xdKZn272Dsm\/shyXlj4ElZ4jtxqJk5EfBC0Jv6xOsfEIxgdJ7igU52CYrQVhdKQf+4O8XnRth0qvFBTv7btiRCPZflsQ+mRs=",
+ "signature": "jZ9+ptmgPdxYfvbp2qkafRn3cGwiCBVjUeYReiewhnnLS\/fp8ojCnCoFxjq+lf2f7xhqVTCodNwpr9\/BViZtcrCC\/GblRdVSP3Zqw9SaIxJiNHJJt5m8HdN3v3DVmN3AS\/A37fomGn2eZ+r7nkOLO\/w\/U8bhduHhpjQUmFwHDTrCzu5o6Im3huIzEPISnzVp59FATpyOjqOw5RXekJnBNfYu\/5ZP+C8ceYDvZ93ocP3uO+X6Mi8g+kyHSNXoACB6X03d80NWVoEsaK0Jw7imvN7Ir4SwvuxLcqeJDPKWGAgCXm\/7pDA4WcRoX1M2b7Rj2A2zegL49FNrtc+97ch3+9UrzXPLt1spf4ohcRSPSsq7\/TM4v81Jlo4FLPV3uGQx\/j4tti2uwVcwEr4vLwdopqHjFPOHBkhVLdgcePQBJAnt\/gVIANxM+yruGOTMB2KG9zyl343OixdNHVXeGtz69WCUypcDuSWlM+qi0gG9OTlyDu+lElarFviLviz57oTpX13xeHCJC5cApjurWMRUGgW5ehBeyd6Wc5vKKRuoZir570p3nbiKzYPNNBByDgpG4mWVegn\/u6zPbiwnr7YHQHKJCyij0OR2OqtR\/6xMeIvGAGyCeGj4m1DttafSoPXdaQqDAaiLbRO9vsb46TgWbH9vu+p9w7Hk+Y5gufvH22A=",
"certificate": "-----BEGIN CERTIFICATE-----\r\nMIIEvjCCAqagAwIBAgIUc\/0FxYrsgSs9rDxp03EJmbjN0NwwDQYJKoZIhvcNAQEF\r\nBQAwIzEhMB8GA1UECgwYb3duQ2xvdWQgQ29kZSBTaWduaW5nIENBMB4XDTE1MTEw\r\nMzIxMDMzM1oXDTE2MTEwMzIxMDMzM1owDzENMAsGA1UEAwwEY29yZTCCAiIwDQYJ\r\nKoZIhvcNAQEBBQADggIPADCCAgoCggIBALb6EgHpkAqZbO5vRO8XSh7G7XGWHw5s\r\niOf4RwPXR6SE9bWZEm\/b72SfWk\/\/J6AbrD8WiOzBuT\/ODy6k5T1arEdHO+Pux0W1\r\nMxYJJI4kH74KKgMpC0SB0Rt+8WrMqV1r3hhJ46df6Xr\/xolP3oD+eLbShPcblhdS\r\nVtkZEkoev8Sh6L2wDCeHDyPxzvj1w2dTdGVO9Kztn0xIlyfEBakqvBWtcxyi3Ln0\r\nklnxlMx3tPDUE4kqvpia9qNiB1AN2PV93eNr5\/2riAzIssMFSCarWCx0AKYb54+d\r\nxLpcYFyqPJ0ydBCkF78DD45RCZet6PNYkdzgbqlUWEGGomkuDoJbBg4wzgzO0D77\r\nH87KFhYW8tKFFvF1V3AHl\/sFQ9tDHaxM9Y0pZ2jPp\/ccdiqnmdkBxBDqsiRvHvVB\r\nCn6qpb4vWGFC7vHOBfYspmEL1zLlKXZv3ezMZEZw7O9ZvUP3VO\/wAtd2vUW8UFiq\r\ns2v1QnNLN6jNh51obcwmrBvWhJy9vQIdtIjQbDxqWTHh1zUSrw9wrlklCBZ\/zrM0\r\ni8nfCFwTxWRxp3H9KoECzO\/zS5R5KIS7s3\/wq\/w9T2Ie4rcecgXwDizwnn0C\/aKc\r\nbDIjujpL1s9HO05pcD\/V3wKcPZ1izymBkmMyIbL52iRVN5FTVHeZdXPpFuq+CTQJ\r\nQ238lC+A\/KOVAgMBAAEwDQYJKoZIhvcNAQEFBQADggIBAGoKTnh8RfJV4sQItVC2\r\nAvfJagkrIqZ3iiQTUBQGTKBsTnAqE1H7QgUSV9vSd+8rgvHkyZsRjmtyR1e3A6Ji\r\noNCXUbExC\/0iCPUqdHZIVb+Lc\/vWuv4ByFMybGPydgtLoEUX2ZrKFWmcgZFDUSRd\r\n9Uj26vtUhCC4bU4jgu6hIrR9IuxOBLQUxGTRZyAcXvj7obqRAEZwFAKQgFpfpqTb\r\nH+kjcbZSaAlLVSF7vBc1syyI8RGYbqpwvtREqJtl5IEIwe6huEqJ3zPnlP2th\/55\r\ncf3Fovj6JJgbb9XFxrdnsOsDOu\/tpnaRWlvv5ib4+SzG5wWFT5UUEo4Wg2STQiiX\r\nuVSRQxK1LE1yg84bs3NZk9FSQh4B8vZVuRr5FaJsZZkwlFlhRO\/\/+TJtXRbyNgsf\r\noMRZGi8DLGU2SGEAHcRH\/QZHq\/XDUWVzdxrSBYcy7GSpT7UDVzGv1rEJUrn5veP1\r\n0KmauAqtiIaYRm4f6YBsn0INcZxzIPZ0p8qFtVZBPeHhvQtvOt0iXI\/XUxEWOa2F\r\nK2EqhErgMK\/N07U1JJJay5tYZRtvkGq46oP\/5kQG8hYST0MDK6VihJoPpvCmAm4E\r\npEYKQ96x6A4EH9Y9mZlYozH\/eqmxPbTK8n89\/p7Ydun4rI+B2iiLnY8REWWy6+UQ\r\nV204fGUkJqW5CrKy3P3XvY9X\r\n-----END CERTIFICATE-----"
} \ No newline at end of file
diff --git a/tests/lib/ConfigTest.php b/tests/lib/ConfigTest.php
index 60006aa43de..94ee8da5dec 100644
--- a/tests/lib/ConfigTest.php
+++ b/tests/lib/ConfigTest.php
@@ -41,6 +41,13 @@ class ConfigTest extends TestCase {
$this->assertSame($expectedConfig, $this->getConfig()->getKeys());
}
+ public function testGetKeysReturnsEnvironmentKeysIfSet() {
+ $expectedConfig = ['foo', 'beers', 'alcohol_free', 'taste'];
+ putenv('NC_taste=great');
+ $this->assertSame($expectedConfig, $this->getConfig()->getKeys());
+ putenv('NC_taste');
+ }
+
public function testGetValue(): void {
$config = $this->getConfig();
$this->assertSame('bar', $config->getValue('foo'));
diff --git a/tests/lib/Encryption/DecryptAllTest.php b/tests/lib/Encryption/DecryptAllTest.php
index d073efc8235..6a8453bcaf8 100644
--- a/tests/lib/Encryption/DecryptAllTest.php
+++ b/tests/lib/Encryption/DecryptAllTest.php
@@ -12,7 +12,7 @@ use OC\Encryption\Exceptions\DecryptionFailedException;
use OC\Encryption\Manager;
use OC\Files\FileInfo;
use OC\Files\View;
-use OCP\Files\Storage;
+use OCP\Files\Storage\IStorage;
use OCP\IUserManager;
use OCP\UserInterface;
use Symfony\Component\Console\Formatter\OutputFormatterInterface;
@@ -246,11 +246,11 @@ class DecryptAllTest extends TestCase {
->setMethods(['decryptFile'])
->getMock();
- $storage = $this->getMockBuilder(Storage::class)
+ $storage = $this->getMockBuilder(IStorage::class)
->disableOriginalConstructor()->getMock();
- $sharedStorage = $this->getMockBuilder(Storage::class)
+ $sharedStorage = $this->getMockBuilder(IStorage::class)
->disableOriginalConstructor()->getMock();
$sharedStorage->expects($this->once())->method('instanceOfStorage')
diff --git a/tests/lib/Encryption/EncryptionWrapperTest.php b/tests/lib/Encryption/EncryptionWrapperTest.php
index 1ecb9dc89c7..1ac7342a3d8 100644
--- a/tests/lib/Encryption/EncryptionWrapperTest.php
+++ b/tests/lib/Encryption/EncryptionWrapperTest.php
@@ -10,7 +10,8 @@ namespace Test\Encryption;
use OC\Encryption\EncryptionWrapper;
use OC\Encryption\Manager;
use OC\Memcache\ArrayCache;
-use OCP\Files\Storage;
+use OCP\Files\Storage\IDisableEncryptionStorage;
+use OCP\Files\Storage\IStorage;
use Psr\Log\LoggerInterface;
use Test\TestCase;
@@ -42,7 +43,7 @@ class EncryptionWrapperTest extends TestCase {
* @dataProvider provideWrapStorage
*/
public function testWrapStorage($expectedWrapped, $wrappedStorages): void {
- $storage = $this->getMockBuilder(Storage::class)
+ $storage = $this->getMockBuilder(IStorage::class)
->disableOriginalConstructor()
->getMock();
@@ -74,7 +75,7 @@ class EncryptionWrapperTest extends TestCase {
[true, ['OCA\Files_Trashbin\Storage']],
// Do not wrap shared storages
- [false, [Storage\IDisableEncryptionStorage::class]],
+ [false, [IDisableEncryptionStorage::class]],
];
}
}
diff --git a/tests/lib/Files/Mount/MountPointTest.php b/tests/lib/Files/Mount/MountPointTest.php
index eda61feb249..3de54e315a1 100644
--- a/tests/lib/Files/Mount/MountPointTest.php
+++ b/tests/lib/Files/Mount/MountPointTest.php
@@ -8,14 +8,14 @@
namespace Test\Files\Mount;
use OC\Files\Storage\StorageFactory;
-use OCP\Files\Storage;
+use OCP\Files\Storage\IStorage;
class DummyStorage {
}
class MountPointTest extends \Test\TestCase {
public function testGetStorage(): void {
- $storage = $this->createMock(Storage::class);
+ $storage = $this->createMock(IStorage::class);
$storage->expects($this->once())
->method('getId')
->willReturn(123);
diff --git a/tests/lib/Files/Node/FolderTest.php b/tests/lib/Files/Node/FolderTest.php
index 2e3b6e369d3..5af409a1a93 100644
--- a/tests/lib/Files/Node/FolderTest.php
+++ b/tests/lib/Files/Node/FolderTest.php
@@ -28,7 +28,7 @@ use OCP\Files\Mount\IMountPoint;
use OCP\Files\NotFoundException;
use OCP\Files\Search\ISearchComparison;
use OCP\Files\Search\ISearchOrder;
-use OCP\Files\Storage;
+use OCP\Files\Storage\IStorage;
use PHPUnit\Framework\MockObject\MockObject;
/**
@@ -292,7 +292,7 @@ class FolderTest extends NodeTest {
$root->method('getUser')
->willReturn($this->user);
/** @var Storage\IStorage&MockObject $storage */
- $storage = $this->createMock(Storage\IStorage::class);
+ $storage = $this->createMock(IStorage::class);
$storage->method('getId')->willReturn('test::1');
$cache = new Cache($storage);
@@ -341,7 +341,7 @@ class FolderTest extends NodeTest {
->method('getUser')
->willReturn($this->user);
/** @var \PHPUnit\Framework\MockObject\MockObject|Storage $storage */
- $storage = $this->createMock(Storage::class);
+ $storage = $this->createMock(IStorage::class);
$storage->method('getId')->willReturn('test::2');
$cache = new Cache($storage);
@@ -379,7 +379,7 @@ class FolderTest extends NodeTest {
->getMock();
$root->method('getUser')
->willReturn($this->user);
- $storage = $this->createMock(Storage::class);
+ $storage = $this->createMock(IStorage::class);
$storage->method('getId')->willReturn('test::1');
$cache = new Cache($storage);
@@ -420,10 +420,10 @@ class FolderTest extends NodeTest {
$root->expects($this->any())
->method('getUser')
->willReturn($this->user);
- $storage = $this->createMock(Storage::class);
+ $storage = $this->createMock(IStorage::class);
$storage->method('getId')->willReturn('test::1');
$cache = new Cache($storage);
- $subStorage = $this->createMock(Storage::class);
+ $subStorage = $this->createMock(IStorage::class);
$subStorage->method('getId')->willReturn('test::2');
$subCache = new Cache($subStorage);
$subMount = $this->getMockBuilder(MountPoint::class)->setConstructorArgs([Temporary::class, ''])->getMock();
@@ -922,14 +922,14 @@ class FolderTest extends NodeTest {
$root->expects($this->any())
->method('getUser')
->willReturn($this->user);
- $storage = $this->createMock(Storage::class);
+ $storage = $this->createMock(IStorage::class);
$storage->method('getId')->willReturn('test::1');
$cache = new Cache($storage);
- $subStorage1 = $this->createMock(Storage::class);
+ $subStorage1 = $this->createMock(IStorage::class);
$subStorage1->method('getId')->willReturn('test::2');
$subCache1 = new Cache($subStorage1);
$subMount1 = $this->getMockBuilder(MountPoint::class)->setConstructorArgs([Temporary::class, ''])->getMock();
- $subStorage2 = $this->createMock(Storage::class);
+ $subStorage2 = $this->createMock(IStorage::class);
$subStorage2->method('getId')->willReturn('test::3');
$subCache2 = new Cache($subStorage2);
$subMount2 = $this->getMockBuilder(MountPoint::class)->setConstructorArgs([Temporary::class, ''])->getMock();
diff --git a/tests/lib/Files/Node/NodeTest.php b/tests/lib/Files/Node/NodeTest.php
index d12448a2481..db87aa925d3 100644
--- a/tests/lib/Files/Node/NodeTest.php
+++ b/tests/lib/Files/Node/NodeTest.php
@@ -16,7 +16,7 @@ use OCP\Files\IRootFolder;
use OCP\Files\Mount\IMountPoint;
use OCP\Files\Node;
use OCP\Files\NotFoundException;
-use OCP\Files\Storage;
+use OCP\Files\Storage\IStorage;
use OCP\ICacheFactory;
use OCP\IUser;
use OCP\IUserManager;
@@ -111,7 +111,7 @@ abstract class NodeTest extends \Test\TestCase {
abstract protected function getViewDeleteMethod();
protected function getMockStorage() {
- $storage = $this->getMockBuilder(Storage::class)
+ $storage = $this->getMockBuilder(IStorage::class)
->disableOriginalConstructor()
->getMock();
$storage->expects($this->any())
diff --git a/tests/lib/Files/Storage/Storage.php b/tests/lib/Files/Storage/Storage.php
index 5b0bbf2f95b..36d70965848 100644
--- a/tests/lib/Files/Storage/Storage.php
+++ b/tests/lib/Files/Storage/Storage.php
@@ -8,6 +8,7 @@
namespace Test\Files\Storage;
use OC\Files\Cache\Watcher;
+use OCP\Files\Storage\IStorage;
use OCP\Files\Storage\IWriteStreamStorage;
abstract class Storage extends \Test\TestCase {
@@ -572,7 +573,7 @@ abstract class Storage extends \Test\TestCase {
}
public function testInstanceOfStorage(): void {
- $this->assertTrue($this->instance->instanceOfStorage('\OCP\Files\Storage'));
+ $this->assertTrue($this->instance->instanceOfStorage(IStorage::class));
$this->assertTrue($this->instance->instanceOfStorage(get_class($this->instance)));
$this->assertFalse($this->instance->instanceOfStorage('\OC'));
}
diff --git a/tests/lib/Files/Storage/StorageFactoryTest.php b/tests/lib/Files/Storage/StorageFactoryTest.php
index 66f2a2af9a6..d1e8d927dc9 100644
--- a/tests/lib/Files/Storage/StorageFactoryTest.php
+++ b/tests/lib/Files/Storage/StorageFactoryTest.php
@@ -10,7 +10,7 @@ namespace Test\Files\Storage;
use OC\Files\Mount\MountPoint;
use OC\Files\Storage\Wrapper\Wrapper;
use OCP\Files\Mount\IMountPoint;
-use OCP\Files\Storage as IStorage;
+use OCP\Files\Storage\IStorage;
use Test\TestCase;
class DummyWrapper extends Wrapper {
diff --git a/tests/lib/Lockdown/Filesystem/NullStorageTest.php b/tests/lib/Lockdown/Filesystem/NullStorageTest.php
index 331adeb8a54..a0b9b04ad1a 100644
--- a/tests/lib/Lockdown/Filesystem/NullStorageTest.php
+++ b/tests/lib/Lockdown/Filesystem/NullStorageTest.php
@@ -11,7 +11,7 @@ use OC\Files\FileInfo;
use OC\ForbiddenException;
use OC\Lockdown\Filesystem\NullCache;
use OC\Lockdown\Filesystem\NullStorage;
-use OCP\Files\Storage;
+use OCP\Files\Storage\IStorage;
use Test\TestCase;
class NullStorageTest extends TestCase {
@@ -196,7 +196,7 @@ class NullStorageTest extends TestCase {
}
public function testCopyFromStorage(): void {
- $sourceStorage = $this->createMock(Storage::class);
+ $sourceStorage = $this->createMock(IStorage::class);
$this->expectException(ForbiddenException::class);
$this->expectExceptionMessage('This request is not allowed to access the filesystem');
@@ -205,7 +205,7 @@ class NullStorageTest extends TestCase {
}
public function testMoveFromStorage(): void {
- $sourceStorage = $this->createMock(Storage::class);
+ $sourceStorage = $this->createMock(IStorage::class);
$this->expectException(ForbiddenException::class);
$this->expectExceptionMessage('This request is not allowed to access the filesystem');
@@ -219,7 +219,7 @@ class NullStorageTest extends TestCase {
}
public function testGetOwner(): void {
- $this->assertNull($this->storage->getOwner('foo'));
+ $this->assertFalse($this->storage->getOwner('foo'));
}
public function testGetCache(): void {
diff --git a/tests/lib/Mail/MailerTest.php b/tests/lib/Mail/MailerTest.php
index 9f37b776f17..f215e385e3f 100644
--- a/tests/lib/Mail/MailerTest.php
+++ b/tests/lib/Mail/MailerTest.php
@@ -12,6 +12,7 @@ use OC\Mail\Mailer;
use OC\Mail\Message;
use OCP\Defaults;
use OCP\EventDispatcher\IEventDispatcher;
+use OCP\IBinaryFinder;
use OCP\IConfig;
use OCP\IL10N;
use OCP\IURLGenerator;
@@ -86,7 +87,7 @@ class MailerTest extends TestCase {
['mail_sendmailmode', 'smtp', $sendmailMode],
]);
- $path = \OC_Helper::findBinaryPath('sendmail');
+ $path = \OCP\Server::get(IBinaryFinder::class)->findBinaryPath('sendmail');
if ($path === false) {
$path = '/usr/sbin/sendmail';
}
diff --git a/apps/settings/tests/SetupChecks/CheckServerResponseTraitImplementation.php b/tests/lib/SetupCheck/CheckServerResponseTraitImplementation.php
index 6c8b65855cc..1119c5ed0d9 100644
--- a/apps/settings/tests/SetupChecks/CheckServerResponseTraitImplementation.php
+++ b/tests/lib/SetupCheck/CheckServerResponseTraitImplementation.php
@@ -6,13 +6,13 @@ declare(strict_types=1);
* SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
-namespace OCA\Settings\Tests\SetupChecks;
+namespace Test\SetupCheck;
-use OCA\Settings\SetupChecks\CheckServerResponseTrait;
use OCP\Http\Client\IClientService;
use OCP\IConfig;
use OCP\IL10N;
use OCP\IURLGenerator;
+use OCP\SetupCheck\CheckServerResponseTrait;
use Psr\Log\LoggerInterface;
/**
@@ -22,7 +22,6 @@ class CheckServerResponseTraitImplementation {
use CheckServerResponseTrait {
CheckServerResponseTrait::getRequestOptions as public;
- CheckServerResponseTrait::runHEAD as public;
CheckServerResponseTrait::runRequest as public;
CheckServerResponseTrait::normalizeUrl as public;
CheckServerResponseTrait::getTestUrls as public;
diff --git a/apps/settings/tests/SetupChecks/CheckServerResponseTraitTest.php b/tests/lib/SetupCheck/CheckServerResponseTraitTest.php
index e51546c1cf1..32fbce64ce6 100644
--- a/apps/settings/tests/SetupChecks/CheckServerResponseTraitTest.php
+++ b/tests/lib/SetupCheck/CheckServerResponseTraitTest.php
@@ -6,7 +6,7 @@ declare(strict_types=1);
* SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
-namespace OCA\Settings\Tests\SetupChecks;
+namespace Test\SetupCheck;
use OCP\Http\Client\IClientService;
use OCP\IConfig;
diff --git a/tests/lib/Share20/ManagerTest.php b/tests/lib/Share20/ManagerTest.php
index 2250e28bd13..d0c43b2862c 100644
--- a/tests/lib/Share20/ManagerTest.php
+++ b/tests/lib/Share20/ManagerTest.php
@@ -23,7 +23,7 @@ use OCP\Files\IRootFolder;
use OCP\Files\Mount\IMountManager;
use OCP\Files\Mount\IMountPoint;
use OCP\Files\Node;
-use OCP\Files\Storage;
+use OCP\Files\Storage\IStorage;
use OCP\HintException;
use OCP\IConfig;
use OCP\IDateTimeZone;
@@ -631,7 +631,7 @@ class ManagerTest extends \Test\TestCase {
$file = $this->createMock(File::class);
$node = $this->createMock(Node::class);
- $storage = $this->createMock(Storage\IStorage::class);
+ $storage = $this->createMock(IStorage::class);
$storage->method('instanceOfStorage')
->with('\OCA\Files_Sharing\External\Storage')
->willReturn(false);
@@ -706,7 +706,7 @@ class ManagerTest extends \Test\TestCase {
$data[] = [$this->createShare(null, IShare::TYPE_GROUP, $limitedPermssions, $group0, $user0, $user0, 17, null, null), 'Cannot increase permissions of path', true];
$data[] = [$this->createShare(null, IShare::TYPE_LINK, $limitedPermssions, null, $user0, $user0, 3, null, null), 'Cannot increase permissions of path', true];
- $nonMovableStorage = $this->createMock(Storage\IStorage::class);
+ $nonMovableStorage = $this->createMock(IStorage::class);
$nonMovableStorage->method('instanceOfStorage')
->with('\OCA\Files_Sharing\External\Storage')
->willReturn(false);
@@ -752,7 +752,7 @@ class ManagerTest extends \Test\TestCase {
$data[] = [$this->createShare(null, IShare::TYPE_LINK, $allPermssions, null, $user0, $user0, 17, null, null), null, false];
- $remoteStorage = $this->createMock(Storage\IStorage::class);
+ $remoteStorage = $this->createMock(IStorage::class);
$remoteStorage->method('instanceOfStorage')
->with('\OCA\Files_Sharing\External\Storage')
->willReturn(true);
@@ -2059,7 +2059,7 @@ class ManagerTest extends \Test\TestCase {
$path->method('getPath')->willReturn('path');
$mount = $this->createMock(IMountPoint::class);
- $storage = $this->createMock(Storage::class);
+ $storage = $this->createMock(IStorage::class);
$mount->method('getStorage')->willReturn($storage);
$storage->method('instanceOfStorage')->with('\OCA\Files_Sharing\ISharedStorage')->willReturn(true);
@@ -2073,7 +2073,7 @@ class ManagerTest extends \Test\TestCase {
$path->method('getPath')->willReturn('path');
$mount = $this->createMock(IMountPoint::class);
- $storage = $this->createMock(Storage::class);
+ $storage = $this->createMock(IStorage::class);
$mount->method('getStorage')->willReturn($storage);
$storage->method('instanceOfStorage')->with('\OCA\Files_Sharing\ISharedStorage')->willReturn(false);
@@ -2221,7 +2221,7 @@ class ManagerTest extends \Test\TestCase {
$shareOwner = $this->createMock(IUser::class);
$shareOwner->method('getUID')->willReturn('shareOwner');
- $storage = $this->createMock(Storage::class);
+ $storage = $this->createMock(IStorage::class);
$path = $this->createMock(File::class);
$path->method('getOwner')->willReturn($shareOwner);
$path->method('getName')->willReturn('target');
@@ -2276,7 +2276,7 @@ class ManagerTest extends \Test\TestCase {
$shareOwner = $this->createMock(IUser::class);
$shareOwner->method('getUID')->willReturn('shareOwner');
- $storage = $this->createMock(Storage::class);
+ $storage = $this->createMock(IStorage::class);
$path = $this->createMock(File::class);
$path->method('getOwner')->willReturn($shareOwner);
$path->method('getName')->willReturn('target');
@@ -2339,7 +2339,7 @@ class ManagerTest extends \Test\TestCase {
$shareOwner = $this->createMock(IUser::class);
$shareOwner->method('getUID')->willReturn('shareOwner');
- $storage = $this->createMock(Storage::class);
+ $storage = $this->createMock(IStorage::class);
$path = $this->createMock(File::class);
$path->method('getOwner')->willReturn($shareOwner);
$path->method('getName')->willReturn('target');
@@ -2459,7 +2459,7 @@ class ManagerTest extends \Test\TestCase {
$shareOwner = $this->createMock(IUser::class);
$shareOwner->method('getUID')->willReturn('shareOwner');
- $storage = $this->createMock(Storage::class);
+ $storage = $this->createMock(IStorage::class);
$path = $this->createMock(File::class);
$path->method('getOwner')->willReturn($shareOwner);
$path->method('getName')->willReturn('target');
@@ -2563,7 +2563,7 @@ class ManagerTest extends \Test\TestCase {
$shareOwner = $this->createMock(IUser::class);
$shareOwner->method('getUID')->willReturn('shareOwner');
- $storage = $this->createMock(Storage::class);
+ $storage = $this->createMock(IStorage::class);
$path = $this->createMock(File::class);
$path->method('getOwner')->willReturn($shareOwner);
$path->method('getName')->willReturn('target');
@@ -2623,12 +2623,12 @@ class ManagerTest extends \Test\TestCase {
$shareOwner = $this->createMock(IUser::class);
$shareOwner->method('getUID')->willReturn('shareOwner');
- $storage = $this->createMock(Storage::class);
+ $storage = $this->createMock(IStorage::class);
$storage->method('instanceOfStorage')
->with('OCA\Files_Sharing\External\Storage')
->willReturn(true);
- $storage2 = $this->createMock(Storage::class);
+ $storage2 = $this->createMock(IStorage::class);
$storage2->method('instanceOfStorage')
->with('OCA\Files_Sharing\External\Storage')
->willReturn(false);