aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--apps/dav/lib/CardDAV/AddressBookImpl.php2
-rw-r--r--apps/files/lib/BackgroundJob/CleanupFileLocks.php1
-rw-r--r--apps/files/lib/Controller/ApiController.php10
-rw-r--r--apps/files/lib/Controller/ViewController.php3
-rw-r--r--apps/files/tests/Controller/ViewControllerTest.php2
-rw-r--r--apps/user_ldap/lib/Access.php28
-rw-r--r--core/Application.php14
-rw-r--r--core/css/variables.scss2
-rw-r--r--lib/composer/composer/autoload_classmap.php1
-rw-r--r--lib/composer/composer/autoload_static.php1
-rw-r--r--lib/private/Authentication/Listeners/RemoteWipeEmailListener.php171
-rw-r--r--settings/js/vue-4.js2
-rw-r--r--settings/js/vue-4.js.map2
-rw-r--r--settings/src/components/appList/appItem.vue6
-rw-r--r--tests/lib/Authentication/Listeners/RemoteWipeEmailListenerTest.php241
15 files changed, 472 insertions, 14 deletions
diff --git a/apps/dav/lib/CardDAV/AddressBookImpl.php b/apps/dav/lib/CardDAV/AddressBookImpl.php
index ae727b8544f..351e064595b 100644
--- a/apps/dav/lib/CardDAV/AddressBookImpl.php
+++ b/apps/dav/lib/CardDAV/AddressBookImpl.php
@@ -269,7 +269,7 @@ class AddressBookImpl implements IAddressBook {
}
// The following properties can be set multiple times
- } else if (in_array($property->name, ['CLOUD', 'EMAIL', 'IMPP', 'TEL', 'URL'])) {
+ } else if (in_array($property->name, ['CLOUD', 'EMAIL', 'IMPP', 'TEL', 'URL', 'X-ADDRESSBOOKSERVER-MEMBER'])) {
if (!isset($result[$property->name])) {
$result[$property->name] = [];
}
diff --git a/apps/files/lib/BackgroundJob/CleanupFileLocks.php b/apps/files/lib/BackgroundJob/CleanupFileLocks.php
index f4898b24873..df4542386e9 100644
--- a/apps/files/lib/BackgroundJob/CleanupFileLocks.php
+++ b/apps/files/lib/BackgroundJob/CleanupFileLocks.php
@@ -48,6 +48,7 @@ class CleanupFileLocks extends TimedJob {
* Makes the background job do its work
*
* @param array $argument unused argument
+ * @throws \Exception
*/
public function run($argument) {
$lockingProvider = \OC::$server->getLockingProvider();
diff --git a/apps/files/lib/Controller/ApiController.php b/apps/files/lib/Controller/ApiController.php
index f9e4bcb5738..38c378d480d 100644
--- a/apps/files/lib/Controller/ApiController.php
+++ b/apps/files/lib/Controller/ApiController.php
@@ -242,6 +242,7 @@ class ApiController extends Controller {
* @param string $mode
* @param string $direction
* @return Response
+ * @throws \OCP\PreConditionNotMetException
*/
public function updateFileSorting($mode, $direction) {
$allowedMode = ['name', 'size', 'mtime'];
@@ -262,6 +263,8 @@ class ApiController extends Controller {
* @NoAdminRequired
*
* @param bool $show
+ * @return Response
+ * @throws \OCP\PreConditionNotMetException
*/
public function showHiddenFiles($show) {
$this->config->setUserValue($this->userSession->getUser()->getUID(), 'files', 'show_hidden', (int)$show);
@@ -274,6 +277,8 @@ class ApiController extends Controller {
* @NoAdminRequired
*
* @param bool $show
+ * @return Response
+ * @throws \OCP\PreConditionNotMetException
*/
public function showGridView($show) {
$this->config->setUserValue($this->userSession->getUser()->getUID(), 'files', 'show_grid', (int)$show);
@@ -295,10 +300,11 @@ class ApiController extends Controller {
*
* @NoAdminRequired
*
- * @param bool $show
- * @param bool $key the key of the folder
+ * @param int $show
+ * @param string $key the key of the folder
*
* @return Response
+ * @throws \OCP\PreConditionNotMetException
*/
public function toggleShowFolder(int $show, string $key) {
// ensure the edited key exists
diff --git a/apps/files/lib/Controller/ViewController.php b/apps/files/lib/Controller/ViewController.php
index 49f1818780b..1bcc3e4c7f9 100644
--- a/apps/files/lib/Controller/ViewController.php
+++ b/apps/files/lib/Controller/ViewController.php
@@ -136,6 +136,7 @@ class ViewController extends Controller {
*
* @param string $fileid
* @return TemplateResponse|RedirectResponse
+ * @throws NotFoundException
*/
public function showFile(string $fileid = null): Response {
// This is the entry point from the `/f/{fileid}` URL which is hardcoded in the server.
@@ -153,7 +154,9 @@ class ViewController extends Controller {
* @param string $dir
* @param string $view
* @param string $fileid
+ * @param bool $fileNotFound
* @return TemplateResponse|RedirectResponse
+ * @throws NotFoundException
*/
public function index($dir = '', $view = '', $fileid = null, $fileNotFound = false) {
if ($fileid !== null) {
diff --git a/apps/files/tests/Controller/ViewControllerTest.php b/apps/files/tests/Controller/ViewControllerTest.php
index d051ab7258d..5f22648b279 100644
--- a/apps/files/tests/Controller/ViewControllerTest.php
+++ b/apps/files/tests/Controller/ViewControllerTest.php
@@ -141,7 +141,7 @@ class ViewControllerTest extends TestCase {
$nav = new Template('files', 'appnavigation');
$nav->assign('usage_relative', 123);
- $nav->assign('usage', '123 B');
+ $nav->assign('usage', '100 KB');
$nav->assign('quota', 100);
$nav->assign('total_space', '100 B');
//$nav->assign('webdavurl', '');
diff --git a/apps/user_ldap/lib/Access.php b/apps/user_ldap/lib/Access.php
index 5db9dddf8fa..406dad05ebe 100644
--- a/apps/user_ldap/lib/Access.php
+++ b/apps/user_ldap/lib/Access.php
@@ -454,9 +454,11 @@ class Access extends LDAPUtility {
/**
* returns the internal Nextcloud name for the given LDAP DN of the group, false on DN outside of search DN or failure
+ *
* @param string $fdn the dn of the group object
* @param string $ldapName optional, the display name of the object
* @return string|false with the name to use in Nextcloud, false on DN outside of search DN
+ * @throws \Exception
*/
public function dn2groupname($fdn, $ldapName = null) {
//To avoid bypassing the base DN settings under certain circumstances
@@ -511,9 +513,11 @@ class Access extends LDAPUtility {
/**
* returns the internal Nextcloud name for the given LDAP DN of the user, false on DN outside of search DN or failure
+ *
* @param string $dn the dn of the user object
* @param string $ldapName optional, the display name of the object
* @return string|false with with the name to use in Nextcloud
+ * @throws \Exception
*/
public function dn2username($fdn, $ldapName = null) {
//To avoid bypassing the base DN settings under certain circumstances
@@ -654,10 +658,12 @@ class Access extends LDAPUtility {
/**
* gives back the user names as they are used ownClod internally
+ *
* @param array $ldapUsers as returned by fetchList()
* @return array an array with the user names to use in Nextcloud
*
* gives back the user names as they are used ownClod internally
+ * @throws \Exception
*/
public function nextcloudUserNames($ldapUsers) {
return $this->ldap2NextcloudNames($ldapUsers, true);
@@ -665,10 +671,12 @@ class Access extends LDAPUtility {
/**
* gives back the group names as they are used ownClod internally
+ *
* @param array $ldapGroups as returned by fetchList()
* @return array an array with the group names to use in Nextcloud
*
* gives back the group names as they are used ownClod internally
+ * @throws \Exception
*/
public function nextcloudGroupNames($ldapGroups) {
return $this->ldap2NextcloudNames($ldapGroups, false);
@@ -753,9 +761,11 @@ class Access extends LDAPUtility {
/**
* caches the user display name
+ *
* @param string $ocName the internal Nextcloud username
* @param string $displayName the display name
* @param string $displayName2 the second display name
+ * @throws \Exception
*/
public function cacheUserDisplayName($ocName, $displayName, $displayName2 = '') {
$user = $this->userManager->get($ocName);
@@ -885,6 +895,7 @@ class Access extends LDAPUtility {
* @param int $offset
* @param bool $forceApplyAttributes
* @return array
+ * @throws \Exception
*/
public function fetchListOfUsers($filter, $attr, $limit = null, $offset = null, $forceApplyAttributes = false) {
$ldapRecords = $this->searchUsers($filter, $attr, $limit, $offset);
@@ -973,6 +984,7 @@ class Access extends LDAPUtility {
/**
* executes an LDAP search, optimized for Users
+ *
* @param string $filter the LDAP filter for the search
* @param string|string[] $attr optional, when a certain attribute shall be filtered out
* @param integer $limit
@@ -980,6 +992,7 @@ class Access extends LDAPUtility {
* @return array with the search result
*
* Executes an LDAP search
+ * @throws ServerNotAvailableException
*/
public function searchUsers($filter, $attr = null, $limit = null, $offset = null) {
$result = [];
@@ -995,6 +1008,7 @@ class Access extends LDAPUtility {
* @param int $limit
* @param int $offset
* @return false|int
+ * @throws ServerNotAvailableException
*/
public function countUsers($filter, $attr = array('dn'), $limit = null, $offset = null) {
$result = false;
@@ -1007,6 +1021,7 @@ class Access extends LDAPUtility {
/**
* executes an LDAP search, optimized for Groups
+ *
* @param string $filter the LDAP filter for the search
* @param string|string[] $attr optional, when a certain attribute shall be filtered out
* @param integer $limit
@@ -1014,6 +1029,7 @@ class Access extends LDAPUtility {
* @return array with the search result
*
* Executes an LDAP search
+ * @throws ServerNotAvailableException
*/
public function searchGroups($filter, $attr = null, $limit = null, $offset = null) {
$result = [];
@@ -1025,11 +1041,13 @@ class Access extends LDAPUtility {
/**
* returns the number of available groups
+ *
* @param string $filter the LDAP search filter
* @param string[] $attr optional
* @param int|null $limit
* @param int|null $offset
* @return int|bool
+ * @throws ServerNotAvailableException
*/
public function countGroups($filter, $attr = array('dn'), $limit = null, $offset = null) {
$result = false;
@@ -1046,6 +1064,7 @@ class Access extends LDAPUtility {
* @param int|null $limit
* @param int|null $offset
* @return int|bool
+ * @throws ServerNotAvailableException
*/
public function countObjects($limit = null, $offset = null) {
$result = false;
@@ -1149,6 +1168,7 @@ class Access extends LDAPUtility {
/**
* processes an LDAP paged search operation
+ *
* @param array $sr the array containing the LDAP search resources
* @param string $filter the LDAP filter for the search
* @param array $base an array containing the LDAP subtree(s) that shall be searched
@@ -1159,6 +1179,7 @@ class Access extends LDAPUtility {
* @param bool $skipHandling required for paged search when cookies to
* prior results need to be gained
* @return bool cookie validity, true if we have more pages, false otherwise.
+ * @throws ServerNotAvailableException
*/
private function processPagedSearchStatus($sr, $filter, $base, $iFoundItems, $limit, $offset, $pagedSearchOK, $skipHandling) {
$cookie = null;
@@ -1251,6 +1272,7 @@ class Access extends LDAPUtility {
/**
* @param array $searchResults
* @return int
+ * @throws ServerNotAvailableException
*/
private function countEntriesInSearchResults($searchResults) {
$counter = 0;
@@ -1656,6 +1678,7 @@ class Access extends LDAPUtility {
* @param bool $force the detection should be run, even if it is not set to auto
* @param array|null $ldapRecord
* @return bool true on success, false otherwise
+ * @throws ServerNotAvailableException
*/
private function detectUuidAttribute($dn, $isUser = true, $force = false, array $ldapRecord = null) {
if($isUser) {
@@ -1711,6 +1734,7 @@ class Access extends LDAPUtility {
* @param bool $isUser
* @param null $ldapRecord
* @return bool|string
+ * @throws ServerNotAvailableException
*/
public function getUUID($dn, $isUser = true, $ldapRecord = null) {
if($isUser) {
@@ -1816,8 +1840,10 @@ class Access extends LDAPUtility {
/**
* gets a SID of the domain of the given dn
+ *
* @param string $dn
* @return string|bool
+ * @throws ServerNotAvailableException
*/
public function getSID($dn) {
$domainDN = $this->getDomainDNFromDN($dn);
@@ -1986,12 +2012,14 @@ class Access extends LDAPUtility {
/**
* Prepares a paged search, if possible
+ *
* @param string $filter the LDAP filter for the search
* @param string[] $bases an array containing the LDAP subtree(s) that shall be searched
* @param string[] $attr optional, when a certain attribute shall be filtered outside
* @param int $limit
* @param int $offset
* @return bool|true
+ * @throws ServerNotAvailableException
*/
private function initPagedSearch($filter, $bases, $attr, $limit, $offset) {
$pagedSearchOK = false;
diff --git a/core/Application.php b/core/Application.php
index 97ebae774dd..9655a8e1a47 100644
--- a/core/Application.php
+++ b/core/Application.php
@@ -31,6 +31,7 @@ namespace OC\Core;
use OC\Authentication\Events\RemoteWipeFinished;
use OC\Authentication\Events\RemoteWipeStarted;
use OC\Authentication\Listeners\RemoteWipeActivityListener;
+use OC\Authentication\Listeners\RemoteWipeEmailListener;
use OC\Authentication\Listeners\RemoteWipeNotificationsListener;
use OC\Authentication\Notifications\Notifier as AuthenticationNotifier;
use OC\Core\Notification\RemoveLinkSharesNotifier;
@@ -64,19 +65,19 @@ class Application extends App {
$eventDispatcher = $server->query(IEventDispatcher::class);
$notificationManager = $server->getNotificationManager();
- $notificationManager->registerNotifier(function() use ($server) {
+ $notificationManager->registerNotifier(function () use ($server) {
return new RemoveLinkSharesNotifier(
$server->getL10NFactory()
);
- }, function() {
+ }, function () {
return [
'id' => 'core',
'name' => 'core',
];
});
- $notificationManager->registerNotifier(function() use ($server) {
+ $notificationManager->registerNotifier(function () use ($server) {
return $server->query(AuthenticationNotifier::class);
- }, function() {
+ }, function () {
return [
'id' => 'auth',
'name' => 'authentication notifier',
@@ -84,7 +85,7 @@ class Application extends App {
});
$eventDispatcher->addListener(IDBConnection::CHECK_MISSING_INDEXES_EVENT,
- function(GenericEvent $event) use ($container) {
+ function (GenericEvent $event) use ($container) {
/** @var MissingIndexInformation $subject */
$subject = $event->getSubject();
@@ -165,7 +166,10 @@ class Application extends App {
$eventDispatcher->addServiceListener(RemoteWipeStarted::class, RemoteWipeActivityListener::class);
$eventDispatcher->addServiceListener(RemoteWipeStarted::class, RemoteWipeNotificationsListener::class);
+ $eventDispatcher->addServiceListener(RemoteWipeStarted::class, RemoteWipeEmailListener::class);
$eventDispatcher->addServiceListener(RemoteWipeFinished::class, RemoteWipeActivityListener::class);
$eventDispatcher->addServiceListener(RemoteWipeFinished::class, RemoteWipeNotificationsListener::class);
+ $eventDispatcher->addServiceListener(RemoteWipeFinished::class, RemoteWipeEmailListener::class);
}
+
}
diff --git a/core/css/variables.scss b/core/css/variables.scss
index 7eacdd8f9e4..8a13121ba7d 100644
--- a/core/css/variables.scss
+++ b/core/css/variables.scss
@@ -79,7 +79,7 @@ $border-radius-large: 10px !default;
// Pill-style button, value is large so big buttons also have correct roundness
$border-radius-pill: 100px !default;
-$font-face: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';
+$font-face: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol' !default;
$animation-quick: 100ms;
$animation-slow: 300ms;
diff --git a/lib/composer/composer/autoload_classmap.php b/lib/composer/composer/autoload_classmap.php
index 80c03a6e63a..f608ce0b77c 100644
--- a/lib/composer/composer/autoload_classmap.php
+++ b/lib/composer/composer/autoload_classmap.php
@@ -522,6 +522,7 @@ return array(
'OC\\Authentication\\Exceptions\\UserAlreadyLoggedInException' => $baseDir . '/lib/private/Authentication/Exceptions/UserAlreadyLoggedInException.php',
'OC\\Authentication\\Exceptions\\WipeTokenException' => $baseDir . '/lib/private/Authentication/Exceptions/WipeTokenException.php',
'OC\\Authentication\\Listeners\\RemoteWipeActivityListener' => $baseDir . '/lib/private/Authentication/Listeners/RemoteWipeActivityListener.php',
+ 'OC\\Authentication\\Listeners\\RemoteWipeEmailListener' => $baseDir . '/lib/private/Authentication/Listeners/RemoteWipeEmailListener.php',
'OC\\Authentication\\Listeners\\RemoteWipeNotificationsListener' => $baseDir . '/lib/private/Authentication/Listeners/RemoteWipeNotificationsListener.php',
'OC\\Authentication\\LoginCredentials\\Credentials' => $baseDir . '/lib/private/Authentication/LoginCredentials/Credentials.php',
'OC\\Authentication\\LoginCredentials\\Store' => $baseDir . '/lib/private/Authentication/LoginCredentials/Store.php',
diff --git a/lib/composer/composer/autoload_static.php b/lib/composer/composer/autoload_static.php
index 0eaa457464c..fc4fc585e60 100644
--- a/lib/composer/composer/autoload_static.php
+++ b/lib/composer/composer/autoload_static.php
@@ -556,6 +556,7 @@ class ComposerStaticInit53792487c5a8370acc0b06b1a864ff4c
'OC\\Authentication\\Exceptions\\UserAlreadyLoggedInException' => __DIR__ . '/../../..' . '/lib/private/Authentication/Exceptions/UserAlreadyLoggedInException.php',
'OC\\Authentication\\Exceptions\\WipeTokenException' => __DIR__ . '/../../..' . '/lib/private/Authentication/Exceptions/WipeTokenException.php',
'OC\\Authentication\\Listeners\\RemoteWipeActivityListener' => __DIR__ . '/../../..' . '/lib/private/Authentication/Listeners/RemoteWipeActivityListener.php',
+ 'OC\\Authentication\\Listeners\\RemoteWipeEmailListener' => __DIR__ . '/../../..' . '/lib/private/Authentication/Listeners/RemoteWipeEmailListener.php',
'OC\\Authentication\\Listeners\\RemoteWipeNotificationsListener' => __DIR__ . '/../../..' . '/lib/private/Authentication/Listeners/RemoteWipeNotificationsListener.php',
'OC\\Authentication\\LoginCredentials\\Credentials' => __DIR__ . '/../../..' . '/lib/private/Authentication/LoginCredentials/Credentials.php',
'OC\\Authentication\\LoginCredentials\\Store' => __DIR__ . '/../../..' . '/lib/private/Authentication/LoginCredentials/Store.php',
diff --git a/lib/private/Authentication/Listeners/RemoteWipeEmailListener.php b/lib/private/Authentication/Listeners/RemoteWipeEmailListener.php
new file mode 100644
index 00000000000..be431747389
--- /dev/null
+++ b/lib/private/Authentication/Listeners/RemoteWipeEmailListener.php
@@ -0,0 +1,171 @@
+<?php declare(strict_types=1);
+
+/**
+ * @copyright 2019 Christoph Wurst <christoph@winzerhof-wurst.at>
+ *
+ * @author 2019 Christoph Wurst <christoph@winzerhof-wurst.at>
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+namespace OC\Authentication\Listeners;
+
+use Exception;
+use OC\Authentication\Events\RemoteWipeFinished;
+use OC\Authentication\Events\RemoteWipeStarted;
+use OCP\EventDispatcher\Event;
+use OCP\EventDispatcher\IEventListener;
+use OCP\IL10N;
+use OCP\ILogger;
+use OCP\IUser;
+use OCP\IUserManager;
+use OCP\L10N\IFactory as IL10nFactory;
+use OCP\Mail\IMailer;
+use OCP\Mail\IMessage;
+use function substr;
+
+class RemoteWipeEmailListener implements IEventListener {
+
+ /** @var IMailer */
+ private $mailer;
+
+ /** @var IUserManager */
+ private $userManager;
+
+ /** @var IL10N */
+ private $l10n;
+
+ /** @var ILogger */
+ private $logger;
+
+ public function __construct(IMailer $mailer,
+ IUserManager $userManager,
+ IL10nFactory $l10nFactory,
+ ILogger $logger) {
+ $this->mailer = $mailer;
+ $this->userManager = $userManager;
+ $this->l10n = $l10nFactory->get('core');
+ $this->logger = $logger;
+ }
+
+ /**
+ * @param Event $event
+ */
+ public function handle(Event $event): void {
+ if ($event instanceof RemoteWipeStarted) {
+ $uid = $event->getToken()->getUID();
+ $user = $this->userManager->get($uid);
+ if ($user === null) {
+ $this->logger->warning("not sending a wipe started email because user <$uid> does not exist (anymore)");
+ return;
+ }
+ if ($user->getEMailAddress() === null) {
+ $this->logger->info("not sending a wipe started email because user <$uid> has no email set");
+ return;
+ }
+
+ try {
+ $this->mailer->send(
+ $this->getWipingStartedMessage($event, $user)
+ );
+ } catch (Exception $e) {
+ $this->logger->logException($e, [
+ 'message' => "Could not send remote wipe started email to <$uid>",
+ 'level' => ILogger::ERROR,
+ ]);
+ }
+ } else if ($event instanceof RemoteWipeFinished) {
+ $uid = $event->getToken()->getUID();
+ $user = $this->userManager->get($uid);
+ if ($user === null) {
+ $this->logger->warning("not sending a wipe finished email because user <$uid> does not exist (anymore)");
+ return;
+ }
+ if ($user->getEMailAddress() === null) {
+ $this->logger->info("not sending a wipe finished email because user <$uid> has no email set");
+ return;
+ }
+
+ try {
+ $this->mailer->send(
+ $this->getWipingFinishedMessage($event, $user)
+ );
+ } catch (Exception $e) {
+ $this->logger->logException($e, [
+ 'message' => "Could not send remote wipe finished email to <$uid>",
+ 'level' => ILogger::ERROR,
+ ]);
+ }
+ }
+ }
+
+ private function getWipingStartedMessage(RemoteWipeStarted $event, IUser $user): IMessage {
+ $message = $this->mailer->createMessage();
+ $emailTemplate = $this->mailer->createEMailTemplate('auth.RemoteWipeStarted');
+ $plainHeading = $this->l10n->t('Wiping of device %s has started', [$event->getToken()->getName()]);
+ $htmlHeading = $this->l10n->t('Wiping of device »%s« has started', [$event->getToken()->getName()]);
+ $emailTemplate->setSubject(
+ $this->l10n->t(
+ '»%s« started remote wipe',
+ [
+ substr($event->getToken()->getName(), 0, 15)
+ ]
+ )
+ );
+ $emailTemplate->addHeader();
+ $emailTemplate->addHeading(
+ $htmlHeading,
+ $plainHeading
+ );
+ $emailTemplate->addBodyText(
+ $this->l10n->t('Device or application »%s« has started the remote wipe process. You will receive another email once the process has finished', [$event->getToken()->getName()])
+ );
+ $emailTemplate->addFooter();
+ $message->setTo([$user->getEMailAddress()]);
+ $message->useTemplate($emailTemplate);
+
+ return $message;
+ }
+
+ private function getWipingFinishedMessage(RemoteWipeFinished $event, IUser $user): IMessage {
+ $message = $this->mailer->createMessage();
+ $emailTemplate = $this->mailer->createEMailTemplate('auth.RemoteWipeFinished');
+ $plainHeading = $this->l10n->t('Wiping of device %s has finished', [$event->getToken()->getName()]);
+ $htmlHeading = $this->l10n->t('Wiping of device »%s« has finished', [$event->getToken()->getName()]);
+ $emailTemplate->setSubject(
+ $this->l10n->t(
+ '»%s« finished remote wipe',
+ [
+ substr($event->getToken()->getName(), 0, 15)
+ ]
+ )
+ );
+ $emailTemplate->addHeader();
+ $emailTemplate->addHeading(
+ $htmlHeading,
+ $plainHeading
+ );
+ $emailTemplate->addBodyText(
+ $this->l10n->t('Device or application »%s« has finished the remote wipe process.', [$event->getToken()->getName()])
+ );
+ $emailTemplate->addFooter();
+ $message->setTo([$user->getEMailAddress()]);
+ $message->useTemplate($emailTemplate);
+
+ return $message;
+ }
+
+}
diff --git a/settings/js/vue-4.js b/settings/js/vue-4.js
index 19df8c3977a..6bc13ddb5b0 100644
--- a/settings/js/vue-4.js
+++ b/settings/js/vue-4.js
@@ -1,2 +1,2 @@
-(window.webpackJsonp=window.webpackJsonp||[]).push([[4],{67:function(t,e,a){var i=a(73);"string"==typeof i&&(i=[[t.i,i,""]]);var s={hmr:!0,transform:void 0,insertInto:void 0};a(20)(i,s);i.locals&&(t.exports=i.locals)},68:function(t,e,a){var i=a(77);"string"==typeof i&&(i=[[t.i,i,""]]);var s={hmr:!0,transform:void 0,insertInto:void 0};a(20)(i,s);i.locals&&(t.exports=i.locals)},72:function(t,e,a){"use strict";var i=a(67);a.n(i).a},73:function(t,e,a){(t.exports=a(19)(!1)).push([t.i,"\n.force[data-v-1a5a2391] {\n\tbackground: var(--color-main-background);\n\tborder-color: var(--color-error);\n\tcolor: var(--color-error);\n}\n.force[data-v-1a5a2391]:hover,\n.force[data-v-1a5a2391]:active {\n\tbackground: var(--color-error);\n\tborder-color: var(--color-error) !important;\n\tcolor: var(--color-main-background);\n}\n",""])},76:function(t,e,a){"use strict";var i=a(68);a.n(i).a},77:function(t,e,a){(t.exports=a(19)(!1)).push([t.i,"\n.force[data-v-52943dc0] {\n\tbackground: var(--color-main-background);\n\tborder-color: var(--color-error);\n\tcolor: var(--color-error);\n}\n.force[data-v-52943dc0]:hover,\n.force[data-v-52943dc0]:active {\n\tbackground: var(--color-error);\n\tborder-color: var(--color-error) !important;\n\tcolor: var(--color-main-background);\n}\n",""])},78:function(e,a,i){"use strict";i.r(a);var s=i(16),n={name:"appScore",props:["score"],computed:{scoreImage:function(){var t="rating/s"+Math.round(10*this.score)+".svg";return OC.imagePath("core",t)}}},r=i(5),o=Object(r.a)(n,function(){var t=this.$createElement;return(this._self._c||t)("img",{staticClass:"app-score-image",attrs:{src:this.scoreImage}})},[],!1,null,null,null).exports,p={mounted:function(){this.app.groups.length>0&&(this.groupCheckedAppsData=!0)},computed:{appGroups:function(){return this.app.groups.map(function(t){return{id:t,name:t}})},loading:function(){var t=this;return function(e){return t.$store.getters.loading(e)}},installing:function(){return this.$store.getters.loading("install")},enableButtonText:function(){return this.app.needsDownload?t("settings","Download and enable"):t("settings","Enable")},forceEnableButtonText:function(){return this.app.needsDownload,t("settings","Enable untested app")},enableButtonTooltip:function(){return!!this.app.needsDownload&&t("settings","The app will be downloaded from the app store")},forceEnableButtonTooltip:function(){var 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}},methods:{asyncFindGroup:function(t){return this.$store.dispatch("getGroups",{search:t,limit:5,offset:0})},isLimitedToGroups:function(t){return!(!this.app.groups.length&&!this.groupCheckedAppsData)},setGroupLimit:function(){this.groupCheckedAppsData||this.$store.dispatch("enableApp",{appId:this.app.id,groups:[]})},canLimitToGroups:function(t){return!(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:function(t){var e=this.app.groups.concat([]).concat([t.id]);this.$store.dispatch("enableApp",{appId:this.app.id,groups:e})},removeGroupLimitation:function(t){var 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:function(t){this.$store.dispatch("forceEnableApp",{appId:t,groups:[]}).then(function(t){OC.Settings.Apps.rebuildNavigation()}).catch(function(t){OC.Notification.show(t)})},enable:function(t){this.$store.dispatch("enableApp",{appId:t,groups:[]}).then(function(t){OC.Settings.Apps.rebuildNavigation()}).catch(function(t){OC.Notification.show(t)})},disable:function(t){this.$store.dispatch("disableApp",{appId:t}).then(function(t){OC.Settings.Apps.rebuildNavigation()}).catch(function(t){OC.Notification.show(t)})},remove:function(t){this.$store.dispatch("uninstallApp",{appId:t}).then(function(t){OC.Settings.Apps.rebuildNavigation()}).catch(function(t){OC.Notification.show(t)})},install:function(t){this.$store.dispatch("enableApp",{appId:t}).then(function(t){OC.Settings.Apps.rebuildNavigation()}).catch(function(t){OC.Notification.show(t)})},update:function(t){this.$store.dispatch("updateApp",{appId:t}).then(function(t){OC.Settings.Apps.rebuildNavigation()}).catch(function(t){OC.Notification.show(t)})}}},l=Object(r.a)(p,void 0,void 0,!1,null,null,null).exports,c={name:"svgFilterMixin",mounted:function(){this.filterId="invertIconApps"+Math.floor(100*Math.random())+(new Date).getSeconds()+(new Date).getMilliseconds()},computed:{filterUrl:function(){return"url(#".concat(this.filterId,")")}},data:function(){return{filterId:""}}},u=Object(r.a)(c,void 0,void 0,!1,null,null,null).exports,d={name:"appItem",mixins:[l,u],props:{app:{},category:{},listView:{type:Boolean,default:!0}},watch:{"$route.params.id":function(t){this.isSelected=this.app.id===t}},components:{AppScore:o},data:function(){return{isSelected:!1,scrolled:!1}},mounted:function(){this.isSelected=this.app.id===this.$route.params.id},computed:{},watchers:{},methods:{showAppDetails:function(t){"INPUT"!==t.currentTarget.tagName&&"A"!==t.currentTarget.tagName&&this.$router.push({name:"apps-details",params:{category:this.category,id:this.app.id}})},prefix:function(t,e){return t+"_"+e}}},g=(i(72),Object(r.a)(d,function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("div",{staticClass:"section",class:{selected:t.isSelected},on:{click:t.showAppDetails}},[a("div",{staticClass:"app-image app-image-icon",on:{click:t.showAppDetails}},[t.listView&&!t.app.preview||!t.listView&&!t.app.screenshot?a("div",{staticClass:"icon-settings-dark"}):t._e(),t._v(" "),t.listView&&t.app.preview?a("svg",{attrs:{width:"32",height:"32",viewBox:"0 0 32 32"}},[a("defs",[a("filter",{attrs:{id:t.filterId}},[a("feColorMatrix",{attrs:{in:"SourceGraphic",type:"matrix",values:"-1 0 0 0 1 0 -1 0 0 1 0 0 -1 0 1 0 0 0 1 0"}})],1)]),t._v(" "),a("image",{staticClass:"app-icon",attrs:{x:"0",y:"0",width:"32",height:"32",preserveAspectRatio:"xMinYMin meet",filter:t.filterUrl,"xlink:href":t.app.preview}})]):t._e(),t._v(" "),!t.listView&&t.app.screenshot?a("img",{attrs:{src:t.app.screenshot,width:"100%"}}):t._e()]),t._v(" "),a("div",{staticClass:"app-name",on:{click:t.showAppDetails}},[t._v("\n\t\t"+t._s(t.app.name)+"\n\t")]),t._v(" "),t.listView?t._e():a("div",{staticClass:"app-summary"},[t._v(t._s(t.app.summary))]),t._v(" "),t.listView?a("div",{staticClass:"app-version"},[t.app.version?a("span",[t._v(t._s(t.app.version))]):t.app.appstoreData.releases[0].version?a("span",[t._v(t._s(t.app.appstoreData.releases[0].version))]):t._e()]):t._e(),t._v(" "),a("div",{staticClass:"app-level"},[300===t.app.level?a("span",{directives:[{name:"tooltip",rawName:"v-tooltip.auto",value:t.t("settings","This app is supported via your current Nextcloud subscription."),expression:"t('settings', 'This app is supported via your current Nextcloud subscription.')",modifiers:{auto:!0}}],staticClass:"supported icon-checkmark-color"},[t._v("\n\t\t\t"+t._s(t.t("settings","Supported")))]):t._e(),t._v(" "),200===t.app.level?a("span",{directives:[{name:"tooltip",rawName:"v-tooltip.auto",value:t.t("settings","Official apps are developed by and within the community. They offer central functionality and are ready for production use."),expression:"t('settings', 'Official apps are developed by and within the community. They offer central functionality and are ready for production use.')",modifiers:{auto:!0}}],staticClass:"official icon-checkmark"},[t._v("\n\t\t\t"+t._s(t.t("settings","Official")))]):t._e(),t._v(" "),t.listView?t._e():a("app-score",{attrs:{score:t.app.score}})],1),t._v(" "),a("div",{staticClass:"actions"},[t.app.error?a("div",{staticClass:"warning"},[t._v(t._s(t.app.error))]):t._e(),t._v(" "),t.loading(t.app.id)?a("div",{staticClass:"icon icon-loading-small"}):t._e(),t._v(" "),t.app.update?a("input",{staticClass:"update primary",attrs:{type:"button",value:t.t("settings","Update to {update}",{update:t.app.update}),disabled:t.installing||t.loading(t.app.id)},on:{click:function(e){return e.stopPropagation(),t.update(t.app.id)}}}):t._e(),t._v(" "),t.app.canUnInstall?a("input",{staticClass:"uninstall",attrs:{type:"button",value:t.t("settings","Remove"),disabled:t.installing||t.loading(t.app.id)},on:{click:function(e){return e.stopPropagation(),t.remove(t.app.id)}}}):t._e(),t._v(" "),t.app.active?a("input",{staticClass:"enable",attrs:{type:"button",value:t.t("settings","Disable"),disabled:t.installing||t.loading(t.app.id)},on:{click:function(e){return e.stopPropagation(),t.disable(t.app.id)}}}):t._e(),t._v(" "),t.app.active||!t.app.canInstall&&!t.app.isCompatible?t.app.active?t._e():a("input",{directives:[{name:"tooltip",rawName:"v-tooltip.auto",value:t.forceEnableButtonTooltip,expression:"forceEnableButtonTooltip",modifiers:{auto:!0}}],staticClass:"enable force",attrs:{type:"button",value:t.forceEnableButtonText,disabled:t.installing||t.loading(t.app.id)},on:{click:function(e){return e.stopPropagation(),t.forceEnable(t.app.id)}}}):a("input",{directives:[{name:"tooltip",rawName:"v-tooltip.auto",value:t.enableButtonTooltip,expression:"enableButtonTooltip",modifiers:{auto:!0}}],staticClass:"enable",attrs:{type:"button",value:t.enableButtonText,disabled:!t.app.canInstall||t.installing||t.loading(t.app.id)},on:{click:function(e){return e.stopPropagation(),t.enable(t.app.id)}}})])])},[],!1,null,"1a5a2391",null).exports),h={name:"prefixMixin",methods:{prefix:function(t,e){return t+"_"+e}}},v=Object(r.a)(h,void 0,void 0,!1,null,null,null).exports,f={name:"appList",mixins:[v],props:["category","app","search"],components:{appItem:g},computed:{loading:function(){return this.$store.getters.loading("list")},apps:function(){var t=this,e=this.$store.getters.getAllApps.filter(function(e){return-1!==e.name.toLowerCase().search(t.search.toLowerCase())}).sort(function(t,e){var a=""+(t.active?0:1)+(t.update?0:1)+t.name,i=""+(e.active?0:1)+(e.update?0:1)+e.name;return OC.Util.naturalSortCompare(a,i)});return"installed"===this.category?e.filter(function(t){return t.installed}):"enabled"===this.category?e.filter(function(t){return t.active&&t.installed}):"disabled"===this.category?e.filter(function(t){return!t.active&&t.installed}):"app-bundles"===this.category?e.filter(function(t){return t.bundles}):"updates"===this.category?e.filter(function(t){return t.update}):e.filter(function(e){return e.appstore&&void 0!==e.category&&(e.category===t.category||e.category.indexOf(t.category)>-1)})},bundles:function(){return this.$store.getters.getServerData.bundles},bundleApps:function(){return function(t){return this.$store.getters.getAllApps.filter(function(e){return e.bundleId===t})}},searchApps:function(){var t=this;return""===this.search?[]:this.$store.getters.getAllApps.filter(function(e){return-1!==e.name.toLowerCase().search(t.search.toLowerCase())&&!t.apps.find(function(t){return t.id===e.id})})},useAppStoreView:function(){return!this.useListView&&!this.useBundleView},useListView:function(){return"installed"===this.category||"enabled"===this.category||"disabled"===this.category||"updates"===this.category},useBundleView:function(){return"app-bundles"===this.category},allBundlesEnabled:function(){var t=this;return function(e){return 0===t.bundleApps(e).filter(function(t){return!t.active}).length}},bundleToggleText:function(){var e=this;return function(a){return e.allBundlesEnabled(a)?t("settings","Disable all"):t("settings","Enable all")}}},methods:{toggleBundle:function(t){return this.allBundlesEnabled(t)?this.disableBundle(t):this.enableBundle(t)},enableBundle:function(t){var e=this.bundleApps(t).map(function(t){return t.id});this.$store.dispatch("enableApp",{appId:e,groups:[]}).catch(function(t){console.log(t),OC.Notification.show(t)})},disableBundle:function(t){var e=this.bundleApps(t).map(function(t){return t.id});this.$store.dispatch("disableApp",{appId:e,groups:[]}).catch(function(t){OC.Notification.show(t)})}}},m=Object(r.a)(f,function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("div",{attrs:{id:"app-content-inner"}},[a("div",{staticClass:"apps-list",class:{installed:t.useBundleView||t.useListView,store:t.useAppStoreView},attrs:{id:"apps-list"}},[t.useListView?[a("transition-group",{staticClass:"apps-list-container",attrs:{name:"app-list",tag:"div"}},t._l(t.apps,function(e){return a("app-item",{key:e.id,attrs:{app:e,category:t.category}})}),1)]:t._e(),t._v(" "),t._l(t.bundles,function(e){return t.useBundleView&&t.bundleApps(e.id).length>0?[a("transition-group",{staticClass:"apps-list-container",attrs:{name:"app-list",tag:"div"}},[a("div",{key:e.id,staticClass:"apps-header"},[a("div",{staticClass:"app-image"}),t._v(" "),a("h2",[t._v(t._s(e.name)+" "),a("input",{attrs:{type:"button",value:t.bundleToggleText(e.id)},on:{click:function(a){return t.toggleBundle(e.id)}}})]),t._v(" "),a("div",{staticClass:"app-version"}),t._v(" "),a("div",{staticClass:"app-level"}),t._v(" "),a("div",{staticClass:"app-groups"}),t._v(" "),a("div",{staticClass:"actions"},[t._v(" ")])]),t._v(" "),t._l(t.bundleApps(e.id),function(i){return a("app-item",{key:e.id+i.id,attrs:{app:i,category:t.category}})})],2)]:t._e()}),t._v(" "),t.useAppStoreView?t._l(t.apps,function(e){return a("app-item",{key:e.id,attrs:{app:e,category:t.category,"list-view":!1}})}):t._e()],2),t._v(" "),a("div",{staticClass:"apps-list installed",attrs:{id:"apps-list-search"}},[a("div",{staticClass:"apps-list-container"},[""!==t.search&&t.searchApps.length>0?[a("div",{staticClass:"section"},[a("div"),t._v(" "),a("td",{attrs:{colspan:"5"}},[a("h2",[t._v(t._s(t.t("settings","Results from other categories")))])])]),t._v(" "),t._l(t.searchApps,function(e){return a("app-item",{key:e.id,attrs:{app:e,category:t.category,"list-view":!0}})})]:t._e()],2)]),t._v(" "),t.loading||0!==t.searchApps.length||0!==t.apps.length?t._e():a("div",{staticClass:"emptycontent emptycontent-search",attrs:{id:"apps-list-empty"}},[a("div",{staticClass:"icon-settings-dark",attrs:{id:"app-list-empty-icon"}}),t._v(" "),a("h2",[t._v(t._s(t.t("settings","No apps found for your version")))])]),t._v(" "),a("div",{attrs:{id:"searchresults"}})])},[],!1,null,null,null).exports,_=i(2),b=i(69),y=i.n(b),C=i(74),w=i.n(C),A=i(75),k=i.n(A),x={mixins:[l,v,u],name:"appDetails",props:["category","app"],components:{Multiselect:s.Multiselect,AppScore:o},data:function(){return{groupCheckedAppsData:!1}},mounted:function(){this.app.groups.length>0&&(this.groupCheckedAppsData=!0)},computed:{appstoreUrl:function(){return"https://apps.nextcloud.com/apps/".concat(this.app.id)},licence:function(){return this.app.licence?t("settings","{license}-licensed",{license:(""+this.app.licence).toUpperCase()}):null},hasRating:function(){return this.app.appstoreData&&this.app.appstoreData.ratingNumOverall>5},author:function(){return"string"==typeof this.app.author?[{"@value":this.app.author}]:this.app.author["@value"]?[this.app.author]:this.app.author},appGroups:function(){return this.app.groups.map(function(t){return{id:t,name:t}})},groups:function(){return this.$store.getters.getGroups.filter(function(t){return"disabled"!==t.id}).sort(function(t,e){return t.name.localeCompare(e.name)})},renderMarkdown:function(){var t=new w.a.Renderer;return t.link=function(t,e,a){try{var i=decodeURIComponent(unescape(t)).replace(/[^\w:]/g,"").toLowerCase()}catch(t){return""}if(0!==i.indexOf("http:")&&0!==i.indexOf("https:"))return"";var s='<a href="'+t+'" rel="noreferrer noopener"';return e&&(s+=' title="'+e+'"'),s+=">"+a+"</a>"},t.image=function(t,e,a){return a||e},t.blockquote=function(t){return t},k.a.sanitize(w()(this.app.description.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:["strong","p","a","ul","ol","li","em","del","blockquote"]})}}},D=(i(76),Object(r.a)(x,function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("div",{staticStyle:{padding:"20px"},attrs:{id:"app-details-view"}},[a("h2",[t.app.preview?t._e():a("div",{staticClass:"icon-settings-dark"}),t._v(" "),t.app.previewAsIcon&&t.app.preview?a("svg",{attrs:{width:"32",height:"32",viewBox:"0 0 32 32"}},[a("defs",[a("filter",{attrs:{id:t.filterId}},[a("feColorMatrix",{attrs:{in:"SourceGraphic",type:"matrix",values:"-1 0 0 0 1 0 -1 0 0 1 0 0 -1 0 1 0 0 0 1 0"}})],1)]),t._v(" "),a("image",{staticClass:"app-icon",attrs:{x:"0",y:"0",width:"32",height:"32",preserveAspectRatio:"xMinYMin meet",filter:t.filterUrl,"xlink:href":t.app.preview}})]):t._e(),t._v("\n\t\t"+t._s(t.app.name))]),t._v(" "),t.app.screenshot?a("img",{attrs:{src:t.app.screenshot,width:"100%"}}):t._e(),t._v(" "),300===t.app.level||200===t.app.level||t.hasRating?a("div",{staticClass:"app-level"},[300===t.app.level?a("span",{directives:[{name:"tooltip",rawName:"v-tooltip.auto",value:t.t("settings","This app is supported via your current Nextcloud subscription."),expression:"t('settings', 'This app is supported via your current Nextcloud subscription.')",modifiers:{auto:!0}}],staticClass:"supported icon-checkmark-color"},[t._v("\n\t\t\t"+t._s(t.t("settings","Supported")))]):t._e(),t._v(" "),200===t.app.level?a("span",{directives:[{name:"tooltip",rawName:"v-tooltip.auto",value:t.t("settings","Official apps are developed by and within the community. They offer central functionality and are ready for production use."),expression:"t('settings', 'Official apps are developed by and within the community. They offer central functionality and are ready for production use.')",modifiers:{auto:!0}}],staticClass:"official icon-checkmark"},[t._v("\n\t\t\t"+t._s(t.t("settings","Official")))]):t._e(),t._v(" "),t.hasRating?a("app-score",{attrs:{score:t.app.appstoreData.ratingOverall}}):t._e()],1):t._e(),t._v(" "),t.author?a("div",{staticClass:"app-author"},[t._v("\n\t\t"+t._s(t.t("settings","by"))+"\n\t\t"),t._l(t.author,function(e,i){return a("span",[e["@attributes"]&&e["@attributes"].homepage?a("a",{attrs:{href:e["@attributes"].homepage}},[t._v(t._s(e["@value"]))]):e["@value"]?a("span",[t._v(t._s(e["@value"]))]):a("span",[t._v(t._s(e))]),i+1<t.author.length?a("span",[t._v(", ")]):t._e()])})],2):t._e(),t._v(" "),t.licence?a("div",{staticClass:"app-licence"},[t._v(t._s(t.licence))]):t._e(),t._v(" "),a("div",{staticClass:"actions"},[a("div",{staticClass:"actions-buttons"},[t.app.update?a("input",{staticClass:"update primary",attrs:{type:"button",value:t.t("settings","Update to {version}",{version:t.app.update}),disabled:t.installing||t.loading(t.app.id)},on:{click:function(e){return t.update(t.app.id)}}}):t._e(),t._v(" "),t.app.canUnInstall?a("input",{staticClass:"uninstall",attrs:{type:"button",value:t.t("settings","Remove"),disabled:t.installing||t.loading(t.app.id)},on:{click:function(e){return t.remove(t.app.id)}}}):t._e(),t._v(" "),t.app.active?a("input",{staticClass:"enable",attrs:{type:"button",value:t.t("settings","Disable"),disabled:t.installing||t.loading(t.app.id)},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._e():a("input",{directives:[{name:"tooltip",rawName:"v-tooltip.auto",value:t.forceEnableButtonTooltip,expression:"forceEnableButtonTooltip",modifiers:{auto:!0}}],staticClass:"enable force",attrs:{type:"button",value:t.forceEnableButtonText,disabled:t.installing||t.loading(t.app.id)},on:{click:function(e){return t.forceEnable(t.app.id)}}}):a("input",{directives:[{name:"tooltip",rawName:"v-tooltip.auto",value:t.enableButtonTooltip,expression:"enableButtonTooltip",modifiers:{auto:!0}}],staticClass:"enable primary",attrs:{type:"button",value:t.enableButtonText,disabled:!t.app.canInstall||t.installing||t.loading(t.app.id)},on:{click:function(e){return t.enable(t.app.id)}}})]),t._v(" "),a("div",{staticClass:"app-groups"},[t.app.active&&t.canLimitToGroups(t.app)?a("div",{staticClass:"groups-enable"},[a("input",{directives:[{name:"model",rawName:"v-model",value:t.groupCheckedAppsData,expression:"groupCheckedAppsData"}],staticClass:"groups-enable__checkbox checkbox",attrs:{type:"checkbox",id:t.prefix("groups_enable",t.app.id)},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,i=e.target,s=!!i.checked;if(Array.isArray(a)){var n=t.app.id,r=t._i(a,n);i.checked?r<0&&(t.groupCheckedAppsData=a.concat([n])):r>-1&&(t.groupCheckedAppsData=a.slice(0,r).concat(a.slice(r+1)))}else t.groupCheckedAppsData=s},t.setGroupLimit]}}),t._v(" "),a("label",{attrs:{for:t.prefix("groups_enable",t.app.id)}},[t._v(t._s(t.t("settings","Limit to groups")))]),t._v(" "),a("input",{staticClass:"group_select",attrs:{type:"hidden",title:t.t("settings","All"),value:""}}),t._v(" "),t.isLimitedToGroups(t.app)?a("multiselect",{staticClass:"multiselect-vue",attrs:{options:t.groups,value:t.appGroups,"options-limit":5,placeholder:t.t("settings","Limit app usage to groups"),label:"name","track-by":"id",multiple:!0,"close-on-select":!1,"tag-width":60},on:{select:t.addGroupLimitation,remove:t.removeGroupLimitation,"search-change":t.asyncFindGroup}},[a("span",{attrs:{slot:"noResult"},slot:"noResult"},[t._v(t._s(t.t("settings","No results")))])]):t._e()],1):t._e()])]),t._v(" "),a("ul",{staticClass:"app-dependencies"},[t.app.missingMinOwnCloudVersion?a("li",[t._v(t._s(t.t("settings","This app has no minimum Nextcloud version assigned. This will be an error in the future.")))]):t._e(),t._v(" "),t.app.missingMaxOwnCloudVersion?a("li",[t._v(t._s(t.t("settings","This app has no maximum Nextcloud version assigned. This will be an error in the future.")))]):t._e(),t._v(" "),t.app.canInstall?t._e():a("li",[t._v("\n\t\t\t"+t._s(t.t("settings","This app cannot be installed because the following dependencies are not fulfilled:"))+"\n\t\t\t"),a("ul",{staticClass:"missing-dependencies"},t._l(t.app.missingDependencies,function(e){return a("li",[t._v(t._s(e))])}),0)])]),t._v(" "),a("p",{staticClass:"documentation"},[t.app.internal?t._e():a("a",{staticClass:"appslink",attrs:{href:t.appstoreUrl,target:"_blank",rel:"noreferrer noopener"}},[t._v(t._s(t.t("settings","View in store"))+" ↗")]),t._v(" "),t.app.website?a("a",{staticClass:"appslink",attrs:{href:t.app.website,target:"_blank",rel:"noreferrer noopener"}},[t._v(t._s(t.t("settings","Visit website"))+" ↗")]):t._e(),t._v(" "),t.app.bugs?a("a",{staticClass:"appslink",attrs:{href:t.app.bugs,target:"_blank",rel:"noreferrer noopener"}},[t._v(t._s(t.t("settings","Report a bug"))+" ↗")]):t._e(),t._v(" "),t.app.documentation&&t.app.documentation.user?a("a",{staticClass:"appslink",attrs:{href:t.app.documentation.user,target:"_blank",rel:"noreferrer noopener"}},[t._v(t._s(t.t("settings","User documentation"))+" ↗")]):t._e(),t._v(" "),t.app.documentation&&t.app.documentation.admin?a("a",{staticClass:"appslink",attrs:{href:t.app.documentation.admin,target:"_blank",rel:"noreferrer noopener"}},[t._v(t._s(t.t("settings","Admin documentation"))+" ↗")]):t._e(),t._v(" "),t.app.documentation&&t.app.documentation.developer?a("a",{staticClass:"appslink",attrs:{href:t.app.documentation.developer,target:"_blank",rel:"noreferrer noopener"}},[t._v(t._s(t.t("settings","Developer documentation"))+" ↗")]):t._e()]),t._v(" "),a("div",{staticClass:"app-description",domProps:{innerHTML:t._s(t.renderMarkdown)}})])},[],!1,null,"52943dc0",null).exports);_.default.use(y.a);var T={name:"Apps",props:{category:{type:String,default:"installed"},id:{type:String,default:""}},components:{AppContent:s.AppContent,AppNavigation:s.AppNavigation,AppNavigationItem:s.AppNavigationItem,AppSidebar:s.AppSidebar,Content:s.Content,AppDetails:D,AppList:m},methods:{setSearch:function(t){this.searchQuery=t},resetSearch:function(){this.setSearch("")},hideAppDetails:function(){this.$router.push({name:"apps-category",params:{category:this.category}})}},beforeMount:function(){this.$store.dispatch("getCategories"),this.$store.dispatch("getAllApps"),this.$store.dispatch("getGroups",{offset:0,limit:5}),this.$store.commit("setUpdateCount",this.$store.getters.getServerData.updateCount)},mounted:function(){this.appSearch=new OCA.Search(this.setSearch,this.resetSearch)},data:function(){return{searchQuery:""}},watch:{category:function(t,e){this.setSearch("")}},computed:{loading:function(){return this.$store.getters.loading("categories")},loadingList:function(){return this.$store.getters.loading("list")},currentApp:function(){var t=this;return this.apps.find(function(e){return e.id===t.id})},categories:function(){return this.$store.getters.getCategories},apps:function(){return this.$store.getters.getAllApps},updateCount:function(){return this.$store.getters.getUpdateCount},settings:function(){return this.$store.getters.getServerData},menu:function(){var e=this,a=this.$store.getters.getCategories;a=(a=Array.isArray(a)?a:[]).map(function(t){var e={};return e.id="app-category-"+t.ident,e.icon="icon-category-"+t.ident,e.classes=[],e.router={name:"apps-category",params:{category:t.ident}},e.text=t.displayName,e});var i=[{id:"app-category-your-apps",classes:[],router:{name:"apps"},icon:"icon-category-installed",text:t("settings","Your apps")},{id:"app-category-enabled",classes:[],icon:"icon-category-enabled",router:{name:"apps-category",params:{category:"enabled"}},text:t("settings","Active apps")},{id:"app-category-disabled",classes:[],icon:"icon-category-disabled",router:{name:"apps-category",params:{category:"disabled"}},text:t("settings","Disabled apps")}];if(!this.settings.appstoreEnabled)return i;this.$store.getters.getUpdateCount>0&&i.push({id:"app-category-updates",classes:[],icon:"icon-download",router:{name:"apps-category",params:{category:"updates"}},text:t("settings","Updates"),utils:{counter:this.$store.getters.getUpdateCount}}),i.push({id:"app-category-app-bundles",classes:[],icon:"icon-category-app-bundles",router:{name:"apps-category",params:{category:"app-bundles"}},text:t("settings","App bundles")});var s=(a=i.concat(a)).findIndex(function(t){return t.id==="app-category-"+e.category});return s>=0?a[s].classes.push("active"):a[0].classes.push("active"),a.push({id:"app-developer-docs",classes:[],href:this.settings.developerDocumentation,text:t("settings","Developer documentation")+" ↗"}),a}}},N=Object(r.a)(T,function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("Content",{class:{"with-app-sidebar":t.currentApp},attrs:{"app-name":"settings","content-class":{"icon-loading":t.loadingList},"navigation-class":{"icon-loading":t.loading}}},[a("AppNavigation",[a("ul",{attrs:{id:"appscategories"}},t._l(t.menu,function(t){return a("AppNavigationItem",{key:t.key,attrs:{item:t}})}),1)]),t._v(" "),a("AppContent",{staticClass:"app-settings-content",class:{"icon-loading":t.loadingList}},[a("AppList",{attrs:{category:t.category,app:t.currentApp,search:t.searchQuery}})],1),t._v(" "),t.id&&t.currentApp?a("AppSidebar",{on:{close:t.hideAppDetails}},[a("AppDetails",{attrs:{category:t.category,app:t.currentApp}})],1):t._e()],1)},[],!1,null,null,null);a.default=N.exports}}]);
+(window.webpackJsonp=window.webpackJsonp||[]).push([[4],{67:function(t,e,a){var i=a(73);"string"==typeof i&&(i=[[t.i,i,""]]);var s={hmr:!0,transform:void 0,insertInto:void 0};a(20)(i,s);i.locals&&(t.exports=i.locals)},68:function(t,e,a){var i=a(77);"string"==typeof i&&(i=[[t.i,i,""]]);var s={hmr:!0,transform:void 0,insertInto:void 0};a(20)(i,s);i.locals&&(t.exports=i.locals)},72:function(t,e,a){"use strict";var i=a(67);a.n(i).a},73:function(t,e,a){(t.exports=a(19)(!1)).push([t.i,"\n.force[data-v-1304a746] {\n\tbackground: var(--color-main-background);\n\tborder-color: var(--color-error);\n\tcolor: var(--color-error);\n}\n.force[data-v-1304a746]:hover,\n.force[data-v-1304a746]:active {\n\tbackground: var(--color-error);\n\tborder-color: var(--color-error) !important;\n\tcolor: var(--color-main-background);\n}\n",""])},76:function(t,e,a){"use strict";var i=a(68);a.n(i).a},77:function(t,e,a){(t.exports=a(19)(!1)).push([t.i,"\n.force[data-v-52943dc0] {\n\tbackground: var(--color-main-background);\n\tborder-color: var(--color-error);\n\tcolor: var(--color-error);\n}\n.force[data-v-52943dc0]:hover,\n.force[data-v-52943dc0]:active {\n\tbackground: var(--color-error);\n\tborder-color: var(--color-error) !important;\n\tcolor: var(--color-main-background);\n}\n",""])},78:function(e,a,i){"use strict";i.r(a);var s=i(16),n={name:"appScore",props:["score"],computed:{scoreImage:function(){var t="rating/s"+Math.round(10*this.score)+".svg";return OC.imagePath("core",t)}}},r=i(5),o=Object(r.a)(n,function(){var t=this.$createElement;return(this._self._c||t)("img",{staticClass:"app-score-image",attrs:{src:this.scoreImage}})},[],!1,null,null,null).exports,p={mounted:function(){this.app.groups.length>0&&(this.groupCheckedAppsData=!0)},computed:{appGroups:function(){return this.app.groups.map(function(t){return{id:t,name:t}})},loading:function(){var t=this;return function(e){return t.$store.getters.loading(e)}},installing:function(){return this.$store.getters.loading("install")},enableButtonText:function(){return this.app.needsDownload?t("settings","Download and enable"):t("settings","Enable")},forceEnableButtonText:function(){return this.app.needsDownload,t("settings","Enable untested app")},enableButtonTooltip:function(){return!!this.app.needsDownload&&t("settings","The app will be downloaded from the app store")},forceEnableButtonTooltip:function(){var 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}},methods:{asyncFindGroup:function(t){return this.$store.dispatch("getGroups",{search:t,limit:5,offset:0})},isLimitedToGroups:function(t){return!(!this.app.groups.length&&!this.groupCheckedAppsData)},setGroupLimit:function(){this.groupCheckedAppsData||this.$store.dispatch("enableApp",{appId:this.app.id,groups:[]})},canLimitToGroups:function(t){return!(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:function(t){var e=this.app.groups.concat([]).concat([t.id]);this.$store.dispatch("enableApp",{appId:this.app.id,groups:e})},removeGroupLimitation:function(t){var 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:function(t){this.$store.dispatch("forceEnableApp",{appId:t,groups:[]}).then(function(t){OC.Settings.Apps.rebuildNavigation()}).catch(function(t){OC.Notification.show(t)})},enable:function(t){this.$store.dispatch("enableApp",{appId:t,groups:[]}).then(function(t){OC.Settings.Apps.rebuildNavigation()}).catch(function(t){OC.Notification.show(t)})},disable:function(t){this.$store.dispatch("disableApp",{appId:t}).then(function(t){OC.Settings.Apps.rebuildNavigation()}).catch(function(t){OC.Notification.show(t)})},remove:function(t){this.$store.dispatch("uninstallApp",{appId:t}).then(function(t){OC.Settings.Apps.rebuildNavigation()}).catch(function(t){OC.Notification.show(t)})},install:function(t){this.$store.dispatch("enableApp",{appId:t}).then(function(t){OC.Settings.Apps.rebuildNavigation()}).catch(function(t){OC.Notification.show(t)})},update:function(t){this.$store.dispatch("updateApp",{appId:t}).then(function(t){OC.Settings.Apps.rebuildNavigation()}).catch(function(t){OC.Notification.show(t)})}}},l=Object(r.a)(p,void 0,void 0,!1,null,null,null).exports,c={name:"svgFilterMixin",mounted:function(){this.filterId="invertIconApps"+Math.floor(100*Math.random())+(new Date).getSeconds()+(new Date).getMilliseconds()},computed:{filterUrl:function(){return"url(#".concat(this.filterId,")")}},data:function(){return{filterId:""}}},u=Object(r.a)(c,void 0,void 0,!1,null,null,null).exports,d={name:"appItem",mixins:[l,u],props:{app:{},category:{},listView:{type:Boolean,default:!0}},watch:{"$route.params.id":function(t){this.isSelected=this.app.id===t}},components:{AppScore:o},data:function(){return{isSelected:!1,scrolled:!1}},mounted:function(){this.isSelected=this.app.id===this.$route.params.id},computed:{hasRating:function(){return this.app.appstoreData&&this.app.appstoreData.ratingNumOverall>5}},watchers:{},methods:{showAppDetails:function(t){"INPUT"!==t.currentTarget.tagName&&"A"!==t.currentTarget.tagName&&this.$router.push({name:"apps-details",params:{category:this.category,id:this.app.id}})},prefix:function(t,e){return t+"_"+e}}},g=(i(72),Object(r.a)(d,function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("div",{staticClass:"section",class:{selected:t.isSelected},on:{click:t.showAppDetails}},[a("div",{staticClass:"app-image app-image-icon",on:{click:t.showAppDetails}},[t.listView&&!t.app.preview||!t.listView&&!t.app.screenshot?a("div",{staticClass:"icon-settings-dark"}):t._e(),t._v(" "),t.listView&&t.app.preview?a("svg",{attrs:{width:"32",height:"32",viewBox:"0 0 32 32"}},[a("defs",[a("filter",{attrs:{id:t.filterId}},[a("feColorMatrix",{attrs:{in:"SourceGraphic",type:"matrix",values:"-1 0 0 0 1 0 -1 0 0 1 0 0 -1 0 1 0 0 0 1 0"}})],1)]),t._v(" "),a("image",{staticClass:"app-icon",attrs:{x:"0",y:"0",width:"32",height:"32",preserveAspectRatio:"xMinYMin meet",filter:t.filterUrl,"xlink:href":t.app.preview}})]):t._e(),t._v(" "),!t.listView&&t.app.screenshot?a("img",{attrs:{src:t.app.screenshot,width:"100%"}}):t._e()]),t._v(" "),a("div",{staticClass:"app-name",on:{click:t.showAppDetails}},[t._v("\n\t\t"+t._s(t.app.name)+"\n\t")]),t._v(" "),t.listView?t._e():a("div",{staticClass:"app-summary"},[t._v(t._s(t.app.summary))]),t._v(" "),t.listView?a("div",{staticClass:"app-version"},[t.app.version?a("span",[t._v(t._s(t.app.version))]):t.app.appstoreData.releases[0].version?a("span",[t._v(t._s(t.app.appstoreData.releases[0].version))]):t._e()]):t._e(),t._v(" "),a("div",{staticClass:"app-level"},[300===t.app.level?a("span",{directives:[{name:"tooltip",rawName:"v-tooltip.auto",value:t.t("settings","This app is supported via your current Nextcloud subscription."),expression:"t('settings', 'This app is supported via your current Nextcloud subscription.')",modifiers:{auto:!0}}],staticClass:"supported icon-checkmark-color"},[t._v("\n\t\t\t"+t._s(t.t("settings","Supported")))]):t._e(),t._v(" "),200===t.app.level?a("span",{directives:[{name:"tooltip",rawName:"v-tooltip.auto",value:t.t("settings","Official apps are developed by and within the community. They offer central functionality and are ready for production use."),expression:"t('settings', 'Official apps are developed by and within the community. They offer central functionality and are ready for production use.')",modifiers:{auto:!0}}],staticClass:"official icon-checkmark"},[t._v("\n\t\t\t"+t._s(t.t("settings","Official")))]):t._e(),t._v(" "),t.hasRating&&!t.listView?a("app-score",{attrs:{score:t.app.score}}):t._e()],1),t._v(" "),a("div",{staticClass:"actions"},[t.app.error?a("div",{staticClass:"warning"},[t._v(t._s(t.app.error))]):t._e(),t._v(" "),t.loading(t.app.id)?a("div",{staticClass:"icon icon-loading-small"}):t._e(),t._v(" "),t.app.update?a("input",{staticClass:"update primary",attrs:{type:"button",value:t.t("settings","Update to {update}",{update:t.app.update}),disabled:t.installing||t.loading(t.app.id)},on:{click:function(e){return e.stopPropagation(),t.update(t.app.id)}}}):t._e(),t._v(" "),t.app.canUnInstall?a("input",{staticClass:"uninstall",attrs:{type:"button",value:t.t("settings","Remove"),disabled:t.installing||t.loading(t.app.id)},on:{click:function(e){return e.stopPropagation(),t.remove(t.app.id)}}}):t._e(),t._v(" "),t.app.active?a("input",{staticClass:"enable",attrs:{type:"button",value:t.t("settings","Disable"),disabled:t.installing||t.loading(t.app.id)},on:{click:function(e){return e.stopPropagation(),t.disable(t.app.id)}}}):t._e(),t._v(" "),t.app.active||!t.app.canInstall&&!t.app.isCompatible?t.app.active?t._e():a("input",{directives:[{name:"tooltip",rawName:"v-tooltip.auto",value:t.forceEnableButtonTooltip,expression:"forceEnableButtonTooltip",modifiers:{auto:!0}}],staticClass:"enable force",attrs:{type:"button",value:t.forceEnableButtonText,disabled:t.installing||t.loading(t.app.id)},on:{click:function(e){return e.stopPropagation(),t.forceEnable(t.app.id)}}}):a("input",{directives:[{name:"tooltip",rawName:"v-tooltip.auto",value:t.enableButtonTooltip,expression:"enableButtonTooltip",modifiers:{auto:!0}}],staticClass:"enable",attrs:{type:"button",value:t.enableButtonText,disabled:!t.app.canInstall||t.installing||t.loading(t.app.id)},on:{click:function(e){return e.stopPropagation(),t.enable(t.app.id)}}})])])},[],!1,null,"1304a746",null).exports),h={name:"prefixMixin",methods:{prefix:function(t,e){return t+"_"+e}}},v=Object(r.a)(h,void 0,void 0,!1,null,null,null).exports,f={name:"appList",mixins:[v],props:["category","app","search"],components:{appItem:g},computed:{loading:function(){return this.$store.getters.loading("list")},apps:function(){var t=this,e=this.$store.getters.getAllApps.filter(function(e){return-1!==e.name.toLowerCase().search(t.search.toLowerCase())}).sort(function(t,e){var a=""+(t.active?0:1)+(t.update?0:1)+t.name,i=""+(e.active?0:1)+(e.update?0:1)+e.name;return OC.Util.naturalSortCompare(a,i)});return"installed"===this.category?e.filter(function(t){return t.installed}):"enabled"===this.category?e.filter(function(t){return t.active&&t.installed}):"disabled"===this.category?e.filter(function(t){return!t.active&&t.installed}):"app-bundles"===this.category?e.filter(function(t){return t.bundles}):"updates"===this.category?e.filter(function(t){return t.update}):e.filter(function(e){return e.appstore&&void 0!==e.category&&(e.category===t.category||e.category.indexOf(t.category)>-1)})},bundles:function(){return this.$store.getters.getServerData.bundles},bundleApps:function(){return function(t){return this.$store.getters.getAllApps.filter(function(e){return e.bundleId===t})}},searchApps:function(){var t=this;return""===this.search?[]:this.$store.getters.getAllApps.filter(function(e){return-1!==e.name.toLowerCase().search(t.search.toLowerCase())&&!t.apps.find(function(t){return t.id===e.id})})},useAppStoreView:function(){return!this.useListView&&!this.useBundleView},useListView:function(){return"installed"===this.category||"enabled"===this.category||"disabled"===this.category||"updates"===this.category},useBundleView:function(){return"app-bundles"===this.category},allBundlesEnabled:function(){var t=this;return function(e){return 0===t.bundleApps(e).filter(function(t){return!t.active}).length}},bundleToggleText:function(){var e=this;return function(a){return e.allBundlesEnabled(a)?t("settings","Disable all"):t("settings","Enable all")}}},methods:{toggleBundle:function(t){return this.allBundlesEnabled(t)?this.disableBundle(t):this.enableBundle(t)},enableBundle:function(t){var e=this.bundleApps(t).map(function(t){return t.id});this.$store.dispatch("enableApp",{appId:e,groups:[]}).catch(function(t){console.log(t),OC.Notification.show(t)})},disableBundle:function(t){var e=this.bundleApps(t).map(function(t){return t.id});this.$store.dispatch("disableApp",{appId:e,groups:[]}).catch(function(t){OC.Notification.show(t)})}}},m=Object(r.a)(f,function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("div",{attrs:{id:"app-content-inner"}},[a("div",{staticClass:"apps-list",class:{installed:t.useBundleView||t.useListView,store:t.useAppStoreView},attrs:{id:"apps-list"}},[t.useListView?[a("transition-group",{staticClass:"apps-list-container",attrs:{name:"app-list",tag:"div"}},t._l(t.apps,function(e){return a("app-item",{key:e.id,attrs:{app:e,category:t.category}})}),1)]:t._e(),t._v(" "),t._l(t.bundles,function(e){return t.useBundleView&&t.bundleApps(e.id).length>0?[a("transition-group",{staticClass:"apps-list-container",attrs:{name:"app-list",tag:"div"}},[a("div",{key:e.id,staticClass:"apps-header"},[a("div",{staticClass:"app-image"}),t._v(" "),a("h2",[t._v(t._s(e.name)+" "),a("input",{attrs:{type:"button",value:t.bundleToggleText(e.id)},on:{click:function(a){return t.toggleBundle(e.id)}}})]),t._v(" "),a("div",{staticClass:"app-version"}),t._v(" "),a("div",{staticClass:"app-level"}),t._v(" "),a("div",{staticClass:"app-groups"}),t._v(" "),a("div",{staticClass:"actions"},[t._v(" ")])]),t._v(" "),t._l(t.bundleApps(e.id),function(i){return a("app-item",{key:e.id+i.id,attrs:{app:i,category:t.category}})})],2)]:t._e()}),t._v(" "),t.useAppStoreView?t._l(t.apps,function(e){return a("app-item",{key:e.id,attrs:{app:e,category:t.category,"list-view":!1}})}):t._e()],2),t._v(" "),a("div",{staticClass:"apps-list installed",attrs:{id:"apps-list-search"}},[a("div",{staticClass:"apps-list-container"},[""!==t.search&&t.searchApps.length>0?[a("div",{staticClass:"section"},[a("div"),t._v(" "),a("td",{attrs:{colspan:"5"}},[a("h2",[t._v(t._s(t.t("settings","Results from other categories")))])])]),t._v(" "),t._l(t.searchApps,function(e){return a("app-item",{key:e.id,attrs:{app:e,category:t.category,"list-view":!0}})})]:t._e()],2)]),t._v(" "),t.loading||0!==t.searchApps.length||0!==t.apps.length?t._e():a("div",{staticClass:"emptycontent emptycontent-search",attrs:{id:"apps-list-empty"}},[a("div",{staticClass:"icon-settings-dark",attrs:{id:"app-list-empty-icon"}}),t._v(" "),a("h2",[t._v(t._s(t.t("settings","No apps found for your version")))])]),t._v(" "),a("div",{attrs:{id:"searchresults"}})])},[],!1,null,null,null).exports,_=i(2),b=i(69),y=i.n(b),C=i(74),w=i.n(C),A=i(75),k=i.n(A),x={mixins:[l,v,u],name:"appDetails",props:["category","app"],components:{Multiselect:s.Multiselect,AppScore:o},data:function(){return{groupCheckedAppsData:!1}},mounted:function(){this.app.groups.length>0&&(this.groupCheckedAppsData=!0)},computed:{appstoreUrl:function(){return"https://apps.nextcloud.com/apps/".concat(this.app.id)},licence:function(){return this.app.licence?t("settings","{license}-licensed",{license:(""+this.app.licence).toUpperCase()}):null},hasRating:function(){return this.app.appstoreData&&this.app.appstoreData.ratingNumOverall>5},author:function(){return"string"==typeof this.app.author?[{"@value":this.app.author}]:this.app.author["@value"]?[this.app.author]:this.app.author},appGroups:function(){return this.app.groups.map(function(t){return{id:t,name:t}})},groups:function(){return this.$store.getters.getGroups.filter(function(t){return"disabled"!==t.id}).sort(function(t,e){return t.name.localeCompare(e.name)})},renderMarkdown:function(){var t=new w.a.Renderer;return t.link=function(t,e,a){try{var i=decodeURIComponent(unescape(t)).replace(/[^\w:]/g,"").toLowerCase()}catch(t){return""}if(0!==i.indexOf("http:")&&0!==i.indexOf("https:"))return"";var s='<a href="'+t+'" rel="noreferrer noopener"';return e&&(s+=' title="'+e+'"'),s+=">"+a+"</a>"},t.image=function(t,e,a){return a||e},t.blockquote=function(t){return t},k.a.sanitize(w()(this.app.description.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:["strong","p","a","ul","ol","li","em","del","blockquote"]})}}},D=(i(76),Object(r.a)(x,function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("div",{staticStyle:{padding:"20px"},attrs:{id:"app-details-view"}},[a("h2",[t.app.preview?t._e():a("div",{staticClass:"icon-settings-dark"}),t._v(" "),t.app.previewAsIcon&&t.app.preview?a("svg",{attrs:{width:"32",height:"32",viewBox:"0 0 32 32"}},[a("defs",[a("filter",{attrs:{id:t.filterId}},[a("feColorMatrix",{attrs:{in:"SourceGraphic",type:"matrix",values:"-1 0 0 0 1 0 -1 0 0 1 0 0 -1 0 1 0 0 0 1 0"}})],1)]),t._v(" "),a("image",{staticClass:"app-icon",attrs:{x:"0",y:"0",width:"32",height:"32",preserveAspectRatio:"xMinYMin meet",filter:t.filterUrl,"xlink:href":t.app.preview}})]):t._e(),t._v("\n\t\t"+t._s(t.app.name))]),t._v(" "),t.app.screenshot?a("img",{attrs:{src:t.app.screenshot,width:"100%"}}):t._e(),t._v(" "),300===t.app.level||200===t.app.level||t.hasRating?a("div",{staticClass:"app-level"},[300===t.app.level?a("span",{directives:[{name:"tooltip",rawName:"v-tooltip.auto",value:t.t("settings","This app is supported via your current Nextcloud subscription."),expression:"t('settings', 'This app is supported via your current Nextcloud subscription.')",modifiers:{auto:!0}}],staticClass:"supported icon-checkmark-color"},[t._v("\n\t\t\t"+t._s(t.t("settings","Supported")))]):t._e(),t._v(" "),200===t.app.level?a("span",{directives:[{name:"tooltip",rawName:"v-tooltip.auto",value:t.t("settings","Official apps are developed by and within the community. They offer central functionality and are ready for production use."),expression:"t('settings', 'Official apps are developed by and within the community. They offer central functionality and are ready for production use.')",modifiers:{auto:!0}}],staticClass:"official icon-checkmark"},[t._v("\n\t\t\t"+t._s(t.t("settings","Official")))]):t._e(),t._v(" "),t.hasRating?a("app-score",{attrs:{score:t.app.appstoreData.ratingOverall}}):t._e()],1):t._e(),t._v(" "),t.author?a("div",{staticClass:"app-author"},[t._v("\n\t\t"+t._s(t.t("settings","by"))+"\n\t\t"),t._l(t.author,function(e,i){return a("span",[e["@attributes"]&&e["@attributes"].homepage?a("a",{attrs:{href:e["@attributes"].homepage}},[t._v(t._s(e["@value"]))]):e["@value"]?a("span",[t._v(t._s(e["@value"]))]):a("span",[t._v(t._s(e))]),i+1<t.author.length?a("span",[t._v(", ")]):t._e()])})],2):t._e(),t._v(" "),t.licence?a("div",{staticClass:"app-licence"},[t._v(t._s(t.licence))]):t._e(),t._v(" "),a("div",{staticClass:"actions"},[a("div",{staticClass:"actions-buttons"},[t.app.update?a("input",{staticClass:"update primary",attrs:{type:"button",value:t.t("settings","Update to {version}",{version:t.app.update}),disabled:t.installing||t.loading(t.app.id)},on:{click:function(e){return t.update(t.app.id)}}}):t._e(),t._v(" "),t.app.canUnInstall?a("input",{staticClass:"uninstall",attrs:{type:"button",value:t.t("settings","Remove"),disabled:t.installing||t.loading(t.app.id)},on:{click:function(e){return t.remove(t.app.id)}}}):t._e(),t._v(" "),t.app.active?a("input",{staticClass:"enable",attrs:{type:"button",value:t.t("settings","Disable"),disabled:t.installing||t.loading(t.app.id)},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._e():a("input",{directives:[{name:"tooltip",rawName:"v-tooltip.auto",value:t.forceEnableButtonTooltip,expression:"forceEnableButtonTooltip",modifiers:{auto:!0}}],staticClass:"enable force",attrs:{type:"button",value:t.forceEnableButtonText,disabled:t.installing||t.loading(t.app.id)},on:{click:function(e){return t.forceEnable(t.app.id)}}}):a("input",{directives:[{name:"tooltip",rawName:"v-tooltip.auto",value:t.enableButtonTooltip,expression:"enableButtonTooltip",modifiers:{auto:!0}}],staticClass:"enable primary",attrs:{type:"button",value:t.enableButtonText,disabled:!t.app.canInstall||t.installing||t.loading(t.app.id)},on:{click:function(e){return t.enable(t.app.id)}}})]),t._v(" "),a("div",{staticClass:"app-groups"},[t.app.active&&t.canLimitToGroups(t.app)?a("div",{staticClass:"groups-enable"},[a("input",{directives:[{name:"model",rawName:"v-model",value:t.groupCheckedAppsData,expression:"groupCheckedAppsData"}],staticClass:"groups-enable__checkbox checkbox",attrs:{type:"checkbox",id:t.prefix("groups_enable",t.app.id)},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,i=e.target,s=!!i.checked;if(Array.isArray(a)){var n=t.app.id,r=t._i(a,n);i.checked?r<0&&(t.groupCheckedAppsData=a.concat([n])):r>-1&&(t.groupCheckedAppsData=a.slice(0,r).concat(a.slice(r+1)))}else t.groupCheckedAppsData=s},t.setGroupLimit]}}),t._v(" "),a("label",{attrs:{for:t.prefix("groups_enable",t.app.id)}},[t._v(t._s(t.t("settings","Limit to groups")))]),t._v(" "),a("input",{staticClass:"group_select",attrs:{type:"hidden",title:t.t("settings","All"),value:""}}),t._v(" "),t.isLimitedToGroups(t.app)?a("multiselect",{staticClass:"multiselect-vue",attrs:{options:t.groups,value:t.appGroups,"options-limit":5,placeholder:t.t("settings","Limit app usage to groups"),label:"name","track-by":"id",multiple:!0,"close-on-select":!1,"tag-width":60},on:{select:t.addGroupLimitation,remove:t.removeGroupLimitation,"search-change":t.asyncFindGroup}},[a("span",{attrs:{slot:"noResult"},slot:"noResult"},[t._v(t._s(t.t("settings","No results")))])]):t._e()],1):t._e()])]),t._v(" "),a("ul",{staticClass:"app-dependencies"},[t.app.missingMinOwnCloudVersion?a("li",[t._v(t._s(t.t("settings","This app has no minimum Nextcloud version assigned. This will be an error in the future.")))]):t._e(),t._v(" "),t.app.missingMaxOwnCloudVersion?a("li",[t._v(t._s(t.t("settings","This app has no maximum Nextcloud version assigned. This will be an error in the future.")))]):t._e(),t._v(" "),t.app.canInstall?t._e():a("li",[t._v("\n\t\t\t"+t._s(t.t("settings","This app cannot be installed because the following dependencies are not fulfilled:"))+"\n\t\t\t"),a("ul",{staticClass:"missing-dependencies"},t._l(t.app.missingDependencies,function(e){return a("li",[t._v(t._s(e))])}),0)])]),t._v(" "),a("p",{staticClass:"documentation"},[t.app.internal?t._e():a("a",{staticClass:"appslink",attrs:{href:t.appstoreUrl,target:"_blank",rel:"noreferrer noopener"}},[t._v(t._s(t.t("settings","View in store"))+" ↗")]),t._v(" "),t.app.website?a("a",{staticClass:"appslink",attrs:{href:t.app.website,target:"_blank",rel:"noreferrer noopener"}},[t._v(t._s(t.t("settings","Visit website"))+" ↗")]):t._e(),t._v(" "),t.app.bugs?a("a",{staticClass:"appslink",attrs:{href:t.app.bugs,target:"_blank",rel:"noreferrer noopener"}},[t._v(t._s(t.t("settings","Report a bug"))+" ↗")]):t._e(),t._v(" "),t.app.documentation&&t.app.documentation.user?a("a",{staticClass:"appslink",attrs:{href:t.app.documentation.user,target:"_blank",rel:"noreferrer noopener"}},[t._v(t._s(t.t("settings","User documentation"))+" ↗")]):t._e(),t._v(" "),t.app.documentation&&t.app.documentation.admin?a("a",{staticClass:"appslink",attrs:{href:t.app.documentation.admin,target:"_blank",rel:"noreferrer noopener"}},[t._v(t._s(t.t("settings","Admin documentation"))+" ↗")]):t._e(),t._v(" "),t.app.documentation&&t.app.documentation.developer?a("a",{staticClass:"appslink",attrs:{href:t.app.documentation.developer,target:"_blank",rel:"noreferrer noopener"}},[t._v(t._s(t.t("settings","Developer documentation"))+" ↗")]):t._e()]),t._v(" "),a("div",{staticClass:"app-description",domProps:{innerHTML:t._s(t.renderMarkdown)}})])},[],!1,null,"52943dc0",null).exports);_.default.use(y.a);var N={name:"Apps",props:{category:{type:String,default:"installed"},id:{type:String,default:""}},components:{AppContent:s.AppContent,AppNavigation:s.AppNavigation,AppNavigationItem:s.AppNavigationItem,AppSidebar:s.AppSidebar,Content:s.Content,AppDetails:D,AppList:m},methods:{setSearch:function(t){this.searchQuery=t},resetSearch:function(){this.setSearch("")},hideAppDetails:function(){this.$router.push({name:"apps-category",params:{category:this.category}})}},beforeMount:function(){this.$store.dispatch("getCategories"),this.$store.dispatch("getAllApps"),this.$store.dispatch("getGroups",{offset:0,limit:5}),this.$store.commit("setUpdateCount",this.$store.getters.getServerData.updateCount)},mounted:function(){this.appSearch=new OCA.Search(this.setSearch,this.resetSearch)},data:function(){return{searchQuery:""}},watch:{category:function(t,e){this.setSearch("")}},computed:{loading:function(){return this.$store.getters.loading("categories")},loadingList:function(){return this.$store.getters.loading("list")},currentApp:function(){var t=this;return this.apps.find(function(e){return e.id===t.id})},categories:function(){return this.$store.getters.getCategories},apps:function(){return this.$store.getters.getAllApps},updateCount:function(){return this.$store.getters.getUpdateCount},settings:function(){return this.$store.getters.getServerData},menu:function(){var e=this,a=this.$store.getters.getCategories;a=(a=Array.isArray(a)?a:[]).map(function(t){var e={};return e.id="app-category-"+t.ident,e.icon="icon-category-"+t.ident,e.classes=[],e.router={name:"apps-category",params:{category:t.ident}},e.text=t.displayName,e});var i=[{id:"app-category-your-apps",classes:[],router:{name:"apps"},icon:"icon-category-installed",text:t("settings","Your apps")},{id:"app-category-enabled",classes:[],icon:"icon-category-enabled",router:{name:"apps-category",params:{category:"enabled"}},text:t("settings","Active apps")},{id:"app-category-disabled",classes:[],icon:"icon-category-disabled",router:{name:"apps-category",params:{category:"disabled"}},text:t("settings","Disabled apps")}];if(!this.settings.appstoreEnabled)return i;this.$store.getters.getUpdateCount>0&&i.push({id:"app-category-updates",classes:[],icon:"icon-download",router:{name:"apps-category",params:{category:"updates"}},text:t("settings","Updates"),utils:{counter:this.$store.getters.getUpdateCount}}),i.push({id:"app-category-app-bundles",classes:[],icon:"icon-category-app-bundles",router:{name:"apps-category",params:{category:"app-bundles"}},text:t("settings","App bundles")});var s=(a=i.concat(a)).findIndex(function(t){return t.id==="app-category-"+e.category});return s>=0?a[s].classes.push("active"):a[0].classes.push("active"),a.push({id:"app-developer-docs",classes:[],href:this.settings.developerDocumentation,text:t("settings","Developer documentation")+" ↗"}),a}}},T=Object(r.a)(N,function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("Content",{class:{"with-app-sidebar":t.currentApp},attrs:{"app-name":"settings","content-class":{"icon-loading":t.loadingList},"navigation-class":{"icon-loading":t.loading}}},[a("AppNavigation",[a("ul",{attrs:{id:"appscategories"}},t._l(t.menu,function(t){return a("AppNavigationItem",{key:t.key,attrs:{item:t}})}),1)]),t._v(" "),a("AppContent",{staticClass:"app-settings-content",class:{"icon-loading":t.loadingList}},[a("AppList",{attrs:{category:t.category,app:t.currentApp,search:t.searchQuery}})],1),t._v(" "),t.id&&t.currentApp?a("AppSidebar",{on:{close:t.hideAppDetails}},[a("AppDetails",{attrs:{category:t.category,app:t.currentApp}})],1):t._e()],1)},[],!1,null,null,null);a.default=T.exports}}]);
//# sourceMappingURL=vue-4.js.map \ No newline at end of file
diff --git a/settings/js/vue-4.js.map b/settings/js/vue-4.js.map
index ab82ea91a31..e8e6e6e4e87 100644
--- a/settings/js/vue-4.js.map
+++ b/settings/js/vue-4.js.map
@@ -1 +1 @@
-{"version":3,"sources":["webpack:///./settings/src/components/appList/appItem.vue?5cfa","webpack:///./settings/src/components/appDetails.vue?c69f","webpack:///./settings/src/components/appList/appItem.vue?64bc","webpack:///./settings/src/components/appList/appItem.vue?48b8","webpack:///./settings/src/components/appDetails.vue?1f9b","webpack:///./settings/src/components/appDetails.vue?656a","webpack:///./settings/src/views/Apps.vue?ae09","webpack:///./settings/src/components/appList/appScore.vue?02ae","webpack:///settings/src/components/appList/appScore.vue","webpack:///./settings/src/components/appList/appScore.vue","webpack:///./settings/src/components/appList/appScore.vue?644e","webpack:///./settings/src/components/appManagement.vue?f8d8","webpack:///settings/src/components/appManagement.vue","webpack:///./settings/src/components/appManagement.vue","webpack:///./settings/src/components/svgFilterMixin.vue?e63f","webpack:///settings/src/components/svgFilterMixin.vue","webpack:///./settings/src/components/svgFilterMixin.vue","webpack:///./settings/src/components/appList/appItem.vue?9674","webpack:///settings/src/components/appList/appItem.vue","webpack:///./settings/src/components/appList/appItem.vue","webpack:///./settings/src/components/appList/appItem.vue?390c","webpack:///./settings/src/components/prefixMixin.vue?4873","webpack:///settings/src/components/prefixMixin.vue","webpack:///./settings/src/components/prefixMixin.vue","webpack:///./settings/src/components/appList.vue?42a6","webpack:///settings/src/components/appList.vue","webpack:///./settings/src/components/appList.vue","webpack:///./settings/src/components/appList.vue?dfbc","webpack:///./settings/src/components/appDetails.vue?c695","webpack:///settings/src/components/appDetails.vue","webpack:///./settings/src/components/appDetails.vue","webpack:///./settings/src/components/appDetails.vue?e38b","webpack:///settings/src/views/Apps.vue","webpack:///./settings/src/views/Apps.vue?b69d","webpack:///./settings/src/views/Apps.vue"],"names":["content","__webpack_require__","module","i","options","hmr","transform","insertInto","undefined","locals","exports","_node_modules_style_loader_index_js_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_appItem_vue_vue_type_style_index_0_id_1a5a2391_scoped_true_lang_css___WEBPACK_IMPORTED_MODULE_0__","n","push","_node_modules_style_loader_index_js_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_appDetails_vue_vue_type_style_index_0_id_52943dc0_scoped_true_lang_css___WEBPACK_IMPORTED_MODULE_0__","appList_appScorevue_type_script_lang_js_","name","props","computed","scoreImage","imageName","Math","round","this","score","OC","imagePath","appScore","Object","componentNormalizer","_h","$createElement","_self","_c","staticClass","attrs","src","components_appManagementvue_type_script_lang_js_","mounted","app","groups","length","groupCheckedAppsData","appGroups","map","group","id","loading","self","$store","getters","installing","enableButtonText","needsDownload","t","forceEnableButtonText","enableButtonTooltip","forceEnableButtonTooltip","base","methods","asyncFindGroup","query","dispatch","search","limit","offset","isLimitedToGroups","setGroupLimit","appId","canLimitToGroups","types","includes","addGroupLimitation","concat","removeGroupLimitation","currentGroups","index","indexOf","splice","forceEnable","then","response","Settings","Apps","rebuildNavigation","catch","error","Notification","show","enable","disable","remove","install","update","appManagement","appManagement_render","appManagement_staticRenderFns","components_svgFilterMixinvue_type_script_lang_js_","filterId","floor","random","Date","getSeconds","getMilliseconds","filterUrl","data","svgFilterMixin","svgFilterMixin_render","svgFilterMixin_staticRenderFns","appList_appItemvue_type_script_lang_js_","mixins","category","listView","type","Boolean","default","watch","$route.params.id","isSelected","components","AppScore","scrolled","$route","params","watchers","showAppDetails","event","currentTarget","tagName","$router","prefix","_prefix","appItem","_vm","class","selected","on","click","preview","screenshot","_e","_v","width","height","viewBox","in","values","x","y","preserveAspectRatio","filter","xlink:href","_s","summary","version","appstoreData","releases","level","directives","rawName","value","expression","modifiers","auto","disabled","$event","stopPropagation","active","canInstall","isCompatible","components_prefixMixinvue_type_script_lang_js_","prefixMixin","prefixMixin_render","prefixMixin_staticRenderFns","components_appListvue_type_script_lang_js_","apps","_this","getAllApps","toLowerCase","sort","a","b","sortStringA","sortStringB","Util","naturalSortCompare","installed","bundles","appstore","getServerData","bundleApps","bundle","bundleId","searchApps","_this2","find","_app","useAppStoreView","useListView","useBundleView","allBundlesEnabled","bundleToggleText","toggleBundle","disableBundle","enableBundle","console","log","appList","store","tag","_l","key","list-view","colspan","components_appDetailsvue_type_script_lang_js_","Multiselect","ncvuecomponents","appstoreUrl","licence","license","toUpperCase","hasRating","ratingNumOverall","author","@value","getGroups","localeCompare","renderMarkdown","renderer","marked_default","Renderer","link","href","title","text","prot","decodeURIComponent","unescape","replace","e","out","image","blockquote","quote","purify_default","sanitize","description","trim","gfm","highlight","tables","breaks","pedantic","smartLists","smartypants","SAFE_FOR_JQUERY","ALLOWED_TAGS","appDetails","staticStyle","padding","previewAsIcon","ratingOverall","domProps","checked","Array","isArray","_i","change","$$a","$$el","target","$$c","$$v","$$i","slice","for","options-limit","placeholder","label","track-by","multiple","close-on-select","tag-width","select","search-change","slot","dep","internal","rel","website","bugs","documentation","user","admin","developer","innerHTML","vue_runtime_esm","use","vue_local_storage_default","views_Appsvue_type_script_lang_js_","String","AppContent","AppNavigation","AppNavigationItem","AppSidebar","Content","AppDetails","AppList","setSearch","searchQuery","resetSearch","hideAppDetails","beforeMount","commit","updateCount","appSearch","OCA","Search","val","old","loadingList","currentApp","categories","getCategories","getUpdateCount","settings","menu","item","ident","icon","classes","router","displayName","defaultCategories","appstoreEnabled","utils","counter","activeGroup","findIndex","developerDocumentation","Apps_component","with-app-sidebar","app-name","content-class","icon-loading","navigation-class","close","__webpack_exports__"],"mappings":"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","file":"vue-4.js","sourcesContent":["\nvar content = require(\"!!../../../../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!./appItem.vue?vue&type=style&index=0&id=1a5a2391&scoped=true&lang=css&\");\n\nif(typeof content === 'string') content = [[module.id, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = require(\"!../../../../node_modules/style-loader/lib/addStyles.js\")(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(module.hot) {\n\tmodule.hot.accept(\"!!../../../../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!./appItem.vue?vue&type=style&index=0&id=1a5a2391&scoped=true&lang=css&\", function() {\n\t\tvar newContent = require(\"!!../../../../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!./appItem.vue?vue&type=style&index=0&id=1a5a2391&scoped=true&lang=css&\");\n\n\t\tif(typeof newContent === 'string') newContent = [[module.id, newContent, '']];\n\n\t\tvar locals = (function(a, b) {\n\t\t\tvar key, idx = 0;\n\n\t\t\tfor(key in a) {\n\t\t\t\tif(!b || a[key] !== b[key]) return false;\n\t\t\t\tidx++;\n\t\t\t}\n\n\t\t\tfor(key in b) idx--;\n\n\t\t\treturn idx === 0;\n\t\t}(content.locals, newContent.locals));\n\n\t\tif(!locals) throw new Error('Aborting CSS HMR due to changed css-modules locals.');\n\n\t\tupdate(newContent);\n\t});\n\n\tmodule.hot.dispose(function() { update(); });\n}","\nvar content = require(\"!!../../../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!./appDetails.vue?vue&type=style&index=0&id=52943dc0&scoped=true&lang=css&\");\n\nif(typeof content === 'string') content = [[module.id, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = require(\"!../../../node_modules/style-loader/lib/addStyles.js\")(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(module.hot) {\n\tmodule.hot.accept(\"!!../../../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!./appDetails.vue?vue&type=style&index=0&id=52943dc0&scoped=true&lang=css&\", function() {\n\t\tvar newContent = require(\"!!../../../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!./appDetails.vue?vue&type=style&index=0&id=52943dc0&scoped=true&lang=css&\");\n\n\t\tif(typeof newContent === 'string') newContent = [[module.id, newContent, '']];\n\n\t\tvar locals = (function(a, b) {\n\t\t\tvar key, idx = 0;\n\n\t\t\tfor(key in a) {\n\t\t\t\tif(!b || a[key] !== b[key]) return false;\n\t\t\t\tidx++;\n\t\t\t}\n\n\t\t\tfor(key in b) idx--;\n\n\t\t\treturn idx === 0;\n\t\t}(content.locals, newContent.locals));\n\n\t\tif(!locals) throw new Error('Aborting CSS HMR due to changed css-modules locals.');\n\n\t\tupdate(newContent);\n\t});\n\n\tmodule.hot.dispose(function() { update(); });\n}","import mod from \"-!../../../../node_modules/style-loader/index.js!../../../../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!./appItem.vue?vue&type=style&index=0&id=1a5a2391&scoped=true&lang=css&\"; export default mod; export * from \"-!../../../../node_modules/style-loader/index.js!../../../../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!./appItem.vue?vue&type=style&index=0&id=1a5a2391&scoped=true&lang=css&\"","exports = module.exports = require(\"../../../../node_modules/css-loader/dist/runtime/api.js\")(false);\n// Module\nexports.push([module.id, \"\\n.force[data-v-1a5a2391] {\\n\\tbackground: var(--color-main-background);\\n\\tborder-color: var(--color-error);\\n\\tcolor: var(--color-error);\\n}\\n.force[data-v-1a5a2391]:hover,\\n.force[data-v-1a5a2391]:active {\\n\\tbackground: var(--color-error);\\n\\tborder-color: var(--color-error) !important;\\n\\tcolor: var(--color-main-background);\\n}\\n\", \"\"]);\n","import mod from \"-!../../../node_modules/style-loader/index.js!../../../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!./appDetails.vue?vue&type=style&index=0&id=52943dc0&scoped=true&lang=css&\"; export default mod; export * from \"-!../../../node_modules/style-loader/index.js!../../../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!./appDetails.vue?vue&type=style&index=0&id=52943dc0&scoped=true&lang=css&\"","exports = module.exports = require(\"../../../node_modules/css-loader/dist/runtime/api.js\")(false);\n// Module\nexports.push([module.id, \"\\n.force[data-v-52943dc0] {\\n\\tbackground: var(--color-main-background);\\n\\tborder-color: var(--color-error);\\n\\tcolor: var(--color-error);\\n}\\n.force[data-v-52943dc0]:hover,\\n.force[data-v-52943dc0]:active {\\n\\tbackground: var(--color-error);\\n\\tborder-color: var(--color-error) !important;\\n\\tcolor: var(--color-main-background);\\n}\\n\", \"\"]);\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('Content',{class:{ 'with-app-sidebar': _vm.currentApp},attrs:{\"app-name\":\"settings\",\"content-class\":{ 'icon-loading': _vm.loadingList },\"navigation-class\":{ 'icon-loading': _vm.loading }}},[_c('AppNavigation',[_c('ul',{attrs:{\"id\":\"appscategories\"}},_vm._l((_vm.menu),function(item){return _c('AppNavigationItem',{key:item.key,attrs:{\"item\":item}})}),1)]),_vm._v(\" \"),_c('AppContent',{staticClass:\"app-settings-content\",class:{ 'icon-loading': _vm.loadingList }},[_c('AppList',{attrs:{\"category\":_vm.category,\"app\":_vm.currentApp,\"search\":_vm.searchQuery}})],1),_vm._v(\" \"),(_vm.id && _vm.currentApp)?_c('AppSidebar',{on:{\"close\":_vm.hideAppDetails}},[_c('AppDetails',{attrs:{\"category\":_vm.category,\"app\":_vm.currentApp}})],1):_vm._e()],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./appScore.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!./appScore.vue?vue&type=script&lang=js&\"","<!--\n - @copyright Copyright (c) 2018 Julius Härtl <jus@bitgrid.net>\n -\n - @author Julius Härtl <jus@bitgrid.net>\n -\n - @license GNU AGPL version 3 or any later version\n -\n - This program is free software: you can redistribute it and/or modify\n - it under the terms of the GNU Affero General Public License as\n - published by the Free Software Foundation, either version 3 of the\n - License, or (at your option) any later version.\n -\n - This program is distributed in the hope that it will be useful,\n - but WITHOUT ANY WARRANTY; without even the implied warranty of\n - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n - GNU Affero General Public License for more details.\n -\n - You should have received a copy of the GNU Affero General Public License\n - along with this program. If not, see <http://www.gnu.org/licenses/>.\n -\n -->\n\n<template>\n\t<img :src=\"scoreImage\" class=\"app-score-image\" />\n</template>\n<script>\n\texport default {\n\t\tname: 'appScore',\n\t\tprops: ['score'],\n\t\tcomputed: {\n\t\t\tscoreImage() {\n\t\t\t\tlet score = Math.round( this.score * 10 );\n\t\t\t\tlet imageName = 'rating/s' + score + '.svg';\n\t\t\t\treturn OC.imagePath('core', imageName);\n\t\t\t}\n\t\t}\n\t};\n</script>","import { render, staticRenderFns } from \"./appScore.vue?vue&type=template&id=3c7dd35d&\"\nimport script from \"./appScore.vue?vue&type=script&lang=js&\"\nexport * from \"./appScore.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","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('img',{staticClass:\"app-score-image\",attrs:{\"src\":_vm.scoreImage}})}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./appManagement.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!./appManagement.vue?vue&type=script&lang=js&\"","<!--\n - @copyright Copyright (c) 2018 Julius Härtl <jus@bitgrid.net>\n -\n - @author Julius Härtl <jus@bitgrid.net>\n -\n - @license GNU AGPL version 3 or any later version\n -\n - This program is free software: you can redistribute it and/or modify\n - it under the terms of the GNU Affero General Public License as\n - published by the Free Software Foundation, either version 3 of the\n - License, or (at your option) any later version.\n -\n - This program is distributed in the hope that it will be useful,\n - but WITHOUT ANY WARRANTY; without even the implied warranty of\n - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n - GNU Affero General Public License for more details.\n -\n - You should have received a copy of the GNU Affero General Public License\n - along with this program. If not, see <http://www.gnu.org/licenses/>.\n -\n -->\n\n<script>\n\texport default {\n\t\tmounted() {\n\t\t\tif (this.app.groups.length > 0) {\n\t\t\t\tthis.groupCheckedAppsData = true;\n\t\t\t}\n\t\t},\n\t\tcomputed: {\n\t\t\tappGroups() {\n\t\t\t\treturn this.app.groups.map(group => {return {id: group, name: group}});\n\t\t\t},\n\t\t\tloading() {\n\t\t\t\tlet self = this;\n\t\t\t\treturn function(id) {\n\t\t\t\t\treturn self.$store.getters.loading(id);\n\t\t\t\t}\n\t\t\t},\n\t\t\tinstalling() {\n\t\t\t\treturn this.$store.getters.loading('install');\n\t\t\t},\n\t\t\tenableButtonText() {\n\t\t\t\tif (this.app.needsDownload) {\n\t\t\t\t\treturn t('settings', 'Download and enable');\n\t\t\t\t}\n\t\t\t\treturn t('settings', 'Enable');\n\t\t\t},\n\t\t\tforceEnableButtonText() {\n\t\t\t\tif (this.app.needsDownload) {\n\t\t\t\t\treturn t('settings', 'Enable untested app');\n\t\t\t\t}\n\t\t\t\treturn t('settings', 'Enable untested app');\n\t\t\t},\n\t\t\tenableButtonTooltip() {\n\t\t\t\tif (this.app.needsDownload) {\n\t\t\t\t\treturn t('settings','The app will be downloaded from the app store');\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t},\n\t\t\tforceEnableButtonTooltip() {\n\t\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\t\tif (this.app.needsDownload) {\n\t\t\t\t\treturn base + ' ' + t('settings','The app will be downloaded from the app store');\n\t\t\t\t}\n\t\t\t\treturn base;\n\t\t\t}\n\t\t},\n\t\tmethods: {\n\t\t\tasyncFindGroup(query) {\n\t\t\t\treturn this.$store.dispatch('getGroups', {search: query, limit: 5, offset: 0});\n\t\t\t},\n\t\t\tisLimitedToGroups(app) {\n\t\t\t\tif (this.app.groups.length || this.groupCheckedAppsData) {\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\tsetGroupLimit: function() {\n\t\t\t\tif (!this.groupCheckedAppsData) {\n\t\t\t\t\tthis.$store.dispatch('enableApp', {appId: this.app.id, groups: []});\n\t\t\t\t}\n\t\t\t},\n\t\t\tcanLimitToGroups(app) {\n\t\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\t\treturn false;\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t},\n\t\t\taddGroupLimitation(group) {\n\t\t\t\tlet groups = this.app.groups.concat([]).concat([group.id]);\n\t\t\t\tthis.$store.dispatch('enableApp', { appId: this.app.id, groups: groups});\n\t\t\t},\n\t\t\tremoveGroupLimitation(group) {\n\t\t\t\tlet currentGroups = this.app.groups.concat([]);\n\t\t\t\tlet index = currentGroups.indexOf(group.id);\n\t\t\t\tif (index > -1) {\n\t\t\t\t\tcurrentGroups.splice(index, 1);\n\t\t\t\t}\n\t\t\t\tthis.$store.dispatch('enableApp', { appId: this.app.id, groups: currentGroups});\n\t\t\t},\n\t\t\tforceEnable(appId) {\n\t\t\t\tthis.$store.dispatch('forceEnableApp', { appId: appId, groups: [] })\n\t\t\t\t\t.then((response) => { OC.Settings.Apps.rebuildNavigation(); })\n\t\t\t\t\t.catch((error) => { OC.Notification.show(error)});\n\t\t\t},\n\t\t\tenable(appId) {\n\t\t\t\tthis.$store.dispatch('enableApp', { appId: appId, groups: [] })\n\t\t\t\t\t.then((response) => { OC.Settings.Apps.rebuildNavigation(); })\n\t\t\t\t\t.catch((error) => { OC.Notification.show(error)});\n\t\t\t},\n\t\t\tdisable(appId) {\n\t\t\t\tthis.$store.dispatch('disableApp', { appId: appId })\n\t\t\t\t\t.then((response) => { OC.Settings.Apps.rebuildNavigation(); })\n\t\t\t\t\t.catch((error) => { OC.Notification.show(error)});\n\t\t\t},\n\t\t\tremove(appId) {\n\t\t\t\tthis.$store.dispatch('uninstallApp', { appId: appId })\n\t\t\t\t\t.then((response) => { OC.Settings.Apps.rebuildNavigation(); })\n\t\t\t\t\t.catch((error) => { OC.Notification.show(error)});\n\t\t\t},\n\t\t\tinstall(appId) {\n\t\t\t\tthis.$store.dispatch('enableApp', { appId: appId })\n\t\t\t\t\t.then((response) => { OC.Settings.Apps.rebuildNavigation(); })\n\t\t\t\t\t.catch((error) => { OC.Notification.show(error)});\n\t\t\t},\n\t\t\tupdate(appId) {\n\t\t\t\tthis.$store.dispatch('updateApp', { appId: appId })\n\t\t\t\t\t.then((response) => { OC.Settings.Apps.rebuildNavigation(); })\n\t\t\t\t\t.catch((error) => { OC.Notification.show(error)});\n\t\t\t}\n\t\t}\n\t}\n</script>\n","var render, staticRenderFns\nimport script from \"./appManagement.vue?vue&type=script&lang=js&\"\nexport * from \"./appManagement.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","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&\"","<!--\n - @copyright Copyright (c) 2018 Julius Härtl <jus@bitgrid.net>\n -\n - @author Julius Härtl <jus@bitgrid.net>\n -\n - @license GNU AGPL version 3 or any later version\n -\n - This program is free software: you can redistribute it and/or modify\n - it under the terms of the GNU Affero General Public License as\n - published by the Free Software Foundation, either version 3 of the\n - License, or (at your option) any later version.\n -\n - This program is distributed in the hope that it will be useful,\n - but WITHOUT ANY WARRANTY; without even the implied warranty of\n - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n - GNU Affero General Public License for more details.\n -\n - You should have received a copy of the GNU Affero General Public License\n - along with this program. If not, see <http://www.gnu.org/licenses/>.\n -\n -->\n\n<script>\n\texport default {\n\t\tname: 'svgFilterMixin',\n\t\tmounted() {\n\t\t\tthis.filterId = 'invertIconApps' + Math.floor((Math.random() * 100 )) + new Date().getSeconds() + new Date().getMilliseconds();\n\t\t},\n\t\tcomputed: {\n\t\t\tfilterUrl () {\n\t\t\t\treturn `url(#${this.filterId})`;\n\t\t\t},\n\t\t},\n\t\tdata() {\n\t\t\treturn {\n\t\t\t\tfilterId: '',\n\t\t\t};\n\t\t},\n\t}\n</script>","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","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 - @copyright Copyright (c) 2018 Julius Härtl <jus@bitgrid.net>\n -\n - @author Julius Härtl <jus@bitgrid.net>\n -\n - @license GNU AGPL version 3 or any later version\n -\n - This program is free software: you can redistribute it and/or modify\n - it under the terms of the GNU Affero General Public License as\n - published by the Free Software Foundation, either version 3 of the\n - License, or (at your option) any later version.\n -\n - This program is distributed in the hope that it will be useful,\n - but WITHOUT ANY WARRANTY; without even the implied warranty of\n - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n - GNU Affero General Public License for more details.\n -\n - You should have received a copy of the GNU Affero General Public License\n - along with this program. If not, see <http://www.gnu.org/licenses/>.\n -\n -->\n\n<template>\n\t<div class=\"section\" v-bind:class=\"{ selected: isSelected }\" v-on:click=\"showAppDetails\">\n\t\t<div class=\"app-image app-image-icon\" v-on:click=\"showAppDetails\">\n\t\t\t<div v-if=\"(listView && !app.preview) || (!listView && !app.screenshot)\" class=\"icon-settings-dark\"></div>\n\n\t\t\t<svg v-if=\"listView && app.preview\" width=\"32\" height=\"32\" viewBox=\"0 0 32 32\">\n\t\t\t\t<defs><filter :id=\"filterId\"><feColorMatrix in=\"SourceGraphic\" type=\"matrix\" values=\"-1 0 0 0 1 0 -1 0 0 1 0 0 -1 0 1 0 0 0 1 0\"></feColorMatrix></filter></defs>\n\t\t\t\t<image x=\"0\" y=\"0\" width=\"32\" height=\"32\" preserveAspectRatio=\"xMinYMin meet\" :filter=\"filterUrl\" :xlink:href=\"app.preview\" class=\"app-icon\"></image>\n\t\t\t</svg>\n\n\t\t\t<img v-if=\"!listView && app.screenshot\" :src=\"app.screenshot\" width=\"100%\" />\n\t\t</div>\n\t\t<div class=\"app-name\" v-on:click=\"showAppDetails\">\n\t\t\t{{ app.name }}\n\t\t</div>\n\t\t<div class=\"app-summary\" v-if=\"!listView\">{{ app.summary }}</div>\n\t\t<div class=\"app-version\" v-if=\"listView\">\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</div>\n\n\t\t<div class=\"app-level\">\n\t\t\t<span class=\"supported icon-checkmark-color\" v-if=\"app.level === 300\"\n\t\t\t\t v-tooltip.auto=\"t('settings', 'This app is supported via your current Nextcloud subscription.')\">\n\t\t\t\t{{ t('settings', 'Supported') }}</span>\n\t\t\t<span class=\"official icon-checkmark\" v-if=\"app.level === 200\"\n\t\t\t\t v-tooltip.auto=\"t('settings', 'Official apps are developed by and within the community. They offer central functionality and are ready for production use.')\">\n\t\t\t\t{{ t('settings', 'Official') }}</span>\n\t\t\t<app-score v-if=\"!listView\" :score=\"app.score\"></app-score>\n\t\t</div>\n\n\t\t<div class=\"actions\">\n\t\t\t<div class=\"warning\" v-if=\"app.error\">{{ app.error }}</div>\n\t\t\t<div class=\"icon icon-loading-small\" v-if=\"loading(app.id)\"></div>\n\t\t\t<input v-if=\"app.update\" class=\"update primary\" type=\"button\" :value=\"t('settings', 'Update to {update}', {update:app.update})\" v-on:click.stop=\"update(app.id)\" :disabled=\"installing || loading(app.id)\" />\n\t\t\t<input v-if=\"app.canUnInstall\" class=\"uninstall\" type=\"button\" :value=\"t('settings', 'Remove')\" v-on:click.stop=\"remove(app.id)\" :disabled=\"installing || loading(app.id)\" />\n\t\t\t<input v-if=\"app.active\" class=\"enable\" type=\"button\" :value=\"t('settings','Disable')\" v-on:click.stop=\"disable(app.id)\" :disabled=\"installing || loading(app.id)\" />\n\t\t\t<input v-if=\"!app.active && (app.canInstall || app.isCompatible)\" class=\"enable\" type=\"button\" :value=\"enableButtonText\" v-on:click.stop=\"enable(app.id)\" v-tooltip.auto=\"enableButtonTooltip\" :disabled=\"!app.canInstall || installing || loading(app.id)\" />\n\t\t\t<input v-else-if=\"!app.active\" class=\"enable force\" type=\"button\" :value=\"forceEnableButtonText\" v-on:click.stop=\"forceEnable(app.id)\" v-tooltip.auto=\"forceEnableButtonTooltip\" :disabled=\"installing || loading(app.id)\" />\n\t\t</div>\n\t</div>\n</template>\n\n<script>\n\timport AppScore from './appScore';\n\timport AppManagement from '../appManagement';\n\timport SvgFilterMixin from '../svgFilterMixin';\n\n\texport default {\n\t\tname: 'appItem',\n\t\tmixins: [AppManagement, SvgFilterMixin],\n\t\tprops: {\n\t\t\tapp: {},\n\t\t\tcategory: {},\n\t\t\tlistView: {\n\t\t\t\ttype: Boolean,\n\t\t\t\tdefault: true,\n\t\t\t}\n\t\t},\n\t\twatch: {\n\t\t\t'$route.params.id': function (id) {\n\t\t\t\tthis.isSelected = (this.app.id === id);\n\t\t\t}\n\t\t},\n\t\tcomponents: {\n\t\t\tAppScore,\n\t\t},\n\t\tdata() {\n\t\t\treturn {\n\t\t\t\tisSelected: false,\n\t\t\t\tscrolled: false,\n\t\t\t};\n\t\t},\n\t\tmounted() {\n\t\t\tthis.isSelected = (this.app.id === this.$route.params.id);\n\t\t},\n\t\tcomputed: {\n\n\t\t},\n\t\twatchers: {\n\n\t\t},\n\t\tmethods: {\n\t\t\tshowAppDetails(event) {\n\t\t\t\tif (event.currentTarget.tagName === 'INPUT' || event.currentTarget.tagName === 'A') {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tthis.$router.push({\n\t\t\t\t\tname: 'apps-details',\n\t\t\t\t\tparams: {category: this.category, id: this.app.id}\n\t\t\t\t});\n\t\t\t},\n\t\t\tprefix(prefix, content) {\n\t\t\t\treturn prefix + '_' + content;\n\t\t\t},\n\t\t}\n\t}\n</script>\n\n<style scoped>\n\t.force {\n\t\tbackground: var(--color-main-background);\n\t\tborder-color: var(--color-error);\n\t\tcolor: var(--color-error);\n\t}\n\t.force:hover,\n\t.force:active {\n\t\tbackground: var(--color-error);\n\t\tborder-color: var(--color-error) !important;\n\t\tcolor: var(--color-main-background);\n\t}\n</style>\n","import { render, staticRenderFns } from \"./appItem.vue?vue&type=template&id=1a5a2391&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=1a5a2391&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 \"1a5a2391\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"section\",class:{ selected: _vm.isSelected },on:{\"click\":_vm.showAppDetails}},[_c('div',{staticClass:\"app-image app-image-icon\",on:{\"click\":_vm.showAppDetails}},[((_vm.listView && !_vm.app.preview) || (!_vm.listView && !_vm.app.screenshot))?_c('div',{staticClass:\"icon-settings-dark\"}):_vm._e(),_vm._v(\" \"),(_vm.listView && _vm.app.preview)?_c('svg',{attrs:{\"width\":\"32\",\"height\":\"32\",\"viewBox\":\"0 0 32 32\"}},[_c('defs',[_c('filter',{attrs:{\"id\":_vm.filterId}},[_c('feColorMatrix',{attrs:{\"in\":\"SourceGraphic\",\"type\":\"matrix\",\"values\":\"-1 0 0 0 1 0 -1 0 0 1 0 0 -1 0 1 0 0 0 1 0\"}})],1)]),_vm._v(\" \"),_c('image',{staticClass:\"app-icon\",attrs:{\"x\":\"0\",\"y\":\"0\",\"width\":\"32\",\"height\":\"32\",\"preserveAspectRatio\":\"xMinYMin meet\",\"filter\":_vm.filterUrl,\"xlink:href\":_vm.app.preview}})]):_vm._e(),_vm._v(\" \"),(!_vm.listView && _vm.app.screenshot)?_c('img',{attrs:{\"src\":_vm.app.screenshot,\"width\":\"100%\"}}):_vm._e()]),_vm._v(\" \"),_c('div',{staticClass:\"app-name\",on:{\"click\":_vm.showAppDetails}},[_vm._v(\"\\n\\t\\t\"+_vm._s(_vm.app.name)+\"\\n\\t\")]),_vm._v(\" \"),(!_vm.listView)?_c('div',{staticClass:\"app-summary\"},[_vm._v(_vm._s(_vm.app.summary))]):_vm._e(),_vm._v(\" \"),(_vm.listView)?_c('div',{staticClass:\"app-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('div',{staticClass:\"app-level\"},[(_vm.app.level === 300)?_c('span',{directives:[{name:\"tooltip\",rawName:\"v-tooltip.auto\",value:(_vm.t('settings', 'This app is supported via your current Nextcloud subscription.')),expression:\"t('settings', 'This app is supported via your current Nextcloud subscription.')\",modifiers:{\"auto\":true}}],staticClass:\"supported icon-checkmark-color\"},[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.t('settings', 'Supported')))]):_vm._e(),_vm._v(\" \"),(_vm.app.level === 200)?_c('span',{directives:[{name:\"tooltip\",rawName:\"v-tooltip.auto\",value:(_vm.t('settings', 'Official apps are developed by and within the community. They offer central functionality and are ready for production use.')),expression:\"t('settings', 'Official apps are developed by and within the community. They offer central functionality and are ready for production use.')\",modifiers:{\"auto\":true}}],staticClass:\"official icon-checkmark\"},[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.t('settings', 'Official')))]):_vm._e(),_vm._v(\" \"),(!_vm.listView)?_c('app-score',{attrs:{\"score\":_vm.app.score}}):_vm._e()],1),_vm._v(\" \"),_c('div',{staticClass:\"actions\"},[(_vm.app.error)?_c('div',{staticClass:\"warning\"},[_vm._v(_vm._s(_vm.app.error))]):_vm._e(),_vm._v(\" \"),(_vm.loading(_vm.app.id))?_c('div',{staticClass:\"icon icon-loading-small\"}):_vm._e(),_vm._v(\" \"),(_vm.app.update)?_c('input',{staticClass:\"update primary\",attrs:{\"type\":\"button\",\"value\":_vm.t('settings', 'Update to {update}', {update:_vm.app.update}),\"disabled\":_vm.installing || _vm.loading(_vm.app.id)},on:{\"click\":function($event){$event.stopPropagation();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.loading(_vm.app.id)},on:{\"click\":function($event){$event.stopPropagation();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.loading(_vm.app.id)},on:{\"click\":function($event){$event.stopPropagation();return _vm.disable(_vm.app.id)}}}):_vm._e(),_vm._v(\" \"),(!_vm.app.active && (_vm.app.canInstall || _vm.app.isCompatible))?_c('input',{directives:[{name:\"tooltip\",rawName:\"v-tooltip.auto\",value:(_vm.enableButtonTooltip),expression:\"enableButtonTooltip\",modifiers:{\"auto\":true}}],staticClass:\"enable\",attrs:{\"type\":\"button\",\"value\":_vm.enableButtonText,\"disabled\":!_vm.app.canInstall || _vm.installing || _vm.loading(_vm.app.id)},on:{\"click\":function($event){$event.stopPropagation();return _vm.enable(_vm.app.id)}}}):(!_vm.app.active)?_c('input',{directives:[{name:\"tooltip\",rawName:\"v-tooltip.auto\",value:(_vm.forceEnableButtonTooltip),expression:\"forceEnableButtonTooltip\",modifiers:{\"auto\":true}}],staticClass:\"enable force\",attrs:{\"type\":\"button\",\"value\":_vm.forceEnableButtonText,\"disabled\":_vm.installing || _vm.loading(_vm.app.id)},on:{\"click\":function($event){$event.stopPropagation();return _vm.forceEnable(_vm.app.id)}}}):_vm._e()])])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./prefixMixin.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!./prefixMixin.vue?vue&type=script&lang=js&\"","<!--\n - @copyright Copyright (c) 2018 Julius Härtl <jus@bitgrid.net>\n -\n - @author Julius Härtl <jus@bitgrid.net>\n -\n - @license GNU AGPL version 3 or any later version\n -\n - This program is free software: you can redistribute it and/or modify\n - it under the terms of the GNU Affero General Public License as\n - published by the Free Software Foundation, either version 3 of the\n - License, or (at your option) any later version.\n -\n - This program is distributed in the hope that it will be useful,\n - but WITHOUT ANY WARRANTY; without even the implied warranty of\n - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n - GNU Affero General Public License for more details.\n -\n - You should have received a copy of the GNU Affero General Public License\n - along with this program. If not, see <http://www.gnu.org/licenses/>.\n -\n -->\n\n<script>\n\texport default {\n\t\tname: 'prefixMixin',\n\t\tmethods: {\n\t\t\tprefix (prefix, content) {\n\t\t\t\treturn prefix + '_' + content;\n\t\t\t},\n\t\t}\n\t}\n</script>","var render, staticRenderFns\nimport script from \"./prefixMixin.vue?vue&type=script&lang=js&\"\nexport * from \"./prefixMixin.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","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 - @copyright Copyright (c) 2018 Julius Härtl <jus@bitgrid.net>\n -\n - @author Julius Härtl <jus@bitgrid.net>\n -\n - @license GNU AGPL version 3 or any later version\n -\n - This program is free software: you can redistribute it and/or modify\n - it under the terms of the GNU Affero General Public License as\n - published by the Free Software Foundation, either version 3 of the\n - License, or (at your option) any later version.\n -\n - This program is distributed in the hope that it will be useful,\n - but WITHOUT ANY WARRANTY; without even the implied warranty of\n - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n - GNU Affero General Public License for more details.\n -\n - You should have received a copy of the GNU Affero General Public License\n - along with this program. If not, see <http://www.gnu.org/licenses/>.\n -\n -->\n\n<template>\n\t<div id=\"app-content-inner\">\n\t\t<div id=\"apps-list\" class=\"apps-list\" :class=\"{installed: (useBundleView || useListView), store: useAppStoreView}\">\n\t\t\t<template v-if=\"useListView\">\n\t\t\t\t<transition-group name=\"app-list\" tag=\"div\" class=\"apps-list-container\">\n\t\t\t\t\t<app-item v-for=\"app in apps\" :key=\"app.id\" :app=\"app\" :category=\"category\" />\n\t\t\t\t</transition-group>\n\t\t\t</template>\n\t\t\t<template v-for=\"bundle in bundles\" v-if=\"useBundleView && bundleApps(bundle.id).length > 0\">\n\t\t\t\t<transition-group name=\"app-list\" tag=\"div\" class=\"apps-list-container\">\n\n\t\t\t\t\t<div class=\"apps-header\" :key=\"bundle.id\">\n\t\t\t\t\t\t<div class=\"app-image\"></div>\n\t\t\t\t\t\t<h2>{{ bundle.name }} <input type=\"button\" :value=\"bundleToggleText(bundle.id)\" v-on:click=\"toggleBundle(bundle.id)\"></h2>\n\t\t\t\t\t\t<div class=\"app-version\"></div>\n\t\t\t\t\t\t<div class=\"app-level\"></div>\n\t\t\t\t\t\t<div class=\"app-groups\"></div>\n\t\t\t\t\t\t<div class=\"actions\">&nbsp;</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<app-item v-for=\"app in bundleApps(bundle.id)\" :key=\"bundle.id + app.id\" :app=\"app\" :category=\"category\"/>\n\t\t\t\t</transition-group>\n\t\t\t</template>\n\t\t\t<template v-if=\"useAppStoreView\">\n\t\t\t\t<app-item v-for=\"app in apps\" :key=\"app.id\" :app=\"app\" :category=\"category\" :list-view=\"false\" />\n\t\t\t</template>\n\n\t\t</div>\n\n\t\t<div id=\"apps-list-search\" class=\"apps-list installed\">\n\t\t\t<div class=\"apps-list-container\">\n\t\t\t\t<template v-if=\"search !== '' && searchApps.length > 0\">\n\t\t\t\t\t<div class=\"section\">\n\t\t\t\t\t\t<div></div>\n\t\t\t\t\t\t<td colspan=\"5\">\n\t\t\t\t\t\t\t<h2>{{ t('settings', 'Results from other categories') }}</h2>\n\t\t\t\t\t\t</td>\n\t\t\t\t\t</div>\n\t\t\t\t\t<app-item v-for=\"app in searchApps\" :key=\"app.id\" :app=\"app\" :category=\"category\" :list-view=\"true\" />\n\t\t\t\t</template>\n\t\t\t</div>\n\t\t</div>\n\n\t\t<div id=\"apps-list-empty\" class=\"emptycontent emptycontent-search\" v-if=\"!loading && searchApps.length === 0 && apps.length === 0\">\n\t\t\t<div id=\"app-list-empty-icon\" class=\"icon-settings-dark\"></div>\n\t\t\t<h2>{{ t('settings', 'No apps found for your version')}}</h2>\n\t\t</div>\n\n\t\t<div id=\"searchresults\"></div>\n\t</div>\n</template>\n\n<script>\nimport appItem from './appList/appItem';\nimport prefix from './prefixMixin';\n\nexport default {\n\tname: 'appList',\n\tmixins: [prefix],\n\tprops: ['category', 'app', 'search'],\n\tcomponents: {\n\t\tappItem\n\t},\n\tcomputed: {\n\t\tloading() {\n\t\t\treturn this.$store.getters.loading('list');\n\t\t},\n\t\tapps() {\n\t\t\tlet 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\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.getServerData.bundles;\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 => app.bundleId === bundle);\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');\n\t\t},\n\t\tuseBundleView() {\n\t\t\treturn (this.category === 'app-bundles');\n\t\t},\n\t\tallBundlesEnabled() {\n\t\t\tlet self = this;\n\t\t\treturn function(id) {\n\t\t\t\treturn self.bundleApps(id).filter(app => !app.active).length === 0;\n\t\t\t}\n\t\t},\n\t\tbundleToggleText() {\n\t\t\tlet self = this;\n\t\t\treturn function(id) {\n\t\t\t\tif (self.allBundlesEnabled(id)) {\n\t\t\t\t\treturn t('settings', 'Disable all');\n\t\t\t\t}\n\t\t\t\treturn t('settings', 'Enable all');\n\t\t\t}\n\t\t}\n\t},\n\tmethods: {\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\tlet 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) => { console.log(error); OC.Notification.show(error)});\n\t\t},\n\t\tdisableBundle(id) {\n\t\t\tlet 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) => { OC.Notification.show(error)});\n\t\t}\n\t},\n}\n</script>\n","import { render, staticRenderFns } from \"./appList.vue?vue&type=template&id=f515f708&\"\nimport script from \"./appList.vue?vue&type=script&lang=js&\"\nexport * from \"./appList.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","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{attrs:{\"id\":\"app-content-inner\"}},[_c('div',{staticClass:\"apps-list\",class:{installed: (_vm.useBundleView || _vm.useListView), store: _vm.useAppStoreView},attrs:{\"id\":\"apps-list\"}},[(_vm.useListView)?[_c('transition-group',{staticClass:\"apps-list-container\",attrs:{\"name\":\"app-list\",\"tag\":\"div\"}},_vm._l((_vm.apps),function(app){return _c('app-item',{key:app.id,attrs:{\"app\":app,\"category\":_vm.category}})}),1)]:_vm._e(),_vm._v(\" \"),_vm._l((_vm.bundles),function(bundle){return (_vm.useBundleView && _vm.bundleApps(bundle.id).length > 0)?[_c('transition-group',{staticClass:\"apps-list-container\",attrs:{\"name\":\"app-list\",\"tag\":\"div\"}},[_c('div',{key:bundle.id,staticClass:\"apps-header\"},[_c('div',{staticClass:\"app-image\"}),_vm._v(\" \"),_c('h2',[_vm._v(_vm._s(bundle.name)+\" \"),_c('input',{attrs:{\"type\":\"button\",\"value\":_vm.bundleToggleText(bundle.id)},on:{\"click\":function($event){return _vm.toggleBundle(bundle.id)}}})]),_vm._v(\" \"),_c('div',{staticClass:\"app-version\"}),_vm._v(\" \"),_c('div',{staticClass:\"app-level\"}),_vm._v(\" \"),_c('div',{staticClass:\"app-groups\"}),_vm._v(\" \"),_c('div',{staticClass:\"actions\"},[_vm._v(\" \")])]),_vm._v(\" \"),_vm._l((_vm.bundleApps(bundle.id)),function(app){return _c('app-item',{key:bundle.id + app.id,attrs:{\"app\":app,\"category\":_vm.category}})})],2)]:_vm._e()}),_vm._v(\" \"),(_vm.useAppStoreView)?_vm._l((_vm.apps),function(app){return _c('app-item',{key:app.id,attrs:{\"app\":app,\"category\":_vm.category,\"list-view\":false}})}):_vm._e()],2),_vm._v(\" \"),_c('div',{staticClass:\"apps-list installed\",attrs:{\"id\":\"apps-list-search\"}},[_c('div',{staticClass:\"apps-list-container\"},[(_vm.search !== '' && _vm.searchApps.length > 0)?[_c('div',{staticClass:\"section\"},[_c('div'),_vm._v(\" \"),_c('td',{attrs:{\"colspan\":\"5\"}},[_c('h2',[_vm._v(_vm._s(_vm.t('settings', 'Results from other categories')))])])]),_vm._v(\" \"),_vm._l((_vm.searchApps),function(app){return _c('app-item',{key:app.id,attrs:{\"app\":app,\"category\":_vm.category,\"list-view\":true}})})]:_vm._e()],2)]),_vm._v(\" \"),(!_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(),_vm._v(\" \"),_c('div',{attrs:{\"id\":\"searchresults\"}})])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./appDetails.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!./appDetails.vue?vue&type=script&lang=js&\"","<!--\n - @copyright Copyright (c) 2018 Julius Härtl <jus@bitgrid.net>\n -\n - @author Julius Härtl <jus@bitgrid.net>\n -\n - @license GNU AGPL version 3 or any later version\n -\n - This program is free software: you can redistribute it and/or modify\n - it under the terms of the GNU Affero General Public License as\n - published by the Free Software Foundation, either version 3 of the\n - License, or (at your option) any later version.\n -\n - This program is distributed in the hope that it will be useful,\n - but WITHOUT ANY WARRANTY; without even the implied warranty of\n - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n - GNU Affero General Public License for more details.\n -\n - You should have received a copy of the GNU Affero General Public License\n - along with this program. If not, see <http://www.gnu.org/licenses/>.\n -\n -->\n\n<template>\n\t<div id=\"app-details-view\" style=\"padding: 20px;\">\n\t\t<h2>\n\t\t\t<div v-if=\"!app.preview\" class=\"icon-settings-dark\"></div>\n\t\t\t<svg v-if=\"app.previewAsIcon && app.preview\" width=\"32\" height=\"32\" viewBox=\"0 0 32 32\">\n\t\t\t\t<defs><filter :id=\"filterId\"><feColorMatrix in=\"SourceGraphic\" type=\"matrix\" values=\"-1 0 0 0 1 0 -1 0 0 1 0 0 -1 0 1 0 0 0 1 0\"></feColorMatrix></filter></defs>\n\t\t\t\t<image x=\"0\" y=\"0\" width=\"32\" height=\"32\" preserveAspectRatio=\"xMinYMin meet\" :filter=\"filterUrl\" :xlink:href=\"app.preview\" class=\"app-icon\"></image>\n\t\t\t</svg>\n\t\t\t{{ app.name }}</h2>\n\t\t<img v-if=\"app.screenshot\" :src=\"app.screenshot\" width=\"100%\" />\n\t\t<div class=\"app-level\" v-if=\"app.level === 300 || app.level === 200 || hasRating\">\n\t\t\t<span class=\"supported icon-checkmark-color\" v-if=\"app.level === 300\"\n\t\t\t\t v-tooltip.auto=\"t('settings', 'This app is supported via your current Nextcloud subscription.')\">\n\t\t\t\t{{ t('settings', 'Supported') }}</span>\n\t\t\t<span class=\"official icon-checkmark\" v-if=\"app.level === 200\"\n\t\t\t v-tooltip.auto=\"t('settings', 'Official apps are developed by and within the community. They offer central functionality and are ready for production use.')\">\n\t\t\t\t{{ t('settings', 'Official') }}</span>\n\t\t\t<app-score v-if=\"hasRating\" :score=\"app.appstoreData.ratingOverall\"></app-score>\n\t\t</div>\n\n\t\t<div class=\"app-author\" v-if=\"author\">\n\t\t\t{{ t('settings', 'by') }}\n\t\t\t<span v-for=\"(a, index) in author\">\n\t\t\t\t<a v-if=\"a['@attributes'] && a['@attributes']['homepage']\" :href=\"a['@attributes']['homepage']\">{{ a['@value'] }}</a><span v-else-if=\"a['@value']\">{{ a['@value'] }}</span><span v-else>{{ a }}</span><span v-if=\"index+1 < author.length\">, </span>\n\t\t\t</span>\n\t\t</div>\n\t\t<div class=\"app-licence\" v-if=\"licence\">{{ licence }}</div>\n\t\t<div class=\"actions\">\n\t\t\t<div class=\"actions-buttons\">\n\t\t\t\t<input v-if=\"app.update\" class=\"update primary\" type=\"button\" :value=\"t('settings', 'Update to {version}', {version: app.update})\" v-on:click=\"update(app.id)\" :disabled=\"installing || loading(app.id)\"/>\n\t\t\t\t<input v-if=\"app.canUnInstall\" class=\"uninstall\" type=\"button\" :value=\"t('settings', 'Remove')\" v-on:click=\"remove(app.id)\" :disabled=\"installing || loading(app.id)\"/>\n\t\t\t\t<input v-if=\"app.active\" class=\"enable\" type=\"button\" :value=\"t('settings','Disable')\" v-on:click=\"disable(app.id)\" :disabled=\"installing || loading(app.id)\" />\n\t\t\t\t<input v-if=\"!app.active && (app.canInstall || app.isCompatible)\" class=\"enable primary\" type=\"button\" :value=\"enableButtonText\" v-on:click=\"enable(app.id)\" v-tooltip.auto=\"enableButtonTooltip\" :disabled=\"!app.canInstall || installing || loading(app.id)\" />\n\t\t\t\t<input v-else-if=\"!app.active\" class=\"enable force\" type=\"button\" :value=\"forceEnableButtonText\" v-on:click=\"forceEnable(app.id)\" v-tooltip.auto=\"forceEnableButtonTooltip\" :disabled=\"installing || loading(app.id)\" />\n\t\t\t</div>\n\t\t\t<div class=\"app-groups\">\n\t\t\t\t<div class=\"groups-enable\" v-if=\"app.active && canLimitToGroups(app)\">\n\t\t\t\t\t<input type=\"checkbox\" :value=\"app.id\" v-model=\"groupCheckedAppsData\" v-on:change=\"setGroupLimit\" class=\"groups-enable__checkbox checkbox\" :id=\"prefix('groups_enable', app.id)\">\n\t\t\t\t\t<label :for=\"prefix('groups_enable', app.id)\">{{ t('settings', 'Limit to groups') }}</label>\n\t\t\t\t\t<input type=\"hidden\" class=\"group_select\" :title=\"t('settings', 'All')\" value=\"\">\n\t\t\t\t\t<multiselect v-if=\"isLimitedToGroups(app)\" :options=\"groups\" :value=\"appGroups\" @select=\"addGroupLimitation\" @remove=\"removeGroupLimitation\" :options-limit=\"5\"\n\t\t\t\t\t\t\t\t :placeholder=\"t('settings', 'Limit app usage to groups')\"\n\t\t\t\t\t\t\t\t label=\"name\" track-by=\"id\" class=\"multiselect-vue\"\n\t\t\t\t\t\t\t\t :multiple=\"true\" :close-on-select=\"false\"\n\t\t\t\t\t\t\t\t :tag-width=\"60\" @search-change=\"asyncFindGroup\">\n\t\t\t\t\t\t<span slot=\"noResult\">{{t('settings', 'No results')}}</span>\n\t\t\t\t\t</multiselect>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\n\t\t<ul class=\"app-dependencies\">\n\t\t\t<li v-if=\"app.missingMinOwnCloudVersion\">{{ t('settings', 'This app has no minimum Nextcloud version assigned. This will be an error in the future.') }}</li>\n\t\t\t<li v-if=\"app.missingMaxOwnCloudVersion\">{{ t('settings', 'This app has no maximum Nextcloud version assigned. This will be an error in the future.') }}</li>\n\t\t\t<li v-if=\"!app.canInstall\">\n\t\t\t\t{{ t('settings', 'This app cannot be installed because the following dependencies are not fulfilled:') }}\n\t\t\t\t<ul class=\"missing-dependencies\">\n\t\t\t\t\t<li v-for=\"dep in app.missingDependencies\">{{ dep }}</li>\n\t\t\t\t</ul>\n\t\t\t</li>\n\t\t</ul>\n\n\t\t<p class=\"documentation\">\n\t\t\t<a class=\"appslink\" :href=\"appstoreUrl\" v-if=\"!app.internal\" target=\"_blank\" rel=\"noreferrer noopener\">{{ t('settings', 'View in store')}} ↗</a>\n\n\t\t\t<a class=\"appslink\" v-if=\"app.website\" :href=\"app.website\" target=\"_blank\" rel=\"noreferrer noopener\">{{ t('settings', 'Visit website') }} ↗</a>\n\t\t\t<a class=\"appslink\" v-if=\"app.bugs\" :href=\"app.bugs\" target=\"_blank\" rel=\"noreferrer noopener\">{{ t('settings', 'Report a bug') }} ↗</a>\n\n\t\t\t<a class=\"appslink\" v-if=\"app.documentation && app.documentation.user\" :href=\"app.documentation.user\" target=\"_blank\" rel=\"noreferrer noopener\">{{ t('settings', 'User documentation') }} ↗</a>\n\t\t\t<a class=\"appslink\" v-if=\"app.documentation && app.documentation.admin\" :href=\"app.documentation.admin\" target=\"_blank\" rel=\"noreferrer noopener\">{{ t('settings', 'Admin documentation') }} ↗</a>\n\t\t\t<a class=\"appslink\" v-if=\"app.documentation && app.documentation.developer\" :href=\"app.documentation.developer\" target=\"_blank\" rel=\"noreferrer noopener\">{{ t('settings', 'Developer documentation') }} ↗</a>\n\t\t</p>\n\n\t\t<div class=\"app-description\" v-html=\"renderMarkdown\"></div>\n\t</div>\n</template>\n\n<script>\nimport { Multiselect } from 'nextcloud-vue';\nimport marked from 'marked';\nimport dompurify from 'dompurify'\n\nimport AppScore from './appList/appScore';\nimport AppManagement from './appManagement';\nimport prefix from './prefixMixin';\nimport SvgFilterMixin from './svgFilterMixin';\n\nexport default {\n\tmixins: [AppManagement, prefix, SvgFilterMixin],\n\tname: 'appDetails',\n\tprops: ['category', 'app'],\n\tcomponents: {\n\t\tMultiselect,\n\t\tAppScore\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tgroupCheckedAppsData: false,\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\tcomputed: {\n\t\tappstoreUrl() {\n\t\t\treturn `https://apps.nextcloud.com/apps/${this.app.id}`;\n\t\t},\n\t\tlicence() {\n\t\t\tif (this.app.licence) {\n\t\t\t\treturn t('settings', '{license}-licensed', { license: ('' + this.app.licence).toUpperCase() } );\n\t\t\t}\n\t\t\treturn null;\n\t\t},\n\t\thasRating() {\n\t\t\treturn this.app.appstoreData && this.app.appstoreData.ratingNumOverall > 5;\n\t\t},\n\t\tauthor() {\n\t\t\tif (typeof this.app.author === 'string') {\n\t\t\t\treturn [\n\t\t\t\t\t{\n\t\t\t\t\t\t'@value': this.app.author\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t}\n\t\t\tif (this.app.author['@value']) {\n\t\t\t\treturn [this.app.author];\n\t\t\t}\n\t\t\treturn this.app.author;\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\trenderMarkdown() {\n\t\t\tvar renderer = new marked.Renderer();\n\t\t\trenderer.link = function(href, title, text) {\n\t\t\t\ttry {\n\t\t\t\t\tvar prot = 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\tvar 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.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.app.description.trim(), {\n\t\t\t\t\trenderer: renderer,\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'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>\n\t.force {\n\t\tbackground: var(--color-main-background);\n\t\tborder-color: var(--color-error);\n\t\tcolor: var(--color-error);\n\t}\n\t.force:hover,\n\t.force:active {\n\t\tbackground: var(--color-error);\n\t\tborder-color: var(--color-error) !important;\n\t\tcolor: var(--color-main-background);\n\t}\n</style>\n","import { render, staticRenderFns } from \"./appDetails.vue?vue&type=template&id=52943dc0&scoped=true&\"\nimport script from \"./appDetails.vue?vue&type=script&lang=js&\"\nexport * from \"./appDetails.vue?vue&type=script&lang=js&\"\nimport style0 from \"./appDetails.vue?vue&type=style&index=0&id=52943dc0&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 \"52943dc0\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticStyle:{\"padding\":\"20px\"},attrs:{\"id\":\"app-details-view\"}},[_c('h2',[(!_vm.app.preview)?_c('div',{staticClass:\"icon-settings-dark\"}):_vm._e(),_vm._v(\" \"),(_vm.app.previewAsIcon && _vm.app.preview)?_c('svg',{attrs:{\"width\":\"32\",\"height\":\"32\",\"viewBox\":\"0 0 32 32\"}},[_c('defs',[_c('filter',{attrs:{\"id\":_vm.filterId}},[_c('feColorMatrix',{attrs:{\"in\":\"SourceGraphic\",\"type\":\"matrix\",\"values\":\"-1 0 0 0 1 0 -1 0 0 1 0 0 -1 0 1 0 0 0 1 0\"}})],1)]),_vm._v(\" \"),_c('image',{staticClass:\"app-icon\",attrs:{\"x\":\"0\",\"y\":\"0\",\"width\":\"32\",\"height\":\"32\",\"preserveAspectRatio\":\"xMinYMin meet\",\"filter\":_vm.filterUrl,\"xlink:href\":_vm.app.preview}})]):_vm._e(),_vm._v(\"\\n\\t\\t\"+_vm._s(_vm.app.name))]),_vm._v(\" \"),(_vm.app.screenshot)?_c('img',{attrs:{\"src\":_vm.app.screenshot,\"width\":\"100%\"}}):_vm._e(),_vm._v(\" \"),(_vm.app.level === 300 || _vm.app.level === 200 || _vm.hasRating)?_c('div',{staticClass:\"app-level\"},[(_vm.app.level === 300)?_c('span',{directives:[{name:\"tooltip\",rawName:\"v-tooltip.auto\",value:(_vm.t('settings', 'This app is supported via your current Nextcloud subscription.')),expression:\"t('settings', 'This app is supported via your current Nextcloud subscription.')\",modifiers:{\"auto\":true}}],staticClass:\"supported icon-checkmark-color\"},[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.t('settings', 'Supported')))]):_vm._e(),_vm._v(\" \"),(_vm.app.level === 200)?_c('span',{directives:[{name:\"tooltip\",rawName:\"v-tooltip.auto\",value:(_vm.t('settings', 'Official apps are developed by and within the community. They offer central functionality and are ready for production use.')),expression:\"t('settings', 'Official apps are developed by and within the community. They offer central functionality and are ready for production use.')\",modifiers:{\"auto\":true}}],staticClass:\"official icon-checkmark\"},[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.t('settings', 'Official')))]):_vm._e(),_vm._v(\" \"),(_vm.hasRating)?_c('app-score',{attrs:{\"score\":_vm.app.appstoreData.ratingOverall}}):_vm._e()],1):_vm._e(),_vm._v(\" \"),(_vm.author)?_c('div',{staticClass:\"app-author\"},[_vm._v(\"\\n\\t\\t\"+_vm._s(_vm.t('settings', 'by'))+\"\\n\\t\\t\"),_vm._l((_vm.author),function(a,index){return _c('span',[(a['@attributes'] && a['@attributes']['homepage'])?_c('a',{attrs:{\"href\":a['@attributes']['homepage']}},[_vm._v(_vm._s(a['@value']))]):(a['@value'])?_c('span',[_vm._v(_vm._s(a['@value']))]):_c('span',[_vm._v(_vm._s(a))]),(index+1 < _vm.author.length)?_c('span',[_vm._v(\", \")]):_vm._e()])})],2):_vm._e(),_vm._v(\" \"),(_vm.licence)?_c('div',{staticClass:\"app-licence\"},[_vm._v(_vm._s(_vm.licence))]):_vm._e(),_vm._v(\" \"),_c('div',{staticClass:\"actions\"},[_c('div',{staticClass:\"actions-buttons\"},[(_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.loading(_vm.app.id)},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.loading(_vm.app.id)},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.loading(_vm.app.id)},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',{directives:[{name:\"tooltip\",rawName:\"v-tooltip.auto\",value:(_vm.enableButtonTooltip),expression:\"enableButtonTooltip\",modifiers:{\"auto\":true}}],staticClass:\"enable primary\",attrs:{\"type\":\"button\",\"value\":_vm.enableButtonText,\"disabled\":!_vm.app.canInstall || _vm.installing || _vm.loading(_vm.app.id)},on:{\"click\":function($event){return _vm.enable(_vm.app.id)}}}):(!_vm.app.active)?_c('input',{directives:[{name:\"tooltip\",rawName:\"v-tooltip.auto\",value:(_vm.forceEnableButtonTooltip),expression:\"forceEnableButtonTooltip\",modifiers:{\"auto\":true}}],staticClass:\"enable force\",attrs:{\"type\":\"button\",\"value\":_vm.forceEnableButtonText,\"disabled\":_vm.installing || _vm.loading(_vm.app.id)},on:{\"click\":function($event){return _vm.forceEnable(_vm.app.id)}}}):_vm._e()]),_vm._v(\" \"),_c('div',{staticClass:\"app-groups\"},[(_vm.app.active && _vm.canLimitToGroups(_vm.app))?_c('div',{staticClass:\"groups-enable\"},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.groupCheckedAppsData),expression:\"groupCheckedAppsData\"}],staticClass:\"groups-enable__checkbox checkbox\",attrs:{\"type\":\"checkbox\",\"id\":_vm.prefix('groups_enable', _vm.app.id)},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\":_vm.prefix('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(\" \"),(_vm.isLimitedToGroups(_vm.app))?_c('multiselect',{staticClass:\"multiselect-vue\",attrs:{\"options\":_vm.groups,\"value\":_vm.appGroups,\"options-limit\":5,\"placeholder\":_vm.t('settings', 'Limit app usage to groups'),\"label\":\"name\",\"track-by\":\"id\",\"multiple\":true,\"close-on-select\":false,\"tag-width\":60},on:{\"select\":_vm.addGroupLimitation,\"remove\":_vm.removeGroupLimitation,\"search-change\":_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('ul',{staticClass:\"app-dependencies\"},[(_vm.app.missingMinOwnCloudVersion)?_c('li',[_vm._v(_vm._s(_vm.t('settings', 'This app has no minimum Nextcloud version assigned. This will be an error in the future.')))]):_vm._e(),_vm._v(\" \"),(_vm.app.missingMaxOwnCloudVersion)?_c('li',[_vm._v(_vm._s(_vm.t('settings', 'This app has no maximum Nextcloud version assigned. This will be an error in the future.')))]):_vm._e(),_vm._v(\" \"),(!_vm.app.canInstall)?_c('li',[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.t('settings', 'This app cannot be installed because the following dependencies are not fulfilled:'))+\"\\n\\t\\t\\t\"),_c('ul',{staticClass:\"missing-dependencies\"},_vm._l((_vm.app.missingDependencies),function(dep){return _c('li',[_vm._v(_vm._s(dep))])}),0)]):_vm._e()]),_vm._v(\" \"),_c('p',{staticClass:\"documentation\"},[(!_vm.app.internal)?_c('a',{staticClass:\"appslink\",attrs:{\"href\":_vm.appstoreUrl,\"target\":\"_blank\",\"rel\":\"noreferrer noopener\"}},[_vm._v(_vm._s(_vm.t('settings', 'View in store'))+\" ↗\")]):_vm._e(),_vm._v(\" \"),(_vm.app.website)?_c('a',{staticClass:\"appslink\",attrs:{\"href\":_vm.app.website,\"target\":\"_blank\",\"rel\":\"noreferrer noopener\"}},[_vm._v(_vm._s(_vm.t('settings', 'Visit website'))+\" ↗\")]):_vm._e(),_vm._v(\" \"),(_vm.app.bugs)?_c('a',{staticClass:\"appslink\",attrs:{\"href\":_vm.app.bugs,\"target\":\"_blank\",\"rel\":\"noreferrer noopener\"}},[_vm._v(_vm._s(_vm.t('settings', 'Report a bug'))+\" ↗\")]):_vm._e(),_vm._v(\" \"),(_vm.app.documentation && _vm.app.documentation.user)?_c('a',{staticClass:\"appslink\",attrs:{\"href\":_vm.app.documentation.user,\"target\":\"_blank\",\"rel\":\"noreferrer noopener\"}},[_vm._v(_vm._s(_vm.t('settings', 'User documentation'))+\" ↗\")]):_vm._e(),_vm._v(\" \"),(_vm.app.documentation && _vm.app.documentation.admin)?_c('a',{staticClass:\"appslink\",attrs:{\"href\":_vm.app.documentation.admin,\"target\":\"_blank\",\"rel\":\"noreferrer noopener\"}},[_vm._v(_vm._s(_vm.t('settings', 'Admin documentation'))+\" ↗\")]):_vm._e(),_vm._v(\" \"),(_vm.app.documentation && _vm.app.documentation.developer)?_c('a',{staticClass:\"appslink\",attrs:{\"href\":_vm.app.documentation.developer,\"target\":\"_blank\",\"rel\":\"noreferrer noopener\"}},[_vm._v(_vm._s(_vm.t('settings', 'Developer documentation'))+\" ↗\")]):_vm._e()]),_vm._v(\" \"),_c('div',{staticClass:\"app-description\",domProps:{\"innerHTML\":_vm._s(_vm.renderMarkdown)}})])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<!--\n - @copyright Copyright (c) 2018 Julius Härtl <jus@bitgrid.net>\n -\n - @author Julius Härtl <jus@bitgrid.net>\n -\n - @license GNU AGPL version 3 or any later version\n -\n - This program is free software: you can redistribute it and/or modify\n - it under the terms of the GNU Affero General Public License as\n - published by the Free Software Foundation, either version 3 of the\n - License, or (at your option) any later version.\n -\n - This program is distributed in the hope that it will be useful,\n - but WITHOUT ANY WARRANTY; without even the implied warranty of\n - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n - GNU Affero General Public License for more details.\n -\n - You should have received a copy of the GNU Affero General Public License\n - along with this program. If not, see <http://www.gnu.org/licenses/>.\n -\n -->\n\n<template>\n\t<Content app-name=\"settings\" :class=\"{ 'with-app-sidebar': currentApp}\"\n\t:content-class=\"{ 'icon-loading': loadingList }\" :navigation-class=\"{ 'icon-loading': loading }\">\n\t\t<AppNavigation>\n\t\t\t<ul id=\"appscategories\">\n\t\t\t\t<AppNavigationItem v-for=\"item in menu\" :key=\"item.key\" :item=\"item\" />\n\t\t\t</ul>\n\t\t</AppNavigation>\n\t\t<AppContent class=\"app-settings-content\" :class=\"{ 'icon-loading': loadingList }\">\n\t\t\t<AppList :category=\"category\" :app=\"currentApp\" :search=\"searchQuery\" />\n\t\t</AppContent>\n\t\t<AppSidebar v-if=\"id && currentApp\" @close=\"hideAppDetails\">\n\t\t\t<AppDetails :category=\"category\" :app=\"currentApp\" />\n\t\t</AppSidebar>\n\t</Content>\n</template>\n\n<script>\nimport { \n\tAppContent,\n\tAppNavigation,\n\tAppNavigationItem,\n\tAppSidebar,\n\tContent\n} from 'nextcloud-vue';\nimport AppList from '../components/appList';\nimport Vue from 'vue';\nimport VueLocalStorage from 'vue-localstorage'\nimport AppDetails from '../components/appDetails';\n\nVue.use(VueLocalStorage)\n\nexport default {\n\tname: 'Apps',\n\tprops: {\n\t\tcategory: {\n\t\t\ttype: String,\n\t\t\tdefault: 'installed',\n\t\t},\n\t\tid: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t}\n\t},\n\tcomponents: {\n\t\tAppContent,\n\t\tAppNavigation,\n\t\tAppNavigationItem,\n\t\tAppSidebar,\n\t\tContent,\n\t\tAppDetails,\n\t\tAppList\n\t},\n\tmethods: {\n\t\tsetSearch(query) {\n\t\t\tthis.searchQuery = query;\n\t\t},\n\t\tresetSearch() {\n\t\t\tthis.setSearch('');\n\t\t},\n\t\thideAppDetails() {\n\t\t\tthis.$router.push({\n\t\t\t\tname: 'apps-category',\n\t\t\t\tparams: {category: this.category}\n\t\t\t})\n\t\t}\n\t},\n\tbeforeMount() {\n\t\tthis.$store.dispatch('getCategories');\n\t\tthis.$store.dispatch('getAllApps');\n\t\tthis.$store.dispatch('getGroups', {offset: 0, limit: 5});\n\t\tthis.$store.commit('setUpdateCount', this.$store.getters.getServerData.updateCount)\n\t},\n\tmounted() {\n\t\t/** \n\t\t * Register search\n\t\t */\n\t\tthis.appSearch = new OCA.Search(this.setSearch, this.resetSearch);\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tsearchQuery: ''\n\t\t}\n\t},\n\twatch: {\n\t\tcategory: function (val, old) {\n\t\t\tthis.setSearch('');\n\t\t}\n\t},\n\tcomputed: {\n\t\tloading() {\n\t\t\treturn this.$store.getters.loading('categories');\n\t\t},\n\t\tloadingList() {\n\t\t\treturn this.$store.getters.loading('list');\n\t\t},\n\t\tcurrentApp() {\n\t\t\treturn this.apps.find(app => app.id === this.id );\n\t\t},\n\t\tcategories() {\n\t\t\treturn this.$store.getters.getCategories;\n\t\t},\n\t\tapps() {\n\t\t\treturn this.$store.getters.getAllApps;\n\t\t},\n\t\tupdateCount() {\n\t\t\treturn this.$store.getters.getUpdateCount;\n\t\t},\n\t\tsettings() {\n\t\t\treturn this.$store.getters.getServerData;\n\t\t},\n\n\t\t// BUILD APP NAVIGATION MENU OBJECT\n\t\tmenu() {\n\t\t\t// Data provided php side\n\t\t\tlet categories = this.$store.getters.getCategories;\n\t\t\tcategories = Array.isArray(categories) ? categories : [];\n\n\t\t\t// Map groups\n\t\t\tcategories = categories.map(category => {\n\t\t\t\tlet item = {};\n\t\t\t\titem.id = 'app-category-' + category.ident;\n\t\t\t\titem.icon = 'icon-category-' + category.ident;\n\t\t\t\titem.classes = [];\t\t\t\t\t\t\t// empty classes, active will be set later\n\t\t\t\titem.router = {\t\t\t\t\t\t\t\t// router link to\n\t\t\t\t\tname: 'apps-category',\n\t\t\t\t\tparams: {category: category.ident}\n\t\t\t\t};\n\t\t\t\titem.text = category.displayName;\n\n\t\t\t\treturn item;\n\t\t\t});\n\n\n\t\t\t// Add everyone group\n\t\t\tlet defaultCategories = [\n\t\t\t\t{\n\t\t\t\t\tid: 'app-category-your-apps',\n\t\t\t\t\tclasses: [],\n\t\t\t\t\trouter: {name: 'apps'},\n\t\t\t\t\ticon: 'icon-category-installed',\n\t\t\t\t\ttext: t('settings', 'Your apps'),\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: 'app-category-enabled',\n\t\t\t\t\tclasses: [],\n\t\t\t\t\ticon: 'icon-category-enabled',\n\t\t\t\t\trouter: {name: 'apps-category', params: {category: 'enabled'}},\n\t\t\t\t\ttext: t('settings', 'Active apps'),\n\t\t\t\t}, {\n\t\t\t\t\tid: 'app-category-disabled',\n\t\t\t\t\tclasses: [],\n\t\t\t\t\ticon: 'icon-category-disabled',\n\t\t\t\t\trouter: {name: 'apps-category', params: {category: 'disabled'}},\n\t\t\t\t\ttext: t('settings', 'Disabled apps'),\n\t\t\t\t}\n\t\t\t];\n\n\t\t\tif (!this.settings.appstoreEnabled) {\n\t\t\t\treturn defaultCategories\n\t\t\t}\n\n\t\t\tif (this.$store.getters.getUpdateCount > 0) {\n\t\t\t\tdefaultCategories.push({\n\t\t\t\t\tid: 'app-category-updates',\n\t\t\t\t\tclasses: [],\n\t\t\t\t\ticon: 'icon-download',\n\t\t\t\t\trouter: {name: 'apps-category', params: {category: 'updates'}},\n\t\t\t\t\ttext: t('settings', 'Updates'),\n\t\t\t\t\tutils: {counter: this.$store.getters.getUpdateCount}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tdefaultCategories.push({\n\t\t\t\tid: 'app-category-app-bundles',\n\t\t\t\tclasses: [],\n\t\t\t\ticon: 'icon-category-app-bundles',\n\t\t\t\trouter: {name: 'apps-category', params: {category: 'app-bundles'}},\n\t\t\t\ttext: t('settings', 'App bundles'),\n\t\t\t});\n\n\t\t\tcategories = defaultCategories.concat(categories);\n\n\t\t\t// Set current group as active\n\t\t\tlet activeGroup = categories.findIndex(group => group.id === 'app-category-' + this.category);\n\t\t\tif (activeGroup >= 0) {\n\t\t\t\tcategories[activeGroup].classes.push('active');\n\t\t\t} else {\n\t\t\t\tcategories[0].classes.push('active');\n\t\t\t}\n\n\t\t\tcategories.push({\n\t\t\t\tid: 'app-developer-docs',\n\t\t\t\tclasses: [],\n\t\t\t\thref: this.settings.developerDocumentation,\n\t\t\t\ttext: t('settings', 'Developer documentation') + ' ↗',\n\t\t\t});\n\n\t\t\t// Return\n\t\t\treturn categories\n\t\t},\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!./Apps.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!./Apps.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./Apps.vue?vue&type=template&id=124a4d4a&\"\nimport script from \"./Apps.vue?vue&type=script&lang=js&\"\nexport * from \"./Apps.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"],"sourceRoot":""} \ No newline at end of file
+{"version":3,"sources":["webpack:///./settings/src/components/appList/appItem.vue?69f1","webpack:///./settings/src/components/appDetails.vue?c69f","webpack:///./settings/src/components/appList/appItem.vue?1b7a","webpack:///./settings/src/components/appList/appItem.vue?3b32","webpack:///./settings/src/components/appDetails.vue?1f9b","webpack:///./settings/src/components/appDetails.vue?656a","webpack:///./settings/src/views/Apps.vue?ae09","webpack:///./settings/src/components/appList/appScore.vue?02ae","webpack:///settings/src/components/appList/appScore.vue","webpack:///./settings/src/components/appList/appScore.vue","webpack:///./settings/src/components/appList/appScore.vue?644e","webpack:///./settings/src/components/appManagement.vue?f8d8","webpack:///settings/src/components/appManagement.vue","webpack:///./settings/src/components/appManagement.vue","webpack:///./settings/src/components/svgFilterMixin.vue?e63f","webpack:///settings/src/components/svgFilterMixin.vue","webpack:///./settings/src/components/svgFilterMixin.vue","webpack:///./settings/src/components/appList/appItem.vue?9674","webpack:///settings/src/components/appList/appItem.vue","webpack:///./settings/src/components/appList/appItem.vue","webpack:///./settings/src/components/appList/appItem.vue?1eee","webpack:///./settings/src/components/prefixMixin.vue?4873","webpack:///settings/src/components/prefixMixin.vue","webpack:///./settings/src/components/prefixMixin.vue","webpack:///./settings/src/components/appList.vue?42a6","webpack:///settings/src/components/appList.vue","webpack:///./settings/src/components/appList.vue","webpack:///./settings/src/components/appList.vue?dfbc","webpack:///./settings/src/components/appDetails.vue?c695","webpack:///settings/src/components/appDetails.vue","webpack:///./settings/src/components/appDetails.vue","webpack:///./settings/src/components/appDetails.vue?e38b","webpack:///settings/src/views/Apps.vue","webpack:///./settings/src/views/Apps.vue?b69d","webpack:///./settings/src/views/Apps.vue"],"names":["content","__webpack_require__","module","i","options","hmr","transform","insertInto","undefined","locals","exports","_node_modules_style_loader_index_js_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_appItem_vue_vue_type_style_index_0_id_1304a746_scoped_true_lang_css___WEBPACK_IMPORTED_MODULE_0__","n","push","_node_modules_style_loader_index_js_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_appDetails_vue_vue_type_style_index_0_id_52943dc0_scoped_true_lang_css___WEBPACK_IMPORTED_MODULE_0__","appList_appScorevue_type_script_lang_js_","name","props","computed","scoreImage","imageName","Math","round","this","score","OC","imagePath","appScore","Object","componentNormalizer","_h","$createElement","_self","_c","staticClass","attrs","src","components_appManagementvue_type_script_lang_js_","mounted","app","groups","length","groupCheckedAppsData","appGroups","map","group","id","loading","self","$store","getters","installing","enableButtonText","needsDownload","t","forceEnableButtonText","enableButtonTooltip","forceEnableButtonTooltip","base","methods","asyncFindGroup","query","dispatch","search","limit","offset","isLimitedToGroups","setGroupLimit","appId","canLimitToGroups","types","includes","addGroupLimitation","concat","removeGroupLimitation","currentGroups","index","indexOf","splice","forceEnable","then","response","Settings","Apps","rebuildNavigation","catch","error","Notification","show","enable","disable","remove","install","update","appManagement","appManagement_render","appManagement_staticRenderFns","components_svgFilterMixinvue_type_script_lang_js_","filterId","floor","random","Date","getSeconds","getMilliseconds","filterUrl","data","svgFilterMixin","svgFilterMixin_render","svgFilterMixin_staticRenderFns","appList_appItemvue_type_script_lang_js_","mixins","category","listView","type","Boolean","default","watch","$route.params.id","isSelected","components","AppScore","scrolled","$route","params","hasRating","appstoreData","ratingNumOverall","watchers","showAppDetails","event","currentTarget","tagName","$router","prefix","_prefix","appItem","_vm","class","selected","on","click","preview","screenshot","_e","_v","width","height","viewBox","in","values","x","y","preserveAspectRatio","filter","xlink:href","_s","summary","version","releases","level","directives","rawName","value","expression","modifiers","auto","disabled","$event","stopPropagation","active","canInstall","isCompatible","components_prefixMixinvue_type_script_lang_js_","prefixMixin","prefixMixin_render","prefixMixin_staticRenderFns","components_appListvue_type_script_lang_js_","apps","_this","getAllApps","toLowerCase","sort","a","b","sortStringA","sortStringB","Util","naturalSortCompare","installed","bundles","appstore","getServerData","bundleApps","bundle","bundleId","searchApps","_this2","find","_app","useAppStoreView","useListView","useBundleView","allBundlesEnabled","bundleToggleText","toggleBundle","disableBundle","enableBundle","console","log","appList","store","tag","_l","key","list-view","colspan","components_appDetailsvue_type_script_lang_js_","Multiselect","ncvuecomponents","appstoreUrl","licence","license","toUpperCase","author","@value","getGroups","localeCompare","renderMarkdown","renderer","marked_default","Renderer","link","href","title","text","prot","decodeURIComponent","unescape","replace","e","out","image","blockquote","quote","purify_default","sanitize","description","trim","gfm","highlight","tables","breaks","pedantic","smartLists","smartypants","SAFE_FOR_JQUERY","ALLOWED_TAGS","appDetails","staticStyle","padding","previewAsIcon","ratingOverall","domProps","checked","Array","isArray","_i","change","$$a","$$el","target","$$c","$$v","$$i","slice","for","options-limit","placeholder","label","track-by","multiple","close-on-select","tag-width","select","search-change","slot","dep","internal","rel","website","bugs","documentation","user","admin","developer","innerHTML","vue_runtime_esm","use","vue_local_storage_default","views_Appsvue_type_script_lang_js_","String","AppContent","AppNavigation","AppNavigationItem","AppSidebar","Content","AppDetails","AppList","setSearch","searchQuery","resetSearch","hideAppDetails","beforeMount","commit","updateCount","appSearch","OCA","Search","val","old","loadingList","currentApp","categories","getCategories","getUpdateCount","settings","menu","item","ident","icon","classes","router","displayName","defaultCategories","appstoreEnabled","utils","counter","activeGroup","findIndex","developerDocumentation","Apps_component","with-app-sidebar","app-name","content-class","icon-loading","navigation-class","close","__webpack_exports__"],"mappings":"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","file":"vue-4.js","sourcesContent":["\nvar content = require(\"!!../../../../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!./appItem.vue?vue&type=style&index=0&id=1304a746&scoped=true&lang=css&\");\n\nif(typeof content === 'string') content = [[module.id, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = require(\"!../../../../node_modules/style-loader/lib/addStyles.js\")(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(module.hot) {\n\tmodule.hot.accept(\"!!../../../../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!./appItem.vue?vue&type=style&index=0&id=1304a746&scoped=true&lang=css&\", function() {\n\t\tvar newContent = require(\"!!../../../../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!./appItem.vue?vue&type=style&index=0&id=1304a746&scoped=true&lang=css&\");\n\n\t\tif(typeof newContent === 'string') newContent = [[module.id, newContent, '']];\n\n\t\tvar locals = (function(a, b) {\n\t\t\tvar key, idx = 0;\n\n\t\t\tfor(key in a) {\n\t\t\t\tif(!b || a[key] !== b[key]) return false;\n\t\t\t\tidx++;\n\t\t\t}\n\n\t\t\tfor(key in b) idx--;\n\n\t\t\treturn idx === 0;\n\t\t}(content.locals, newContent.locals));\n\n\t\tif(!locals) throw new Error('Aborting CSS HMR due to changed css-modules locals.');\n\n\t\tupdate(newContent);\n\t});\n\n\tmodule.hot.dispose(function() { update(); });\n}","\nvar content = require(\"!!../../../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!./appDetails.vue?vue&type=style&index=0&id=52943dc0&scoped=true&lang=css&\");\n\nif(typeof content === 'string') content = [[module.id, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = require(\"!../../../node_modules/style-loader/lib/addStyles.js\")(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(module.hot) {\n\tmodule.hot.accept(\"!!../../../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!./appDetails.vue?vue&type=style&index=0&id=52943dc0&scoped=true&lang=css&\", function() {\n\t\tvar newContent = require(\"!!../../../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!./appDetails.vue?vue&type=style&index=0&id=52943dc0&scoped=true&lang=css&\");\n\n\t\tif(typeof newContent === 'string') newContent = [[module.id, newContent, '']];\n\n\t\tvar locals = (function(a, b) {\n\t\t\tvar key, idx = 0;\n\n\t\t\tfor(key in a) {\n\t\t\t\tif(!b || a[key] !== b[key]) return false;\n\t\t\t\tidx++;\n\t\t\t}\n\n\t\t\tfor(key in b) idx--;\n\n\t\t\treturn idx === 0;\n\t\t}(content.locals, newContent.locals));\n\n\t\tif(!locals) throw new Error('Aborting CSS HMR due to changed css-modules locals.');\n\n\t\tupdate(newContent);\n\t});\n\n\tmodule.hot.dispose(function() { update(); });\n}","import mod from \"-!../../../../node_modules/style-loader/index.js!../../../../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!./appItem.vue?vue&type=style&index=0&id=1304a746&scoped=true&lang=css&\"; export default mod; export * from \"-!../../../../node_modules/style-loader/index.js!../../../../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!./appItem.vue?vue&type=style&index=0&id=1304a746&scoped=true&lang=css&\"","exports = module.exports = require(\"../../../../node_modules/css-loader/dist/runtime/api.js\")(false);\n// Module\nexports.push([module.id, \"\\n.force[data-v-1304a746] {\\n\\tbackground: var(--color-main-background);\\n\\tborder-color: var(--color-error);\\n\\tcolor: var(--color-error);\\n}\\n.force[data-v-1304a746]:hover,\\n.force[data-v-1304a746]:active {\\n\\tbackground: var(--color-error);\\n\\tborder-color: var(--color-error) !important;\\n\\tcolor: var(--color-main-background);\\n}\\n\", \"\"]);\n","import mod from \"-!../../../node_modules/style-loader/index.js!../../../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!./appDetails.vue?vue&type=style&index=0&id=52943dc0&scoped=true&lang=css&\"; export default mod; export * from \"-!../../../node_modules/style-loader/index.js!../../../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!./appDetails.vue?vue&type=style&index=0&id=52943dc0&scoped=true&lang=css&\"","exports = module.exports = require(\"../../../node_modules/css-loader/dist/runtime/api.js\")(false);\n// Module\nexports.push([module.id, \"\\n.force[data-v-52943dc0] {\\n\\tbackground: var(--color-main-background);\\n\\tborder-color: var(--color-error);\\n\\tcolor: var(--color-error);\\n}\\n.force[data-v-52943dc0]:hover,\\n.force[data-v-52943dc0]:active {\\n\\tbackground: var(--color-error);\\n\\tborder-color: var(--color-error) !important;\\n\\tcolor: var(--color-main-background);\\n}\\n\", \"\"]);\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('Content',{class:{ 'with-app-sidebar': _vm.currentApp},attrs:{\"app-name\":\"settings\",\"content-class\":{ 'icon-loading': _vm.loadingList },\"navigation-class\":{ 'icon-loading': _vm.loading }}},[_c('AppNavigation',[_c('ul',{attrs:{\"id\":\"appscategories\"}},_vm._l((_vm.menu),function(item){return _c('AppNavigationItem',{key:item.key,attrs:{\"item\":item}})}),1)]),_vm._v(\" \"),_c('AppContent',{staticClass:\"app-settings-content\",class:{ 'icon-loading': _vm.loadingList }},[_c('AppList',{attrs:{\"category\":_vm.category,\"app\":_vm.currentApp,\"search\":_vm.searchQuery}})],1),_vm._v(\" \"),(_vm.id && _vm.currentApp)?_c('AppSidebar',{on:{\"close\":_vm.hideAppDetails}},[_c('AppDetails',{attrs:{\"category\":_vm.category,\"app\":_vm.currentApp}})],1):_vm._e()],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./appScore.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!./appScore.vue?vue&type=script&lang=js&\"","<!--\n - @copyright Copyright (c) 2018 Julius Härtl <jus@bitgrid.net>\n -\n - @author Julius Härtl <jus@bitgrid.net>\n -\n - @license GNU AGPL version 3 or any later version\n -\n - This program is free software: you can redistribute it and/or modify\n - it under the terms of the GNU Affero General Public License as\n - published by the Free Software Foundation, either version 3 of the\n - License, or (at your option) any later version.\n -\n - This program is distributed in the hope that it will be useful,\n - but WITHOUT ANY WARRANTY; without even the implied warranty of\n - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n - GNU Affero General Public License for more details.\n -\n - You should have received a copy of the GNU Affero General Public License\n - along with this program. If not, see <http://www.gnu.org/licenses/>.\n -\n -->\n\n<template>\n\t<img :src=\"scoreImage\" class=\"app-score-image\" />\n</template>\n<script>\n\texport default {\n\t\tname: 'appScore',\n\t\tprops: ['score'],\n\t\tcomputed: {\n\t\t\tscoreImage() {\n\t\t\t\tlet score = Math.round( this.score * 10 );\n\t\t\t\tlet imageName = 'rating/s' + score + '.svg';\n\t\t\t\treturn OC.imagePath('core', imageName);\n\t\t\t}\n\t\t}\n\t};\n</script>","import { render, staticRenderFns } from \"./appScore.vue?vue&type=template&id=3c7dd35d&\"\nimport script from \"./appScore.vue?vue&type=script&lang=js&\"\nexport * from \"./appScore.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","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('img',{staticClass:\"app-score-image\",attrs:{\"src\":_vm.scoreImage}})}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./appManagement.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!./appManagement.vue?vue&type=script&lang=js&\"","<!--\n - @copyright Copyright (c) 2018 Julius Härtl <jus@bitgrid.net>\n -\n - @author Julius Härtl <jus@bitgrid.net>\n -\n - @license GNU AGPL version 3 or any later version\n -\n - This program is free software: you can redistribute it and/or modify\n - it under the terms of the GNU Affero General Public License as\n - published by the Free Software Foundation, either version 3 of the\n - License, or (at your option) any later version.\n -\n - This program is distributed in the hope that it will be useful,\n - but WITHOUT ANY WARRANTY; without even the implied warranty of\n - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n - GNU Affero General Public License for more details.\n -\n - You should have received a copy of the GNU Affero General Public License\n - along with this program. If not, see <http://www.gnu.org/licenses/>.\n -\n -->\n\n<script>\n\texport default {\n\t\tmounted() {\n\t\t\tif (this.app.groups.length > 0) {\n\t\t\t\tthis.groupCheckedAppsData = true;\n\t\t\t}\n\t\t},\n\t\tcomputed: {\n\t\t\tappGroups() {\n\t\t\t\treturn this.app.groups.map(group => {return {id: group, name: group}});\n\t\t\t},\n\t\t\tloading() {\n\t\t\t\tlet self = this;\n\t\t\t\treturn function(id) {\n\t\t\t\t\treturn self.$store.getters.loading(id);\n\t\t\t\t}\n\t\t\t},\n\t\t\tinstalling() {\n\t\t\t\treturn this.$store.getters.loading('install');\n\t\t\t},\n\t\t\tenableButtonText() {\n\t\t\t\tif (this.app.needsDownload) {\n\t\t\t\t\treturn t('settings', 'Download and enable');\n\t\t\t\t}\n\t\t\t\treturn t('settings', 'Enable');\n\t\t\t},\n\t\t\tforceEnableButtonText() {\n\t\t\t\tif (this.app.needsDownload) {\n\t\t\t\t\treturn t('settings', 'Enable untested app');\n\t\t\t\t}\n\t\t\t\treturn t('settings', 'Enable untested app');\n\t\t\t},\n\t\t\tenableButtonTooltip() {\n\t\t\t\tif (this.app.needsDownload) {\n\t\t\t\t\treturn t('settings','The app will be downloaded from the app store');\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t},\n\t\t\tforceEnableButtonTooltip() {\n\t\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\t\tif (this.app.needsDownload) {\n\t\t\t\t\treturn base + ' ' + t('settings','The app will be downloaded from the app store');\n\t\t\t\t}\n\t\t\t\treturn base;\n\t\t\t}\n\t\t},\n\t\tmethods: {\n\t\t\tasyncFindGroup(query) {\n\t\t\t\treturn this.$store.dispatch('getGroups', {search: query, limit: 5, offset: 0});\n\t\t\t},\n\t\t\tisLimitedToGroups(app) {\n\t\t\t\tif (this.app.groups.length || this.groupCheckedAppsData) {\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\tsetGroupLimit: function() {\n\t\t\t\tif (!this.groupCheckedAppsData) {\n\t\t\t\t\tthis.$store.dispatch('enableApp', {appId: this.app.id, groups: []});\n\t\t\t\t}\n\t\t\t},\n\t\t\tcanLimitToGroups(app) {\n\t\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\t\treturn false;\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t},\n\t\t\taddGroupLimitation(group) {\n\t\t\t\tlet groups = this.app.groups.concat([]).concat([group.id]);\n\t\t\t\tthis.$store.dispatch('enableApp', { appId: this.app.id, groups: groups});\n\t\t\t},\n\t\t\tremoveGroupLimitation(group) {\n\t\t\t\tlet currentGroups = this.app.groups.concat([]);\n\t\t\t\tlet index = currentGroups.indexOf(group.id);\n\t\t\t\tif (index > -1) {\n\t\t\t\t\tcurrentGroups.splice(index, 1);\n\t\t\t\t}\n\t\t\t\tthis.$store.dispatch('enableApp', { appId: this.app.id, groups: currentGroups});\n\t\t\t},\n\t\t\tforceEnable(appId) {\n\t\t\t\tthis.$store.dispatch('forceEnableApp', { appId: appId, groups: [] })\n\t\t\t\t\t.then((response) => { OC.Settings.Apps.rebuildNavigation(); })\n\t\t\t\t\t.catch((error) => { OC.Notification.show(error)});\n\t\t\t},\n\t\t\tenable(appId) {\n\t\t\t\tthis.$store.dispatch('enableApp', { appId: appId, groups: [] })\n\t\t\t\t\t.then((response) => { OC.Settings.Apps.rebuildNavigation(); })\n\t\t\t\t\t.catch((error) => { OC.Notification.show(error)});\n\t\t\t},\n\t\t\tdisable(appId) {\n\t\t\t\tthis.$store.dispatch('disableApp', { appId: appId })\n\t\t\t\t\t.then((response) => { OC.Settings.Apps.rebuildNavigation(); })\n\t\t\t\t\t.catch((error) => { OC.Notification.show(error)});\n\t\t\t},\n\t\t\tremove(appId) {\n\t\t\t\tthis.$store.dispatch('uninstallApp', { appId: appId })\n\t\t\t\t\t.then((response) => { OC.Settings.Apps.rebuildNavigation(); })\n\t\t\t\t\t.catch((error) => { OC.Notification.show(error)});\n\t\t\t},\n\t\t\tinstall(appId) {\n\t\t\t\tthis.$store.dispatch('enableApp', { appId: appId })\n\t\t\t\t\t.then((response) => { OC.Settings.Apps.rebuildNavigation(); })\n\t\t\t\t\t.catch((error) => { OC.Notification.show(error)});\n\t\t\t},\n\t\t\tupdate(appId) {\n\t\t\t\tthis.$store.dispatch('updateApp', { appId: appId })\n\t\t\t\t\t.then((response) => { OC.Settings.Apps.rebuildNavigation(); })\n\t\t\t\t\t.catch((error) => { OC.Notification.show(error)});\n\t\t\t}\n\t\t}\n\t}\n</script>\n","var render, staticRenderFns\nimport script from \"./appManagement.vue?vue&type=script&lang=js&\"\nexport * from \"./appManagement.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","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&\"","<!--\n - @copyright Copyright (c) 2018 Julius Härtl <jus@bitgrid.net>\n -\n - @author Julius Härtl <jus@bitgrid.net>\n -\n - @license GNU AGPL version 3 or any later version\n -\n - This program is free software: you can redistribute it and/or modify\n - it under the terms of the GNU Affero General Public License as\n - published by the Free Software Foundation, either version 3 of the\n - License, or (at your option) any later version.\n -\n - This program is distributed in the hope that it will be useful,\n - but WITHOUT ANY WARRANTY; without even the implied warranty of\n - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n - GNU Affero General Public License for more details.\n -\n - You should have received a copy of the GNU Affero General Public License\n - along with this program. If not, see <http://www.gnu.org/licenses/>.\n -\n -->\n\n<script>\n\texport default {\n\t\tname: 'svgFilterMixin',\n\t\tmounted() {\n\t\t\tthis.filterId = 'invertIconApps' + Math.floor((Math.random() * 100 )) + new Date().getSeconds() + new Date().getMilliseconds();\n\t\t},\n\t\tcomputed: {\n\t\t\tfilterUrl () {\n\t\t\t\treturn `url(#${this.filterId})`;\n\t\t\t},\n\t\t},\n\t\tdata() {\n\t\t\treturn {\n\t\t\t\tfilterId: '',\n\t\t\t};\n\t\t},\n\t}\n</script>","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","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 - @copyright Copyright (c) 2018 Julius Härtl <jus@bitgrid.net>\n -\n - @author Julius Härtl <jus@bitgrid.net>\n -\n - @license GNU AGPL version 3 or any later version\n -\n - This program is free software: you can redistribute it and/or modify\n - it under the terms of the GNU Affero General Public License as\n - published by the Free Software Foundation, either version 3 of the\n - License, or (at your option) any later version.\n -\n - This program is distributed in the hope that it will be useful,\n - but WITHOUT ANY WARRANTY; without even the implied warranty of\n - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n - GNU Affero General Public License for more details.\n -\n - You should have received a copy of the GNU Affero General Public License\n - along with this program. If not, see <http://www.gnu.org/licenses/>.\n -\n -->\n\n<template>\n\t<div class=\"section\" v-bind:class=\"{ selected: isSelected }\" v-on:click=\"showAppDetails\">\n\t\t<div class=\"app-image app-image-icon\" v-on:click=\"showAppDetails\">\n\t\t\t<div v-if=\"(listView && !app.preview) || (!listView && !app.screenshot)\" class=\"icon-settings-dark\"></div>\n\n\t\t\t<svg v-if=\"listView && app.preview\" width=\"32\" height=\"32\" viewBox=\"0 0 32 32\">\n\t\t\t\t<defs><filter :id=\"filterId\"><feColorMatrix in=\"SourceGraphic\" type=\"matrix\" values=\"-1 0 0 0 1 0 -1 0 0 1 0 0 -1 0 1 0 0 0 1 0\"></feColorMatrix></filter></defs>\n\t\t\t\t<image x=\"0\" y=\"0\" width=\"32\" height=\"32\" preserveAspectRatio=\"xMinYMin meet\" :filter=\"filterUrl\" :xlink:href=\"app.preview\" class=\"app-icon\"></image>\n\t\t\t</svg>\n\n\t\t\t<img v-if=\"!listView && app.screenshot\" :src=\"app.screenshot\" width=\"100%\" />\n\t\t</div>\n\t\t<div class=\"app-name\" v-on:click=\"showAppDetails\">\n\t\t\t{{ app.name }}\n\t\t</div>\n\t\t<div class=\"app-summary\" v-if=\"!listView\">{{ app.summary }}</div>\n\t\t<div class=\"app-version\" v-if=\"listView\">\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</div>\n\n\t\t<div class=\"app-level\">\n\t\t\t<span class=\"supported icon-checkmark-color\" v-if=\"app.level === 300\"\n\t\t\t\t v-tooltip.auto=\"t('settings', 'This app is supported via your current Nextcloud subscription.')\">\n\t\t\t\t{{ t('settings', 'Supported') }}</span>\n\t\t\t<span class=\"official icon-checkmark\" v-if=\"app.level === 200\"\n\t\t\t\t v-tooltip.auto=\"t('settings', 'Official apps are developed by and within the community. They offer central functionality and are ready for production use.')\">\n\t\t\t\t{{ t('settings', 'Official') }}</span>\n\t\t\t<app-score v-if=\"hasRating && !listView\" :score=\"app.score\"></app-score>\n\t\t</div>\n\n\t\t<div class=\"actions\">\n\t\t\t<div class=\"warning\" v-if=\"app.error\">{{ app.error }}</div>\n\t\t\t<div class=\"icon icon-loading-small\" v-if=\"loading(app.id)\"></div>\n\t\t\t<input v-if=\"app.update\" class=\"update primary\" type=\"button\" :value=\"t('settings', 'Update to {update}', {update:app.update})\" v-on:click.stop=\"update(app.id)\" :disabled=\"installing || loading(app.id)\" />\n\t\t\t<input v-if=\"app.canUnInstall\" class=\"uninstall\" type=\"button\" :value=\"t('settings', 'Remove')\" v-on:click.stop=\"remove(app.id)\" :disabled=\"installing || loading(app.id)\" />\n\t\t\t<input v-if=\"app.active\" class=\"enable\" type=\"button\" :value=\"t('settings','Disable')\" v-on:click.stop=\"disable(app.id)\" :disabled=\"installing || loading(app.id)\" />\n\t\t\t<input v-if=\"!app.active && (app.canInstall || app.isCompatible)\" class=\"enable\" type=\"button\" :value=\"enableButtonText\" v-on:click.stop=\"enable(app.id)\" v-tooltip.auto=\"enableButtonTooltip\" :disabled=\"!app.canInstall || installing || loading(app.id)\" />\n\t\t\t<input v-else-if=\"!app.active\" class=\"enable force\" type=\"button\" :value=\"forceEnableButtonText\" v-on:click.stop=\"forceEnable(app.id)\" v-tooltip.auto=\"forceEnableButtonTooltip\" :disabled=\"installing || loading(app.id)\" />\n\t\t</div>\n\t</div>\n</template>\n\n<script>\n\timport AppScore from './appScore';\n\timport AppManagement from '../appManagement';\n\timport SvgFilterMixin from '../svgFilterMixin';\n\n\texport default {\n\t\tname: 'appItem',\n\t\tmixins: [AppManagement, SvgFilterMixin],\n\t\tprops: {\n\t\t\tapp: {},\n\t\t\tcategory: {},\n\t\t\tlistView: {\n\t\t\t\ttype: Boolean,\n\t\t\t\tdefault: true,\n\t\t\t}\n\t\t},\n\t\twatch: {\n\t\t\t'$route.params.id': function (id) {\n\t\t\t\tthis.isSelected = (this.app.id === id);\n\t\t\t}\n\t\t},\n\t\tcomponents: {\n\t\t\tAppScore,\n\t\t},\n\t\tdata() {\n\t\t\treturn {\n\t\t\t\tisSelected: false,\n\t\t\t\tscrolled: false,\n\t\t\t};\n\t\t},\n\t\tmounted() {\n\t\t\tthis.isSelected = (this.app.id === this.$route.params.id);\n\t\t},\n\t\tcomputed: {\n\t\t\thasRating() {\n\t\t\t\treturn this.app.appstoreData && this.app.appstoreData.ratingNumOverall > 5;\n\t\t\t},\n\t\t},\n\t\twatchers: {\n\n\t\t},\n\t\tmethods: {\n\t\t\tshowAppDetails(event) {\n\t\t\t\tif (event.currentTarget.tagName === 'INPUT' || event.currentTarget.tagName === 'A') {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tthis.$router.push({\n\t\t\t\t\tname: 'apps-details',\n\t\t\t\t\tparams: {category: this.category, id: this.app.id}\n\t\t\t\t});\n\t\t\t},\n\t\t\tprefix(prefix, content) {\n\t\t\t\treturn prefix + '_' + content;\n\t\t\t},\n\t\t}\n\t}\n</script>\n\n<style scoped>\n\t.force {\n\t\tbackground: var(--color-main-background);\n\t\tborder-color: var(--color-error);\n\t\tcolor: var(--color-error);\n\t}\n\t.force:hover,\n\t.force:active {\n\t\tbackground: var(--color-error);\n\t\tborder-color: var(--color-error) !important;\n\t\tcolor: var(--color-main-background);\n\t}\n</style>\n","import { render, staticRenderFns } from \"./appItem.vue?vue&type=template&id=1304a746&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=1304a746&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 \"1304a746\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"section\",class:{ selected: _vm.isSelected },on:{\"click\":_vm.showAppDetails}},[_c('div',{staticClass:\"app-image app-image-icon\",on:{\"click\":_vm.showAppDetails}},[((_vm.listView && !_vm.app.preview) || (!_vm.listView && !_vm.app.screenshot))?_c('div',{staticClass:\"icon-settings-dark\"}):_vm._e(),_vm._v(\" \"),(_vm.listView && _vm.app.preview)?_c('svg',{attrs:{\"width\":\"32\",\"height\":\"32\",\"viewBox\":\"0 0 32 32\"}},[_c('defs',[_c('filter',{attrs:{\"id\":_vm.filterId}},[_c('feColorMatrix',{attrs:{\"in\":\"SourceGraphic\",\"type\":\"matrix\",\"values\":\"-1 0 0 0 1 0 -1 0 0 1 0 0 -1 0 1 0 0 0 1 0\"}})],1)]),_vm._v(\" \"),_c('image',{staticClass:\"app-icon\",attrs:{\"x\":\"0\",\"y\":\"0\",\"width\":\"32\",\"height\":\"32\",\"preserveAspectRatio\":\"xMinYMin meet\",\"filter\":_vm.filterUrl,\"xlink:href\":_vm.app.preview}})]):_vm._e(),_vm._v(\" \"),(!_vm.listView && _vm.app.screenshot)?_c('img',{attrs:{\"src\":_vm.app.screenshot,\"width\":\"100%\"}}):_vm._e()]),_vm._v(\" \"),_c('div',{staticClass:\"app-name\",on:{\"click\":_vm.showAppDetails}},[_vm._v(\"\\n\\t\\t\"+_vm._s(_vm.app.name)+\"\\n\\t\")]),_vm._v(\" \"),(!_vm.listView)?_c('div',{staticClass:\"app-summary\"},[_vm._v(_vm._s(_vm.app.summary))]):_vm._e(),_vm._v(\" \"),(_vm.listView)?_c('div',{staticClass:\"app-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('div',{staticClass:\"app-level\"},[(_vm.app.level === 300)?_c('span',{directives:[{name:\"tooltip\",rawName:\"v-tooltip.auto\",value:(_vm.t('settings', 'This app is supported via your current Nextcloud subscription.')),expression:\"t('settings', 'This app is supported via your current Nextcloud subscription.')\",modifiers:{\"auto\":true}}],staticClass:\"supported icon-checkmark-color\"},[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.t('settings', 'Supported')))]):_vm._e(),_vm._v(\" \"),(_vm.app.level === 200)?_c('span',{directives:[{name:\"tooltip\",rawName:\"v-tooltip.auto\",value:(_vm.t('settings', 'Official apps are developed by and within the community. They offer central functionality and are ready for production use.')),expression:\"t('settings', 'Official apps are developed by and within the community. They offer central functionality and are ready for production use.')\",modifiers:{\"auto\":true}}],staticClass:\"official icon-checkmark\"},[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.t('settings', 'Official')))]):_vm._e(),_vm._v(\" \"),(_vm.hasRating && !_vm.listView)?_c('app-score',{attrs:{\"score\":_vm.app.score}}):_vm._e()],1),_vm._v(\" \"),_c('div',{staticClass:\"actions\"},[(_vm.app.error)?_c('div',{staticClass:\"warning\"},[_vm._v(_vm._s(_vm.app.error))]):_vm._e(),_vm._v(\" \"),(_vm.loading(_vm.app.id))?_c('div',{staticClass:\"icon icon-loading-small\"}):_vm._e(),_vm._v(\" \"),(_vm.app.update)?_c('input',{staticClass:\"update primary\",attrs:{\"type\":\"button\",\"value\":_vm.t('settings', 'Update to {update}', {update:_vm.app.update}),\"disabled\":_vm.installing || _vm.loading(_vm.app.id)},on:{\"click\":function($event){$event.stopPropagation();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.loading(_vm.app.id)},on:{\"click\":function($event){$event.stopPropagation();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.loading(_vm.app.id)},on:{\"click\":function($event){$event.stopPropagation();return _vm.disable(_vm.app.id)}}}):_vm._e(),_vm._v(\" \"),(!_vm.app.active && (_vm.app.canInstall || _vm.app.isCompatible))?_c('input',{directives:[{name:\"tooltip\",rawName:\"v-tooltip.auto\",value:(_vm.enableButtonTooltip),expression:\"enableButtonTooltip\",modifiers:{\"auto\":true}}],staticClass:\"enable\",attrs:{\"type\":\"button\",\"value\":_vm.enableButtonText,\"disabled\":!_vm.app.canInstall || _vm.installing || _vm.loading(_vm.app.id)},on:{\"click\":function($event){$event.stopPropagation();return _vm.enable(_vm.app.id)}}}):(!_vm.app.active)?_c('input',{directives:[{name:\"tooltip\",rawName:\"v-tooltip.auto\",value:(_vm.forceEnableButtonTooltip),expression:\"forceEnableButtonTooltip\",modifiers:{\"auto\":true}}],staticClass:\"enable force\",attrs:{\"type\":\"button\",\"value\":_vm.forceEnableButtonText,\"disabled\":_vm.installing || _vm.loading(_vm.app.id)},on:{\"click\":function($event){$event.stopPropagation();return _vm.forceEnable(_vm.app.id)}}}):_vm._e()])])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./prefixMixin.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!./prefixMixin.vue?vue&type=script&lang=js&\"","<!--\n - @copyright Copyright (c) 2018 Julius Härtl <jus@bitgrid.net>\n -\n - @author Julius Härtl <jus@bitgrid.net>\n -\n - @license GNU AGPL version 3 or any later version\n -\n - This program is free software: you can redistribute it and/or modify\n - it under the terms of the GNU Affero General Public License as\n - published by the Free Software Foundation, either version 3 of the\n - License, or (at your option) any later version.\n -\n - This program is distributed in the hope that it will be useful,\n - but WITHOUT ANY WARRANTY; without even the implied warranty of\n - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n - GNU Affero General Public License for more details.\n -\n - You should have received a copy of the GNU Affero General Public License\n - along with this program. If not, see <http://www.gnu.org/licenses/>.\n -\n -->\n\n<script>\n\texport default {\n\t\tname: 'prefixMixin',\n\t\tmethods: {\n\t\t\tprefix (prefix, content) {\n\t\t\t\treturn prefix + '_' + content;\n\t\t\t},\n\t\t}\n\t}\n</script>","var render, staticRenderFns\nimport script from \"./prefixMixin.vue?vue&type=script&lang=js&\"\nexport * from \"./prefixMixin.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","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 - @copyright Copyright (c) 2018 Julius Härtl <jus@bitgrid.net>\n -\n - @author Julius Härtl <jus@bitgrid.net>\n -\n - @license GNU AGPL version 3 or any later version\n -\n - This program is free software: you can redistribute it and/or modify\n - it under the terms of the GNU Affero General Public License as\n - published by the Free Software Foundation, either version 3 of the\n - License, or (at your option) any later version.\n -\n - This program is distributed in the hope that it will be useful,\n - but WITHOUT ANY WARRANTY; without even the implied warranty of\n - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n - GNU Affero General Public License for more details.\n -\n - You should have received a copy of the GNU Affero General Public License\n - along with this program. If not, see <http://www.gnu.org/licenses/>.\n -\n -->\n\n<template>\n\t<div id=\"app-content-inner\">\n\t\t<div id=\"apps-list\" class=\"apps-list\" :class=\"{installed: (useBundleView || useListView), store: useAppStoreView}\">\n\t\t\t<template v-if=\"useListView\">\n\t\t\t\t<transition-group name=\"app-list\" tag=\"div\" class=\"apps-list-container\">\n\t\t\t\t\t<app-item v-for=\"app in apps\" :key=\"app.id\" :app=\"app\" :category=\"category\" />\n\t\t\t\t</transition-group>\n\t\t\t</template>\n\t\t\t<template v-for=\"bundle in bundles\" v-if=\"useBundleView && bundleApps(bundle.id).length > 0\">\n\t\t\t\t<transition-group name=\"app-list\" tag=\"div\" class=\"apps-list-container\">\n\n\t\t\t\t\t<div class=\"apps-header\" :key=\"bundle.id\">\n\t\t\t\t\t\t<div class=\"app-image\"></div>\n\t\t\t\t\t\t<h2>{{ bundle.name }} <input type=\"button\" :value=\"bundleToggleText(bundle.id)\" v-on:click=\"toggleBundle(bundle.id)\"></h2>\n\t\t\t\t\t\t<div class=\"app-version\"></div>\n\t\t\t\t\t\t<div class=\"app-level\"></div>\n\t\t\t\t\t\t<div class=\"app-groups\"></div>\n\t\t\t\t\t\t<div class=\"actions\">&nbsp;</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<app-item v-for=\"app in bundleApps(bundle.id)\" :key=\"bundle.id + app.id\" :app=\"app\" :category=\"category\"/>\n\t\t\t\t</transition-group>\n\t\t\t</template>\n\t\t\t<template v-if=\"useAppStoreView\">\n\t\t\t\t<app-item v-for=\"app in apps\" :key=\"app.id\" :app=\"app\" :category=\"category\" :list-view=\"false\" />\n\t\t\t</template>\n\n\t\t</div>\n\n\t\t<div id=\"apps-list-search\" class=\"apps-list installed\">\n\t\t\t<div class=\"apps-list-container\">\n\t\t\t\t<template v-if=\"search !== '' && searchApps.length > 0\">\n\t\t\t\t\t<div class=\"section\">\n\t\t\t\t\t\t<div></div>\n\t\t\t\t\t\t<td colspan=\"5\">\n\t\t\t\t\t\t\t<h2>{{ t('settings', 'Results from other categories') }}</h2>\n\t\t\t\t\t\t</td>\n\t\t\t\t\t</div>\n\t\t\t\t\t<app-item v-for=\"app in searchApps\" :key=\"app.id\" :app=\"app\" :category=\"category\" :list-view=\"true\" />\n\t\t\t\t</template>\n\t\t\t</div>\n\t\t</div>\n\n\t\t<div id=\"apps-list-empty\" class=\"emptycontent emptycontent-search\" v-if=\"!loading && searchApps.length === 0 && apps.length === 0\">\n\t\t\t<div id=\"app-list-empty-icon\" class=\"icon-settings-dark\"></div>\n\t\t\t<h2>{{ t('settings', 'No apps found for your version')}}</h2>\n\t\t</div>\n\n\t\t<div id=\"searchresults\"></div>\n\t</div>\n</template>\n\n<script>\nimport appItem from './appList/appItem';\nimport prefix from './prefixMixin';\n\nexport default {\n\tname: 'appList',\n\tmixins: [prefix],\n\tprops: ['category', 'app', 'search'],\n\tcomponents: {\n\t\tappItem\n\t},\n\tcomputed: {\n\t\tloading() {\n\t\t\treturn this.$store.getters.loading('list');\n\t\t},\n\t\tapps() {\n\t\t\tlet 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\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.getServerData.bundles;\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 => app.bundleId === bundle);\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');\n\t\t},\n\t\tuseBundleView() {\n\t\t\treturn (this.category === 'app-bundles');\n\t\t},\n\t\tallBundlesEnabled() {\n\t\t\tlet self = this;\n\t\t\treturn function(id) {\n\t\t\t\treturn self.bundleApps(id).filter(app => !app.active).length === 0;\n\t\t\t}\n\t\t},\n\t\tbundleToggleText() {\n\t\t\tlet self = this;\n\t\t\treturn function(id) {\n\t\t\t\tif (self.allBundlesEnabled(id)) {\n\t\t\t\t\treturn t('settings', 'Disable all');\n\t\t\t\t}\n\t\t\t\treturn t('settings', 'Enable all');\n\t\t\t}\n\t\t}\n\t},\n\tmethods: {\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\tlet 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) => { console.log(error); OC.Notification.show(error)});\n\t\t},\n\t\tdisableBundle(id) {\n\t\t\tlet 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) => { OC.Notification.show(error)});\n\t\t}\n\t},\n}\n</script>\n","import { render, staticRenderFns } from \"./appList.vue?vue&type=template&id=f515f708&\"\nimport script from \"./appList.vue?vue&type=script&lang=js&\"\nexport * from \"./appList.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","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{attrs:{\"id\":\"app-content-inner\"}},[_c('div',{staticClass:\"apps-list\",class:{installed: (_vm.useBundleView || _vm.useListView), store: _vm.useAppStoreView},attrs:{\"id\":\"apps-list\"}},[(_vm.useListView)?[_c('transition-group',{staticClass:\"apps-list-container\",attrs:{\"name\":\"app-list\",\"tag\":\"div\"}},_vm._l((_vm.apps),function(app){return _c('app-item',{key:app.id,attrs:{\"app\":app,\"category\":_vm.category}})}),1)]:_vm._e(),_vm._v(\" \"),_vm._l((_vm.bundles),function(bundle){return (_vm.useBundleView && _vm.bundleApps(bundle.id).length > 0)?[_c('transition-group',{staticClass:\"apps-list-container\",attrs:{\"name\":\"app-list\",\"tag\":\"div\"}},[_c('div',{key:bundle.id,staticClass:\"apps-header\"},[_c('div',{staticClass:\"app-image\"}),_vm._v(\" \"),_c('h2',[_vm._v(_vm._s(bundle.name)+\" \"),_c('input',{attrs:{\"type\":\"button\",\"value\":_vm.bundleToggleText(bundle.id)},on:{\"click\":function($event){return _vm.toggleBundle(bundle.id)}}})]),_vm._v(\" \"),_c('div',{staticClass:\"app-version\"}),_vm._v(\" \"),_c('div',{staticClass:\"app-level\"}),_vm._v(\" \"),_c('div',{staticClass:\"app-groups\"}),_vm._v(\" \"),_c('div',{staticClass:\"actions\"},[_vm._v(\" \")])]),_vm._v(\" \"),_vm._l((_vm.bundleApps(bundle.id)),function(app){return _c('app-item',{key:bundle.id + app.id,attrs:{\"app\":app,\"category\":_vm.category}})})],2)]:_vm._e()}),_vm._v(\" \"),(_vm.useAppStoreView)?_vm._l((_vm.apps),function(app){return _c('app-item',{key:app.id,attrs:{\"app\":app,\"category\":_vm.category,\"list-view\":false}})}):_vm._e()],2),_vm._v(\" \"),_c('div',{staticClass:\"apps-list installed\",attrs:{\"id\":\"apps-list-search\"}},[_c('div',{staticClass:\"apps-list-container\"},[(_vm.search !== '' && _vm.searchApps.length > 0)?[_c('div',{staticClass:\"section\"},[_c('div'),_vm._v(\" \"),_c('td',{attrs:{\"colspan\":\"5\"}},[_c('h2',[_vm._v(_vm._s(_vm.t('settings', 'Results from other categories')))])])]),_vm._v(\" \"),_vm._l((_vm.searchApps),function(app){return _c('app-item',{key:app.id,attrs:{\"app\":app,\"category\":_vm.category,\"list-view\":true}})})]:_vm._e()],2)]),_vm._v(\" \"),(!_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(),_vm._v(\" \"),_c('div',{attrs:{\"id\":\"searchresults\"}})])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./appDetails.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!./appDetails.vue?vue&type=script&lang=js&\"","<!--\n - @copyright Copyright (c) 2018 Julius Härtl <jus@bitgrid.net>\n -\n - @author Julius Härtl <jus@bitgrid.net>\n -\n - @license GNU AGPL version 3 or any later version\n -\n - This program is free software: you can redistribute it and/or modify\n - it under the terms of the GNU Affero General Public License as\n - published by the Free Software Foundation, either version 3 of the\n - License, or (at your option) any later version.\n -\n - This program is distributed in the hope that it will be useful,\n - but WITHOUT ANY WARRANTY; without even the implied warranty of\n - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n - GNU Affero General Public License for more details.\n -\n - You should have received a copy of the GNU Affero General Public License\n - along with this program. If not, see <http://www.gnu.org/licenses/>.\n -\n -->\n\n<template>\n\t<div id=\"app-details-view\" style=\"padding: 20px;\">\n\t\t<h2>\n\t\t\t<div v-if=\"!app.preview\" class=\"icon-settings-dark\"></div>\n\t\t\t<svg v-if=\"app.previewAsIcon && app.preview\" width=\"32\" height=\"32\" viewBox=\"0 0 32 32\">\n\t\t\t\t<defs><filter :id=\"filterId\"><feColorMatrix in=\"SourceGraphic\" type=\"matrix\" values=\"-1 0 0 0 1 0 -1 0 0 1 0 0 -1 0 1 0 0 0 1 0\"></feColorMatrix></filter></defs>\n\t\t\t\t<image x=\"0\" y=\"0\" width=\"32\" height=\"32\" preserveAspectRatio=\"xMinYMin meet\" :filter=\"filterUrl\" :xlink:href=\"app.preview\" class=\"app-icon\"></image>\n\t\t\t</svg>\n\t\t\t{{ app.name }}</h2>\n\t\t<img v-if=\"app.screenshot\" :src=\"app.screenshot\" width=\"100%\" />\n\t\t<div class=\"app-level\" v-if=\"app.level === 300 || app.level === 200 || hasRating\">\n\t\t\t<span class=\"supported icon-checkmark-color\" v-if=\"app.level === 300\"\n\t\t\t\t v-tooltip.auto=\"t('settings', 'This app is supported via your current Nextcloud subscription.')\">\n\t\t\t\t{{ t('settings', 'Supported') }}</span>\n\t\t\t<span class=\"official icon-checkmark\" v-if=\"app.level === 200\"\n\t\t\t v-tooltip.auto=\"t('settings', 'Official apps are developed by and within the community. They offer central functionality and are ready for production use.')\">\n\t\t\t\t{{ t('settings', 'Official') }}</span>\n\t\t\t<app-score v-if=\"hasRating\" :score=\"app.appstoreData.ratingOverall\"></app-score>\n\t\t</div>\n\n\t\t<div class=\"app-author\" v-if=\"author\">\n\t\t\t{{ t('settings', 'by') }}\n\t\t\t<span v-for=\"(a, index) in author\">\n\t\t\t\t<a v-if=\"a['@attributes'] && a['@attributes']['homepage']\" :href=\"a['@attributes']['homepage']\">{{ a['@value'] }}</a><span v-else-if=\"a['@value']\">{{ a['@value'] }}</span><span v-else>{{ a }}</span><span v-if=\"index+1 < author.length\">, </span>\n\t\t\t</span>\n\t\t</div>\n\t\t<div class=\"app-licence\" v-if=\"licence\">{{ licence }}</div>\n\t\t<div class=\"actions\">\n\t\t\t<div class=\"actions-buttons\">\n\t\t\t\t<input v-if=\"app.update\" class=\"update primary\" type=\"button\" :value=\"t('settings', 'Update to {version}', {version: app.update})\" v-on:click=\"update(app.id)\" :disabled=\"installing || loading(app.id)\"/>\n\t\t\t\t<input v-if=\"app.canUnInstall\" class=\"uninstall\" type=\"button\" :value=\"t('settings', 'Remove')\" v-on:click=\"remove(app.id)\" :disabled=\"installing || loading(app.id)\"/>\n\t\t\t\t<input v-if=\"app.active\" class=\"enable\" type=\"button\" :value=\"t('settings','Disable')\" v-on:click=\"disable(app.id)\" :disabled=\"installing || loading(app.id)\" />\n\t\t\t\t<input v-if=\"!app.active && (app.canInstall || app.isCompatible)\" class=\"enable primary\" type=\"button\" :value=\"enableButtonText\" v-on:click=\"enable(app.id)\" v-tooltip.auto=\"enableButtonTooltip\" :disabled=\"!app.canInstall || installing || loading(app.id)\" />\n\t\t\t\t<input v-else-if=\"!app.active\" class=\"enable force\" type=\"button\" :value=\"forceEnableButtonText\" v-on:click=\"forceEnable(app.id)\" v-tooltip.auto=\"forceEnableButtonTooltip\" :disabled=\"installing || loading(app.id)\" />\n\t\t\t</div>\n\t\t\t<div class=\"app-groups\">\n\t\t\t\t<div class=\"groups-enable\" v-if=\"app.active && canLimitToGroups(app)\">\n\t\t\t\t\t<input type=\"checkbox\" :value=\"app.id\" v-model=\"groupCheckedAppsData\" v-on:change=\"setGroupLimit\" class=\"groups-enable__checkbox checkbox\" :id=\"prefix('groups_enable', app.id)\">\n\t\t\t\t\t<label :for=\"prefix('groups_enable', app.id)\">{{ t('settings', 'Limit to groups') }}</label>\n\t\t\t\t\t<input type=\"hidden\" class=\"group_select\" :title=\"t('settings', 'All')\" value=\"\">\n\t\t\t\t\t<multiselect v-if=\"isLimitedToGroups(app)\" :options=\"groups\" :value=\"appGroups\" @select=\"addGroupLimitation\" @remove=\"removeGroupLimitation\" :options-limit=\"5\"\n\t\t\t\t\t\t\t\t :placeholder=\"t('settings', 'Limit app usage to groups')\"\n\t\t\t\t\t\t\t\t label=\"name\" track-by=\"id\" class=\"multiselect-vue\"\n\t\t\t\t\t\t\t\t :multiple=\"true\" :close-on-select=\"false\"\n\t\t\t\t\t\t\t\t :tag-width=\"60\" @search-change=\"asyncFindGroup\">\n\t\t\t\t\t\t<span slot=\"noResult\">{{t('settings', 'No results')}}</span>\n\t\t\t\t\t</multiselect>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\n\t\t<ul class=\"app-dependencies\">\n\t\t\t<li v-if=\"app.missingMinOwnCloudVersion\">{{ t('settings', 'This app has no minimum Nextcloud version assigned. This will be an error in the future.') }}</li>\n\t\t\t<li v-if=\"app.missingMaxOwnCloudVersion\">{{ t('settings', 'This app has no maximum Nextcloud version assigned. This will be an error in the future.') }}</li>\n\t\t\t<li v-if=\"!app.canInstall\">\n\t\t\t\t{{ t('settings', 'This app cannot be installed because the following dependencies are not fulfilled:') }}\n\t\t\t\t<ul class=\"missing-dependencies\">\n\t\t\t\t\t<li v-for=\"dep in app.missingDependencies\">{{ dep }}</li>\n\t\t\t\t</ul>\n\t\t\t</li>\n\t\t</ul>\n\n\t\t<p class=\"documentation\">\n\t\t\t<a class=\"appslink\" :href=\"appstoreUrl\" v-if=\"!app.internal\" target=\"_blank\" rel=\"noreferrer noopener\">{{ t('settings', 'View in store')}} ↗</a>\n\n\t\t\t<a class=\"appslink\" v-if=\"app.website\" :href=\"app.website\" target=\"_blank\" rel=\"noreferrer noopener\">{{ t('settings', 'Visit website') }} ↗</a>\n\t\t\t<a class=\"appslink\" v-if=\"app.bugs\" :href=\"app.bugs\" target=\"_blank\" rel=\"noreferrer noopener\">{{ t('settings', 'Report a bug') }} ↗</a>\n\n\t\t\t<a class=\"appslink\" v-if=\"app.documentation && app.documentation.user\" :href=\"app.documentation.user\" target=\"_blank\" rel=\"noreferrer noopener\">{{ t('settings', 'User documentation') }} ↗</a>\n\t\t\t<a class=\"appslink\" v-if=\"app.documentation && app.documentation.admin\" :href=\"app.documentation.admin\" target=\"_blank\" rel=\"noreferrer noopener\">{{ t('settings', 'Admin documentation') }} ↗</a>\n\t\t\t<a class=\"appslink\" v-if=\"app.documentation && app.documentation.developer\" :href=\"app.documentation.developer\" target=\"_blank\" rel=\"noreferrer noopener\">{{ t('settings', 'Developer documentation') }} ↗</a>\n\t\t</p>\n\n\t\t<div class=\"app-description\" v-html=\"renderMarkdown\"></div>\n\t</div>\n</template>\n\n<script>\nimport { Multiselect } from 'nextcloud-vue';\nimport marked from 'marked';\nimport dompurify from 'dompurify'\n\nimport AppScore from './appList/appScore';\nimport AppManagement from './appManagement';\nimport prefix from './prefixMixin';\nimport SvgFilterMixin from './svgFilterMixin';\n\nexport default {\n\tmixins: [AppManagement, prefix, SvgFilterMixin],\n\tname: 'appDetails',\n\tprops: ['category', 'app'],\n\tcomponents: {\n\t\tMultiselect,\n\t\tAppScore\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tgroupCheckedAppsData: false,\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\tcomputed: {\n\t\tappstoreUrl() {\n\t\t\treturn `https://apps.nextcloud.com/apps/${this.app.id}`;\n\t\t},\n\t\tlicence() {\n\t\t\tif (this.app.licence) {\n\t\t\t\treturn t('settings', '{license}-licensed', { license: ('' + this.app.licence).toUpperCase() } );\n\t\t\t}\n\t\t\treturn null;\n\t\t},\n\t\thasRating() {\n\t\t\treturn this.app.appstoreData && this.app.appstoreData.ratingNumOverall > 5;\n\t\t},\n\t\tauthor() {\n\t\t\tif (typeof this.app.author === 'string') {\n\t\t\t\treturn [\n\t\t\t\t\t{\n\t\t\t\t\t\t'@value': this.app.author\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t}\n\t\t\tif (this.app.author['@value']) {\n\t\t\t\treturn [this.app.author];\n\t\t\t}\n\t\t\treturn this.app.author;\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\trenderMarkdown() {\n\t\t\tvar renderer = new marked.Renderer();\n\t\t\trenderer.link = function(href, title, text) {\n\t\t\t\ttry {\n\t\t\t\t\tvar prot = 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\tvar 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.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.app.description.trim(), {\n\t\t\t\t\trenderer: renderer,\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'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>\n\t.force {\n\t\tbackground: var(--color-main-background);\n\t\tborder-color: var(--color-error);\n\t\tcolor: var(--color-error);\n\t}\n\t.force:hover,\n\t.force:active {\n\t\tbackground: var(--color-error);\n\t\tborder-color: var(--color-error) !important;\n\t\tcolor: var(--color-main-background);\n\t}\n</style>\n","import { render, staticRenderFns } from \"./appDetails.vue?vue&type=template&id=52943dc0&scoped=true&\"\nimport script from \"./appDetails.vue?vue&type=script&lang=js&\"\nexport * from \"./appDetails.vue?vue&type=script&lang=js&\"\nimport style0 from \"./appDetails.vue?vue&type=style&index=0&id=52943dc0&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 \"52943dc0\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticStyle:{\"padding\":\"20px\"},attrs:{\"id\":\"app-details-view\"}},[_c('h2',[(!_vm.app.preview)?_c('div',{staticClass:\"icon-settings-dark\"}):_vm._e(),_vm._v(\" \"),(_vm.app.previewAsIcon && _vm.app.preview)?_c('svg',{attrs:{\"width\":\"32\",\"height\":\"32\",\"viewBox\":\"0 0 32 32\"}},[_c('defs',[_c('filter',{attrs:{\"id\":_vm.filterId}},[_c('feColorMatrix',{attrs:{\"in\":\"SourceGraphic\",\"type\":\"matrix\",\"values\":\"-1 0 0 0 1 0 -1 0 0 1 0 0 -1 0 1 0 0 0 1 0\"}})],1)]),_vm._v(\" \"),_c('image',{staticClass:\"app-icon\",attrs:{\"x\":\"0\",\"y\":\"0\",\"width\":\"32\",\"height\":\"32\",\"preserveAspectRatio\":\"xMinYMin meet\",\"filter\":_vm.filterUrl,\"xlink:href\":_vm.app.preview}})]):_vm._e(),_vm._v(\"\\n\\t\\t\"+_vm._s(_vm.app.name))]),_vm._v(\" \"),(_vm.app.screenshot)?_c('img',{attrs:{\"src\":_vm.app.screenshot,\"width\":\"100%\"}}):_vm._e(),_vm._v(\" \"),(_vm.app.level === 300 || _vm.app.level === 200 || _vm.hasRating)?_c('div',{staticClass:\"app-level\"},[(_vm.app.level === 300)?_c('span',{directives:[{name:\"tooltip\",rawName:\"v-tooltip.auto\",value:(_vm.t('settings', 'This app is supported via your current Nextcloud subscription.')),expression:\"t('settings', 'This app is supported via your current Nextcloud subscription.')\",modifiers:{\"auto\":true}}],staticClass:\"supported icon-checkmark-color\"},[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.t('settings', 'Supported')))]):_vm._e(),_vm._v(\" \"),(_vm.app.level === 200)?_c('span',{directives:[{name:\"tooltip\",rawName:\"v-tooltip.auto\",value:(_vm.t('settings', 'Official apps are developed by and within the community. They offer central functionality and are ready for production use.')),expression:\"t('settings', 'Official apps are developed by and within the community. They offer central functionality and are ready for production use.')\",modifiers:{\"auto\":true}}],staticClass:\"official icon-checkmark\"},[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.t('settings', 'Official')))]):_vm._e(),_vm._v(\" \"),(_vm.hasRating)?_c('app-score',{attrs:{\"score\":_vm.app.appstoreData.ratingOverall}}):_vm._e()],1):_vm._e(),_vm._v(\" \"),(_vm.author)?_c('div',{staticClass:\"app-author\"},[_vm._v(\"\\n\\t\\t\"+_vm._s(_vm.t('settings', 'by'))+\"\\n\\t\\t\"),_vm._l((_vm.author),function(a,index){return _c('span',[(a['@attributes'] && a['@attributes']['homepage'])?_c('a',{attrs:{\"href\":a['@attributes']['homepage']}},[_vm._v(_vm._s(a['@value']))]):(a['@value'])?_c('span',[_vm._v(_vm._s(a['@value']))]):_c('span',[_vm._v(_vm._s(a))]),(index+1 < _vm.author.length)?_c('span',[_vm._v(\", \")]):_vm._e()])})],2):_vm._e(),_vm._v(\" \"),(_vm.licence)?_c('div',{staticClass:\"app-licence\"},[_vm._v(_vm._s(_vm.licence))]):_vm._e(),_vm._v(\" \"),_c('div',{staticClass:\"actions\"},[_c('div',{staticClass:\"actions-buttons\"},[(_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.loading(_vm.app.id)},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.loading(_vm.app.id)},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.loading(_vm.app.id)},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',{directives:[{name:\"tooltip\",rawName:\"v-tooltip.auto\",value:(_vm.enableButtonTooltip),expression:\"enableButtonTooltip\",modifiers:{\"auto\":true}}],staticClass:\"enable primary\",attrs:{\"type\":\"button\",\"value\":_vm.enableButtonText,\"disabled\":!_vm.app.canInstall || _vm.installing || _vm.loading(_vm.app.id)},on:{\"click\":function($event){return _vm.enable(_vm.app.id)}}}):(!_vm.app.active)?_c('input',{directives:[{name:\"tooltip\",rawName:\"v-tooltip.auto\",value:(_vm.forceEnableButtonTooltip),expression:\"forceEnableButtonTooltip\",modifiers:{\"auto\":true}}],staticClass:\"enable force\",attrs:{\"type\":\"button\",\"value\":_vm.forceEnableButtonText,\"disabled\":_vm.installing || _vm.loading(_vm.app.id)},on:{\"click\":function($event){return _vm.forceEnable(_vm.app.id)}}}):_vm._e()]),_vm._v(\" \"),_c('div',{staticClass:\"app-groups\"},[(_vm.app.active && _vm.canLimitToGroups(_vm.app))?_c('div',{staticClass:\"groups-enable\"},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.groupCheckedAppsData),expression:\"groupCheckedAppsData\"}],staticClass:\"groups-enable__checkbox checkbox\",attrs:{\"type\":\"checkbox\",\"id\":_vm.prefix('groups_enable', _vm.app.id)},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\":_vm.prefix('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(\" \"),(_vm.isLimitedToGroups(_vm.app))?_c('multiselect',{staticClass:\"multiselect-vue\",attrs:{\"options\":_vm.groups,\"value\":_vm.appGroups,\"options-limit\":5,\"placeholder\":_vm.t('settings', 'Limit app usage to groups'),\"label\":\"name\",\"track-by\":\"id\",\"multiple\":true,\"close-on-select\":false,\"tag-width\":60},on:{\"select\":_vm.addGroupLimitation,\"remove\":_vm.removeGroupLimitation,\"search-change\":_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('ul',{staticClass:\"app-dependencies\"},[(_vm.app.missingMinOwnCloudVersion)?_c('li',[_vm._v(_vm._s(_vm.t('settings', 'This app has no minimum Nextcloud version assigned. This will be an error in the future.')))]):_vm._e(),_vm._v(\" \"),(_vm.app.missingMaxOwnCloudVersion)?_c('li',[_vm._v(_vm._s(_vm.t('settings', 'This app has no maximum Nextcloud version assigned. This will be an error in the future.')))]):_vm._e(),_vm._v(\" \"),(!_vm.app.canInstall)?_c('li',[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.t('settings', 'This app cannot be installed because the following dependencies are not fulfilled:'))+\"\\n\\t\\t\\t\"),_c('ul',{staticClass:\"missing-dependencies\"},_vm._l((_vm.app.missingDependencies),function(dep){return _c('li',[_vm._v(_vm._s(dep))])}),0)]):_vm._e()]),_vm._v(\" \"),_c('p',{staticClass:\"documentation\"},[(!_vm.app.internal)?_c('a',{staticClass:\"appslink\",attrs:{\"href\":_vm.appstoreUrl,\"target\":\"_blank\",\"rel\":\"noreferrer noopener\"}},[_vm._v(_vm._s(_vm.t('settings', 'View in store'))+\" ↗\")]):_vm._e(),_vm._v(\" \"),(_vm.app.website)?_c('a',{staticClass:\"appslink\",attrs:{\"href\":_vm.app.website,\"target\":\"_blank\",\"rel\":\"noreferrer noopener\"}},[_vm._v(_vm._s(_vm.t('settings', 'Visit website'))+\" ↗\")]):_vm._e(),_vm._v(\" \"),(_vm.app.bugs)?_c('a',{staticClass:\"appslink\",attrs:{\"href\":_vm.app.bugs,\"target\":\"_blank\",\"rel\":\"noreferrer noopener\"}},[_vm._v(_vm._s(_vm.t('settings', 'Report a bug'))+\" ↗\")]):_vm._e(),_vm._v(\" \"),(_vm.app.documentation && _vm.app.documentation.user)?_c('a',{staticClass:\"appslink\",attrs:{\"href\":_vm.app.documentation.user,\"target\":\"_blank\",\"rel\":\"noreferrer noopener\"}},[_vm._v(_vm._s(_vm.t('settings', 'User documentation'))+\" ↗\")]):_vm._e(),_vm._v(\" \"),(_vm.app.documentation && _vm.app.documentation.admin)?_c('a',{staticClass:\"appslink\",attrs:{\"href\":_vm.app.documentation.admin,\"target\":\"_blank\",\"rel\":\"noreferrer noopener\"}},[_vm._v(_vm._s(_vm.t('settings', 'Admin documentation'))+\" ↗\")]):_vm._e(),_vm._v(\" \"),(_vm.app.documentation && _vm.app.documentation.developer)?_c('a',{staticClass:\"appslink\",attrs:{\"href\":_vm.app.documentation.developer,\"target\":\"_blank\",\"rel\":\"noreferrer noopener\"}},[_vm._v(_vm._s(_vm.t('settings', 'Developer documentation'))+\" ↗\")]):_vm._e()]),_vm._v(\" \"),_c('div',{staticClass:\"app-description\",domProps:{\"innerHTML\":_vm._s(_vm.renderMarkdown)}})])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<!--\n - @copyright Copyright (c) 2018 Julius Härtl <jus@bitgrid.net>\n -\n - @author Julius Härtl <jus@bitgrid.net>\n -\n - @license GNU AGPL version 3 or any later version\n -\n - This program is free software: you can redistribute it and/or modify\n - it under the terms of the GNU Affero General Public License as\n - published by the Free Software Foundation, either version 3 of the\n - License, or (at your option) any later version.\n -\n - This program is distributed in the hope that it will be useful,\n - but WITHOUT ANY WARRANTY; without even the implied warranty of\n - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n - GNU Affero General Public License for more details.\n -\n - You should have received a copy of the GNU Affero General Public License\n - along with this program. If not, see <http://www.gnu.org/licenses/>.\n -\n -->\n\n<template>\n\t<Content app-name=\"settings\" :class=\"{ 'with-app-sidebar': currentApp}\"\n\t:content-class=\"{ 'icon-loading': loadingList }\" :navigation-class=\"{ 'icon-loading': loading }\">\n\t\t<AppNavigation>\n\t\t\t<ul id=\"appscategories\">\n\t\t\t\t<AppNavigationItem v-for=\"item in menu\" :key=\"item.key\" :item=\"item\" />\n\t\t\t</ul>\n\t\t</AppNavigation>\n\t\t<AppContent class=\"app-settings-content\" :class=\"{ 'icon-loading': loadingList }\">\n\t\t\t<AppList :category=\"category\" :app=\"currentApp\" :search=\"searchQuery\" />\n\t\t</AppContent>\n\t\t<AppSidebar v-if=\"id && currentApp\" @close=\"hideAppDetails\">\n\t\t\t<AppDetails :category=\"category\" :app=\"currentApp\" />\n\t\t</AppSidebar>\n\t</Content>\n</template>\n\n<script>\nimport { \n\tAppContent,\n\tAppNavigation,\n\tAppNavigationItem,\n\tAppSidebar,\n\tContent\n} from 'nextcloud-vue';\nimport AppList from '../components/appList';\nimport Vue from 'vue';\nimport VueLocalStorage from 'vue-localstorage'\nimport AppDetails from '../components/appDetails';\n\nVue.use(VueLocalStorage)\n\nexport default {\n\tname: 'Apps',\n\tprops: {\n\t\tcategory: {\n\t\t\ttype: String,\n\t\t\tdefault: 'installed',\n\t\t},\n\t\tid: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t}\n\t},\n\tcomponents: {\n\t\tAppContent,\n\t\tAppNavigation,\n\t\tAppNavigationItem,\n\t\tAppSidebar,\n\t\tContent,\n\t\tAppDetails,\n\t\tAppList\n\t},\n\tmethods: {\n\t\tsetSearch(query) {\n\t\t\tthis.searchQuery = query;\n\t\t},\n\t\tresetSearch() {\n\t\t\tthis.setSearch('');\n\t\t},\n\t\thideAppDetails() {\n\t\t\tthis.$router.push({\n\t\t\t\tname: 'apps-category',\n\t\t\t\tparams: {category: this.category}\n\t\t\t})\n\t\t}\n\t},\n\tbeforeMount() {\n\t\tthis.$store.dispatch('getCategories');\n\t\tthis.$store.dispatch('getAllApps');\n\t\tthis.$store.dispatch('getGroups', {offset: 0, limit: 5});\n\t\tthis.$store.commit('setUpdateCount', this.$store.getters.getServerData.updateCount)\n\t},\n\tmounted() {\n\t\t/** \n\t\t * Register search\n\t\t */\n\t\tthis.appSearch = new OCA.Search(this.setSearch, this.resetSearch);\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tsearchQuery: ''\n\t\t}\n\t},\n\twatch: {\n\t\tcategory: function (val, old) {\n\t\t\tthis.setSearch('');\n\t\t}\n\t},\n\tcomputed: {\n\t\tloading() {\n\t\t\treturn this.$store.getters.loading('categories');\n\t\t},\n\t\tloadingList() {\n\t\t\treturn this.$store.getters.loading('list');\n\t\t},\n\t\tcurrentApp() {\n\t\t\treturn this.apps.find(app => app.id === this.id );\n\t\t},\n\t\tcategories() {\n\t\t\treturn this.$store.getters.getCategories;\n\t\t},\n\t\tapps() {\n\t\t\treturn this.$store.getters.getAllApps;\n\t\t},\n\t\tupdateCount() {\n\t\t\treturn this.$store.getters.getUpdateCount;\n\t\t},\n\t\tsettings() {\n\t\t\treturn this.$store.getters.getServerData;\n\t\t},\n\n\t\t// BUILD APP NAVIGATION MENU OBJECT\n\t\tmenu() {\n\t\t\t// Data provided php side\n\t\t\tlet categories = this.$store.getters.getCategories;\n\t\t\tcategories = Array.isArray(categories) ? categories : [];\n\n\t\t\t// Map groups\n\t\t\tcategories = categories.map(category => {\n\t\t\t\tlet item = {};\n\t\t\t\titem.id = 'app-category-' + category.ident;\n\t\t\t\titem.icon = 'icon-category-' + category.ident;\n\t\t\t\titem.classes = [];\t\t\t\t\t\t\t// empty classes, active will be set later\n\t\t\t\titem.router = {\t\t\t\t\t\t\t\t// router link to\n\t\t\t\t\tname: 'apps-category',\n\t\t\t\t\tparams: {category: category.ident}\n\t\t\t\t};\n\t\t\t\titem.text = category.displayName;\n\n\t\t\t\treturn item;\n\t\t\t});\n\n\n\t\t\t// Add everyone group\n\t\t\tlet defaultCategories = [\n\t\t\t\t{\n\t\t\t\t\tid: 'app-category-your-apps',\n\t\t\t\t\tclasses: [],\n\t\t\t\t\trouter: {name: 'apps'},\n\t\t\t\t\ticon: 'icon-category-installed',\n\t\t\t\t\ttext: t('settings', 'Your apps'),\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: 'app-category-enabled',\n\t\t\t\t\tclasses: [],\n\t\t\t\t\ticon: 'icon-category-enabled',\n\t\t\t\t\trouter: {name: 'apps-category', params: {category: 'enabled'}},\n\t\t\t\t\ttext: t('settings', 'Active apps'),\n\t\t\t\t}, {\n\t\t\t\t\tid: 'app-category-disabled',\n\t\t\t\t\tclasses: [],\n\t\t\t\t\ticon: 'icon-category-disabled',\n\t\t\t\t\trouter: {name: 'apps-category', params: {category: 'disabled'}},\n\t\t\t\t\ttext: t('settings', 'Disabled apps'),\n\t\t\t\t}\n\t\t\t];\n\n\t\t\tif (!this.settings.appstoreEnabled) {\n\t\t\t\treturn defaultCategories\n\t\t\t}\n\n\t\t\tif (this.$store.getters.getUpdateCount > 0) {\n\t\t\t\tdefaultCategories.push({\n\t\t\t\t\tid: 'app-category-updates',\n\t\t\t\t\tclasses: [],\n\t\t\t\t\ticon: 'icon-download',\n\t\t\t\t\trouter: {name: 'apps-category', params: {category: 'updates'}},\n\t\t\t\t\ttext: t('settings', 'Updates'),\n\t\t\t\t\tutils: {counter: this.$store.getters.getUpdateCount}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tdefaultCategories.push({\n\t\t\t\tid: 'app-category-app-bundles',\n\t\t\t\tclasses: [],\n\t\t\t\ticon: 'icon-category-app-bundles',\n\t\t\t\trouter: {name: 'apps-category', params: {category: 'app-bundles'}},\n\t\t\t\ttext: t('settings', 'App bundles'),\n\t\t\t});\n\n\t\t\tcategories = defaultCategories.concat(categories);\n\n\t\t\t// Set current group as active\n\t\t\tlet activeGroup = categories.findIndex(group => group.id === 'app-category-' + this.category);\n\t\t\tif (activeGroup >= 0) {\n\t\t\t\tcategories[activeGroup].classes.push('active');\n\t\t\t} else {\n\t\t\t\tcategories[0].classes.push('active');\n\t\t\t}\n\n\t\t\tcategories.push({\n\t\t\t\tid: 'app-developer-docs',\n\t\t\t\tclasses: [],\n\t\t\t\thref: this.settings.developerDocumentation,\n\t\t\t\ttext: t('settings', 'Developer documentation') + ' ↗',\n\t\t\t});\n\n\t\t\t// Return\n\t\t\treturn categories\n\t\t},\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!./Apps.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!./Apps.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./Apps.vue?vue&type=template&id=124a4d4a&\"\nimport script from \"./Apps.vue?vue&type=script&lang=js&\"\nexport * from \"./Apps.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"],"sourceRoot":""} \ No newline at end of file
diff --git a/settings/src/components/appList/appItem.vue b/settings/src/components/appList/appItem.vue
index 5f37802df51..daf5ddacc24 100644
--- a/settings/src/components/appList/appItem.vue
+++ b/settings/src/components/appList/appItem.vue
@@ -48,7 +48,7 @@
<span class="official icon-checkmark" v-if="app.level === 200"
v-tooltip.auto="t('settings', 'Official apps are developed by and within the community. They offer central functionality and are ready for production use.')">
{{ t('settings', 'Official') }}</span>
- <app-score v-if="!listView" :score="app.score"></app-score>
+ <app-score v-if="hasRating && !listView" :score="app.score"></app-score>
</div>
<div class="actions">
@@ -97,7 +97,9 @@
this.isSelected = (this.app.id === this.$route.params.id);
},
computed: {
-
+ hasRating() {
+ return this.app.appstoreData && this.app.appstoreData.ratingNumOverall > 5;
+ },
},
watchers: {
diff --git a/tests/lib/Authentication/Listeners/RemoteWipeEmailListenerTest.php b/tests/lib/Authentication/Listeners/RemoteWipeEmailListenerTest.php
new file mode 100644
index 00000000000..ea7740057ba
--- /dev/null
+++ b/tests/lib/Authentication/Listeners/RemoteWipeEmailListenerTest.php
@@ -0,0 +1,241 @@
+<?php declare(strict_types=1);
+
+/**
+ * @copyright 2019 Christoph Wurst <christoph@winzerhof-wurst.at>
+ *
+ * @author 2019 Christoph Wurst <christoph@winzerhof-wurst.at>
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+namespace lib\Authentication\Listeners;
+
+use Exception;
+use OC\Authentication\Events\RemoteWipeFinished;
+use OC\Authentication\Events\RemoteWipeStarted;
+use OC\Authentication\Listeners\RemoteWipeEmailListener;
+use OC\Authentication\Token\IToken;
+use OCP\EventDispatcher\Event;
+use OCP\EventDispatcher\IEventListener;
+use OCP\IL10N;
+use OCP\ILogger;
+use OCP\IUser;
+use OCP\IUserManager;
+use OCP\L10N\IFactory;
+use OCP\Mail\IMailer;
+use OCP\Mail\IMessage;
+use PHPUnit\Framework\MockObject\MockObject;
+use Test\TestCase;
+
+class RemoteWipeEmailListenerTest extends TestCase {
+
+ /** @var IMailer|MockObject */
+ private $mailer;
+
+ /** @var IUserManager|MockObject */
+ private $userManager;
+
+ /** @var IFactory|MockObject */
+ private $l10nFactory;
+
+ /** @var IL10N|MockObject */
+ private $l10n;
+
+ /** @var ILogger|MockObject */
+ private $logger;
+
+ /** @var IEventListener */
+ private $listener;
+
+ protected function setUp() {
+ parent::setUp();
+
+ $this->mailer = $this->createMock(IMailer::class);
+ $this->userManager = $this->createMock(IUserManager::class);
+ $this->l10nFactory = $this->createMock(IFactory::class);
+ $this->l10n = $this->createMock(IL10N::class);
+ $this->logger = $this->createMock(ILogger::class);
+
+ $this->l10nFactory->method('get')->with('core')->willReturn($this->l10n);
+ $this->l10n->method('t')->willReturnArgument(0);
+
+ $this->listener = new RemoteWipeEmailListener(
+ $this->mailer,
+ $this->userManager,
+ $this->l10nFactory,
+ $this->logger
+ );
+ }
+
+
+ public function testHandleUnrelated() {
+ $event = new Event();
+ $this->mailer->expects($this->never())->method('send');
+
+ $this->listener->handle($event);
+ }
+
+ public function testHandleRemoteWipeStartedInvalidUser() {
+ /** @var IToken|MockObject $token */
+ $token = $this->createMock(IToken::class);
+ $event = new RemoteWipeStarted($token);
+ $token->method('getUID')->willReturn('nope');
+ $this->userManager->expects($this->once())
+ ->method('get')
+ ->with('nope')
+ ->willReturn(null);
+ $this->mailer->expects($this->never())->method('send');
+
+ $this->listener->handle($event);
+ }
+
+ public function testHandleRemoteWipeStartedNoEmailSet() {
+ /** @var IToken|MockObject $token */
+ $token = $this->createMock(IToken::class);
+ $event = new RemoteWipeStarted($token);
+ $token->method('getUID')->willReturn('nope');
+ $user = $this->createMock(IUser::class);
+ $this->userManager->expects($this->once())
+ ->method('get')
+ ->with('nope')
+ ->willReturn($user);
+ $user->method('getEMailAddress')->willReturn(null);
+ $this->mailer->expects($this->never())->method('send');
+
+ $this->listener->handle($event);
+ }
+
+ public function testHandleRemoteWipeStartedTransmissionError() {
+ /** @var IToken|MockObject $token */
+ $token = $this->createMock(IToken::class);
+ $event = new RemoteWipeStarted($token);
+ $token->method('getUID')->willReturn('nope');
+ $user = $this->createMock(IUser::class);
+ $this->userManager->expects($this->once())
+ ->method('get')
+ ->with('nope')
+ ->willReturn($user);
+ $user->method('getEMailAddress')->willReturn('user@domain.org');
+ $this->mailer->expects($this->once())
+ ->method('send')
+ ->willThrowException(new Exception());
+ $this->logger->expects($this->once())
+ ->method('logException');
+
+ $this->listener->handle($event);
+ }
+
+ public function testHandleRemoteWipeStarted() {
+ /** @var IToken|MockObject $token */
+ $token = $this->createMock(IToken::class);
+ $event = new RemoteWipeStarted($token);
+ $token->method('getUID')->willReturn('nope');
+ $user = $this->createMock(IUser::class);
+ $this->userManager->expects($this->once())
+ ->method('get')
+ ->with('nope')
+ ->willReturn($user);
+ $user->method('getEMailAddress')->willReturn('user@domain.org');
+ $message = $this->createMock(IMessage::class);
+ $this->mailer->expects($this->once())
+ ->method('createMessage')
+ ->willReturn($message);
+ $message->expects($this->once())
+ ->method('setTo')
+ ->with($this->equalTo(['user@domain.org']));
+ $this->mailer->expects($this->once())
+ ->method('send')
+ ->with($message);
+
+ $this->listener->handle($event);
+ }
+
+ public function testHandleRemoteWipeFinishedInvalidUser() {
+ /** @var IToken|MockObject $token */
+ $token = $this->createMock(IToken::class);
+ $event = new RemoteWipeFinished($token);
+ $token->method('getUID')->willReturn('nope');
+ $this->userManager->expects($this->once())
+ ->method('get')
+ ->with('nope')
+ ->willReturn(null);
+ $this->mailer->expects($this->never())->method('send');
+
+ $this->listener->handle($event);
+ }
+
+ public function testHandleRemoteWipeFinishedNoEmailSet() {
+ /** @var IToken|MockObject $token */
+ $token = $this->createMock(IToken::class);
+ $event = new RemoteWipeFinished($token);
+ $token->method('getUID')->willReturn('nope');
+ $user = $this->createMock(IUser::class);
+ $this->userManager->expects($this->once())
+ ->method('get')
+ ->with('nope')
+ ->willReturn($user);
+ $user->method('getEMailAddress')->willReturn(null);
+ $this->mailer->expects($this->never())->method('send');
+
+ $this->listener->handle($event);
+ }
+
+ public function testHandleRemoteWipeFinishedTransmissionError() {
+ /** @var IToken|MockObject $token */
+ $token = $this->createMock(IToken::class);
+ $event = new RemoteWipeFinished($token);
+ $token->method('getUID')->willReturn('nope');
+ $user = $this->createMock(IUser::class);
+ $this->userManager->expects($this->once())
+ ->method('get')
+ ->with('nope')
+ ->willReturn($user);
+ $user->method('getEMailAddress')->willReturn('user@domain.org');
+ $this->mailer->expects($this->once())
+ ->method('send')
+ ->willThrowException(new Exception());
+ $this->logger->expects($this->once())
+ ->method('logException');
+
+ $this->listener->handle($event);
+ }
+
+ public function testHandleRemoteWipeFinished() {
+ /** @var IToken|MockObject $token */
+ $token = $this->createMock(IToken::class);
+ $event = new RemoteWipeFinished($token);
+ $token->method('getUID')->willReturn('nope');
+ $user = $this->createMock(IUser::class);
+ $this->userManager->expects($this->once())
+ ->method('get')
+ ->with('nope')
+ ->willReturn($user);
+ $user->method('getEMailAddress')->willReturn('user@domain.org');
+ $message = $this->createMock(IMessage::class);
+ $this->mailer->expects($this->once())
+ ->method('createMessage')
+ ->willReturn($message);
+ $message->expects($this->once())
+ ->method('setTo')
+ ->with($this->equalTo(['user@domain.org']));
+ $this->mailer->expects($this->once())
+ ->method('send')
+ ->with($message);
+
+ $this->listener->handle($event);
+ }
+
+}