diff options
65 files changed, 825 insertions, 1041 deletions
diff --git a/.github/workflows/update-cacert-bundle.yml b/.github/workflows/update-cacert-bundle.yml index f38e594f9b8..8d0e9d79d52 100644 --- a/.github/workflows/update-cacert-bundle.yml +++ b/.github/workflows/update-cacert-bundle.yml @@ -12,7 +12,7 @@ jobs: strategy: fail-fast: false matrix: - branches: ["master", "stable24", "stable23", "stable22"] + branches: ["master", "stable25", "stable24", "stable23", "stable22"] name: update-ca-certificate-bundle-${{ matrix.branches }} diff --git a/apps/dav/l10n/fr.js b/apps/dav/l10n/fr.js index e5ced44f791..223c417d666 100644 --- a/apps/dav/l10n/fr.js +++ b/apps/dav/l10n/fr.js @@ -52,7 +52,7 @@ OC.L10N.register( "Calendar, contacts and tasks" : "Agenda, contacts et tâches", "A <strong>calendar</strong> was modified" : "Un <strong>agenda</strong> a été modifié", "A calendar <strong>event</strong> was modified" : "Un <strong>événement</strong> de l'agenda a été modifié", - "A calendar <strong>to-do</strong> was modified" : "Un calendrier <strong>pense-bête</strong> a été modifié", + "A calendar <strong>to-do</strong> was modified" : "Un calendrier <strong>de tâches</strong> a été modifié", "Contact birthdays" : "Anniversaires des contacts", "Death of %s" : "Mort de %s", "Calendar:" : "Agenda:", diff --git a/apps/dav/l10n/fr.json b/apps/dav/l10n/fr.json index 7b2a703ff91..a62e0f24bf5 100644 --- a/apps/dav/l10n/fr.json +++ b/apps/dav/l10n/fr.json @@ -50,7 +50,7 @@ "Calendar, contacts and tasks" : "Agenda, contacts et tâches", "A <strong>calendar</strong> was modified" : "Un <strong>agenda</strong> a été modifié", "A calendar <strong>event</strong> was modified" : "Un <strong>événement</strong> de l'agenda a été modifié", - "A calendar <strong>to-do</strong> was modified" : "Un calendrier <strong>pense-bête</strong> a été modifié", + "A calendar <strong>to-do</strong> was modified" : "Un calendrier <strong>de tâches</strong> a été modifié", "Contact birthdays" : "Anniversaires des contacts", "Death of %s" : "Mort de %s", "Calendar:" : "Agenda:", diff --git a/apps/files/appinfo/info.xml b/apps/files/appinfo/info.xml index ac7e9a2fa8e..1d06259074b 100644 --- a/apps/files/appinfo/info.xml +++ b/apps/files/appinfo/info.xml @@ -5,7 +5,7 @@ <name>Files</name> <summary>File Management</summary> <description>File Management</description> - <version>1.21.0</version> + <version>1.21.1</version> <licence>agpl</licence> <author>Robin Appelman</author> <author>Vincent Petry</author> @@ -26,6 +26,7 @@ <job>OCA\Files\BackgroundJob\DeleteOrphanedItems</job> <job>OCA\Files\BackgroundJob\CleanupFileLocks</job> <job>OCA\Files\BackgroundJob\CleanupDirectEditingTokens</job> + <job>OCA\Files\BackgroundJob\DeleteExpiredOpenLocalEditor</job> </background-jobs> <commands> diff --git a/apps/files/appinfo/routes.php b/apps/files/appinfo/routes.php index 2aeef05558c..6c94490b085 100644 --- a/apps/files/appinfo/routes.php +++ b/apps/files/appinfo/routes.php @@ -37,6 +37,8 @@ declare(strict_types=1); */ namespace OCA\Files\AppInfo; +use OCA\Files\Controller\OpenLocalEditorController; + /** @var Application $application */ $application = \OC::$server->query(Application::class); $application->registerRoutes( @@ -169,6 +171,18 @@ $application->registerRoutes( 'url' => '/api/v1/transferownership/{id}', 'verb' => 'DELETE', ], + [ + /** @see OpenLocalEditorController::create() */ + 'name' => 'OpenLocalEditor#create', + 'url' => '/api/v1/openlocaleditor', + 'verb' => 'POST', + ], + [ + /** @see OpenLocalEditorController::validate() */ + 'name' => 'OpenLocalEditor#validate', + 'url' => '/api/v1/openlocaleditor/{token}', + 'verb' => 'POST', + ], ], ] ); diff --git a/apps/files/composer/composer/autoload_classmap.php b/apps/files/composer/composer/autoload_classmap.php index 46da43165b9..2327cf44138 100644 --- a/apps/files/composer/composer/autoload_classmap.php +++ b/apps/files/composer/composer/autoload_classmap.php @@ -20,6 +20,7 @@ return array( 'OCA\\Files\\AppInfo\\Application' => $baseDir . '/../lib/AppInfo/Application.php', 'OCA\\Files\\BackgroundJob\\CleanupDirectEditingTokens' => $baseDir . '/../lib/BackgroundJob/CleanupDirectEditingTokens.php', 'OCA\\Files\\BackgroundJob\\CleanupFileLocks' => $baseDir . '/../lib/BackgroundJob/CleanupFileLocks.php', + 'OCA\\Files\\BackgroundJob\\DeleteExpiredOpenLocalEditor' => $baseDir . '/../lib/BackgroundJob/DeleteExpiredOpenLocalEditor.php', 'OCA\\Files\\BackgroundJob\\DeleteOrphanedItems' => $baseDir . '/../lib/BackgroundJob/DeleteOrphanedItems.php', 'OCA\\Files\\BackgroundJob\\ScanFiles' => $baseDir . '/../lib/BackgroundJob/ScanFiles.php', 'OCA\\Files\\BackgroundJob\\TransferOwnership' => $baseDir . '/../lib/BackgroundJob/TransferOwnership.php', @@ -35,9 +36,12 @@ return array( 'OCA\\Files\\Controller\\ApiController' => $baseDir . '/../lib/Controller/ApiController.php', 'OCA\\Files\\Controller\\DirectEditingController' => $baseDir . '/../lib/Controller/DirectEditingController.php', 'OCA\\Files\\Controller\\DirectEditingViewController' => $baseDir . '/../lib/Controller/DirectEditingViewController.php', + 'OCA\\Files\\Controller\\OpenLocalEditorController' => $baseDir . '/../lib/Controller/OpenLocalEditorController.php', 'OCA\\Files\\Controller\\TemplateController' => $baseDir . '/../lib/Controller/TemplateController.php', 'OCA\\Files\\Controller\\TransferOwnershipController' => $baseDir . '/../lib/Controller/TransferOwnershipController.php', 'OCA\\Files\\Controller\\ViewController' => $baseDir . '/../lib/Controller/ViewController.php', + 'OCA\\Files\\Db\\OpenLocalEditor' => $baseDir . '/../lib/Db/OpenLocalEditor.php', + 'OCA\\Files\\Db\\OpenLocalEditorMapper' => $baseDir . '/../lib/Db/OpenLocalEditorMapper.php', 'OCA\\Files\\Db\\TransferOwnership' => $baseDir . '/../lib/Db/TransferOwnership.php', 'OCA\\Files\\Db\\TransferOwnershipMapper' => $baseDir . '/../lib/Db/TransferOwnershipMapper.php', 'OCA\\Files\\DirectEditingCapabilities' => $baseDir . '/../lib/DirectEditingCapabilities.php', @@ -48,6 +52,7 @@ return array( 'OCA\\Files\\Listener\\LegacyLoadAdditionalScriptsAdapter' => $baseDir . '/../lib/Listener/LegacyLoadAdditionalScriptsAdapter.php', 'OCA\\Files\\Listener\\LoadSidebarListener' => $baseDir . '/../lib/Listener/LoadSidebarListener.php', 'OCA\\Files\\Migration\\Version11301Date20191205150729' => $baseDir . '/../lib/Migration/Version11301Date20191205150729.php', + 'OCA\\Files\\Migration\\Version12101Date20221011153334' => $baseDir . '/../lib/Migration/Version12101Date20221011153334.php', 'OCA\\Files\\Notification\\Notifier' => $baseDir . '/../lib/Notification/Notifier.php', 'OCA\\Files\\Search\\FilesSearchProvider' => $baseDir . '/../lib/Search/FilesSearchProvider.php', 'OCA\\Files\\Service\\DirectEditingService' => $baseDir . '/../lib/Service/DirectEditingService.php', diff --git a/apps/files/composer/composer/autoload_static.php b/apps/files/composer/composer/autoload_static.php index ea9d9715fd3..fe23d4ed7b0 100644 --- a/apps/files/composer/composer/autoload_static.php +++ b/apps/files/composer/composer/autoload_static.php @@ -35,6 +35,7 @@ class ComposerStaticInitFiles 'OCA\\Files\\AppInfo\\Application' => __DIR__ . '/..' . '/../lib/AppInfo/Application.php', 'OCA\\Files\\BackgroundJob\\CleanupDirectEditingTokens' => __DIR__ . '/..' . '/../lib/BackgroundJob/CleanupDirectEditingTokens.php', 'OCA\\Files\\BackgroundJob\\CleanupFileLocks' => __DIR__ . '/..' . '/../lib/BackgroundJob/CleanupFileLocks.php', + 'OCA\\Files\\BackgroundJob\\DeleteExpiredOpenLocalEditor' => __DIR__ . '/..' . '/../lib/BackgroundJob/DeleteExpiredOpenLocalEditor.php', 'OCA\\Files\\BackgroundJob\\DeleteOrphanedItems' => __DIR__ . '/..' . '/../lib/BackgroundJob/DeleteOrphanedItems.php', 'OCA\\Files\\BackgroundJob\\ScanFiles' => __DIR__ . '/..' . '/../lib/BackgroundJob/ScanFiles.php', 'OCA\\Files\\BackgroundJob\\TransferOwnership' => __DIR__ . '/..' . '/../lib/BackgroundJob/TransferOwnership.php', @@ -50,9 +51,12 @@ class ComposerStaticInitFiles 'OCA\\Files\\Controller\\ApiController' => __DIR__ . '/..' . '/../lib/Controller/ApiController.php', 'OCA\\Files\\Controller\\DirectEditingController' => __DIR__ . '/..' . '/../lib/Controller/DirectEditingController.php', 'OCA\\Files\\Controller\\DirectEditingViewController' => __DIR__ . '/..' . '/../lib/Controller/DirectEditingViewController.php', + 'OCA\\Files\\Controller\\OpenLocalEditorController' => __DIR__ . '/..' . '/../lib/Controller/OpenLocalEditorController.php', 'OCA\\Files\\Controller\\TemplateController' => __DIR__ . '/..' . '/../lib/Controller/TemplateController.php', 'OCA\\Files\\Controller\\TransferOwnershipController' => __DIR__ . '/..' . '/../lib/Controller/TransferOwnershipController.php', 'OCA\\Files\\Controller\\ViewController' => __DIR__ . '/..' . '/../lib/Controller/ViewController.php', + 'OCA\\Files\\Db\\OpenLocalEditor' => __DIR__ . '/..' . '/../lib/Db/OpenLocalEditor.php', + 'OCA\\Files\\Db\\OpenLocalEditorMapper' => __DIR__ . '/..' . '/../lib/Db/OpenLocalEditorMapper.php', 'OCA\\Files\\Db\\TransferOwnership' => __DIR__ . '/..' . '/../lib/Db/TransferOwnership.php', 'OCA\\Files\\Db\\TransferOwnershipMapper' => __DIR__ . '/..' . '/../lib/Db/TransferOwnershipMapper.php', 'OCA\\Files\\DirectEditingCapabilities' => __DIR__ . '/..' . '/../lib/DirectEditingCapabilities.php', @@ -63,6 +67,7 @@ class ComposerStaticInitFiles 'OCA\\Files\\Listener\\LegacyLoadAdditionalScriptsAdapter' => __DIR__ . '/..' . '/../lib/Listener/LegacyLoadAdditionalScriptsAdapter.php', 'OCA\\Files\\Listener\\LoadSidebarListener' => __DIR__ . '/..' . '/../lib/Listener/LoadSidebarListener.php', 'OCA\\Files\\Migration\\Version11301Date20191205150729' => __DIR__ . '/..' . '/../lib/Migration/Version11301Date20191205150729.php', + 'OCA\\Files\\Migration\\Version12101Date20221011153334' => __DIR__ . '/..' . '/../lib/Migration/Version12101Date20221011153334.php', 'OCA\\Files\\Notification\\Notifier' => __DIR__ . '/..' . '/../lib/Notification/Notifier.php', 'OCA\\Files\\Search\\FilesSearchProvider' => __DIR__ . '/..' . '/../lib/Search/FilesSearchProvider.php', 'OCA\\Files\\Service\\DirectEditingService' => __DIR__ . '/..' . '/../lib/Service/DirectEditingService.php', diff --git a/apps/files/js/fileactions.js b/apps/files/js/fileactions.js index 283118cd327..67fdf9620c6 100644 --- a/apps/files/js/fileactions.js +++ b/apps/files/js/fileactions.js @@ -710,29 +710,31 @@ } }); - this.registerAction({ - name: 'EditLocally', - displayName: function(context) { - var locked = context.$file.data('locked'); - if (!locked) { - return t('files', 'Edit locally'); - } - }, - mime: 'all', - order: -23, - icon: function(filename, context) { - var locked = context.$file.data('locked'); - if (!locked) { - return OC.imagePath('files', 'computer.svg') - } - }, - permissions: OC.PERMISSION_UPDATE, - actionHandler: function (filename, context) { - var dir = context.dir || context.fileList.getCurrentDirectory(); - var path = dir === '/' ? dir + filename : dir + '/' + filename; - context.fileList.openLocalClient(path); - }, - }); + if (!/Android|iPhone|iPad|iPod/i.test(navigator.userAgent)) { + this.registerAction({ + name: 'EditLocally', + displayName: function(context) { + var locked = context.$file.data('locked'); + if (!locked) { + return t('files', 'Edit locally'); + } + }, + mime: 'all', + order: -23, + icon: function(filename, context) { + var locked = context.$file.data('locked'); + if (!locked) { + return OC.imagePath('files', 'computer.svg') + } + }, + permissions: OC.PERMISSION_UPDATE, + actionHandler: function (filename, context) { + var dir = context.dir || context.fileList.getCurrentDirectory(); + var path = dir === '/' ? dir + filename : dir + '/' + filename; + context.fileList.openLocalClient(path); + }, + }); + } this.registerAction({ name: 'Open', diff --git a/apps/files/js/filelist.js b/apps/files/js/filelist.js index 2761c3a62b2..7caed29baa3 100644 --- a/apps/files/js/filelist.js +++ b/apps/files/js/filelist.js @@ -2808,12 +2808,23 @@ }, openLocalClient: function(path) { - var scheme = 'nc://'; - var command = 'open'; - var uid = OC.getCurrentUser().uid; - var url = scheme + command + '/' + uid + '@' + window.location.host + OC.encodePath(path); + var link = OC.linkToOCS('apps/files/api/v1', 2) + 'openlocaleditor?format=json'; - window.location.href = url; + $.post(link, { + path + }) + .success(function(result) { + var scheme = 'nc://'; + var command = 'open'; + var uid = OC.getCurrentUser().uid; + var url = scheme + command + '/' + uid + '@' + window.location.host + OC.encodePath(path); + url += '?token=' + result.ocs.data.token; + + window.location.href = url; + }) + .fail(function() { + OC.Notification.show(t('files', 'Failed to redirect to client')) + }) }, /** diff --git a/apps/files/lib/BackgroundJob/DeleteExpiredOpenLocalEditor.php b/apps/files/lib/BackgroundJob/DeleteExpiredOpenLocalEditor.php new file mode 100644 index 00000000000..d96728fc713 --- /dev/null +++ b/apps/files/lib/BackgroundJob/DeleteExpiredOpenLocalEditor.php @@ -0,0 +1,61 @@ +<?php + +declare(strict_types=1); + +/** + * @copyright Copyright (c) 2022 Joas Schilling <coding@schilljs.com> + * + * @author Joas Schilling <coding@schilljs.com> + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + +namespace OCA\Files\BackgroundJob; + +use OCA\Files\Controller\OpenLocalEditorController; +use OCA\Files\Db\OpenLocalEditorMapper; +use OCP\AppFramework\Utility\ITimeFactory; +use OCP\BackgroundJob\IJob; +use OCP\BackgroundJob\TimedJob; + +/** + * Delete all expired "Open local editor" token + */ +class DeleteExpiredOpenLocalEditor extends TimedJob { + protected OpenLocalEditorMapper $mapper; + + public function __construct( + ITimeFactory $time, + OpenLocalEditorMapper $mapper + ) { + parent::__construct($time); + $this->mapper = $mapper; + + // Run every 12h + $this->interval = 12 * 3600; + $this->setTimeSensitivity(IJob::TIME_INSENSITIVE); + } + + /** + * Makes the background job do its work + * + * @param array $argument unused argument + */ + public function run($argument): void { + $this->mapper->deleteExpiredTokens($this->time->getTime()); + } +} diff --git a/apps/files/lib/Command/Scan.php b/apps/files/lib/Command/Scan.php index b40e963efc6..f1596fa98a5 100644 --- a/apps/files/lib/Command/Scan.php +++ b/apps/files/lib/Command/Scan.php @@ -37,8 +37,11 @@ use OC\Core\Command\Base; use OC\Core\Command\InterruptedException; use OC\DB\Connection; use OC\DB\ConnectionAdapter; +use OCP\Files\File; use OC\ForbiddenException; +use OC\Metadata\MetadataManager; use OCP\EventDispatcher\IEventDispatcher; +use OCP\Files\IRootFolder; use OCP\Files\Mount\IMountPoint; use OCP\Files\NotFoundException; use OCP\Files\StorageNotAvailableException; @@ -51,19 +54,22 @@ use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; class Scan extends Base { + private IUserManager $userManager; + protected float $execTime = 0; + protected int $foldersCounter = 0; + protected int $filesCounter = 0; + private IRootFolder $root; + private MetadataManager $metadataManager; - /** @var IUserManager $userManager */ - private $userManager; - /** @var float */ - protected $execTime = 0; - /** @var int */ - protected $foldersCounter = 0; - /** @var int */ - protected $filesCounter = 0; - - public function __construct(IUserManager $userManager) { + public function __construct( + IUserManager $userManager, + IRootFolder $rootFolder, + MetadataManager $metadataManager + ) { $this->userManager = $userManager; parent::__construct(); + $this->root = $rootFolder; + $this->metadataManager = $metadataManager; } protected function configure() { @@ -84,6 +90,12 @@ class Scan extends Base { 'limit rescan to this path, eg. --path="/alice/files/Music", the user_id is determined by the path and the user_id parameter and --all are ignored' ) ->addOption( + 'generate-metadata', + null, + InputOption::VALUE_NONE, + 'Generate metadata for all scanned files' + ) + ->addOption( 'all', null, InputOption::VALUE_NONE, @@ -106,21 +118,26 @@ class Scan extends Base { ); } - protected function scanFiles($user, $path, OutputInterface $output, $backgroundScan = false, $recursive = true, $homeOnly = false) { + protected function scanFiles(string $user, string $path, bool $scanMetadata, OutputInterface $output, bool $backgroundScan = false, bool $recursive = true, bool $homeOnly = false): void { $connection = $this->reconnectToDatabase($output); $scanner = new \OC\Files\Utils\Scanner( $user, new ConnectionAdapter($connection), - \OC::$server->query(IEventDispatcher::class), + \OC::$server->get(IEventDispatcher::class), \OC::$server->get(LoggerInterface::class) ); # check on each file/folder if there was a user interrupt (ctrl-c) and throw an exception - - $scanner->listen('\OC\Files\Utils\Scanner', 'scanFile', function ($path) use ($output) { + $scanner->listen('\OC\Files\Utils\Scanner', 'scanFile', function (string $path) use ($output, $scanMetadata) { $output->writeln("\tFile\t<info>$path</info>", OutputInterface::VERBOSITY_VERBOSE); ++$this->filesCounter; $this->abortIfInterrupted(); + if ($scanMetadata) { + $node = $this->root->get($path); + if ($node instanceof File) { + $this->metadataManager->generateMetadata($node, false); + } + } }); $scanner->listen('\OC\Files\Utils\Scanner', 'scanFolder', function ($path) use ($output) { @@ -197,7 +214,7 @@ class Scan extends Base { ++$user_count; if ($this->userManager->userExists($user)) { $output->writeln("Starting scan for user $user_count out of $users_total ($user)"); - $this->scanFiles($user, $path, $output, $input->getOption('unscanned'), !$input->getOption('shallow'), $input->getOption('home-only')); + $this->scanFiles($user, $path, $input->getOption('generate-metadata'), $output, $input->getOption('unscanned'), !$input->getOption('shallow'), $input->getOption('home-only')); $output->writeln('', OutputInterface::VERBOSITY_VERBOSE); } else { $output->writeln("<error>Unknown user $user_count $user</error>"); @@ -291,7 +308,7 @@ class Scan extends Base { protected function formatExecTime() { $secs = round($this->execTime); # convert seconds into HH:MM:SS form - return sprintf('%02d:%02d:%02d', (int)($secs / 3600), ( (int)($secs / 60) % 60), $secs % 60); + return sprintf('%02d:%02d:%02d', (int)($secs / 3600), ((int)($secs / 60) % 60), $secs % 60); } protected function reconnectToDatabase(OutputInterface $output): Connection { diff --git a/apps/files/lib/Controller/OpenLocalEditorController.php b/apps/files/lib/Controller/OpenLocalEditorController.php new file mode 100644 index 00000000000..7d784196361 --- /dev/null +++ b/apps/files/lib/Controller/OpenLocalEditorController.php @@ -0,0 +1,138 @@ +<?php + +declare(strict_types=1); + +/** + * @copyright Copyright (c) 2022 Joas Schilling <coding@schilljs.com> + * + * @author Joas Schilling <coding@schilljs.com> + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + +namespace OCA\Files\Controller; + +use OCA\Files\Db\OpenLocalEditor; +use OCA\Files\Db\OpenLocalEditorMapper; +use OCP\AppFramework\Db\DoesNotExistException; +use OCP\AppFramework\Http; +use OCP\AppFramework\Http\DataResponse; +use OCP\AppFramework\OCSController; +use OCP\AppFramework\Utility\ITimeFactory; +use OCP\DB\Exception; +use OCP\IRequest; +use OCP\Security\ISecureRandom; +use Psr\Log\LoggerInterface; + +class OpenLocalEditorController extends OCSController { + public const TOKEN_LENGTH = 128; + public const TOKEN_DURATION = 600; // 10 Minutes + public const TOKEN_RETRIES = 50; + + protected ITimeFactory $timeFactory; + protected OpenLocalEditorMapper $mapper; + protected ISecureRandom $secureRandom; + protected LoggerInterface $logger; + protected ?string $userId; + + public function __construct( + string $appName, + IRequest $request, + ITimeFactory $timeFactory, + OpenLocalEditorMapper $mapper, + ISecureRandom $secureRandom, + LoggerInterface $logger, + ?string $userId + ) { + parent::__construct($appName, $request); + + $this->timeFactory = $timeFactory; + $this->mapper = $mapper; + $this->secureRandom = $secureRandom; + $this->logger = $logger; + $this->userId = $userId; + } + + /** + * @NoAdminRequired + * @UserRateThrottle(limit=10, period=120) + */ + public function create(string $path): DataResponse { + $pathHash = sha1($path); + + $entity = new OpenLocalEditor(); + $entity->setUserId($this->userId); + $entity->setPathHash($pathHash); + $entity->setExpirationTime($this->timeFactory->getTime() + self::TOKEN_DURATION); // Expire in 10 minutes + + for ($i = 1; $i <= self::TOKEN_RETRIES; $i++) { + $token = $this->secureRandom->generate(self::TOKEN_LENGTH, ISecureRandom::CHAR_ALPHANUMERIC); + $entity->setToken($token); + + try { + $this->mapper->insert($entity); + + return new DataResponse([ + 'userId' => $this->userId, + 'pathHash' => $pathHash, + 'expirationTime' => $entity->getExpirationTime(), + 'token' => $entity->getToken(), + ]); + } catch (Exception $e) { + if ($e->getCode() !== Exception::REASON_UNIQUE_CONSTRAINT_VIOLATION) { + // Only retry on unique constraint violation + throw $e; + } + } + } + + $this->logger->error('Giving up after ' . self::TOKEN_RETRIES . ' retries to generate a unique local editor token for path hash: ' . $pathHash); + return new DataResponse([], Http::STATUS_INTERNAL_SERVER_ERROR); + } + + /** + * @NoAdminRequired + * @BruteForceProtection(action=openLocalEditor) + */ + public function validate(string $path, string $token): DataResponse { + $pathHash = sha1($path); + + try { + $entity = $this->mapper->verifyToken($this->userId, $pathHash, $token); + } catch (DoesNotExistException $e) { + $response = new DataResponse([], Http::STATUS_NOT_FOUND); + $response->throttle(['userId' => $this->userId, 'pathHash' => $pathHash]); + return $response; + } + + $this->mapper->delete($entity); + + if ($entity->getExpirationTime() <= $this->timeFactory->getTime()) { + $response = new DataResponse([], Http::STATUS_NOT_FOUND); + $response->throttle(['userId' => $this->userId, 'pathHash' => $pathHash]); + return $response; + } + + return new DataResponse([ + 'userId' => $this->userId, + 'pathHash' => $pathHash, + 'expirationTime' => $entity->getExpirationTime(), + 'token' => $entity->getToken(), + ]); + } + +} diff --git a/apps/files/lib/Db/OpenLocalEditor.php b/apps/files/lib/Db/OpenLocalEditor.php new file mode 100644 index 00000000000..81bb55e47f7 --- /dev/null +++ b/apps/files/lib/Db/OpenLocalEditor.php @@ -0,0 +1,60 @@ +<?php + +declare(strict_types=1); + +/** + * @copyright Copyright (c) 2022 Joas Schilling <coding@schilljs.com> + * + * @author Joas Schilling <coding@schilljs.com> + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + +namespace OCA\Files\Db; + +use OCP\AppFramework\Db\Entity; + +/** + * @method void setUserId(string $userId) + * @method string getUserId() + * @method void setPathHash(string $pathHash) + * @method string getPathHash() + * @method void setExpirationTime(int $expirationTime) + * @method int getExpirationTime() + * @method void setToken(string $token) + * @method string getToken() + */ +class OpenLocalEditor extends Entity { + /** @var string */ + protected $userId; + + /** @var string */ + protected $pathHash; + + /** @var int */ + protected $expirationTime; + + /** @var string */ + protected $token; + + public function __construct() { + $this->addType('userId', 'string'); + $this->addType('pathHash', 'string'); + $this->addType('expirationTime', 'integer'); + $this->addType('token', 'string'); + } +} diff --git a/apps/files/lib/Db/OpenLocalEditorMapper.php b/apps/files/lib/Db/OpenLocalEditorMapper.php new file mode 100644 index 00000000000..71573264c74 --- /dev/null +++ b/apps/files/lib/Db/OpenLocalEditorMapper.php @@ -0,0 +1,65 @@ +<?php + +declare(strict_types=1); + +/** + * @copyright Copyright (c) 2022 Joas Schilling <coding@schilljs.com> + * + * @author Joas Schilling <coding@schilljs.com> + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + +namespace OCA\Files\Db; + +use OCP\AppFramework\Db\DoesNotExistException; +use OCP\AppFramework\Db\MultipleObjectsReturnedException; +use OCP\AppFramework\Db\QBMapper; +use OCP\DB\Exception; +use OCP\IDBConnection; + +class OpenLocalEditorMapper extends QBMapper { + public function __construct(IDBConnection $db) { + parent::__construct($db, 'open_local_editor', OpenLocalEditor::class); + } + + /** + * @throws DoesNotExistException + * @throws MultipleObjectsReturnedException + * @throws Exception + */ + public function verifyToken(string $userId, string $pathHash, string $token): OpenLocalEditor { + $qb = $this->db->getQueryBuilder(); + + $qb->select('*') + ->from($this->getTableName()) + ->where($qb->expr()->eq('user_id', $qb->createNamedParameter($userId))) + ->andWhere($qb->expr()->eq('path_hash', $qb->createNamedParameter($pathHash))) + ->andWhere($qb->expr()->eq('token', $qb->createNamedParameter($token))); + + return $this->findEntity($qb); + } + + public function deleteExpiredTokens(int $time): void { + $qb = $this->db->getQueryBuilder(); + + $qb->delete($this->getTableName()) + ->where($qb->expr()->lt('expiration_time', $qb->createNamedParameter($time))); + + $qb->executeStatement(); + } +} diff --git a/apps/files/lib/Migration/Version12101Date20221011153334.php b/apps/files/lib/Migration/Version12101Date20221011153334.php new file mode 100644 index 00000000000..0c1093f50a6 --- /dev/null +++ b/apps/files/lib/Migration/Version12101Date20221011153334.php @@ -0,0 +1,69 @@ +<?php + +declare(strict_types=1); + +/** + * @copyright Copyright (c) 2022 Joas Schilling <coding@schilljs.com> + * + * @author Joas Schilling <coding@schilljs.com> + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + +namespace OCA\Files\Migration; + +use Closure; +use OCP\DB\ISchemaWrapper; +use OCP\DB\Types; +use OCP\Migration\IOutput; +use OCP\Migration\SimpleMigrationStep; + +class Version12101Date20221011153334 extends SimpleMigrationStep { + public function changeSchema(IOutput $output, Closure $schemaClosure, array $options): ?ISchemaWrapper { + /** @var ISchemaWrapper $schema */ + $schema = $schemaClosure(); + + $table = $schema->createTable('open_local_editor'); + $table->addColumn('id',Types::BIGINT, [ + 'autoincrement' => true, + 'notnull' => true, + 'length' => 20, + 'unsigned' => true, + ]); + $table->addColumn('user_id', Types::STRING, [ + 'notnull' => true, + 'length' => 64, + ]); + $table->addColumn('path_hash', Types::STRING, [ + 'notnull' => true, + 'length' => 64, + ]); + $table->addColumn('expiration_time', Types::BIGINT, [ + 'notnull' => true, + 'unsigned' => true, + ]); + $table->addColumn('token', Types::STRING, [ + 'notnull' => true, + 'length' => 128, + ]); + + $table->setPrimaryKey(['id']); + $table->addUniqueIndex(['user_id', 'path_hash', 'token'], 'openlocal_user_path_token'); + + return $schema; + } +} diff --git a/apps/files_sharing/l10n/nb.js b/apps/files_sharing/l10n/nb.js index deb4c9438e2..6fa25c34942 100644 --- a/apps/files_sharing/l10n/nb.js +++ b/apps/files_sharing/l10n/nb.js @@ -65,7 +65,7 @@ OC.L10N.register( "Public link of {actor} expired" : "Offentlig lenke av {actor} er utløpt", "You shared {file} as public link" : "Du delte {file} som offentlig lenke", "You removed public link for {file}" : "Du fjernet offentlig lenke for {file}", - "Public link expired for {file}" : "Offentlig lenke er utløprt for {file}", + "Public link expired for {file}" : "Offentlig lenke er utløpt for {file}", "{actor} shared {file} as public link" : "{actor} delte {file} som offentlig lenke", "{actor} removed public link for {file}" : "{actor} fjernet offentlig lenke for {file}", "Public link of {actor} for {file} expired" : "Offentlig lenke av {actor} for {file} har utløpt", diff --git a/apps/files_sharing/l10n/nb.json b/apps/files_sharing/l10n/nb.json index 485af80b59c..7f75a54b617 100644 --- a/apps/files_sharing/l10n/nb.json +++ b/apps/files_sharing/l10n/nb.json @@ -63,7 +63,7 @@ "Public link of {actor} expired" : "Offentlig lenke av {actor} er utløpt", "You shared {file} as public link" : "Du delte {file} som offentlig lenke", "You removed public link for {file}" : "Du fjernet offentlig lenke for {file}", - "Public link expired for {file}" : "Offentlig lenke er utløprt for {file}", + "Public link expired for {file}" : "Offentlig lenke er utløpt for {file}", "{actor} shared {file} as public link" : "{actor} delte {file} som offentlig lenke", "{actor} removed public link for {file}" : "{actor} fjernet offentlig lenke for {file}", "Public link of {actor} for {file} expired" : "Offentlig lenke av {actor} for {file} har utløpt", diff --git a/apps/files_sharing/lib/Controller/ShareesAPIController.php b/apps/files_sharing/lib/Controller/ShareesAPIController.php index 399cd4e00be..00e63ccb7b0 100644 --- a/apps/files_sharing/lib/Controller/ShareesAPIController.php +++ b/apps/files_sharing/lib/Controller/ShareesAPIController.php @@ -273,7 +273,7 @@ class ShareesAPIController extends OCSController { } private function sortShareesByFrequency(array $sharees): array { - usort($sharees, function (array $s1, array $s2) { + usort($sharees, function (array $s1, array $s2): int { return $s2['count'] - $s1['count']; }); return $sharees; diff --git a/apps/files_versions/l10n/fr.js b/apps/files_versions/l10n/fr.js index 2d7b0e81bcb..e8afcda426c 100644 --- a/apps/files_versions/l10n/fr.js +++ b/apps/files_versions/l10n/fr.js @@ -3,10 +3,11 @@ OC.L10N.register( { "Versions" : "Versions", "This application automatically maintains older versions of files that are changed." : "Cette application conserve automatiquement des anciennes versions de fichiers qui ont été modifiés.", + "This application automatically maintains older versions of files that are changed. When enabled, a hidden versions folder is provisioned in every user's directory and is used to store old file versions. A user can revert to an older version through the web interface at any time, with the replaced file becoming a version. The app automatically manages the versions folder to ensure the user does not run out of Quota because of versions.\n\t\tIn addition to the expiry of versions, the versions app makes certain never to use more than 50% of the user's currently available free space. If stored versions exceed this limit, the app will delete the oldest versions first until it meets this limit. More information is available in the Versions documentation." : "Cette application maintient automatiquement les anciennes versions des fichiers qui sont modifiés. Lorsqu'elle est activée, un dossier de versions cachées est provisionné dans le répertoire de chaque utilisateur et est utilisé pour stocker les anciennes versions de fichiers. Un utilisateur peut à tout moment revenir à une ancienne version via l'interface Web, le fichier remplacé devenant à son tour une version. L'application gère automatiquement le dossier des versions pour s'assurer que l'utilisateur ne manque pas de place à cause des versions stockées.\n\t\tEn plus de l'expiration des versions, l'application veille à ne jamais utiliser plus de 50% de l'espace libre actuellement disponible pour l'utilisateur. Si les versions stockées dépassent cette limite, l'application supprime les versions les plus anciennes en premier jusqu'à ce qu'elle atteigne cette limite. Plus d'informations sont disponibles dans la documentation Versions.", "Failed to revert {file} to revision {timestamp}." : "Échec de la restauration du fichier {file} à la révision {timestamp}.", "_%n byte_::_%n bytes_" : ["%n octet","%n octets","%n octets"], "Restore" : "Restaurer", "No other versions available" : "Aucune autre version n'est disponible", - "This application automatically maintains older versions of files that are changed. When enabled, a hidden versions folder is provisioned in every user’s directory and is used to store old file versions. A user can revert to an older version through the web interface at any time, with the replaced file becoming a version. The app automatically manages the versions folder to ensure the user doesn’t run out of Quota because of versions.\n\t\tIn addition to the expiry of versions, the versions app makes certain never to use more than 50% of the user’s currently available free space. If stored versions exceed this limit, the app will delete the oldest versions first until it meets this limit. More information is available in the Versions documentation." : "Cette application maintient automatiquement les anciennes versions des fichiers qui sont modifiés. Lorsqu'elle est activée, un dossier de versions cachées est provisionné dans le répertoire de chaque utilisateur et est utilisé pour stocker les anciennes versions de fichiers. Un utilisateur peut à tout moment revenir à une ancienne version via l'interface Web, le fichier remplacé devenant une version. L'application gère automatiquement le dossier des versions pour s'assurer que l'utilisateur ne manque pas de place à cause des versions stockées.\nEn plus de l'expiration des versions, l'application veille à ne jamais utiliser plus de 50% de l'espace libre actuellement disponible pour l'utilisateur. Si les versions stockées dépassent cette limite, l'application supprime les versions les plus anciennes en premier jusqu'à ce qu'elle atteigne cette limite. Plus d'informations sont disponibles dans la documentation Versions." + "This application automatically maintains older versions of files that are changed. When enabled, a hidden versions folder is provisioned in every user’s directory and is used to store old file versions. A user can revert to an older version through the web interface at any time, with the replaced file becoming a version. The app automatically manages the versions folder to ensure the user doesn’t run out of Quota because of versions.\n\t\tIn addition to the expiry of versions, the versions app makes certain never to use more than 50% of the user’s currently available free space. If stored versions exceed this limit, the app will delete the oldest versions first until it meets this limit. More information is available in the Versions documentation." : "Cette application maintient automatiquement les anciennes versions des fichiers qui sont modifiés. Lorsqu'elle est activée, un dossier de versions cachées est provisionné dans le répertoire de chaque utilisateur et est utilisé pour stocker les anciennes versions de fichiers. Un utilisateur peut à tout moment revenir à une ancienne version via l'interface Web, le fichier remplacé devenant à son tour une version. L'application gère automatiquement le dossier des versions pour s'assurer que l'utilisateur ne manque pas de place à cause des versions stockées.\nEn plus de l'expiration des versions, l'application veille à ne jamais utiliser plus de 50% de l'espace libre actuellement disponible pour l'utilisateur. Si les versions stockées dépassent cette limite, l'application supprime les versions les plus anciennes en premier jusqu'à ce qu'elle atteigne cette limite. Plus d'informations sont disponibles dans la documentation Versions." }, "nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); diff --git a/apps/files_versions/l10n/fr.json b/apps/files_versions/l10n/fr.json index 08b23761461..c589e37e4f9 100644 --- a/apps/files_versions/l10n/fr.json +++ b/apps/files_versions/l10n/fr.json @@ -1,10 +1,11 @@ { "translations": { "Versions" : "Versions", "This application automatically maintains older versions of files that are changed." : "Cette application conserve automatiquement des anciennes versions de fichiers qui ont été modifiés.", + "This application automatically maintains older versions of files that are changed. When enabled, a hidden versions folder is provisioned in every user's directory and is used to store old file versions. A user can revert to an older version through the web interface at any time, with the replaced file becoming a version. The app automatically manages the versions folder to ensure the user does not run out of Quota because of versions.\n\t\tIn addition to the expiry of versions, the versions app makes certain never to use more than 50% of the user's currently available free space. If stored versions exceed this limit, the app will delete the oldest versions first until it meets this limit. More information is available in the Versions documentation." : "Cette application maintient automatiquement les anciennes versions des fichiers qui sont modifiés. Lorsqu'elle est activée, un dossier de versions cachées est provisionné dans le répertoire de chaque utilisateur et est utilisé pour stocker les anciennes versions de fichiers. Un utilisateur peut à tout moment revenir à une ancienne version via l'interface Web, le fichier remplacé devenant à son tour une version. L'application gère automatiquement le dossier des versions pour s'assurer que l'utilisateur ne manque pas de place à cause des versions stockées.\n\t\tEn plus de l'expiration des versions, l'application veille à ne jamais utiliser plus de 50% de l'espace libre actuellement disponible pour l'utilisateur. Si les versions stockées dépassent cette limite, l'application supprime les versions les plus anciennes en premier jusqu'à ce qu'elle atteigne cette limite. Plus d'informations sont disponibles dans la documentation Versions.", "Failed to revert {file} to revision {timestamp}." : "Échec de la restauration du fichier {file} à la révision {timestamp}.", "_%n byte_::_%n bytes_" : ["%n octet","%n octets","%n octets"], "Restore" : "Restaurer", "No other versions available" : "Aucune autre version n'est disponible", - "This application automatically maintains older versions of files that are changed. When enabled, a hidden versions folder is provisioned in every user’s directory and is used to store old file versions. A user can revert to an older version through the web interface at any time, with the replaced file becoming a version. The app automatically manages the versions folder to ensure the user doesn’t run out of Quota because of versions.\n\t\tIn addition to the expiry of versions, the versions app makes certain never to use more than 50% of the user’s currently available free space. If stored versions exceed this limit, the app will delete the oldest versions first until it meets this limit. More information is available in the Versions documentation." : "Cette application maintient automatiquement les anciennes versions des fichiers qui sont modifiés. Lorsqu'elle est activée, un dossier de versions cachées est provisionné dans le répertoire de chaque utilisateur et est utilisé pour stocker les anciennes versions de fichiers. Un utilisateur peut à tout moment revenir à une ancienne version via l'interface Web, le fichier remplacé devenant une version. L'application gère automatiquement le dossier des versions pour s'assurer que l'utilisateur ne manque pas de place à cause des versions stockées.\nEn plus de l'expiration des versions, l'application veille à ne jamais utiliser plus de 50% de l'espace libre actuellement disponible pour l'utilisateur. Si les versions stockées dépassent cette limite, l'application supprime les versions les plus anciennes en premier jusqu'à ce qu'elle atteigne cette limite. Plus d'informations sont disponibles dans la documentation Versions." + "This application automatically maintains older versions of files that are changed. When enabled, a hidden versions folder is provisioned in every user’s directory and is used to store old file versions. A user can revert to an older version through the web interface at any time, with the replaced file becoming a version. The app automatically manages the versions folder to ensure the user doesn’t run out of Quota because of versions.\n\t\tIn addition to the expiry of versions, the versions app makes certain never to use more than 50% of the user’s currently available free space. If stored versions exceed this limit, the app will delete the oldest versions first until it meets this limit. More information is available in the Versions documentation." : "Cette application maintient automatiquement les anciennes versions des fichiers qui sont modifiés. Lorsqu'elle est activée, un dossier de versions cachées est provisionné dans le répertoire de chaque utilisateur et est utilisé pour stocker les anciennes versions de fichiers. Un utilisateur peut à tout moment revenir à une ancienne version via l'interface Web, le fichier remplacé devenant à son tour une version. L'application gère automatiquement le dossier des versions pour s'assurer que l'utilisateur ne manque pas de place à cause des versions stockées.\nEn plus de l'expiration des versions, l'application veille à ne jamais utiliser plus de 50% de l'espace libre actuellement disponible pour l'utilisateur. Si les versions stockées dépassent cette limite, l'application supprime les versions les plus anciennes en premier jusqu'à ce qu'elle atteigne cette limite. Plus d'informations sont disponibles dans la documentation Versions." },"pluralForm" :"nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" }
\ No newline at end of file diff --git a/apps/provisioning_api/lib/Controller/UsersController.php b/apps/provisioning_api/lib/Controller/UsersController.php index e8b6fd0e8d9..0f9ffcbadf4 100644 --- a/apps/provisioning_api/lib/Controller/UsersController.php +++ b/apps/provisioning_api/lib/Controller/UsersController.php @@ -389,6 +389,9 @@ class UsersController extends AUserData { } $generatePasswordResetToken = false; + if (strlen($password) > 469) { + throw new OCSException('Invalid password value', 101); + } if ($password === '') { if ($email === '') { throw new OCSException('To send a password link to the user an email address is required.', 108); @@ -882,6 +885,9 @@ class UsersController extends AUserData { break; case self::USER_FIELD_PASSWORD: try { + if (strlen($value) > 469) { + throw new OCSException('Invalid password value', 102); + } if (!$targetUser->canChangePassword()) { throw new OCSException('Setting the password is not supported by the users backend', 103); } diff --git a/apps/settings/l10n/fr.js b/apps/settings/l10n/fr.js index 399c4b311a6..b276c3bfb37 100644 --- a/apps/settings/l10n/fr.js +++ b/apps/settings/l10n/fr.js @@ -1,7 +1,7 @@ OC.L10N.register( "settings", { - "Private" : "Privée", + "Private" : "Privé", "Only visible to people matched via phone number integration through Talk on mobile" : "Visible uniquement pour les utilisateurs correspondants via l'intégration du numéro de téléphone dans Talk pour mobile", "Local" : "Local", "Only visible to people on this instance and guests" : "Visible uniquement aux personnes dans l'instance et aux invités", @@ -181,7 +181,7 @@ OC.L10N.register( "No apps found for your version" : "Pas d'application trouvée pour votre version", "Disable all" : "Tout désactiver", "Enable all" : "Tout activer", - "_%n app has an update available_::_%n apps have an update available_" : ["%n application ayant une mise à jour disponible","%n applications ayant une mise à jour disponible","%n applications ayant une mise à jour disponible"], + "_%n app has an update available_::_%n apps have an update available_" : ["%n application a une mise à jour disponible","%n applications ont une mise à jour disponible","%n applications ont une mise à jour disponible"], "_Update_::_Update all_" : ["Mettre à jour","Tout mettre à jour","Tout mettre à jour"], "Marked for remote wipe" : "Marqué pour l'effaçage distant", "Device settings" : "Paramètres de l'appareil", diff --git a/apps/settings/l10n/fr.json b/apps/settings/l10n/fr.json index b2c6954a79d..4f88d88bf50 100644 --- a/apps/settings/l10n/fr.json +++ b/apps/settings/l10n/fr.json @@ -1,5 +1,5 @@ { "translations": { - "Private" : "Privée", + "Private" : "Privé", "Only visible to people matched via phone number integration through Talk on mobile" : "Visible uniquement pour les utilisateurs correspondants via l'intégration du numéro de téléphone dans Talk pour mobile", "Local" : "Local", "Only visible to people on this instance and guests" : "Visible uniquement aux personnes dans l'instance et aux invités", @@ -179,7 +179,7 @@ "No apps found for your version" : "Pas d'application trouvée pour votre version", "Disable all" : "Tout désactiver", "Enable all" : "Tout activer", - "_%n app has an update available_::_%n apps have an update available_" : ["%n application ayant une mise à jour disponible","%n applications ayant une mise à jour disponible","%n applications ayant une mise à jour disponible"], + "_%n app has an update available_::_%n apps have an update available_" : ["%n application a une mise à jour disponible","%n applications ont une mise à jour disponible","%n applications ont une mise à jour disponible"], "_Update_::_Update all_" : ["Mettre à jour","Tout mettre à jour","Tout mettre à jour"], "Marked for remote wipe" : "Marqué pour l'effaçage distant", "Device settings" : "Paramètres de l'appareil", diff --git a/apps/settings/lib/Controller/CheckSetupController.php b/apps/settings/lib/Controller/CheckSetupController.php index 0b3d63ac06d..dd401b045f0 100644 --- a/apps/settings/lib/Controller/CheckSetupController.php +++ b/apps/settings/lib/Controller/CheckSetupController.php @@ -379,7 +379,7 @@ class CheckSetupController extends Controller { return true; } - // there are two different memcached modules for PHP + // there are two different memcache modules for PHP // we only support memcached and not memcache // https://code.google.com/p/memcached/wiki/PHPClientComparison return !(!extension_loaded('memcached') && extension_loaded('memcache')); @@ -392,7 +392,7 @@ class CheckSetupController extends Controller { */ private function isSettimelimitAvailable() { if (function_exists('set_time_limit') - && strpos(@ini_get('disable_functions'), 'set_time_limit') === false) { + && strpos(ini_get('disable_functions'), 'set_time_limit') === false) { return true; } @@ -819,12 +819,12 @@ Raw output $tempPath = sys_get_temp_dir(); if (!is_dir($tempPath)) { - $this->logger->error('Error while checking the temporary PHP path - it was not properly set to a directory. value: ' . $tempPath); + $this->logger->error('Error while checking the temporary PHP path - it was not properly set to a directory. Returned value: ' . $tempPath); return false; } - $freeSpaceInTemp = disk_free_space($tempPath); + $freeSpaceInTemp = function_exists('disk_free_space') ? disk_free_space($tempPath) : false; if ($freeSpaceInTemp === false) { - $this->logger->error('Error while checking the available disk space of temporary PHP path - no free disk space returned. temporary path: ' . $tempPath); + $this->logger->error('Error while checking the available disk space of temporary PHP path or no free disk space returned. Temporary path: ' . $tempPath); return false; } diff --git a/apps/settings/lib/WellKnown/SecurityTxtHandler.php b/apps/settings/lib/WellKnown/SecurityTxtHandler.php index 6e25d485f00..e0b627dc269 100644 --- a/apps/settings/lib/WellKnown/SecurityTxtHandler.php +++ b/apps/settings/lib/WellKnown/SecurityTxtHandler.php @@ -38,10 +38,11 @@ class SecurityTxtHandler implements IHandler { } $response = "Contact: https://hackerone.com/nextcloud -Expires: 2021-12-31T23:00:00.000Z +Expires: 2023-04-31T23:00:00.000Z Acknowledgments: https://hackerone.com/nextcloud/thanks Acknowledgments: https://github.com/nextcloud/security-advisories/security/advisories -Policy: https://hackerone.com/nextcloud"; +Policy: https://hackerone.com/nextcloud +Preferred-Languages: en"; return new GenericResponse(new TextPlainResponse($response, 200)); } diff --git a/apps/settings/src/components/UserList.vue b/apps/settings/src/components/UserList.vue index 8b2a84a9b9a..9d737206bf4 100644 --- a/apps/settings/src/components/UserList.vue +++ b/apps/settings/src/components/UserList.vue @@ -56,6 +56,7 @@ ref="newuserpassword" v-model="newUser.password" :minlength="minPasswordLength" + :maxlength="469" :placeholder="t('settings', 'Password')" :required="newUser.mailAddress===''" autocapitalize="none" diff --git a/apps/theming/css/default.css b/apps/theming/css/default.css index 19d02a53f9b..da4814d66ef 100644 --- a/apps/theming/css/default.css +++ b/apps/theming/css/default.css @@ -13,6 +13,8 @@ --color-placeholder-dark: #cccccc; --color-main-text: #222222; --color-text-maxcontrast: #767676; + --color-text-maxcontrast-default: #767676; + --color-text-maxcontrast-background-blur: #646464; --color-text-light: #222222; --color-text-lighter: #767676; --color-scrollbar: rgba(34,34,34, .15); diff --git a/apps/theming/l10n/fr.js b/apps/theming/l10n/fr.js index 151e6ab814f..6fcfa0cae0c 100644 --- a/apps/theming/l10n/fr.js +++ b/apps/theming/l10n/fr.js @@ -5,6 +5,7 @@ OC.L10N.register( "Admin" : "Administration", "Saved" : "Enregistré", "a safe home for all your data" : "un lieu sûr pour toutes vos données", + "Error uploading the file" : "Erreur lors du téléversement du fichier", "Name cannot be empty" : "Le nom ne peut pas être vide", "The given name is too long" : "Le nom donné est trop long", "The given web address is too long" : "L'adresse web donnée est trop longue", @@ -16,10 +17,10 @@ OC.L10N.register( "The given slogan is too long" : "Le slogan donné est trop long", "The given color is invalid" : "La couleur donnée est invalide", "The file was uploaded" : "Le fichier a été téléversé", - "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Le fichier téléversé dépasse la valeur upload_max_filesize située dans le fichier php.ini", + "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Le fichier téléversé dépasse la valeur upload_max_filesize située dans le fichier php.ini", "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Le fichier téléversé dépasse la valeur MAX_FILE_SIZE spécifiée dans le formulaire HTML", - "The file was only partially uploaded" : "Le fichier n'a été que partiellement envoyé", - "No file was uploaded" : "Aucun fichier téléversé", + "The file was only partially uploaded" : "Le fichier n'a été que partiellement téléversé", + "No file was uploaded" : "Aucun fichier n'a été téléversé", "Missing a temporary folder" : "Absence de dossier temporaire", "Could not write file to disk" : "Impossible d'écrire le fichier sur le disque", "A PHP extension stopped the file upload" : "Une extension PHP a arrêté le téléversement du fichier", @@ -27,30 +28,44 @@ OC.L10N.register( "You are already using a custom theme. Theming app settings might be overwritten by that." : "Vous utilisez déjà un thème personnalisé. Les paramètres de l'application Theming peuvent être remplacés par ceux-ci.", "Theming" : "Personnaliser l'apparence", "Appearance and accessibility" : "Apparence et accessibilité", + "Dark theme with high contrast mode" : "Thème sombre avec mode de contraste élevé", + "Enable dark high contrast mode" : "Activer le mode sombre à contraste élevé", + "Similar to the high contrast mode, but with dark colours." : "Similaire au mode de contraste élevé, mais avec des couleurs sombres.", "Dark theme" : "Thème sombre", "Enable dark theme" : "Activer le thème sombre", + "A dark theme to ease your eyes by reducing the overall luminosity and brightness." : "Un thème sombre pour soulager vos yeux en réduisant la luminosité et l'éclat général.", + "System default theme" : "Thème par défaut du système", + "Enable the system default" : "Activer le thème par défaut du système", + "Using the default system appearance." : "Utiliser le thème par défaut du système.", "Dyslexia font" : "Police pour dyslexiques", "Enable dyslexia font" : "Activer la police pour dyslexiques", "OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "OpenDyslexic est une police de caractères libre conçue pour atténuer certaines des erreurs de lecture courantes causées par la dyslexie.", "High contrast mode" : "Thème à contraste élevé", "Enable high contrast mode" : "Activer le thème à contraste élevé", - "A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "Un thème au contraste élevé pour faciliter votre navigation. La qualité visuelle sera réduite, mais la lisibilité sera améliorée.", + "A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "Un thème au contraste élevé pour faciliter votre navigation. La qualité visuelle sera réduite, mais la clarté sera accrue.", + "Light theme" : "Thème clair", + "Enable the default light theme" : "Activer le thème clair par défaut.", + "The default light appearance." : "Le thème clair par défaut.", "Legal notice" : "Notice légale", "Privacy policy" : "Politique de confidentialité", "Adjust the Nextcloud theme" : "Modifier le thème Nextcloud", "Keyboard shortcuts" : "Raccourcis clavier", + "In some cases keyboard shortcuts can interfer with accessibility tools. In order to allow focusing on your tool correctly you can disable all keyboard shortcuts here. This will also disable all available shortcuts in apps." : "Dans certains cas, les raccourcis clavier peuvent interférer avec les outils d'accessibilité. Afin de vous permettre de vous concentrer correctement sur votre outil, vous pouvez désactiver tous les raccourcis clavier ici. Cela désactivera également tous les raccourcis disponibles dans les applications.", + "Disable all keyboard shortcuts" : "Désactiver tous les raccourcis clavier", "Background" : "Arrière-plan", "Set a custom background" : "Définir un arrière-plan personnalisé", - "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "L'accès universel est très important pour nous. Nous suivons les standards du web et nous assurons que tout soit également utilisable sans souris et avec des logiciels d'assistance technique tels que les lecteurs d'écran. Nous visons à respecter les {guidelines}Règles pour l'accessibilité des contenus Web{linkend} 2.1 de niveau AA et même de niveau AAA avec le thème à fort contraste.", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "L'accès universel est très important pour nous. Nous suivons les standards du web et nous vérifions que tout est utilisable même sans souris et sans logiciel d'assistance comme les lecteurs d'écran. Nous visons à respecter les {guidelines}Règles pour l'accessibilité des contenus Web{linkend} 2.1 de niveau AA et même de niveau AAA avec le thème à fort contraste.", + "If you find any issues, do not hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!" : "Si vous rencontrez des problèmes, n'hésitez pas à les signaler sur {issuetracker}notre outil de suivi des problèmes{linkend}. Et si vous voulez vous impliquer, venez rejoindre {designteam}notre équipe de design{linkend} !", "Pick from Files" : "Sélectionner dans Fichiers", "Default image" : "Image par défaut", "Plain background" : "Arrière-plan uni", "Insert from {productName}" : "Sélectionnez une image de {productName}", + "Theme selection is enforced" : "La sélection du thème est imposée", "Open documentation" : "Voir la documentation", "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "Cette extension permet de personnaliser facilement l'apparence de votre instance et des clients supportés. La personnalisation de l'apparence sera visible par tous les utilisateurs.", "Name" : "Nom", "Reset to default" : "Restaurer les valeurs par défaut", - "Web link" : "Lien Nom page accueil", + "Web link" : "Lien web", "https://…" : "https://…", "Slogan" : "Slogan", "Color" : "Couleur", @@ -58,7 +73,7 @@ OC.L10N.register( "Upload new logo" : "Téléverser un nouveau logo", "Login image" : "Arrière-plan de connexion", "Upload new login background" : "Téléverser un nouvel arrière-plan de connexion", - "Remove background image" : "Supprimer l'image en arrière-plan", + "Remove background image" : "Retirer l'image d'arrière-plan", "Advanced options" : "Options avancées", "Legal notice link" : "Lien vers la notice légale", "Privacy policy link" : "Lien vers la politique de confidentialité", diff --git a/apps/theming/l10n/fr.json b/apps/theming/l10n/fr.json index 43afe5c92ac..ac7058ccdb4 100644 --- a/apps/theming/l10n/fr.json +++ b/apps/theming/l10n/fr.json @@ -3,6 +3,7 @@ "Admin" : "Administration", "Saved" : "Enregistré", "a safe home for all your data" : "un lieu sûr pour toutes vos données", + "Error uploading the file" : "Erreur lors du téléversement du fichier", "Name cannot be empty" : "Le nom ne peut pas être vide", "The given name is too long" : "Le nom donné est trop long", "The given web address is too long" : "L'adresse web donnée est trop longue", @@ -14,10 +15,10 @@ "The given slogan is too long" : "Le slogan donné est trop long", "The given color is invalid" : "La couleur donnée est invalide", "The file was uploaded" : "Le fichier a été téléversé", - "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Le fichier téléversé dépasse la valeur upload_max_filesize située dans le fichier php.ini", + "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Le fichier téléversé dépasse la valeur upload_max_filesize située dans le fichier php.ini", "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Le fichier téléversé dépasse la valeur MAX_FILE_SIZE spécifiée dans le formulaire HTML", - "The file was only partially uploaded" : "Le fichier n'a été que partiellement envoyé", - "No file was uploaded" : "Aucun fichier téléversé", + "The file was only partially uploaded" : "Le fichier n'a été que partiellement téléversé", + "No file was uploaded" : "Aucun fichier n'a été téléversé", "Missing a temporary folder" : "Absence de dossier temporaire", "Could not write file to disk" : "Impossible d'écrire le fichier sur le disque", "A PHP extension stopped the file upload" : "Une extension PHP a arrêté le téléversement du fichier", @@ -25,30 +26,44 @@ "You are already using a custom theme. Theming app settings might be overwritten by that." : "Vous utilisez déjà un thème personnalisé. Les paramètres de l'application Theming peuvent être remplacés par ceux-ci.", "Theming" : "Personnaliser l'apparence", "Appearance and accessibility" : "Apparence et accessibilité", + "Dark theme with high contrast mode" : "Thème sombre avec mode de contraste élevé", + "Enable dark high contrast mode" : "Activer le mode sombre à contraste élevé", + "Similar to the high contrast mode, but with dark colours." : "Similaire au mode de contraste élevé, mais avec des couleurs sombres.", "Dark theme" : "Thème sombre", "Enable dark theme" : "Activer le thème sombre", + "A dark theme to ease your eyes by reducing the overall luminosity and brightness." : "Un thème sombre pour soulager vos yeux en réduisant la luminosité et l'éclat général.", + "System default theme" : "Thème par défaut du système", + "Enable the system default" : "Activer le thème par défaut du système", + "Using the default system appearance." : "Utiliser le thème par défaut du système.", "Dyslexia font" : "Police pour dyslexiques", "Enable dyslexia font" : "Activer la police pour dyslexiques", "OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "OpenDyslexic est une police de caractères libre conçue pour atténuer certaines des erreurs de lecture courantes causées par la dyslexie.", "High contrast mode" : "Thème à contraste élevé", "Enable high contrast mode" : "Activer le thème à contraste élevé", - "A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "Un thème au contraste élevé pour faciliter votre navigation. La qualité visuelle sera réduite, mais la lisibilité sera améliorée.", + "A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "Un thème au contraste élevé pour faciliter votre navigation. La qualité visuelle sera réduite, mais la clarté sera accrue.", + "Light theme" : "Thème clair", + "Enable the default light theme" : "Activer le thème clair par défaut.", + "The default light appearance." : "Le thème clair par défaut.", "Legal notice" : "Notice légale", "Privacy policy" : "Politique de confidentialité", "Adjust the Nextcloud theme" : "Modifier le thème Nextcloud", "Keyboard shortcuts" : "Raccourcis clavier", + "In some cases keyboard shortcuts can interfer with accessibility tools. In order to allow focusing on your tool correctly you can disable all keyboard shortcuts here. This will also disable all available shortcuts in apps." : "Dans certains cas, les raccourcis clavier peuvent interférer avec les outils d'accessibilité. Afin de vous permettre de vous concentrer correctement sur votre outil, vous pouvez désactiver tous les raccourcis clavier ici. Cela désactivera également tous les raccourcis disponibles dans les applications.", + "Disable all keyboard shortcuts" : "Désactiver tous les raccourcis clavier", "Background" : "Arrière-plan", "Set a custom background" : "Définir un arrière-plan personnalisé", - "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "L'accès universel est très important pour nous. Nous suivons les standards du web et nous assurons que tout soit également utilisable sans souris et avec des logiciels d'assistance technique tels que les lecteurs d'écran. Nous visons à respecter les {guidelines}Règles pour l'accessibilité des contenus Web{linkend} 2.1 de niveau AA et même de niveau AAA avec le thème à fort contraste.", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "L'accès universel est très important pour nous. Nous suivons les standards du web et nous vérifions que tout est utilisable même sans souris et sans logiciel d'assistance comme les lecteurs d'écran. Nous visons à respecter les {guidelines}Règles pour l'accessibilité des contenus Web{linkend} 2.1 de niveau AA et même de niveau AAA avec le thème à fort contraste.", + "If you find any issues, do not hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!" : "Si vous rencontrez des problèmes, n'hésitez pas à les signaler sur {issuetracker}notre outil de suivi des problèmes{linkend}. Et si vous voulez vous impliquer, venez rejoindre {designteam}notre équipe de design{linkend} !", "Pick from Files" : "Sélectionner dans Fichiers", "Default image" : "Image par défaut", "Plain background" : "Arrière-plan uni", "Insert from {productName}" : "Sélectionnez une image de {productName}", + "Theme selection is enforced" : "La sélection du thème est imposée", "Open documentation" : "Voir la documentation", "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "Cette extension permet de personnaliser facilement l'apparence de votre instance et des clients supportés. La personnalisation de l'apparence sera visible par tous les utilisateurs.", "Name" : "Nom", "Reset to default" : "Restaurer les valeurs par défaut", - "Web link" : "Lien Nom page accueil", + "Web link" : "Lien web", "https://…" : "https://…", "Slogan" : "Slogan", "Color" : "Couleur", @@ -56,7 +71,7 @@ "Upload new logo" : "Téléverser un nouveau logo", "Login image" : "Arrière-plan de connexion", "Upload new login background" : "Téléverser un nouvel arrière-plan de connexion", - "Remove background image" : "Supprimer l'image en arrière-plan", + "Remove background image" : "Retirer l'image d'arrière-plan", "Advanced options" : "Options avancées", "Legal notice link" : "Lien vers la notice légale", "Privacy policy link" : "Lien vers la politique de confidentialité", diff --git a/apps/theming/lib/Controller/UserThemeController.php b/apps/theming/lib/Controller/UserThemeController.php index 327029b26cd..091331706a7 100644 --- a/apps/theming/lib/Controller/UserThemeController.php +++ b/apps/theming/lib/Controller/UserThemeController.php @@ -34,6 +34,7 @@ use OCA\Theming\AppInfo\Application; use OCA\Theming\ITheme; use OCA\Theming\Service\BackgroundService; use OCA\Theming\Service\ThemesService; +use OCA\Theming\ThemingDefaults; use OCP\AppFramework\Http; use OCP\AppFramework\Http\DataResponse; use OCP\AppFramework\Http\FileDisplayResponse; @@ -53,6 +54,7 @@ class UserThemeController extends OCSController { private IConfig $config; private IUserSession $userSession; private ThemesService $themesService; + private ThemingDefaults $themingDefaults; private BackgroundService $backgroundService; /** @@ -63,11 +65,13 @@ class UserThemeController extends OCSController { IConfig $config, IUserSession $userSession, ThemesService $themesService, + ThemingDefaults $themingDefaults, BackgroundService $backgroundService) { parent::__construct($appName, $request); $this->config = $config; $this->userSession = $userSession; $this->themesService = $themesService; + $this->themingDefaults = $themingDefaults; $this->backgroundService = $backgroundService; $this->userId = $userSession->getUser()->getUID(); } @@ -177,6 +181,8 @@ class UserThemeController extends OCSController { } $currentVersion++; $this->config->setUserValue($this->userId, Application::APP_ID, 'backgroundVersion', (string)$currentVersion); + // FIXME replace with user-specific cachebuster increase https://github.com/nextcloud/server/issues/34472 + $this->themingDefaults->increaseCacheBuster(); return new JSONResponse([ 'type' => $type, 'value' => $value, diff --git a/apps/theming/lib/Themes/DarkHighContrastTheme.php b/apps/theming/lib/Themes/DarkHighContrastTheme.php index 37d9be44742..7b82136a56a 100644 --- a/apps/theming/lib/Themes/DarkHighContrastTheme.php +++ b/apps/theming/lib/Themes/DarkHighContrastTheme.php @@ -77,6 +77,7 @@ class DarkHighContrastTheme extends DarkTheme implements ITheme { '--color-placeholder-dark' => $this->util->lighten($colorMainBackground, 45), '--color-text-maxcontrast' => $colorMainText, + '--color-text-maxcontrast-background-blur' => $colorMainText, '--color-text-light' => $colorMainText, '--color-text-lighter' => $colorMainText, diff --git a/apps/theming/lib/Themes/DarkTheme.php b/apps/theming/lib/Themes/DarkTheme.php index b615cbcaa4b..ecd4c7d3fd6 100644 --- a/apps/theming/lib/Themes/DarkTheme.php +++ b/apps/theming/lib/Themes/DarkTheme.php @@ -54,6 +54,7 @@ class DarkTheme extends DefaultTheme implements ITheme { $colorMainText = '#D8D8D8'; $colorMainBackground = '#171717'; $colorMainBackgroundRGB = join(',', $this->util->hexToRGB($colorMainBackground)); + $colorTextMaxcontrast = $this->util->darken($colorMainText, 30); $colorBoxShadow = $this->util->darken($colorMainBackground, 70); $colorBoxShadowRGB = join(',', $this->util->hexToRGB($colorBoxShadow)); @@ -75,7 +76,9 @@ class DarkTheme extends DefaultTheme implements ITheme { '--color-placeholder-light' => $this->util->lighten($colorMainBackground, 10), '--color-placeholder-dark' => $this->util->lighten($colorMainBackground, 20), - '--color-text-maxcontrast' => $this->util->darken($colorMainText, 30), + '--color-text-maxcontrast' => $colorTextMaxcontrast, + '--color-text-maxcontrast-default' => $colorTextMaxcontrast, + '--color-text-maxcontrast-background-blur' => $this->util->lighten($colorTextMaxcontrast, 2), '--color-text-light' => $this->util->darken($colorMainText, 10), '--color-text-lighter' => $this->util->darken($colorMainText, 20), diff --git a/apps/theming/lib/Themes/DefaultTheme.php b/apps/theming/lib/Themes/DefaultTheme.php index 413902d7813..e295d5d880a 100644 --- a/apps/theming/lib/Themes/DefaultTheme.php +++ b/apps/theming/lib/Themes/DefaultTheme.php @@ -97,6 +97,7 @@ class DefaultTheme implements ITheme { public function getCSSVariables(): array { $colorMainText = '#222222'; $colorMainTextRgb = join(',', $this->util->hexToRGB($colorMainText)); + $colorTextMaxcontrast = $this->util->lighten($colorMainText, 33); $colorMainBackground = '#ffffff'; $colorMainBackgroundRGB = join(',', $this->util->hexToRGB($colorMainBackground)); $colorBoxShadow = $this->util->darken($colorMainBackground, 70); @@ -126,7 +127,9 @@ class DefaultTheme implements ITheme { // max contrast for WCAG compliance '--color-main-text' => $colorMainText, - '--color-text-maxcontrast' => $this->util->lighten($colorMainText, 33), + '--color-text-maxcontrast' => $colorTextMaxcontrast, + '--color-text-maxcontrast-default' => $colorTextMaxcontrast, + '--color-text-maxcontrast-background-blur' => $this->util->darken($colorTextMaxcontrast, 7), '--color-text-light' => $colorMainText, '--color-text-lighter' => $this->util->lighten($colorMainText, 33), diff --git a/apps/theming/lib/Themes/HighContrastTheme.php b/apps/theming/lib/Themes/HighContrastTheme.php index 14226b5f99b..1ae848c866f 100644 --- a/apps/theming/lib/Themes/HighContrastTheme.php +++ b/apps/theming/lib/Themes/HighContrastTheme.php @@ -77,6 +77,7 @@ class HighContrastTheme extends DefaultTheme implements ITheme { '--color-placeholder-dark' => $this->util->darken($colorMainBackground, 45), '--color-text-maxcontrast' => $colorMainText, + '--color-text-maxcontrast-background-blur' => $colorMainText, '--color-text-light' => $colorMainText, '--color-text-lighter' => $colorMainText, diff --git a/apps/theming/lib/ThemingDefaults.php b/apps/theming/lib/ThemingDefaults.php index 5fa5656d928..ae12530fb5c 100644 --- a/apps/theming/lib/ThemingDefaults.php +++ b/apps/theming/lib/ThemingDefaults.php @@ -224,10 +224,8 @@ class ThemingDefaults extends \OC_Defaults { if ($color === '' && !empty($user)) { $themingBackground = $this->config->getUserValue($user->getUID(), Application::APP_ID, 'background', 'default'); if ($themingBackground === 'default') { - $this->increaseCacheBuster(); return BackgroundService::DEFAULT_COLOR; } else if (isset(BackgroundService::SHIPPED_BACKGROUNDS[$themingBackground]['primary_color'])) { - $this->increaseCacheBuster(); return BackgroundService::SHIPPED_BACKGROUNDS[$themingBackground]['primary_color']; } } @@ -411,7 +409,7 @@ class ThemingDefaults extends \OC_Defaults { /** * Increases the cache buster key */ - private function increaseCacheBuster(): void { + public function increaseCacheBuster(): void { $cacheBusterKey = (int)$this->config->getAppValue('theming', 'cachebuster', '0'); $this->config->setAppValue('theming', 'cachebuster', (string)($cacheBusterKey + 1)); $this->cacheFactory->createDistributed('theming-')->clear(); diff --git a/apps/theming/tests/Controller/UserThemeControllerTest.php b/apps/theming/tests/Controller/UserThemeControllerTest.php index a6f73a087fc..851dbec38eb 100644 --- a/apps/theming/tests/Controller/UserThemeControllerTest.php +++ b/apps/theming/tests/Controller/UserThemeControllerTest.php @@ -33,6 +33,7 @@ use OCA\Theming\Themes\DyslexiaFont; use OCA\Theming\Themes\HighContrastTheme; use OCA\Theming\Service\ThemesService; use OCA\Theming\Themes\LightTheme; +use OCA\Theming\ThemingDefaults; use OCP\AppFramework\Http\DataResponse; use OCP\AppFramework\OCS\OCSBadRequestException; use OCP\IConfig; @@ -54,6 +55,8 @@ class UserThemeControllerTest extends TestCase { private $userSession; /** @var ThemeService|MockObject */ private $themesService; + /** @var ThemingDefaults */ + private $themingDefaults; /** @var BackgroundService|MockObject */ private $backgroundService; @@ -66,6 +69,7 @@ class UserThemeControllerTest extends TestCase { $this->config = $this->createMock(IConfig::class); $this->userSession = $this->createMock(IUserSession::class); $this->themesService = $this->createMock(ThemesService::class); + $this->themingDefaults = $this->createMock(ThemingDefaults::class); $this->backgroundService = $this->createMock(BackgroundService::class); $this->themes = [ @@ -91,6 +95,7 @@ class UserThemeControllerTest extends TestCase { $this->config, $this->userSession, $this->themesService, + $this->themingDefaults, $this->backgroundService, ); diff --git a/apps/updatenotification/src/components/UpdateNotification.vue b/apps/updatenotification/src/components/UpdateNotification.vue index 95a3927a7b7..d17ff69cbd1 100644 --- a/apps/updatenotification/src/components/UpdateNotification.vue +++ b/apps/updatenotification/src/components/UpdateNotification.vue @@ -406,7 +406,7 @@ export default { const hiddenField = document.createElement('input') hiddenField.setAttribute('type', 'hidden') hiddenField.setAttribute('name', 'updater-secret-input') - hiddenField.setAttribute('value', data.token) + hiddenField.setAttribute('value', data) form.appendChild(hiddenField) diff --git a/apps/user_ldap/lib/Wizard.php b/apps/user_ldap/lib/Wizard.php index 06b50448038..19de55c091d 100644 --- a/apps/user_ldap/lib/Wizard.php +++ b/apps/user_ldap/lib/Wizard.php @@ -375,8 +375,8 @@ class Wizard extends LDAPUtility { */ public function determineGroupsForGroups() { return $this->determineGroups('ldap_groupfilter_groups', - 'ldapGroupFilterGroups', - false); + 'ldapGroupFilterGroups', + false); } /** @@ -385,7 +385,7 @@ class Wizard extends LDAPUtility { */ public function determineGroupsForUsers() { return $this->determineGroups('ldap_userfilter_groups', - 'ldapUserFilterGroups'); + 'ldapUserFilterGroups'); } /** @@ -512,10 +512,10 @@ class Wizard extends LDAPUtility { $obclasses = ['groupOfNames', 'groupOfUniqueNames', 'group', 'posixGroup', '*']; $this->determineFeature($obclasses, - 'objectclass', - 'ldap_groupfilter_objectclass', - 'ldapGroupFilterObjectclass', - false); + 'objectclass', + 'ldap_groupfilter_objectclass', + 'ldapGroupFilterObjectclass', + false); return $this->result; } @@ -543,10 +543,10 @@ class Wizard extends LDAPUtility { //if filter is empty, it is probably the first time the wizard is called //then, apply suggestions. $this->determineFeature($obclasses, - 'objectclass', - 'ldap_userfilter_objectclass', - 'ldapUserFilterObjectclass', - empty($filter)); + 'objectclass', + 'ldap_userfilter_objectclass', + 'ldapUserFilterObjectclass', + empty($filter)); return $this->result; } @@ -567,7 +567,7 @@ class Wizard extends LDAPUtility { if ($displayName === '') { $d = $this->configuration->getDefaults(); $this->applyFind('ldap_group_display_name', - $d['ldap_group_display_name']); + $d['ldap_group_display_name']); } $filter = $this->composeLdapFilter(self::LFILTER_GROUP_LIST); @@ -1093,7 +1093,6 @@ class Wizard extends LDAPUtility { } if ($login === true) { - $this->ldap->unbind($cr); $this->logger->debug( 'Wiz: Bind successful to Port '. $port . ' TLS ' . (int)$tls, ['app' => 'user_ldap'] @@ -1198,8 +1197,8 @@ class Wizard extends LDAPUtility { } $newItems = []; $state = $this->getAttributeValuesFromEntry($attributes, - $attr, - $newItems); + $attr, + $newItems); $dnReadCount++; $foundItems = array_merge($foundItems, $newItems); $this->resultCache[$dn][$attr] = $newItems; @@ -1242,7 +1241,7 @@ class Wizard extends LDAPUtility { $availableFeatures = $this->cumulativeSearchOnAttribute($objectclasses, $attr, - $dig, $maxEntryObjC); + $dig, $maxEntryObjC); if (is_array($availableFeatures) && count($availableFeatures) > 0) { natcasesort($availableFeatures); @@ -1321,8 +1320,8 @@ class Wizard extends LDAPUtility { } $lo = @$this->ldap->bind($cr, - $this->configuration->ldapAgentName, - $this->configuration->ldapAgentPassword); + $this->configuration->ldapAgentName, + $this->configuration->ldapAgentPassword); if ($lo === true) { $this->cr = $cr; return $cr; @@ -1370,7 +1369,7 @@ class Wizard extends LDAPUtility { //default ports $portSettings = array_merge($portSettings, - $this->getDefaultLdapPortSettings()); + $this->getDefaultLdapPortSettings()); return $portSettings; } diff --git a/build/ca-bundle-etag.txt b/build/ca-bundle-etag.txt index 6b02b3f7ea2..2b0bcb59450 100644 --- a/build/ca-bundle-etag.txt +++ b/build/ca-bundle-etag.txt @@ -1 +1 @@ -3650d-5e41fd9674803 +3707b-5eab9a4124dc3 diff --git a/build/psalm-baseline.xml b/build/psalm-baseline.xml index 61d1a7061ef..8132311ff87 100644 --- a/build/psalm-baseline.xml +++ b/build/psalm-baseline.xml @@ -2017,11 +2017,6 @@ <code>$this->timeFactory->getTime()</code> </InvalidScalarArgument> </file> - <file src="core/Command/Maintenance/Mimetype/GenerateMimetypeFileBuilder.php"> - <InvalidArrayAccess occurrences="1"> - <code>$k[0]</code> - </InvalidArrayAccess> - </file> <file src="core/Command/Maintenance/Mimetype/UpdateDB.php"> <UndefinedInterfaceMethod occurrences="2"> <code>getAllMappings</code> diff --git a/core/Command/Db/Migrations/GenerateCommand.php b/core/Command/Db/Migrations/GenerateCommand.php index 6c11c7705d2..aa93adaebb4 100644 --- a/core/Command/Db/Migrations/GenerateCommand.php +++ b/core/Command/Db/Migrations/GenerateCommand.php @@ -80,7 +80,7 @@ class {{classname}} extends SimpleMigrationStep { /** * @param IOutput $output - * @param Closure $schemaClosure The `\Closure` returns a `ISchemaWrapper` + * @param Closure(): ISchemaWrapper $schemaClosure * @param array $options */ public function preSchemaChange(IOutput $output, Closure $schemaClosure, array $options): void { @@ -88,7 +88,7 @@ class {{classname}} extends SimpleMigrationStep { /** * @param IOutput $output - * @param Closure $schemaClosure The `\Closure` returns a `ISchemaWrapper` + * @param Closure(): ISchemaWrapper $schemaClosure * @param array $options * @return null|ISchemaWrapper */ @@ -98,8 +98,8 @@ class {{classname}} extends SimpleMigrationStep { /** * @param IOutput $output - * @param Closure $schemaClosure The `\Closure` returns a `ISchemaWrapper` - * @param array $options + * @param Closure(): ISchemaWrapper $schemaClosure +g * @param array $options */ public function postSchemaChange(IOutput $output, Closure $schemaClosure, array $options): void { } diff --git a/core/Command/Maintenance/Mimetype/GenerateMimetypeFileBuilder.php b/core/Command/Maintenance/Mimetype/GenerateMimetypeFileBuilder.php index 97432473722..873744e6f94 100644 --- a/core/Command/Maintenance/Mimetype/GenerateMimetypeFileBuilder.php +++ b/core/Command/Maintenance/Mimetype/GenerateMimetypeFileBuilder.php @@ -30,17 +30,15 @@ namespace OC\Core\Command\Maintenance\Mimetype; class GenerateMimetypeFileBuilder { /** * Generate mime type list file - * @param $aliases + * + * @param array $aliases * @return string */ public function generateFile(array $aliases): string { // Remove comments - $keys = array_filter(array_keys($aliases), function ($k) { - return $k[0] === '_'; - }); - foreach ($keys as $key) { - unset($aliases[$key]); - } + $aliases = array_filter($aliases, static function ($key) { + return !($key === '' || $key[0] === '_'); + }, ARRAY_FILTER_USE_KEY); // Fetch all files $dir = new \DirectoryIterator(\OC::$SERVERROOT.'/core/img/filetypes'); diff --git a/core/l10n/fr.js b/core/l10n/fr.js index 31449b314b6..d6075d87e70 100644 --- a/core/l10n/fr.js +++ b/core/l10n/fr.js @@ -145,7 +145,7 @@ OC.L10N.register( "Please contact your administrator." : "Veuillez contacter votre administrateur.", "An internal error occurred." : "Une erreur interne est survenue.", "Please try again or contact your administrator." : "Veuillez réessayer ou contactez votre administrateur.", - "Log in to {productName}" : "Se connecter dans {productName}", + "Log in to {productName}" : "Se connecter à {productName}", "Account name or email" : "Nom d'utilisateur ou adresse e-mail", "Password" : "Mot de passe", "Wrong username or password." : "Utilisateur ou mot de passe incorrect.", diff --git a/core/l10n/fr.json b/core/l10n/fr.json index c5438422323..058f380f5bc 100644 --- a/core/l10n/fr.json +++ b/core/l10n/fr.json @@ -143,7 +143,7 @@ "Please contact your administrator." : "Veuillez contacter votre administrateur.", "An internal error occurred." : "Une erreur interne est survenue.", "Please try again or contact your administrator." : "Veuillez réessayer ou contactez votre administrateur.", - "Log in to {productName}" : "Se connecter dans {productName}", + "Log in to {productName}" : "Se connecter à {productName}", "Account name or email" : "Nom d'utilisateur ou adresse e-mail", "Password" : "Mot de passe", "Wrong username or password." : "Utilisateur ou mot de passe incorrect.", diff --git a/core/l10n/uk.js b/core/l10n/uk.js index 72b8361a641..c76691c1c4d 100644 --- a/core/l10n/uk.js +++ b/core/l10n/uk.js @@ -196,7 +196,7 @@ OC.L10N.register( "Search for {name} only" : "Пошук лише у {name}", "No results for {query}" : "Немає результатів для {query}", "Press enter to start searching" : "Натисніть enter, щоб почати пошук", - "Start typing to search" : "Що шукаємо", + "Start typing to search" : "Що шукаємо?", "Loading more results …" : "Завантаження інших результатів…", "Load more results" : "Завантажити більше результатів", "Search" : "Пошук", diff --git a/core/l10n/uk.json b/core/l10n/uk.json index 5cc68ff9fac..9201b2f2a0b 100644 --- a/core/l10n/uk.json +++ b/core/l10n/uk.json @@ -194,7 +194,7 @@ "Search for {name} only" : "Пошук лише у {name}", "No results for {query}" : "Немає результатів для {query}", "Press enter to start searching" : "Натисніть enter, щоб почати пошук", - "Start typing to search" : "Що шукаємо", + "Start typing to search" : "Що шукаємо?", "Loading more results …" : "Завантаження інших результатів…", "Load more results" : "Завантажити більше результатів", "Search" : "Пошук", diff --git a/dist/settings-users-8351.js b/dist/settings-users-8351.js index 0b0b42464b1..874ba08528b 100644 --- a/dist/settings-users-8351.js +++ b/dist/settings-users-8351.js @@ -1,3 +1,3 @@ /*! For license information please see settings-users-8351.js.LICENSE.txt */ -"use strict";(self.webpackChunknextcloud=self.webpackChunknextcloud||[]).push([[8351],{10806:function(t,n,e){var s=e(87537),i=e.n(s),a=e(23645),r=e.n(a)()(i());r.push([t.id,".row--menu-opened[data-v-573e6411]{z-index:1 !important}.row[data-v-573e6411] .multiselect__single{z-index:auto !important}","",{version:3,sources:["webpack://./apps/settings/src/components/UserList/UserRow.vue"],names:[],mappings:"AA6qBA,mCACC,oBAAA,CAED,2CACC,uBAAA",sourcesContent:["\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n// Force menu to be above other rows\n.row--menu-opened {\n\tz-index: 1 !important;\n}\n.row::v-deep .multiselect__single {\n\tz-index: auto !important;\n}\n"],sourceRoot:""}]),n.Z=r},6857:function(t,n,e){var s=e(87537),i=e.n(s),a=e(23645),r=e.n(a)()(i());r.push([t.id,".cellText{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.icon-more{background-color:var(--color-main-background);border:0}","",{version:3,sources:["webpack://./apps/settings/src/components/UserList/UserRowSimple.vue"],names:[],mappings:"AAkMC,UACC,eAAA,CACA,sBAAA,CACA,kBAAA,CAED,WACC,6CAAA,CACA,QAAA",sourcesContent:["\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\t.cellText {\n\t\toverflow: hidden;\n\t\ttext-overflow: ellipsis;\n\t\twhite-space: nowrap;\n}\n\t.icon-more {\n\t\tbackground-color: var(--color-main-background);\n\t\tborder: 0;\n\t}\n"],sourceRoot:""}]),n.Z=r},20110:function(t,n,e){var s=e(87537),i=e.n(s),a=e(23645),r=e.n(a)()(i());r.push([t.id,".app-navigation__list #addgroup[data-v-7004587b] .app-navigation-entry__utils{display:none}","",{version:3,sources:["webpack://./apps/settings/src/views/Users.vue"],names:[],mappings:"AAieA,8EACC,YAAA",sourcesContent:["\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n// force hiding the editing action for the add group entry\n.app-navigation__list #addgroup::v-deep .app-navigation-entry__utils {\n\tdisplay: none;\n}\n"],sourceRoot:""}]),n.Z=r},15070:function(t,n,e){var s=e(87537),i=e.n(s),a=e(23645),r=e.n(a)()(i());r.push([t.id,'\n.modal-wrapper[data-v-5d4cd810] {\n\tmargin: 2vh 0;\n\talign-items: flex-start;\n}\n.modal__content[data-v-5d4cd810] {\n\tdisplay: flex;\n\tpadding: 20px;\n\tflex-direction: column;\n\talign-items: center;\n\ttext-align: center;\n}\n.modal__item[data-v-5d4cd810] {\n\tmargin-bottom: 16px;\n\twidth: 100%;\n}\n.modal__item[data-v-5d4cd810]:not(:focus):not(:active) {\n\tborder-color: var(--color-border-dark);\n}\n.modal__item[data-v-5d4cd810] .multiselect {\n\twidth: 100%;\n}\n.user-actions[data-v-5d4cd810] {\n\tmargin-top: 20px;\n}\n.modal__content[data-v-5d4cd810] .multiselect__single {\n\ttext-align: left;\n\tbox-sizing: border-box;\n}\n.modal__content[data-v-5d4cd810] .multiselect__content-wrapper {\n\tbox-sizing: border-box;\n}\n.row[data-v-5d4cd810] .multiselect__single {\n\tz-index: auto !important;\n}\n\n/* fake input for groups validation */\ninput#newgroups[data-v-5d4cd810] {\n\tposition: absolute;\n\topacity: 0;\n\t/* The "hidden" input is behind the Multiselect, so in general it does\n\t * not receives clicks. However, with Firefox, after the validation\n\t * fails, it will receive the first click done on it, so its width needs\n\t * to be set to 0 to prevent that ("pointer-events: none" does not\n\t * prevent it). */\n\twidth: 0;\n}\n',"",{version:3,sources:["webpack://./apps/settings/src/components/UserList.vue"],names:[],mappings:";AAqlBA;CACA,aAAA;CACA,uBAAA;AACA;AACA;CACA,aAAA;CACA,aAAA;CACA,sBAAA;CACA,mBAAA;CACA,kBAAA;AACA;AACA;CACA,mBAAA;CACA,WAAA;AACA;AACA;CACA,sCAAA;AACA;AACA;CACA,WAAA;AACA;AACA;CACA,gBAAA;AACA;AACA;CACA,gBAAA;CACA,sBAAA;AACA;AACA;CACA,sBAAA;AACA;AACA;CACA,wBAAA;AACA;;AAEA,qCAAA;AACA;CACA,kBAAA;CACA,UAAA;CACA;;;;kBAIA;CACA,QAAA;AACA",sourcesContent:['\x3c!--\n - @copyright Copyright (c) 2018 John Molakvoæ <skjnldsv@protonmail.com>\n -\n - @author John Molakvoæ <skjnldsv@protonmail.com>\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 --\x3e\n\n<template>\n\t<div id="app-content" class="user-list-grid" @scroll.passive="onScroll">\n\t\t<NcModal v-if="showConfig.showNewUserForm" size="small" @close="closeModal">\n\t\t\t<form id="new-user"\n\t\t\t\t:disabled="loading.all"\n\t\t\t\tclass="modal__content"\n\t\t\t\t@submit.prevent="createUser">\n\t\t\t\t<h2>{{ t(\'settings\',\'New user\') }}</h2>\n\t\t\t\t<input id="newusername"\n\t\t\t\t\tref="newusername"\n\t\t\t\t\tv-model="newUser.id"\n\t\t\t\t\t:disabled="settings.newUserGenerateUserID"\n\t\t\t\t\t:placeholder="settings.newUserGenerateUserID\n\t\t\t\t\t\t? t(\'settings\', \'Will be autogenerated\')\n\t\t\t\t\t\t: t(\'settings\', \'Username\')"\n\t\t\t\t\tautocapitalize="none"\n\t\t\t\t\tautocomplete="off"\n\t\t\t\t\tautocorrect="off"\n\t\t\t\t\tclass="modal__item"\n\t\t\t\t\tname="username"\n\t\t\t\t\tpattern="[a-zA-Z0-9 _\\.@\\-\']+"\n\t\t\t\t\trequired\n\t\t\t\t\ttype="text">\n\t\t\t\t<input id="newdisplayname"\n\t\t\t\t\tv-model="newUser.displayName"\n\t\t\t\t\t:placeholder="t(\'settings\', \'Display name\')"\n\t\t\t\t\tautocapitalize="none"\n\t\t\t\t\tautocomplete="off"\n\t\t\t\t\tautocorrect="off"\n\t\t\t\t\tclass="modal__item"\n\t\t\t\t\tname="displayname"\n\t\t\t\t\ttype="text">\n\t\t\t\t<input id="newuserpassword"\n\t\t\t\t\tref="newuserpassword"\n\t\t\t\t\tv-model="newUser.password"\n\t\t\t\t\t:minlength="minPasswordLength"\n\t\t\t\t\t:placeholder="t(\'settings\', \'Password\')"\n\t\t\t\t\t:required="newUser.mailAddress===\'\'"\n\t\t\t\t\tautocapitalize="none"\n\t\t\t\t\tautocomplete="new-password"\n\t\t\t\t\tautocorrect="off"\n\t\t\t\t\tclass="modal__item"\n\t\t\t\t\tname="password"\n\t\t\t\t\ttype="password">\n\t\t\t\t<input id="newemail"\n\t\t\t\t\tv-model="newUser.mailAddress"\n\t\t\t\t\t:placeholder="t(\'settings\', \'Email\')"\n\t\t\t\t\t:required="newUser.password===\'\' || settings.newUserRequireEmail"\n\t\t\t\t\tautocapitalize="none"\n\t\t\t\t\tautocomplete="off"\n\t\t\t\t\tautocorrect="off"\n\t\t\t\t\tclass="modal__item"\n\t\t\t\t\tname="email"\n\t\t\t\t\ttype="email">\n\t\t\t\t<div class="groups modal__item">\n\t\t\t\t\t\x3c!-- hidden input trick for vanilla html5 form validation --\x3e\n\t\t\t\t\t<input v-if="!settings.isAdmin"\n\t\t\t\t\t\tid="newgroups"\n\t\t\t\t\t\t:class="{\'icon-loading-small\': loading.groups}"\n\t\t\t\t\t\t:required="!settings.isAdmin"\n\t\t\t\t\t\t:value="newUser.groups"\n\t\t\t\t\t\ttabindex="-1"\n\t\t\t\t\t\ttype="text">\n\t\t\t\t\t<NcMultiselect v-model="newUser.groups"\n\t\t\t\t\t\t:close-on-select="false"\n\t\t\t\t\t\t:disabled="loading.groups||loading.all"\n\t\t\t\t\t\t:multiple="true"\n\t\t\t\t\t\t:options="canAddGroups"\n\t\t\t\t\t\t:placeholder="t(\'settings\', \'Add user to group\')"\n\t\t\t\t\t\t:tag-width="60"\n\t\t\t\t\t\t:taggable="true"\n\t\t\t\t\t\tclass="multiselect-vue"\n\t\t\t\t\t\tlabel="name"\n\t\t\t\t\t\ttag-placeholder="create"\n\t\t\t\t\t\ttrack-by="id"\n\t\t\t\t\t\t@tag="createGroup">\n\t\t\t\t\t\t\x3c!-- If user is not admin, he is a subadmin.\n\t\t\t\t\t\t\tSubadmins can\'t create users outside their groups\n\t\t\t\t\t\t\tTherefore, empty select is forbidden --\x3e\n\t\t\t\t\t\t<span slot="noResult">{{ t(\'settings\', \'No results\') }}</span>\n\t\t\t\t\t</NcMultiselect>\n\t\t\t\t</div>\n\t\t\t\t<div v-if="subAdminsGroups.length>0 && settings.isAdmin"\n\t\t\t\t\tclass="subadmins modal__item">\n\t\t\t\t\t<NcMultiselect v-model="newUser.subAdminsGroups"\n\t\t\t\t\t\t:close-on-select="false"\n\t\t\t\t\t\t:multiple="true"\n\t\t\t\t\t\t:options="subAdminsGroups"\n\t\t\t\t\t\t:placeholder="t(\'settings\', \'Set user as admin for\')"\n\t\t\t\t\t\t:tag-width="60"\n\t\t\t\t\t\tclass="multiselect-vue"\n\t\t\t\t\t\tlabel="name"\n\t\t\t\t\t\ttrack-by="id">\n\t\t\t\t\t\t<span slot="noResult">{{ t(\'settings\', \'No results\') }}</span>\n\t\t\t\t\t</NcMultiselect>\n\t\t\t\t</div>\n\t\t\t\t<div class="quota modal__item">\n\t\t\t\t\t<NcMultiselect v-model="newUser.quota"\n\t\t\t\t\t\t:allow-empty="false"\n\t\t\t\t\t\t:options="quotaOptions"\n\t\t\t\t\t\t:placeholder="t(\'settings\', \'Select user quota\')"\n\t\t\t\t\t\t:taggable="true"\n\t\t\t\t\t\tclass="multiselect-vue"\n\t\t\t\t\t\tlabel="label"\n\t\t\t\t\t\ttrack-by="id"\n\t\t\t\t\t\t@tag="validateQuota" />\n\t\t\t\t</div>\n\t\t\t\t<div v-if="showConfig.showLanguages" class="languages modal__item">\n\t\t\t\t\t<NcMultiselect v-model="newUser.language"\n\t\t\t\t\t\t:allow-empty="false"\n\t\t\t\t\t\t:options="languages"\n\t\t\t\t\t\t:placeholder="t(\'settings\', \'Default language\')"\n\t\t\t\t\t\tclass="multiselect-vue"\n\t\t\t\t\t\tgroup-label="label"\n\t\t\t\t\t\tgroup-values="languages"\n\t\t\t\t\t\tlabel="name"\n\t\t\t\t\t\ttrack-by="code" />\n\t\t\t\t</div>\n\t\t\t\t<div v-if="showConfig.showStoragePath" class="storageLocation" />\n\t\t\t\t<div v-if="showConfig.showUserBackend" class="userBackend" />\n\t\t\t\t<div v-if="showConfig.showLastLogin" class="lastLogin" />\n\t\t\t\t<div class="user-actions">\n\t\t\t\t\t<NcButton id="newsubmit"\n\t\t\t\t\t\ttype="primary"\n\t\t\t\t\t\tnative-type="submit"\n\t\t\t\t\t\tvalue="">\n\t\t\t\t\t\t{{ t(\'settings\', \'Add a new user\') }}\n\t\t\t\t\t</NcButton>\n\t\t\t\t</div>\n\t\t\t</form>\n\t\t</NcModal>\n\t\t<div id="grid-header"\n\t\t\t:class="{\'sticky\': scrolled && !showConfig.showNewUserForm}"\n\t\t\tclass="row">\n\t\t\t<div id="headerAvatar" class="avatar" />\n\t\t\t<div id="headerName" class="name">\n\t\t\t\t<div class="subtitle">\n\t\t\t\t\t<strong>\n\t\t\t\t\t\t{{ t(\'settings\', \'Display name\') }}\n\t\t\t\t\t</strong>\n\t\t\t\t</div>\n\t\t\t\t{{ t(\'settings\', \'Username\') }}\n\t\t\t</div>\n\t\t\t<div id="headerPassword" class="password">\n\t\t\t\t{{ t(\'settings\', \'Password\') }}\n\t\t\t</div>\n\t\t\t<div id="headerAddress" class="mailAddress">\n\t\t\t\t{{ t(\'settings\', \'Email\') }}\n\t\t\t</div>\n\t\t\t<div id="headerGroups" class="groups">\n\t\t\t\t{{ t(\'settings\', \'Groups\') }}\n\t\t\t</div>\n\t\t\t<div v-if="subAdminsGroups.length>0 && settings.isAdmin"\n\t\t\t\tid="headerSubAdmins"\n\t\t\t\tclass="subadmins">\n\t\t\t\t{{ t(\'settings\', \'Group admin for\') }}\n\t\t\t</div>\n\t\t\t<div id="headerQuota" class="quota">\n\t\t\t\t{{ t(\'settings\', \'Quota\') }}\n\t\t\t</div>\n\t\t\t<div v-if="showConfig.showLanguages"\n\t\t\t\tid="headerLanguages"\n\t\t\t\tclass="languages">\n\t\t\t\t{{ t(\'settings\', \'Language\') }}\n\t\t\t</div>\n\n\t\t\t<div v-if="showConfig.showUserBackend || showConfig.showStoragePath"\n\t\t\t\tclass="headerUserBackend userBackend">\n\t\t\t\t<div v-if="showConfig.showUserBackend" class="userBackend">\n\t\t\t\t\t{{ t(\'settings\', \'User backend\') }}\n\t\t\t\t</div>\n\t\t\t\t<div v-if="showConfig.showStoragePath"\n\t\t\t\t\tclass="subtitle storageLocation">\n\t\t\t\t\t{{ t(\'settings\', \'Storage location\') }}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div v-if="showConfig.showLastLogin"\n\t\t\t\tclass="headerLastLogin lastLogin">\n\t\t\t\t{{ t(\'settings\', \'Last login\') }}\n\t\t\t</div>\n\n\t\t\t<div class="userActions" />\n\t\t</div>\n\n\t\t<user-row v-for="user in filteredUsers"\n\t\t\t:key="user.id"\n\t\t\t:external-actions="externalActions"\n\t\t\t:groups="groups"\n\t\t\t:languages="languages"\n\t\t\t:quota-options="quotaOptions"\n\t\t\t:settings="settings"\n\t\t\t:show-config="showConfig"\n\t\t\t:sub-admins-groups="subAdminsGroups"\n\t\t\t:user="user"\n\t\t\t:is-dark-theme="isDarkTheme" />\n\t\t<InfiniteLoading ref="infiniteLoading" @infinite="infiniteHandler">\n\t\t\t<div slot="spinner">\n\t\t\t\t<div class="users-icon-loading icon-loading" />\n\t\t\t</div>\n\t\t\t<div slot="no-more">\n\t\t\t\t<div class="users-list-end" />\n\t\t\t</div>\n\t\t\t<div slot="no-results">\n\t\t\t\t<div id="emptycontent">\n\t\t\t\t\t<div class="icon-contacts-dark" />\n\t\t\t\t\t<h2>{{ t(\'settings\', \'No users in here\') }}</h2>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</InfiniteLoading>\n\t</div>\n</template>\n\n<script>\nimport { subscribe, unsubscribe } from \'@nextcloud/event-bus\'\nimport InfiniteLoading from \'vue-infinite-loading\'\nimport Vue from \'vue\'\nimport NcModal from \'@nextcloud/vue/dist/Components/NcModal\'\nimport NcButton from \'@nextcloud/vue/dist/Components/NcButton\'\nimport NcMultiselect from \'@nextcloud/vue/dist/Components/NcMultiselect\'\n\nimport userRow from \'./UserList/UserRow\'\n\nconst unlimitedQuota = {\n\tid: \'none\',\n\tlabel: t(\'settings\', \'Unlimited\'),\n}\nconst defaultQuota = {\n\tid: \'default\',\n\tlabel: t(\'settings\', \'Default quota\'),\n}\nconst newUser = {\n\tid: \'\',\n\tdisplayName: \'\',\n\tpassword: \'\',\n\tmailAddress: \'\',\n\tgroups: [],\n\tsubAdminsGroups: [],\n\tquota: defaultQuota,\n\tlanguage: {\n\t\tcode: \'en\',\n\t\tname: t(\'settings\', \'Default language\'),\n\t},\n}\n\nexport default {\n\tname: \'UserList\',\n\tcomponents: {\n\t\tNcModal,\n\t\tuserRow,\n\t\tNcMultiselect,\n\t\tInfiniteLoading,\n\t\tNcButton,\n\t},\n\tprops: {\n\t\tusers: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\t\tshowConfig: {\n\t\t\ttype: Object,\n\t\t\trequired: true,\n\t\t},\n\t\tselectedGroup: {\n\t\t\ttype: String,\n\t\t\tdefault: null,\n\t\t},\n\t\texternalActions: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tunlimitedQuota,\n\t\t\tdefaultQuota,\n\t\t\tloading: {\n\t\t\t\tall: false,\n\t\t\t\tgroups: false,\n\t\t\t},\n\t\t\tscrolled: false,\n\t\t\tsearchQuery: \'\',\n\t\t\tnewUser: Object.assign({}, newUser),\n\t\t}\n\t},\n\tcomputed: {\n\t\tsettings() {\n\t\t\treturn this.$store.getters.getServerData\n\t\t},\n\t\tselectedGroupDecoded() {\n\t\t\treturn decodeURIComponent(this.selectedGroup)\n\t\t},\n\t\tfilteredUsers() {\n\t\t\tif (this.selectedGroup === \'disabled\') {\n\t\t\t\treturn this.users.filter(user => user.enabled === false)\n\t\t\t}\n\t\t\tif (!this.settings.isAdmin) {\n\t\t\t\t// we don\'t want subadmins to edit themselves\n\t\t\t\treturn this.users.filter(user => user.enabled !== false)\n\t\t\t}\n\t\t\treturn this.users.filter(user => user.enabled !== false)\n\t\t},\n\t\tgroups() {\n\t\t\t// data provided php side + remove the disabled group\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\tcanAddGroups() {\n\t\t\t// disabled if no permission to add new users to group\n\t\t\treturn this.groups.map(group => {\n\t\t\t\t// clone object because we don\'t want\n\t\t\t\t// to edit the original groups\n\t\t\t\tgroup = Object.assign({}, group)\n\t\t\t\tgroup.$isDisabled = group.canAdd === false\n\t\t\t\treturn group\n\t\t\t})\n\t\t},\n\t\tsubAdminsGroups() {\n\t\t\t// data provided php side\n\t\t\treturn this.$store.getters.getSubadminGroups\n\t\t},\n\t\tquotaOptions() {\n\t\t\t// convert the preset array into objects\n\t\t\tconst quotaPreset = this.settings.quotaPreset.reduce((acc, cur) => acc.concat({\n\t\t\t\tid: cur,\n\t\t\t\tlabel: cur,\n\t\t\t}), [])\n\t\t\t// add default presets\n\t\t\tif (this.settings.allowUnlimitedQuota) {\n\t\t\t\tquotaPreset.unshift(this.unlimitedQuota)\n\t\t\t}\n\t\t\tquotaPreset.unshift(this.defaultQuota)\n\t\t\treturn quotaPreset\n\t\t},\n\t\tminPasswordLength() {\n\t\t\treturn this.$store.getters.getPasswordPolicyMinLength\n\t\t},\n\t\tusersOffset() {\n\t\t\treturn this.$store.getters.getUsersOffset\n\t\t},\n\t\tusersLimit() {\n\t\t\treturn this.$store.getters.getUsersLimit\n\t\t},\n\t\tusersCount() {\n\t\t\treturn this.users.length\n\t\t},\n\n\t\t/* LANGUAGES */\n\t\tlanguages() {\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\tlabel: t(\'settings\', \'Common languages\'),\n\t\t\t\t\tlanguages: this.settings.languages.commonLanguages,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tlabel: t(\'settings\', \'Other languages\'),\n\t\t\t\t\tlanguages: this.settings.languages.otherLanguages,\n\t\t\t\t},\n\t\t\t]\n\t\t},\n\t\tisDarkTheme() {\n\t\t\treturn window.getComputedStyle(this.$el)\n\t\t\t\t.getPropertyValue(\'--background-invert-if-dark\') === \'invert(100%)\'\n\t\t},\n\t},\n\twatch: {\n\t\t// watch url change and group select\n\t\tselectedGroup(val, old) {\n\t\t\t// if selected is the disabled group but it\'s empty\n\t\t\tthis.redirectIfDisabled()\n\t\t\tthis.$store.commit(\'resetUsers\')\n\t\t\tthis.$refs.infiniteLoading.stateChanger.reset()\n\t\t\tthis.setNewUserDefaultGroup(val)\n\t\t},\n\n\t\t// make sure the infiniteLoading state is changed if we manually\n\t\t// add/remove data from the store\n\t\tusersCount(val, old) {\n\t\t\t// deleting the last user, reset the list\n\t\t\tif (val === 0 && old === 1) {\n\t\t\t\tthis.$refs.infiniteLoading.stateChanger.reset()\n\t\t\t\t// adding the first user, warn the infiniteLoader that\n\t\t\t\t// the list is not empty anymore (we don\'t fetch the newly\n\t\t\t\t// added user as we already have all the info we need)\n\t\t\t} else if (val === 1 && old === 0) {\n\t\t\t\tthis.$refs.infiniteLoading.stateChanger.loaded()\n\t\t\t}\n\t\t},\n\t},\n\n\tmounted() {\n\t\tif (!this.settings.canChangePassword) {\n\t\t\tOC.Notification.showTemporary(t(\'settings\', \'Password change is disabled because the master key is disabled\'))\n\t\t}\n\n\t\t/**\n\t\t * Reset and init new user form\n\t\t */\n\t\tthis.resetForm()\n\n\t\t/**\n\t\t * Register search\n\t\t */\n\t\tsubscribe(\'nextcloud:unified-search.search\', this.search)\n\t\tsubscribe(\'nextcloud:unified-search.reset\', this.resetSearch)\n\n\t\t/**\n\t\t * If disabled group but empty, redirect\n\t\t */\n\t\tthis.redirectIfDisabled()\n\t},\n\tbeforeDestroy() {\n\t\tunsubscribe(\'nextcloud:unified-search.search\', this.search)\n\t\tunsubscribe(\'nextcloud:unified-search.reset\', this.resetSearch)\n\t},\n\n\tmethods: {\n\t\tonScroll(event) {\n\t\t\tthis.scrolled = event.target.scrollTo > 0\n\t\t},\n\n\t\t/**\n\t\t * Validate quota string to make sure it\'s a valid human file size\n\t\t *\n\t\t * @param {string} quota Quota in readable format \'5 GB\'\n\t\t * @return {object}\n\t\t */\n\t\tvalidateQuota(quota) {\n\t\t\t// only used for new presets sent through @Tag\n\t\t\tconst validQuota = OC.Util.computerFileSize(quota)\n\t\t\tif (validQuota !== null && validQuota >= 0) {\n\t\t\t\t// unify format output\n\t\t\t\tquota = OC.Util.humanFileSize(OC.Util.computerFileSize(quota))\n\t\t\t\tthis.newUser.quota = { id: quota, label: quota }\n\t\t\t\treturn this.newUser.quota\n\t\t\t}\n\t\t\t// Default is unlimited\n\t\t\tthis.newUser.quota = this.quotaOptions[0]\n\t\t\treturn this.quotaOptions[0]\n\t\t},\n\n\t\tinfiniteHandler($state) {\n\t\t\tthis.$store.dispatch(\'getUsers\', {\n\t\t\t\toffset: this.usersOffset,\n\t\t\t\tlimit: this.usersLimit,\n\t\t\t\tgroup: this.selectedGroup !== \'disabled\' ? this.selectedGroup : \'\',\n\t\t\t\tsearch: this.searchQuery,\n\t\t\t})\n\t\t\t\t.then((usersCount) => {\n\t\t\t\t\tif (usersCount > 0) {\n\t\t\t\t\t\t$state.loaded()\n\t\t\t\t\t}\n\t\t\t\t\tif (usersCount < this.usersLimit) {\n\t\t\t\t\t\t$state.complete()\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t},\n\n\t\t/* SEARCH */\n\t\tsearch({ query }) {\n\t\t\tthis.searchQuery = query\n\t\t\tthis.$store.commit(\'resetUsers\')\n\t\t\tthis.$refs.infiniteLoading.stateChanger.reset()\n\t\t},\n\t\tresetSearch() {\n\t\t\tthis.search({ query: \'\' })\n\t\t},\n\n\t\tresetForm() {\n\t\t\t// revert form to original state\n\t\t\tthis.newUser = Object.assign({}, newUser)\n\n\t\t\t/**\n\t\t\t * Init default language from server data. The use of this.settings\n\t\t\t * requires a computed variable, which break the v-model binding of the form,\n\t\t\t * this is a much easier solution than getter and setter on a computed var\n\t\t\t */\n\t\t\tif (this.settings.defaultLanguage) {\n\t\t\t\tVue.set(this.newUser.language, \'code\', this.settings.defaultLanguage)\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * In case the user directly loaded the user list within a group\n\t\t\t * the watch won\'t be triggered. We need to initialize it.\n\t\t\t */\n\t\t\tthis.setNewUserDefaultGroup(this.selectedGroup)\n\n\t\t\tthis.loading.all = false\n\t\t},\n\t\tcreateUser() {\n\t\t\tthis.loading.all = true\n\t\t\tthis.$store.dispatch(\'addUser\', {\n\t\t\t\tuserid: this.newUser.id,\n\t\t\t\tpassword: this.newUser.password,\n\t\t\t\tdisplayName: this.newUser.displayName,\n\t\t\t\temail: this.newUser.mailAddress,\n\t\t\t\tgroups: this.newUser.groups.map(group => group.id),\n\t\t\t\tsubadmin: this.newUser.subAdminsGroups.map(group => group.id),\n\t\t\t\tquota: this.newUser.quota.id,\n\t\t\t\tlanguage: this.newUser.language.code,\n\t\t\t})\n\t\t\t\t.then(() => {\n\t\t\t\t\tthis.resetForm()\n\t\t\t\t\tthis.$refs.newusername.focus()\n\t\t\t\t\tthis.closeModal()\n\t\t\t\t})\n\t\t\t\t.catch((error) => {\n\t\t\t\t\tthis.loading.all = false\n\t\t\t\t\tif (error.response && error.response.data && error.response.data.ocs && error.response.data.ocs.meta) {\n\t\t\t\t\t\tconst statuscode = error.response.data.ocs.meta.statuscode\n\t\t\t\t\t\tif (statuscode === 102) {\n\t\t\t\t\t\t\t// wrong username\n\t\t\t\t\t\t\tthis.$refs.newusername.focus()\n\t\t\t\t\t\t} else if (statuscode === 107) {\n\t\t\t\t\t\t\t// wrong password\n\t\t\t\t\t\t\tthis.$refs.newuserpassword.focus()\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t},\n\t\tsetNewUserDefaultGroup(value) {\n\t\t\tif (value && value.length > 0) {\n\t\t\t\t// setting new user default group to the current selected one\n\t\t\t\tconst currentGroup = this.groups.find(group => group.id === value)\n\t\t\t\tif (currentGroup) {\n\t\t\t\t\tthis.newUser.groups = [currentGroup]\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t}\n\t\t\t// fallback, empty selected group\n\t\t\tthis.newUser.groups = []\n\t\t},\n\n\t\t/**\n\t\t * Create a new group\n\t\t *\n\t\t * @param {string} gid Group id\n\t\t * @return {Promise}\n\t\t */\n\t\tcreateGroup(gid) {\n\t\t\tthis.loading.groups = true\n\t\t\tthis.$store.dispatch(\'addGroup\', gid)\n\t\t\t\t.then((group) => {\n\t\t\t\t\tthis.newUser.groups.push(this.groups.find(group => group.id === gid))\n\t\t\t\t\tthis.loading.groups = false\n\t\t\t\t})\n\t\t\t\t.catch(() => {\n\t\t\t\t\tthis.loading.groups = false\n\t\t\t\t})\n\t\t\treturn this.$store.getters.getGroups[this.groups.length]\n\t\t},\n\n\t\t/**\n\t\t * If the selected group is the disabled group but the count is 0\n\t\t * redirect to the all users page.\n\t\t * we only check for 0 because we don\'t have the count on ldap\n\t\t * and we therefore set the usercount to -1 in this specific case\n\t\t */\n\t\tredirectIfDisabled() {\n\t\t\tconst allGroups = this.$store.getters.getGroups\n\t\t\tif (this.selectedGroup === \'disabled\'\n\t\t\t\t\t\t&& allGroups.findIndex(group => group.id === \'disabled\' && group.usercount === 0) > -1) {\n\t\t\t\t// disabled group is empty, redirection to all users\n\t\t\t\tthis.$router.push({ name: \'users\' })\n\t\t\t\tthis.$refs.infiniteLoading.stateChanger.reset()\n\t\t\t}\n\t\t},\n\t\tcloseModal() {\n\t\t\t// eslint-disable-next-line vue/no-mutating-props\n\t\t\tthis.showConfig.showNewUserForm = false\n\t\t},\n\t},\n}\n<\/script>\n<style scoped>\n\t.modal-wrapper {\n\t\tmargin: 2vh 0;\n\t\talign-items: flex-start;\n\t}\n\t.modal__content {\n\t\tdisplay: flex;\n\t\tpadding: 20px;\n\t\tflex-direction: column;\n\t\talign-items: center;\n\t\ttext-align: center;\n\t}\n\t.modal__item {\n\t\tmargin-bottom: 16px;\n\t\twidth: 100%;\n\t}\n\t.modal__item:not(:focus):not(:active) {\n\t\tborder-color: var(--color-border-dark);\n\t}\n\t.modal__item::v-deep .multiselect {\n\t\twidth: 100%;\n\t}\n\t.user-actions {\n\t\tmargin-top: 20px;\n\t}\n\t.modal__content::v-deep .multiselect__single {\n\t\ttext-align: left;\n\t\tbox-sizing: border-box;\n\t}\n\t.modal__content::v-deep .multiselect__content-wrapper {\n\t\tbox-sizing: border-box;\n\t}\n\t.row::v-deep .multiselect__single {\n\t\tz-index: auto !important;\n\t}\n\n\t/* fake input for groups validation */\n\tinput#newgroups {\n\t\tposition: absolute;\n\t\topacity: 0;\n\t\t/* The "hidden" input is behind the Multiselect, so in general it does\n\t\t * not receives clicks. However, with Firefox, after the validation\n\t\t * fails, it will receive the first click done on it, so its width needs\n\t\t * to be set to 0 to prevent that ("pointer-events: none" does not\n\t\t * prevent it). */\n\t\twidth: 0;\n\t}\n</style>\n'],sourceRoot:""}]),n.Z=r},57272:function(n,e,s){s.r(e),s.d(e,{default:function(){return Zt}});var i=s(69680),a=s.n(i),r=s(55209),o=s.n(r),u=s(88696),l=s.n(u),d=s(53110),c=s.n(d),g=s(14032),p=s.n(g),h=s(73190),m=s.n(h),f=s(93041),v=s.n(f),w=s(4820),b=s(27472),A=s.n(b),y=s(79753),C=s(98266),_=s.n(C),U=s(20144),k=s(87369),N=s.n(k),L=s(79570),x=s.n(L),G=s(45400),S=s.n(G),M=s(97039),q=s.n(M);function $(t,n,e,s,i,a,r){try{var o=t[a](r),u=o.value}catch(t){return void e(t)}o.done?n(u):Promise.resolve(u).then(s,i)}var O={name:"GroupListItem",components:{NcActionInput:x(),NcActionButton:S(),NcCounterBubble:q(),NcAppNavigationItem:p()},props:{id:{type:String,required:!0},title:{type:String,required:!0},count:{type:Number,required:!1}},data:function(){return{loadingRenameGroup:!1,openGroupMenu:!1}},computed:{settings:function(){return this.$store.getters.getServerData}},methods:{handleGroupMenuOpen:function(){this.openGroupMenu=!0},renameGroup:function(t){var n,e=this;return(n=regeneratorRuntime.mark((function n(){var s;return regeneratorRuntime.wrap((function(n){for(;;)switch(n.prev=n.next){case 0:if(""!==t.trim()){n.next=2;break}return n.abrupt("return");case 2:if(""!==(s=e.$refs.displayNameInput.$el.querySelector('input[type="text"]').value).trim()){n.next=5;break}return n.abrupt("return");case 5:return n.prev=5,e.openGroupMenu=!1,e.loadingRenameGroup=!0,n.next=10,e.$store.dispatch("renameGroup",{groupid:t.trim(),displayName:s.trim()});case 10:e.loadingRenameGroup=!1,n.next=17;break;case 13:n.prev=13,n.t0=n.catch(5),e.openGroupMenu=!0,e.loadingRenameGroup=!1;case 17:case"end":return n.stop()}}),n,null,[[5,13]])})),function(){var t=this,e=arguments;return new Promise((function(s,i){var a=n.apply(t,e);function r(t){$(a,s,i,r,o,"next",t)}function o(t){$(a,s,i,r,o,"throw",t)}r(void 0)}))})()},removeGroup:function(n){var e=this;OC.dialogs.confirm(t("settings","You are about to remove the group {group}. The users will NOT be deleted.",{group:n}),t("settings","Please confirm the group removal "),(function(t){t&&e.$store.dispatch("removeGroup",n)}))}}},P=O,D=s(51900),B=(0,D.Z)(P,(function(){var t=this,n=t.$createElement,e=t._self._c||n;return e("NcAppNavigationItem",{key:t.id,attrs:{exact:!0,title:t.title,to:{name:"group",params:{selectedGroup:encodeURIComponent(t.id)}},icon:"icon-group",loading:t.loadingRenameGroup,"menu-open":t.openGroupMenu},on:{"update:menuOpen":t.handleGroupMenuOpen},scopedSlots:t._u([{key:"counter",fn:function(){return[t.count?e("NcCounterBubble",[t._v("\n\t\t\t"+t._s(t.count)+"\n\t\t")]):t._e()]},proxy:!0},{key:"actions",fn:function(){return["admin"!==t.id&&"disabled"!==t.id&&t.settings.isAdmin?e("NcActionInput",{ref:"displayNameInput",attrs:{icon:"icon-edit",type:"text",value:t.title},on:{submit:function(n){return t.renameGroup(t.id)}}},[t._v("\n\t\t\t"+t._s(t.t("settings","Rename group"))+"\n\t\t")]):t._e(),t._v(" "),"admin"!==t.id&&"disabled"!==t.id&&t.settings.isAdmin?e("NcActionButton",{attrs:{icon:"icon-delete"},on:{click:function(n){return t.removeGroup(t.id)}}},[t._v("\n\t\t\t"+t._s(t.t("settings","Remove group"))+"\n\t\t")]):t._e()]},proxy:!0}])})}),[],!1,null,null,null).exports,R=s(74854),Q=s(30306),z=s.n(Q),I=s(70110),T=s.n(I),F=s(10861),j=s.n(F),E=s(2649),Z=s.n(E),W=s(34741),H=s(33476),Y=s(32996),V=s.n(Y),J=s(12945),K=s.n(J),X=s(22200);function tt(t){return tt="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},tt(t)}var nt={props:{user:{type:Object,required:!0},settings:{type:Object,default:function(){return{}}},groups:{type:Array,default:function(){return[]}},subAdminsGroups:{type:Array,default:function(){return[]}},quotaOptions:{type:Array,default:function(){return[]}},showConfig:{type:Object,default:function(){return{}}},languages:{type:Array,required:!0},externalActions:{type:Array,default:function(){return[]}}},computed:{userGroups:function(){var t=this;return this.groups.filter((function(n){return t.user.groups.includes(n.id)}))},userSubAdminsGroups:function(){var t=this;return this.subAdminsGroups.filter((function(n){return t.user.subadmin.includes(n.id)}))},availableGroups:function(){var t=this;return this.groups.map((function(n){var e=Object.assign({},n);return e.$isDisabled=!1===n.canAdd&&!t.user.groups.includes(n.id)||!1===n.canRemove&&t.user.groups.includes(n.id),e}))},usedSpace:function(){return this.user.quota.used?t("settings","{size} used",{size:OC.Util.humanFileSize(this.user.quota.used)}):t("settings","{size} used",{size:OC.Util.humanFileSize(0)})},usedQuota:function(){var t=this.user.quota.quota;return t=t>0?Math.min(100,Math.round(this.user.quota.used/t*100)):95*(1-1/(this.user.quota.used/(10*Math.pow(2,30))+1)),isNaN(t)?0:t},userQuota:function(){if(this.user.quota.quota>=0){var t=OC.Util.humanFileSize(this.user.quota.quota);return this.quotaOptions.find((function(n){return n.id===t}))||{id:t,label:t}}return"default"===this.user.quota.quota?this.quotaOptions[0]:this.quotaOptions[1]},minPasswordLength:function(){return this.$store.getters.getPasswordPolicyMinLength},userLanguage:function(){var t=this,n=this.languages[0].languages.concat(this.languages[1].languages).find((function(n){return n.code===t.user.language}));return"object"!==tt(n)&&""!==this.user.language?{code:this.user.language,name:this.user.language}:""!==this.user.language&&n},userLastLoginTooltip:function(){return this.user.lastLogin>0?OC.Util.formatDate(this.user.lastLogin):""},userLastLogin:function(){return this.user.lastLogin>0?OC.Util.relativeModifiedDate(this.user.lastLogin):t("settings","Never")}},methods:{generateAvatar:function(t,n){return n?(0,y.generateUrl)("/avatar/{user}/64/dark?v={version}",{user:t,version:oc_userconfig.avatar.version}):(0,y.generateUrl)("/avatar/{user}/64?v={version}",{user:t,version:oc_userconfig.avatar.version})}}},et={name:"UserRowSimple",components:{NcPopoverMenu:V(),NcActionButton:S(),NcActions:K()},directives:{ClickOutside:Z()},mixins:[nt],props:{user:{type:Object,required:!0},loading:{type:Object,required:!0},showConfig:{type:Object,required:!0},userActions:{type:Array,required:!0},openedMenu:{type:Boolean,required:!0},feedbackMessage:{type:String,required:!0},subAdminsGroups:{type:Array,required:!0},settings:{type:Object,required:!0},isDarkTheme:{type:Boolean,required:!0}},computed:{userGroupsLabels:function(){return this.userGroups.map((function(t){return t.name})).join(", ")},userSubAdminsGroupsLabels:function(){return this.userSubAdminsGroups.map((function(t){return t.name})).join(", ")},usedSpace:function(){return this.user.quota.used?t("settings","{size} used",{size:OC.Util.humanFileSize(this.user.quota.used)}):t("settings","{size} used",{size:OC.Util.humanFileSize(0)})},canEdit:function(){return(0,X.getCurrentUser)().uid!==this.user.id||this.settings.isAdmin},userQuota:function(){var n=this.user.quota.quota;return"default"===n&&"none"!==(n=this.settings.defaultQuota)&&(n=OC.Util.computerFileSize(n)),"none"===n||-3===n?t("settings","Unlimited"):n>=0?OC.Util.humanFileSize(n):OC.Util.humanFileSize(0)}},methods:{toggleMenu:function(){this.$emit("update:openedMenu",!this.openedMenu)},hideMenu:function(){this.$emit("update:openedMenu",!1)},toggleEdit:function(){this.$emit("update:editing",!0)}}},st=s(93379),it=s.n(st),at=s(7795),rt=s.n(at),ot=s(90569),ut=s.n(ot),lt=s(3565),dt=s.n(lt),ct=s(19216),gt=s.n(ct),pt=s(44589),ht=s.n(pt),mt=s(6857),ft={};ft.styleTagTransform=ht(),ft.setAttributes=dt(),ft.insert=ut().bind(null,"head"),ft.domAPI=rt(),ft.insertStyleElement=gt(),it()(mt.Z,ft),mt.Z&&mt.Z.locals&&mt.Z.locals;var vt=(0,D.Z)(et,(function(){var t=this,n=t.$createElement,e=t._self._c||n;return e("div",{staticClass:"row",class:{disabled:t.loading.delete||t.loading.disable},attrs:{"data-id":t.user.id}},[e("div",{staticClass:"avatar",class:{"icon-loading-small":t.loading.delete||t.loading.disable||t.loading.wipe}},[t.loading.delete||t.loading.disable||t.loading.wipe?t._e():e("img",{attrs:{alt:"",width:"32",height:"32",src:t.generateAvatar(t.user.id,t.isDarkTheme)}})]),t._v(" "),e("div",{staticClass:"name"},[e("div",{staticClass:"displayName subtitle"},[e("div",{directives:[{name:"tooltip",rawName:"v-tooltip",value:t.user.displayname.length>20?t.user.displayname:"",expression:"user.displayname.length > 20 ? user.displayname : ''"}],staticClass:"cellText"},[e("strong",[t._v("\n\t\t\t\t\t"+t._s(t.user.displayname)+"\n\t\t\t\t")])])]),t._v("\n\t\t"+t._s(t.user.id)+"\n\t")]),t._v(" "),e("div"),t._v(" "),e("div",{staticClass:"mailAddress"},[e("div",{directives:[{name:"tooltip",rawName:"v-tooltip",value:null!==t.user.email&&t.user.email.length>20?t.user.email:"",expression:"user.email !== null && user.email.length > 20 ? user.email : ''"}],staticClass:"cellText"},[t._v("\n\t\t\t"+t._s(t.user.email)+"\n\t\t")])]),t._v(" "),e("div",{staticClass:"groups"},[t._v("\n\t\t"+t._s(t.userGroupsLabels)+"\n\t")]),t._v(" "),t.subAdminsGroups.length>0&&t.settings.isAdmin?e("div",{staticClass:"subAdminsGroups"},[t._v("\n\t\t"+t._s(t.userSubAdminsGroupsLabels)+"\n\t")]):t._e(),t._v(" "),e("div",{staticClass:"userQuota"},[e("div",{staticClass:"quota"},[t._v("\n\t\t\t"+t._s(t.userQuota)+" ("+t._s(t.usedSpace)+")\n\t\t\t"),e("progress",{staticClass:"quota-user-progress",class:{warn:t.usedQuota>80},attrs:{max:"100"},domProps:{value:t.usedQuota}})])]),t._v(" "),t.showConfig.showLanguages?e("div",{staticClass:"languages"},[t._v("\n\t\t"+t._s(t.userLanguage.name)+"\n\t")]):t._e(),t._v(" "),t.showConfig.showUserBackend||t.showConfig.showStoragePath?e("div",{staticClass:"userBackend"},[t.showConfig.showUserBackend?e("div",{staticClass:"userBackend"},[t._v("\n\t\t\t"+t._s(t.user.backend)+"\n\t\t")]):t._e(),t._v(" "),t.showConfig.showStoragePath?e("div",{directives:[{name:"tooltip",rawName:"v-tooltip",value:t.user.storageLocation,expression:"user.storageLocation"}],staticClass:"storageLocation subtitle"},[t._v("\n\t\t\t"+t._s(t.user.storageLocation)+"\n\t\t")]):t._e()]):t._e(),t._v(" "),t.showConfig.showLastLogin?e("div",{directives:[{name:"tooltip",rawName:"v-tooltip.auto",value:t.userLastLoginTooltip,expression:"userLastLoginTooltip",modifiers:{auto:!0}}],staticClass:"lastLogin"},[t._v("\n\t\t"+t._s(t.userLastLogin)+"\n\t")]):t._e(),t._v(" "),e("div",{staticClass:"userActions"},[t.canEdit&&!t.loading.all?e("div",{staticClass:"toggleUserActions"},[e("NcActions",[e("NcActionButton",{attrs:{icon:"icon-rename"},on:{click:t.toggleEdit}},[t._v("\n\t\t\t\t\t"+t._s(t.t("settings","Edit User"))+"\n\t\t\t\t")])],1),t._v(" "),e("div",{staticClass:"userPopoverMenuWrapper"},[e("button",{directives:[{name:"click-outside",rawName:"v-click-outside",value:t.hideMenu,expression:"hideMenu"}],staticClass:"icon-more",attrs:{"aria-label":t.t("settings","Toggle user actions menu")},on:{click:function(n){return n.preventDefault(),t.toggleMenu.apply(null,arguments)}}}),t._v(" "),e("div",{staticClass:"popovermenu",class:{open:t.openedMenu},attrs:{"aria-expanded":t.openedMenu}},[e("NcPopoverMenu",{attrs:{menu:t.userActions}})],1)])],1):t._e(),t._v(" "),e("div",{staticClass:"feedback",style:{opacity:""!==t.feedbackMessage?1:0}},[e("div",{staticClass:"icon-checkmark"}),t._v("\n\t\t\t"+t._s(t.feedbackMessage)+"\n\t\t")])])])}),[],!1,null,null,null),wt=vt.exports;function bt(t,n,e,s,i,a,r){try{var o=t[a](r),u=o.value}catch(t){return void e(t)}o.done?n(u):Promise.resolve(u).then(s,i)}function At(t){return function(){var n=this,e=arguments;return new Promise((function(s,i){var a=t.apply(n,e);function r(t){bt(a,s,i,r,o,"next",t)}function o(t){bt(a,s,i,r,o,"throw",t)}r(void 0)}))}}U.ZP.use(W.default);var yt={name:"UserRow",components:{UserRowSimple:wt,NcPopoverMenu:H.NcPopoverMenu,NcActions:H.NcActions,NcActionButton:H.NcActionButton,NcMultiselect:H.NcMultiselect},directives:{ClickOutside:Z()},mixins:[nt],props:{user:{type:Object,required:!0},settings:{type:Object,default:function(){return{}}},groups:{type:Array,default:function(){return[]}},subAdminsGroups:{type:Array,default:function(){return[]}},quotaOptions:{type:Array,default:function(){return[]}},showConfig:{type:Object,default:function(){return{}}},languages:{type:Array,required:!0},externalActions:{type:Array,default:function(){return[]}},isDarkTheme:{type:Boolean,required:!0}},data:function(){return{rand:parseInt(1e3*Math.random()),openedMenu:!1,feedbackMessage:"",editing:!1,loading:{all:!1,displayName:!1,password:!1,mailAddress:!1,groups:!1,subadmins:!1,quota:!1,delete:!1,disable:!1,languages:!1,wipe:!1}}},computed:{userActions:function(){var n=[{icon:"icon-delete",text:t("settings","Delete user"),action:this.deleteUser},{icon:"icon-delete",text:t("settings","Wipe all devices"),action:this.wipeUserDevices},{icon:this.user.enabled?"icon-close":"icon-add",text:this.user.enabled?t("settings","Disable user"):t("settings","Enable user"),action:this.enableDisableUser}];return null!==this.user.email&&""!==this.user.email&&n.push({icon:"icon-mail",text:t("settings","Resend welcome email"),action:this.sendWelcomeMail}),n.concat(this.externalActions)}},methods:{toggleMenu:function(){this.openedMenu=!this.openedMenu},hideMenu:function(){this.openedMenu=!1},wipeUserDevices:function(){var n=this,e=this.user.id;OC.dialogs.confirmDestructive(t("settings","In case of lost device or exiting the organization, this can remotely wipe the Nextcloud data from all devices associated with {userid}. Only works if the devices are connected to the internet.",{userid:e}),t("settings","Remote wipe of devices"),{type:OC.dialogs.YES_NO_BUTTONS,confirm:t("settings","Wipe {userid}'s devices",{userid:e}),confirmClasses:"error",cancel:t("settings","Cancel")},(function(t){t&&(n.loading.wipe=!0,n.loading.all=!0,n.$store.dispatch("wipeUserDevices",e).then((function(){n.loading.wipe=!1,n.loading.all=!1})))}),!0)},deleteUser:function(){var n=this,e=this.user.id;OC.dialogs.confirmDestructive(t("settings","Fully delete {userid}'s account including all their personal files, app data, etc.",{userid:e}),t("settings","Account deletion"),{type:OC.dialogs.YES_NO_BUTTONS,confirm:t("settings","Delete {userid}'s account",{userid:e}),confirmClasses:"error",cancel:t("settings","Cancel")},(function(t){if(t)return n.loading.delete=!0,n.loading.all=!0,n.$store.dispatch("deleteUser",e).then((function(){n.loading.delete=!1,n.loading.all=!1}))}),!0)},enableDisableUser:function(){var t=this;this.loading.delete=!0,this.loading.all=!0;var n=this.user.id,e=!this.user.enabled;return this.$store.dispatch("enableDisableUser",{userid:n,enabled:e}).then((function(){t.loading.delete=!1,t.loading.all=!1}))},updateDisplayName:function(){var t=this,n=this.$refs.displayName.value;this.loading.displayName=!0,this.$store.dispatch("setUserData",{userid:this.user.id,key:"displayname",value:n}).then((function(){t.loading.displayName=!1,t.$refs.displayName.value=n}))},updatePassword:function(){var t=this,n=this.$refs.password.value;this.loading.password=!0,this.$store.dispatch("setUserData",{userid:this.user.id,key:"password",value:n}).then((function(){t.loading.password=!1,t.$refs.password.value=""}))},updateEmail:function(){var t=this,n=this.$refs.mailAddress.value;this.loading.mailAddress=!0,this.$store.dispatch("setUserData",{userid:this.user.id,key:"email",value:n}).then((function(){t.loading.mailAddress=!1,t.$refs.mailAddress.value=n}))},createGroup:function(t){var n=this;return At(regeneratorRuntime.mark((function e(){var s;return regeneratorRuntime.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n.loading={groups:!0,subadmins:!0},e.prev=1,e.next=4,n.$store.dispatch("addGroup",t);case 4:return s=n.user.id,e.next=7,n.$store.dispatch("addUserGroup",{userid:s,gid:t});case 7:e.next=12;break;case 9:e.prev=9,e.t0=e.catch(1),console.error(e.t0);case 12:return e.prev=12,n.loading={groups:!1,subadmins:!1},e.finish(12);case 15:return e.abrupt("return",n.$store.getters.getGroups[n.groups.length]);case 16:case"end":return e.stop()}}),e,null,[[1,9,12,15]])})))()},addUserGroup:function(t){var n=this;return At(regeneratorRuntime.mark((function e(){var s,i;return regeneratorRuntime.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(!1!==t.canAdd){e.next=2;break}return e.abrupt("return",!1);case 2:return n.loading.groups=!0,s=n.user.id,i=t.id,e.prev=5,e.next=8,n.$store.dispatch("addUserGroup",{userid:s,gid:i});case 8:e.next=13;break;case 10:e.prev=10,e.t0=e.catch(5),console.error(e.t0);case 13:return e.prev=13,n.loading.groups=!1,e.finish(13);case 16:case"end":return e.stop()}}),e,null,[[5,10,13,16]])})))()},removeUserGroup:function(t){var n=this;return At(regeneratorRuntime.mark((function e(){var s,i;return regeneratorRuntime.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(!1!==t.canRemove){e.next=2;break}return e.abrupt("return",!1);case 2:return n.loading.groups=!0,s=n.user.id,i=t.id,e.prev=5,e.next=8,n.$store.dispatch("removeUserGroup",{userid:s,gid:i});case 8:n.loading.groups=!1,n.$route.params.selectedGroup===i&&n.$store.commit("deleteUser",s),e.next=15;break;case 12:e.prev=12,e.t0=e.catch(5),n.loading.groups=!1;case 15:case"end":return e.stop()}}),e,null,[[5,12]])})))()},addUserSubAdmin:function(t){var n=this;return At(regeneratorRuntime.mark((function e(){var s,i;return regeneratorRuntime.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n.loading.subadmins=!0,s=n.user.id,i=t.id,e.prev=3,e.next=6,n.$store.dispatch("addUserSubAdmin",{userid:s,gid:i});case 6:n.loading.subadmins=!1,e.next=12;break;case 9:e.prev=9,e.t0=e.catch(3),console.error(e.t0);case 12:case"end":return e.stop()}}),e,null,[[3,9]])})))()},removeUserSubAdmin:function(t){var n=this;return At(regeneratorRuntime.mark((function e(){var s,i;return regeneratorRuntime.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n.loading.subadmins=!0,s=n.user.id,i=t.id,e.prev=3,e.next=6,n.$store.dispatch("removeUserSubAdmin",{userid:s,gid:i});case 6:e.next=11;break;case 8:e.prev=8,e.t0=e.catch(3),console.error(e.t0);case 11:return e.prev=11,n.loading.subadmins=!1,e.finish(11);case 14:case"end":return e.stop()}}),e,null,[[3,8,11,14]])})))()},setUserQuota:function(){var t=arguments,n=this;return At(regeneratorRuntime.mark((function e(){var s;return regeneratorRuntime.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return s=t.length>0&&void 0!==t[0]?t[0]:"none",n.loading.quota=!0,s=s.id?s.id:s,e.prev=3,e.next=6,n.$store.dispatch("setUserData",{userid:n.user.id,key:"quota",value:s});case 6:e.next=11;break;case 8:e.prev=8,e.t0=e.catch(3),console.error(e.t0);case 11:return e.prev=11,n.loading.quota=!1,e.finish(11);case 14:return e.abrupt("return",s);case 15:case"end":return e.stop()}}),e,null,[[3,8,11,14]])})))()},validateQuota:function(t){var n=OC.Util.computerFileSize(t);return null!==n&&n>=0&&this.setUserQuota(OC.Util.humanFileSize(OC.Util.computerFileSize(t)))},setUserLanguage:function(t){var n=this;return At(regeneratorRuntime.mark((function e(){return regeneratorRuntime.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n.loading.languages=!0,e.prev=1,e.next=4,n.$store.dispatch("setUserData",{userid:n.user.id,key:"language",value:t.code});case 4:e.next=9;break;case 6:e.prev=6,e.t0=e.catch(1),console.error(e.t0);case 9:return e.prev=9,n.loading.languages=!1,e.finish(9);case 12:return e.abrupt("return",t);case 13:case"end":return e.stop()}}),e,null,[[1,6,9,12]])})))()},sendWelcomeMail:function(){var n=this;this.loading.all=!0,this.$store.dispatch("sendWelcomeMail",this.user.id).then((function(e){e&&(n.feedbackMessage=t("setting","Welcome mail sent!"),setTimeout((function(){n.feedbackMessage=""}),2e3)),n.loading.all=!1}))}}},Ct=yt,_t=s(10806),Ut={};Ut.styleTagTransform=ht(),Ut.setAttributes=dt(),Ut.insert=ut().bind(null,"head"),Ut.domAPI=rt(),Ut.insertStyleElement=gt(),it()(_t.Z,Ut),_t.Z&&_t.Z.locals&&_t.Z.locals;var kt=(0,D.Z)(Ct,(function(){var t=this,n=t.$createElement,e=t._self._c||n;return 1===Object.keys(t.user).length?e("div",{staticClass:"row",attrs:{"data-id":t.user.id}},[e("div",{staticClass:"avatar",class:{"icon-loading-small":t.loading.delete||t.loading.disable||t.loading.wipe}},[t.loading.delete||t.loading.disable||t.loading.wipe?t._e():e("img",{attrs:{src:t.generateAvatar(t.user.id,t.isDarkTheme),alt:"",height:"32",width:"32"}})]),t._v(" "),e("div",{staticClass:"name"},[t._v("\n\t\t"+t._s(t.user.id)+"\n\t")]),t._v(" "),e("div",{staticClass:"obfuscated"},[t._v("\n\t\t"+t._s(t.t("settings","You do not have permissions to see the details of this user"))+"\n\t")])]):t.editing?e("div",{staticClass:"row row--editable",class:{disabled:t.loading.delete||t.loading.disable,"row--menu-opened":t.openedMenu},attrs:{"data-id":t.user.id}},[e("div",{staticClass:"avatar",class:{"icon-loading-small":t.loading.delete||t.loading.disable||t.loading.wipe}},[t.loading.delete||t.loading.disable||t.loading.wipe?t._e():e("img",{attrs:{src:t.generateAvatar(t.user.id,t.isDarkTheme),alt:"",height:"32",width:"32"}})]),t._v(" "),t.user.backendCapabilities.setDisplayName?e("div",{staticClass:"displayName"},[e("form",{staticClass:"displayName",class:{"icon-loading-small":t.loading.displayName},on:{submit:function(n){return n.preventDefault(),t.updateDisplayName.apply(null,arguments)}}},[e("input",{ref:"displayName",attrs:{id:"displayName"+t.user.id+t.rand,disabled:t.loading.displayName||t.loading.all,autocapitalize:"off",autocomplete:"off",autocorrect:"off",spellcheck:"false",type:"text"},domProps:{value:t.user.displayname}}),t._v(" "),e("input",{staticClass:"icon-confirm",attrs:{type:"submit",value:""}})])]):e("div",{staticClass:"name"},[t._v("\n\t\t"+t._s(t.user.id)+"\n\t\t"),e("div",{staticClass:"displayName subtitle"},[e("div",{directives:[{name:"tooltip",rawName:"v-tooltip",value:t.user.displayname.length>20?t.user.displayname:"",expression:"user.displayname.length > 20 ? user.displayname : ''"}],staticClass:"cellText"},[t._v("\n\t\t\t\t"+t._s(t.user.displayname)+"\n\t\t\t")])])]),t._v(" "),t.settings.canChangePassword&&t.user.backendCapabilities.setPassword?e("form",{staticClass:"password",class:{"icon-loading-small":t.loading.password},on:{submit:function(n){return n.preventDefault(),t.updatePassword.apply(null,arguments)}}},[e("input",{ref:"password",attrs:{id:"password"+t.user.id+t.rand,disabled:t.loading.password||t.loading.all,minlength:t.minPasswordLength,maxlength:"469",placeholder:t.t("settings","Add new password"),autocapitalize:"off",autocomplete:"new-password",autocorrect:"off",required:"",spellcheck:"false",type:"password",value:""}}),t._v(" "),e("input",{staticClass:"icon-confirm",attrs:{type:"submit",value:""}})]):e("div"),t._v(" "),e("form",{staticClass:"mailAddress",class:{"icon-loading-small":t.loading.mailAddress},on:{submit:function(n){return n.preventDefault(),t.updateEmail.apply(null,arguments)}}},[e("input",{ref:"mailAddress",attrs:{id:"mailAddress"+t.user.id+t.rand,disabled:t.loading.mailAddress||t.loading.all,placeholder:t.t("settings","Add new email address"),autocapitalize:"off",autocomplete:"new-password",autocorrect:"off",spellcheck:"false",type:"email"},domProps:{value:t.user.email}}),t._v(" "),e("input",{staticClass:"icon-confirm",attrs:{type:"submit",value:""}})]),t._v(" "),e("div",{staticClass:"groups",class:{"icon-loading-small":t.loading.groups}},[e("NcMultiselect",{staticClass:"multiselect-vue",attrs:{"close-on-select":!1,disabled:t.loading.groups||t.loading.all,limit:2,multiple:!0,options:t.availableGroups,placeholder:t.t("settings","Add user to group"),"tag-width":60,taggable:t.settings.isAdmin,value:t.userGroups,label:"name","tag-placeholder":"create","track-by":"id"},on:{remove:t.removeUserGroup,select:t.addUserGroup,tag:t.createGroup}},[e("span",{attrs:{slot:"noResult"},slot:"noResult"},[t._v(t._s(t.t("settings","No results")))])])],1),t._v(" "),t.subAdminsGroups.length>0&&t.settings.isAdmin?e("div",{staticClass:"subadmins",class:{"icon-loading-small":t.loading.subadmins}},[e("NcMultiselect",{staticClass:"multiselect-vue",attrs:{"close-on-select":!1,disabled:t.loading.subadmins||t.loading.all,limit:2,multiple:!0,options:t.subAdminsGroups,placeholder:t.t("settings","Set user as admin for"),"tag-width":60,value:t.userSubAdminsGroups,label:"name","track-by":"id"},on:{remove:t.removeUserSubAdmin,select:t.addUserSubAdmin}},[e("span",{attrs:{slot:"noResult"},slot:"noResult"},[t._v(t._s(t.t("settings","No results")))])])],1):t._e(),t._v(" "),e("div",{directives:[{name:"tooltip",rawName:"v-tooltip.auto",value:t.usedSpace,expression:"usedSpace",modifiers:{auto:!0}}],staticClass:"quota",class:{"icon-loading-small":t.loading.quota}},[e("NcMultiselect",{staticClass:"multiselect-vue",attrs:{"allow-empty":!1,disabled:t.loading.quota||t.loading.all,options:t.quotaOptions,placeholder:t.t("settings","Select user quota"),taggable:!0,value:t.userQuota,label:"label","tag-placeholder":"create","track-by":"id"},on:{input:t.setUserQuota,tag:t.validateQuota}})],1),t._v(" "),t.showConfig.showLanguages?e("div",{staticClass:"languages",class:{"icon-loading-small":t.loading.languages}},[e("NcMultiselect",{staticClass:"multiselect-vue",attrs:{"allow-empty":!1,disabled:t.loading.languages||t.loading.all,options:t.languages,placeholder:t.t("settings","No language set"),value:t.userLanguage,"group-label":"label","group-values":"languages",label:"name","track-by":"code"},on:{input:t.setUserLanguage}})],1):t._e(),t._v(" "),t.showConfig.showStoragePath||t.showConfig.showUserBackend?e("div",{staticClass:"storageLocation"}):t._e(),t._v(" "),t.showConfig.showLastLogin?e("div"):t._e(),t._v(" "),e("div",{staticClass:"userActions"},[t.loading.all?t._e():e("div",{staticClass:"toggleUserActions"},[e("NcActions",[e("NcActionButton",{attrs:{icon:"icon-checkmark"},on:{click:function(n){t.editing=!1}}},[t._v("\n\t\t\t\t\t"+t._s(t.t("settings","Done"))+"\n\t\t\t\t")])],1),t._v(" "),e("div",{directives:[{name:"click-outside",rawName:"v-click-outside",value:t.hideMenu,expression:"hideMenu"}],staticClass:"userPopoverMenuWrapper"},[e("button",{staticClass:"icon-more",on:{click:function(n){return n.preventDefault(),t.toggleMenu.apply(null,arguments)}}}),t._v(" "),e("div",{staticClass:"popovermenu",class:{open:t.openedMenu}},[e("NcPopoverMenu",{attrs:{menu:t.userActions}})],1)])],1),t._v(" "),e("div",{staticClass:"feedback",style:{opacity:""!==t.feedbackMessage?1:0}},[e("div",{staticClass:"icon-checkmark"}),t._v("\n\t\t\t"+t._s(t.feedbackMessage)+"\n\t\t")])])]):e("UserRowSimple",{class:{"row--menu-opened":t.openedMenu},attrs:{editing:t.editing,"feedback-message":t.feedbackMessage,groups:t.groups,languages:t.languages,loading:t.loading,"opened-menu":t.openedMenu,settings:t.settings,"show-config":t.showConfig,"sub-admins-groups":t.subAdminsGroups,"user-actions":t.userActions,user:t.user,"is-dark-theme":t.isDarkTheme},on:{"update:editing":function(n){t.editing=n},"update:openedMenu":function(n){t.openedMenu=n},"update:opened-menu":function(n){t.openedMenu=n}}})}),[],!1,null,"573e6411",null),Nt=kt.exports,Lt={id:"none",label:t("settings","Unlimited")},xt={id:"default",label:t("settings","Default quota")},Gt={id:"",displayName:"",password:"",mailAddress:"",groups:[],subAdminsGroups:[],quota:xt,language:{code:"en",name:t("settings","Default language")}},St={name:"UserList",components:{NcModal:T(),userRow:Nt,NcMultiselect:_(),InfiniteLoading:z(),NcButton:j()},props:{users:{type:Array,default:function(){return[]}},showConfig:{type:Object,required:!0},selectedGroup:{type:String,default:null},externalActions:{type:Array,default:function(){return[]}}},data:function(){return{unlimitedQuota:Lt,defaultQuota:xt,loading:{all:!1,groups:!1},scrolled:!1,searchQuery:"",newUser:Object.assign({},Gt)}},computed:{settings:function(){return this.$store.getters.getServerData},selectedGroupDecoded:function(){return decodeURIComponent(this.selectedGroup)},filteredUsers:function(){return"disabled"===this.selectedGroup?this.users.filter((function(t){return!1===t.enabled})):(this.settings.isAdmin,this.users.filter((function(t){return!1!==t.enabled})))},groups:function(){return this.$store.getters.getGroups.filter((function(t){return"disabled"!==t.id})).sort((function(t,n){return t.name.localeCompare(n.name)}))},canAddGroups:function(){return this.groups.map((function(t){return(t=Object.assign({},t)).$isDisabled=!1===t.canAdd,t}))},subAdminsGroups:function(){return this.$store.getters.getSubadminGroups},quotaOptions:function(){var t=this.settings.quotaPreset.reduce((function(t,n){return t.concat({id:n,label:n})}),[]);return this.settings.allowUnlimitedQuota&&t.unshift(this.unlimitedQuota),t.unshift(this.defaultQuota),t},minPasswordLength:function(){return this.$store.getters.getPasswordPolicyMinLength},usersOffset:function(){return this.$store.getters.getUsersOffset},usersLimit:function(){return this.$store.getters.getUsersLimit},usersCount:function(){return this.users.length},languages:function(){return[{label:t("settings","Common languages"),languages:this.settings.languages.commonLanguages},{label:t("settings","Other languages"),languages:this.settings.languages.otherLanguages}]},isDarkTheme:function(){return"invert(100%)"===window.getComputedStyle(this.$el).getPropertyValue("--background-invert-if-dark")}},watch:{selectedGroup:function(t,n){this.redirectIfDisabled(),this.$store.commit("resetUsers"),this.$refs.infiniteLoading.stateChanger.reset(),this.setNewUserDefaultGroup(t)},usersCount:function(t,n){0===t&&1===n?this.$refs.infiniteLoading.stateChanger.reset():1===t&&0===n&&this.$refs.infiniteLoading.stateChanger.loaded()}},mounted:function(){this.settings.canChangePassword||OC.Notification.showTemporary(t("settings","Password change is disabled because the master key is disabled")),this.resetForm(),(0,R.Ld)("nextcloud:unified-search.search",this.search),(0,R.Ld)("nextcloud:unified-search.reset",this.resetSearch),this.redirectIfDisabled()},beforeDestroy:function(){(0,R.r1)("nextcloud:unified-search.search",this.search),(0,R.r1)("nextcloud:unified-search.reset",this.resetSearch)},methods:{onScroll:function(t){this.scrolled=t.target.scrollTo>0},validateQuota:function(t){var n=OC.Util.computerFileSize(t);return null!==n&&n>=0?(t=OC.Util.humanFileSize(OC.Util.computerFileSize(t)),this.newUser.quota={id:t,label:t},this.newUser.quota):(this.newUser.quota=this.quotaOptions[0],this.quotaOptions[0])},infiniteHandler:function(t){var n=this;this.$store.dispatch("getUsers",{offset:this.usersOffset,limit:this.usersLimit,group:"disabled"!==this.selectedGroup?this.selectedGroup:"",search:this.searchQuery}).then((function(e){e>0&&t.loaded(),e<n.usersLimit&&t.complete()}))},search:function(t){var n=t.query;this.searchQuery=n,this.$store.commit("resetUsers"),this.$refs.infiniteLoading.stateChanger.reset()},resetSearch:function(){this.search({query:""})},resetForm:function(){this.newUser=Object.assign({},Gt),this.settings.defaultLanguage&&U.ZP.set(this.newUser.language,"code",this.settings.defaultLanguage),this.setNewUserDefaultGroup(this.selectedGroup),this.loading.all=!1},createUser:function(){var t=this;this.loading.all=!0,this.$store.dispatch("addUser",{userid:this.newUser.id,password:this.newUser.password,displayName:this.newUser.displayName,email:this.newUser.mailAddress,groups:this.newUser.groups.map((function(t){return t.id})),subadmin:this.newUser.subAdminsGroups.map((function(t){return t.id})),quota:this.newUser.quota.id,language:this.newUser.language.code}).then((function(){t.resetForm(),t.$refs.newusername.focus(),t.closeModal()})).catch((function(n){if(t.loading.all=!1,n.response&&n.response.data&&n.response.data.ocs&&n.response.data.ocs.meta){var e=n.response.data.ocs.meta.statuscode;102===e?t.$refs.newusername.focus():107===e&&t.$refs.newuserpassword.focus()}}))},setNewUserDefaultGroup:function(t){if(t&&t.length>0){var n=this.groups.find((function(n){return n.id===t}));if(n)return void(this.newUser.groups=[n])}this.newUser.groups=[]},createGroup:function(t){var n=this;return this.loading.groups=!0,this.$store.dispatch("addGroup",t).then((function(e){n.newUser.groups.push(n.groups.find((function(n){return n.id===t}))),n.loading.groups=!1})).catch((function(){n.loading.groups=!1})),this.$store.getters.getGroups[this.groups.length]},redirectIfDisabled:function(){var t=this.$store.getters.getGroups;"disabled"===this.selectedGroup&&t.findIndex((function(t){return"disabled"===t.id&&0===t.usercount}))>-1&&(this.$router.push({name:"users"}),this.$refs.infiniteLoading.stateChanger.reset())},closeModal:function(){this.showConfig.showNewUserForm=!1}}},Mt=s(15070),qt={};qt.styleTagTransform=ht(),qt.setAttributes=dt(),qt.insert=ut().bind(null,"head"),qt.domAPI=rt(),qt.insertStyleElement=gt(),it()(Mt.Z,qt),Mt.Z&&Mt.Z.locals&&Mt.Z.locals;var $t=(0,D.Z)(St,(function(){var t=this,n=t.$createElement,e=t._self._c||n;return e("div",{staticClass:"user-list-grid",attrs:{id:"app-content"},on:{"&scroll":function(n){return t.onScroll.apply(null,arguments)}}},[t.showConfig.showNewUserForm?e("NcModal",{attrs:{size:"small"},on:{close:t.closeModal}},[e("form",{staticClass:"modal__content",attrs:{id:"new-user",disabled:t.loading.all},on:{submit:function(n){return n.preventDefault(),t.createUser.apply(null,arguments)}}},[e("h2",[t._v(t._s(t.t("settings","New user")))]),t._v(" "),e("input",{directives:[{name:"model",rawName:"v-model",value:t.newUser.id,expression:"newUser.id"}],ref:"newusername",staticClass:"modal__item",attrs:{id:"newusername",disabled:t.settings.newUserGenerateUserID,placeholder:t.settings.newUserGenerateUserID?t.t("settings","Will be autogenerated"):t.t("settings","Username"),autocapitalize:"none",autocomplete:"off",autocorrect:"off",name:"username",pattern:"[a-zA-Z0-9 _\\.@\\-']+",required:"",type:"text"},domProps:{value:t.newUser.id},on:{input:function(n){n.target.composing||t.$set(t.newUser,"id",n.target.value)}}}),t._v(" "),e("input",{directives:[{name:"model",rawName:"v-model",value:t.newUser.displayName,expression:"newUser.displayName"}],staticClass:"modal__item",attrs:{id:"newdisplayname",placeholder:t.t("settings","Display name"),autocapitalize:"none",autocomplete:"off",autocorrect:"off",name:"displayname",type:"text"},domProps:{value:t.newUser.displayName},on:{input:function(n){n.target.composing||t.$set(t.newUser,"displayName",n.target.value)}}}),t._v(" "),e("input",{directives:[{name:"model",rawName:"v-model",value:t.newUser.password,expression:"newUser.password"}],ref:"newuserpassword",staticClass:"modal__item",attrs:{id:"newuserpassword",minlength:t.minPasswordLength,placeholder:t.t("settings","Password"),required:""===t.newUser.mailAddress,autocapitalize:"none",autocomplete:"new-password",autocorrect:"off",name:"password",type:"password"},domProps:{value:t.newUser.password},on:{input:function(n){n.target.composing||t.$set(t.newUser,"password",n.target.value)}}}),t._v(" "),e("input",{directives:[{name:"model",rawName:"v-model",value:t.newUser.mailAddress,expression:"newUser.mailAddress"}],staticClass:"modal__item",attrs:{id:"newemail",placeholder:t.t("settings","Email"),required:""===t.newUser.password||t.settings.newUserRequireEmail,autocapitalize:"none",autocomplete:"off",autocorrect:"off",name:"email",type:"email"},domProps:{value:t.newUser.mailAddress},on:{input:function(n){n.target.composing||t.$set(t.newUser,"mailAddress",n.target.value)}}}),t._v(" "),e("div",{staticClass:"groups modal__item"},[t.settings.isAdmin?t._e():e("input",{class:{"icon-loading-small":t.loading.groups},attrs:{id:"newgroups",required:!t.settings.isAdmin,tabindex:"-1",type:"text"},domProps:{value:t.newUser.groups}}),t._v(" "),e("NcMultiselect",{staticClass:"multiselect-vue",attrs:{"close-on-select":!1,disabled:t.loading.groups||t.loading.all,multiple:!0,options:t.canAddGroups,placeholder:t.t("settings","Add user to group"),"tag-width":60,taggable:!0,label:"name","tag-placeholder":"create","track-by":"id"},on:{tag:t.createGroup},model:{value:t.newUser.groups,callback:function(n){t.$set(t.newUser,"groups",n)},expression:"newUser.groups"}},[e("span",{attrs:{slot:"noResult"},slot:"noResult"},[t._v(t._s(t.t("settings","No results")))])])],1),t._v(" "),t.subAdminsGroups.length>0&&t.settings.isAdmin?e("div",{staticClass:"subadmins modal__item"},[e("NcMultiselect",{staticClass:"multiselect-vue",attrs:{"close-on-select":!1,multiple:!0,options:t.subAdminsGroups,placeholder:t.t("settings","Set user as admin for"),"tag-width":60,label:"name","track-by":"id"},model:{value:t.newUser.subAdminsGroups,callback:function(n){t.$set(t.newUser,"subAdminsGroups",n)},expression:"newUser.subAdminsGroups"}},[e("span",{attrs:{slot:"noResult"},slot:"noResult"},[t._v(t._s(t.t("settings","No results")))])])],1):t._e(),t._v(" "),e("div",{staticClass:"quota modal__item"},[e("NcMultiselect",{staticClass:"multiselect-vue",attrs:{"allow-empty":!1,options:t.quotaOptions,placeholder:t.t("settings","Select user quota"),taggable:!0,label:"label","track-by":"id"},on:{tag:t.validateQuota},model:{value:t.newUser.quota,callback:function(n){t.$set(t.newUser,"quota",n)},expression:"newUser.quota"}})],1),t._v(" "),t.showConfig.showLanguages?e("div",{staticClass:"languages modal__item"},[e("NcMultiselect",{staticClass:"multiselect-vue",attrs:{"allow-empty":!1,options:t.languages,placeholder:t.t("settings","Default language"),"group-label":"label","group-values":"languages",label:"name","track-by":"code"},model:{value:t.newUser.language,callback:function(n){t.$set(t.newUser,"language",n)},expression:"newUser.language"}})],1):t._e(),t._v(" "),t.showConfig.showStoragePath?e("div",{staticClass:"storageLocation"}):t._e(),t._v(" "),t.showConfig.showUserBackend?e("div",{staticClass:"userBackend"}):t._e(),t._v(" "),t.showConfig.showLastLogin?e("div",{staticClass:"lastLogin"}):t._e(),t._v(" "),e("div",{staticClass:"user-actions"},[e("NcButton",{attrs:{id:"newsubmit",type:"primary","native-type":"submit",value:""}},[t._v("\n\t\t\t\t\t"+t._s(t.t("settings","Add a new user"))+"\n\t\t\t\t")])],1)])]):t._e(),t._v(" "),e("div",{staticClass:"row",class:{sticky:t.scrolled&&!t.showConfig.showNewUserForm},attrs:{id:"grid-header"}},[e("div",{staticClass:"avatar",attrs:{id:"headerAvatar"}}),t._v(" "),e("div",{staticClass:"name",attrs:{id:"headerName"}},[e("div",{staticClass:"subtitle"},[e("strong",[t._v("\n\t\t\t\t\t"+t._s(t.t("settings","Display name"))+"\n\t\t\t\t")])]),t._v("\n\t\t\t"+t._s(t.t("settings","Username"))+"\n\t\t")]),t._v(" "),e("div",{staticClass:"password",attrs:{id:"headerPassword"}},[t._v("\n\t\t\t"+t._s(t.t("settings","Password"))+"\n\t\t")]),t._v(" "),e("div",{staticClass:"mailAddress",attrs:{id:"headerAddress"}},[t._v("\n\t\t\t"+t._s(t.t("settings","Email"))+"\n\t\t")]),t._v(" "),e("div",{staticClass:"groups",attrs:{id:"headerGroups"}},[t._v("\n\t\t\t"+t._s(t.t("settings","Groups"))+"\n\t\t")]),t._v(" "),t.subAdminsGroups.length>0&&t.settings.isAdmin?e("div",{staticClass:"subadmins",attrs:{id:"headerSubAdmins"}},[t._v("\n\t\t\t"+t._s(t.t("settings","Group admin for"))+"\n\t\t")]):t._e(),t._v(" "),e("div",{staticClass:"quota",attrs:{id:"headerQuota"}},[t._v("\n\t\t\t"+t._s(t.t("settings","Quota"))+"\n\t\t")]),t._v(" "),t.showConfig.showLanguages?e("div",{staticClass:"languages",attrs:{id:"headerLanguages"}},[t._v("\n\t\t\t"+t._s(t.t("settings","Language"))+"\n\t\t")]):t._e(),t._v(" "),t.showConfig.showUserBackend||t.showConfig.showStoragePath?e("div",{staticClass:"headerUserBackend userBackend"},[t.showConfig.showUserBackend?e("div",{staticClass:"userBackend"},[t._v("\n\t\t\t\t"+t._s(t.t("settings","User backend"))+"\n\t\t\t")]):t._e(),t._v(" "),t.showConfig.showStoragePath?e("div",{staticClass:"subtitle storageLocation"},[t._v("\n\t\t\t\t"+t._s(t.t("settings","Storage location"))+"\n\t\t\t")]):t._e()]):t._e(),t._v(" "),t.showConfig.showLastLogin?e("div",{staticClass:"headerLastLogin lastLogin"},[t._v("\n\t\t\t"+t._s(t.t("settings","Last login"))+"\n\t\t")]):t._e(),t._v(" "),e("div",{staticClass:"userActions"})]),t._v(" "),t._l(t.filteredUsers,(function(n){return e("user-row",{key:n.id,attrs:{"external-actions":t.externalActions,groups:t.groups,languages:t.languages,"quota-options":t.quotaOptions,settings:t.settings,"show-config":t.showConfig,"sub-admins-groups":t.subAdminsGroups,user:n,"is-dark-theme":t.isDarkTheme}})})),t._v(" "),e("InfiniteLoading",{ref:"infiniteLoading",on:{infinite:t.infiniteHandler}},[e("div",{attrs:{slot:"spinner"},slot:"spinner"},[e("div",{staticClass:"users-icon-loading icon-loading"})]),t._v(" "),e("div",{attrs:{slot:"no-more"},slot:"no-more"},[e("div",{staticClass:"users-list-end"})]),t._v(" "),e("div",{attrs:{slot:"no-results"},slot:"no-results"},[e("div",{attrs:{id:"emptycontent"}},[e("div",{staticClass:"icon-contacts-dark"}),t._v(" "),e("h2",[t._v(t._s(t.t("settings","No users in here")))])])])])],2)}),[],!1,null,"5d4cd810",null),Ot=$t.exports;function Pt(t){return Pt="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},Pt(t)}function Dt(t,n){var e=Object.keys(t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(t);n&&(s=s.filter((function(n){return Object.getOwnPropertyDescriptor(t,n).enumerable}))),e.push.apply(e,s)}return e}function Bt(t){for(var n=1;n<arguments.length;n++){var e=null!=arguments[n]?arguments[n]:{};n%2?Dt(Object(e),!0).forEach((function(n){Rt(t,n,e[n])})):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(e)):Dt(Object(e)).forEach((function(n){Object.defineProperty(t,n,Object.getOwnPropertyDescriptor(e,n))}))}return t}function Rt(t,n,e){return n in t?Object.defineProperty(t,n,{value:e,enumerable:!0,configurable:!0,writable:!0}):t[n]=e,t}function Qt(t,n,e,s,i,a,r){try{var o=t[a](r),u=o.value}catch(t){return void e(t)}o.done?n(u):Promise.resolve(u).then(s,i)}function zt(t){return function(){var n=this,e=arguments;return new Promise((function(s,i){var a=t.apply(n,e);function r(t){Qt(a,s,i,r,o,"next",t)}function o(t){Qt(a,s,i,r,o,"throw",t)}r(void 0)}))}}U.ZP.use(N());var It={name:"Users",components:{NcAppContent:a(),NcAppNavigation:o(),NcAppNavigationCaption:l(),NcAppNavigationCounter:c(),NcAppNavigationItem:p(),NcAppNavigationNew:m(),NcAppNavigationSettings:v(),NcContent:A(),GroupListItem:B,NcMultiselect:_(),UserList:Ot},props:{selectedGroup:{type:String,default:null}},data:function(){return{unlimitedQuota:{id:"none",label:t("settings","Unlimited")},selectedQuota:!1,externalActions:[],loadingAddGroup:!1,loadingSendMail:!1,showConfig:{showStoragePath:!1,showUserBackend:!1,showLastLogin:!1,showNewUserForm:!1,showLanguages:!1}}},computed:{selectedGroupDecoded:function(){return this.selectedGroup?decodeURIComponent(this.selectedGroup):null},users:function(){return this.$store.getters.getUsers},groups:function(){return this.$store.getters.getGroups},usersOffset:function(){return this.$store.getters.getUsersOffset},usersLimit:function(){return this.$store.getters.getUsersLimit},showLanguages:{get:function(){return this.getLocalstorage("showLanguages")},set:function(t){this.setLocalStorage("showLanguages",t)}},showLastLogin:{get:function(){return this.getLocalstorage("showLastLogin")},set:function(t){this.setLocalStorage("showLastLogin",t)}},showUserBackend:{get:function(){return this.getLocalstorage("showUserBackend")},set:function(t){this.setLocalStorage("showUserBackend",t)}},showStoragePath:{get:function(){return this.getLocalstorage("showStoragePath")},set:function(t){this.setLocalStorage("showStoragePath",t)}},userCount:function(){return this.$store.getters.getUserCount},settings:function(){return this.$store.getters.getServerData},quotaOptions:function(){var t=this.settings.quotaPreset.reduce((function(t,n){return t.concat({id:n,label:n})}),[]);return this.settings.allowUnlimitedQuota&&t.unshift(this.unlimitedQuota),t},defaultQuota:{get:function(){return!1!==this.selectedQuota?this.selectedQuota:this.settings.defaultQuota!==this.unlimitedQuota.id&&OC.Util.computerFileSize(this.settings.defaultQuota)>=0?{id:this.settings.defaultQuota,label:this.settings.defaultQuota}:this.unlimitedQuota},set:function(t){this.selectedQuota=t}},sendWelcomeMail:{get:function(){return this.settings.newUserSendEmail},set:function(t){var n=this;return zt(regeneratorRuntime.mark((function e(){return regeneratorRuntime.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,n.loadingSendMail=!0,n.$store.commit("setServerData",Bt(Bt({},n.settings),{},{newUserSendEmail:t})),e.next=5,w.default.post((0,y.generateUrl)("/settings/users/preferences/newUser.sendEmail"),{value:t?"yes":"no"});case 5:e.next=10;break;case 7:e.prev=7,e.t0=e.catch(0),console.error("could not update newUser.sendEmail preference: "+e.t0.message,e.t0);case 10:return e.prev=10,n.loadingSendMail=!1,e.finish(10);case 13:case"end":return e.stop()}}),e,null,[[0,7,10,13]])})))()}},groupList:function(){var t=this;return(Array.isArray(this.groups)?this.groups:[]).filter((function(t){return"disabled"!==t.id&&"admin"!==t.id})).map((function(n){return t.formatGroupMenu(n)}))},adminGroupMenu:function(){return this.formatGroupMenu(this.groups.find((function(t){return"admin"===t.id})))},disabledGroupMenu:function(){return this.formatGroupMenu(this.groups.find((function(t){return"disabled"===t.id})))}},beforeMount:function(){this.$store.commit("initGroups",{groups:this.$store.getters.getServerData.groups,orderBy:this.$store.getters.getServerData.sortGroups,userCount:this.$store.getters.getServerData.userCount}),this.$store.dispatch("getPasswordPolicyMinLength")},created:function(){Object.assign(OCA,{Settings:{UserList:{registerAction:this.registerAction}}})},methods:{showNewUserMenu:function(){this.showConfig.showNewUserForm=!0,this.showConfig.showNewUserForm&&U.ZP.nextTick((function(){window.newusername.focus()}))},getLocalstorage:function(t){var n=this.$localStorage.get(t);return this.showConfig[t]=null!==n?"true"===n:this.showConfig[t],this.showConfig[t]},setLocalStorage:function(t,n){return this.showConfig[t]=n,this.$localStorage.set(t,n),n},setDefaultQuota:function(){var t=this,n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"none";this.$store.dispatch("setAppConfig",{app:"files",key:"default_quota",value:n.id?n.id:n}).then((function(){"object"!==Pt(n)&&(n={id:n,label:n}),t.defaultQuota=n}))},validateQuota:function(t){return null===OC.Util.computerFileSize(t)?this.setDefaultQuota("none"):this.setDefaultQuota(OC.Util.humanFileSize(OC.Util.computerFileSize(t)))},registerAction:function(t,n,e){return this.externalActions.push({icon:t,text:n,action:e}),this.externalActions},createGroup:function(t){var n=this;return zt(regeneratorRuntime.mark((function e(){return regeneratorRuntime.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(""!==t.trim()){e.next=2;break}return e.abrupt("return");case 2:return e.prev=2,n.loadingAddGroup=!0,e.next=6,n.$store.dispatch("addGroup",t.trim());case 6:return n.hideAddGroupForm(),e.next=9,n.$router.push({name:"group",params:{selectedGroup:encodeURIComponent(t.trim())}});case 9:e.next=14;break;case 11:e.prev=11,e.t0=e.catch(2),n.showAddGroupForm();case 14:return e.prev=14,n.loadingAddGroup=!1,e.finish(14);case 17:case"end":return e.stop()}}),e,null,[[2,11,14,17]])})))()},showAddGroupForm:function(){var t=this;this.$refs.addGroup.editingActive=!0,this.$refs.addGroup.onMenuToggle(!1),this.$nextTick((function(){t.$refs.addGroup.$refs.editingInput.focusInput()}))},hideAddGroupForm:function(){this.$refs.addGroup.editingActive=!1,this.$refs.addGroup.editingValue=""},formatGroupMenu:function(t){var n={};return void 0===t?{}:(n.id=t.id,n.title=t.name,n.usercount=t.usercount,t.usercount-t.disabled>0&&(n.count=t.usercount-t.disabled),n)}}},Tt=It,Ft=s(20110),jt={};jt.styleTagTransform=ht(),jt.setAttributes=dt(),jt.insert=ut().bind(null,"head"),jt.domAPI=rt(),jt.insertStyleElement=gt(),it()(Ft.Z,jt),Ft.Z&&Ft.Z.locals&&Ft.Z.locals;var Et=(0,D.Z)(Tt,(function(){var t=this,n=t.$createElement,e=t._self._c||n;return e("NcContent",{attrs:{"app-name":"settings","navigation-class":{"icon-loading":t.loadingAddGroup}}},[e("NcAppNavigation",{scopedSlots:t._u([{key:"list",fn:function(){return[e("NcAppNavigationItem",{ref:"addGroup",attrs:{id:"addgroup","edit-placeholder":t.t("settings","Enter group name"),editable:!0,loading:t.loadingAddGroup,title:t.t("settings","Add group"),icon:"icon-add"},on:{click:t.showAddGroupForm,"update:title":t.createGroup}}),t._v(" "),e("NcAppNavigationItem",{attrs:{id:"everyone",exact:!0,title:t.t("settings","Active users"),to:{name:"users"},icon:"icon-contacts-dark"}},[t.userCount>0?e("NcAppNavigationCounter",{attrs:{slot:"counter"},slot:"counter"},[t._v("\n\t\t\t\t\t"+t._s(t.userCount)+"\n\t\t\t\t")]):t._e()],1),t._v(" "),t.settings.isAdmin?e("NcAppNavigationItem",{attrs:{id:"admin",exact:!0,title:t.t("settings","Admins"),to:{name:"group",params:{selectedGroup:"admin"}},icon:"icon-user-admin"}},[t.adminGroupMenu.count?e("NcAppNavigationCounter",{attrs:{slot:"counter"},slot:"counter"},[t._v("\n\t\t\t\t\t"+t._s(t.adminGroupMenu.count)+"\n\t\t\t\t")]):t._e()],1):t._e(),t._v(" "),t.disabledGroupMenu.usercount>0||-1===t.disabledGroupMenu.usercount?e("NcAppNavigationItem",{attrs:{id:"disabled",exact:!0,title:t.t("settings","Disabled users"),to:{name:"group",params:{selectedGroup:"disabled"}},icon:"icon-disabled-users"}},[t.disabledGroupMenu.usercount>0?e("NcAppNavigationCounter",{attrs:{slot:"counter"},slot:"counter"},[t._v("\n\t\t\t\t\t"+t._s(t.disabledGroupMenu.usercount)+"\n\t\t\t\t")]):t._e()],1):t._e(),t._v(" "),t.groupList.length>0?e("NcAppNavigationCaption",{attrs:{title:t.t("settings","Groups")}}):t._e(),t._v(" "),t._l(t.groupList,(function(t){return e("GroupListItem",{key:t.id,attrs:{id:t.id,title:t.title,count:t.count}})}))]},proxy:!0},{key:"footer",fn:function(){return[e("NcAppNavigationSettings",[e("div",[e("p",[t._v(t._s(t.t("settings","Default quota:")))]),t._v(" "),e("NcMultiselect",{attrs:{value:t.defaultQuota,options:t.quotaOptions,"tag-placeholder":"create",placeholder:t.t("settings","Select default quota"),label:"label","track-by":"id","allow-empty":!1,taggable:!0},on:{tag:t.validateQuota,input:t.setDefaultQuota}})],1),t._v(" "),e("div",[e("input",{directives:[{name:"model",rawName:"v-model",value:t.showLanguages,expression:"showLanguages"}],staticClass:"checkbox",attrs:{id:"showLanguages",type:"checkbox"},domProps:{checked:Array.isArray(t.showLanguages)?t._i(t.showLanguages,null)>-1:t.showLanguages},on:{change:function(n){var e=t.showLanguages,s=n.target,i=!!s.checked;if(Array.isArray(e)){var a=t._i(e,null);s.checked?a<0&&(t.showLanguages=e.concat([null])):a>-1&&(t.showLanguages=e.slice(0,a).concat(e.slice(a+1)))}else t.showLanguages=i}}}),t._v(" "),e("label",{attrs:{for:"showLanguages"}},[t._v(t._s(t.t("settings","Show Languages")))])]),t._v(" "),e("div",[e("input",{directives:[{name:"model",rawName:"v-model",value:t.showLastLogin,expression:"showLastLogin"}],staticClass:"checkbox",attrs:{id:"showLastLogin",type:"checkbox"},domProps:{checked:Array.isArray(t.showLastLogin)?t._i(t.showLastLogin,null)>-1:t.showLastLogin},on:{change:function(n){var e=t.showLastLogin,s=n.target,i=!!s.checked;if(Array.isArray(e)){var a=t._i(e,null);s.checked?a<0&&(t.showLastLogin=e.concat([null])):a>-1&&(t.showLastLogin=e.slice(0,a).concat(e.slice(a+1)))}else t.showLastLogin=i}}}),t._v(" "),e("label",{attrs:{for:"showLastLogin"}},[t._v(t._s(t.t("settings","Show last login")))])]),t._v(" "),e("div",[e("input",{directives:[{name:"model",rawName:"v-model",value:t.showUserBackend,expression:"showUserBackend"}],staticClass:"checkbox",attrs:{id:"showUserBackend",type:"checkbox"},domProps:{checked:Array.isArray(t.showUserBackend)?t._i(t.showUserBackend,null)>-1:t.showUserBackend},on:{change:function(n){var e=t.showUserBackend,s=n.target,i=!!s.checked;if(Array.isArray(e)){var a=t._i(e,null);s.checked?a<0&&(t.showUserBackend=e.concat([null])):a>-1&&(t.showUserBackend=e.slice(0,a).concat(e.slice(a+1)))}else t.showUserBackend=i}}}),t._v(" "),e("label",{attrs:{for:"showUserBackend"}},[t._v(t._s(t.t("settings","Show user backend")))])]),t._v(" "),e("div",[e("input",{directives:[{name:"model",rawName:"v-model",value:t.showStoragePath,expression:"showStoragePath"}],staticClass:"checkbox",attrs:{id:"showStoragePath",type:"checkbox"},domProps:{checked:Array.isArray(t.showStoragePath)?t._i(t.showStoragePath,null)>-1:t.showStoragePath},on:{change:function(n){var e=t.showStoragePath,s=n.target,i=!!s.checked;if(Array.isArray(e)){var a=t._i(e,null);s.checked?a<0&&(t.showStoragePath=e.concat([null])):a>-1&&(t.showStoragePath=e.slice(0,a).concat(e.slice(a+1)))}else t.showStoragePath=i}}}),t._v(" "),e("label",{attrs:{for:"showStoragePath"}},[t._v(t._s(t.t("settings","Show storage path")))])]),t._v(" "),e("div",[e("input",{directives:[{name:"model",rawName:"v-model",value:t.sendWelcomeMail,expression:"sendWelcomeMail"}],staticClass:"checkbox",attrs:{id:"sendWelcomeMail",disabled:t.loadingSendMail,type:"checkbox"},domProps:{checked:Array.isArray(t.sendWelcomeMail)?t._i(t.sendWelcomeMail,null)>-1:t.sendWelcomeMail},on:{change:function(n){var e=t.sendWelcomeMail,s=n.target,i=!!s.checked;if(Array.isArray(e)){var a=t._i(e,null);s.checked?a<0&&(t.sendWelcomeMail=e.concat([null])):a>-1&&(t.sendWelcomeMail=e.slice(0,a).concat(e.slice(a+1)))}else t.sendWelcomeMail=i}}}),t._v(" "),e("label",{attrs:{for:"sendWelcomeMail"}},[t._v(t._s(t.t("settings","Send email to new user")))])])])]},proxy:!0}])},[e("NcAppNavigationNew",{attrs:{"button-id":"new-user-button",text:t.t("settings","New user"),"button-class":"icon-add"},on:{click:t.showNewUserMenu,keyup:[function(n){return!n.type.indexOf("key")&&t._k(n.keyCode,"enter",13,n.key,"Enter")?null:t.showNewUserMenu.apply(null,arguments)},function(n){return!n.type.indexOf("key")&&t._k(n.keyCode,"space",32,n.key,[" ","Spacebar"])?null:t.showNewUserMenu.apply(null,arguments)}]}})],1),t._v(" "),e("NcAppContent",[e("UserList",{attrs:{users:t.users,"show-config":t.showConfig,"selected-group":t.selectedGroupDecoded,"external-actions":t.externalActions}})],1)],1)}),[],!1,null,"7004587b",null),Zt=Et.exports}}]); -//# sourceMappingURL=settings-users-8351.js.map?v=0fb4eae666669f163a13
\ No newline at end of file +"use strict";(self.webpackChunknextcloud=self.webpackChunknextcloud||[]).push([[8351],{10806:function(t,n,e){var s=e(87537),i=e.n(s),a=e(23645),r=e.n(a)()(i());r.push([t.id,".row--menu-opened[data-v-573e6411]{z-index:1 !important}.row[data-v-573e6411] .multiselect__single{z-index:auto !important}","",{version:3,sources:["webpack://./apps/settings/src/components/UserList/UserRow.vue"],names:[],mappings:"AA6qBA,mCACC,oBAAA,CAED,2CACC,uBAAA",sourcesContent:["\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n// Force menu to be above other rows\n.row--menu-opened {\n\tz-index: 1 !important;\n}\n.row::v-deep .multiselect__single {\n\tz-index: auto !important;\n}\n"],sourceRoot:""}]),n.Z=r},6857:function(t,n,e){var s=e(87537),i=e.n(s),a=e(23645),r=e.n(a)()(i());r.push([t.id,".cellText{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.icon-more{background-color:var(--color-main-background);border:0}","",{version:3,sources:["webpack://./apps/settings/src/components/UserList/UserRowSimple.vue"],names:[],mappings:"AAkMC,UACC,eAAA,CACA,sBAAA,CACA,kBAAA,CAED,WACC,6CAAA,CACA,QAAA",sourcesContent:["\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\t.cellText {\n\t\toverflow: hidden;\n\t\ttext-overflow: ellipsis;\n\t\twhite-space: nowrap;\n}\n\t.icon-more {\n\t\tbackground-color: var(--color-main-background);\n\t\tborder: 0;\n\t}\n"],sourceRoot:""}]),n.Z=r},20110:function(t,n,e){var s=e(87537),i=e.n(s),a=e(23645),r=e.n(a)()(i());r.push([t.id,".app-navigation__list #addgroup[data-v-7004587b] .app-navigation-entry__utils{display:none}","",{version:3,sources:["webpack://./apps/settings/src/views/Users.vue"],names:[],mappings:"AAieA,8EACC,YAAA",sourcesContent:["\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n// force hiding the editing action for the add group entry\n.app-navigation__list #addgroup::v-deep .app-navigation-entry__utils {\n\tdisplay: none;\n}\n"],sourceRoot:""}]),n.Z=r},81524:function(t,n,e){var s=e(87537),i=e.n(s),a=e(23645),r=e.n(a)()(i());r.push([t.id,'\n.modal-wrapper[data-v-09961579] {\n\tmargin: 2vh 0;\n\talign-items: flex-start;\n}\n.modal__content[data-v-09961579] {\n\tdisplay: flex;\n\tpadding: 20px;\n\tflex-direction: column;\n\talign-items: center;\n\ttext-align: center;\n}\n.modal__item[data-v-09961579] {\n\tmargin-bottom: 16px;\n\twidth: 100%;\n}\n.modal__item[data-v-09961579]:not(:focus):not(:active) {\n\tborder-color: var(--color-border-dark);\n}\n.modal__item[data-v-09961579] .multiselect {\n\twidth: 100%;\n}\n.user-actions[data-v-09961579] {\n\tmargin-top: 20px;\n}\n.modal__content[data-v-09961579] .multiselect__single {\n\ttext-align: left;\n\tbox-sizing: border-box;\n}\n.modal__content[data-v-09961579] .multiselect__content-wrapper {\n\tbox-sizing: border-box;\n}\n.row[data-v-09961579] .multiselect__single {\n\tz-index: auto !important;\n}\n\n/* fake input for groups validation */\ninput#newgroups[data-v-09961579] {\n\tposition: absolute;\n\topacity: 0;\n\t/* The "hidden" input is behind the Multiselect, so in general it does\n\t * not receives clicks. However, with Firefox, after the validation\n\t * fails, it will receive the first click done on it, so its width needs\n\t * to be set to 0 to prevent that ("pointer-events: none" does not\n\t * prevent it). */\n\twidth: 0;\n}\n',"",{version:3,sources:["webpack://./apps/settings/src/components/UserList.vue"],names:[],mappings:";AAslBA;CACA,aAAA;CACA,uBAAA;AACA;AACA;CACA,aAAA;CACA,aAAA;CACA,sBAAA;CACA,mBAAA;CACA,kBAAA;AACA;AACA;CACA,mBAAA;CACA,WAAA;AACA;AACA;CACA,sCAAA;AACA;AACA;CACA,WAAA;AACA;AACA;CACA,gBAAA;AACA;AACA;CACA,gBAAA;CACA,sBAAA;AACA;AACA;CACA,sBAAA;AACA;AACA;CACA,wBAAA;AACA;;AAEA,qCAAA;AACA;CACA,kBAAA;CACA,UAAA;CACA;;;;kBAIA;CACA,QAAA;AACA",sourcesContent:['\x3c!--\n - @copyright Copyright (c) 2018 John Molakvoæ <skjnldsv@protonmail.com>\n -\n - @author John Molakvoæ <skjnldsv@protonmail.com>\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 --\x3e\n\n<template>\n\t<div id="app-content" class="user-list-grid" @scroll.passive="onScroll">\n\t\t<NcModal v-if="showConfig.showNewUserForm" size="small" @close="closeModal">\n\t\t\t<form id="new-user"\n\t\t\t\t:disabled="loading.all"\n\t\t\t\tclass="modal__content"\n\t\t\t\t@submit.prevent="createUser">\n\t\t\t\t<h2>{{ t(\'settings\',\'New user\') }}</h2>\n\t\t\t\t<input id="newusername"\n\t\t\t\t\tref="newusername"\n\t\t\t\t\tv-model="newUser.id"\n\t\t\t\t\t:disabled="settings.newUserGenerateUserID"\n\t\t\t\t\t:placeholder="settings.newUserGenerateUserID\n\t\t\t\t\t\t? t(\'settings\', \'Will be autogenerated\')\n\t\t\t\t\t\t: t(\'settings\', \'Username\')"\n\t\t\t\t\tautocapitalize="none"\n\t\t\t\t\tautocomplete="off"\n\t\t\t\t\tautocorrect="off"\n\t\t\t\t\tclass="modal__item"\n\t\t\t\t\tname="username"\n\t\t\t\t\tpattern="[a-zA-Z0-9 _\\.@\\-\']+"\n\t\t\t\t\trequired\n\t\t\t\t\ttype="text">\n\t\t\t\t<input id="newdisplayname"\n\t\t\t\t\tv-model="newUser.displayName"\n\t\t\t\t\t:placeholder="t(\'settings\', \'Display name\')"\n\t\t\t\t\tautocapitalize="none"\n\t\t\t\t\tautocomplete="off"\n\t\t\t\t\tautocorrect="off"\n\t\t\t\t\tclass="modal__item"\n\t\t\t\t\tname="displayname"\n\t\t\t\t\ttype="text">\n\t\t\t\t<input id="newuserpassword"\n\t\t\t\t\tref="newuserpassword"\n\t\t\t\t\tv-model="newUser.password"\n\t\t\t\t\t:minlength="minPasswordLength"\n\t\t\t\t\t:maxlength="469"\n\t\t\t\t\t:placeholder="t(\'settings\', \'Password\')"\n\t\t\t\t\t:required="newUser.mailAddress===\'\'"\n\t\t\t\t\tautocapitalize="none"\n\t\t\t\t\tautocomplete="new-password"\n\t\t\t\t\tautocorrect="off"\n\t\t\t\t\tclass="modal__item"\n\t\t\t\t\tname="password"\n\t\t\t\t\ttype="password">\n\t\t\t\t<input id="newemail"\n\t\t\t\t\tv-model="newUser.mailAddress"\n\t\t\t\t\t:placeholder="t(\'settings\', \'Email\')"\n\t\t\t\t\t:required="newUser.password===\'\' || settings.newUserRequireEmail"\n\t\t\t\t\tautocapitalize="none"\n\t\t\t\t\tautocomplete="off"\n\t\t\t\t\tautocorrect="off"\n\t\t\t\t\tclass="modal__item"\n\t\t\t\t\tname="email"\n\t\t\t\t\ttype="email">\n\t\t\t\t<div class="groups modal__item">\n\t\t\t\t\t\x3c!-- hidden input trick for vanilla html5 form validation --\x3e\n\t\t\t\t\t<input v-if="!settings.isAdmin"\n\t\t\t\t\t\tid="newgroups"\n\t\t\t\t\t\t:class="{\'icon-loading-small\': loading.groups}"\n\t\t\t\t\t\t:required="!settings.isAdmin"\n\t\t\t\t\t\t:value="newUser.groups"\n\t\t\t\t\t\ttabindex="-1"\n\t\t\t\t\t\ttype="text">\n\t\t\t\t\t<NcMultiselect v-model="newUser.groups"\n\t\t\t\t\t\t:close-on-select="false"\n\t\t\t\t\t\t:disabled="loading.groups||loading.all"\n\t\t\t\t\t\t:multiple="true"\n\t\t\t\t\t\t:options="canAddGroups"\n\t\t\t\t\t\t:placeholder="t(\'settings\', \'Add user to group\')"\n\t\t\t\t\t\t:tag-width="60"\n\t\t\t\t\t\t:taggable="true"\n\t\t\t\t\t\tclass="multiselect-vue"\n\t\t\t\t\t\tlabel="name"\n\t\t\t\t\t\ttag-placeholder="create"\n\t\t\t\t\t\ttrack-by="id"\n\t\t\t\t\t\t@tag="createGroup">\n\t\t\t\t\t\t\x3c!-- If user is not admin, he is a subadmin.\n\t\t\t\t\t\t\tSubadmins can\'t create users outside their groups\n\t\t\t\t\t\t\tTherefore, empty select is forbidden --\x3e\n\t\t\t\t\t\t<span slot="noResult">{{ t(\'settings\', \'No results\') }}</span>\n\t\t\t\t\t</NcMultiselect>\n\t\t\t\t</div>\n\t\t\t\t<div v-if="subAdminsGroups.length>0 && settings.isAdmin"\n\t\t\t\t\tclass="subadmins modal__item">\n\t\t\t\t\t<NcMultiselect v-model="newUser.subAdminsGroups"\n\t\t\t\t\t\t:close-on-select="false"\n\t\t\t\t\t\t:multiple="true"\n\t\t\t\t\t\t:options="subAdminsGroups"\n\t\t\t\t\t\t:placeholder="t(\'settings\', \'Set user as admin for\')"\n\t\t\t\t\t\t:tag-width="60"\n\t\t\t\t\t\tclass="multiselect-vue"\n\t\t\t\t\t\tlabel="name"\n\t\t\t\t\t\ttrack-by="id">\n\t\t\t\t\t\t<span slot="noResult">{{ t(\'settings\', \'No results\') }}</span>\n\t\t\t\t\t</NcMultiselect>\n\t\t\t\t</div>\n\t\t\t\t<div class="quota modal__item">\n\t\t\t\t\t<NcMultiselect v-model="newUser.quota"\n\t\t\t\t\t\t:allow-empty="false"\n\t\t\t\t\t\t:options="quotaOptions"\n\t\t\t\t\t\t:placeholder="t(\'settings\', \'Select user quota\')"\n\t\t\t\t\t\t:taggable="true"\n\t\t\t\t\t\tclass="multiselect-vue"\n\t\t\t\t\t\tlabel="label"\n\t\t\t\t\t\ttrack-by="id"\n\t\t\t\t\t\t@tag="validateQuota" />\n\t\t\t\t</div>\n\t\t\t\t<div v-if="showConfig.showLanguages" class="languages modal__item">\n\t\t\t\t\t<NcMultiselect v-model="newUser.language"\n\t\t\t\t\t\t:allow-empty="false"\n\t\t\t\t\t\t:options="languages"\n\t\t\t\t\t\t:placeholder="t(\'settings\', \'Default language\')"\n\t\t\t\t\t\tclass="multiselect-vue"\n\t\t\t\t\t\tgroup-label="label"\n\t\t\t\t\t\tgroup-values="languages"\n\t\t\t\t\t\tlabel="name"\n\t\t\t\t\t\ttrack-by="code" />\n\t\t\t\t</div>\n\t\t\t\t<div v-if="showConfig.showStoragePath" class="storageLocation" />\n\t\t\t\t<div v-if="showConfig.showUserBackend" class="userBackend" />\n\t\t\t\t<div v-if="showConfig.showLastLogin" class="lastLogin" />\n\t\t\t\t<div class="user-actions">\n\t\t\t\t\t<NcButton id="newsubmit"\n\t\t\t\t\t\ttype="primary"\n\t\t\t\t\t\tnative-type="submit"\n\t\t\t\t\t\tvalue="">\n\t\t\t\t\t\t{{ t(\'settings\', \'Add a new user\') }}\n\t\t\t\t\t</NcButton>\n\t\t\t\t</div>\n\t\t\t</form>\n\t\t</NcModal>\n\t\t<div id="grid-header"\n\t\t\t:class="{\'sticky\': scrolled && !showConfig.showNewUserForm}"\n\t\t\tclass="row">\n\t\t\t<div id="headerAvatar" class="avatar" />\n\t\t\t<div id="headerName" class="name">\n\t\t\t\t<div class="subtitle">\n\t\t\t\t\t<strong>\n\t\t\t\t\t\t{{ t(\'settings\', \'Display name\') }}\n\t\t\t\t\t</strong>\n\t\t\t\t</div>\n\t\t\t\t{{ t(\'settings\', \'Username\') }}\n\t\t\t</div>\n\t\t\t<div id="headerPassword" class="password">\n\t\t\t\t{{ t(\'settings\', \'Password\') }}\n\t\t\t</div>\n\t\t\t<div id="headerAddress" class="mailAddress">\n\t\t\t\t{{ t(\'settings\', \'Email\') }}\n\t\t\t</div>\n\t\t\t<div id="headerGroups" class="groups">\n\t\t\t\t{{ t(\'settings\', \'Groups\') }}\n\t\t\t</div>\n\t\t\t<div v-if="subAdminsGroups.length>0 && settings.isAdmin"\n\t\t\t\tid="headerSubAdmins"\n\t\t\t\tclass="subadmins">\n\t\t\t\t{{ t(\'settings\', \'Group admin for\') }}\n\t\t\t</div>\n\t\t\t<div id="headerQuota" class="quota">\n\t\t\t\t{{ t(\'settings\', \'Quota\') }}\n\t\t\t</div>\n\t\t\t<div v-if="showConfig.showLanguages"\n\t\t\t\tid="headerLanguages"\n\t\t\t\tclass="languages">\n\t\t\t\t{{ t(\'settings\', \'Language\') }}\n\t\t\t</div>\n\n\t\t\t<div v-if="showConfig.showUserBackend || showConfig.showStoragePath"\n\t\t\t\tclass="headerUserBackend userBackend">\n\t\t\t\t<div v-if="showConfig.showUserBackend" class="userBackend">\n\t\t\t\t\t{{ t(\'settings\', \'User backend\') }}\n\t\t\t\t</div>\n\t\t\t\t<div v-if="showConfig.showStoragePath"\n\t\t\t\t\tclass="subtitle storageLocation">\n\t\t\t\t\t{{ t(\'settings\', \'Storage location\') }}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div v-if="showConfig.showLastLogin"\n\t\t\t\tclass="headerLastLogin lastLogin">\n\t\t\t\t{{ t(\'settings\', \'Last login\') }}\n\t\t\t</div>\n\n\t\t\t<div class="userActions" />\n\t\t</div>\n\n\t\t<user-row v-for="user in filteredUsers"\n\t\t\t:key="user.id"\n\t\t\t:external-actions="externalActions"\n\t\t\t:groups="groups"\n\t\t\t:languages="languages"\n\t\t\t:quota-options="quotaOptions"\n\t\t\t:settings="settings"\n\t\t\t:show-config="showConfig"\n\t\t\t:sub-admins-groups="subAdminsGroups"\n\t\t\t:user="user"\n\t\t\t:is-dark-theme="isDarkTheme" />\n\t\t<InfiniteLoading ref="infiniteLoading" @infinite="infiniteHandler">\n\t\t\t<div slot="spinner">\n\t\t\t\t<div class="users-icon-loading icon-loading" />\n\t\t\t</div>\n\t\t\t<div slot="no-more">\n\t\t\t\t<div class="users-list-end" />\n\t\t\t</div>\n\t\t\t<div slot="no-results">\n\t\t\t\t<div id="emptycontent">\n\t\t\t\t\t<div class="icon-contacts-dark" />\n\t\t\t\t\t<h2>{{ t(\'settings\', \'No users in here\') }}</h2>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</InfiniteLoading>\n\t</div>\n</template>\n\n<script>\nimport { subscribe, unsubscribe } from \'@nextcloud/event-bus\'\nimport InfiniteLoading from \'vue-infinite-loading\'\nimport Vue from \'vue\'\nimport NcModal from \'@nextcloud/vue/dist/Components/NcModal\'\nimport NcButton from \'@nextcloud/vue/dist/Components/NcButton\'\nimport NcMultiselect from \'@nextcloud/vue/dist/Components/NcMultiselect\'\n\nimport userRow from \'./UserList/UserRow\'\n\nconst unlimitedQuota = {\n\tid: \'none\',\n\tlabel: t(\'settings\', \'Unlimited\'),\n}\nconst defaultQuota = {\n\tid: \'default\',\n\tlabel: t(\'settings\', \'Default quota\'),\n}\nconst newUser = {\n\tid: \'\',\n\tdisplayName: \'\',\n\tpassword: \'\',\n\tmailAddress: \'\',\n\tgroups: [],\n\tsubAdminsGroups: [],\n\tquota: defaultQuota,\n\tlanguage: {\n\t\tcode: \'en\',\n\t\tname: t(\'settings\', \'Default language\'),\n\t},\n}\n\nexport default {\n\tname: \'UserList\',\n\tcomponents: {\n\t\tNcModal,\n\t\tuserRow,\n\t\tNcMultiselect,\n\t\tInfiniteLoading,\n\t\tNcButton,\n\t},\n\tprops: {\n\t\tusers: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\t\tshowConfig: {\n\t\t\ttype: Object,\n\t\t\trequired: true,\n\t\t},\n\t\tselectedGroup: {\n\t\t\ttype: String,\n\t\t\tdefault: null,\n\t\t},\n\t\texternalActions: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tunlimitedQuota,\n\t\t\tdefaultQuota,\n\t\t\tloading: {\n\t\t\t\tall: false,\n\t\t\t\tgroups: false,\n\t\t\t},\n\t\t\tscrolled: false,\n\t\t\tsearchQuery: \'\',\n\t\t\tnewUser: Object.assign({}, newUser),\n\t\t}\n\t},\n\tcomputed: {\n\t\tsettings() {\n\t\t\treturn this.$store.getters.getServerData\n\t\t},\n\t\tselectedGroupDecoded() {\n\t\t\treturn decodeURIComponent(this.selectedGroup)\n\t\t},\n\t\tfilteredUsers() {\n\t\t\tif (this.selectedGroup === \'disabled\') {\n\t\t\t\treturn this.users.filter(user => user.enabled === false)\n\t\t\t}\n\t\t\tif (!this.settings.isAdmin) {\n\t\t\t\t// we don\'t want subadmins to edit themselves\n\t\t\t\treturn this.users.filter(user => user.enabled !== false)\n\t\t\t}\n\t\t\treturn this.users.filter(user => user.enabled !== false)\n\t\t},\n\t\tgroups() {\n\t\t\t// data provided php side + remove the disabled group\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\tcanAddGroups() {\n\t\t\t// disabled if no permission to add new users to group\n\t\t\treturn this.groups.map(group => {\n\t\t\t\t// clone object because we don\'t want\n\t\t\t\t// to edit the original groups\n\t\t\t\tgroup = Object.assign({}, group)\n\t\t\t\tgroup.$isDisabled = group.canAdd === false\n\t\t\t\treturn group\n\t\t\t})\n\t\t},\n\t\tsubAdminsGroups() {\n\t\t\t// data provided php side\n\t\t\treturn this.$store.getters.getSubadminGroups\n\t\t},\n\t\tquotaOptions() {\n\t\t\t// convert the preset array into objects\n\t\t\tconst quotaPreset = this.settings.quotaPreset.reduce((acc, cur) => acc.concat({\n\t\t\t\tid: cur,\n\t\t\t\tlabel: cur,\n\t\t\t}), [])\n\t\t\t// add default presets\n\t\t\tif (this.settings.allowUnlimitedQuota) {\n\t\t\t\tquotaPreset.unshift(this.unlimitedQuota)\n\t\t\t}\n\t\t\tquotaPreset.unshift(this.defaultQuota)\n\t\t\treturn quotaPreset\n\t\t},\n\t\tminPasswordLength() {\n\t\t\treturn this.$store.getters.getPasswordPolicyMinLength\n\t\t},\n\t\tusersOffset() {\n\t\t\treturn this.$store.getters.getUsersOffset\n\t\t},\n\t\tusersLimit() {\n\t\t\treturn this.$store.getters.getUsersLimit\n\t\t},\n\t\tusersCount() {\n\t\t\treturn this.users.length\n\t\t},\n\n\t\t/* LANGUAGES */\n\t\tlanguages() {\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\tlabel: t(\'settings\', \'Common languages\'),\n\t\t\t\t\tlanguages: this.settings.languages.commonLanguages,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tlabel: t(\'settings\', \'Other languages\'),\n\t\t\t\t\tlanguages: this.settings.languages.otherLanguages,\n\t\t\t\t},\n\t\t\t]\n\t\t},\n\t\tisDarkTheme() {\n\t\t\treturn window.getComputedStyle(this.$el)\n\t\t\t\t.getPropertyValue(\'--background-invert-if-dark\') === \'invert(100%)\'\n\t\t},\n\t},\n\twatch: {\n\t\t// watch url change and group select\n\t\tselectedGroup(val, old) {\n\t\t\t// if selected is the disabled group but it\'s empty\n\t\t\tthis.redirectIfDisabled()\n\t\t\tthis.$store.commit(\'resetUsers\')\n\t\t\tthis.$refs.infiniteLoading.stateChanger.reset()\n\t\t\tthis.setNewUserDefaultGroup(val)\n\t\t},\n\n\t\t// make sure the infiniteLoading state is changed if we manually\n\t\t// add/remove data from the store\n\t\tusersCount(val, old) {\n\t\t\t// deleting the last user, reset the list\n\t\t\tif (val === 0 && old === 1) {\n\t\t\t\tthis.$refs.infiniteLoading.stateChanger.reset()\n\t\t\t\t// adding the first user, warn the infiniteLoader that\n\t\t\t\t// the list is not empty anymore (we don\'t fetch the newly\n\t\t\t\t// added user as we already have all the info we need)\n\t\t\t} else if (val === 1 && old === 0) {\n\t\t\t\tthis.$refs.infiniteLoading.stateChanger.loaded()\n\t\t\t}\n\t\t},\n\t},\n\n\tmounted() {\n\t\tif (!this.settings.canChangePassword) {\n\t\t\tOC.Notification.showTemporary(t(\'settings\', \'Password change is disabled because the master key is disabled\'))\n\t\t}\n\n\t\t/**\n\t\t * Reset and init new user form\n\t\t */\n\t\tthis.resetForm()\n\n\t\t/**\n\t\t * Register search\n\t\t */\n\t\tsubscribe(\'nextcloud:unified-search.search\', this.search)\n\t\tsubscribe(\'nextcloud:unified-search.reset\', this.resetSearch)\n\n\t\t/**\n\t\t * If disabled group but empty, redirect\n\t\t */\n\t\tthis.redirectIfDisabled()\n\t},\n\tbeforeDestroy() {\n\t\tunsubscribe(\'nextcloud:unified-search.search\', this.search)\n\t\tunsubscribe(\'nextcloud:unified-search.reset\', this.resetSearch)\n\t},\n\n\tmethods: {\n\t\tonScroll(event) {\n\t\t\tthis.scrolled = event.target.scrollTo > 0\n\t\t},\n\n\t\t/**\n\t\t * Validate quota string to make sure it\'s a valid human file size\n\t\t *\n\t\t * @param {string} quota Quota in readable format \'5 GB\'\n\t\t * @return {object}\n\t\t */\n\t\tvalidateQuota(quota) {\n\t\t\t// only used for new presets sent through @Tag\n\t\t\tconst validQuota = OC.Util.computerFileSize(quota)\n\t\t\tif (validQuota !== null && validQuota >= 0) {\n\t\t\t\t// unify format output\n\t\t\t\tquota = OC.Util.humanFileSize(OC.Util.computerFileSize(quota))\n\t\t\t\tthis.newUser.quota = { id: quota, label: quota }\n\t\t\t\treturn this.newUser.quota\n\t\t\t}\n\t\t\t// Default is unlimited\n\t\t\tthis.newUser.quota = this.quotaOptions[0]\n\t\t\treturn this.quotaOptions[0]\n\t\t},\n\n\t\tinfiniteHandler($state) {\n\t\t\tthis.$store.dispatch(\'getUsers\', {\n\t\t\t\toffset: this.usersOffset,\n\t\t\t\tlimit: this.usersLimit,\n\t\t\t\tgroup: this.selectedGroup !== \'disabled\' ? this.selectedGroup : \'\',\n\t\t\t\tsearch: this.searchQuery,\n\t\t\t})\n\t\t\t\t.then((usersCount) => {\n\t\t\t\t\tif (usersCount > 0) {\n\t\t\t\t\t\t$state.loaded()\n\t\t\t\t\t}\n\t\t\t\t\tif (usersCount < this.usersLimit) {\n\t\t\t\t\t\t$state.complete()\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t},\n\n\t\t/* SEARCH */\n\t\tsearch({ query }) {\n\t\t\tthis.searchQuery = query\n\t\t\tthis.$store.commit(\'resetUsers\')\n\t\t\tthis.$refs.infiniteLoading.stateChanger.reset()\n\t\t},\n\t\tresetSearch() {\n\t\t\tthis.search({ query: \'\' })\n\t\t},\n\n\t\tresetForm() {\n\t\t\t// revert form to original state\n\t\t\tthis.newUser = Object.assign({}, newUser)\n\n\t\t\t/**\n\t\t\t * Init default language from server data. The use of this.settings\n\t\t\t * requires a computed variable, which break the v-model binding of the form,\n\t\t\t * this is a much easier solution than getter and setter on a computed var\n\t\t\t */\n\t\t\tif (this.settings.defaultLanguage) {\n\t\t\t\tVue.set(this.newUser.language, \'code\', this.settings.defaultLanguage)\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * In case the user directly loaded the user list within a group\n\t\t\t * the watch won\'t be triggered. We need to initialize it.\n\t\t\t */\n\t\t\tthis.setNewUserDefaultGroup(this.selectedGroup)\n\n\t\t\tthis.loading.all = false\n\t\t},\n\t\tcreateUser() {\n\t\t\tthis.loading.all = true\n\t\t\tthis.$store.dispatch(\'addUser\', {\n\t\t\t\tuserid: this.newUser.id,\n\t\t\t\tpassword: this.newUser.password,\n\t\t\t\tdisplayName: this.newUser.displayName,\n\t\t\t\temail: this.newUser.mailAddress,\n\t\t\t\tgroups: this.newUser.groups.map(group => group.id),\n\t\t\t\tsubadmin: this.newUser.subAdminsGroups.map(group => group.id),\n\t\t\t\tquota: this.newUser.quota.id,\n\t\t\t\tlanguage: this.newUser.language.code,\n\t\t\t})\n\t\t\t\t.then(() => {\n\t\t\t\t\tthis.resetForm()\n\t\t\t\t\tthis.$refs.newusername.focus()\n\t\t\t\t\tthis.closeModal()\n\t\t\t\t})\n\t\t\t\t.catch((error) => {\n\t\t\t\t\tthis.loading.all = false\n\t\t\t\t\tif (error.response && error.response.data && error.response.data.ocs && error.response.data.ocs.meta) {\n\t\t\t\t\t\tconst statuscode = error.response.data.ocs.meta.statuscode\n\t\t\t\t\t\tif (statuscode === 102) {\n\t\t\t\t\t\t\t// wrong username\n\t\t\t\t\t\t\tthis.$refs.newusername.focus()\n\t\t\t\t\t\t} else if (statuscode === 107) {\n\t\t\t\t\t\t\t// wrong password\n\t\t\t\t\t\t\tthis.$refs.newuserpassword.focus()\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t},\n\t\tsetNewUserDefaultGroup(value) {\n\t\t\tif (value && value.length > 0) {\n\t\t\t\t// setting new user default group to the current selected one\n\t\t\t\tconst currentGroup = this.groups.find(group => group.id === value)\n\t\t\t\tif (currentGroup) {\n\t\t\t\t\tthis.newUser.groups = [currentGroup]\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t}\n\t\t\t// fallback, empty selected group\n\t\t\tthis.newUser.groups = []\n\t\t},\n\n\t\t/**\n\t\t * Create a new group\n\t\t *\n\t\t * @param {string} gid Group id\n\t\t * @return {Promise}\n\t\t */\n\t\tcreateGroup(gid) {\n\t\t\tthis.loading.groups = true\n\t\t\tthis.$store.dispatch(\'addGroup\', gid)\n\t\t\t\t.then((group) => {\n\t\t\t\t\tthis.newUser.groups.push(this.groups.find(group => group.id === gid))\n\t\t\t\t\tthis.loading.groups = false\n\t\t\t\t})\n\t\t\t\t.catch(() => {\n\t\t\t\t\tthis.loading.groups = false\n\t\t\t\t})\n\t\t\treturn this.$store.getters.getGroups[this.groups.length]\n\t\t},\n\n\t\t/**\n\t\t * If the selected group is the disabled group but the count is 0\n\t\t * redirect to the all users page.\n\t\t * we only check for 0 because we don\'t have the count on ldap\n\t\t * and we therefore set the usercount to -1 in this specific case\n\t\t */\n\t\tredirectIfDisabled() {\n\t\t\tconst allGroups = this.$store.getters.getGroups\n\t\t\tif (this.selectedGroup === \'disabled\'\n\t\t\t\t\t\t&& allGroups.findIndex(group => group.id === \'disabled\' && group.usercount === 0) > -1) {\n\t\t\t\t// disabled group is empty, redirection to all users\n\t\t\t\tthis.$router.push({ name: \'users\' })\n\t\t\t\tthis.$refs.infiniteLoading.stateChanger.reset()\n\t\t\t}\n\t\t},\n\t\tcloseModal() {\n\t\t\t// eslint-disable-next-line vue/no-mutating-props\n\t\t\tthis.showConfig.showNewUserForm = false\n\t\t},\n\t},\n}\n<\/script>\n<style scoped>\n\t.modal-wrapper {\n\t\tmargin: 2vh 0;\n\t\talign-items: flex-start;\n\t}\n\t.modal__content {\n\t\tdisplay: flex;\n\t\tpadding: 20px;\n\t\tflex-direction: column;\n\t\talign-items: center;\n\t\ttext-align: center;\n\t}\n\t.modal__item {\n\t\tmargin-bottom: 16px;\n\t\twidth: 100%;\n\t}\n\t.modal__item:not(:focus):not(:active) {\n\t\tborder-color: var(--color-border-dark);\n\t}\n\t.modal__item::v-deep .multiselect {\n\t\twidth: 100%;\n\t}\n\t.user-actions {\n\t\tmargin-top: 20px;\n\t}\n\t.modal__content::v-deep .multiselect__single {\n\t\ttext-align: left;\n\t\tbox-sizing: border-box;\n\t}\n\t.modal__content::v-deep .multiselect__content-wrapper {\n\t\tbox-sizing: border-box;\n\t}\n\t.row::v-deep .multiselect__single {\n\t\tz-index: auto !important;\n\t}\n\n\t/* fake input for groups validation */\n\tinput#newgroups {\n\t\tposition: absolute;\n\t\topacity: 0;\n\t\t/* The "hidden" input is behind the Multiselect, so in general it does\n\t\t * not receives clicks. However, with Firefox, after the validation\n\t\t * fails, it will receive the first click done on it, so its width needs\n\t\t * to be set to 0 to prevent that ("pointer-events: none" does not\n\t\t * prevent it). */\n\t\twidth: 0;\n\t}\n</style>\n'],sourceRoot:""}]),n.Z=r},2709:function(n,e,s){s.r(e),s.d(e,{default:function(){return Zt}});var i=s(69680),a=s.n(i),r=s(55209),o=s.n(r),u=s(88696),l=s.n(u),d=s(53110),c=s.n(d),g=s(14032),p=s.n(g),h=s(73190),m=s.n(h),f=s(93041),v=s.n(f),w=s(4820),b=s(27472),A=s.n(b),y=s(79753),C=s(98266),_=s.n(C),U=s(20144),k=s(87369),N=s.n(k),L=s(79570),x=s.n(L),G=s(45400),S=s.n(G),M=s(97039),q=s.n(M);function $(t,n,e,s,i,a,r){try{var o=t[a](r),u=o.value}catch(t){return void e(t)}o.done?n(u):Promise.resolve(u).then(s,i)}var O={name:"GroupListItem",components:{NcActionInput:x(),NcActionButton:S(),NcCounterBubble:q(),NcAppNavigationItem:p()},props:{id:{type:String,required:!0},title:{type:String,required:!0},count:{type:Number,required:!1}},data:function(){return{loadingRenameGroup:!1,openGroupMenu:!1}},computed:{settings:function(){return this.$store.getters.getServerData}},methods:{handleGroupMenuOpen:function(){this.openGroupMenu=!0},renameGroup:function(t){var n,e=this;return(n=regeneratorRuntime.mark((function n(){var s;return regeneratorRuntime.wrap((function(n){for(;;)switch(n.prev=n.next){case 0:if(""!==t.trim()){n.next=2;break}return n.abrupt("return");case 2:if(""!==(s=e.$refs.displayNameInput.$el.querySelector('input[type="text"]').value).trim()){n.next=5;break}return n.abrupt("return");case 5:return n.prev=5,e.openGroupMenu=!1,e.loadingRenameGroup=!0,n.next=10,e.$store.dispatch("renameGroup",{groupid:t.trim(),displayName:s.trim()});case 10:e.loadingRenameGroup=!1,n.next=17;break;case 13:n.prev=13,n.t0=n.catch(5),e.openGroupMenu=!0,e.loadingRenameGroup=!1;case 17:case"end":return n.stop()}}),n,null,[[5,13]])})),function(){var t=this,e=arguments;return new Promise((function(s,i){var a=n.apply(t,e);function r(t){$(a,s,i,r,o,"next",t)}function o(t){$(a,s,i,r,o,"throw",t)}r(void 0)}))})()},removeGroup:function(n){var e=this;OC.dialogs.confirm(t("settings","You are about to remove the group {group}. The users will NOT be deleted.",{group:n}),t("settings","Please confirm the group removal "),(function(t){t&&e.$store.dispatch("removeGroup",n)}))}}},P=O,D=s(51900),B=(0,D.Z)(P,(function(){var t=this,n=t.$createElement,e=t._self._c||n;return e("NcAppNavigationItem",{key:t.id,attrs:{exact:!0,title:t.title,to:{name:"group",params:{selectedGroup:encodeURIComponent(t.id)}},icon:"icon-group",loading:t.loadingRenameGroup,"menu-open":t.openGroupMenu},on:{"update:menuOpen":t.handleGroupMenuOpen},scopedSlots:t._u([{key:"counter",fn:function(){return[t.count?e("NcCounterBubble",[t._v("\n\t\t\t"+t._s(t.count)+"\n\t\t")]):t._e()]},proxy:!0},{key:"actions",fn:function(){return["admin"!==t.id&&"disabled"!==t.id&&t.settings.isAdmin?e("NcActionInput",{ref:"displayNameInput",attrs:{icon:"icon-edit",type:"text",value:t.title},on:{submit:function(n){return t.renameGroup(t.id)}}},[t._v("\n\t\t\t"+t._s(t.t("settings","Rename group"))+"\n\t\t")]):t._e(),t._v(" "),"admin"!==t.id&&"disabled"!==t.id&&t.settings.isAdmin?e("NcActionButton",{attrs:{icon:"icon-delete"},on:{click:function(n){return t.removeGroup(t.id)}}},[t._v("\n\t\t\t"+t._s(t.t("settings","Remove group"))+"\n\t\t")]):t._e()]},proxy:!0}])})}),[],!1,null,null,null).exports,R=s(74854),Q=s(30306),z=s.n(Q),I=s(70110),T=s.n(I),F=s(10861),j=s.n(F),E=s(2649),Z=s.n(E),W=s(34741),H=s(33476),Y=s(32996),V=s.n(Y),J=s(12945),K=s.n(J),X=s(22200);function tt(t){return tt="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},tt(t)}var nt={props:{user:{type:Object,required:!0},settings:{type:Object,default:function(){return{}}},groups:{type:Array,default:function(){return[]}},subAdminsGroups:{type:Array,default:function(){return[]}},quotaOptions:{type:Array,default:function(){return[]}},showConfig:{type:Object,default:function(){return{}}},languages:{type:Array,required:!0},externalActions:{type:Array,default:function(){return[]}}},computed:{userGroups:function(){var t=this;return this.groups.filter((function(n){return t.user.groups.includes(n.id)}))},userSubAdminsGroups:function(){var t=this;return this.subAdminsGroups.filter((function(n){return t.user.subadmin.includes(n.id)}))},availableGroups:function(){var t=this;return this.groups.map((function(n){var e=Object.assign({},n);return e.$isDisabled=!1===n.canAdd&&!t.user.groups.includes(n.id)||!1===n.canRemove&&t.user.groups.includes(n.id),e}))},usedSpace:function(){return this.user.quota.used?t("settings","{size} used",{size:OC.Util.humanFileSize(this.user.quota.used)}):t("settings","{size} used",{size:OC.Util.humanFileSize(0)})},usedQuota:function(){var t=this.user.quota.quota;return t=t>0?Math.min(100,Math.round(this.user.quota.used/t*100)):95*(1-1/(this.user.quota.used/(10*Math.pow(2,30))+1)),isNaN(t)?0:t},userQuota:function(){if(this.user.quota.quota>=0){var t=OC.Util.humanFileSize(this.user.quota.quota);return this.quotaOptions.find((function(n){return n.id===t}))||{id:t,label:t}}return"default"===this.user.quota.quota?this.quotaOptions[0]:this.quotaOptions[1]},minPasswordLength:function(){return this.$store.getters.getPasswordPolicyMinLength},userLanguage:function(){var t=this,n=this.languages[0].languages.concat(this.languages[1].languages).find((function(n){return n.code===t.user.language}));return"object"!==tt(n)&&""!==this.user.language?{code:this.user.language,name:this.user.language}:""!==this.user.language&&n},userLastLoginTooltip:function(){return this.user.lastLogin>0?OC.Util.formatDate(this.user.lastLogin):""},userLastLogin:function(){return this.user.lastLogin>0?OC.Util.relativeModifiedDate(this.user.lastLogin):t("settings","Never")}},methods:{generateAvatar:function(t,n){return n?(0,y.generateUrl)("/avatar/{user}/64/dark?v={version}",{user:t,version:oc_userconfig.avatar.version}):(0,y.generateUrl)("/avatar/{user}/64?v={version}",{user:t,version:oc_userconfig.avatar.version})}}},et={name:"UserRowSimple",components:{NcPopoverMenu:V(),NcActionButton:S(),NcActions:K()},directives:{ClickOutside:Z()},mixins:[nt],props:{user:{type:Object,required:!0},loading:{type:Object,required:!0},showConfig:{type:Object,required:!0},userActions:{type:Array,required:!0},openedMenu:{type:Boolean,required:!0},feedbackMessage:{type:String,required:!0},subAdminsGroups:{type:Array,required:!0},settings:{type:Object,required:!0},isDarkTheme:{type:Boolean,required:!0}},computed:{userGroupsLabels:function(){return this.userGroups.map((function(t){return t.name})).join(", ")},userSubAdminsGroupsLabels:function(){return this.userSubAdminsGroups.map((function(t){return t.name})).join(", ")},usedSpace:function(){return this.user.quota.used?t("settings","{size} used",{size:OC.Util.humanFileSize(this.user.quota.used)}):t("settings","{size} used",{size:OC.Util.humanFileSize(0)})},canEdit:function(){return(0,X.getCurrentUser)().uid!==this.user.id||this.settings.isAdmin},userQuota:function(){var n=this.user.quota.quota;return"default"===n&&"none"!==(n=this.settings.defaultQuota)&&(n=OC.Util.computerFileSize(n)),"none"===n||-3===n?t("settings","Unlimited"):n>=0?OC.Util.humanFileSize(n):OC.Util.humanFileSize(0)}},methods:{toggleMenu:function(){this.$emit("update:openedMenu",!this.openedMenu)},hideMenu:function(){this.$emit("update:openedMenu",!1)},toggleEdit:function(){this.$emit("update:editing",!0)}}},st=s(93379),it=s.n(st),at=s(7795),rt=s.n(at),ot=s(90569),ut=s.n(ot),lt=s(3565),dt=s.n(lt),ct=s(19216),gt=s.n(ct),pt=s(44589),ht=s.n(pt),mt=s(6857),ft={};ft.styleTagTransform=ht(),ft.setAttributes=dt(),ft.insert=ut().bind(null,"head"),ft.domAPI=rt(),ft.insertStyleElement=gt(),it()(mt.Z,ft),mt.Z&&mt.Z.locals&&mt.Z.locals;var vt=(0,D.Z)(et,(function(){var t=this,n=t.$createElement,e=t._self._c||n;return e("div",{staticClass:"row",class:{disabled:t.loading.delete||t.loading.disable},attrs:{"data-id":t.user.id}},[e("div",{staticClass:"avatar",class:{"icon-loading-small":t.loading.delete||t.loading.disable||t.loading.wipe}},[t.loading.delete||t.loading.disable||t.loading.wipe?t._e():e("img",{attrs:{alt:"",width:"32",height:"32",src:t.generateAvatar(t.user.id,t.isDarkTheme)}})]),t._v(" "),e("div",{staticClass:"name"},[e("div",{staticClass:"displayName subtitle"},[e("div",{directives:[{name:"tooltip",rawName:"v-tooltip",value:t.user.displayname.length>20?t.user.displayname:"",expression:"user.displayname.length > 20 ? user.displayname : ''"}],staticClass:"cellText"},[e("strong",[t._v("\n\t\t\t\t\t"+t._s(t.user.displayname)+"\n\t\t\t\t")])])]),t._v("\n\t\t"+t._s(t.user.id)+"\n\t")]),t._v(" "),e("div"),t._v(" "),e("div",{staticClass:"mailAddress"},[e("div",{directives:[{name:"tooltip",rawName:"v-tooltip",value:null!==t.user.email&&t.user.email.length>20?t.user.email:"",expression:"user.email !== null && user.email.length > 20 ? user.email : ''"}],staticClass:"cellText"},[t._v("\n\t\t\t"+t._s(t.user.email)+"\n\t\t")])]),t._v(" "),e("div",{staticClass:"groups"},[t._v("\n\t\t"+t._s(t.userGroupsLabels)+"\n\t")]),t._v(" "),t.subAdminsGroups.length>0&&t.settings.isAdmin?e("div",{staticClass:"subAdminsGroups"},[t._v("\n\t\t"+t._s(t.userSubAdminsGroupsLabels)+"\n\t")]):t._e(),t._v(" "),e("div",{staticClass:"userQuota"},[e("div",{staticClass:"quota"},[t._v("\n\t\t\t"+t._s(t.userQuota)+" ("+t._s(t.usedSpace)+")\n\t\t\t"),e("progress",{staticClass:"quota-user-progress",class:{warn:t.usedQuota>80},attrs:{max:"100"},domProps:{value:t.usedQuota}})])]),t._v(" "),t.showConfig.showLanguages?e("div",{staticClass:"languages"},[t._v("\n\t\t"+t._s(t.userLanguage.name)+"\n\t")]):t._e(),t._v(" "),t.showConfig.showUserBackend||t.showConfig.showStoragePath?e("div",{staticClass:"userBackend"},[t.showConfig.showUserBackend?e("div",{staticClass:"userBackend"},[t._v("\n\t\t\t"+t._s(t.user.backend)+"\n\t\t")]):t._e(),t._v(" "),t.showConfig.showStoragePath?e("div",{directives:[{name:"tooltip",rawName:"v-tooltip",value:t.user.storageLocation,expression:"user.storageLocation"}],staticClass:"storageLocation subtitle"},[t._v("\n\t\t\t"+t._s(t.user.storageLocation)+"\n\t\t")]):t._e()]):t._e(),t._v(" "),t.showConfig.showLastLogin?e("div",{directives:[{name:"tooltip",rawName:"v-tooltip.auto",value:t.userLastLoginTooltip,expression:"userLastLoginTooltip",modifiers:{auto:!0}}],staticClass:"lastLogin"},[t._v("\n\t\t"+t._s(t.userLastLogin)+"\n\t")]):t._e(),t._v(" "),e("div",{staticClass:"userActions"},[t.canEdit&&!t.loading.all?e("div",{staticClass:"toggleUserActions"},[e("NcActions",[e("NcActionButton",{attrs:{icon:"icon-rename"},on:{click:t.toggleEdit}},[t._v("\n\t\t\t\t\t"+t._s(t.t("settings","Edit User"))+"\n\t\t\t\t")])],1),t._v(" "),e("div",{staticClass:"userPopoverMenuWrapper"},[e("button",{directives:[{name:"click-outside",rawName:"v-click-outside",value:t.hideMenu,expression:"hideMenu"}],staticClass:"icon-more",attrs:{"aria-label":t.t("settings","Toggle user actions menu")},on:{click:function(n){return n.preventDefault(),t.toggleMenu.apply(null,arguments)}}}),t._v(" "),e("div",{staticClass:"popovermenu",class:{open:t.openedMenu},attrs:{"aria-expanded":t.openedMenu}},[e("NcPopoverMenu",{attrs:{menu:t.userActions}})],1)])],1):t._e(),t._v(" "),e("div",{staticClass:"feedback",style:{opacity:""!==t.feedbackMessage?1:0}},[e("div",{staticClass:"icon-checkmark"}),t._v("\n\t\t\t"+t._s(t.feedbackMessage)+"\n\t\t")])])])}),[],!1,null,null,null),wt=vt.exports;function bt(t,n,e,s,i,a,r){try{var o=t[a](r),u=o.value}catch(t){return void e(t)}o.done?n(u):Promise.resolve(u).then(s,i)}function At(t){return function(){var n=this,e=arguments;return new Promise((function(s,i){var a=t.apply(n,e);function r(t){bt(a,s,i,r,o,"next",t)}function o(t){bt(a,s,i,r,o,"throw",t)}r(void 0)}))}}U.ZP.use(W.default);var yt={name:"UserRow",components:{UserRowSimple:wt,NcPopoverMenu:H.NcPopoverMenu,NcActions:H.NcActions,NcActionButton:H.NcActionButton,NcMultiselect:H.NcMultiselect},directives:{ClickOutside:Z()},mixins:[nt],props:{user:{type:Object,required:!0},settings:{type:Object,default:function(){return{}}},groups:{type:Array,default:function(){return[]}},subAdminsGroups:{type:Array,default:function(){return[]}},quotaOptions:{type:Array,default:function(){return[]}},showConfig:{type:Object,default:function(){return{}}},languages:{type:Array,required:!0},externalActions:{type:Array,default:function(){return[]}},isDarkTheme:{type:Boolean,required:!0}},data:function(){return{rand:parseInt(1e3*Math.random()),openedMenu:!1,feedbackMessage:"",editing:!1,loading:{all:!1,displayName:!1,password:!1,mailAddress:!1,groups:!1,subadmins:!1,quota:!1,delete:!1,disable:!1,languages:!1,wipe:!1}}},computed:{userActions:function(){var n=[{icon:"icon-delete",text:t("settings","Delete user"),action:this.deleteUser},{icon:"icon-delete",text:t("settings","Wipe all devices"),action:this.wipeUserDevices},{icon:this.user.enabled?"icon-close":"icon-add",text:this.user.enabled?t("settings","Disable user"):t("settings","Enable user"),action:this.enableDisableUser}];return null!==this.user.email&&""!==this.user.email&&n.push({icon:"icon-mail",text:t("settings","Resend welcome email"),action:this.sendWelcomeMail}),n.concat(this.externalActions)}},methods:{toggleMenu:function(){this.openedMenu=!this.openedMenu},hideMenu:function(){this.openedMenu=!1},wipeUserDevices:function(){var n=this,e=this.user.id;OC.dialogs.confirmDestructive(t("settings","In case of lost device or exiting the organization, this can remotely wipe the Nextcloud data from all devices associated with {userid}. Only works if the devices are connected to the internet.",{userid:e}),t("settings","Remote wipe of devices"),{type:OC.dialogs.YES_NO_BUTTONS,confirm:t("settings","Wipe {userid}'s devices",{userid:e}),confirmClasses:"error",cancel:t("settings","Cancel")},(function(t){t&&(n.loading.wipe=!0,n.loading.all=!0,n.$store.dispatch("wipeUserDevices",e).then((function(){n.loading.wipe=!1,n.loading.all=!1})))}),!0)},deleteUser:function(){var n=this,e=this.user.id;OC.dialogs.confirmDestructive(t("settings","Fully delete {userid}'s account including all their personal files, app data, etc.",{userid:e}),t("settings","Account deletion"),{type:OC.dialogs.YES_NO_BUTTONS,confirm:t("settings","Delete {userid}'s account",{userid:e}),confirmClasses:"error",cancel:t("settings","Cancel")},(function(t){if(t)return n.loading.delete=!0,n.loading.all=!0,n.$store.dispatch("deleteUser",e).then((function(){n.loading.delete=!1,n.loading.all=!1}))}),!0)},enableDisableUser:function(){var t=this;this.loading.delete=!0,this.loading.all=!0;var n=this.user.id,e=!this.user.enabled;return this.$store.dispatch("enableDisableUser",{userid:n,enabled:e}).then((function(){t.loading.delete=!1,t.loading.all=!1}))},updateDisplayName:function(){var t=this,n=this.$refs.displayName.value;this.loading.displayName=!0,this.$store.dispatch("setUserData",{userid:this.user.id,key:"displayname",value:n}).then((function(){t.loading.displayName=!1,t.$refs.displayName.value=n}))},updatePassword:function(){var t=this,n=this.$refs.password.value;this.loading.password=!0,this.$store.dispatch("setUserData",{userid:this.user.id,key:"password",value:n}).then((function(){t.loading.password=!1,t.$refs.password.value=""}))},updateEmail:function(){var t=this,n=this.$refs.mailAddress.value;this.loading.mailAddress=!0,this.$store.dispatch("setUserData",{userid:this.user.id,key:"email",value:n}).then((function(){t.loading.mailAddress=!1,t.$refs.mailAddress.value=n}))},createGroup:function(t){var n=this;return At(regeneratorRuntime.mark((function e(){var s;return regeneratorRuntime.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n.loading={groups:!0,subadmins:!0},e.prev=1,e.next=4,n.$store.dispatch("addGroup",t);case 4:return s=n.user.id,e.next=7,n.$store.dispatch("addUserGroup",{userid:s,gid:t});case 7:e.next=12;break;case 9:e.prev=9,e.t0=e.catch(1),console.error(e.t0);case 12:return e.prev=12,n.loading={groups:!1,subadmins:!1},e.finish(12);case 15:return e.abrupt("return",n.$store.getters.getGroups[n.groups.length]);case 16:case"end":return e.stop()}}),e,null,[[1,9,12,15]])})))()},addUserGroup:function(t){var n=this;return At(regeneratorRuntime.mark((function e(){var s,i;return regeneratorRuntime.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(!1!==t.canAdd){e.next=2;break}return e.abrupt("return",!1);case 2:return n.loading.groups=!0,s=n.user.id,i=t.id,e.prev=5,e.next=8,n.$store.dispatch("addUserGroup",{userid:s,gid:i});case 8:e.next=13;break;case 10:e.prev=10,e.t0=e.catch(5),console.error(e.t0);case 13:return e.prev=13,n.loading.groups=!1,e.finish(13);case 16:case"end":return e.stop()}}),e,null,[[5,10,13,16]])})))()},removeUserGroup:function(t){var n=this;return At(regeneratorRuntime.mark((function e(){var s,i;return regeneratorRuntime.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(!1!==t.canRemove){e.next=2;break}return e.abrupt("return",!1);case 2:return n.loading.groups=!0,s=n.user.id,i=t.id,e.prev=5,e.next=8,n.$store.dispatch("removeUserGroup",{userid:s,gid:i});case 8:n.loading.groups=!1,n.$route.params.selectedGroup===i&&n.$store.commit("deleteUser",s),e.next=15;break;case 12:e.prev=12,e.t0=e.catch(5),n.loading.groups=!1;case 15:case"end":return e.stop()}}),e,null,[[5,12]])})))()},addUserSubAdmin:function(t){var n=this;return At(regeneratorRuntime.mark((function e(){var s,i;return regeneratorRuntime.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n.loading.subadmins=!0,s=n.user.id,i=t.id,e.prev=3,e.next=6,n.$store.dispatch("addUserSubAdmin",{userid:s,gid:i});case 6:n.loading.subadmins=!1,e.next=12;break;case 9:e.prev=9,e.t0=e.catch(3),console.error(e.t0);case 12:case"end":return e.stop()}}),e,null,[[3,9]])})))()},removeUserSubAdmin:function(t){var n=this;return At(regeneratorRuntime.mark((function e(){var s,i;return regeneratorRuntime.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n.loading.subadmins=!0,s=n.user.id,i=t.id,e.prev=3,e.next=6,n.$store.dispatch("removeUserSubAdmin",{userid:s,gid:i});case 6:e.next=11;break;case 8:e.prev=8,e.t0=e.catch(3),console.error(e.t0);case 11:return e.prev=11,n.loading.subadmins=!1,e.finish(11);case 14:case"end":return e.stop()}}),e,null,[[3,8,11,14]])})))()},setUserQuota:function(){var t=arguments,n=this;return At(regeneratorRuntime.mark((function e(){var s;return regeneratorRuntime.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return s=t.length>0&&void 0!==t[0]?t[0]:"none",n.loading.quota=!0,s=s.id?s.id:s,e.prev=3,e.next=6,n.$store.dispatch("setUserData",{userid:n.user.id,key:"quota",value:s});case 6:e.next=11;break;case 8:e.prev=8,e.t0=e.catch(3),console.error(e.t0);case 11:return e.prev=11,n.loading.quota=!1,e.finish(11);case 14:return e.abrupt("return",s);case 15:case"end":return e.stop()}}),e,null,[[3,8,11,14]])})))()},validateQuota:function(t){var n=OC.Util.computerFileSize(t);return null!==n&&n>=0&&this.setUserQuota(OC.Util.humanFileSize(OC.Util.computerFileSize(t)))},setUserLanguage:function(t){var n=this;return At(regeneratorRuntime.mark((function e(){return regeneratorRuntime.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n.loading.languages=!0,e.prev=1,e.next=4,n.$store.dispatch("setUserData",{userid:n.user.id,key:"language",value:t.code});case 4:e.next=9;break;case 6:e.prev=6,e.t0=e.catch(1),console.error(e.t0);case 9:return e.prev=9,n.loading.languages=!1,e.finish(9);case 12:return e.abrupt("return",t);case 13:case"end":return e.stop()}}),e,null,[[1,6,9,12]])})))()},sendWelcomeMail:function(){var n=this;this.loading.all=!0,this.$store.dispatch("sendWelcomeMail",this.user.id).then((function(e){e&&(n.feedbackMessage=t("setting","Welcome mail sent!"),setTimeout((function(){n.feedbackMessage=""}),2e3)),n.loading.all=!1}))}}},Ct=yt,_t=s(10806),Ut={};Ut.styleTagTransform=ht(),Ut.setAttributes=dt(),Ut.insert=ut().bind(null,"head"),Ut.domAPI=rt(),Ut.insertStyleElement=gt(),it()(_t.Z,Ut),_t.Z&&_t.Z.locals&&_t.Z.locals;var kt=(0,D.Z)(Ct,(function(){var t=this,n=t.$createElement,e=t._self._c||n;return 1===Object.keys(t.user).length?e("div",{staticClass:"row",attrs:{"data-id":t.user.id}},[e("div",{staticClass:"avatar",class:{"icon-loading-small":t.loading.delete||t.loading.disable||t.loading.wipe}},[t.loading.delete||t.loading.disable||t.loading.wipe?t._e():e("img",{attrs:{src:t.generateAvatar(t.user.id,t.isDarkTheme),alt:"",height:"32",width:"32"}})]),t._v(" "),e("div",{staticClass:"name"},[t._v("\n\t\t"+t._s(t.user.id)+"\n\t")]),t._v(" "),e("div",{staticClass:"obfuscated"},[t._v("\n\t\t"+t._s(t.t("settings","You do not have permissions to see the details of this user"))+"\n\t")])]):t.editing?e("div",{staticClass:"row row--editable",class:{disabled:t.loading.delete||t.loading.disable,"row--menu-opened":t.openedMenu},attrs:{"data-id":t.user.id}},[e("div",{staticClass:"avatar",class:{"icon-loading-small":t.loading.delete||t.loading.disable||t.loading.wipe}},[t.loading.delete||t.loading.disable||t.loading.wipe?t._e():e("img",{attrs:{src:t.generateAvatar(t.user.id,t.isDarkTheme),alt:"",height:"32",width:"32"}})]),t._v(" "),t.user.backendCapabilities.setDisplayName?e("div",{staticClass:"displayName"},[e("form",{staticClass:"displayName",class:{"icon-loading-small":t.loading.displayName},on:{submit:function(n){return n.preventDefault(),t.updateDisplayName.apply(null,arguments)}}},[e("input",{ref:"displayName",attrs:{id:"displayName"+t.user.id+t.rand,disabled:t.loading.displayName||t.loading.all,autocapitalize:"off",autocomplete:"off",autocorrect:"off",spellcheck:"false",type:"text"},domProps:{value:t.user.displayname}}),t._v(" "),e("input",{staticClass:"icon-confirm",attrs:{type:"submit",value:""}})])]):e("div",{staticClass:"name"},[t._v("\n\t\t"+t._s(t.user.id)+"\n\t\t"),e("div",{staticClass:"displayName subtitle"},[e("div",{directives:[{name:"tooltip",rawName:"v-tooltip",value:t.user.displayname.length>20?t.user.displayname:"",expression:"user.displayname.length > 20 ? user.displayname : ''"}],staticClass:"cellText"},[t._v("\n\t\t\t\t"+t._s(t.user.displayname)+"\n\t\t\t")])])]),t._v(" "),t.settings.canChangePassword&&t.user.backendCapabilities.setPassword?e("form",{staticClass:"password",class:{"icon-loading-small":t.loading.password},on:{submit:function(n){return n.preventDefault(),t.updatePassword.apply(null,arguments)}}},[e("input",{ref:"password",attrs:{id:"password"+t.user.id+t.rand,disabled:t.loading.password||t.loading.all,minlength:t.minPasswordLength,maxlength:"469",placeholder:t.t("settings","Add new password"),autocapitalize:"off",autocomplete:"new-password",autocorrect:"off",required:"",spellcheck:"false",type:"password",value:""}}),t._v(" "),e("input",{staticClass:"icon-confirm",attrs:{type:"submit",value:""}})]):e("div"),t._v(" "),e("form",{staticClass:"mailAddress",class:{"icon-loading-small":t.loading.mailAddress},on:{submit:function(n){return n.preventDefault(),t.updateEmail.apply(null,arguments)}}},[e("input",{ref:"mailAddress",attrs:{id:"mailAddress"+t.user.id+t.rand,disabled:t.loading.mailAddress||t.loading.all,placeholder:t.t("settings","Add new email address"),autocapitalize:"off",autocomplete:"new-password",autocorrect:"off",spellcheck:"false",type:"email"},domProps:{value:t.user.email}}),t._v(" "),e("input",{staticClass:"icon-confirm",attrs:{type:"submit",value:""}})]),t._v(" "),e("div",{staticClass:"groups",class:{"icon-loading-small":t.loading.groups}},[e("NcMultiselect",{staticClass:"multiselect-vue",attrs:{"close-on-select":!1,disabled:t.loading.groups||t.loading.all,limit:2,multiple:!0,options:t.availableGroups,placeholder:t.t("settings","Add user to group"),"tag-width":60,taggable:t.settings.isAdmin,value:t.userGroups,label:"name","tag-placeholder":"create","track-by":"id"},on:{remove:t.removeUserGroup,select:t.addUserGroup,tag:t.createGroup}},[e("span",{attrs:{slot:"noResult"},slot:"noResult"},[t._v(t._s(t.t("settings","No results")))])])],1),t._v(" "),t.subAdminsGroups.length>0&&t.settings.isAdmin?e("div",{staticClass:"subadmins",class:{"icon-loading-small":t.loading.subadmins}},[e("NcMultiselect",{staticClass:"multiselect-vue",attrs:{"close-on-select":!1,disabled:t.loading.subadmins||t.loading.all,limit:2,multiple:!0,options:t.subAdminsGroups,placeholder:t.t("settings","Set user as admin for"),"tag-width":60,value:t.userSubAdminsGroups,label:"name","track-by":"id"},on:{remove:t.removeUserSubAdmin,select:t.addUserSubAdmin}},[e("span",{attrs:{slot:"noResult"},slot:"noResult"},[t._v(t._s(t.t("settings","No results")))])])],1):t._e(),t._v(" "),e("div",{directives:[{name:"tooltip",rawName:"v-tooltip.auto",value:t.usedSpace,expression:"usedSpace",modifiers:{auto:!0}}],staticClass:"quota",class:{"icon-loading-small":t.loading.quota}},[e("NcMultiselect",{staticClass:"multiselect-vue",attrs:{"allow-empty":!1,disabled:t.loading.quota||t.loading.all,options:t.quotaOptions,placeholder:t.t("settings","Select user quota"),taggable:!0,value:t.userQuota,label:"label","tag-placeholder":"create","track-by":"id"},on:{input:t.setUserQuota,tag:t.validateQuota}})],1),t._v(" "),t.showConfig.showLanguages?e("div",{staticClass:"languages",class:{"icon-loading-small":t.loading.languages}},[e("NcMultiselect",{staticClass:"multiselect-vue",attrs:{"allow-empty":!1,disabled:t.loading.languages||t.loading.all,options:t.languages,placeholder:t.t("settings","No language set"),value:t.userLanguage,"group-label":"label","group-values":"languages",label:"name","track-by":"code"},on:{input:t.setUserLanguage}})],1):t._e(),t._v(" "),t.showConfig.showStoragePath||t.showConfig.showUserBackend?e("div",{staticClass:"storageLocation"}):t._e(),t._v(" "),t.showConfig.showLastLogin?e("div"):t._e(),t._v(" "),e("div",{staticClass:"userActions"},[t.loading.all?t._e():e("div",{staticClass:"toggleUserActions"},[e("NcActions",[e("NcActionButton",{attrs:{icon:"icon-checkmark"},on:{click:function(n){t.editing=!1}}},[t._v("\n\t\t\t\t\t"+t._s(t.t("settings","Done"))+"\n\t\t\t\t")])],1),t._v(" "),e("div",{directives:[{name:"click-outside",rawName:"v-click-outside",value:t.hideMenu,expression:"hideMenu"}],staticClass:"userPopoverMenuWrapper"},[e("button",{staticClass:"icon-more",on:{click:function(n){return n.preventDefault(),t.toggleMenu.apply(null,arguments)}}}),t._v(" "),e("div",{staticClass:"popovermenu",class:{open:t.openedMenu}},[e("NcPopoverMenu",{attrs:{menu:t.userActions}})],1)])],1),t._v(" "),e("div",{staticClass:"feedback",style:{opacity:""!==t.feedbackMessage?1:0}},[e("div",{staticClass:"icon-checkmark"}),t._v("\n\t\t\t"+t._s(t.feedbackMessage)+"\n\t\t")])])]):e("UserRowSimple",{class:{"row--menu-opened":t.openedMenu},attrs:{editing:t.editing,"feedback-message":t.feedbackMessage,groups:t.groups,languages:t.languages,loading:t.loading,"opened-menu":t.openedMenu,settings:t.settings,"show-config":t.showConfig,"sub-admins-groups":t.subAdminsGroups,"user-actions":t.userActions,user:t.user,"is-dark-theme":t.isDarkTheme},on:{"update:editing":function(n){t.editing=n},"update:openedMenu":function(n){t.openedMenu=n},"update:opened-menu":function(n){t.openedMenu=n}}})}),[],!1,null,"573e6411",null),Nt=kt.exports,Lt={id:"none",label:t("settings","Unlimited")},xt={id:"default",label:t("settings","Default quota")},Gt={id:"",displayName:"",password:"",mailAddress:"",groups:[],subAdminsGroups:[],quota:xt,language:{code:"en",name:t("settings","Default language")}},St={name:"UserList",components:{NcModal:T(),userRow:Nt,NcMultiselect:_(),InfiniteLoading:z(),NcButton:j()},props:{users:{type:Array,default:function(){return[]}},showConfig:{type:Object,required:!0},selectedGroup:{type:String,default:null},externalActions:{type:Array,default:function(){return[]}}},data:function(){return{unlimitedQuota:Lt,defaultQuota:xt,loading:{all:!1,groups:!1},scrolled:!1,searchQuery:"",newUser:Object.assign({},Gt)}},computed:{settings:function(){return this.$store.getters.getServerData},selectedGroupDecoded:function(){return decodeURIComponent(this.selectedGroup)},filteredUsers:function(){return"disabled"===this.selectedGroup?this.users.filter((function(t){return!1===t.enabled})):(this.settings.isAdmin,this.users.filter((function(t){return!1!==t.enabled})))},groups:function(){return this.$store.getters.getGroups.filter((function(t){return"disabled"!==t.id})).sort((function(t,n){return t.name.localeCompare(n.name)}))},canAddGroups:function(){return this.groups.map((function(t){return(t=Object.assign({},t)).$isDisabled=!1===t.canAdd,t}))},subAdminsGroups:function(){return this.$store.getters.getSubadminGroups},quotaOptions:function(){var t=this.settings.quotaPreset.reduce((function(t,n){return t.concat({id:n,label:n})}),[]);return this.settings.allowUnlimitedQuota&&t.unshift(this.unlimitedQuota),t.unshift(this.defaultQuota),t},minPasswordLength:function(){return this.$store.getters.getPasswordPolicyMinLength},usersOffset:function(){return this.$store.getters.getUsersOffset},usersLimit:function(){return this.$store.getters.getUsersLimit},usersCount:function(){return this.users.length},languages:function(){return[{label:t("settings","Common languages"),languages:this.settings.languages.commonLanguages},{label:t("settings","Other languages"),languages:this.settings.languages.otherLanguages}]},isDarkTheme:function(){return"invert(100%)"===window.getComputedStyle(this.$el).getPropertyValue("--background-invert-if-dark")}},watch:{selectedGroup:function(t,n){this.redirectIfDisabled(),this.$store.commit("resetUsers"),this.$refs.infiniteLoading.stateChanger.reset(),this.setNewUserDefaultGroup(t)},usersCount:function(t,n){0===t&&1===n?this.$refs.infiniteLoading.stateChanger.reset():1===t&&0===n&&this.$refs.infiniteLoading.stateChanger.loaded()}},mounted:function(){this.settings.canChangePassword||OC.Notification.showTemporary(t("settings","Password change is disabled because the master key is disabled")),this.resetForm(),(0,R.Ld)("nextcloud:unified-search.search",this.search),(0,R.Ld)("nextcloud:unified-search.reset",this.resetSearch),this.redirectIfDisabled()},beforeDestroy:function(){(0,R.r1)("nextcloud:unified-search.search",this.search),(0,R.r1)("nextcloud:unified-search.reset",this.resetSearch)},methods:{onScroll:function(t){this.scrolled=t.target.scrollTo>0},validateQuota:function(t){var n=OC.Util.computerFileSize(t);return null!==n&&n>=0?(t=OC.Util.humanFileSize(OC.Util.computerFileSize(t)),this.newUser.quota={id:t,label:t},this.newUser.quota):(this.newUser.quota=this.quotaOptions[0],this.quotaOptions[0])},infiniteHandler:function(t){var n=this;this.$store.dispatch("getUsers",{offset:this.usersOffset,limit:this.usersLimit,group:"disabled"!==this.selectedGroup?this.selectedGroup:"",search:this.searchQuery}).then((function(e){e>0&&t.loaded(),e<n.usersLimit&&t.complete()}))},search:function(t){var n=t.query;this.searchQuery=n,this.$store.commit("resetUsers"),this.$refs.infiniteLoading.stateChanger.reset()},resetSearch:function(){this.search({query:""})},resetForm:function(){this.newUser=Object.assign({},Gt),this.settings.defaultLanguage&&U.ZP.set(this.newUser.language,"code",this.settings.defaultLanguage),this.setNewUserDefaultGroup(this.selectedGroup),this.loading.all=!1},createUser:function(){var t=this;this.loading.all=!0,this.$store.dispatch("addUser",{userid:this.newUser.id,password:this.newUser.password,displayName:this.newUser.displayName,email:this.newUser.mailAddress,groups:this.newUser.groups.map((function(t){return t.id})),subadmin:this.newUser.subAdminsGroups.map((function(t){return t.id})),quota:this.newUser.quota.id,language:this.newUser.language.code}).then((function(){t.resetForm(),t.$refs.newusername.focus(),t.closeModal()})).catch((function(n){if(t.loading.all=!1,n.response&&n.response.data&&n.response.data.ocs&&n.response.data.ocs.meta){var e=n.response.data.ocs.meta.statuscode;102===e?t.$refs.newusername.focus():107===e&&t.$refs.newuserpassword.focus()}}))},setNewUserDefaultGroup:function(t){if(t&&t.length>0){var n=this.groups.find((function(n){return n.id===t}));if(n)return void(this.newUser.groups=[n])}this.newUser.groups=[]},createGroup:function(t){var n=this;return this.loading.groups=!0,this.$store.dispatch("addGroup",t).then((function(e){n.newUser.groups.push(n.groups.find((function(n){return n.id===t}))),n.loading.groups=!1})).catch((function(){n.loading.groups=!1})),this.$store.getters.getGroups[this.groups.length]},redirectIfDisabled:function(){var t=this.$store.getters.getGroups;"disabled"===this.selectedGroup&&t.findIndex((function(t){return"disabled"===t.id&&0===t.usercount}))>-1&&(this.$router.push({name:"users"}),this.$refs.infiniteLoading.stateChanger.reset())},closeModal:function(){this.showConfig.showNewUserForm=!1}}},Mt=s(81524),qt={};qt.styleTagTransform=ht(),qt.setAttributes=dt(),qt.insert=ut().bind(null,"head"),qt.domAPI=rt(),qt.insertStyleElement=gt(),it()(Mt.Z,qt),Mt.Z&&Mt.Z.locals&&Mt.Z.locals;var $t=(0,D.Z)(St,(function(){var t=this,n=t.$createElement,e=t._self._c||n;return e("div",{staticClass:"user-list-grid",attrs:{id:"app-content"},on:{"&scroll":function(n){return t.onScroll.apply(null,arguments)}}},[t.showConfig.showNewUserForm?e("NcModal",{attrs:{size:"small"},on:{close:t.closeModal}},[e("form",{staticClass:"modal__content",attrs:{id:"new-user",disabled:t.loading.all},on:{submit:function(n){return n.preventDefault(),t.createUser.apply(null,arguments)}}},[e("h2",[t._v(t._s(t.t("settings","New user")))]),t._v(" "),e("input",{directives:[{name:"model",rawName:"v-model",value:t.newUser.id,expression:"newUser.id"}],ref:"newusername",staticClass:"modal__item",attrs:{id:"newusername",disabled:t.settings.newUserGenerateUserID,placeholder:t.settings.newUserGenerateUserID?t.t("settings","Will be autogenerated"):t.t("settings","Username"),autocapitalize:"none",autocomplete:"off",autocorrect:"off",name:"username",pattern:"[a-zA-Z0-9 _\\.@\\-']+",required:"",type:"text"},domProps:{value:t.newUser.id},on:{input:function(n){n.target.composing||t.$set(t.newUser,"id",n.target.value)}}}),t._v(" "),e("input",{directives:[{name:"model",rawName:"v-model",value:t.newUser.displayName,expression:"newUser.displayName"}],staticClass:"modal__item",attrs:{id:"newdisplayname",placeholder:t.t("settings","Display name"),autocapitalize:"none",autocomplete:"off",autocorrect:"off",name:"displayname",type:"text"},domProps:{value:t.newUser.displayName},on:{input:function(n){n.target.composing||t.$set(t.newUser,"displayName",n.target.value)}}}),t._v(" "),e("input",{directives:[{name:"model",rawName:"v-model",value:t.newUser.password,expression:"newUser.password"}],ref:"newuserpassword",staticClass:"modal__item",attrs:{id:"newuserpassword",minlength:t.minPasswordLength,maxlength:469,placeholder:t.t("settings","Password"),required:""===t.newUser.mailAddress,autocapitalize:"none",autocomplete:"new-password",autocorrect:"off",name:"password",type:"password"},domProps:{value:t.newUser.password},on:{input:function(n){n.target.composing||t.$set(t.newUser,"password",n.target.value)}}}),t._v(" "),e("input",{directives:[{name:"model",rawName:"v-model",value:t.newUser.mailAddress,expression:"newUser.mailAddress"}],staticClass:"modal__item",attrs:{id:"newemail",placeholder:t.t("settings","Email"),required:""===t.newUser.password||t.settings.newUserRequireEmail,autocapitalize:"none",autocomplete:"off",autocorrect:"off",name:"email",type:"email"},domProps:{value:t.newUser.mailAddress},on:{input:function(n){n.target.composing||t.$set(t.newUser,"mailAddress",n.target.value)}}}),t._v(" "),e("div",{staticClass:"groups modal__item"},[t.settings.isAdmin?t._e():e("input",{class:{"icon-loading-small":t.loading.groups},attrs:{id:"newgroups",required:!t.settings.isAdmin,tabindex:"-1",type:"text"},domProps:{value:t.newUser.groups}}),t._v(" "),e("NcMultiselect",{staticClass:"multiselect-vue",attrs:{"close-on-select":!1,disabled:t.loading.groups||t.loading.all,multiple:!0,options:t.canAddGroups,placeholder:t.t("settings","Add user to group"),"tag-width":60,taggable:!0,label:"name","tag-placeholder":"create","track-by":"id"},on:{tag:t.createGroup},model:{value:t.newUser.groups,callback:function(n){t.$set(t.newUser,"groups",n)},expression:"newUser.groups"}},[e("span",{attrs:{slot:"noResult"},slot:"noResult"},[t._v(t._s(t.t("settings","No results")))])])],1),t._v(" "),t.subAdminsGroups.length>0&&t.settings.isAdmin?e("div",{staticClass:"subadmins modal__item"},[e("NcMultiselect",{staticClass:"multiselect-vue",attrs:{"close-on-select":!1,multiple:!0,options:t.subAdminsGroups,placeholder:t.t("settings","Set user as admin for"),"tag-width":60,label:"name","track-by":"id"},model:{value:t.newUser.subAdminsGroups,callback:function(n){t.$set(t.newUser,"subAdminsGroups",n)},expression:"newUser.subAdminsGroups"}},[e("span",{attrs:{slot:"noResult"},slot:"noResult"},[t._v(t._s(t.t("settings","No results")))])])],1):t._e(),t._v(" "),e("div",{staticClass:"quota modal__item"},[e("NcMultiselect",{staticClass:"multiselect-vue",attrs:{"allow-empty":!1,options:t.quotaOptions,placeholder:t.t("settings","Select user quota"),taggable:!0,label:"label","track-by":"id"},on:{tag:t.validateQuota},model:{value:t.newUser.quota,callback:function(n){t.$set(t.newUser,"quota",n)},expression:"newUser.quota"}})],1),t._v(" "),t.showConfig.showLanguages?e("div",{staticClass:"languages modal__item"},[e("NcMultiselect",{staticClass:"multiselect-vue",attrs:{"allow-empty":!1,options:t.languages,placeholder:t.t("settings","Default language"),"group-label":"label","group-values":"languages",label:"name","track-by":"code"},model:{value:t.newUser.language,callback:function(n){t.$set(t.newUser,"language",n)},expression:"newUser.language"}})],1):t._e(),t._v(" "),t.showConfig.showStoragePath?e("div",{staticClass:"storageLocation"}):t._e(),t._v(" "),t.showConfig.showUserBackend?e("div",{staticClass:"userBackend"}):t._e(),t._v(" "),t.showConfig.showLastLogin?e("div",{staticClass:"lastLogin"}):t._e(),t._v(" "),e("div",{staticClass:"user-actions"},[e("NcButton",{attrs:{id:"newsubmit",type:"primary","native-type":"submit",value:""}},[t._v("\n\t\t\t\t\t"+t._s(t.t("settings","Add a new user"))+"\n\t\t\t\t")])],1)])]):t._e(),t._v(" "),e("div",{staticClass:"row",class:{sticky:t.scrolled&&!t.showConfig.showNewUserForm},attrs:{id:"grid-header"}},[e("div",{staticClass:"avatar",attrs:{id:"headerAvatar"}}),t._v(" "),e("div",{staticClass:"name",attrs:{id:"headerName"}},[e("div",{staticClass:"subtitle"},[e("strong",[t._v("\n\t\t\t\t\t"+t._s(t.t("settings","Display name"))+"\n\t\t\t\t")])]),t._v("\n\t\t\t"+t._s(t.t("settings","Username"))+"\n\t\t")]),t._v(" "),e("div",{staticClass:"password",attrs:{id:"headerPassword"}},[t._v("\n\t\t\t"+t._s(t.t("settings","Password"))+"\n\t\t")]),t._v(" "),e("div",{staticClass:"mailAddress",attrs:{id:"headerAddress"}},[t._v("\n\t\t\t"+t._s(t.t("settings","Email"))+"\n\t\t")]),t._v(" "),e("div",{staticClass:"groups",attrs:{id:"headerGroups"}},[t._v("\n\t\t\t"+t._s(t.t("settings","Groups"))+"\n\t\t")]),t._v(" "),t.subAdminsGroups.length>0&&t.settings.isAdmin?e("div",{staticClass:"subadmins",attrs:{id:"headerSubAdmins"}},[t._v("\n\t\t\t"+t._s(t.t("settings","Group admin for"))+"\n\t\t")]):t._e(),t._v(" "),e("div",{staticClass:"quota",attrs:{id:"headerQuota"}},[t._v("\n\t\t\t"+t._s(t.t("settings","Quota"))+"\n\t\t")]),t._v(" "),t.showConfig.showLanguages?e("div",{staticClass:"languages",attrs:{id:"headerLanguages"}},[t._v("\n\t\t\t"+t._s(t.t("settings","Language"))+"\n\t\t")]):t._e(),t._v(" "),t.showConfig.showUserBackend||t.showConfig.showStoragePath?e("div",{staticClass:"headerUserBackend userBackend"},[t.showConfig.showUserBackend?e("div",{staticClass:"userBackend"},[t._v("\n\t\t\t\t"+t._s(t.t("settings","User backend"))+"\n\t\t\t")]):t._e(),t._v(" "),t.showConfig.showStoragePath?e("div",{staticClass:"subtitle storageLocation"},[t._v("\n\t\t\t\t"+t._s(t.t("settings","Storage location"))+"\n\t\t\t")]):t._e()]):t._e(),t._v(" "),t.showConfig.showLastLogin?e("div",{staticClass:"headerLastLogin lastLogin"},[t._v("\n\t\t\t"+t._s(t.t("settings","Last login"))+"\n\t\t")]):t._e(),t._v(" "),e("div",{staticClass:"userActions"})]),t._v(" "),t._l(t.filteredUsers,(function(n){return e("user-row",{key:n.id,attrs:{"external-actions":t.externalActions,groups:t.groups,languages:t.languages,"quota-options":t.quotaOptions,settings:t.settings,"show-config":t.showConfig,"sub-admins-groups":t.subAdminsGroups,user:n,"is-dark-theme":t.isDarkTheme}})})),t._v(" "),e("InfiniteLoading",{ref:"infiniteLoading",on:{infinite:t.infiniteHandler}},[e("div",{attrs:{slot:"spinner"},slot:"spinner"},[e("div",{staticClass:"users-icon-loading icon-loading"})]),t._v(" "),e("div",{attrs:{slot:"no-more"},slot:"no-more"},[e("div",{staticClass:"users-list-end"})]),t._v(" "),e("div",{attrs:{slot:"no-results"},slot:"no-results"},[e("div",{attrs:{id:"emptycontent"}},[e("div",{staticClass:"icon-contacts-dark"}),t._v(" "),e("h2",[t._v(t._s(t.t("settings","No users in here")))])])])])],2)}),[],!1,null,"09961579",null),Ot=$t.exports;function Pt(t){return Pt="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},Pt(t)}function Dt(t,n){var e=Object.keys(t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(t);n&&(s=s.filter((function(n){return Object.getOwnPropertyDescriptor(t,n).enumerable}))),e.push.apply(e,s)}return e}function Bt(t){for(var n=1;n<arguments.length;n++){var e=null!=arguments[n]?arguments[n]:{};n%2?Dt(Object(e),!0).forEach((function(n){Rt(t,n,e[n])})):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(e)):Dt(Object(e)).forEach((function(n){Object.defineProperty(t,n,Object.getOwnPropertyDescriptor(e,n))}))}return t}function Rt(t,n,e){return n in t?Object.defineProperty(t,n,{value:e,enumerable:!0,configurable:!0,writable:!0}):t[n]=e,t}function Qt(t,n,e,s,i,a,r){try{var o=t[a](r),u=o.value}catch(t){return void e(t)}o.done?n(u):Promise.resolve(u).then(s,i)}function zt(t){return function(){var n=this,e=arguments;return new Promise((function(s,i){var a=t.apply(n,e);function r(t){Qt(a,s,i,r,o,"next",t)}function o(t){Qt(a,s,i,r,o,"throw",t)}r(void 0)}))}}U.ZP.use(N());var It={name:"Users",components:{NcAppContent:a(),NcAppNavigation:o(),NcAppNavigationCaption:l(),NcAppNavigationCounter:c(),NcAppNavigationItem:p(),NcAppNavigationNew:m(),NcAppNavigationSettings:v(),NcContent:A(),GroupListItem:B,NcMultiselect:_(),UserList:Ot},props:{selectedGroup:{type:String,default:null}},data:function(){return{unlimitedQuota:{id:"none",label:t("settings","Unlimited")},selectedQuota:!1,externalActions:[],loadingAddGroup:!1,loadingSendMail:!1,showConfig:{showStoragePath:!1,showUserBackend:!1,showLastLogin:!1,showNewUserForm:!1,showLanguages:!1}}},computed:{selectedGroupDecoded:function(){return this.selectedGroup?decodeURIComponent(this.selectedGroup):null},users:function(){return this.$store.getters.getUsers},groups:function(){return this.$store.getters.getGroups},usersOffset:function(){return this.$store.getters.getUsersOffset},usersLimit:function(){return this.$store.getters.getUsersLimit},showLanguages:{get:function(){return this.getLocalstorage("showLanguages")},set:function(t){this.setLocalStorage("showLanguages",t)}},showLastLogin:{get:function(){return this.getLocalstorage("showLastLogin")},set:function(t){this.setLocalStorage("showLastLogin",t)}},showUserBackend:{get:function(){return this.getLocalstorage("showUserBackend")},set:function(t){this.setLocalStorage("showUserBackend",t)}},showStoragePath:{get:function(){return this.getLocalstorage("showStoragePath")},set:function(t){this.setLocalStorage("showStoragePath",t)}},userCount:function(){return this.$store.getters.getUserCount},settings:function(){return this.$store.getters.getServerData},quotaOptions:function(){var t=this.settings.quotaPreset.reduce((function(t,n){return t.concat({id:n,label:n})}),[]);return this.settings.allowUnlimitedQuota&&t.unshift(this.unlimitedQuota),t},defaultQuota:{get:function(){return!1!==this.selectedQuota?this.selectedQuota:this.settings.defaultQuota!==this.unlimitedQuota.id&&OC.Util.computerFileSize(this.settings.defaultQuota)>=0?{id:this.settings.defaultQuota,label:this.settings.defaultQuota}:this.unlimitedQuota},set:function(t){this.selectedQuota=t}},sendWelcomeMail:{get:function(){return this.settings.newUserSendEmail},set:function(t){var n=this;return zt(regeneratorRuntime.mark((function e(){return regeneratorRuntime.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,n.loadingSendMail=!0,n.$store.commit("setServerData",Bt(Bt({},n.settings),{},{newUserSendEmail:t})),e.next=5,w.default.post((0,y.generateUrl)("/settings/users/preferences/newUser.sendEmail"),{value:t?"yes":"no"});case 5:e.next=10;break;case 7:e.prev=7,e.t0=e.catch(0),console.error("could not update newUser.sendEmail preference: "+e.t0.message,e.t0);case 10:return e.prev=10,n.loadingSendMail=!1,e.finish(10);case 13:case"end":return e.stop()}}),e,null,[[0,7,10,13]])})))()}},groupList:function(){var t=this;return(Array.isArray(this.groups)?this.groups:[]).filter((function(t){return"disabled"!==t.id&&"admin"!==t.id})).map((function(n){return t.formatGroupMenu(n)}))},adminGroupMenu:function(){return this.formatGroupMenu(this.groups.find((function(t){return"admin"===t.id})))},disabledGroupMenu:function(){return this.formatGroupMenu(this.groups.find((function(t){return"disabled"===t.id})))}},beforeMount:function(){this.$store.commit("initGroups",{groups:this.$store.getters.getServerData.groups,orderBy:this.$store.getters.getServerData.sortGroups,userCount:this.$store.getters.getServerData.userCount}),this.$store.dispatch("getPasswordPolicyMinLength")},created:function(){Object.assign(OCA,{Settings:{UserList:{registerAction:this.registerAction}}})},methods:{showNewUserMenu:function(){this.showConfig.showNewUserForm=!0,this.showConfig.showNewUserForm&&U.ZP.nextTick((function(){window.newusername.focus()}))},getLocalstorage:function(t){var n=this.$localStorage.get(t);return this.showConfig[t]=null!==n?"true"===n:this.showConfig[t],this.showConfig[t]},setLocalStorage:function(t,n){return this.showConfig[t]=n,this.$localStorage.set(t,n),n},setDefaultQuota:function(){var t=this,n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"none";this.$store.dispatch("setAppConfig",{app:"files",key:"default_quota",value:n.id?n.id:n}).then((function(){"object"!==Pt(n)&&(n={id:n,label:n}),t.defaultQuota=n}))},validateQuota:function(t){return null===OC.Util.computerFileSize(t)?this.setDefaultQuota("none"):this.setDefaultQuota(OC.Util.humanFileSize(OC.Util.computerFileSize(t)))},registerAction:function(t,n,e){return this.externalActions.push({icon:t,text:n,action:e}),this.externalActions},createGroup:function(t){var n=this;return zt(regeneratorRuntime.mark((function e(){return regeneratorRuntime.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(""!==t.trim()){e.next=2;break}return e.abrupt("return");case 2:return e.prev=2,n.loadingAddGroup=!0,e.next=6,n.$store.dispatch("addGroup",t.trim());case 6:return n.hideAddGroupForm(),e.next=9,n.$router.push({name:"group",params:{selectedGroup:encodeURIComponent(t.trim())}});case 9:e.next=14;break;case 11:e.prev=11,e.t0=e.catch(2),n.showAddGroupForm();case 14:return e.prev=14,n.loadingAddGroup=!1,e.finish(14);case 17:case"end":return e.stop()}}),e,null,[[2,11,14,17]])})))()},showAddGroupForm:function(){var t=this;this.$refs.addGroup.editingActive=!0,this.$refs.addGroup.onMenuToggle(!1),this.$nextTick((function(){t.$refs.addGroup.$refs.editingInput.focusInput()}))},hideAddGroupForm:function(){this.$refs.addGroup.editingActive=!1,this.$refs.addGroup.editingValue=""},formatGroupMenu:function(t){var n={};return void 0===t?{}:(n.id=t.id,n.title=t.name,n.usercount=t.usercount,t.usercount-t.disabled>0&&(n.count=t.usercount-t.disabled),n)}}},Tt=It,Ft=s(20110),jt={};jt.styleTagTransform=ht(),jt.setAttributes=dt(),jt.insert=ut().bind(null,"head"),jt.domAPI=rt(),jt.insertStyleElement=gt(),it()(Ft.Z,jt),Ft.Z&&Ft.Z.locals&&Ft.Z.locals;var Et=(0,D.Z)(Tt,(function(){var t=this,n=t.$createElement,e=t._self._c||n;return e("NcContent",{attrs:{"app-name":"settings","navigation-class":{"icon-loading":t.loadingAddGroup}}},[e("NcAppNavigation",{scopedSlots:t._u([{key:"list",fn:function(){return[e("NcAppNavigationItem",{ref:"addGroup",attrs:{id:"addgroup","edit-placeholder":t.t("settings","Enter group name"),editable:!0,loading:t.loadingAddGroup,title:t.t("settings","Add group"),icon:"icon-add"},on:{click:t.showAddGroupForm,"update:title":t.createGroup}}),t._v(" "),e("NcAppNavigationItem",{attrs:{id:"everyone",exact:!0,title:t.t("settings","Active users"),to:{name:"users"},icon:"icon-contacts-dark"}},[t.userCount>0?e("NcAppNavigationCounter",{attrs:{slot:"counter"},slot:"counter"},[t._v("\n\t\t\t\t\t"+t._s(t.userCount)+"\n\t\t\t\t")]):t._e()],1),t._v(" "),t.settings.isAdmin?e("NcAppNavigationItem",{attrs:{id:"admin",exact:!0,title:t.t("settings","Admins"),to:{name:"group",params:{selectedGroup:"admin"}},icon:"icon-user-admin"}},[t.adminGroupMenu.count?e("NcAppNavigationCounter",{attrs:{slot:"counter"},slot:"counter"},[t._v("\n\t\t\t\t\t"+t._s(t.adminGroupMenu.count)+"\n\t\t\t\t")]):t._e()],1):t._e(),t._v(" "),t.disabledGroupMenu.usercount>0||-1===t.disabledGroupMenu.usercount?e("NcAppNavigationItem",{attrs:{id:"disabled",exact:!0,title:t.t("settings","Disabled users"),to:{name:"group",params:{selectedGroup:"disabled"}},icon:"icon-disabled-users"}},[t.disabledGroupMenu.usercount>0?e("NcAppNavigationCounter",{attrs:{slot:"counter"},slot:"counter"},[t._v("\n\t\t\t\t\t"+t._s(t.disabledGroupMenu.usercount)+"\n\t\t\t\t")]):t._e()],1):t._e(),t._v(" "),t.groupList.length>0?e("NcAppNavigationCaption",{attrs:{title:t.t("settings","Groups")}}):t._e(),t._v(" "),t._l(t.groupList,(function(t){return e("GroupListItem",{key:t.id,attrs:{id:t.id,title:t.title,count:t.count}})}))]},proxy:!0},{key:"footer",fn:function(){return[e("NcAppNavigationSettings",[e("div",[e("p",[t._v(t._s(t.t("settings","Default quota:")))]),t._v(" "),e("NcMultiselect",{attrs:{value:t.defaultQuota,options:t.quotaOptions,"tag-placeholder":"create",placeholder:t.t("settings","Select default quota"),label:"label","track-by":"id","allow-empty":!1,taggable:!0},on:{tag:t.validateQuota,input:t.setDefaultQuota}})],1),t._v(" "),e("div",[e("input",{directives:[{name:"model",rawName:"v-model",value:t.showLanguages,expression:"showLanguages"}],staticClass:"checkbox",attrs:{id:"showLanguages",type:"checkbox"},domProps:{checked:Array.isArray(t.showLanguages)?t._i(t.showLanguages,null)>-1:t.showLanguages},on:{change:function(n){var e=t.showLanguages,s=n.target,i=!!s.checked;if(Array.isArray(e)){var a=t._i(e,null);s.checked?a<0&&(t.showLanguages=e.concat([null])):a>-1&&(t.showLanguages=e.slice(0,a).concat(e.slice(a+1)))}else t.showLanguages=i}}}),t._v(" "),e("label",{attrs:{for:"showLanguages"}},[t._v(t._s(t.t("settings","Show Languages")))])]),t._v(" "),e("div",[e("input",{directives:[{name:"model",rawName:"v-model",value:t.showLastLogin,expression:"showLastLogin"}],staticClass:"checkbox",attrs:{id:"showLastLogin",type:"checkbox"},domProps:{checked:Array.isArray(t.showLastLogin)?t._i(t.showLastLogin,null)>-1:t.showLastLogin},on:{change:function(n){var e=t.showLastLogin,s=n.target,i=!!s.checked;if(Array.isArray(e)){var a=t._i(e,null);s.checked?a<0&&(t.showLastLogin=e.concat([null])):a>-1&&(t.showLastLogin=e.slice(0,a).concat(e.slice(a+1)))}else t.showLastLogin=i}}}),t._v(" "),e("label",{attrs:{for:"showLastLogin"}},[t._v(t._s(t.t("settings","Show last login")))])]),t._v(" "),e("div",[e("input",{directives:[{name:"model",rawName:"v-model",value:t.showUserBackend,expression:"showUserBackend"}],staticClass:"checkbox",attrs:{id:"showUserBackend",type:"checkbox"},domProps:{checked:Array.isArray(t.showUserBackend)?t._i(t.showUserBackend,null)>-1:t.showUserBackend},on:{change:function(n){var e=t.showUserBackend,s=n.target,i=!!s.checked;if(Array.isArray(e)){var a=t._i(e,null);s.checked?a<0&&(t.showUserBackend=e.concat([null])):a>-1&&(t.showUserBackend=e.slice(0,a).concat(e.slice(a+1)))}else t.showUserBackend=i}}}),t._v(" "),e("label",{attrs:{for:"showUserBackend"}},[t._v(t._s(t.t("settings","Show user backend")))])]),t._v(" "),e("div",[e("input",{directives:[{name:"model",rawName:"v-model",value:t.showStoragePath,expression:"showStoragePath"}],staticClass:"checkbox",attrs:{id:"showStoragePath",type:"checkbox"},domProps:{checked:Array.isArray(t.showStoragePath)?t._i(t.showStoragePath,null)>-1:t.showStoragePath},on:{change:function(n){var e=t.showStoragePath,s=n.target,i=!!s.checked;if(Array.isArray(e)){var a=t._i(e,null);s.checked?a<0&&(t.showStoragePath=e.concat([null])):a>-1&&(t.showStoragePath=e.slice(0,a).concat(e.slice(a+1)))}else t.showStoragePath=i}}}),t._v(" "),e("label",{attrs:{for:"showStoragePath"}},[t._v(t._s(t.t("settings","Show storage path")))])]),t._v(" "),e("div",[e("input",{directives:[{name:"model",rawName:"v-model",value:t.sendWelcomeMail,expression:"sendWelcomeMail"}],staticClass:"checkbox",attrs:{id:"sendWelcomeMail",disabled:t.loadingSendMail,type:"checkbox"},domProps:{checked:Array.isArray(t.sendWelcomeMail)?t._i(t.sendWelcomeMail,null)>-1:t.sendWelcomeMail},on:{change:function(n){var e=t.sendWelcomeMail,s=n.target,i=!!s.checked;if(Array.isArray(e)){var a=t._i(e,null);s.checked?a<0&&(t.sendWelcomeMail=e.concat([null])):a>-1&&(t.sendWelcomeMail=e.slice(0,a).concat(e.slice(a+1)))}else t.sendWelcomeMail=i}}}),t._v(" "),e("label",{attrs:{for:"sendWelcomeMail"}},[t._v(t._s(t.t("settings","Send email to new user")))])])])]},proxy:!0}])},[e("NcAppNavigationNew",{attrs:{"button-id":"new-user-button",text:t.t("settings","New user"),"button-class":"icon-add"},on:{click:t.showNewUserMenu,keyup:[function(n){return!n.type.indexOf("key")&&t._k(n.keyCode,"enter",13,n.key,"Enter")?null:t.showNewUserMenu.apply(null,arguments)},function(n){return!n.type.indexOf("key")&&t._k(n.keyCode,"space",32,n.key,[" ","Spacebar"])?null:t.showNewUserMenu.apply(null,arguments)}]}})],1),t._v(" "),e("NcAppContent",[e("UserList",{attrs:{users:t.users,"show-config":t.showConfig,"selected-group":t.selectedGroupDecoded,"external-actions":t.externalActions}})],1)],1)}),[],!1,null,"7004587b",null),Zt=Et.exports}}]); +//# sourceMappingURL=settings-users-8351.js.map?v=48806c008b493bc010bb
\ No newline at end of file diff --git a/dist/settings-users-8351.js.map b/dist/settings-users-8351.js.map index bf39a85c4c2..6688305368d 100644 --- a/dist/settings-users-8351.js.map +++ b/dist/settings-users-8351.js.map @@ -1 +1 @@ -{"version":3,"file":"settings-users-8351.js?v=0fb4eae666669f163a13","mappings":"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AWpB,EAAIqB,GAAGrB,EAAIwI,iBAAiB,kBAC32H,IDWpB,EACA,KACA,KACA,MAIF,GAAe,GAAiB,wUEuOhC,oBAEA,QACA,eACA,YACA,iBACA,8BACA,sBACA,gCACA,+BAEA,YACA,kBAEA,YACA,OACA,MACA,YACA,aAEA,UACA,YACA,8BAEA,QACA,WACA,8BAEA,iBACA,WACA,8BAEA,cACA,WACA,8BAEA,YACA,YACA,8BAEA,WACA,WACA,aAEA,iBACA,WACA,8BAEA,aACA,aACA,cAGA,KAnDA,WAoDA,OACA,iCACA,cACA,mBACA,WACA,SACA,OACA,eACA,YACA,eACA,UACA,aACA,SACA,UACA,WACA,aACA,WAIA,UAEA,YAFA,WAGA,OACA,CACA,mBACA,iCACA,wBAEA,CACA,mBACA,sCACA,6BAEA,CACA,+CACA,gFACA,gCAUA,OAPA,8CACA,QACA,iBACA,0CACA,8BAGA,iCAIA,SAEA,WAFA,WAGA,kCAEA,SALA,WAMA,oBAGA,gBATA,WASA,WACA,eACA,8BACA,6NACA,uCACA,CACA,+BACA,2DACA,uBACA,gCAEA,YACA,IACA,kBACA,iBACA,uCACA,iBACA,kBACA,wBAIA,IAIA,WAnCA,WAmCA,WACA,eACA,8BACA,8GACA,iCACA,CACA,+BACA,6DACA,uBACA,gCAEA,YACA,KAGA,OAFA,oBACA,iBACA,kCACA,iBACA,oBACA,uBAIA,IAIA,kBA7DA,WA6DA,WACA,uBACA,oBACA,mBACA,qBACA,iDACA,SACA,YAEA,iBACA,oBACA,qBASA,kBAjFA,WAiFA,WACA,+BACA,4BACA,oCACA,oBACA,kBACA,UACA,iBACA,yBACA,gCASA,eAnGA,WAmGA,WACA,4BACA,yBACA,oCACA,oBACA,eACA,UACA,iBACA,sBACA,8BASA,YArHA,WAqHA,WACA,+BACA,4BACA,oCACA,oBACA,YACA,UACA,iBACA,yBACA,gCASA,YAvIA,SAuIA,2JACA,mCADA,kBAGA,gCAHA,cAIA,YAJA,SAKA,mDALA,uDAOA,oBAPA,yBASA,mCATA,8CAWA,6CAXA,kEAmBA,aA1JA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","sources":["webpack:///nextcloud/apps/settings/src/components/UserList/UserRow.vue?vue&type=style&index=0&id=573e6411&scoped=true&lang=scss&","webpack:///nextcloud/apps/settings/src/components/UserList/UserRowSimple.vue?vue&type=style&index=0&lang=scss&","webpack:///nextcloud/apps/settings/src/views/Users.vue?vue&type=style&index=0&id=7004587b&lang=scss&scoped=true&","webpack:///nextcloud/apps/settings/src/components/UserList.vue?vue&type=style&index=0&id=5d4cd810&scoped=true&lang=css&","webpack:///nextcloud/apps/settings/src/views/Users.vue?vue&type=template&id=7004587b&scoped=true&","webpack:///nextcloud/apps/settings/src/components/GroupListItem.vue","webpack:///nextcloud/apps/settings/src/components/GroupListItem.vue?vue&type=script&lang=js&","webpack://nextcloud/./apps/settings/src/components/GroupListItem.vue?7b19","webpack:///nextcloud/apps/settings/src/components/GroupListItem.vue?vue&type=template&id=03bc8784&","webpack:///nextcloud/apps/settings/src/mixins/UserRowMixin.js","webpack:///nextcloud/apps/settings/src/components/UserList/UserRowSimple.vue?vue&type=script&lang=js&","webpack:///nextcloud/apps/settings/src/components/UserList/UserRowSimple.vue","webpack://nextcloud/./apps/settings/src/components/UserList/UserRowSimple.vue?6980","webpack://nextcloud/./apps/settings/src/components/UserList/UserRowSimple.vue?6d7a","webpack:///nextcloud/apps/settings/src/components/UserList/UserRowSimple.vue?vue&type=template&id=6bcca1e8&","webpack:///nextcloud/apps/settings/src/components/UserList/UserRow.vue","webpack:///nextcloud/apps/settings/src/components/UserList/UserRow.vue?vue&type=script&lang=js&","webpack://nextcloud/./apps/settings/src/components/UserList/UserRow.vue?59cd","webpack://nextcloud/./apps/settings/src/components/UserList/UserRow.vue?81d2","webpack:///nextcloud/apps/settings/src/components/UserList/UserRow.vue?vue&type=template&id=573e6411&scoped=true&","webpack:///nextcloud/apps/settings/src/components/UserList.vue","webpack:///nextcloud/apps/settings/src/components/UserList.vue?vue&type=script&lang=js&","webpack://nextcloud/./apps/settings/src/components/UserList.vue?d593","webpack://nextcloud/./apps/settings/src/components/UserList.vue?02a4","webpack:///nextcloud/apps/settings/src/components/UserList.vue?vue&type=template&id=5d4cd810&scoped=true&","webpack:///nextcloud/apps/settings/src/views/Users.vue","webpack:///nextcloud/apps/settings/src/views/Users.vue?vue&type=script&lang=js&","webpack://nextcloud/./apps/settings/src/views/Users.vue?5879","webpack://nextcloud/./apps/settings/src/views/Users.vue?cf86"],"sourcesContent":["// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".row--menu-opened[data-v-573e6411]{z-index:1 !important}.row[data-v-573e6411] .multiselect__single{z-index:auto !important}\", \"\",{\"version\":3,\"sources\":[\"webpack://./apps/settings/src/components/UserList/UserRow.vue\"],\"names\":[],\"mappings\":\"AA6qBA,mCACC,oBAAA,CAED,2CACC,uBAAA\",\"sourcesContent\":[\"\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n// Force menu to be above other rows\\n.row--menu-opened {\\n\\tz-index: 1 !important;\\n}\\n.row::v-deep .multiselect__single {\\n\\tz-index: auto !important;\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".cellText{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.icon-more{background-color:var(--color-main-background);border:0}\", \"\",{\"version\":3,\"sources\":[\"webpack://./apps/settings/src/components/UserList/UserRowSimple.vue\"],\"names\":[],\"mappings\":\"AAkMC,UACC,eAAA,CACA,sBAAA,CACA,kBAAA,CAED,WACC,6CAAA,CACA,QAAA\",\"sourcesContent\":[\"\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\t.cellText {\\n\\t\\toverflow: hidden;\\n\\t\\ttext-overflow: ellipsis;\\n\\t\\twhite-space: nowrap;\\n}\\n\\t.icon-more {\\n\\t\\tbackground-color: var(--color-main-background);\\n\\t\\tborder: 0;\\n\\t}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".app-navigation__list #addgroup[data-v-7004587b] .app-navigation-entry__utils{display:none}\", \"\",{\"version\":3,\"sources\":[\"webpack://./apps/settings/src/views/Users.vue\"],\"names\":[],\"mappings\":\"AAieA,8EACC,YAAA\",\"sourcesContent\":[\"\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n// force hiding the editing action for the add group entry\\n.app-navigation__list #addgroup::v-deep .app-navigation-entry__utils {\\n\\tdisplay: none;\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"\\n.modal-wrapper[data-v-5d4cd810] {\\n\\tmargin: 2vh 0;\\n\\talign-items: flex-start;\\n}\\n.modal__content[data-v-5d4cd810] {\\n\\tdisplay: flex;\\n\\tpadding: 20px;\\n\\tflex-direction: column;\\n\\talign-items: center;\\n\\ttext-align: center;\\n}\\n.modal__item[data-v-5d4cd810] {\\n\\tmargin-bottom: 16px;\\n\\twidth: 100%;\\n}\\n.modal__item[data-v-5d4cd810]:not(:focus):not(:active) {\\n\\tborder-color: var(--color-border-dark);\\n}\\n.modal__item[data-v-5d4cd810] .multiselect {\\n\\twidth: 100%;\\n}\\n.user-actions[data-v-5d4cd810] {\\n\\tmargin-top: 20px;\\n}\\n.modal__content[data-v-5d4cd810] .multiselect__single {\\n\\ttext-align: left;\\n\\tbox-sizing: border-box;\\n}\\n.modal__content[data-v-5d4cd810] .multiselect__content-wrapper {\\n\\tbox-sizing: border-box;\\n}\\n.row[data-v-5d4cd810] .multiselect__single {\\n\\tz-index: auto !important;\\n}\\n\\n/* fake input for groups validation */\\ninput#newgroups[data-v-5d4cd810] {\\n\\tposition: absolute;\\n\\topacity: 0;\\n\\t/* The \\\"hidden\\\" input is behind the Multiselect, so in general it does\\n\\t * not receives clicks. However, with Firefox, after the validation\\n\\t * fails, it will receive the first click done on it, so its width needs\\n\\t * to be set to 0 to prevent that (\\\"pointer-events: none\\\" does not\\n\\t * prevent it). */\\n\\twidth: 0;\\n}\\n\", \"\",{\"version\":3,\"sources\":[\"webpack://./apps/settings/src/components/UserList.vue\"],\"names\":[],\"mappings\":\";AAqlBA;CACA,aAAA;CACA,uBAAA;AACA;AACA;CACA,aAAA;CACA,aAAA;CACA,sBAAA;CACA,mBAAA;CACA,kBAAA;AACA;AACA;CACA,mBAAA;CACA,WAAA;AACA;AACA;CACA,sCAAA;AACA;AACA;CACA,WAAA;AACA;AACA;CACA,gBAAA;AACA;AACA;CACA,gBAAA;CACA,sBAAA;AACA;AACA;CACA,sBAAA;AACA;AACA;CACA,wBAAA;AACA;;AAEA,qCAAA;AACA;CACA,kBAAA;CACA,UAAA;CACA;;;;kBAIA;CACA,QAAA;AACA\",\"sourcesContent\":[\"<!--\\n - @copyright Copyright (c) 2018 John Molakvoæ <skjnldsv@protonmail.com>\\n -\\n - @author John Molakvoæ <skjnldsv@protonmail.com>\\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\\\" class=\\\"user-list-grid\\\" @scroll.passive=\\\"onScroll\\\">\\n\\t\\t<NcModal v-if=\\\"showConfig.showNewUserForm\\\" size=\\\"small\\\" @close=\\\"closeModal\\\">\\n\\t\\t\\t<form id=\\\"new-user\\\"\\n\\t\\t\\t\\t:disabled=\\\"loading.all\\\"\\n\\t\\t\\t\\tclass=\\\"modal__content\\\"\\n\\t\\t\\t\\t@submit.prevent=\\\"createUser\\\">\\n\\t\\t\\t\\t<h2>{{ t('settings','New user') }}</h2>\\n\\t\\t\\t\\t<input id=\\\"newusername\\\"\\n\\t\\t\\t\\t\\tref=\\\"newusername\\\"\\n\\t\\t\\t\\t\\tv-model=\\\"newUser.id\\\"\\n\\t\\t\\t\\t\\t:disabled=\\\"settings.newUserGenerateUserID\\\"\\n\\t\\t\\t\\t\\t:placeholder=\\\"settings.newUserGenerateUserID\\n\\t\\t\\t\\t\\t\\t? t('settings', 'Will be autogenerated')\\n\\t\\t\\t\\t\\t\\t: t('settings', 'Username')\\\"\\n\\t\\t\\t\\t\\tautocapitalize=\\\"none\\\"\\n\\t\\t\\t\\t\\tautocomplete=\\\"off\\\"\\n\\t\\t\\t\\t\\tautocorrect=\\\"off\\\"\\n\\t\\t\\t\\t\\tclass=\\\"modal__item\\\"\\n\\t\\t\\t\\t\\tname=\\\"username\\\"\\n\\t\\t\\t\\t\\tpattern=\\\"[a-zA-Z0-9 _\\\\.@\\\\-']+\\\"\\n\\t\\t\\t\\t\\trequired\\n\\t\\t\\t\\t\\ttype=\\\"text\\\">\\n\\t\\t\\t\\t<input id=\\\"newdisplayname\\\"\\n\\t\\t\\t\\t\\tv-model=\\\"newUser.displayName\\\"\\n\\t\\t\\t\\t\\t:placeholder=\\\"t('settings', 'Display name')\\\"\\n\\t\\t\\t\\t\\tautocapitalize=\\\"none\\\"\\n\\t\\t\\t\\t\\tautocomplete=\\\"off\\\"\\n\\t\\t\\t\\t\\tautocorrect=\\\"off\\\"\\n\\t\\t\\t\\t\\tclass=\\\"modal__item\\\"\\n\\t\\t\\t\\t\\tname=\\\"displayname\\\"\\n\\t\\t\\t\\t\\ttype=\\\"text\\\">\\n\\t\\t\\t\\t<input id=\\\"newuserpassword\\\"\\n\\t\\t\\t\\t\\tref=\\\"newuserpassword\\\"\\n\\t\\t\\t\\t\\tv-model=\\\"newUser.password\\\"\\n\\t\\t\\t\\t\\t:minlength=\\\"minPasswordLength\\\"\\n\\t\\t\\t\\t\\t:placeholder=\\\"t('settings', 'Password')\\\"\\n\\t\\t\\t\\t\\t:required=\\\"newUser.mailAddress===''\\\"\\n\\t\\t\\t\\t\\tautocapitalize=\\\"none\\\"\\n\\t\\t\\t\\t\\tautocomplete=\\\"new-password\\\"\\n\\t\\t\\t\\t\\tautocorrect=\\\"off\\\"\\n\\t\\t\\t\\t\\tclass=\\\"modal__item\\\"\\n\\t\\t\\t\\t\\tname=\\\"password\\\"\\n\\t\\t\\t\\t\\ttype=\\\"password\\\">\\n\\t\\t\\t\\t<input id=\\\"newemail\\\"\\n\\t\\t\\t\\t\\tv-model=\\\"newUser.mailAddress\\\"\\n\\t\\t\\t\\t\\t:placeholder=\\\"t('settings', 'Email')\\\"\\n\\t\\t\\t\\t\\t:required=\\\"newUser.password==='' || settings.newUserRequireEmail\\\"\\n\\t\\t\\t\\t\\tautocapitalize=\\\"none\\\"\\n\\t\\t\\t\\t\\tautocomplete=\\\"off\\\"\\n\\t\\t\\t\\t\\tautocorrect=\\\"off\\\"\\n\\t\\t\\t\\t\\tclass=\\\"modal__item\\\"\\n\\t\\t\\t\\t\\tname=\\\"email\\\"\\n\\t\\t\\t\\t\\ttype=\\\"email\\\">\\n\\t\\t\\t\\t<div class=\\\"groups modal__item\\\">\\n\\t\\t\\t\\t\\t<!-- hidden input trick for vanilla html5 form validation -->\\n\\t\\t\\t\\t\\t<input v-if=\\\"!settings.isAdmin\\\"\\n\\t\\t\\t\\t\\t\\tid=\\\"newgroups\\\"\\n\\t\\t\\t\\t\\t\\t:class=\\\"{'icon-loading-small': loading.groups}\\\"\\n\\t\\t\\t\\t\\t\\t:required=\\\"!settings.isAdmin\\\"\\n\\t\\t\\t\\t\\t\\t:value=\\\"newUser.groups\\\"\\n\\t\\t\\t\\t\\t\\ttabindex=\\\"-1\\\"\\n\\t\\t\\t\\t\\t\\ttype=\\\"text\\\">\\n\\t\\t\\t\\t\\t<NcMultiselect v-model=\\\"newUser.groups\\\"\\n\\t\\t\\t\\t\\t\\t:close-on-select=\\\"false\\\"\\n\\t\\t\\t\\t\\t\\t:disabled=\\\"loading.groups||loading.all\\\"\\n\\t\\t\\t\\t\\t\\t:multiple=\\\"true\\\"\\n\\t\\t\\t\\t\\t\\t:options=\\\"canAddGroups\\\"\\n\\t\\t\\t\\t\\t\\t:placeholder=\\\"t('settings', 'Add user to group')\\\"\\n\\t\\t\\t\\t\\t\\t:tag-width=\\\"60\\\"\\n\\t\\t\\t\\t\\t\\t:taggable=\\\"true\\\"\\n\\t\\t\\t\\t\\t\\tclass=\\\"multiselect-vue\\\"\\n\\t\\t\\t\\t\\t\\tlabel=\\\"name\\\"\\n\\t\\t\\t\\t\\t\\ttag-placeholder=\\\"create\\\"\\n\\t\\t\\t\\t\\t\\ttrack-by=\\\"id\\\"\\n\\t\\t\\t\\t\\t\\t@tag=\\\"createGroup\\\">\\n\\t\\t\\t\\t\\t\\t<!-- If user is not admin, he is a subadmin.\\n\\t\\t\\t\\t\\t\\t\\tSubadmins can't create users outside their groups\\n\\t\\t\\t\\t\\t\\t\\tTherefore, empty select is forbidden -->\\n\\t\\t\\t\\t\\t\\t<span slot=\\\"noResult\\\">{{ t('settings', 'No results') }}</span>\\n\\t\\t\\t\\t\\t</NcMultiselect>\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t\\t<div v-if=\\\"subAdminsGroups.length>0 && settings.isAdmin\\\"\\n\\t\\t\\t\\t\\tclass=\\\"subadmins modal__item\\\">\\n\\t\\t\\t\\t\\t<NcMultiselect v-model=\\\"newUser.subAdminsGroups\\\"\\n\\t\\t\\t\\t\\t\\t:close-on-select=\\\"false\\\"\\n\\t\\t\\t\\t\\t\\t:multiple=\\\"true\\\"\\n\\t\\t\\t\\t\\t\\t:options=\\\"subAdminsGroups\\\"\\n\\t\\t\\t\\t\\t\\t:placeholder=\\\"t('settings', 'Set user as admin for')\\\"\\n\\t\\t\\t\\t\\t\\t:tag-width=\\\"60\\\"\\n\\t\\t\\t\\t\\t\\tclass=\\\"multiselect-vue\\\"\\n\\t\\t\\t\\t\\t\\tlabel=\\\"name\\\"\\n\\t\\t\\t\\t\\t\\ttrack-by=\\\"id\\\">\\n\\t\\t\\t\\t\\t\\t<span slot=\\\"noResult\\\">{{ t('settings', 'No results') }}</span>\\n\\t\\t\\t\\t\\t</NcMultiselect>\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t\\t<div class=\\\"quota modal__item\\\">\\n\\t\\t\\t\\t\\t<NcMultiselect v-model=\\\"newUser.quota\\\"\\n\\t\\t\\t\\t\\t\\t:allow-empty=\\\"false\\\"\\n\\t\\t\\t\\t\\t\\t:options=\\\"quotaOptions\\\"\\n\\t\\t\\t\\t\\t\\t:placeholder=\\\"t('settings', 'Select user quota')\\\"\\n\\t\\t\\t\\t\\t\\t:taggable=\\\"true\\\"\\n\\t\\t\\t\\t\\t\\tclass=\\\"multiselect-vue\\\"\\n\\t\\t\\t\\t\\t\\tlabel=\\\"label\\\"\\n\\t\\t\\t\\t\\t\\ttrack-by=\\\"id\\\"\\n\\t\\t\\t\\t\\t\\t@tag=\\\"validateQuota\\\" />\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t\\t<div v-if=\\\"showConfig.showLanguages\\\" class=\\\"languages modal__item\\\">\\n\\t\\t\\t\\t\\t<NcMultiselect v-model=\\\"newUser.language\\\"\\n\\t\\t\\t\\t\\t\\t:allow-empty=\\\"false\\\"\\n\\t\\t\\t\\t\\t\\t:options=\\\"languages\\\"\\n\\t\\t\\t\\t\\t\\t:placeholder=\\\"t('settings', 'Default language')\\\"\\n\\t\\t\\t\\t\\t\\tclass=\\\"multiselect-vue\\\"\\n\\t\\t\\t\\t\\t\\tgroup-label=\\\"label\\\"\\n\\t\\t\\t\\t\\t\\tgroup-values=\\\"languages\\\"\\n\\t\\t\\t\\t\\t\\tlabel=\\\"name\\\"\\n\\t\\t\\t\\t\\t\\ttrack-by=\\\"code\\\" />\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t\\t<div v-if=\\\"showConfig.showStoragePath\\\" class=\\\"storageLocation\\\" />\\n\\t\\t\\t\\t<div v-if=\\\"showConfig.showUserBackend\\\" class=\\\"userBackend\\\" />\\n\\t\\t\\t\\t<div v-if=\\\"showConfig.showLastLogin\\\" class=\\\"lastLogin\\\" />\\n\\t\\t\\t\\t<div class=\\\"user-actions\\\">\\n\\t\\t\\t\\t\\t<NcButton id=\\\"newsubmit\\\"\\n\\t\\t\\t\\t\\t\\ttype=\\\"primary\\\"\\n\\t\\t\\t\\t\\t\\tnative-type=\\\"submit\\\"\\n\\t\\t\\t\\t\\t\\tvalue=\\\"\\\">\\n\\t\\t\\t\\t\\t\\t{{ t('settings', 'Add a new user') }}\\n\\t\\t\\t\\t\\t</NcButton>\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t</form>\\n\\t\\t</NcModal>\\n\\t\\t<div id=\\\"grid-header\\\"\\n\\t\\t\\t:class=\\\"{'sticky': scrolled && !showConfig.showNewUserForm}\\\"\\n\\t\\t\\tclass=\\\"row\\\">\\n\\t\\t\\t<div id=\\\"headerAvatar\\\" class=\\\"avatar\\\" />\\n\\t\\t\\t<div id=\\\"headerName\\\" class=\\\"name\\\">\\n\\t\\t\\t\\t<div class=\\\"subtitle\\\">\\n\\t\\t\\t\\t\\t<strong>\\n\\t\\t\\t\\t\\t\\t{{ t('settings', 'Display name') }}\\n\\t\\t\\t\\t\\t</strong>\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t\\t{{ t('settings', 'Username') }}\\n\\t\\t\\t</div>\\n\\t\\t\\t<div id=\\\"headerPassword\\\" class=\\\"password\\\">\\n\\t\\t\\t\\t{{ t('settings', 'Password') }}\\n\\t\\t\\t</div>\\n\\t\\t\\t<div id=\\\"headerAddress\\\" class=\\\"mailAddress\\\">\\n\\t\\t\\t\\t{{ t('settings', 'Email') }}\\n\\t\\t\\t</div>\\n\\t\\t\\t<div id=\\\"headerGroups\\\" class=\\\"groups\\\">\\n\\t\\t\\t\\t{{ t('settings', 'Groups') }}\\n\\t\\t\\t</div>\\n\\t\\t\\t<div v-if=\\\"subAdminsGroups.length>0 && settings.isAdmin\\\"\\n\\t\\t\\t\\tid=\\\"headerSubAdmins\\\"\\n\\t\\t\\t\\tclass=\\\"subadmins\\\">\\n\\t\\t\\t\\t{{ t('settings', 'Group admin for') }}\\n\\t\\t\\t</div>\\n\\t\\t\\t<div id=\\\"headerQuota\\\" class=\\\"quota\\\">\\n\\t\\t\\t\\t{{ t('settings', 'Quota') }}\\n\\t\\t\\t</div>\\n\\t\\t\\t<div v-if=\\\"showConfig.showLanguages\\\"\\n\\t\\t\\t\\tid=\\\"headerLanguages\\\"\\n\\t\\t\\t\\tclass=\\\"languages\\\">\\n\\t\\t\\t\\t{{ t('settings', 'Language') }}\\n\\t\\t\\t</div>\\n\\n\\t\\t\\t<div v-if=\\\"showConfig.showUserBackend || showConfig.showStoragePath\\\"\\n\\t\\t\\t\\tclass=\\\"headerUserBackend userBackend\\\">\\n\\t\\t\\t\\t<div v-if=\\\"showConfig.showUserBackend\\\" class=\\\"userBackend\\\">\\n\\t\\t\\t\\t\\t{{ t('settings', 'User backend') }}\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t\\t<div v-if=\\\"showConfig.showStoragePath\\\"\\n\\t\\t\\t\\t\\tclass=\\\"subtitle storageLocation\\\">\\n\\t\\t\\t\\t\\t{{ t('settings', 'Storage location') }}\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t</div>\\n\\t\\t\\t<div v-if=\\\"showConfig.showLastLogin\\\"\\n\\t\\t\\t\\tclass=\\\"headerLastLogin lastLogin\\\">\\n\\t\\t\\t\\t{{ t('settings', 'Last login') }}\\n\\t\\t\\t</div>\\n\\n\\t\\t\\t<div class=\\\"userActions\\\" />\\n\\t\\t</div>\\n\\n\\t\\t<user-row v-for=\\\"user in filteredUsers\\\"\\n\\t\\t\\t:key=\\\"user.id\\\"\\n\\t\\t\\t:external-actions=\\\"externalActions\\\"\\n\\t\\t\\t:groups=\\\"groups\\\"\\n\\t\\t\\t:languages=\\\"languages\\\"\\n\\t\\t\\t:quota-options=\\\"quotaOptions\\\"\\n\\t\\t\\t:settings=\\\"settings\\\"\\n\\t\\t\\t:show-config=\\\"showConfig\\\"\\n\\t\\t\\t:sub-admins-groups=\\\"subAdminsGroups\\\"\\n\\t\\t\\t:user=\\\"user\\\"\\n\\t\\t\\t:is-dark-theme=\\\"isDarkTheme\\\" />\\n\\t\\t<InfiniteLoading ref=\\\"infiniteLoading\\\" @infinite=\\\"infiniteHandler\\\">\\n\\t\\t\\t<div slot=\\\"spinner\\\">\\n\\t\\t\\t\\t<div class=\\\"users-icon-loading icon-loading\\\" />\\n\\t\\t\\t</div>\\n\\t\\t\\t<div slot=\\\"no-more\\\">\\n\\t\\t\\t\\t<div class=\\\"users-list-end\\\" />\\n\\t\\t\\t</div>\\n\\t\\t\\t<div slot=\\\"no-results\\\">\\n\\t\\t\\t\\t<div id=\\\"emptycontent\\\">\\n\\t\\t\\t\\t\\t<div class=\\\"icon-contacts-dark\\\" />\\n\\t\\t\\t\\t\\t<h2>{{ t('settings', 'No users in here') }}</h2>\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t</div>\\n\\t\\t</InfiniteLoading>\\n\\t</div>\\n</template>\\n\\n<script>\\nimport { subscribe, unsubscribe } from '@nextcloud/event-bus'\\nimport InfiniteLoading from 'vue-infinite-loading'\\nimport Vue from 'vue'\\nimport NcModal from '@nextcloud/vue/dist/Components/NcModal'\\nimport NcButton from '@nextcloud/vue/dist/Components/NcButton'\\nimport NcMultiselect from '@nextcloud/vue/dist/Components/NcMultiselect'\\n\\nimport userRow from './UserList/UserRow'\\n\\nconst unlimitedQuota = {\\n\\tid: 'none',\\n\\tlabel: t('settings', 'Unlimited'),\\n}\\nconst defaultQuota = {\\n\\tid: 'default',\\n\\tlabel: t('settings', 'Default quota'),\\n}\\nconst newUser = {\\n\\tid: '',\\n\\tdisplayName: '',\\n\\tpassword: '',\\n\\tmailAddress: '',\\n\\tgroups: [],\\n\\tsubAdminsGroups: [],\\n\\tquota: defaultQuota,\\n\\tlanguage: {\\n\\t\\tcode: 'en',\\n\\t\\tname: t('settings', 'Default language'),\\n\\t},\\n}\\n\\nexport default {\\n\\tname: 'UserList',\\n\\tcomponents: {\\n\\t\\tNcModal,\\n\\t\\tuserRow,\\n\\t\\tNcMultiselect,\\n\\t\\tInfiniteLoading,\\n\\t\\tNcButton,\\n\\t},\\n\\tprops: {\\n\\t\\tusers: {\\n\\t\\t\\ttype: Array,\\n\\t\\t\\tdefault: () => [],\\n\\t\\t},\\n\\t\\tshowConfig: {\\n\\t\\t\\ttype: Object,\\n\\t\\t\\trequired: true,\\n\\t\\t},\\n\\t\\tselectedGroup: {\\n\\t\\t\\ttype: String,\\n\\t\\t\\tdefault: null,\\n\\t\\t},\\n\\t\\texternalActions: {\\n\\t\\t\\ttype: Array,\\n\\t\\t\\tdefault: () => [],\\n\\t\\t},\\n\\t},\\n\\tdata() {\\n\\t\\treturn {\\n\\t\\t\\tunlimitedQuota,\\n\\t\\t\\tdefaultQuota,\\n\\t\\t\\tloading: {\\n\\t\\t\\t\\tall: false,\\n\\t\\t\\t\\tgroups: false,\\n\\t\\t\\t},\\n\\t\\t\\tscrolled: false,\\n\\t\\t\\tsearchQuery: '',\\n\\t\\t\\tnewUser: Object.assign({}, newUser),\\n\\t\\t}\\n\\t},\\n\\tcomputed: {\\n\\t\\tsettings() {\\n\\t\\t\\treturn this.$store.getters.getServerData\\n\\t\\t},\\n\\t\\tselectedGroupDecoded() {\\n\\t\\t\\treturn decodeURIComponent(this.selectedGroup)\\n\\t\\t},\\n\\t\\tfilteredUsers() {\\n\\t\\t\\tif (this.selectedGroup === 'disabled') {\\n\\t\\t\\t\\treturn this.users.filter(user => user.enabled === false)\\n\\t\\t\\t}\\n\\t\\t\\tif (!this.settings.isAdmin) {\\n\\t\\t\\t\\t// we don't want subadmins to edit themselves\\n\\t\\t\\t\\treturn this.users.filter(user => user.enabled !== false)\\n\\t\\t\\t}\\n\\t\\t\\treturn this.users.filter(user => user.enabled !== false)\\n\\t\\t},\\n\\t\\tgroups() {\\n\\t\\t\\t// data provided php side + remove the disabled group\\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\\tcanAddGroups() {\\n\\t\\t\\t// disabled if no permission to add new users to group\\n\\t\\t\\treturn this.groups.map(group => {\\n\\t\\t\\t\\t// clone object because we don't want\\n\\t\\t\\t\\t// to edit the original groups\\n\\t\\t\\t\\tgroup = Object.assign({}, group)\\n\\t\\t\\t\\tgroup.$isDisabled = group.canAdd === false\\n\\t\\t\\t\\treturn group\\n\\t\\t\\t})\\n\\t\\t},\\n\\t\\tsubAdminsGroups() {\\n\\t\\t\\t// data provided php side\\n\\t\\t\\treturn this.$store.getters.getSubadminGroups\\n\\t\\t},\\n\\t\\tquotaOptions() {\\n\\t\\t\\t// convert the preset array into objects\\n\\t\\t\\tconst quotaPreset = this.settings.quotaPreset.reduce((acc, cur) => acc.concat({\\n\\t\\t\\t\\tid: cur,\\n\\t\\t\\t\\tlabel: cur,\\n\\t\\t\\t}), [])\\n\\t\\t\\t// add default presets\\n\\t\\t\\tif (this.settings.allowUnlimitedQuota) {\\n\\t\\t\\t\\tquotaPreset.unshift(this.unlimitedQuota)\\n\\t\\t\\t}\\n\\t\\t\\tquotaPreset.unshift(this.defaultQuota)\\n\\t\\t\\treturn quotaPreset\\n\\t\\t},\\n\\t\\tminPasswordLength() {\\n\\t\\t\\treturn this.$store.getters.getPasswordPolicyMinLength\\n\\t\\t},\\n\\t\\tusersOffset() {\\n\\t\\t\\treturn this.$store.getters.getUsersOffset\\n\\t\\t},\\n\\t\\tusersLimit() {\\n\\t\\t\\treturn this.$store.getters.getUsersLimit\\n\\t\\t},\\n\\t\\tusersCount() {\\n\\t\\t\\treturn this.users.length\\n\\t\\t},\\n\\n\\t\\t/* LANGUAGES */\\n\\t\\tlanguages() {\\n\\t\\t\\treturn [\\n\\t\\t\\t\\t{\\n\\t\\t\\t\\t\\tlabel: t('settings', 'Common languages'),\\n\\t\\t\\t\\t\\tlanguages: this.settings.languages.commonLanguages,\\n\\t\\t\\t\\t},\\n\\t\\t\\t\\t{\\n\\t\\t\\t\\t\\tlabel: t('settings', 'Other languages'),\\n\\t\\t\\t\\t\\tlanguages: this.settings.languages.otherLanguages,\\n\\t\\t\\t\\t},\\n\\t\\t\\t]\\n\\t\\t},\\n\\t\\tisDarkTheme() {\\n\\t\\t\\treturn window.getComputedStyle(this.$el)\\n\\t\\t\\t\\t.getPropertyValue('--background-invert-if-dark') === 'invert(100%)'\\n\\t\\t},\\n\\t},\\n\\twatch: {\\n\\t\\t// watch url change and group select\\n\\t\\tselectedGroup(val, old) {\\n\\t\\t\\t// if selected is the disabled group but it's empty\\n\\t\\t\\tthis.redirectIfDisabled()\\n\\t\\t\\tthis.$store.commit('resetUsers')\\n\\t\\t\\tthis.$refs.infiniteLoading.stateChanger.reset()\\n\\t\\t\\tthis.setNewUserDefaultGroup(val)\\n\\t\\t},\\n\\n\\t\\t// make sure the infiniteLoading state is changed if we manually\\n\\t\\t// add/remove data from the store\\n\\t\\tusersCount(val, old) {\\n\\t\\t\\t// deleting the last user, reset the list\\n\\t\\t\\tif (val === 0 && old === 1) {\\n\\t\\t\\t\\tthis.$refs.infiniteLoading.stateChanger.reset()\\n\\t\\t\\t\\t// adding the first user, warn the infiniteLoader that\\n\\t\\t\\t\\t// the list is not empty anymore (we don't fetch the newly\\n\\t\\t\\t\\t// added user as we already have all the info we need)\\n\\t\\t\\t} else if (val === 1 && old === 0) {\\n\\t\\t\\t\\tthis.$refs.infiniteLoading.stateChanger.loaded()\\n\\t\\t\\t}\\n\\t\\t},\\n\\t},\\n\\n\\tmounted() {\\n\\t\\tif (!this.settings.canChangePassword) {\\n\\t\\t\\tOC.Notification.showTemporary(t('settings', 'Password change is disabled because the master key is disabled'))\\n\\t\\t}\\n\\n\\t\\t/**\\n\\t\\t * Reset and init new user form\\n\\t\\t */\\n\\t\\tthis.resetForm()\\n\\n\\t\\t/**\\n\\t\\t * Register search\\n\\t\\t */\\n\\t\\tsubscribe('nextcloud:unified-search.search', this.search)\\n\\t\\tsubscribe('nextcloud:unified-search.reset', this.resetSearch)\\n\\n\\t\\t/**\\n\\t\\t * If disabled group but empty, redirect\\n\\t\\t */\\n\\t\\tthis.redirectIfDisabled()\\n\\t},\\n\\tbeforeDestroy() {\\n\\t\\tunsubscribe('nextcloud:unified-search.search', this.search)\\n\\t\\tunsubscribe('nextcloud:unified-search.reset', this.resetSearch)\\n\\t},\\n\\n\\tmethods: {\\n\\t\\tonScroll(event) {\\n\\t\\t\\tthis.scrolled = event.target.scrollTo > 0\\n\\t\\t},\\n\\n\\t\\t/**\\n\\t\\t * Validate quota string to make sure it's a valid human file size\\n\\t\\t *\\n\\t\\t * @param {string} quota Quota in readable format '5 GB'\\n\\t\\t * @return {object}\\n\\t\\t */\\n\\t\\tvalidateQuota(quota) {\\n\\t\\t\\t// only used for new presets sent through @Tag\\n\\t\\t\\tconst validQuota = OC.Util.computerFileSize(quota)\\n\\t\\t\\tif (validQuota !== null && validQuota >= 0) {\\n\\t\\t\\t\\t// unify format output\\n\\t\\t\\t\\tquota = OC.Util.humanFileSize(OC.Util.computerFileSize(quota))\\n\\t\\t\\t\\tthis.newUser.quota = { id: quota, label: quota }\\n\\t\\t\\t\\treturn this.newUser.quota\\n\\t\\t\\t}\\n\\t\\t\\t// Default is unlimited\\n\\t\\t\\tthis.newUser.quota = this.quotaOptions[0]\\n\\t\\t\\treturn this.quotaOptions[0]\\n\\t\\t},\\n\\n\\t\\tinfiniteHandler($state) {\\n\\t\\t\\tthis.$store.dispatch('getUsers', {\\n\\t\\t\\t\\toffset: this.usersOffset,\\n\\t\\t\\t\\tlimit: this.usersLimit,\\n\\t\\t\\t\\tgroup: this.selectedGroup !== 'disabled' ? this.selectedGroup : '',\\n\\t\\t\\t\\tsearch: this.searchQuery,\\n\\t\\t\\t})\\n\\t\\t\\t\\t.then((usersCount) => {\\n\\t\\t\\t\\t\\tif (usersCount > 0) {\\n\\t\\t\\t\\t\\t\\t$state.loaded()\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\tif (usersCount < this.usersLimit) {\\n\\t\\t\\t\\t\\t\\t$state.complete()\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t})\\n\\t\\t},\\n\\n\\t\\t/* SEARCH */\\n\\t\\tsearch({ query }) {\\n\\t\\t\\tthis.searchQuery = query\\n\\t\\t\\tthis.$store.commit('resetUsers')\\n\\t\\t\\tthis.$refs.infiniteLoading.stateChanger.reset()\\n\\t\\t},\\n\\t\\tresetSearch() {\\n\\t\\t\\tthis.search({ query: '' })\\n\\t\\t},\\n\\n\\t\\tresetForm() {\\n\\t\\t\\t// revert form to original state\\n\\t\\t\\tthis.newUser = Object.assign({}, newUser)\\n\\n\\t\\t\\t/**\\n\\t\\t\\t * Init default language from server data. The use of this.settings\\n\\t\\t\\t * requires a computed variable, which break the v-model binding of the form,\\n\\t\\t\\t * this is a much easier solution than getter and setter on a computed var\\n\\t\\t\\t */\\n\\t\\t\\tif (this.settings.defaultLanguage) {\\n\\t\\t\\t\\tVue.set(this.newUser.language, 'code', this.settings.defaultLanguage)\\n\\t\\t\\t}\\n\\n\\t\\t\\t/**\\n\\t\\t\\t * In case the user directly loaded the user list within a group\\n\\t\\t\\t * the watch won't be triggered. We need to initialize it.\\n\\t\\t\\t */\\n\\t\\t\\tthis.setNewUserDefaultGroup(this.selectedGroup)\\n\\n\\t\\t\\tthis.loading.all = false\\n\\t\\t},\\n\\t\\tcreateUser() {\\n\\t\\t\\tthis.loading.all = true\\n\\t\\t\\tthis.$store.dispatch('addUser', {\\n\\t\\t\\t\\tuserid: this.newUser.id,\\n\\t\\t\\t\\tpassword: this.newUser.password,\\n\\t\\t\\t\\tdisplayName: this.newUser.displayName,\\n\\t\\t\\t\\temail: this.newUser.mailAddress,\\n\\t\\t\\t\\tgroups: this.newUser.groups.map(group => group.id),\\n\\t\\t\\t\\tsubadmin: this.newUser.subAdminsGroups.map(group => group.id),\\n\\t\\t\\t\\tquota: this.newUser.quota.id,\\n\\t\\t\\t\\tlanguage: this.newUser.language.code,\\n\\t\\t\\t})\\n\\t\\t\\t\\t.then(() => {\\n\\t\\t\\t\\t\\tthis.resetForm()\\n\\t\\t\\t\\t\\tthis.$refs.newusername.focus()\\n\\t\\t\\t\\t\\tthis.closeModal()\\n\\t\\t\\t\\t})\\n\\t\\t\\t\\t.catch((error) => {\\n\\t\\t\\t\\t\\tthis.loading.all = false\\n\\t\\t\\t\\t\\tif (error.response && error.response.data && error.response.data.ocs && error.response.data.ocs.meta) {\\n\\t\\t\\t\\t\\t\\tconst statuscode = error.response.data.ocs.meta.statuscode\\n\\t\\t\\t\\t\\t\\tif (statuscode === 102) {\\n\\t\\t\\t\\t\\t\\t\\t// wrong username\\n\\t\\t\\t\\t\\t\\t\\tthis.$refs.newusername.focus()\\n\\t\\t\\t\\t\\t\\t} else if (statuscode === 107) {\\n\\t\\t\\t\\t\\t\\t\\t// wrong password\\n\\t\\t\\t\\t\\t\\t\\tthis.$refs.newuserpassword.focus()\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t})\\n\\t\\t},\\n\\t\\tsetNewUserDefaultGroup(value) {\\n\\t\\t\\tif (value && value.length > 0) {\\n\\t\\t\\t\\t// setting new user default group to the current selected one\\n\\t\\t\\t\\tconst currentGroup = this.groups.find(group => group.id === value)\\n\\t\\t\\t\\tif (currentGroup) {\\n\\t\\t\\t\\t\\tthis.newUser.groups = [currentGroup]\\n\\t\\t\\t\\t\\treturn\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t\\t// fallback, empty selected group\\n\\t\\t\\tthis.newUser.groups = []\\n\\t\\t},\\n\\n\\t\\t/**\\n\\t\\t * Create a new group\\n\\t\\t *\\n\\t\\t * @param {string} gid Group id\\n\\t\\t * @return {Promise}\\n\\t\\t */\\n\\t\\tcreateGroup(gid) {\\n\\t\\t\\tthis.loading.groups = true\\n\\t\\t\\tthis.$store.dispatch('addGroup', gid)\\n\\t\\t\\t\\t.then((group) => {\\n\\t\\t\\t\\t\\tthis.newUser.groups.push(this.groups.find(group => group.id === gid))\\n\\t\\t\\t\\t\\tthis.loading.groups = false\\n\\t\\t\\t\\t})\\n\\t\\t\\t\\t.catch(() => {\\n\\t\\t\\t\\t\\tthis.loading.groups = false\\n\\t\\t\\t\\t})\\n\\t\\t\\treturn this.$store.getters.getGroups[this.groups.length]\\n\\t\\t},\\n\\n\\t\\t/**\\n\\t\\t * If the selected group is the disabled group but the count is 0\\n\\t\\t * redirect to the all users page.\\n\\t\\t * we only check for 0 because we don't have the count on ldap\\n\\t\\t * and we therefore set the usercount to -1 in this specific case\\n\\t\\t */\\n\\t\\tredirectIfDisabled() {\\n\\t\\t\\tconst allGroups = this.$store.getters.getGroups\\n\\t\\t\\tif (this.selectedGroup === 'disabled'\\n\\t\\t\\t\\t\\t\\t&& allGroups.findIndex(group => group.id === 'disabled' && group.usercount === 0) > -1) {\\n\\t\\t\\t\\t// disabled group is empty, redirection to all users\\n\\t\\t\\t\\tthis.$router.push({ name: 'users' })\\n\\t\\t\\t\\tthis.$refs.infiniteLoading.stateChanger.reset()\\n\\t\\t\\t}\\n\\t\\t},\\n\\t\\tcloseModal() {\\n\\t\\t\\t// eslint-disable-next-line vue/no-mutating-props\\n\\t\\t\\tthis.showConfig.showNewUserForm = false\\n\\t\\t},\\n\\t},\\n}\\n</script>\\n<style scoped>\\n\\t.modal-wrapper {\\n\\t\\tmargin: 2vh 0;\\n\\t\\talign-items: flex-start;\\n\\t}\\n\\t.modal__content {\\n\\t\\tdisplay: flex;\\n\\t\\tpadding: 20px;\\n\\t\\tflex-direction: column;\\n\\t\\talign-items: center;\\n\\t\\ttext-align: center;\\n\\t}\\n\\t.modal__item {\\n\\t\\tmargin-bottom: 16px;\\n\\t\\twidth: 100%;\\n\\t}\\n\\t.modal__item:not(:focus):not(:active) {\\n\\t\\tborder-color: var(--color-border-dark);\\n\\t}\\n\\t.modal__item::v-deep .multiselect {\\n\\t\\twidth: 100%;\\n\\t}\\n\\t.user-actions {\\n\\t\\tmargin-top: 20px;\\n\\t}\\n\\t.modal__content::v-deep .multiselect__single {\\n\\t\\ttext-align: left;\\n\\t\\tbox-sizing: border-box;\\n\\t}\\n\\t.modal__content::v-deep .multiselect__content-wrapper {\\n\\t\\tbox-sizing: border-box;\\n\\t}\\n\\t.row::v-deep .multiselect__single {\\n\\t\\tz-index: auto !important;\\n\\t}\\n\\n\\t/* fake input for groups validation */\\n\\tinput#newgroups {\\n\\t\\tposition: absolute;\\n\\t\\topacity: 0;\\n\\t\\t/* The \\\"hidden\\\" input is behind the Multiselect, so in general it does\\n\\t\\t * not receives clicks. However, with Firefox, after the validation\\n\\t\\t * fails, it will receive the first click done on it, so its width needs\\n\\t\\t * to be set to 0 to prevent that (\\\"pointer-events: none\\\" does not\\n\\t\\t * prevent it). */\\n\\t\\twidth: 0;\\n\\t}\\n</style>\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('NcContent',{attrs:{\"app-name\":\"settings\",\"navigation-class\":{ 'icon-loading': _vm.loadingAddGroup }}},[_c('NcAppNavigation',{scopedSlots:_vm._u([{key:\"list\",fn:function(){return [_c('NcAppNavigationItem',{ref:\"addGroup\",attrs:{\"id\":\"addgroup\",\"edit-placeholder\":_vm.t('settings', 'Enter group name'),\"editable\":true,\"loading\":_vm.loadingAddGroup,\"title\":_vm.t('settings', 'Add group'),\"icon\":\"icon-add\"},on:{\"click\":_vm.showAddGroupForm,\"update:title\":_vm.createGroup}}),_vm._v(\" \"),_c('NcAppNavigationItem',{attrs:{\"id\":\"everyone\",\"exact\":true,\"title\":_vm.t('settings', 'Active users'),\"to\":{ name: 'users' },\"icon\":\"icon-contacts-dark\"}},[(_vm.userCount > 0)?_c('NcAppNavigationCounter',{attrs:{\"slot\":\"counter\"},slot:\"counter\"},[_vm._v(\"\\n\\t\\t\\t\\t\\t\"+_vm._s(_vm.userCount)+\"\\n\\t\\t\\t\\t\")]):_vm._e()],1),_vm._v(\" \"),(_vm.settings.isAdmin)?_c('NcAppNavigationItem',{attrs:{\"id\":\"admin\",\"exact\":true,\"title\":_vm.t('settings', 'Admins'),\"to\":{ name: 'group', params: { selectedGroup: 'admin' } },\"icon\":\"icon-user-admin\"}},[(_vm.adminGroupMenu.count)?_c('NcAppNavigationCounter',{attrs:{\"slot\":\"counter\"},slot:\"counter\"},[_vm._v(\"\\n\\t\\t\\t\\t\\t\"+_vm._s(_vm.adminGroupMenu.count)+\"\\n\\t\\t\\t\\t\")]):_vm._e()],1):_vm._e(),_vm._v(\" \"),(_vm.disabledGroupMenu.usercount > 0 || _vm.disabledGroupMenu.usercount === -1)?_c('NcAppNavigationItem',{attrs:{\"id\":\"disabled\",\"exact\":true,\"title\":_vm.t('settings', 'Disabled users'),\"to\":{ name: 'group', params: { selectedGroup: 'disabled' } },\"icon\":\"icon-disabled-users\"}},[(_vm.disabledGroupMenu.usercount > 0)?_c('NcAppNavigationCounter',{attrs:{\"slot\":\"counter\"},slot:\"counter\"},[_vm._v(\"\\n\\t\\t\\t\\t\\t\"+_vm._s(_vm.disabledGroupMenu.usercount)+\"\\n\\t\\t\\t\\t\")]):_vm._e()],1):_vm._e(),_vm._v(\" \"),(_vm.groupList.length > 0)?_c('NcAppNavigationCaption',{attrs:{\"title\":_vm.t('settings', 'Groups')}}):_vm._e(),_vm._v(\" \"),_vm._l((_vm.groupList),function(group){return _c('GroupListItem',{key:group.id,attrs:{\"id\":group.id,\"title\":group.title,\"count\":group.count}})})]},proxy:true},{key:\"footer\",fn:function(){return [_c('NcAppNavigationSettings',[_c('div',[_c('p',[_vm._v(_vm._s(_vm.t('settings', 'Default quota:')))]),_vm._v(\" \"),_c('NcMultiselect',{attrs:{\"value\":_vm.defaultQuota,\"options\":_vm.quotaOptions,\"tag-placeholder\":\"create\",\"placeholder\":_vm.t('settings', 'Select default quota'),\"label\":\"label\",\"track-by\":\"id\",\"allow-empty\":false,\"taggable\":true},on:{\"tag\":_vm.validateQuota,\"input\":_vm.setDefaultQuota}})],1),_vm._v(\" \"),_c('div',[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.showLanguages),expression:\"showLanguages\"}],staticClass:\"checkbox\",attrs:{\"id\":\"showLanguages\",\"type\":\"checkbox\"},domProps:{\"checked\":Array.isArray(_vm.showLanguages)?_vm._i(_vm.showLanguages,null)>-1:(_vm.showLanguages)},on:{\"change\":function($event){var $$a=_vm.showLanguages,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=null,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.showLanguages=$$a.concat([$$v]))}else{$$i>-1&&(_vm.showLanguages=$$a.slice(0,$$i).concat($$a.slice($$i+1)))}}else{_vm.showLanguages=$$c}}}}),_vm._v(\" \"),_c('label',{attrs:{\"for\":\"showLanguages\"}},[_vm._v(_vm._s(_vm.t('settings', 'Show Languages')))])]),_vm._v(\" \"),_c('div',[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.showLastLogin),expression:\"showLastLogin\"}],staticClass:\"checkbox\",attrs:{\"id\":\"showLastLogin\",\"type\":\"checkbox\"},domProps:{\"checked\":Array.isArray(_vm.showLastLogin)?_vm._i(_vm.showLastLogin,null)>-1:(_vm.showLastLogin)},on:{\"change\":function($event){var $$a=_vm.showLastLogin,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=null,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.showLastLogin=$$a.concat([$$v]))}else{$$i>-1&&(_vm.showLastLogin=$$a.slice(0,$$i).concat($$a.slice($$i+1)))}}else{_vm.showLastLogin=$$c}}}}),_vm._v(\" \"),_c('label',{attrs:{\"for\":\"showLastLogin\"}},[_vm._v(_vm._s(_vm.t('settings', 'Show last login')))])]),_vm._v(\" \"),_c('div',[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.showUserBackend),expression:\"showUserBackend\"}],staticClass:\"checkbox\",attrs:{\"id\":\"showUserBackend\",\"type\":\"checkbox\"},domProps:{\"checked\":Array.isArray(_vm.showUserBackend)?_vm._i(_vm.showUserBackend,null)>-1:(_vm.showUserBackend)},on:{\"change\":function($event){var $$a=_vm.showUserBackend,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=null,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.showUserBackend=$$a.concat([$$v]))}else{$$i>-1&&(_vm.showUserBackend=$$a.slice(0,$$i).concat($$a.slice($$i+1)))}}else{_vm.showUserBackend=$$c}}}}),_vm._v(\" \"),_c('label',{attrs:{\"for\":\"showUserBackend\"}},[_vm._v(_vm._s(_vm.t('settings', 'Show user backend')))])]),_vm._v(\" \"),_c('div',[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.showStoragePath),expression:\"showStoragePath\"}],staticClass:\"checkbox\",attrs:{\"id\":\"showStoragePath\",\"type\":\"checkbox\"},domProps:{\"checked\":Array.isArray(_vm.showStoragePath)?_vm._i(_vm.showStoragePath,null)>-1:(_vm.showStoragePath)},on:{\"change\":function($event){var $$a=_vm.showStoragePath,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=null,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.showStoragePath=$$a.concat([$$v]))}else{$$i>-1&&(_vm.showStoragePath=$$a.slice(0,$$i).concat($$a.slice($$i+1)))}}else{_vm.showStoragePath=$$c}}}}),_vm._v(\" \"),_c('label',{attrs:{\"for\":\"showStoragePath\"}},[_vm._v(_vm._s(_vm.t('settings', 'Show storage path')))])]),_vm._v(\" \"),_c('div',[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.sendWelcomeMail),expression:\"sendWelcomeMail\"}],staticClass:\"checkbox\",attrs:{\"id\":\"sendWelcomeMail\",\"disabled\":_vm.loadingSendMail,\"type\":\"checkbox\"},domProps:{\"checked\":Array.isArray(_vm.sendWelcomeMail)?_vm._i(_vm.sendWelcomeMail,null)>-1:(_vm.sendWelcomeMail)},on:{\"change\":function($event){var $$a=_vm.sendWelcomeMail,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=null,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.sendWelcomeMail=$$a.concat([$$v]))}else{$$i>-1&&(_vm.sendWelcomeMail=$$a.slice(0,$$i).concat($$a.slice($$i+1)))}}else{_vm.sendWelcomeMail=$$c}}}}),_vm._v(\" \"),_c('label',{attrs:{\"for\":\"sendWelcomeMail\"}},[_vm._v(_vm._s(_vm.t('settings', 'Send email to new user')))])])])]},proxy:true}])},[_c('NcAppNavigationNew',{attrs:{\"button-id\":\"new-user-button\",\"text\":_vm.t('settings','New user'),\"button-class\":\"icon-add\"},on:{\"click\":_vm.showNewUserMenu,\"keyup\":[function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"enter\",13,$event.key,\"Enter\")){ return null; }return _vm.showNewUserMenu.apply(null, arguments)},function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"space\",32,$event.key,[\" \",\"Spacebar\"])){ return null; }return _vm.showNewUserMenu.apply(null, arguments)}]}})],1),_vm._v(\" \"),_c('NcAppContent',[_c('UserList',{attrs:{\"users\":_vm.users,\"show-config\":_vm.showConfig,\"selected-group\":_vm.selectedGroupDecoded,\"external-actions\":_vm.externalActions}})],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<!--\n - @copyright Copyright (c) 2021 Martin Jänel <spammemore@posteo.de>\n -\n - @author Martin Jänel <spammemore@posteo.de>\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<NcAppNavigationItem :key=\"id\"\n\t\t:exact=\"true\"\n\t\t:title=\"title\"\n\t\t:to=\"{ name: 'group', params: { selectedGroup: encodeURIComponent(id) } }\"\n\t\ticon=\"icon-group\"\n\t\t:loading=\"loadingRenameGroup\"\n\t\t:menu-open=\"openGroupMenu\"\n\t\t@update:menuOpen=\"handleGroupMenuOpen\">\n\t\t<template #counter>\n\t\t\t<NcCounterBubble v-if=\"count\">\n\t\t\t\t{{ count }}\n\t\t\t</NcCounterBubble>\n\t\t</template>\n\t\t<template #actions>\n\t\t\t<NcActionInput v-if=\"id !== 'admin' && id !== 'disabled' && settings.isAdmin\"\n\t\t\t\tref=\"displayNameInput\"\n\t\t\t\ticon=\"icon-edit\"\n\t\t\t\ttype=\"text\"\n\t\t\t\t:value=\"title\"\n\t\t\t\t@submit=\"renameGroup(id)\">\n\t\t\t\t{{ t('settings', 'Rename group') }}\n\t\t\t</NcActionInput>\n\t\t\t<NcActionButton v-if=\"id !== 'admin' && id !== 'disabled' && settings.isAdmin\"\n\t\t\t\ticon=\"icon-delete\"\n\t\t\t\t@click=\"removeGroup(id)\">\n\t\t\t\t{{ t('settings', 'Remove group') }}\n\t\t\t</NcActionButton>\n\t\t</template>\n\t</NcAppNavigationItem>\n</template>\n\n<script>\nimport NcActionInput from '@nextcloud/vue/dist/Components/NcActionInput'\nimport NcActionButton from '@nextcloud/vue/dist/Components/NcActionButton'\nimport NcCounterBubble from '@nextcloud/vue/dist/Components/NcCounterBubble'\nimport NcAppNavigationItem from '@nextcloud/vue/dist/Components/NcAppNavigationItem'\n\nexport default {\n\tname: 'GroupListItem',\n\tcomponents: {\n\t\tNcActionInput,\n\t\tNcActionButton,\n\t\tNcCounterBubble,\n\t\tNcAppNavigationItem,\n\t},\n\tprops: {\n\t\tid: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t},\n\t\ttitle: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t},\n\t\tcount: {\n\t\t\ttype: Number,\n\t\t\trequired: false,\n\t\t},\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tloadingRenameGroup: false,\n\t\t\topenGroupMenu: false,\n\t\t}\n\t},\n\tcomputed: {\n\t\tsettings() {\n\t\t\treturn this.$store.getters.getServerData\n\t\t},\n\t},\n\tmethods: {\n\t\thandleGroupMenuOpen() {\n\t\t\tthis.openGroupMenu = true\n\t\t},\n\t\tasync renameGroup(gid) {\n\t\t\t// check if group id is valid\n\t\t\tif (gid.trim() === '') {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tconst displayName = this.$refs.displayNameInput.$el.querySelector('input[type=\"text\"]').value\n\n\t\t\t// check if group name is valid\n\t\t\tif (displayName.trim() === '') {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tthis.openGroupMenu = false\n\t\t\t\tthis.loadingRenameGroup = true\n\t\t\t\tawait this.$store.dispatch('renameGroup', {\n\t\t\t\t\tgroupid: gid.trim(),\n\t\t\t\t\tdisplayName: displayName.trim(),\n\t\t\t\t})\n\n\t\t\t\tthis.loadingRenameGroup = false\n\t\t\t} catch {\n\t\t\t\tthis.openGroupMenu = true\n\t\t\t\tthis.loadingRenameGroup = false\n\t\t\t}\n\t\t},\n\t\tremoveGroup(groupid) {\n\t\t\tconst self = this\n\t\t\t// TODO migrate to a vue js confirm dialog component\n\t\t\tOC.dialogs.confirm(\n\t\t\t\tt('settings', 'You are about to remove the group {group}. The users will NOT be deleted.', { group: groupid }),\n\t\t\t\tt('settings', 'Please confirm the group removal '),\n\t\t\t\tfunction(success) {\n\t\t\t\t\tif (success) {\n\t\t\t\t\t\tself.$store.dispatch('removeGroup', groupid)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t)\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!./GroupListItem.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!./GroupListItem.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./GroupListItem.vue?vue&type=template&id=03bc8784&\"\nimport script from \"./GroupListItem.vue?vue&type=script&lang=js&\"\nexport * from \"./GroupListItem.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('NcAppNavigationItem',{key:_vm.id,attrs:{\"exact\":true,\"title\":_vm.title,\"to\":{ name: 'group', params: { selectedGroup: encodeURIComponent(_vm.id) } },\"icon\":\"icon-group\",\"loading\":_vm.loadingRenameGroup,\"menu-open\":_vm.openGroupMenu},on:{\"update:menuOpen\":_vm.handleGroupMenuOpen},scopedSlots:_vm._u([{key:\"counter\",fn:function(){return [(_vm.count)?_c('NcCounterBubble',[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.count)+\"\\n\\t\\t\")]):_vm._e()]},proxy:true},{key:\"actions\",fn:function(){return [(_vm.id !== 'admin' && _vm.id !== 'disabled' && _vm.settings.isAdmin)?_c('NcActionInput',{ref:\"displayNameInput\",attrs:{\"icon\":\"icon-edit\",\"type\":\"text\",\"value\":_vm.title},on:{\"submit\":function($event){return _vm.renameGroup(_vm.id)}}},[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.t('settings', 'Rename group'))+\"\\n\\t\\t\")]):_vm._e(),_vm._v(\" \"),(_vm.id !== 'admin' && _vm.id !== 'disabled' && _vm.settings.isAdmin)?_c('NcActionButton',{attrs:{\"icon\":\"icon-delete\"},on:{\"click\":function($event){return _vm.removeGroup(_vm.id)}}},[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.t('settings', 'Remove group'))+\"\\n\\t\\t\")]):_vm._e()]},proxy:true}])})}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","/**\n * @copyright Copyright (c) 2019 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author Greta Doci <gretadoci@gmail.com>\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n * @author Roeland Jago Douma <roeland@famdouma.nl>\n *\n * @license AGPL-3.0-or-later\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\nimport { generateUrl } from '@nextcloud/router'\n\nexport default {\n\tprops: {\n\t\tuser: {\n\t\t\ttype: Object,\n\t\t\trequired: true,\n\t\t},\n\t\tsettings: {\n\t\t\ttype: Object,\n\t\t\tdefault: () => ({}),\n\t\t},\n\t\tgroups: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\t\tsubAdminsGroups: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\t\tquotaOptions: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\t\tshowConfig: {\n\t\t\ttype: Object,\n\t\t\tdefault: () => ({}),\n\t\t},\n\t\tlanguages: {\n\t\t\ttype: Array,\n\t\t\trequired: true,\n\t\t},\n\t\texternalActions: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\t},\n\tcomputed: {\n\t\t/* GROUPS MANAGEMENT */\n\t\tuserGroups() {\n\t\t\tconst userGroups = this.groups.filter(group => this.user.groups.includes(group.id))\n\t\t\treturn userGroups\n\t\t},\n\t\tuserSubAdminsGroups() {\n\t\t\tconst userSubAdminsGroups = this.subAdminsGroups.filter(group => this.user.subadmin.includes(group.id))\n\t\t\treturn userSubAdminsGroups\n\t\t},\n\t\tavailableGroups() {\n\t\t\treturn this.groups.map((group) => {\n\t\t\t\t// clone object because we don't want\n\t\t\t\t// to edit the original groups\n\t\t\t\tconst groupClone = Object.assign({}, group)\n\n\t\t\t\t// two settings here:\n\t\t\t\t// 1. user NOT in group but no permission to add\n\t\t\t\t// 2. user is in group but no permission to remove\n\t\t\t\tgroupClone.$isDisabled\n\t\t\t\t\t= (group.canAdd === false\n\t\t\t\t\t\t&& !this.user.groups.includes(group.id))\n\t\t\t\t\t|| (group.canRemove === false\n\t\t\t\t\t\t&& this.user.groups.includes(group.id))\n\t\t\t\treturn groupClone\n\t\t\t})\n\t\t},\n\n\t\t/* QUOTA MANAGEMENT */\n\t\tusedSpace() {\n\t\t\tif (this.user.quota.used) {\n\t\t\t\treturn t('settings', '{size} used', { size: OC.Util.humanFileSize(this.user.quota.used) })\n\t\t\t}\n\t\t\treturn t('settings', '{size} used', { size: OC.Util.humanFileSize(0) })\n\t\t},\n\t\tusedQuota() {\n\t\t\tlet quota = this.user.quota.quota\n\t\t\tif (quota > 0) {\n\t\t\t\tquota = Math.min(100, Math.round(this.user.quota.used / quota * 100))\n\t\t\t} else {\n\t\t\t\tconst usedInGB = this.user.quota.used / (10 * Math.pow(2, 30))\n\t\t\t\t// asymptotic curve approaching 50% at 10GB to visualize used stace with infinite quota\n\t\t\t\tquota = 95 * (1 - (1 / (usedInGB + 1)))\n\t\t\t}\n\t\t\treturn isNaN(quota) ? 0 : quota\n\t\t},\n\t\t// Mapping saved values to objects\n\t\tuserQuota() {\n\t\t\tif (this.user.quota.quota >= 0) {\n\t\t\t\t// if value is valid, let's map the quotaOptions or return custom quota\n\t\t\t\tconst humanQuota = OC.Util.humanFileSize(this.user.quota.quota)\n\t\t\t\tconst userQuota = this.quotaOptions.find(quota => quota.id === humanQuota)\n\t\t\t\treturn userQuota || { id: humanQuota, label: humanQuota }\n\t\t\t} else if (this.user.quota.quota === 'default') {\n\t\t\t\t// default quota is replaced by the proper value on load\n\t\t\t\treturn this.quotaOptions[0]\n\t\t\t}\n\t\t\treturn this.quotaOptions[1] // unlimited\n\t\t},\n\n\t\t/* PASSWORD POLICY? */\n\t\tminPasswordLength() {\n\t\t\treturn this.$store.getters.getPasswordPolicyMinLength\n\t\t},\n\n\t\t/* LANGUAGE */\n\t\tuserLanguage() {\n\t\t\tconst availableLanguages = this.languages[0].languages.concat(this.languages[1].languages)\n\t\t\tconst userLang = availableLanguages.find(lang => lang.code === this.user.language)\n\t\t\tif (typeof userLang !== 'object' && this.user.language !== '') {\n\t\t\t\treturn {\n\t\t\t\t\tcode: this.user.language,\n\t\t\t\t\tname: this.user.language,\n\t\t\t\t}\n\t\t\t} else if (this.user.language === '') {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\treturn userLang\n\t\t},\n\n\t\t/* LAST LOGIN */\n\t\tuserLastLoginTooltip() {\n\t\t\tif (this.user.lastLogin > 0) {\n\t\t\t\treturn OC.Util.formatDate(this.user.lastLogin)\n\t\t\t}\n\t\t\treturn ''\n\t\t},\n\t\tuserLastLogin() {\n\t\t\tif (this.user.lastLogin > 0) {\n\t\t\t\treturn OC.Util.relativeModifiedDate(this.user.lastLogin)\n\t\t\t}\n\t\t\treturn t('settings', 'Never')\n\t\t},\n\t},\n\tmethods: {\n\t\t/**\n\t\t * Generate avatar url\n\t\t *\n\t\t * @param {string} user The user name\n\t\t * @param {bool} isDarkTheme Whether the avatar should be the dark version\n\t\t * @return {string}\n\t\t */\n\t\tgenerateAvatar(user, isDarkTheme) {\n\t\t\tif (isDarkTheme) {\n\t\t\t\treturn generateUrl(\n\t\t\t\t\t'/avatar/{user}/64/dark?v={version}',\n\t\t\t\t\t{\n\t\t\t\t\t\tuser,\n\t\t\t\t\t\tversion: oc_userconfig.avatar.version,\n\t\t\t\t\t}\n\t\t\t\t)\n\t\t\t} else {\n\t\t\t\treturn generateUrl(\n\t\t\t\t\t'/avatar/{user}/64?v={version}',\n\t\t\t\t\t{\n\t\t\t\t\t\tuser,\n\t\t\t\t\t\tversion: oc_userconfig.avatar.version,\n\t\t\t\t\t}\n\t\t\t\t)\n\t\t\t}\n\t\t},\n\t},\n}\n","import mod from \"-!../../../../../node_modules/babel-loader/lib/index.js!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./UserRowSimple.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!./UserRowSimple.vue?vue&type=script&lang=js&\"","<template>\n\t<div class=\"row\"\n\t\t:class=\"{'disabled': loading.delete || loading.disable}\"\n\t\t:data-id=\"user.id\">\n\t\t<div class=\"avatar\" :class=\"{'icon-loading-small': loading.delete || loading.disable || loading.wipe}\">\n\t\t\t<img v-if=\"!loading.delete && !loading.disable && !loading.wipe\"\n\t\t\t\talt=\"\"\n\t\t\t\twidth=\"32\"\n\t\t\t\theight=\"32\"\n\t\t\t\t:src=\"generateAvatar(user.id, isDarkTheme)\" />\n\t\t</div>\n\t\t<!-- dirty hack to ellipsis on two lines -->\n\t\t<div class=\"name\">\n\t\t\t<div class=\"displayName subtitle\">\n\t\t\t\t<div v-tooltip=\"user.displayname.length > 20 ? user.displayname : ''\" class=\"cellText\">\n\t\t\t\t\t<strong>\n\t\t\t\t\t\t{{ user.displayname }}\n\t\t\t\t\t</strong>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t{{ user.id }}\n\t\t</div>\n\t\t<div />\n\t\t<div class=\"mailAddress\">\n\t\t\t<div v-tooltip=\"user.email !== null && user.email.length > 20 ? user.email : ''\" class=\"cellText\">\n\t\t\t\t{{ user.email }}\n\t\t\t</div>\n\t\t</div>\n\t\t<div class=\"groups\">\n\t\t\t{{ userGroupsLabels }}\n\t\t</div>\n\t\t<div v-if=\"subAdminsGroups.length > 0 && settings.isAdmin\" class=\"subAdminsGroups\">\n\t\t\t{{ userSubAdminsGroupsLabels }}\n\t\t</div>\n\t\t<div class=\"userQuota\">\n\t\t\t<div class=\"quota\">\n\t\t\t\t{{ userQuota }} ({{ usedSpace }})\n\t\t\t\t<progress class=\"quota-user-progress\"\n\t\t\t\t\t:class=\"{'warn': usedQuota > 80}\"\n\t\t\t\t\t:value=\"usedQuota\"\n\t\t\t\t\tmax=\"100\" />\n\t\t\t</div>\n\t\t</div>\n\t\t<div v-if=\"showConfig.showLanguages\" class=\"languages\">\n\t\t\t{{ userLanguage.name }}\n\t\t</div>\n\t\t<div v-if=\"showConfig.showUserBackend || showConfig.showStoragePath\" class=\"userBackend\">\n\t\t\t<div v-if=\"showConfig.showUserBackend\" class=\"userBackend\">\n\t\t\t\t{{ user.backend }}\n\t\t\t</div>\n\t\t\t<div v-if=\"showConfig.showStoragePath\" v-tooltip=\"user.storageLocation\" class=\"storageLocation subtitle\">\n\t\t\t\t{{ user.storageLocation }}\n\t\t\t</div>\n\t\t</div>\n\t\t<div v-if=\"showConfig.showLastLogin\" v-tooltip.auto=\"userLastLoginTooltip\" class=\"lastLogin\">\n\t\t\t{{ userLastLogin }}\n\t\t</div>\n\n\t\t<div class=\"userActions\">\n\t\t\t<div v-if=\"canEdit && !loading.all\" class=\"toggleUserActions\">\n\t\t\t\t<NcActions>\n\t\t\t\t\t<NcActionButton icon=\"icon-rename\" @click=\"toggleEdit\">\n\t\t\t\t\t\t{{ t('settings', 'Edit User') }}\n\t\t\t\t\t</NcActionButton>\n\t\t\t\t</NcActions>\n\t\t\t\t<div class=\"userPopoverMenuWrapper\">\n\t\t\t\t\t<button v-click-outside=\"hideMenu\"\n\t\t\t\t\t\tclass=\"icon-more\"\n\t\t\t\t\t\t:aria-label=\"t('settings', 'Toggle user actions menu')\"\n\t\t\t\t\t\t@click.prevent=\"toggleMenu\" />\n\t\t\t\t\t<div class=\"popovermenu\" :class=\"{ 'open': openedMenu }\" :aria-expanded=\"openedMenu\">\n\t\t\t\t\t\t<NcPopoverMenu :menu=\"userActions\" />\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div class=\"feedback\" :style=\"{opacity: feedbackMessage !== '' ? 1 : 0}\">\n\t\t\t\t<div class=\"icon-checkmark\" />\n\t\t\t\t{{ feedbackMessage }}\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</template>\n\n<script>\nimport NcPopoverMenu from '@nextcloud/vue/dist/Components/NcPopoverMenu'\nimport NcActions from '@nextcloud/vue/dist/Components/NcActions'\nimport NcActionButton from '@nextcloud/vue/dist/Components/NcActionButton'\nimport ClickOutside from 'vue-click-outside'\nimport { getCurrentUser } from '@nextcloud/auth'\nimport UserRowMixin from '../../mixins/UserRowMixin'\nexport default {\n\tname: 'UserRowSimple',\n\tcomponents: {\n\t\tNcPopoverMenu,\n\t\tNcActionButton,\n\t\tNcActions,\n\t},\n\tdirectives: {\n\t\tClickOutside,\n\t},\n\tmixins: [UserRowMixin],\n\tprops: {\n\t\tuser: {\n\t\t\ttype: Object,\n\t\t\trequired: true,\n\t\t},\n\t\tloading: {\n\t\t\ttype: Object,\n\t\t\trequired: true,\n\t\t},\n\t\tshowConfig: {\n\t\t\ttype: Object,\n\t\t\trequired: true,\n\t\t},\n\t\tuserActions: {\n\t\t\ttype: Array,\n\t\t\trequired: true,\n\t\t},\n\t\topenedMenu: {\n\t\t\ttype: Boolean,\n\t\t\trequired: true,\n\t\t},\n\t\tfeedbackMessage: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t},\n\t\tsubAdminsGroups: {\n\t\t\ttype: Array,\n\t\t\trequired: true,\n\t\t},\n\t\tsettings: {\n\t\t\ttype: Object,\n\t\t\trequired: true,\n\t\t},\n\t\tisDarkTheme: {\n\t\t\ttype: Boolean,\n\t\t\trequired: true,\n\t\t},\n\t},\n\tcomputed: {\n\t\tuserGroupsLabels() {\n\t\t\treturn this.userGroups\n\t\t\t\t.map(group => group.name)\n\t\t\t\t.join(', ')\n\t\t},\n\t\tuserSubAdminsGroupsLabels() {\n\t\t\treturn this.userSubAdminsGroups\n\t\t\t\t.map(group => group.name)\n\t\t\t\t.join(', ')\n\t\t},\n\t\tusedSpace() {\n\t\t\tif (this.user.quota.used) {\n\t\t\t\treturn t('settings', '{size} used', { size: OC.Util.humanFileSize(this.user.quota.used) })\n\t\t\t}\n\t\t\treturn t('settings', '{size} used', { size: OC.Util.humanFileSize(0) })\n\t\t},\n\t\tcanEdit() {\n\t\t\treturn getCurrentUser().uid !== this.user.id || this.settings.isAdmin\n\t\t},\n\t\tuserQuota() {\n\t\t\tlet quota = this.user.quota.quota\n\n\t\t\tif (quota === 'default') {\n\t\t\t\tquota = this.settings.defaultQuota\n\t\t\t\tif (quota !== 'none') {\n\t\t\t\t\t// convert to numeric value to match what the server would usually return\n\t\t\t\t\tquota = OC.Util.computerFileSize(quota)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// when the default quota is unlimited, the server returns -3 here, map it to \"none\"\n\t\t\tif (quota === 'none' || quota === -3) {\n\t\t\t\treturn t('settings', 'Unlimited')\n\t\t\t} else if (quota >= 0) {\n\t\t\t\treturn OC.Util.humanFileSize(quota)\n\t\t\t}\n\t\t\treturn OC.Util.humanFileSize(0)\n\t\t},\n\t},\n\tmethods: {\n\t\ttoggleMenu() {\n\t\t\tthis.$emit('update:openedMenu', !this.openedMenu)\n\t\t},\n\t\thideMenu() {\n\t\t\tthis.$emit('update:openedMenu', false)\n\t\t},\n\t\ttoggleEdit() {\n\t\t\tthis.$emit('update:editing', true)\n\t\t},\n\t},\n}\n</script>\n\n<style lang=\"scss\">\n\t.cellText {\n\t\toverflow: hidden;\n\t\ttext-overflow: ellipsis;\n\t\twhite-space: nowrap;\n}\n\t.icon-more {\n\t\tbackground-color: var(--color-main-background);\n\t\tborder: 0;\n\t}\n</style>\n","\n import API from \"!../../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../../node_modules/css-loader/dist/cjs.js!../../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../node_modules/sass-loader/dist/cjs.js!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./UserRowSimple.vue?vue&type=style&index=0&lang=scss&\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../../node_modules/css-loader/dist/cjs.js!../../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../node_modules/sass-loader/dist/cjs.js!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./UserRowSimple.vue?vue&type=style&index=0&lang=scss&\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./UserRowSimple.vue?vue&type=template&id=6bcca1e8&\"\nimport script from \"./UserRowSimple.vue?vue&type=script&lang=js&\"\nexport * from \"./UserRowSimple.vue?vue&type=script&lang=js&\"\nimport style0 from \"./UserRowSimple.vue?vue&type=style&index=0&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n 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',{staticClass:\"row\",class:{'disabled': _vm.loading.delete || _vm.loading.disable},attrs:{\"data-id\":_vm.user.id}},[_c('div',{staticClass:\"avatar\",class:{'icon-loading-small': _vm.loading.delete || _vm.loading.disable || _vm.loading.wipe}},[(!_vm.loading.delete && !_vm.loading.disable && !_vm.loading.wipe)?_c('img',{attrs:{\"alt\":\"\",\"width\":\"32\",\"height\":\"32\",\"src\":_vm.generateAvatar(_vm.user.id, _vm.isDarkTheme)}}):_vm._e()]),_vm._v(\" \"),_c('div',{staticClass:\"name\"},[_c('div',{staticClass:\"displayName subtitle\"},[_c('div',{directives:[{name:\"tooltip\",rawName:\"v-tooltip\",value:(_vm.user.displayname.length > 20 ? _vm.user.displayname : ''),expression:\"user.displayname.length > 20 ? user.displayname : ''\"}],staticClass:\"cellText\"},[_c('strong',[_vm._v(\"\\n\\t\\t\\t\\t\\t\"+_vm._s(_vm.user.displayname)+\"\\n\\t\\t\\t\\t\")])])]),_vm._v(\"\\n\\t\\t\"+_vm._s(_vm.user.id)+\"\\n\\t\")]),_vm._v(\" \"),_c('div'),_vm._v(\" \"),_c('div',{staticClass:\"mailAddress\"},[_c('div',{directives:[{name:\"tooltip\",rawName:\"v-tooltip\",value:(_vm.user.email !== null && _vm.user.email.length > 20 ? _vm.user.email : ''),expression:\"user.email !== null && user.email.length > 20 ? user.email : ''\"}],staticClass:\"cellText\"},[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.user.email)+\"\\n\\t\\t\")])]),_vm._v(\" \"),_c('div',{staticClass:\"groups\"},[_vm._v(\"\\n\\t\\t\"+_vm._s(_vm.userGroupsLabels)+\"\\n\\t\")]),_vm._v(\" \"),(_vm.subAdminsGroups.length > 0 && _vm.settings.isAdmin)?_c('div',{staticClass:\"subAdminsGroups\"},[_vm._v(\"\\n\\t\\t\"+_vm._s(_vm.userSubAdminsGroupsLabels)+\"\\n\\t\")]):_vm._e(),_vm._v(\" \"),_c('div',{staticClass:\"userQuota\"},[_c('div',{staticClass:\"quota\"},[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.userQuota)+\" (\"+_vm._s(_vm.usedSpace)+\")\\n\\t\\t\\t\"),_c('progress',{staticClass:\"quota-user-progress\",class:{'warn': _vm.usedQuota > 80},attrs:{\"max\":\"100\"},domProps:{\"value\":_vm.usedQuota}})])]),_vm._v(\" \"),(_vm.showConfig.showLanguages)?_c('div',{staticClass:\"languages\"},[_vm._v(\"\\n\\t\\t\"+_vm._s(_vm.userLanguage.name)+\"\\n\\t\")]):_vm._e(),_vm._v(\" \"),(_vm.showConfig.showUserBackend || _vm.showConfig.showStoragePath)?_c('div',{staticClass:\"userBackend\"},[(_vm.showConfig.showUserBackend)?_c('div',{staticClass:\"userBackend\"},[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.user.backend)+\"\\n\\t\\t\")]):_vm._e(),_vm._v(\" \"),(_vm.showConfig.showStoragePath)?_c('div',{directives:[{name:\"tooltip\",rawName:\"v-tooltip\",value:(_vm.user.storageLocation),expression:\"user.storageLocation\"}],staticClass:\"storageLocation subtitle\"},[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.user.storageLocation)+\"\\n\\t\\t\")]):_vm._e()]):_vm._e(),_vm._v(\" \"),(_vm.showConfig.showLastLogin)?_c('div',{directives:[{name:\"tooltip\",rawName:\"v-tooltip.auto\",value:(_vm.userLastLoginTooltip),expression:\"userLastLoginTooltip\",modifiers:{\"auto\":true}}],staticClass:\"lastLogin\"},[_vm._v(\"\\n\\t\\t\"+_vm._s(_vm.userLastLogin)+\"\\n\\t\")]):_vm._e(),_vm._v(\" \"),_c('div',{staticClass:\"userActions\"},[(_vm.canEdit && !_vm.loading.all)?_c('div',{staticClass:\"toggleUserActions\"},[_c('NcActions',[_c('NcActionButton',{attrs:{\"icon\":\"icon-rename\"},on:{\"click\":_vm.toggleEdit}},[_vm._v(\"\\n\\t\\t\\t\\t\\t\"+_vm._s(_vm.t('settings', 'Edit User'))+\"\\n\\t\\t\\t\\t\")])],1),_vm._v(\" \"),_c('div',{staticClass:\"userPopoverMenuWrapper\"},[_c('button',{directives:[{name:\"click-outside\",rawName:\"v-click-outside\",value:(_vm.hideMenu),expression:\"hideMenu\"}],staticClass:\"icon-more\",attrs:{\"aria-label\":_vm.t('settings', 'Toggle user actions menu')},on:{\"click\":function($event){$event.preventDefault();return _vm.toggleMenu.apply(null, arguments)}}}),_vm._v(\" \"),_c('div',{staticClass:\"popovermenu\",class:{ 'open': _vm.openedMenu },attrs:{\"aria-expanded\":_vm.openedMenu}},[_c('NcPopoverMenu',{attrs:{\"menu\":_vm.userActions}})],1)])],1):_vm._e(),_vm._v(\" \"),_c('div',{staticClass:\"feedback\",style:({opacity: _vm.feedbackMessage !== '' ? 1 : 0})},[_c('div',{staticClass:\"icon-checkmark\"}),_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.feedbackMessage)+\"\\n\\t\\t\")])])])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<!--\n - @copyright Copyright (c) 2018 John Molakvoæ <skjnldsv@protonmail.com>\n - @copyright Copyright (c) 2019 Gary Kim <gary@garykim.dev>\n -\n - @author John Molakvoæ <skjnldsv@protonmail.com>\n - @author Gary Kim <gary@garykim.dev>\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<!-- Obfuscated user: Logged in user does not have permissions to see all of the data -->\n\t<div v-if=\"Object.keys(user).length ===1\" :data-id=\"user.id\" class=\"row\">\n\t\t<div :class=\"{'icon-loading-small': loading.delete || loading.disable || loading.wipe}\"\n\t\t\tclass=\"avatar\">\n\t\t\t<img v-if=\"!loading.delete && !loading.disable && !loading.wipe\"\n\t\t\t\t:src=\"generateAvatar(user.id, isDarkTheme)\"\n\t\t\t\talt=\"\"\n\t\t\t\theight=\"32\"\n\t\t\t\twidth=\"32\">\n\t\t</div>\n\t\t<div class=\"name\">\n\t\t\t{{ user.id }}\n\t\t</div>\n\t\t<div class=\"obfuscated\">\n\t\t\t{{ t('settings','You do not have permissions to see the details of this user') }}\n\t\t</div>\n\t</div>\n\n\t<!-- User full data -->\n\t<UserRowSimple v-else-if=\"!editing\"\n\t\t:editing.sync=\"editing\"\n\t\t:feedback-message=\"feedbackMessage\"\n\t\t:groups=\"groups\"\n\t\t:languages=\"languages\"\n\t\t:loading=\"loading\"\n\t\t:opened-menu.sync=\"openedMenu\"\n\t\t:settings=\"settings\"\n\t\t:show-config=\"showConfig\"\n\t\t:sub-admins-groups=\"subAdminsGroups\"\n\t\t:user-actions=\"userActions\"\n\t\t:user=\"user\"\n\t\t:is-dark-theme=\"isDarkTheme\"\n\t\t:class=\"{'row--menu-opened': openedMenu}\" />\n\t<div v-else\n\t\t:class=\"{\n\t\t\t'disabled': loading.delete || loading.disable,\n\t\t\t'row--menu-opened': openedMenu\n\t\t}\"\n\t\t:data-id=\"user.id\"\n\t\tclass=\"row row--editable\">\n\t\t<div :class=\"{'icon-loading-small': loading.delete || loading.disable || loading.wipe}\"\n\t\t\tclass=\"avatar\">\n\t\t\t<img v-if=\"!loading.delete && !loading.disable && !loading.wipe\"\n\t\t\t\t:src=\"generateAvatar(user.id, isDarkTheme)\"\n\t\t\t\talt=\"\"\n\t\t\t\theight=\"32\"\n\t\t\t\twidth=\"32\">\n\t\t</div>\n\t\t<!-- dirty hack to ellipsis on two lines -->\n\t\t<div v-if=\"user.backendCapabilities.setDisplayName\" class=\"displayName\">\n\t\t\t<form :class=\"{'icon-loading-small': loading.displayName}\"\n\t\t\t\tclass=\"displayName\"\n\t\t\t\t@submit.prevent=\"updateDisplayName\">\n\t\t\t\t<input :id=\"'displayName'+user.id+rand\"\n\t\t\t\t\tref=\"displayName\"\n\t\t\t\t\t:disabled=\"loading.displayName||loading.all\"\n\t\t\t\t\t:value=\"user.displayname\"\n\t\t\t\t\tautocapitalize=\"off\"\n\t\t\t\t\tautocomplete=\"off\"\n\t\t\t\t\tautocorrect=\"off\"\n\t\t\t\t\tspellcheck=\"false\"\n\t\t\t\t\ttype=\"text\">\n\t\t\t\t<input class=\"icon-confirm\"\n\t\t\t\t\ttype=\"submit\"\n\t\t\t\t\tvalue=\"\">\n\t\t\t</form>\n\t\t</div>\n\t\t<div v-else class=\"name\">\n\t\t\t{{ user.id }}\n\t\t\t<div class=\"displayName subtitle\">\n\t\t\t\t<div v-tooltip=\"user.displayname.length > 20 ? user.displayname : ''\" class=\"cellText\">\n\t\t\t\t\t{{ user.displayname }}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t\t<form v-if=\"settings.canChangePassword && user.backendCapabilities.setPassword\"\n\t\t\t:class=\"{'icon-loading-small': loading.password}\"\n\t\t\tclass=\"password\"\n\t\t\t@submit.prevent=\"updatePassword\">\n\t\t\t<input :id=\"'password'+user.id+rand\"\n\t\t\t\tref=\"password\"\n\t\t\t\t:disabled=\"loading.password || loading.all\"\n\t\t\t\t:minlength=\"minPasswordLength\"\n\t\t\t\tmaxlength=\"469\"\n\t\t\t\t:placeholder=\"t('settings', 'Add new password')\"\n\t\t\t\tautocapitalize=\"off\"\n\t\t\t\tautocomplete=\"new-password\"\n\t\t\t\tautocorrect=\"off\"\n\t\t\t\trequired\n\t\t\t\tspellcheck=\"false\"\n\t\t\t\ttype=\"password\"\n\t\t\t\tvalue=\"\">\n\t\t\t<input class=\"icon-confirm\" type=\"submit\" value=\"\">\n\t\t</form>\n\t\t<div v-else />\n\t\t<form :class=\"{'icon-loading-small': loading.mailAddress}\"\n\t\t\tclass=\"mailAddress\"\n\t\t\t@submit.prevent=\"updateEmail\">\n\t\t\t<input :id=\"'mailAddress'+user.id+rand\"\n\t\t\t\tref=\"mailAddress\"\n\t\t\t\t:disabled=\"loading.mailAddress||loading.all\"\n\t\t\t\t:placeholder=\"t('settings', 'Add new email address')\"\n\t\t\t\t:value=\"user.email\"\n\t\t\t\tautocapitalize=\"off\"\n\t\t\t\tautocomplete=\"new-password\"\n\t\t\t\tautocorrect=\"off\"\n\t\t\t\tspellcheck=\"false\"\n\t\t\t\ttype=\"email\">\n\t\t\t<input class=\"icon-confirm\" type=\"submit\" value=\"\">\n\t\t</form>\n\t\t<div :class=\"{'icon-loading-small': loading.groups}\" class=\"groups\">\n\t\t\t<NcMultiselect :close-on-select=\"false\"\n\t\t\t\t:disabled=\"loading.groups||loading.all\"\n\t\t\t\t:limit=\"2\"\n\t\t\t\t:multiple=\"true\"\n\t\t\t\t:options=\"availableGroups\"\n\t\t\t\t:placeholder=\"t('settings', 'Add user to group')\"\n\t\t\t\t:tag-width=\"60\"\n\t\t\t\t:taggable=\"settings.isAdmin\"\n\t\t\t\t:value=\"userGroups\"\n\t\t\t\tclass=\"multiselect-vue\"\n\t\t\t\tlabel=\"name\"\n\t\t\t\ttag-placeholder=\"create\"\n\t\t\t\ttrack-by=\"id\"\n\t\t\t\t@remove=\"removeUserGroup\"\n\t\t\t\t@select=\"addUserGroup\"\n\t\t\t\t@tag=\"createGroup\">\n\t\t\t\t<span slot=\"noResult\">{{ t('settings', 'No results') }}</span>\n\t\t\t</NcMultiselect>\n\t\t</div>\n\t\t<div v-if=\"subAdminsGroups.length>0 && settings.isAdmin\"\n\t\t\t:class=\"{'icon-loading-small': loading.subadmins}\"\n\t\t\tclass=\"subadmins\">\n\t\t\t<NcMultiselect :close-on-select=\"false\"\n\t\t\t\t:disabled=\"loading.subadmins||loading.all\"\n\t\t\t\t:limit=\"2\"\n\t\t\t\t:multiple=\"true\"\n\t\t\t\t:options=\"subAdminsGroups\"\n\t\t\t\t:placeholder=\"t('settings', 'Set user as admin for')\"\n\t\t\t\t:tag-width=\"60\"\n\t\t\t\t:value=\"userSubAdminsGroups\"\n\t\t\t\tclass=\"multiselect-vue\"\n\t\t\t\tlabel=\"name\"\n\t\t\t\ttrack-by=\"id\"\n\t\t\t\t@remove=\"removeUserSubAdmin\"\n\t\t\t\t@select=\"addUserSubAdmin\">\n\t\t\t\t<span slot=\"noResult\">{{ t('settings', 'No results') }}</span>\n\t\t\t</NcMultiselect>\n\t\t</div>\n\t\t<div v-tooltip.auto=\"usedSpace\"\n\t\t\t:class=\"{'icon-loading-small': loading.quota}\"\n\t\t\tclass=\"quota\">\n\t\t\t<NcMultiselect :allow-empty=\"false\"\n\t\t\t\t:disabled=\"loading.quota||loading.all\"\n\t\t\t\t:options=\"quotaOptions\"\n\t\t\t\t:placeholder=\"t('settings', 'Select user quota')\"\n\t\t\t\t:taggable=\"true\"\n\t\t\t\t:value=\"userQuota\"\n\t\t\t\tclass=\"multiselect-vue\"\n\t\t\t\tlabel=\"label\"\n\t\t\t\ttag-placeholder=\"create\"\n\t\t\t\ttrack-by=\"id\"\n\t\t\t\t@input=\"setUserQuota\"\n\t\t\t\t@tag=\"validateQuota\" />\n\t\t</div>\n\t\t<div v-if=\"showConfig.showLanguages\"\n\t\t\t:class=\"{'icon-loading-small': loading.languages}\"\n\t\t\tclass=\"languages\">\n\t\t\t<NcMultiselect :allow-empty=\"false\"\n\t\t\t\t:disabled=\"loading.languages||loading.all\"\n\t\t\t\t:options=\"languages\"\n\t\t\t\t:placeholder=\"t('settings', 'No language set')\"\n\t\t\t\t:value=\"userLanguage\"\n\t\t\t\tclass=\"multiselect-vue\"\n\t\t\t\tgroup-label=\"label\"\n\t\t\t\tgroup-values=\"languages\"\n\t\t\t\tlabel=\"name\"\n\t\t\t\ttrack-by=\"code\"\n\t\t\t\t@input=\"setUserLanguage\" />\n\t\t</div>\n\n\t\t<!-- don't show this on edit mode -->\n\t\t<div v-if=\"showConfig.showStoragePath || showConfig.showUserBackend\"\n\t\t\tclass=\"storageLocation\" />\n\t\t<div v-if=\"showConfig.showLastLogin\" />\n\n\t\t<div class=\"userActions\">\n\t\t\t<div v-if=\"!loading.all\"\n\t\t\t\tclass=\"toggleUserActions\">\n\t\t\t\t<NcActions>\n\t\t\t\t\t<NcActionButton icon=\"icon-checkmark\"\n\t\t\t\t\t\t@click=\"editing = false\">\n\t\t\t\t\t\t{{ t('settings', 'Done') }}\n\t\t\t\t\t</NcActionButton>\n\t\t\t\t</NcActions>\n\t\t\t\t<div v-click-outside=\"hideMenu\" class=\"userPopoverMenuWrapper\">\n\t\t\t\t\t<button class=\"icon-more\"\n\t\t\t\t\t\t@click.prevent=\"toggleMenu\" />\n\t\t\t\t\t<div :class=\"{ 'open': openedMenu }\" class=\"popovermenu\">\n\t\t\t\t\t\t<NcPopoverMenu :menu=\"userActions\" />\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div :style=\"{opacity: feedbackMessage !== '' ? 1 : 0}\"\n\t\t\t\tclass=\"feedback\">\n\t\t\t\t<div class=\"icon-checkmark\" />\n\t\t\t\t{{ feedbackMessage }}\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</template>\n\n<script>\nimport ClickOutside from 'vue-click-outside'\nimport Vue from 'vue'\nimport VTooltip from 'v-tooltip'\nimport {\n\tNcPopoverMenu,\n\tNcMultiselect,\n\tNcActions,\n\tNcActionButton,\n} from '@nextcloud/vue'\nimport UserRowSimple from './UserRowSimple'\nimport UserRowMixin from '../../mixins/UserRowMixin'\n\nVue.use(VTooltip)\n\nexport default {\n\tname: 'UserRow',\n\tcomponents: {\n\t\tUserRowSimple,\n\t\tNcPopoverMenu,\n\t\tNcActions,\n\t\tNcActionButton,\n\t\tNcMultiselect,\n\t},\n\tdirectives: {\n\t\tClickOutside,\n\t},\n\tmixins: [UserRowMixin],\n\tprops: {\n\t\tuser: {\n\t\t\ttype: Object,\n\t\t\trequired: true,\n\t\t},\n\t\tsettings: {\n\t\t\ttype: Object,\n\t\t\tdefault: () => ({}),\n\t\t},\n\t\tgroups: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\t\tsubAdminsGroups: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\t\tquotaOptions: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\t\tshowConfig: {\n\t\t\ttype: Object,\n\t\t\tdefault: () => ({}),\n\t\t},\n\t\tlanguages: {\n\t\t\ttype: Array,\n\t\t\trequired: true,\n\t\t},\n\t\texternalActions: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\t\tisDarkTheme: {\n\t\t\ttype: Boolean,\n\t\t\trequired: true,\n\t\t},\n\t},\n\tdata() {\n\t\treturn {\n\t\t\trand: parseInt(Math.random() * 1000),\n\t\t\topenedMenu: false,\n\t\t\tfeedbackMessage: '',\n\t\t\tediting: false,\n\t\t\tloading: {\n\t\t\t\tall: false,\n\t\t\t\tdisplayName: false,\n\t\t\t\tpassword: false,\n\t\t\t\tmailAddress: false,\n\t\t\t\tgroups: false,\n\t\t\t\tsubadmins: false,\n\t\t\t\tquota: false,\n\t\t\t\tdelete: false,\n\t\t\t\tdisable: false,\n\t\t\t\tlanguages: false,\n\t\t\t\twipe: false,\n\t\t\t},\n\t\t}\n\t},\n\tcomputed: {\n\t\t/* USER POPOVERMENU ACTIONS */\n\t\tuserActions() {\n\t\t\tconst actions = [\n\t\t\t\t{\n\t\t\t\t\ticon: 'icon-delete',\n\t\t\t\t\ttext: t('settings', 'Delete user'),\n\t\t\t\t\taction: this.deleteUser,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\ticon: 'icon-delete',\n\t\t\t\t\ttext: t('settings', 'Wipe all devices'),\n\t\t\t\t\taction: this.wipeUserDevices,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\ticon: this.user.enabled ? 'icon-close' : 'icon-add',\n\t\t\t\t\ttext: this.user.enabled ? t('settings', 'Disable user') : t('settings', 'Enable user'),\n\t\t\t\t\taction: this.enableDisableUser,\n\t\t\t\t},\n\t\t\t]\n\t\t\tif (this.user.email !== null && this.user.email !== '') {\n\t\t\t\tactions.push({\n\t\t\t\t\ticon: 'icon-mail',\n\t\t\t\t\ttext: t('settings', 'Resend welcome email'),\n\t\t\t\t\taction: this.sendWelcomeMail,\n\t\t\t\t})\n\t\t\t}\n\t\t\treturn actions.concat(this.externalActions)\n\t\t},\n\t},\n\n\tmethods: {\n\t\t/* MENU HANDLING */\n\t\ttoggleMenu() {\n\t\t\tthis.openedMenu = !this.openedMenu\n\t\t},\n\t\thideMenu() {\n\t\t\tthis.openedMenu = false\n\t\t},\n\n\t\twipeUserDevices() {\n\t\t\tconst userid = this.user.id\n\t\t\tOC.dialogs.confirmDestructive(\n\t\t\t\tt('settings', 'In case of lost device or exiting the organization, this can remotely wipe the Nextcloud data from all devices associated with {userid}. Only works if the devices are connected to the internet.', { userid }),\n\t\t\t\tt('settings', 'Remote wipe of devices'),\n\t\t\t\t{\n\t\t\t\t\ttype: OC.dialogs.YES_NO_BUTTONS,\n\t\t\t\t\tconfirm: t('settings', 'Wipe {userid}\\'s devices', { userid }),\n\t\t\t\t\tconfirmClasses: 'error',\n\t\t\t\t\tcancel: t('settings', 'Cancel'),\n\t\t\t\t},\n\t\t\t\t(result) => {\n\t\t\t\t\tif (result) {\n\t\t\t\t\t\tthis.loading.wipe = true\n\t\t\t\t\t\tthis.loading.all = true\n\t\t\t\t\t\tthis.$store.dispatch('wipeUserDevices', userid)\n\t\t\t\t\t\t\t.then(() => {\n\t\t\t\t\t\t\t\tthis.loading.wipe = false\n\t\t\t\t\t\t\t\tthis.loading.all = false\n\t\t\t\t\t\t\t})\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\ttrue\n\t\t\t)\n\t\t},\n\n\t\tdeleteUser() {\n\t\t\tconst userid = this.user.id\n\t\t\tOC.dialogs.confirmDestructive(\n\t\t\t\tt('settings', 'Fully delete {userid}\\'s account including all their personal files, app data, etc.', { userid }),\n\t\t\t\tt('settings', 'Account deletion'),\n\t\t\t\t{\n\t\t\t\t\ttype: OC.dialogs.YES_NO_BUTTONS,\n\t\t\t\t\tconfirm: t('settings', 'Delete {userid}\\'s account', { userid }),\n\t\t\t\t\tconfirmClasses: 'error',\n\t\t\t\t\tcancel: t('settings', 'Cancel'),\n\t\t\t\t},\n\t\t\t\t(result) => {\n\t\t\t\t\tif (result) {\n\t\t\t\t\t\tthis.loading.delete = true\n\t\t\t\t\t\tthis.loading.all = true\n\t\t\t\t\t\treturn this.$store.dispatch('deleteUser', userid)\n\t\t\t\t\t\t\t.then(() => {\n\t\t\t\t\t\t\t\tthis.loading.delete = false\n\t\t\t\t\t\t\t\tthis.loading.all = false\n\t\t\t\t\t\t\t})\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\ttrue\n\t\t\t)\n\t\t},\n\n\t\tenableDisableUser() {\n\t\t\tthis.loading.delete = true\n\t\t\tthis.loading.all = true\n\t\t\tconst userid = this.user.id\n\t\t\tconst enabled = !this.user.enabled\n\t\t\treturn this.$store.dispatch('enableDisableUser', {\n\t\t\t\tuserid,\n\t\t\t\tenabled,\n\t\t\t})\n\t\t\t\t.then(() => {\n\t\t\t\t\tthis.loading.delete = false\n\t\t\t\t\tthis.loading.all = false\n\t\t\t\t})\n\t\t},\n\n\t\t/**\n\t\t * Set user displayName\n\t\t *\n\t\t * @param {string} displayName The display name\n\t\t */\n\t\tupdateDisplayName() {\n\t\t\tconst displayName = this.$refs.displayName.value\n\t\t\tthis.loading.displayName = true\n\t\t\tthis.$store.dispatch('setUserData', {\n\t\t\t\tuserid: this.user.id,\n\t\t\t\tkey: 'displayname',\n\t\t\t\tvalue: displayName,\n\t\t\t}).then(() => {\n\t\t\t\tthis.loading.displayName = false\n\t\t\t\tthis.$refs.displayName.value = displayName\n\t\t\t})\n\t\t},\n\n\t\t/**\n\t\t * Set user password\n\t\t *\n\t\t * @param {string} password The email address\n\t\t */\n\t\tupdatePassword() {\n\t\t\tconst password = this.$refs.password.value\n\t\t\tthis.loading.password = true\n\t\t\tthis.$store.dispatch('setUserData', {\n\t\t\t\tuserid: this.user.id,\n\t\t\t\tkey: 'password',\n\t\t\t\tvalue: password,\n\t\t\t}).then(() => {\n\t\t\t\tthis.loading.password = false\n\t\t\t\tthis.$refs.password.value = '' // empty & show placeholder\n\t\t\t})\n\t\t},\n\n\t\t/**\n\t\t * Set user mailAddress\n\t\t *\n\t\t * @param {string} mailAddress The email address\n\t\t */\n\t\tupdateEmail() {\n\t\t\tconst mailAddress = this.$refs.mailAddress.value\n\t\t\tthis.loading.mailAddress = true\n\t\t\tthis.$store.dispatch('setUserData', {\n\t\t\t\tuserid: this.user.id,\n\t\t\t\tkey: 'email',\n\t\t\t\tvalue: mailAddress,\n\t\t\t}).then(() => {\n\t\t\t\tthis.loading.mailAddress = false\n\t\t\t\tthis.$refs.mailAddress.value = mailAddress\n\t\t\t})\n\t\t},\n\n\t\t/**\n\t\t * Create a new group and add user to it\n\t\t *\n\t\t * @param {string} gid Group id\n\t\t */\n\t\tasync createGroup(gid) {\n\t\t\tthis.loading = { groups: true, subadmins: true }\n\t\t\ttry {\n\t\t\t\tawait this.$store.dispatch('addGroup', gid)\n\t\t\t\tconst userid = this.user.id\n\t\t\t\tawait this.$store.dispatch('addUserGroup', { userid, gid })\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error(error)\n\t\t\t} finally {\n\t\t\t\tthis.loading = { groups: false, subadmins: false }\n\t\t\t}\n\t\t\treturn this.$store.getters.getGroups[this.groups.length]\n\t\t},\n\n\t\t/**\n\t\t * Add user to group\n\t\t *\n\t\t * @param {object} group Group object\n\t\t */\n\t\tasync addUserGroup(group) {\n\t\t\tif (group.canAdd === false) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tthis.loading.groups = true\n\t\t\tconst userid = this.user.id\n\t\t\tconst gid = group.id\n\t\t\ttry {\n\t\t\t\tawait this.$store.dispatch('addUserGroup', { userid, gid })\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error(error)\n\t\t\t} finally {\n\t\t\t\tthis.loading.groups = false\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Remove user from group\n\t\t *\n\t\t * @param {object} group Group object\n\t\t */\n\t\tasync removeUserGroup(group) {\n\t\t\tif (group.canRemove === false) {\n\t\t\t\treturn false\n\t\t\t}\n\n\t\t\tthis.loading.groups = true\n\t\t\tconst userid = this.user.id\n\t\t\tconst gid = group.id\n\n\t\t\ttry {\n\t\t\t\tawait this.$store.dispatch('removeUserGroup', {\n\t\t\t\t\tuserid,\n\t\t\t\t\tgid,\n\t\t\t\t})\n\t\t\t\tthis.loading.groups = false\n\t\t\t\t// remove user from current list if current list is the removed group\n\t\t\t\tif (this.$route.params.selectedGroup === gid) {\n\t\t\t\t\tthis.$store.commit('deleteUser', userid)\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\tthis.loading.groups = false\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Add user to group\n\t\t *\n\t\t * @param {object} group Group object\n\t\t */\n\t\tasync addUserSubAdmin(group) {\n\t\t\tthis.loading.subadmins = true\n\t\t\tconst userid = this.user.id\n\t\t\tconst gid = group.id\n\n\t\t\ttry {\n\t\t\t\tawait this.$store.dispatch('addUserSubAdmin', {\n\t\t\t\t\tuserid,\n\t\t\t\t\tgid,\n\t\t\t\t})\n\t\t\t\tthis.loading.subadmins = false\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error(error)\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Remove user from group\n\t\t *\n\t\t * @param {object} group Group object\n\t\t */\n\t\tasync removeUserSubAdmin(group) {\n\t\t\tthis.loading.subadmins = true\n\t\t\tconst userid = this.user.id\n\t\t\tconst gid = group.id\n\n\t\t\ttry {\n\t\t\t\tawait this.$store.dispatch('removeUserSubAdmin', {\n\t\t\t\t\tuserid,\n\t\t\t\t\tgid,\n\t\t\t\t})\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error(error)\n\t\t\t} finally {\n\t\t\t\tthis.loading.subadmins = false\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Dispatch quota set request\n\t\t *\n\t\t * @param {string | object} quota Quota in readable format '5 GB' or Object {id: '5 GB', label: '5GB'}\n\t\t * @return {string}\n\t\t */\n\t\tasync setUserQuota(quota = 'none') {\n\t\t\tthis.loading.quota = true\n\t\t\t// ensure we only send the preset id\n\t\t\tquota = quota.id ? quota.id : quota\n\n\t\t\ttry {\n\t\t\t\tawait this.$store.dispatch('setUserData', {\n\t\t\t\t\tuserid: this.user.id,\n\t\t\t\t\tkey: 'quota',\n\t\t\t\t\tvalue: quota,\n\t\t\t\t})\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error(error)\n\t\t\t} finally {\n\t\t\t\tthis.loading.quota = false\n\t\t\t}\n\t\t\treturn quota\n\t\t},\n\n\t\t/**\n\t\t * Validate quota string to make sure it's a valid human file size\n\t\t *\n\t\t * @param {string} quota Quota in readable format '5 GB'\n\t\t * @return {Promise|boolean}\n\t\t */\n\t\tvalidateQuota(quota) {\n\t\t\t// only used for new presets sent through @Tag\n\t\t\tconst validQuota = OC.Util.computerFileSize(quota)\n\t\t\tif (validQuota !== null && validQuota >= 0) {\n\t\t\t\t// unify format output\n\t\t\t\treturn this.setUserQuota(OC.Util.humanFileSize(OC.Util.computerFileSize(quota)))\n\t\t\t}\n\t\t\t// if no valid do not change\n\t\t\treturn false\n\t\t},\n\n\t\t/**\n\t\t * Dispatch language set request\n\t\t *\n\t\t * @param {object} lang language object {code:'en', name:'English'}\n\t\t * @return {object}\n\t\t */\n\t\tasync setUserLanguage(lang) {\n\t\t\tthis.loading.languages = true\n\t\t\t// ensure we only send the preset id\n\t\t\ttry {\n\t\t\t\tawait this.$store.dispatch('setUserData', {\n\t\t\t\t\tuserid: this.user.id,\n\t\t\t\t\tkey: 'language',\n\t\t\t\t\tvalue: lang.code,\n\t\t\t\t})\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error(error)\n\t\t\t} finally {\n\t\t\t\tthis.loading.languages = false\n\t\t\t}\n\t\t\treturn lang\n\t\t},\n\n\t\t/**\n\t\t * Dispatch new welcome mail request\n\t\t */\n\t\tsendWelcomeMail() {\n\t\t\tthis.loading.all = true\n\t\t\tthis.$store.dispatch('sendWelcomeMail', this.user.id)\n\t\t\t\t.then(success => {\n\t\t\t\t\tif (success) {\n\t\t\t\t\t\t// Show feedback to indicate the success\n\t\t\t\t\t\tthis.feedbackMessage = t('setting', 'Welcome mail sent!')\n\t\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\t\tthis.feedbackMessage = ''\n\t\t\t\t\t\t}, 2000)\n\t\t\t\t\t}\n\t\t\t\t\tthis.loading.all = false\n\t\t\t\t})\n\t\t},\n\n\t},\n}\n</script>\n<style scoped lang=\"scss\">\n\t// Force menu to be above other rows\n\t.row--menu-opened {\n\t\tz-index: 1 !important;\n\t}\n\t.row::v-deep .multiselect__single {\n\t\tz-index: auto !important;\n\t}\n</style>\n","import mod from \"-!../../../../../node_modules/babel-loader/lib/index.js!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./UserRow.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!./UserRow.vue?vue&type=script&lang=js&\"","\n import API from \"!../../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../../node_modules/css-loader/dist/cjs.js!../../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../node_modules/sass-loader/dist/cjs.js!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./UserRow.vue?vue&type=style&index=0&id=573e6411&scoped=true&lang=scss&\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../../node_modules/css-loader/dist/cjs.js!../../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../node_modules/sass-loader/dist/cjs.js!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./UserRow.vue?vue&type=style&index=0&id=573e6411&scoped=true&lang=scss&\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./UserRow.vue?vue&type=template&id=573e6411&scoped=true&\"\nimport script from \"./UserRow.vue?vue&type=script&lang=js&\"\nexport * from \"./UserRow.vue?vue&type=script&lang=js&\"\nimport style0 from \"./UserRow.vue?vue&type=style&index=0&id=573e6411&scoped=true&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"573e6411\",\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 (Object.keys(_vm.user).length ===1)?_c('div',{staticClass:\"row\",attrs:{\"data-id\":_vm.user.id}},[_c('div',{staticClass:\"avatar\",class:{'icon-loading-small': _vm.loading.delete || _vm.loading.disable || _vm.loading.wipe}},[(!_vm.loading.delete && !_vm.loading.disable && !_vm.loading.wipe)?_c('img',{attrs:{\"src\":_vm.generateAvatar(_vm.user.id, _vm.isDarkTheme),\"alt\":\"\",\"height\":\"32\",\"width\":\"32\"}}):_vm._e()]),_vm._v(\" \"),_c('div',{staticClass:\"name\"},[_vm._v(\"\\n\\t\\t\"+_vm._s(_vm.user.id)+\"\\n\\t\")]),_vm._v(\" \"),_c('div',{staticClass:\"obfuscated\"},[_vm._v(\"\\n\\t\\t\"+_vm._s(_vm.t('settings','You do not have permissions to see the details of this user'))+\"\\n\\t\")])]):(!_vm.editing)?_c('UserRowSimple',{class:{'row--menu-opened': _vm.openedMenu},attrs:{\"editing\":_vm.editing,\"feedback-message\":_vm.feedbackMessage,\"groups\":_vm.groups,\"languages\":_vm.languages,\"loading\":_vm.loading,\"opened-menu\":_vm.openedMenu,\"settings\":_vm.settings,\"show-config\":_vm.showConfig,\"sub-admins-groups\":_vm.subAdminsGroups,\"user-actions\":_vm.userActions,\"user\":_vm.user,\"is-dark-theme\":_vm.isDarkTheme},on:{\"update:editing\":function($event){_vm.editing=$event},\"update:openedMenu\":function($event){_vm.openedMenu=$event},\"update:opened-menu\":function($event){_vm.openedMenu=$event}}}):_c('div',{staticClass:\"row row--editable\",class:{\n\t\t'disabled': _vm.loading.delete || _vm.loading.disable,\n\t\t'row--menu-opened': _vm.openedMenu\n\t},attrs:{\"data-id\":_vm.user.id}},[_c('div',{staticClass:\"avatar\",class:{'icon-loading-small': _vm.loading.delete || _vm.loading.disable || _vm.loading.wipe}},[(!_vm.loading.delete && !_vm.loading.disable && !_vm.loading.wipe)?_c('img',{attrs:{\"src\":_vm.generateAvatar(_vm.user.id, _vm.isDarkTheme),\"alt\":\"\",\"height\":\"32\",\"width\":\"32\"}}):_vm._e()]),_vm._v(\" \"),(_vm.user.backendCapabilities.setDisplayName)?_c('div',{staticClass:\"displayName\"},[_c('form',{staticClass:\"displayName\",class:{'icon-loading-small': _vm.loading.displayName},on:{\"submit\":function($event){$event.preventDefault();return _vm.updateDisplayName.apply(null, arguments)}}},[_c('input',{ref:\"displayName\",attrs:{\"id\":'displayName'+_vm.user.id+_vm.rand,\"disabled\":_vm.loading.displayName||_vm.loading.all,\"autocapitalize\":\"off\",\"autocomplete\":\"off\",\"autocorrect\":\"off\",\"spellcheck\":\"false\",\"type\":\"text\"},domProps:{\"value\":_vm.user.displayname}}),_vm._v(\" \"),_c('input',{staticClass:\"icon-confirm\",attrs:{\"type\":\"submit\",\"value\":\"\"}})])]):_c('div',{staticClass:\"name\"},[_vm._v(\"\\n\\t\\t\"+_vm._s(_vm.user.id)+\"\\n\\t\\t\"),_c('div',{staticClass:\"displayName subtitle\"},[_c('div',{directives:[{name:\"tooltip\",rawName:\"v-tooltip\",value:(_vm.user.displayname.length > 20 ? _vm.user.displayname : ''),expression:\"user.displayname.length > 20 ? user.displayname : ''\"}],staticClass:\"cellText\"},[_vm._v(\"\\n\\t\\t\\t\\t\"+_vm._s(_vm.user.displayname)+\"\\n\\t\\t\\t\")])])]),_vm._v(\" \"),(_vm.settings.canChangePassword && _vm.user.backendCapabilities.setPassword)?_c('form',{staticClass:\"password\",class:{'icon-loading-small': _vm.loading.password},on:{\"submit\":function($event){$event.preventDefault();return _vm.updatePassword.apply(null, arguments)}}},[_c('input',{ref:\"password\",attrs:{\"id\":'password'+_vm.user.id+_vm.rand,\"disabled\":_vm.loading.password || _vm.loading.all,\"minlength\":_vm.minPasswordLength,\"maxlength\":\"469\",\"placeholder\":_vm.t('settings', 'Add new password'),\"autocapitalize\":\"off\",\"autocomplete\":\"new-password\",\"autocorrect\":\"off\",\"required\":\"\",\"spellcheck\":\"false\",\"type\":\"password\",\"value\":\"\"}}),_vm._v(\" \"),_c('input',{staticClass:\"icon-confirm\",attrs:{\"type\":\"submit\",\"value\":\"\"}})]):_c('div'),_vm._v(\" \"),_c('form',{staticClass:\"mailAddress\",class:{'icon-loading-small': _vm.loading.mailAddress},on:{\"submit\":function($event){$event.preventDefault();return _vm.updateEmail.apply(null, arguments)}}},[_c('input',{ref:\"mailAddress\",attrs:{\"id\":'mailAddress'+_vm.user.id+_vm.rand,\"disabled\":_vm.loading.mailAddress||_vm.loading.all,\"placeholder\":_vm.t('settings', 'Add new email address'),\"autocapitalize\":\"off\",\"autocomplete\":\"new-password\",\"autocorrect\":\"off\",\"spellcheck\":\"false\",\"type\":\"email\"},domProps:{\"value\":_vm.user.email}}),_vm._v(\" \"),_c('input',{staticClass:\"icon-confirm\",attrs:{\"type\":\"submit\",\"value\":\"\"}})]),_vm._v(\" \"),_c('div',{staticClass:\"groups\",class:{'icon-loading-small': _vm.loading.groups}},[_c('NcMultiselect',{staticClass:\"multiselect-vue\",attrs:{\"close-on-select\":false,\"disabled\":_vm.loading.groups||_vm.loading.all,\"limit\":2,\"multiple\":true,\"options\":_vm.availableGroups,\"placeholder\":_vm.t('settings', 'Add user to group'),\"tag-width\":60,\"taggable\":_vm.settings.isAdmin,\"value\":_vm.userGroups,\"label\":\"name\",\"tag-placeholder\":\"create\",\"track-by\":\"id\"},on:{\"remove\":_vm.removeUserGroup,\"select\":_vm.addUserGroup,\"tag\":_vm.createGroup}},[_c('span',{attrs:{\"slot\":\"noResult\"},slot:\"noResult\"},[_vm._v(_vm._s(_vm.t('settings', 'No results')))])])],1),_vm._v(\" \"),(_vm.subAdminsGroups.length>0 && _vm.settings.isAdmin)?_c('div',{staticClass:\"subadmins\",class:{'icon-loading-small': _vm.loading.subadmins}},[_c('NcMultiselect',{staticClass:\"multiselect-vue\",attrs:{\"close-on-select\":false,\"disabled\":_vm.loading.subadmins||_vm.loading.all,\"limit\":2,\"multiple\":true,\"options\":_vm.subAdminsGroups,\"placeholder\":_vm.t('settings', 'Set user as admin for'),\"tag-width\":60,\"value\":_vm.userSubAdminsGroups,\"label\":\"name\",\"track-by\":\"id\"},on:{\"remove\":_vm.removeUserSubAdmin,\"select\":_vm.addUserSubAdmin}},[_c('span',{attrs:{\"slot\":\"noResult\"},slot:\"noResult\"},[_vm._v(_vm._s(_vm.t('settings', 'No results')))])])],1):_vm._e(),_vm._v(\" \"),_c('div',{directives:[{name:\"tooltip\",rawName:\"v-tooltip.auto\",value:(_vm.usedSpace),expression:\"usedSpace\",modifiers:{\"auto\":true}}],staticClass:\"quota\",class:{'icon-loading-small': _vm.loading.quota}},[_c('NcMultiselect',{staticClass:\"multiselect-vue\",attrs:{\"allow-empty\":false,\"disabled\":_vm.loading.quota||_vm.loading.all,\"options\":_vm.quotaOptions,\"placeholder\":_vm.t('settings', 'Select user quota'),\"taggable\":true,\"value\":_vm.userQuota,\"label\":\"label\",\"tag-placeholder\":\"create\",\"track-by\":\"id\"},on:{\"input\":_vm.setUserQuota,\"tag\":_vm.validateQuota}})],1),_vm._v(\" \"),(_vm.showConfig.showLanguages)?_c('div',{staticClass:\"languages\",class:{'icon-loading-small': _vm.loading.languages}},[_c('NcMultiselect',{staticClass:\"multiselect-vue\",attrs:{\"allow-empty\":false,\"disabled\":_vm.loading.languages||_vm.loading.all,\"options\":_vm.languages,\"placeholder\":_vm.t('settings', 'No language set'),\"value\":_vm.userLanguage,\"group-label\":\"label\",\"group-values\":\"languages\",\"label\":\"name\",\"track-by\":\"code\"},on:{\"input\":_vm.setUserLanguage}})],1):_vm._e(),_vm._v(\" \"),(_vm.showConfig.showStoragePath || _vm.showConfig.showUserBackend)?_c('div',{staticClass:\"storageLocation\"}):_vm._e(),_vm._v(\" \"),(_vm.showConfig.showLastLogin)?_c('div'):_vm._e(),_vm._v(\" \"),_c('div',{staticClass:\"userActions\"},[(!_vm.loading.all)?_c('div',{staticClass:\"toggleUserActions\"},[_c('NcActions',[_c('NcActionButton',{attrs:{\"icon\":\"icon-checkmark\"},on:{\"click\":function($event){_vm.editing = false}}},[_vm._v(\"\\n\\t\\t\\t\\t\\t\"+_vm._s(_vm.t('settings', 'Done'))+\"\\n\\t\\t\\t\\t\")])],1),_vm._v(\" \"),_c('div',{directives:[{name:\"click-outside\",rawName:\"v-click-outside\",value:(_vm.hideMenu),expression:\"hideMenu\"}],staticClass:\"userPopoverMenuWrapper\"},[_c('button',{staticClass:\"icon-more\",on:{\"click\":function($event){$event.preventDefault();return _vm.toggleMenu.apply(null, arguments)}}}),_vm._v(\" \"),_c('div',{staticClass:\"popovermenu\",class:{ 'open': _vm.openedMenu }},[_c('NcPopoverMenu',{attrs:{\"menu\":_vm.userActions}})],1)])],1):_vm._e(),_vm._v(\" \"),_c('div',{staticClass:\"feedback\",style:({opacity: _vm.feedbackMessage !== '' ? 1 : 0})},[_c('div',{staticClass:\"icon-checkmark\"}),_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.feedbackMessage)+\"\\n\\t\\t\")])])])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<!--\n - @copyright Copyright (c) 2018 John Molakvoæ <skjnldsv@protonmail.com>\n -\n - @author John Molakvoæ <skjnldsv@protonmail.com>\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\" class=\"user-list-grid\" @scroll.passive=\"onScroll\">\n\t\t<NcModal v-if=\"showConfig.showNewUserForm\" size=\"small\" @close=\"closeModal\">\n\t\t\t<form id=\"new-user\"\n\t\t\t\t:disabled=\"loading.all\"\n\t\t\t\tclass=\"modal__content\"\n\t\t\t\t@submit.prevent=\"createUser\">\n\t\t\t\t<h2>{{ t('settings','New user') }}</h2>\n\t\t\t\t<input id=\"newusername\"\n\t\t\t\t\tref=\"newusername\"\n\t\t\t\t\tv-model=\"newUser.id\"\n\t\t\t\t\t:disabled=\"settings.newUserGenerateUserID\"\n\t\t\t\t\t:placeholder=\"settings.newUserGenerateUserID\n\t\t\t\t\t\t? t('settings', 'Will be autogenerated')\n\t\t\t\t\t\t: t('settings', 'Username')\"\n\t\t\t\t\tautocapitalize=\"none\"\n\t\t\t\t\tautocomplete=\"off\"\n\t\t\t\t\tautocorrect=\"off\"\n\t\t\t\t\tclass=\"modal__item\"\n\t\t\t\t\tname=\"username\"\n\t\t\t\t\tpattern=\"[a-zA-Z0-9 _\\.@\\-']+\"\n\t\t\t\t\trequired\n\t\t\t\t\ttype=\"text\">\n\t\t\t\t<input id=\"newdisplayname\"\n\t\t\t\t\tv-model=\"newUser.displayName\"\n\t\t\t\t\t:placeholder=\"t('settings', 'Display name')\"\n\t\t\t\t\tautocapitalize=\"none\"\n\t\t\t\t\tautocomplete=\"off\"\n\t\t\t\t\tautocorrect=\"off\"\n\t\t\t\t\tclass=\"modal__item\"\n\t\t\t\t\tname=\"displayname\"\n\t\t\t\t\ttype=\"text\">\n\t\t\t\t<input id=\"newuserpassword\"\n\t\t\t\t\tref=\"newuserpassword\"\n\t\t\t\t\tv-model=\"newUser.password\"\n\t\t\t\t\t:minlength=\"minPasswordLength\"\n\t\t\t\t\t:placeholder=\"t('settings', 'Password')\"\n\t\t\t\t\t:required=\"newUser.mailAddress===''\"\n\t\t\t\t\tautocapitalize=\"none\"\n\t\t\t\t\tautocomplete=\"new-password\"\n\t\t\t\t\tautocorrect=\"off\"\n\t\t\t\t\tclass=\"modal__item\"\n\t\t\t\t\tname=\"password\"\n\t\t\t\t\ttype=\"password\">\n\t\t\t\t<input id=\"newemail\"\n\t\t\t\t\tv-model=\"newUser.mailAddress\"\n\t\t\t\t\t:placeholder=\"t('settings', 'Email')\"\n\t\t\t\t\t:required=\"newUser.password==='' || settings.newUserRequireEmail\"\n\t\t\t\t\tautocapitalize=\"none\"\n\t\t\t\t\tautocomplete=\"off\"\n\t\t\t\t\tautocorrect=\"off\"\n\t\t\t\t\tclass=\"modal__item\"\n\t\t\t\t\tname=\"email\"\n\t\t\t\t\ttype=\"email\">\n\t\t\t\t<div class=\"groups modal__item\">\n\t\t\t\t\t<!-- hidden input trick for vanilla html5 form validation -->\n\t\t\t\t\t<input v-if=\"!settings.isAdmin\"\n\t\t\t\t\t\tid=\"newgroups\"\n\t\t\t\t\t\t:class=\"{'icon-loading-small': loading.groups}\"\n\t\t\t\t\t\t:required=\"!settings.isAdmin\"\n\t\t\t\t\t\t:value=\"newUser.groups\"\n\t\t\t\t\t\ttabindex=\"-1\"\n\t\t\t\t\t\ttype=\"text\">\n\t\t\t\t\t<NcMultiselect v-model=\"newUser.groups\"\n\t\t\t\t\t\t:close-on-select=\"false\"\n\t\t\t\t\t\t:disabled=\"loading.groups||loading.all\"\n\t\t\t\t\t\t:multiple=\"true\"\n\t\t\t\t\t\t:options=\"canAddGroups\"\n\t\t\t\t\t\t:placeholder=\"t('settings', 'Add user to group')\"\n\t\t\t\t\t\t:tag-width=\"60\"\n\t\t\t\t\t\t:taggable=\"true\"\n\t\t\t\t\t\tclass=\"multiselect-vue\"\n\t\t\t\t\t\tlabel=\"name\"\n\t\t\t\t\t\ttag-placeholder=\"create\"\n\t\t\t\t\t\ttrack-by=\"id\"\n\t\t\t\t\t\t@tag=\"createGroup\">\n\t\t\t\t\t\t<!-- If user is not admin, he is a subadmin.\n\t\t\t\t\t\t\tSubadmins can't create users outside their groups\n\t\t\t\t\t\t\tTherefore, empty select is forbidden -->\n\t\t\t\t\t\t<span slot=\"noResult\">{{ t('settings', 'No results') }}</span>\n\t\t\t\t\t</NcMultiselect>\n\t\t\t\t</div>\n\t\t\t\t<div v-if=\"subAdminsGroups.length>0 && settings.isAdmin\"\n\t\t\t\t\tclass=\"subadmins modal__item\">\n\t\t\t\t\t<NcMultiselect v-model=\"newUser.subAdminsGroups\"\n\t\t\t\t\t\t:close-on-select=\"false\"\n\t\t\t\t\t\t:multiple=\"true\"\n\t\t\t\t\t\t:options=\"subAdminsGroups\"\n\t\t\t\t\t\t:placeholder=\"t('settings', 'Set user as admin for')\"\n\t\t\t\t\t\t:tag-width=\"60\"\n\t\t\t\t\t\tclass=\"multiselect-vue\"\n\t\t\t\t\t\tlabel=\"name\"\n\t\t\t\t\t\ttrack-by=\"id\">\n\t\t\t\t\t\t<span slot=\"noResult\">{{ t('settings', 'No results') }}</span>\n\t\t\t\t\t</NcMultiselect>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"quota modal__item\">\n\t\t\t\t\t<NcMultiselect v-model=\"newUser.quota\"\n\t\t\t\t\t\t:allow-empty=\"false\"\n\t\t\t\t\t\t:options=\"quotaOptions\"\n\t\t\t\t\t\t:placeholder=\"t('settings', 'Select user quota')\"\n\t\t\t\t\t\t:taggable=\"true\"\n\t\t\t\t\t\tclass=\"multiselect-vue\"\n\t\t\t\t\t\tlabel=\"label\"\n\t\t\t\t\t\ttrack-by=\"id\"\n\t\t\t\t\t\t@tag=\"validateQuota\" />\n\t\t\t\t</div>\n\t\t\t\t<div v-if=\"showConfig.showLanguages\" class=\"languages modal__item\">\n\t\t\t\t\t<NcMultiselect v-model=\"newUser.language\"\n\t\t\t\t\t\t:allow-empty=\"false\"\n\t\t\t\t\t\t:options=\"languages\"\n\t\t\t\t\t\t:placeholder=\"t('settings', 'Default language')\"\n\t\t\t\t\t\tclass=\"multiselect-vue\"\n\t\t\t\t\t\tgroup-label=\"label\"\n\t\t\t\t\t\tgroup-values=\"languages\"\n\t\t\t\t\t\tlabel=\"name\"\n\t\t\t\t\t\ttrack-by=\"code\" />\n\t\t\t\t</div>\n\t\t\t\t<div v-if=\"showConfig.showStoragePath\" class=\"storageLocation\" />\n\t\t\t\t<div v-if=\"showConfig.showUserBackend\" class=\"userBackend\" />\n\t\t\t\t<div v-if=\"showConfig.showLastLogin\" class=\"lastLogin\" />\n\t\t\t\t<div class=\"user-actions\">\n\t\t\t\t\t<NcButton id=\"newsubmit\"\n\t\t\t\t\t\ttype=\"primary\"\n\t\t\t\t\t\tnative-type=\"submit\"\n\t\t\t\t\t\tvalue=\"\">\n\t\t\t\t\t\t{{ t('settings', 'Add a new user') }}\n\t\t\t\t\t</NcButton>\n\t\t\t\t</div>\n\t\t\t</form>\n\t\t</NcModal>\n\t\t<div id=\"grid-header\"\n\t\t\t:class=\"{'sticky': scrolled && !showConfig.showNewUserForm}\"\n\t\t\tclass=\"row\">\n\t\t\t<div id=\"headerAvatar\" class=\"avatar\" />\n\t\t\t<div id=\"headerName\" class=\"name\">\n\t\t\t\t<div class=\"subtitle\">\n\t\t\t\t\t<strong>\n\t\t\t\t\t\t{{ t('settings', 'Display name') }}\n\t\t\t\t\t</strong>\n\t\t\t\t</div>\n\t\t\t\t{{ t('settings', 'Username') }}\n\t\t\t</div>\n\t\t\t<div id=\"headerPassword\" class=\"password\">\n\t\t\t\t{{ t('settings', 'Password') }}\n\t\t\t</div>\n\t\t\t<div id=\"headerAddress\" class=\"mailAddress\">\n\t\t\t\t{{ t('settings', 'Email') }}\n\t\t\t</div>\n\t\t\t<div id=\"headerGroups\" class=\"groups\">\n\t\t\t\t{{ t('settings', 'Groups') }}\n\t\t\t</div>\n\t\t\t<div v-if=\"subAdminsGroups.length>0 && settings.isAdmin\"\n\t\t\t\tid=\"headerSubAdmins\"\n\t\t\t\tclass=\"subadmins\">\n\t\t\t\t{{ t('settings', 'Group admin for') }}\n\t\t\t</div>\n\t\t\t<div id=\"headerQuota\" class=\"quota\">\n\t\t\t\t{{ t('settings', 'Quota') }}\n\t\t\t</div>\n\t\t\t<div v-if=\"showConfig.showLanguages\"\n\t\t\t\tid=\"headerLanguages\"\n\t\t\t\tclass=\"languages\">\n\t\t\t\t{{ t('settings', 'Language') }}\n\t\t\t</div>\n\n\t\t\t<div v-if=\"showConfig.showUserBackend || showConfig.showStoragePath\"\n\t\t\t\tclass=\"headerUserBackend userBackend\">\n\t\t\t\t<div v-if=\"showConfig.showUserBackend\" class=\"userBackend\">\n\t\t\t\t\t{{ t('settings', 'User backend') }}\n\t\t\t\t</div>\n\t\t\t\t<div v-if=\"showConfig.showStoragePath\"\n\t\t\t\t\tclass=\"subtitle storageLocation\">\n\t\t\t\t\t{{ t('settings', 'Storage location') }}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div v-if=\"showConfig.showLastLogin\"\n\t\t\t\tclass=\"headerLastLogin lastLogin\">\n\t\t\t\t{{ t('settings', 'Last login') }}\n\t\t\t</div>\n\n\t\t\t<div class=\"userActions\" />\n\t\t</div>\n\n\t\t<user-row v-for=\"user in filteredUsers\"\n\t\t\t:key=\"user.id\"\n\t\t\t:external-actions=\"externalActions\"\n\t\t\t:groups=\"groups\"\n\t\t\t:languages=\"languages\"\n\t\t\t:quota-options=\"quotaOptions\"\n\t\t\t:settings=\"settings\"\n\t\t\t:show-config=\"showConfig\"\n\t\t\t:sub-admins-groups=\"subAdminsGroups\"\n\t\t\t:user=\"user\"\n\t\t\t:is-dark-theme=\"isDarkTheme\" />\n\t\t<InfiniteLoading ref=\"infiniteLoading\" @infinite=\"infiniteHandler\">\n\t\t\t<div slot=\"spinner\">\n\t\t\t\t<div class=\"users-icon-loading icon-loading\" />\n\t\t\t</div>\n\t\t\t<div slot=\"no-more\">\n\t\t\t\t<div class=\"users-list-end\" />\n\t\t\t</div>\n\t\t\t<div slot=\"no-results\">\n\t\t\t\t<div id=\"emptycontent\">\n\t\t\t\t\t<div class=\"icon-contacts-dark\" />\n\t\t\t\t\t<h2>{{ t('settings', 'No users in here') }}</h2>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</InfiniteLoading>\n\t</div>\n</template>\n\n<script>\nimport { subscribe, unsubscribe } from '@nextcloud/event-bus'\nimport InfiniteLoading from 'vue-infinite-loading'\nimport Vue from 'vue'\nimport NcModal from '@nextcloud/vue/dist/Components/NcModal'\nimport NcButton from '@nextcloud/vue/dist/Components/NcButton'\nimport NcMultiselect from '@nextcloud/vue/dist/Components/NcMultiselect'\n\nimport userRow from './UserList/UserRow'\n\nconst unlimitedQuota = {\n\tid: 'none',\n\tlabel: t('settings', 'Unlimited'),\n}\nconst defaultQuota = {\n\tid: 'default',\n\tlabel: t('settings', 'Default quota'),\n}\nconst newUser = {\n\tid: '',\n\tdisplayName: '',\n\tpassword: '',\n\tmailAddress: '',\n\tgroups: [],\n\tsubAdminsGroups: [],\n\tquota: defaultQuota,\n\tlanguage: {\n\t\tcode: 'en',\n\t\tname: t('settings', 'Default language'),\n\t},\n}\n\nexport default {\n\tname: 'UserList',\n\tcomponents: {\n\t\tNcModal,\n\t\tuserRow,\n\t\tNcMultiselect,\n\t\tInfiniteLoading,\n\t\tNcButton,\n\t},\n\tprops: {\n\t\tusers: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\t\tshowConfig: {\n\t\t\ttype: Object,\n\t\t\trequired: true,\n\t\t},\n\t\tselectedGroup: {\n\t\t\ttype: String,\n\t\t\tdefault: null,\n\t\t},\n\t\texternalActions: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tunlimitedQuota,\n\t\t\tdefaultQuota,\n\t\t\tloading: {\n\t\t\t\tall: false,\n\t\t\t\tgroups: false,\n\t\t\t},\n\t\t\tscrolled: false,\n\t\t\tsearchQuery: '',\n\t\t\tnewUser: Object.assign({}, newUser),\n\t\t}\n\t},\n\tcomputed: {\n\t\tsettings() {\n\t\t\treturn this.$store.getters.getServerData\n\t\t},\n\t\tselectedGroupDecoded() {\n\t\t\treturn decodeURIComponent(this.selectedGroup)\n\t\t},\n\t\tfilteredUsers() {\n\t\t\tif (this.selectedGroup === 'disabled') {\n\t\t\t\treturn this.users.filter(user => user.enabled === false)\n\t\t\t}\n\t\t\tif (!this.settings.isAdmin) {\n\t\t\t\t// we don't want subadmins to edit themselves\n\t\t\t\treturn this.users.filter(user => user.enabled !== false)\n\t\t\t}\n\t\t\treturn this.users.filter(user => user.enabled !== false)\n\t\t},\n\t\tgroups() {\n\t\t\t// data provided php side + remove the disabled group\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\tcanAddGroups() {\n\t\t\t// disabled if no permission to add new users to group\n\t\t\treturn this.groups.map(group => {\n\t\t\t\t// clone object because we don't want\n\t\t\t\t// to edit the original groups\n\t\t\t\tgroup = Object.assign({}, group)\n\t\t\t\tgroup.$isDisabled = group.canAdd === false\n\t\t\t\treturn group\n\t\t\t})\n\t\t},\n\t\tsubAdminsGroups() {\n\t\t\t// data provided php side\n\t\t\treturn this.$store.getters.getSubadminGroups\n\t\t},\n\t\tquotaOptions() {\n\t\t\t// convert the preset array into objects\n\t\t\tconst quotaPreset = this.settings.quotaPreset.reduce((acc, cur) => acc.concat({\n\t\t\t\tid: cur,\n\t\t\t\tlabel: cur,\n\t\t\t}), [])\n\t\t\t// add default presets\n\t\t\tif (this.settings.allowUnlimitedQuota) {\n\t\t\t\tquotaPreset.unshift(this.unlimitedQuota)\n\t\t\t}\n\t\t\tquotaPreset.unshift(this.defaultQuota)\n\t\t\treturn quotaPreset\n\t\t},\n\t\tminPasswordLength() {\n\t\t\treturn this.$store.getters.getPasswordPolicyMinLength\n\t\t},\n\t\tusersOffset() {\n\t\t\treturn this.$store.getters.getUsersOffset\n\t\t},\n\t\tusersLimit() {\n\t\t\treturn this.$store.getters.getUsersLimit\n\t\t},\n\t\tusersCount() {\n\t\t\treturn this.users.length\n\t\t},\n\n\t\t/* LANGUAGES */\n\t\tlanguages() {\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\tlabel: t('settings', 'Common languages'),\n\t\t\t\t\tlanguages: this.settings.languages.commonLanguages,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tlabel: t('settings', 'Other languages'),\n\t\t\t\t\tlanguages: this.settings.languages.otherLanguages,\n\t\t\t\t},\n\t\t\t]\n\t\t},\n\t\tisDarkTheme() {\n\t\t\treturn window.getComputedStyle(this.$el)\n\t\t\t\t.getPropertyValue('--background-invert-if-dark') === 'invert(100%)'\n\t\t},\n\t},\n\twatch: {\n\t\t// watch url change and group select\n\t\tselectedGroup(val, old) {\n\t\t\t// if selected is the disabled group but it's empty\n\t\t\tthis.redirectIfDisabled()\n\t\t\tthis.$store.commit('resetUsers')\n\t\t\tthis.$refs.infiniteLoading.stateChanger.reset()\n\t\t\tthis.setNewUserDefaultGroup(val)\n\t\t},\n\n\t\t// make sure the infiniteLoading state is changed if we manually\n\t\t// add/remove data from the store\n\t\tusersCount(val, old) {\n\t\t\t// deleting the last user, reset the list\n\t\t\tif (val === 0 && old === 1) {\n\t\t\t\tthis.$refs.infiniteLoading.stateChanger.reset()\n\t\t\t\t// adding the first user, warn the infiniteLoader that\n\t\t\t\t// the list is not empty anymore (we don't fetch the newly\n\t\t\t\t// added user as we already have all the info we need)\n\t\t\t} else if (val === 1 && old === 0) {\n\t\t\t\tthis.$refs.infiniteLoading.stateChanger.loaded()\n\t\t\t}\n\t\t},\n\t},\n\n\tmounted() {\n\t\tif (!this.settings.canChangePassword) {\n\t\t\tOC.Notification.showTemporary(t('settings', 'Password change is disabled because the master key is disabled'))\n\t\t}\n\n\t\t/**\n\t\t * Reset and init new user form\n\t\t */\n\t\tthis.resetForm()\n\n\t\t/**\n\t\t * Register search\n\t\t */\n\t\tsubscribe('nextcloud:unified-search.search', this.search)\n\t\tsubscribe('nextcloud:unified-search.reset', this.resetSearch)\n\n\t\t/**\n\t\t * If disabled group but empty, redirect\n\t\t */\n\t\tthis.redirectIfDisabled()\n\t},\n\tbeforeDestroy() {\n\t\tunsubscribe('nextcloud:unified-search.search', this.search)\n\t\tunsubscribe('nextcloud:unified-search.reset', this.resetSearch)\n\t},\n\n\tmethods: {\n\t\tonScroll(event) {\n\t\t\tthis.scrolled = event.target.scrollTo > 0\n\t\t},\n\n\t\t/**\n\t\t * Validate quota string to make sure it's a valid human file size\n\t\t *\n\t\t * @param {string} quota Quota in readable format '5 GB'\n\t\t * @return {object}\n\t\t */\n\t\tvalidateQuota(quota) {\n\t\t\t// only used for new presets sent through @Tag\n\t\t\tconst validQuota = OC.Util.computerFileSize(quota)\n\t\t\tif (validQuota !== null && validQuota >= 0) {\n\t\t\t\t// unify format output\n\t\t\t\tquota = OC.Util.humanFileSize(OC.Util.computerFileSize(quota))\n\t\t\t\tthis.newUser.quota = { id: quota, label: quota }\n\t\t\t\treturn this.newUser.quota\n\t\t\t}\n\t\t\t// Default is unlimited\n\t\t\tthis.newUser.quota = this.quotaOptions[0]\n\t\t\treturn this.quotaOptions[0]\n\t\t},\n\n\t\tinfiniteHandler($state) {\n\t\t\tthis.$store.dispatch('getUsers', {\n\t\t\t\toffset: this.usersOffset,\n\t\t\t\tlimit: this.usersLimit,\n\t\t\t\tgroup: this.selectedGroup !== 'disabled' ? this.selectedGroup : '',\n\t\t\t\tsearch: this.searchQuery,\n\t\t\t})\n\t\t\t\t.then((usersCount) => {\n\t\t\t\t\tif (usersCount > 0) {\n\t\t\t\t\t\t$state.loaded()\n\t\t\t\t\t}\n\t\t\t\t\tif (usersCount < this.usersLimit) {\n\t\t\t\t\t\t$state.complete()\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t},\n\n\t\t/* SEARCH */\n\t\tsearch({ query }) {\n\t\t\tthis.searchQuery = query\n\t\t\tthis.$store.commit('resetUsers')\n\t\t\tthis.$refs.infiniteLoading.stateChanger.reset()\n\t\t},\n\t\tresetSearch() {\n\t\t\tthis.search({ query: '' })\n\t\t},\n\n\t\tresetForm() {\n\t\t\t// revert form to original state\n\t\t\tthis.newUser = Object.assign({}, newUser)\n\n\t\t\t/**\n\t\t\t * Init default language from server data. The use of this.settings\n\t\t\t * requires a computed variable, which break the v-model binding of the form,\n\t\t\t * this is a much easier solution than getter and setter on a computed var\n\t\t\t */\n\t\t\tif (this.settings.defaultLanguage) {\n\t\t\t\tVue.set(this.newUser.language, 'code', this.settings.defaultLanguage)\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * In case the user directly loaded the user list within a group\n\t\t\t * the watch won't be triggered. We need to initialize it.\n\t\t\t */\n\t\t\tthis.setNewUserDefaultGroup(this.selectedGroup)\n\n\t\t\tthis.loading.all = false\n\t\t},\n\t\tcreateUser() {\n\t\t\tthis.loading.all = true\n\t\t\tthis.$store.dispatch('addUser', {\n\t\t\t\tuserid: this.newUser.id,\n\t\t\t\tpassword: this.newUser.password,\n\t\t\t\tdisplayName: this.newUser.displayName,\n\t\t\t\temail: this.newUser.mailAddress,\n\t\t\t\tgroups: this.newUser.groups.map(group => group.id),\n\t\t\t\tsubadmin: this.newUser.subAdminsGroups.map(group => group.id),\n\t\t\t\tquota: this.newUser.quota.id,\n\t\t\t\tlanguage: this.newUser.language.code,\n\t\t\t})\n\t\t\t\t.then(() => {\n\t\t\t\t\tthis.resetForm()\n\t\t\t\t\tthis.$refs.newusername.focus()\n\t\t\t\t\tthis.closeModal()\n\t\t\t\t})\n\t\t\t\t.catch((error) => {\n\t\t\t\t\tthis.loading.all = false\n\t\t\t\t\tif (error.response && error.response.data && error.response.data.ocs && error.response.data.ocs.meta) {\n\t\t\t\t\t\tconst statuscode = error.response.data.ocs.meta.statuscode\n\t\t\t\t\t\tif (statuscode === 102) {\n\t\t\t\t\t\t\t// wrong username\n\t\t\t\t\t\t\tthis.$refs.newusername.focus()\n\t\t\t\t\t\t} else if (statuscode === 107) {\n\t\t\t\t\t\t\t// wrong password\n\t\t\t\t\t\t\tthis.$refs.newuserpassword.focus()\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t},\n\t\tsetNewUserDefaultGroup(value) {\n\t\t\tif (value && value.length > 0) {\n\t\t\t\t// setting new user default group to the current selected one\n\t\t\t\tconst currentGroup = this.groups.find(group => group.id === value)\n\t\t\t\tif (currentGroup) {\n\t\t\t\t\tthis.newUser.groups = [currentGroup]\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t}\n\t\t\t// fallback, empty selected group\n\t\t\tthis.newUser.groups = []\n\t\t},\n\n\t\t/**\n\t\t * Create a new group\n\t\t *\n\t\t * @param {string} gid Group id\n\t\t * @return {Promise}\n\t\t */\n\t\tcreateGroup(gid) {\n\t\t\tthis.loading.groups = true\n\t\t\tthis.$store.dispatch('addGroup', gid)\n\t\t\t\t.then((group) => {\n\t\t\t\t\tthis.newUser.groups.push(this.groups.find(group => group.id === gid))\n\t\t\t\t\tthis.loading.groups = false\n\t\t\t\t})\n\t\t\t\t.catch(() => {\n\t\t\t\t\tthis.loading.groups = false\n\t\t\t\t})\n\t\t\treturn this.$store.getters.getGroups[this.groups.length]\n\t\t},\n\n\t\t/**\n\t\t * If the selected group is the disabled group but the count is 0\n\t\t * redirect to the all users page.\n\t\t * we only check for 0 because we don't have the count on ldap\n\t\t * and we therefore set the usercount to -1 in this specific case\n\t\t */\n\t\tredirectIfDisabled() {\n\t\t\tconst allGroups = this.$store.getters.getGroups\n\t\t\tif (this.selectedGroup === 'disabled'\n\t\t\t\t\t\t&& allGroups.findIndex(group => group.id === 'disabled' && group.usercount === 0) > -1) {\n\t\t\t\t// disabled group is empty, redirection to all users\n\t\t\t\tthis.$router.push({ name: 'users' })\n\t\t\t\tthis.$refs.infiniteLoading.stateChanger.reset()\n\t\t\t}\n\t\t},\n\t\tcloseModal() {\n\t\t\t// eslint-disable-next-line vue/no-mutating-props\n\t\t\tthis.showConfig.showNewUserForm = false\n\t\t},\n\t},\n}\n</script>\n<style scoped>\n\t.modal-wrapper {\n\t\tmargin: 2vh 0;\n\t\talign-items: flex-start;\n\t}\n\t.modal__content {\n\t\tdisplay: flex;\n\t\tpadding: 20px;\n\t\tflex-direction: column;\n\t\talign-items: center;\n\t\ttext-align: center;\n\t}\n\t.modal__item {\n\t\tmargin-bottom: 16px;\n\t\twidth: 100%;\n\t}\n\t.modal__item:not(:focus):not(:active) {\n\t\tborder-color: var(--color-border-dark);\n\t}\n\t.modal__item::v-deep .multiselect {\n\t\twidth: 100%;\n\t}\n\t.user-actions {\n\t\tmargin-top: 20px;\n\t}\n\t.modal__content::v-deep .multiselect__single {\n\t\ttext-align: left;\n\t\tbox-sizing: border-box;\n\t}\n\t.modal__content::v-deep .multiselect__content-wrapper {\n\t\tbox-sizing: border-box;\n\t}\n\t.row::v-deep .multiselect__single {\n\t\tz-index: auto !important;\n\t}\n\n\t/* fake input for groups validation */\n\tinput#newgroups {\n\t\tposition: absolute;\n\t\topacity: 0;\n\t\t/* The \"hidden\" input is behind the Multiselect, so in general it does\n\t\t * not receives clicks. However, with Firefox, after the validation\n\t\t * fails, it will receive the first click done on it, so its width needs\n\t\t * to be set to 0 to prevent that (\"pointer-events: none\" does not\n\t\t * prevent it). */\n\t\twidth: 0;\n\t}\n</style>\n","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./UserList.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!./UserList.vue?vue&type=script&lang=js&\"","\n import API from \"!../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./UserList.vue?vue&type=style&index=0&id=5d4cd810&scoped=true&lang=css&\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./UserList.vue?vue&type=style&index=0&id=5d4cd810&scoped=true&lang=css&\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./UserList.vue?vue&type=template&id=5d4cd810&scoped=true&\"\nimport script from \"./UserList.vue?vue&type=script&lang=js&\"\nexport * from \"./UserList.vue?vue&type=script&lang=js&\"\nimport style0 from \"./UserList.vue?vue&type=style&index=0&id=5d4cd810&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 \"5d4cd810\",\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:\"user-list-grid\",attrs:{\"id\":\"app-content\"},on:{\"&scroll\":function($event){return _vm.onScroll.apply(null, arguments)}}},[(_vm.showConfig.showNewUserForm)?_c('NcModal',{attrs:{\"size\":\"small\"},on:{\"close\":_vm.closeModal}},[_c('form',{staticClass:\"modal__content\",attrs:{\"id\":\"new-user\",\"disabled\":_vm.loading.all},on:{\"submit\":function($event){$event.preventDefault();return _vm.createUser.apply(null, arguments)}}},[_c('h2',[_vm._v(_vm._s(_vm.t('settings','New user')))]),_vm._v(\" \"),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.newUser.id),expression:\"newUser.id\"}],ref:\"newusername\",staticClass:\"modal__item\",attrs:{\"id\":\"newusername\",\"disabled\":_vm.settings.newUserGenerateUserID,\"placeholder\":_vm.settings.newUserGenerateUserID\n\t\t\t\t\t? _vm.t('settings', 'Will be autogenerated')\n\t\t\t\t\t: _vm.t('settings', 'Username'),\"autocapitalize\":\"none\",\"autocomplete\":\"off\",\"autocorrect\":\"off\",\"name\":\"username\",\"pattern\":\"[a-zA-Z0-9 _\\\\.@\\\\-']+\",\"required\":\"\",\"type\":\"text\"},domProps:{\"value\":(_vm.newUser.id)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.$set(_vm.newUser, \"id\", $event.target.value)}}}),_vm._v(\" \"),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.newUser.displayName),expression:\"newUser.displayName\"}],staticClass:\"modal__item\",attrs:{\"id\":\"newdisplayname\",\"placeholder\":_vm.t('settings', 'Display name'),\"autocapitalize\":\"none\",\"autocomplete\":\"off\",\"autocorrect\":\"off\",\"name\":\"displayname\",\"type\":\"text\"},domProps:{\"value\":(_vm.newUser.displayName)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.$set(_vm.newUser, \"displayName\", $event.target.value)}}}),_vm._v(\" \"),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.newUser.password),expression:\"newUser.password\"}],ref:\"newuserpassword\",staticClass:\"modal__item\",attrs:{\"id\":\"newuserpassword\",\"minlength\":_vm.minPasswordLength,\"placeholder\":_vm.t('settings', 'Password'),\"required\":_vm.newUser.mailAddress==='',\"autocapitalize\":\"none\",\"autocomplete\":\"new-password\",\"autocorrect\":\"off\",\"name\":\"password\",\"type\":\"password\"},domProps:{\"value\":(_vm.newUser.password)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.$set(_vm.newUser, \"password\", $event.target.value)}}}),_vm._v(\" \"),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.newUser.mailAddress),expression:\"newUser.mailAddress\"}],staticClass:\"modal__item\",attrs:{\"id\":\"newemail\",\"placeholder\":_vm.t('settings', 'Email'),\"required\":_vm.newUser.password==='' || _vm.settings.newUserRequireEmail,\"autocapitalize\":\"none\",\"autocomplete\":\"off\",\"autocorrect\":\"off\",\"name\":\"email\",\"type\":\"email\"},domProps:{\"value\":(_vm.newUser.mailAddress)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.$set(_vm.newUser, \"mailAddress\", $event.target.value)}}}),_vm._v(\" \"),_c('div',{staticClass:\"groups modal__item\"},[(!_vm.settings.isAdmin)?_c('input',{class:{'icon-loading-small': _vm.loading.groups},attrs:{\"id\":\"newgroups\",\"required\":!_vm.settings.isAdmin,\"tabindex\":\"-1\",\"type\":\"text\"},domProps:{\"value\":_vm.newUser.groups}}):_vm._e(),_vm._v(\" \"),_c('NcMultiselect',{staticClass:\"multiselect-vue\",attrs:{\"close-on-select\":false,\"disabled\":_vm.loading.groups||_vm.loading.all,\"multiple\":true,\"options\":_vm.canAddGroups,\"placeholder\":_vm.t('settings', 'Add user to group'),\"tag-width\":60,\"taggable\":true,\"label\":\"name\",\"tag-placeholder\":\"create\",\"track-by\":\"id\"},on:{\"tag\":_vm.createGroup},model:{value:(_vm.newUser.groups),callback:function ($$v) {_vm.$set(_vm.newUser, \"groups\", $$v)},expression:\"newUser.groups\"}},[_c('span',{attrs:{\"slot\":\"noResult\"},slot:\"noResult\"},[_vm._v(_vm._s(_vm.t('settings', 'No results')))])])],1),_vm._v(\" \"),(_vm.subAdminsGroups.length>0 && _vm.settings.isAdmin)?_c('div',{staticClass:\"subadmins modal__item\"},[_c('NcMultiselect',{staticClass:\"multiselect-vue\",attrs:{\"close-on-select\":false,\"multiple\":true,\"options\":_vm.subAdminsGroups,\"placeholder\":_vm.t('settings', 'Set user as admin for'),\"tag-width\":60,\"label\":\"name\",\"track-by\":\"id\"},model:{value:(_vm.newUser.subAdminsGroups),callback:function ($$v) {_vm.$set(_vm.newUser, \"subAdminsGroups\", $$v)},expression:\"newUser.subAdminsGroups\"}},[_c('span',{attrs:{\"slot\":\"noResult\"},slot:\"noResult\"},[_vm._v(_vm._s(_vm.t('settings', 'No results')))])])],1):_vm._e(),_vm._v(\" \"),_c('div',{staticClass:\"quota modal__item\"},[_c('NcMultiselect',{staticClass:\"multiselect-vue\",attrs:{\"allow-empty\":false,\"options\":_vm.quotaOptions,\"placeholder\":_vm.t('settings', 'Select user quota'),\"taggable\":true,\"label\":\"label\",\"track-by\":\"id\"},on:{\"tag\":_vm.validateQuota},model:{value:(_vm.newUser.quota),callback:function ($$v) {_vm.$set(_vm.newUser, \"quota\", $$v)},expression:\"newUser.quota\"}})],1),_vm._v(\" \"),(_vm.showConfig.showLanguages)?_c('div',{staticClass:\"languages modal__item\"},[_c('NcMultiselect',{staticClass:\"multiselect-vue\",attrs:{\"allow-empty\":false,\"options\":_vm.languages,\"placeholder\":_vm.t('settings', 'Default language'),\"group-label\":\"label\",\"group-values\":\"languages\",\"label\":\"name\",\"track-by\":\"code\"},model:{value:(_vm.newUser.language),callback:function ($$v) {_vm.$set(_vm.newUser, \"language\", $$v)},expression:\"newUser.language\"}})],1):_vm._e(),_vm._v(\" \"),(_vm.showConfig.showStoragePath)?_c('div',{staticClass:\"storageLocation\"}):_vm._e(),_vm._v(\" \"),(_vm.showConfig.showUserBackend)?_c('div',{staticClass:\"userBackend\"}):_vm._e(),_vm._v(\" \"),(_vm.showConfig.showLastLogin)?_c('div',{staticClass:\"lastLogin\"}):_vm._e(),_vm._v(\" \"),_c('div',{staticClass:\"user-actions\"},[_c('NcButton',{attrs:{\"id\":\"newsubmit\",\"type\":\"primary\",\"native-type\":\"submit\",\"value\":\"\"}},[_vm._v(\"\\n\\t\\t\\t\\t\\t\"+_vm._s(_vm.t('settings', 'Add a new user'))+\"\\n\\t\\t\\t\\t\")])],1)])]):_vm._e(),_vm._v(\" \"),_c('div',{staticClass:\"row\",class:{'sticky': _vm.scrolled && !_vm.showConfig.showNewUserForm},attrs:{\"id\":\"grid-header\"}},[_c('div',{staticClass:\"avatar\",attrs:{\"id\":\"headerAvatar\"}}),_vm._v(\" \"),_c('div',{staticClass:\"name\",attrs:{\"id\":\"headerName\"}},[_c('div',{staticClass:\"subtitle\"},[_c('strong',[_vm._v(\"\\n\\t\\t\\t\\t\\t\"+_vm._s(_vm.t('settings', 'Display name'))+\"\\n\\t\\t\\t\\t\")])]),_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.t('settings', 'Username'))+\"\\n\\t\\t\")]),_vm._v(\" \"),_c('div',{staticClass:\"password\",attrs:{\"id\":\"headerPassword\"}},[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.t('settings', 'Password'))+\"\\n\\t\\t\")]),_vm._v(\" \"),_c('div',{staticClass:\"mailAddress\",attrs:{\"id\":\"headerAddress\"}},[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.t('settings', 'Email'))+\"\\n\\t\\t\")]),_vm._v(\" \"),_c('div',{staticClass:\"groups\",attrs:{\"id\":\"headerGroups\"}},[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.t('settings', 'Groups'))+\"\\n\\t\\t\")]),_vm._v(\" \"),(_vm.subAdminsGroups.length>0 && _vm.settings.isAdmin)?_c('div',{staticClass:\"subadmins\",attrs:{\"id\":\"headerSubAdmins\"}},[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.t('settings', 'Group admin for'))+\"\\n\\t\\t\")]):_vm._e(),_vm._v(\" \"),_c('div',{staticClass:\"quota\",attrs:{\"id\":\"headerQuota\"}},[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.t('settings', 'Quota'))+\"\\n\\t\\t\")]),_vm._v(\" \"),(_vm.showConfig.showLanguages)?_c('div',{staticClass:\"languages\",attrs:{\"id\":\"headerLanguages\"}},[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.t('settings', 'Language'))+\"\\n\\t\\t\")]):_vm._e(),_vm._v(\" \"),(_vm.showConfig.showUserBackend || _vm.showConfig.showStoragePath)?_c('div',{staticClass:\"headerUserBackend userBackend\"},[(_vm.showConfig.showUserBackend)?_c('div',{staticClass:\"userBackend\"},[_vm._v(\"\\n\\t\\t\\t\\t\"+_vm._s(_vm.t('settings', 'User backend'))+\"\\n\\t\\t\\t\")]):_vm._e(),_vm._v(\" \"),(_vm.showConfig.showStoragePath)?_c('div',{staticClass:\"subtitle storageLocation\"},[_vm._v(\"\\n\\t\\t\\t\\t\"+_vm._s(_vm.t('settings', 'Storage location'))+\"\\n\\t\\t\\t\")]):_vm._e()]):_vm._e(),_vm._v(\" \"),(_vm.showConfig.showLastLogin)?_c('div',{staticClass:\"headerLastLogin lastLogin\"},[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.t('settings', 'Last login'))+\"\\n\\t\\t\")]):_vm._e(),_vm._v(\" \"),_c('div',{staticClass:\"userActions\"})]),_vm._v(\" \"),_vm._l((_vm.filteredUsers),function(user){return _c('user-row',{key:user.id,attrs:{\"external-actions\":_vm.externalActions,\"groups\":_vm.groups,\"languages\":_vm.languages,\"quota-options\":_vm.quotaOptions,\"settings\":_vm.settings,\"show-config\":_vm.showConfig,\"sub-admins-groups\":_vm.subAdminsGroups,\"user\":user,\"is-dark-theme\":_vm.isDarkTheme}})}),_vm._v(\" \"),_c('InfiniteLoading',{ref:\"infiniteLoading\",on:{\"infinite\":_vm.infiniteHandler}},[_c('div',{attrs:{\"slot\":\"spinner\"},slot:\"spinner\"},[_c('div',{staticClass:\"users-icon-loading icon-loading\"})]),_vm._v(\" \"),_c('div',{attrs:{\"slot\":\"no-more\"},slot:\"no-more\"},[_c('div',{staticClass:\"users-list-end\"})]),_vm._v(\" \"),_c('div',{attrs:{\"slot\":\"no-results\"},slot:\"no-results\"},[_c('div',{attrs:{\"id\":\"emptycontent\"}},[_c('div',{staticClass:\"icon-contacts-dark\"}),_vm._v(\" \"),_c('h2',[_vm._v(_vm._s(_vm.t('settings', 'No users in here')))])])])])],2)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<!--\n - @copyright Copyright (c) 2018 John Molakvoæ <skjnldsv@protonmail.com>\n -\n - @author John Molakvoæ <skjnldsv@protonmail.com>\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<NcContent app-name=\"settings\" :navigation-class=\"{ 'icon-loading': loadingAddGroup }\">\n\t\t<NcAppNavigation>\n\t\t\t<NcAppNavigationNew button-id=\"new-user-button\"\n\t\t\t\t:text=\"t('settings','New user')\"\n\t\t\t\tbutton-class=\"icon-add\"\n\t\t\t\t@click=\"showNewUserMenu\"\n\t\t\t\t@keyup.enter=\"showNewUserMenu\"\n\t\t\t\t@keyup.space=\"showNewUserMenu\" />\n\t\t\t<template #list>\n\t\t\t\t<NcAppNavigationItem id=\"addgroup\"\n\t\t\t\t\tref=\"addGroup\"\n\t\t\t\t\t:edit-placeholder=\"t('settings', 'Enter group name')\"\n\t\t\t\t\t:editable=\"true\"\n\t\t\t\t\t:loading=\"loadingAddGroup\"\n\t\t\t\t\t:title=\"t('settings', 'Add group')\"\n\t\t\t\t\ticon=\"icon-add\"\n\t\t\t\t\t@click=\"showAddGroupForm\"\n\t\t\t\t\t@update:title=\"createGroup\" />\n\t\t\t\t<NcAppNavigationItem id=\"everyone\"\n\t\t\t\t\t:exact=\"true\"\n\t\t\t\t\t:title=\"t('settings', 'Active users')\"\n\t\t\t\t\t:to=\"{ name: 'users' }\"\n\t\t\t\t\ticon=\"icon-contacts-dark\">\n\t\t\t\t\t<NcAppNavigationCounter v-if=\"userCount > 0\" slot=\"counter\">\n\t\t\t\t\t\t{{ userCount }}\n\t\t\t\t\t</NcAppNavigationCounter>\n\t\t\t\t</NcAppNavigationItem>\n\t\t\t\t<NcAppNavigationItem v-if=\"settings.isAdmin\"\n\t\t\t\t\tid=\"admin\"\n\t\t\t\t\t:exact=\"true\"\n\t\t\t\t\t:title=\"t('settings', 'Admins')\"\n\t\t\t\t\t:to=\"{ name: 'group', params: { selectedGroup: 'admin' } }\"\n\t\t\t\t\ticon=\"icon-user-admin\">\n\t\t\t\t\t<NcAppNavigationCounter v-if=\"adminGroupMenu.count\" slot=\"counter\">\n\t\t\t\t\t\t{{ adminGroupMenu.count }}\n\t\t\t\t\t</NcAppNavigationCounter>\n\t\t\t\t</NcAppNavigationItem>\n\n\t\t\t\t<!-- Hide the disabled if none, if we don't have the data (-1) show it -->\n\t\t\t\t<NcAppNavigationItem v-if=\"disabledGroupMenu.usercount > 0 || disabledGroupMenu.usercount === -1\"\n\t\t\t\t\tid=\"disabled\"\n\t\t\t\t\t:exact=\"true\"\n\t\t\t\t\t:title=\"t('settings', 'Disabled users')\"\n\t\t\t\t\t:to=\"{ name: 'group', params: { selectedGroup: 'disabled' } }\"\n\t\t\t\t\ticon=\"icon-disabled-users\">\n\t\t\t\t\t<NcAppNavigationCounter v-if=\"disabledGroupMenu.usercount > 0\" slot=\"counter\">\n\t\t\t\t\t\t{{ disabledGroupMenu.usercount }}\n\t\t\t\t\t</NcAppNavigationCounter>\n\t\t\t\t</NcAppNavigationItem>\n\n\t\t\t\t<NcAppNavigationCaption v-if=\"groupList.length > 0\" :title=\"t('settings', 'Groups')\" />\n\t\t\t\t<GroupListItem v-for=\"group in groupList\"\n\t\t\t\t\t:id=\"group.id\"\n\t\t\t\t\t:key=\"group.id\"\n\t\t\t\t\t:title=\"group.title\"\n\t\t\t\t\t:count=\"group.count\" />\n\t\t\t</template>\n\t\t\t<template #footer>\n\t\t\t\t<NcAppNavigationSettings>\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<p>{{ t('settings', 'Default quota:') }}</p>\n\t\t\t\t\t\t<NcMultiselect :value=\"defaultQuota\"\n\t\t\t\t\t\t\t:options=\"quotaOptions\"\n\t\t\t\t\t\t\ttag-placeholder=\"create\"\n\t\t\t\t\t\t\t:placeholder=\"t('settings', 'Select default quota')\"\n\t\t\t\t\t\t\tlabel=\"label\"\n\t\t\t\t\t\t\ttrack-by=\"id\"\n\t\t\t\t\t\t\t:allow-empty=\"false\"\n\t\t\t\t\t\t\t:taggable=\"true\"\n\t\t\t\t\t\t\t@tag=\"validateQuota\"\n\t\t\t\t\t\t\t@input=\"setDefaultQuota\" />\n\t\t\t\t\t</div>\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<input id=\"showLanguages\"\n\t\t\t\t\t\t\tv-model=\"showLanguages\"\n\t\t\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\t\t\tclass=\"checkbox\">\n\t\t\t\t\t\t<label for=\"showLanguages\">{{ t('settings', 'Show Languages') }}</label>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<input id=\"showLastLogin\"\n\t\t\t\t\t\t\tv-model=\"showLastLogin\"\n\t\t\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\t\t\tclass=\"checkbox\">\n\t\t\t\t\t\t<label for=\"showLastLogin\">{{ t('settings', 'Show last login') }}</label>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<input id=\"showUserBackend\"\n\t\t\t\t\t\t\tv-model=\"showUserBackend\"\n\t\t\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\t\t\tclass=\"checkbox\">\n\t\t\t\t\t\t<label for=\"showUserBackend\">{{ t('settings', 'Show user backend') }}</label>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<input id=\"showStoragePath\"\n\t\t\t\t\t\t\tv-model=\"showStoragePath\"\n\t\t\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\t\t\tclass=\"checkbox\">\n\t\t\t\t\t\t<label for=\"showStoragePath\">{{ t('settings', 'Show storage path') }}</label>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<input id=\"sendWelcomeMail\"\n\t\t\t\t\t\t\tv-model=\"sendWelcomeMail\"\n\t\t\t\t\t\t\t:disabled=\"loadingSendMail\"\n\t\t\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\t\t\tclass=\"checkbox\">\n\t\t\t\t\t\t<label for=\"sendWelcomeMail\">{{ t('settings', 'Send email to new user') }}</label>\n\t\t\t\t\t</div>\n\t\t\t\t</NcAppNavigationSettings>\n\t\t\t</template>\n\t\t</NcAppNavigation>\n\t\t<NcAppContent>\n\t\t\t<UserList :users=\"users\"\n\t\t\t\t:show-config=\"showConfig\"\n\t\t\t\t:selected-group=\"selectedGroupDecoded\"\n\t\t\t\t:external-actions=\"externalActions\" />\n\t\t</NcAppContent>\n\t</NcContent>\n</template>\n\n<script>\nimport NcAppContent from '@nextcloud/vue/dist/Components/NcAppContent'\nimport NcAppNavigation from '@nextcloud/vue/dist/Components/NcAppNavigation'\nimport NcAppNavigationCaption from '@nextcloud/vue/dist/Components/NcAppNavigationCaption'\nimport NcAppNavigationCounter from '@nextcloud/vue/dist/Components/NcAppNavigationCounter'\nimport NcAppNavigationItem from '@nextcloud/vue/dist/Components/NcAppNavigationItem'\nimport NcAppNavigationNew from '@nextcloud/vue/dist/Components/NcAppNavigationNew'\nimport NcAppNavigationSettings from '@nextcloud/vue/dist/Components/NcAppNavigationSettings'\nimport axios from '@nextcloud/axios'\nimport NcContent from '@nextcloud/vue/dist/Components/NcContent'\nimport { generateUrl } from '@nextcloud/router'\nimport NcMultiselect from '@nextcloud/vue/dist/Components/NcMultiselect'\nimport Vue from 'vue'\nimport VueLocalStorage from 'vue-localstorage'\n\nimport GroupListItem from '../components/GroupListItem'\nimport UserList from '../components/UserList'\n\nVue.use(VueLocalStorage)\n\nexport default {\n\tname: 'Users',\n\tcomponents: {\n\t\tNcAppContent,\n\t\tNcAppNavigation,\n\t\tNcAppNavigationCaption,\n\t\tNcAppNavigationCounter,\n\t\tNcAppNavigationItem,\n\t\tNcAppNavigationNew,\n\t\tNcAppNavigationSettings,\n\t\tNcContent,\n\t\tGroupListItem,\n\t\tNcMultiselect,\n\t\tUserList,\n\t},\n\tprops: {\n\t\tselectedGroup: {\n\t\t\ttype: String,\n\t\t\tdefault: null,\n\t\t},\n\t},\n\tdata() {\n\t\treturn {\n\t\t\t// default quota is set to unlimited\n\t\t\tunlimitedQuota: { id: 'none', label: t('settings', 'Unlimited') },\n\t\t\t// temporary value used for multiselect change\n\t\t\tselectedQuota: false,\n\t\t\texternalActions: [],\n\t\t\tloadingAddGroup: false,\n\t\t\tloadingSendMail: false,\n\t\t\tshowConfig: {\n\t\t\t\tshowStoragePath: false,\n\t\t\t\tshowUserBackend: false,\n\t\t\t\tshowLastLogin: false,\n\t\t\t\tshowNewUserForm: false,\n\t\t\t\tshowLanguages: false,\n\t\t\t},\n\t\t}\n\t},\n\tcomputed: {\n\t\tselectedGroupDecoded() {\n\t\t\treturn this.selectedGroup ? decodeURIComponent(this.selectedGroup) : null\n\t\t},\n\t\tusers() {\n\t\t\treturn this.$store.getters.getUsers\n\t\t},\n\t\tgroups() {\n\t\t\treturn this.$store.getters.getGroups\n\t\t},\n\t\tusersOffset() {\n\t\t\treturn this.$store.getters.getUsersOffset\n\t\t},\n\t\tusersLimit() {\n\t\t\treturn this.$store.getters.getUsersLimit\n\t\t},\n\n\t\t// Local settings\n\t\tshowLanguages: {\n\t\t\tget() { return this.getLocalstorage('showLanguages') },\n\t\t\tset(status) {\n\t\t\t\tthis.setLocalStorage('showLanguages', status)\n\t\t\t},\n\t\t},\n\t\tshowLastLogin: {\n\t\t\tget() { return this.getLocalstorage('showLastLogin') },\n\t\t\tset(status) {\n\t\t\t\tthis.setLocalStorage('showLastLogin', status)\n\t\t\t},\n\t\t},\n\t\tshowUserBackend: {\n\t\t\tget() { return this.getLocalstorage('showUserBackend') },\n\t\t\tset(status) {\n\t\t\t\tthis.setLocalStorage('showUserBackend', status)\n\t\t\t},\n\t\t},\n\t\tshowStoragePath: {\n\t\t\tget() { return this.getLocalstorage('showStoragePath') },\n\t\t\tset(status) {\n\t\t\t\tthis.setLocalStorage('showStoragePath', status)\n\t\t\t},\n\t\t},\n\n\t\tuserCount() {\n\t\t\treturn this.$store.getters.getUserCount\n\t\t},\n\t\tsettings() {\n\t\t\treturn this.$store.getters.getServerData\n\t\t},\n\n\t\t// default quota\n\t\tquotaOptions() {\n\t\t\t// convert the preset array into objects\n\t\t\tconst quotaPreset = this.settings.quotaPreset.reduce((acc, cur) => acc.concat({ id: cur, label: cur }), [])\n\t\t\t// add default presets\n\t\t\tif (this.settings.allowUnlimitedQuota) {\n\t\t\t\tquotaPreset.unshift(this.unlimitedQuota)\n\t\t\t}\n\t\t\treturn quotaPreset\n\t\t},\n\t\t// mapping saved values to objects\n\t\tdefaultQuota: {\n\t\t\tget() {\n\t\t\t\tif (this.selectedQuota !== false) {\n\t\t\t\t\treturn this.selectedQuota\n\t\t\t\t}\n\t\t\t\tif (this.settings.defaultQuota !== this.unlimitedQuota.id && OC.Util.computerFileSize(this.settings.defaultQuota) >= 0) {\n\t\t\t\t\t// if value is valid, let's map the quotaOptions or return custom quota\n\t\t\t\t\treturn { id: this.settings.defaultQuota, label: this.settings.defaultQuota }\n\t\t\t\t}\n\t\t\t\treturn this.unlimitedQuota // unlimited\n\t\t\t},\n\t\t\tset(quota) {\n\t\t\t\tthis.selectedQuota = quota\n\t\t\t},\n\n\t\t},\n\n\t\tsendWelcomeMail: {\n\t\t\tget() {\n\t\t\t\treturn this.settings.newUserSendEmail\n\t\t\t},\n\t\t\tasync set(value) {\n\t\t\t\ttry {\n\t\t\t\t\tthis.loadingSendMail = true\n\t\t\t\t\tthis.$store.commit('setServerData', {\n\t\t\t\t\t\t...this.settings,\n\t\t\t\t\t\tnewUserSendEmail: value,\n\t\t\t\t\t})\n\t\t\t\t\tawait axios.post(generateUrl('/settings/users/preferences/newUser.sendEmail'), { value: value ? 'yes' : 'no' })\n\t\t\t\t} catch (e) {\n\t\t\t\t\tconsole.error('could not update newUser.sendEmail preference: ' + e.message, e)\n\t\t\t\t} finally {\n\t\t\t\t\tthis.loadingSendMail = false\n\t\t\t\t}\n\t\t\t},\n\t\t},\n\n\t\tgroupList() {\n\t\t\tconst groups = Array.isArray(this.groups) ? this.groups : []\n\n\t\t\treturn groups\n\t\t\t\t// filter out disabled and admin\n\t\t\t\t.filter(group => group.id !== 'disabled' && group.id !== 'admin')\n\t\t\t\t.map(group => this.formatGroupMenu(group))\n\t\t},\n\n\t\tadminGroupMenu() {\n\t\t\treturn this.formatGroupMenu(this.groups.find(group => group.id === 'admin'))\n\t\t},\n\t\tdisabledGroupMenu() {\n\t\t\treturn this.formatGroupMenu(this.groups.find(group => group.id === 'disabled'))\n\t\t},\n\t},\n\tbeforeMount() {\n\t\tthis.$store.commit('initGroups', {\n\t\t\tgroups: this.$store.getters.getServerData.groups,\n\t\t\torderBy: this.$store.getters.getServerData.sortGroups,\n\t\t\tuserCount: this.$store.getters.getServerData.userCount,\n\t\t})\n\t\tthis.$store.dispatch('getPasswordPolicyMinLength')\n\t},\n\tcreated() {\n\t\t// init the OCA.Settings.UserList object\n\t\t// and add the registerAction method\n\t\tObject.assign(OCA, {\n\t\t\tSettings: {\n\t\t\t\tUserList: {\n\t\t\t\t\tregisterAction: this.registerAction,\n\t\t\t\t},\n\t\t\t},\n\t\t})\n\t},\n\tmethods: {\n\t\tshowNewUserMenu() {\n\t\t\tthis.showConfig.showNewUserForm = true\n\t\t\tif (this.showConfig.showNewUserForm) {\n\t\t\t\tVue.nextTick(() => {\n\t\t\t\t\twindow.newusername.focus()\n\t\t\t\t})\n\t\t\t}\n\t\t},\n\t\tgetLocalstorage(key) {\n\t\t\t// force initialization\n\t\t\tconst localConfig = this.$localStorage.get(key)\n\t\t\t// if localstorage is null, fallback to original values\n\t\t\tthis.showConfig[key] = localConfig !== null ? localConfig === 'true' : this.showConfig[key]\n\t\t\treturn this.showConfig[key]\n\t\t},\n\t\tsetLocalStorage(key, status) {\n\t\t\tthis.showConfig[key] = status\n\t\t\tthis.$localStorage.set(key, status)\n\t\t\treturn status\n\t\t},\n\n\t\t/**\n\t\t * Dispatch default quota set request\n\t\t *\n\t\t * @param {string | object} quota Quota in readable format '5 GB' or Object {id: '5 GB', label: '5GB'}\n\t\t */\n\t\tsetDefaultQuota(quota = 'none') {\n\t\t\tthis.$store.dispatch('setAppConfig', {\n\t\t\t\tapp: 'files',\n\t\t\t\tkey: 'default_quota',\n\t\t\t\t// ensure we only send the preset id\n\t\t\t\tvalue: quota.id ? quota.id : quota,\n\t\t\t}).then(() => {\n\t\t\t\tif (typeof quota !== 'object') {\n\t\t\t\t\tquota = { id: quota, label: quota }\n\t\t\t\t}\n\t\t\t\tthis.defaultQuota = quota\n\t\t\t})\n\t\t},\n\n\t\t/**\n\t\t * Validate quota string to make sure it's a valid human file size\n\t\t *\n\t\t * @param {string} quota Quota in readable format '5 GB'\n\t\t * @return {Promise|boolean}\n\t\t */\n\t\tvalidateQuota(quota) {\n\t\t\t// only used for new presets sent through @Tag\n\t\t\tconst validQuota = OC.Util.computerFileSize(quota)\n\t\t\tif (validQuota === null) {\n\t\t\t\treturn this.setDefaultQuota('none')\n\t\t\t} else {\n\t\t\t\t// unify format output\n\t\t\t\treturn this.setDefaultQuota(OC.Util.humanFileSize(OC.Util.computerFileSize(quota)))\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Register a new action for the user menu\n\t\t *\n\t\t * @param {string} icon the icon class\n\t\t * @param {string} text the text to display\n\t\t * @param {Function} action the function to run\n\t\t * @return {Array}\n\t\t */\n\t\tregisterAction(icon, text, action) {\n\t\t\tthis.externalActions.push({\n\t\t\t\ticon,\n\t\t\t\ttext,\n\t\t\t\taction,\n\t\t\t})\n\t\t\treturn this.externalActions\n\t\t},\n\n\t\t/**\n\t\t * Create a new group\n\t\t *\n\t\t * @param {string} gid The group id\n\t\t */\n\t\tasync createGroup(gid) {\n\t\t\t// group is not valid\n\t\t\tif (gid.trim() === '') {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tthis.loadingAddGroup = true\n\t\t\t\tawait this.$store.dispatch('addGroup', gid.trim())\n\n\t\t\t\tthis.hideAddGroupForm()\n\t\t\t\tawait this.$router.push({\n\t\t\t\t\tname: 'group',\n\t\t\t\t\tparams: {\n\t\t\t\t\t\tselectedGroup: encodeURIComponent(gid.trim()),\n\t\t\t\t\t},\n\t\t\t\t})\n\t\t\t} catch {\n\t\t\t\tthis.showAddGroupForm()\n\t\t\t} finally {\n\t\t\t\tthis.loadingAddGroup = false\n\t\t\t}\n\t\t},\n\n\t\tshowAddGroupForm() {\n\t\t\tthis.$refs.addGroup.editingActive = true\n\t\t\tthis.$refs.addGroup.onMenuToggle(false)\n\t\t\tthis.$nextTick(() => {\n\t\t\t\tthis.$refs.addGroup.$refs.editingInput.focusInput()\n\t\t\t})\n\t\t},\n\n\t\thideAddGroupForm() {\n\t\t\tthis.$refs.addGroup.editingActive = false\n\t\t\tthis.$refs.addGroup.editingValue = ''\n\t\t},\n\n\t\t/**\n\t\t * Format a group to a menu entry\n\t\t *\n\t\t * @param {object} group the group\n\t\t * @return {object}\n\t\t */\n\t\tformatGroupMenu(group) {\n\t\t\tconst item = {}\n\t\t\tif (typeof group === 'undefined') {\n\t\t\t\treturn {}\n\t\t\t}\n\n\t\t\titem.id = group.id\n\t\t\titem.title = group.name\n\t\t\titem.usercount = group.usercount\n\n\t\t\t// users count for all groups\n\t\t\tif (group.usercount - group.disabled > 0) {\n\t\t\t\titem.count = group.usercount - group.disabled\n\t\t\t}\n\n\t\t\treturn item\n\t\t},\n\t},\n}\n</script>\n\n<style lang=\"scss\" scoped>\n// force hiding the editing action for the add group entry\n.app-navigation__list #addgroup::v-deep .app-navigation-entry__utils {\n\tdisplay: none;\n}\n</style>\n","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Users.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!./Users.vue?vue&type=script&lang=js&\"","\n import API from \"!../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Users.vue?vue&type=style&index=0&id=7004587b&lang=scss&scoped=true&\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Users.vue?vue&type=style&index=0&id=7004587b&lang=scss&scoped=true&\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./Users.vue?vue&type=template&id=7004587b&scoped=true&\"\nimport script from \"./Users.vue?vue&type=script&lang=js&\"\nexport * from \"./Users.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Users.vue?vue&type=style&index=0&id=7004587b&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"7004587b\",\n null\n \n)\n\nexport default component.exports"],"names":["___CSS_LOADER_EXPORT___","push","module","id","_vm","this","_h","$createElement","_c","_self","key","attrs","title","name","params","selectedGroup","encodeURIComponent","loadingRenameGroup","openGroupMenu","on","handleGroupMenuOpen","scopedSlots","_u","fn","_v","_s","count","_e","proxy","settings","isAdmin","ref","$event","renameGroup","t","removeGroup","props","user","type","Object","required","default","groups","Array","subAdminsGroups","quotaOptions","showConfig","languages","externalActions","computed","userGroups","filter","group","includes","userSubAdminsGroups","subadmin","availableGroups","map","groupClone","assign","$isDisabled","canAdd","canRemove","usedSpace","quota","used","size","OC","Util","humanFileSize","usedQuota","Math","min","round","pow","isNaN","userQuota","humanQuota","find","label","minPasswordLength","$store","getters","getPasswordPolicyMinLength","userLanguage","userLang","concat","lang","code","language","userLastLoginTooltip","lastLogin","formatDate","userLastLogin","relativeModifiedDate","methods","generateAvatar","isDarkTheme","generateUrl","version","oc_userconfig","avatar","options","styleTagTransform","setAttributes","insert","domAPI","insertStyleElement","staticClass","class","loading","delete","disable","wipe","directives","rawName","value","displayname","length","expression","email","userGroupsLabels","userSubAdminsGroupsLabels","domProps","showUserBackend","showStoragePath","backend","storageLocation","modifiers","canEdit","all","toggleEdit","preventDefault","toggleMenu","apply","arguments","openedMenu","userActions","style","opacity","feedbackMessage","keys","editing","backendCapabilities","displayName","updateDisplayName","rand","canChangePassword","setPassword","password","updatePassword","mailAddress","updateEmail","removeUserGroup","addUserGroup","createGroup","slot","subadmins","removeUserSubAdmin","addUserSubAdmin","setUserQuota","validateQuota","setUserLanguage","onScroll","closeModal","createUser","newUser","newUserGenerateUserID","target","composing","$set","newUserRequireEmail","canAddGroups","model","callback","$$v","scrolled","showNewUserForm","_l","infiniteHandler","loadingAddGroup","showAddGroupForm","userCount","adminGroupMenu","disabledGroupMenu","usercount","groupList","defaultQuota","setDefaultQuota","isArray","showLanguages","_i","$$a","$$el","$$c","checked","$$i","slice","showLastLogin","loadingSendMail","sendWelcomeMail","showNewUserMenu","indexOf","_k","keyCode","users","selectedGroupDecoded"],"sourceRoot":""}
\ No newline at end of file +{"version":3,"file":"settings-users-8351.js?v=48806c008b493bc010bb","mappings":"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AWpB,EAAIqB,GAAGrB,EAAIwI,iBAAiB,kBAC32H,IDWpB,EACA,KACA,KACA,MAIF,GAAe,GAAiB,wUEuOhC,oBAEA,QACA,eACA,YACA,iBACA,8BACA,sBACA,gCACA,+BAEA,YACA,kBAEA,YACA,OACA,MACA,YACA,aAEA,UACA,YACA,8BAEA,QACA,WACA,8BAEA,iBACA,WACA,8BAEA,cACA,WACA,8BAEA,YACA,YACA,8BAEA,WACA,WACA,aAEA,iBACA,WACA,8BAEA,aACA,aACA,cAGA,KAnDA,WAoDA,OACA,iCACA,cACA,mBACA,WACA,SACA,OACA,eACA,YACA,eACA,UACA,aACA,SACA,UACA,WACA,aACA,WAIA,UAEA,YAFA,WAGA,OACA,CACA,mBACA,iCACA,wBAEA,CACA,mBACA,sCACA,6BAEA,CACA,+CACA,gFACA,gCAUA,OAPA,8CACA,QACA,iBACA,0CACA,8BAGA,iCAIA,SAEA,WAFA,WAGA,kCAEA,SALA,WAMA,oBAGA,gBATA,WASA,WACA,eACA,8BACA,6NACA,uCACA,CACA,+BACA,2DACA,uBACA,gCAEA,YACA,IACA,kBACA,iBACA,uCACA,iBACA,kBACA,wBAIA,IAIA,WAnCA,WAmCA,WACA,eACA,8BACA,8GACA,iCACA,CACA,+BACA,6DACA,uBACA,gCAEA,YACA,KAGA,OAFA,oBACA,iBACA,kCACA,iBACA,oBACA,uBAIA,IAIA,kBA7DA,WA6DA,WACA,uBACA,oBACA,mBACA,qBACA,iDACA,SACA,YAEA,iBACA,oBACA,qBASA,kBAjFA,WAiFA,WACA,+BACA,4BACA,oCACA,oBACA,kBACA,UACA,iBACA,yBACA,gCASA,eAnGA,WAmGA,WACA,4BACA,yBACA,oCACA,oBACA,eACA,UACA,iBACA,sBACA,8BASA,YArHA,WAqHA,WACA,+BACA,4BACA,oCACA,oBACA,YACA,UACA,iBACA,yBACA,gCASA,YAvIA,SAuIA,2JACA,mCADA,kBAGA,gCAHA,cAIA,YAJA,SAKA,mDALA,uDAOA,oBAPA,yBASA,mCATA,8CAWA,6CAXA,kEAmBA,aA1JA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","sources":["webpack:///nextcloud/apps/settings/src/components/UserList/UserRow.vue?vue&type=style&index=0&id=573e6411&scoped=true&lang=scss&","webpack:///nextcloud/apps/settings/src/components/UserList/UserRowSimple.vue?vue&type=style&index=0&lang=scss&","webpack:///nextcloud/apps/settings/src/views/Users.vue?vue&type=style&index=0&id=7004587b&lang=scss&scoped=true&","webpack:///nextcloud/apps/settings/src/components/UserList.vue?vue&type=style&index=0&id=09961579&scoped=true&lang=css&","webpack:///nextcloud/apps/settings/src/views/Users.vue?vue&type=template&id=7004587b&scoped=true&","webpack:///nextcloud/apps/settings/src/components/GroupListItem.vue","webpack:///nextcloud/apps/settings/src/components/GroupListItem.vue?vue&type=script&lang=js&","webpack://nextcloud/./apps/settings/src/components/GroupListItem.vue?7b19","webpack:///nextcloud/apps/settings/src/components/GroupListItem.vue?vue&type=template&id=03bc8784&","webpack:///nextcloud/apps/settings/src/mixins/UserRowMixin.js","webpack:///nextcloud/apps/settings/src/components/UserList/UserRowSimple.vue?vue&type=script&lang=js&","webpack:///nextcloud/apps/settings/src/components/UserList/UserRowSimple.vue","webpack://nextcloud/./apps/settings/src/components/UserList/UserRowSimple.vue?6980","webpack://nextcloud/./apps/settings/src/components/UserList/UserRowSimple.vue?6d7a","webpack:///nextcloud/apps/settings/src/components/UserList/UserRowSimple.vue?vue&type=template&id=6bcca1e8&","webpack:///nextcloud/apps/settings/src/components/UserList/UserRow.vue","webpack:///nextcloud/apps/settings/src/components/UserList/UserRow.vue?vue&type=script&lang=js&","webpack://nextcloud/./apps/settings/src/components/UserList/UserRow.vue?59cd","webpack://nextcloud/./apps/settings/src/components/UserList/UserRow.vue?81d2","webpack:///nextcloud/apps/settings/src/components/UserList/UserRow.vue?vue&type=template&id=573e6411&scoped=true&","webpack:///nextcloud/apps/settings/src/components/UserList.vue","webpack:///nextcloud/apps/settings/src/components/UserList.vue?vue&type=script&lang=js&","webpack://nextcloud/./apps/settings/src/components/UserList.vue?a04d","webpack://nextcloud/./apps/settings/src/components/UserList.vue?02a4","webpack:///nextcloud/apps/settings/src/components/UserList.vue?vue&type=template&id=09961579&scoped=true&","webpack:///nextcloud/apps/settings/src/views/Users.vue","webpack:///nextcloud/apps/settings/src/views/Users.vue?vue&type=script&lang=js&","webpack://nextcloud/./apps/settings/src/views/Users.vue?5879","webpack://nextcloud/./apps/settings/src/views/Users.vue?cf86"],"sourcesContent":["// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".row--menu-opened[data-v-573e6411]{z-index:1 !important}.row[data-v-573e6411] .multiselect__single{z-index:auto !important}\", \"\",{\"version\":3,\"sources\":[\"webpack://./apps/settings/src/components/UserList/UserRow.vue\"],\"names\":[],\"mappings\":\"AA6qBA,mCACC,oBAAA,CAED,2CACC,uBAAA\",\"sourcesContent\":[\"\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n// Force menu to be above other rows\\n.row--menu-opened {\\n\\tz-index: 1 !important;\\n}\\n.row::v-deep .multiselect__single {\\n\\tz-index: auto !important;\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".cellText{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.icon-more{background-color:var(--color-main-background);border:0}\", \"\",{\"version\":3,\"sources\":[\"webpack://./apps/settings/src/components/UserList/UserRowSimple.vue\"],\"names\":[],\"mappings\":\"AAkMC,UACC,eAAA,CACA,sBAAA,CACA,kBAAA,CAED,WACC,6CAAA,CACA,QAAA\",\"sourcesContent\":[\"\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\t.cellText {\\n\\t\\toverflow: hidden;\\n\\t\\ttext-overflow: ellipsis;\\n\\t\\twhite-space: nowrap;\\n}\\n\\t.icon-more {\\n\\t\\tbackground-color: var(--color-main-background);\\n\\t\\tborder: 0;\\n\\t}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".app-navigation__list #addgroup[data-v-7004587b] .app-navigation-entry__utils{display:none}\", \"\",{\"version\":3,\"sources\":[\"webpack://./apps/settings/src/views/Users.vue\"],\"names\":[],\"mappings\":\"AAieA,8EACC,YAAA\",\"sourcesContent\":[\"\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n// force hiding the editing action for the add group entry\\n.app-navigation__list #addgroup::v-deep .app-navigation-entry__utils {\\n\\tdisplay: none;\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"\\n.modal-wrapper[data-v-09961579] {\\n\\tmargin: 2vh 0;\\n\\talign-items: flex-start;\\n}\\n.modal__content[data-v-09961579] {\\n\\tdisplay: flex;\\n\\tpadding: 20px;\\n\\tflex-direction: column;\\n\\talign-items: center;\\n\\ttext-align: center;\\n}\\n.modal__item[data-v-09961579] {\\n\\tmargin-bottom: 16px;\\n\\twidth: 100%;\\n}\\n.modal__item[data-v-09961579]:not(:focus):not(:active) {\\n\\tborder-color: var(--color-border-dark);\\n}\\n.modal__item[data-v-09961579] .multiselect {\\n\\twidth: 100%;\\n}\\n.user-actions[data-v-09961579] {\\n\\tmargin-top: 20px;\\n}\\n.modal__content[data-v-09961579] .multiselect__single {\\n\\ttext-align: left;\\n\\tbox-sizing: border-box;\\n}\\n.modal__content[data-v-09961579] .multiselect__content-wrapper {\\n\\tbox-sizing: border-box;\\n}\\n.row[data-v-09961579] .multiselect__single {\\n\\tz-index: auto !important;\\n}\\n\\n/* fake input for groups validation */\\ninput#newgroups[data-v-09961579] {\\n\\tposition: absolute;\\n\\topacity: 0;\\n\\t/* The \\\"hidden\\\" input is behind the Multiselect, so in general it does\\n\\t * not receives clicks. However, with Firefox, after the validation\\n\\t * fails, it will receive the first click done on it, so its width needs\\n\\t * to be set to 0 to prevent that (\\\"pointer-events: none\\\" does not\\n\\t * prevent it). */\\n\\twidth: 0;\\n}\\n\", \"\",{\"version\":3,\"sources\":[\"webpack://./apps/settings/src/components/UserList.vue\"],\"names\":[],\"mappings\":\";AAslBA;CACA,aAAA;CACA,uBAAA;AACA;AACA;CACA,aAAA;CACA,aAAA;CACA,sBAAA;CACA,mBAAA;CACA,kBAAA;AACA;AACA;CACA,mBAAA;CACA,WAAA;AACA;AACA;CACA,sCAAA;AACA;AACA;CACA,WAAA;AACA;AACA;CACA,gBAAA;AACA;AACA;CACA,gBAAA;CACA,sBAAA;AACA;AACA;CACA,sBAAA;AACA;AACA;CACA,wBAAA;AACA;;AAEA,qCAAA;AACA;CACA,kBAAA;CACA,UAAA;CACA;;;;kBAIA;CACA,QAAA;AACA\",\"sourcesContent\":[\"<!--\\n - @copyright Copyright (c) 2018 John Molakvoæ <skjnldsv@protonmail.com>\\n -\\n - @author John Molakvoæ <skjnldsv@protonmail.com>\\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\\\" class=\\\"user-list-grid\\\" @scroll.passive=\\\"onScroll\\\">\\n\\t\\t<NcModal v-if=\\\"showConfig.showNewUserForm\\\" size=\\\"small\\\" @close=\\\"closeModal\\\">\\n\\t\\t\\t<form id=\\\"new-user\\\"\\n\\t\\t\\t\\t:disabled=\\\"loading.all\\\"\\n\\t\\t\\t\\tclass=\\\"modal__content\\\"\\n\\t\\t\\t\\t@submit.prevent=\\\"createUser\\\">\\n\\t\\t\\t\\t<h2>{{ t('settings','New user') }}</h2>\\n\\t\\t\\t\\t<input id=\\\"newusername\\\"\\n\\t\\t\\t\\t\\tref=\\\"newusername\\\"\\n\\t\\t\\t\\t\\tv-model=\\\"newUser.id\\\"\\n\\t\\t\\t\\t\\t:disabled=\\\"settings.newUserGenerateUserID\\\"\\n\\t\\t\\t\\t\\t:placeholder=\\\"settings.newUserGenerateUserID\\n\\t\\t\\t\\t\\t\\t? t('settings', 'Will be autogenerated')\\n\\t\\t\\t\\t\\t\\t: t('settings', 'Username')\\\"\\n\\t\\t\\t\\t\\tautocapitalize=\\\"none\\\"\\n\\t\\t\\t\\t\\tautocomplete=\\\"off\\\"\\n\\t\\t\\t\\t\\tautocorrect=\\\"off\\\"\\n\\t\\t\\t\\t\\tclass=\\\"modal__item\\\"\\n\\t\\t\\t\\t\\tname=\\\"username\\\"\\n\\t\\t\\t\\t\\tpattern=\\\"[a-zA-Z0-9 _\\\\.@\\\\-']+\\\"\\n\\t\\t\\t\\t\\trequired\\n\\t\\t\\t\\t\\ttype=\\\"text\\\">\\n\\t\\t\\t\\t<input id=\\\"newdisplayname\\\"\\n\\t\\t\\t\\t\\tv-model=\\\"newUser.displayName\\\"\\n\\t\\t\\t\\t\\t:placeholder=\\\"t('settings', 'Display name')\\\"\\n\\t\\t\\t\\t\\tautocapitalize=\\\"none\\\"\\n\\t\\t\\t\\t\\tautocomplete=\\\"off\\\"\\n\\t\\t\\t\\t\\tautocorrect=\\\"off\\\"\\n\\t\\t\\t\\t\\tclass=\\\"modal__item\\\"\\n\\t\\t\\t\\t\\tname=\\\"displayname\\\"\\n\\t\\t\\t\\t\\ttype=\\\"text\\\">\\n\\t\\t\\t\\t<input id=\\\"newuserpassword\\\"\\n\\t\\t\\t\\t\\tref=\\\"newuserpassword\\\"\\n\\t\\t\\t\\t\\tv-model=\\\"newUser.password\\\"\\n\\t\\t\\t\\t\\t:minlength=\\\"minPasswordLength\\\"\\n\\t\\t\\t\\t\\t:maxlength=\\\"469\\\"\\n\\t\\t\\t\\t\\t:placeholder=\\\"t('settings', 'Password')\\\"\\n\\t\\t\\t\\t\\t:required=\\\"newUser.mailAddress===''\\\"\\n\\t\\t\\t\\t\\tautocapitalize=\\\"none\\\"\\n\\t\\t\\t\\t\\tautocomplete=\\\"new-password\\\"\\n\\t\\t\\t\\t\\tautocorrect=\\\"off\\\"\\n\\t\\t\\t\\t\\tclass=\\\"modal__item\\\"\\n\\t\\t\\t\\t\\tname=\\\"password\\\"\\n\\t\\t\\t\\t\\ttype=\\\"password\\\">\\n\\t\\t\\t\\t<input id=\\\"newemail\\\"\\n\\t\\t\\t\\t\\tv-model=\\\"newUser.mailAddress\\\"\\n\\t\\t\\t\\t\\t:placeholder=\\\"t('settings', 'Email')\\\"\\n\\t\\t\\t\\t\\t:required=\\\"newUser.password==='' || settings.newUserRequireEmail\\\"\\n\\t\\t\\t\\t\\tautocapitalize=\\\"none\\\"\\n\\t\\t\\t\\t\\tautocomplete=\\\"off\\\"\\n\\t\\t\\t\\t\\tautocorrect=\\\"off\\\"\\n\\t\\t\\t\\t\\tclass=\\\"modal__item\\\"\\n\\t\\t\\t\\t\\tname=\\\"email\\\"\\n\\t\\t\\t\\t\\ttype=\\\"email\\\">\\n\\t\\t\\t\\t<div class=\\\"groups modal__item\\\">\\n\\t\\t\\t\\t\\t<!-- hidden input trick for vanilla html5 form validation -->\\n\\t\\t\\t\\t\\t<input v-if=\\\"!settings.isAdmin\\\"\\n\\t\\t\\t\\t\\t\\tid=\\\"newgroups\\\"\\n\\t\\t\\t\\t\\t\\t:class=\\\"{'icon-loading-small': loading.groups}\\\"\\n\\t\\t\\t\\t\\t\\t:required=\\\"!settings.isAdmin\\\"\\n\\t\\t\\t\\t\\t\\t:value=\\\"newUser.groups\\\"\\n\\t\\t\\t\\t\\t\\ttabindex=\\\"-1\\\"\\n\\t\\t\\t\\t\\t\\ttype=\\\"text\\\">\\n\\t\\t\\t\\t\\t<NcMultiselect v-model=\\\"newUser.groups\\\"\\n\\t\\t\\t\\t\\t\\t:close-on-select=\\\"false\\\"\\n\\t\\t\\t\\t\\t\\t:disabled=\\\"loading.groups||loading.all\\\"\\n\\t\\t\\t\\t\\t\\t:multiple=\\\"true\\\"\\n\\t\\t\\t\\t\\t\\t:options=\\\"canAddGroups\\\"\\n\\t\\t\\t\\t\\t\\t:placeholder=\\\"t('settings', 'Add user to group')\\\"\\n\\t\\t\\t\\t\\t\\t:tag-width=\\\"60\\\"\\n\\t\\t\\t\\t\\t\\t:taggable=\\\"true\\\"\\n\\t\\t\\t\\t\\t\\tclass=\\\"multiselect-vue\\\"\\n\\t\\t\\t\\t\\t\\tlabel=\\\"name\\\"\\n\\t\\t\\t\\t\\t\\ttag-placeholder=\\\"create\\\"\\n\\t\\t\\t\\t\\t\\ttrack-by=\\\"id\\\"\\n\\t\\t\\t\\t\\t\\t@tag=\\\"createGroup\\\">\\n\\t\\t\\t\\t\\t\\t<!-- If user is not admin, he is a subadmin.\\n\\t\\t\\t\\t\\t\\t\\tSubadmins can't create users outside their groups\\n\\t\\t\\t\\t\\t\\t\\tTherefore, empty select is forbidden -->\\n\\t\\t\\t\\t\\t\\t<span slot=\\\"noResult\\\">{{ t('settings', 'No results') }}</span>\\n\\t\\t\\t\\t\\t</NcMultiselect>\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t\\t<div v-if=\\\"subAdminsGroups.length>0 && settings.isAdmin\\\"\\n\\t\\t\\t\\t\\tclass=\\\"subadmins modal__item\\\">\\n\\t\\t\\t\\t\\t<NcMultiselect v-model=\\\"newUser.subAdminsGroups\\\"\\n\\t\\t\\t\\t\\t\\t:close-on-select=\\\"false\\\"\\n\\t\\t\\t\\t\\t\\t:multiple=\\\"true\\\"\\n\\t\\t\\t\\t\\t\\t:options=\\\"subAdminsGroups\\\"\\n\\t\\t\\t\\t\\t\\t:placeholder=\\\"t('settings', 'Set user as admin for')\\\"\\n\\t\\t\\t\\t\\t\\t:tag-width=\\\"60\\\"\\n\\t\\t\\t\\t\\t\\tclass=\\\"multiselect-vue\\\"\\n\\t\\t\\t\\t\\t\\tlabel=\\\"name\\\"\\n\\t\\t\\t\\t\\t\\ttrack-by=\\\"id\\\">\\n\\t\\t\\t\\t\\t\\t<span slot=\\\"noResult\\\">{{ t('settings', 'No results') }}</span>\\n\\t\\t\\t\\t\\t</NcMultiselect>\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t\\t<div class=\\\"quota modal__item\\\">\\n\\t\\t\\t\\t\\t<NcMultiselect v-model=\\\"newUser.quota\\\"\\n\\t\\t\\t\\t\\t\\t:allow-empty=\\\"false\\\"\\n\\t\\t\\t\\t\\t\\t:options=\\\"quotaOptions\\\"\\n\\t\\t\\t\\t\\t\\t:placeholder=\\\"t('settings', 'Select user quota')\\\"\\n\\t\\t\\t\\t\\t\\t:taggable=\\\"true\\\"\\n\\t\\t\\t\\t\\t\\tclass=\\\"multiselect-vue\\\"\\n\\t\\t\\t\\t\\t\\tlabel=\\\"label\\\"\\n\\t\\t\\t\\t\\t\\ttrack-by=\\\"id\\\"\\n\\t\\t\\t\\t\\t\\t@tag=\\\"validateQuota\\\" />\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t\\t<div v-if=\\\"showConfig.showLanguages\\\" class=\\\"languages modal__item\\\">\\n\\t\\t\\t\\t\\t<NcMultiselect v-model=\\\"newUser.language\\\"\\n\\t\\t\\t\\t\\t\\t:allow-empty=\\\"false\\\"\\n\\t\\t\\t\\t\\t\\t:options=\\\"languages\\\"\\n\\t\\t\\t\\t\\t\\t:placeholder=\\\"t('settings', 'Default language')\\\"\\n\\t\\t\\t\\t\\t\\tclass=\\\"multiselect-vue\\\"\\n\\t\\t\\t\\t\\t\\tgroup-label=\\\"label\\\"\\n\\t\\t\\t\\t\\t\\tgroup-values=\\\"languages\\\"\\n\\t\\t\\t\\t\\t\\tlabel=\\\"name\\\"\\n\\t\\t\\t\\t\\t\\ttrack-by=\\\"code\\\" />\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t\\t<div v-if=\\\"showConfig.showStoragePath\\\" class=\\\"storageLocation\\\" />\\n\\t\\t\\t\\t<div v-if=\\\"showConfig.showUserBackend\\\" class=\\\"userBackend\\\" />\\n\\t\\t\\t\\t<div v-if=\\\"showConfig.showLastLogin\\\" class=\\\"lastLogin\\\" />\\n\\t\\t\\t\\t<div class=\\\"user-actions\\\">\\n\\t\\t\\t\\t\\t<NcButton id=\\\"newsubmit\\\"\\n\\t\\t\\t\\t\\t\\ttype=\\\"primary\\\"\\n\\t\\t\\t\\t\\t\\tnative-type=\\\"submit\\\"\\n\\t\\t\\t\\t\\t\\tvalue=\\\"\\\">\\n\\t\\t\\t\\t\\t\\t{{ t('settings', 'Add a new user') }}\\n\\t\\t\\t\\t\\t</NcButton>\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t</form>\\n\\t\\t</NcModal>\\n\\t\\t<div id=\\\"grid-header\\\"\\n\\t\\t\\t:class=\\\"{'sticky': scrolled && !showConfig.showNewUserForm}\\\"\\n\\t\\t\\tclass=\\\"row\\\">\\n\\t\\t\\t<div id=\\\"headerAvatar\\\" class=\\\"avatar\\\" />\\n\\t\\t\\t<div id=\\\"headerName\\\" class=\\\"name\\\">\\n\\t\\t\\t\\t<div class=\\\"subtitle\\\">\\n\\t\\t\\t\\t\\t<strong>\\n\\t\\t\\t\\t\\t\\t{{ t('settings', 'Display name') }}\\n\\t\\t\\t\\t\\t</strong>\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t\\t{{ t('settings', 'Username') }}\\n\\t\\t\\t</div>\\n\\t\\t\\t<div id=\\\"headerPassword\\\" class=\\\"password\\\">\\n\\t\\t\\t\\t{{ t('settings', 'Password') }}\\n\\t\\t\\t</div>\\n\\t\\t\\t<div id=\\\"headerAddress\\\" class=\\\"mailAddress\\\">\\n\\t\\t\\t\\t{{ t('settings', 'Email') }}\\n\\t\\t\\t</div>\\n\\t\\t\\t<div id=\\\"headerGroups\\\" class=\\\"groups\\\">\\n\\t\\t\\t\\t{{ t('settings', 'Groups') }}\\n\\t\\t\\t</div>\\n\\t\\t\\t<div v-if=\\\"subAdminsGroups.length>0 && settings.isAdmin\\\"\\n\\t\\t\\t\\tid=\\\"headerSubAdmins\\\"\\n\\t\\t\\t\\tclass=\\\"subadmins\\\">\\n\\t\\t\\t\\t{{ t('settings', 'Group admin for') }}\\n\\t\\t\\t</div>\\n\\t\\t\\t<div id=\\\"headerQuota\\\" class=\\\"quota\\\">\\n\\t\\t\\t\\t{{ t('settings', 'Quota') }}\\n\\t\\t\\t</div>\\n\\t\\t\\t<div v-if=\\\"showConfig.showLanguages\\\"\\n\\t\\t\\t\\tid=\\\"headerLanguages\\\"\\n\\t\\t\\t\\tclass=\\\"languages\\\">\\n\\t\\t\\t\\t{{ t('settings', 'Language') }}\\n\\t\\t\\t</div>\\n\\n\\t\\t\\t<div v-if=\\\"showConfig.showUserBackend || showConfig.showStoragePath\\\"\\n\\t\\t\\t\\tclass=\\\"headerUserBackend userBackend\\\">\\n\\t\\t\\t\\t<div v-if=\\\"showConfig.showUserBackend\\\" class=\\\"userBackend\\\">\\n\\t\\t\\t\\t\\t{{ t('settings', 'User backend') }}\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t\\t<div v-if=\\\"showConfig.showStoragePath\\\"\\n\\t\\t\\t\\t\\tclass=\\\"subtitle storageLocation\\\">\\n\\t\\t\\t\\t\\t{{ t('settings', 'Storage location') }}\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t</div>\\n\\t\\t\\t<div v-if=\\\"showConfig.showLastLogin\\\"\\n\\t\\t\\t\\tclass=\\\"headerLastLogin lastLogin\\\">\\n\\t\\t\\t\\t{{ t('settings', 'Last login') }}\\n\\t\\t\\t</div>\\n\\n\\t\\t\\t<div class=\\\"userActions\\\" />\\n\\t\\t</div>\\n\\n\\t\\t<user-row v-for=\\\"user in filteredUsers\\\"\\n\\t\\t\\t:key=\\\"user.id\\\"\\n\\t\\t\\t:external-actions=\\\"externalActions\\\"\\n\\t\\t\\t:groups=\\\"groups\\\"\\n\\t\\t\\t:languages=\\\"languages\\\"\\n\\t\\t\\t:quota-options=\\\"quotaOptions\\\"\\n\\t\\t\\t:settings=\\\"settings\\\"\\n\\t\\t\\t:show-config=\\\"showConfig\\\"\\n\\t\\t\\t:sub-admins-groups=\\\"subAdminsGroups\\\"\\n\\t\\t\\t:user=\\\"user\\\"\\n\\t\\t\\t:is-dark-theme=\\\"isDarkTheme\\\" />\\n\\t\\t<InfiniteLoading ref=\\\"infiniteLoading\\\" @infinite=\\\"infiniteHandler\\\">\\n\\t\\t\\t<div slot=\\\"spinner\\\">\\n\\t\\t\\t\\t<div class=\\\"users-icon-loading icon-loading\\\" />\\n\\t\\t\\t</div>\\n\\t\\t\\t<div slot=\\\"no-more\\\">\\n\\t\\t\\t\\t<div class=\\\"users-list-end\\\" />\\n\\t\\t\\t</div>\\n\\t\\t\\t<div slot=\\\"no-results\\\">\\n\\t\\t\\t\\t<div id=\\\"emptycontent\\\">\\n\\t\\t\\t\\t\\t<div class=\\\"icon-contacts-dark\\\" />\\n\\t\\t\\t\\t\\t<h2>{{ t('settings', 'No users in here') }}</h2>\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t</div>\\n\\t\\t</InfiniteLoading>\\n\\t</div>\\n</template>\\n\\n<script>\\nimport { subscribe, unsubscribe } from '@nextcloud/event-bus'\\nimport InfiniteLoading from 'vue-infinite-loading'\\nimport Vue from 'vue'\\nimport NcModal from '@nextcloud/vue/dist/Components/NcModal'\\nimport NcButton from '@nextcloud/vue/dist/Components/NcButton'\\nimport NcMultiselect from '@nextcloud/vue/dist/Components/NcMultiselect'\\n\\nimport userRow from './UserList/UserRow'\\n\\nconst unlimitedQuota = {\\n\\tid: 'none',\\n\\tlabel: t('settings', 'Unlimited'),\\n}\\nconst defaultQuota = {\\n\\tid: 'default',\\n\\tlabel: t('settings', 'Default quota'),\\n}\\nconst newUser = {\\n\\tid: '',\\n\\tdisplayName: '',\\n\\tpassword: '',\\n\\tmailAddress: '',\\n\\tgroups: [],\\n\\tsubAdminsGroups: [],\\n\\tquota: defaultQuota,\\n\\tlanguage: {\\n\\t\\tcode: 'en',\\n\\t\\tname: t('settings', 'Default language'),\\n\\t},\\n}\\n\\nexport default {\\n\\tname: 'UserList',\\n\\tcomponents: {\\n\\t\\tNcModal,\\n\\t\\tuserRow,\\n\\t\\tNcMultiselect,\\n\\t\\tInfiniteLoading,\\n\\t\\tNcButton,\\n\\t},\\n\\tprops: {\\n\\t\\tusers: {\\n\\t\\t\\ttype: Array,\\n\\t\\t\\tdefault: () => [],\\n\\t\\t},\\n\\t\\tshowConfig: {\\n\\t\\t\\ttype: Object,\\n\\t\\t\\trequired: true,\\n\\t\\t},\\n\\t\\tselectedGroup: {\\n\\t\\t\\ttype: String,\\n\\t\\t\\tdefault: null,\\n\\t\\t},\\n\\t\\texternalActions: {\\n\\t\\t\\ttype: Array,\\n\\t\\t\\tdefault: () => [],\\n\\t\\t},\\n\\t},\\n\\tdata() {\\n\\t\\treturn {\\n\\t\\t\\tunlimitedQuota,\\n\\t\\t\\tdefaultQuota,\\n\\t\\t\\tloading: {\\n\\t\\t\\t\\tall: false,\\n\\t\\t\\t\\tgroups: false,\\n\\t\\t\\t},\\n\\t\\t\\tscrolled: false,\\n\\t\\t\\tsearchQuery: '',\\n\\t\\t\\tnewUser: Object.assign({}, newUser),\\n\\t\\t}\\n\\t},\\n\\tcomputed: {\\n\\t\\tsettings() {\\n\\t\\t\\treturn this.$store.getters.getServerData\\n\\t\\t},\\n\\t\\tselectedGroupDecoded() {\\n\\t\\t\\treturn decodeURIComponent(this.selectedGroup)\\n\\t\\t},\\n\\t\\tfilteredUsers() {\\n\\t\\t\\tif (this.selectedGroup === 'disabled') {\\n\\t\\t\\t\\treturn this.users.filter(user => user.enabled === false)\\n\\t\\t\\t}\\n\\t\\t\\tif (!this.settings.isAdmin) {\\n\\t\\t\\t\\t// we don't want subadmins to edit themselves\\n\\t\\t\\t\\treturn this.users.filter(user => user.enabled !== false)\\n\\t\\t\\t}\\n\\t\\t\\treturn this.users.filter(user => user.enabled !== false)\\n\\t\\t},\\n\\t\\tgroups() {\\n\\t\\t\\t// data provided php side + remove the disabled group\\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\\tcanAddGroups() {\\n\\t\\t\\t// disabled if no permission to add new users to group\\n\\t\\t\\treturn this.groups.map(group => {\\n\\t\\t\\t\\t// clone object because we don't want\\n\\t\\t\\t\\t// to edit the original groups\\n\\t\\t\\t\\tgroup = Object.assign({}, group)\\n\\t\\t\\t\\tgroup.$isDisabled = group.canAdd === false\\n\\t\\t\\t\\treturn group\\n\\t\\t\\t})\\n\\t\\t},\\n\\t\\tsubAdminsGroups() {\\n\\t\\t\\t// data provided php side\\n\\t\\t\\treturn this.$store.getters.getSubadminGroups\\n\\t\\t},\\n\\t\\tquotaOptions() {\\n\\t\\t\\t// convert the preset array into objects\\n\\t\\t\\tconst quotaPreset = this.settings.quotaPreset.reduce((acc, cur) => acc.concat({\\n\\t\\t\\t\\tid: cur,\\n\\t\\t\\t\\tlabel: cur,\\n\\t\\t\\t}), [])\\n\\t\\t\\t// add default presets\\n\\t\\t\\tif (this.settings.allowUnlimitedQuota) {\\n\\t\\t\\t\\tquotaPreset.unshift(this.unlimitedQuota)\\n\\t\\t\\t}\\n\\t\\t\\tquotaPreset.unshift(this.defaultQuota)\\n\\t\\t\\treturn quotaPreset\\n\\t\\t},\\n\\t\\tminPasswordLength() {\\n\\t\\t\\treturn this.$store.getters.getPasswordPolicyMinLength\\n\\t\\t},\\n\\t\\tusersOffset() {\\n\\t\\t\\treturn this.$store.getters.getUsersOffset\\n\\t\\t},\\n\\t\\tusersLimit() {\\n\\t\\t\\treturn this.$store.getters.getUsersLimit\\n\\t\\t},\\n\\t\\tusersCount() {\\n\\t\\t\\treturn this.users.length\\n\\t\\t},\\n\\n\\t\\t/* LANGUAGES */\\n\\t\\tlanguages() {\\n\\t\\t\\treturn [\\n\\t\\t\\t\\t{\\n\\t\\t\\t\\t\\tlabel: t('settings', 'Common languages'),\\n\\t\\t\\t\\t\\tlanguages: this.settings.languages.commonLanguages,\\n\\t\\t\\t\\t},\\n\\t\\t\\t\\t{\\n\\t\\t\\t\\t\\tlabel: t('settings', 'Other languages'),\\n\\t\\t\\t\\t\\tlanguages: this.settings.languages.otherLanguages,\\n\\t\\t\\t\\t},\\n\\t\\t\\t]\\n\\t\\t},\\n\\t\\tisDarkTheme() {\\n\\t\\t\\treturn window.getComputedStyle(this.$el)\\n\\t\\t\\t\\t.getPropertyValue('--background-invert-if-dark') === 'invert(100%)'\\n\\t\\t},\\n\\t},\\n\\twatch: {\\n\\t\\t// watch url change and group select\\n\\t\\tselectedGroup(val, old) {\\n\\t\\t\\t// if selected is the disabled group but it's empty\\n\\t\\t\\tthis.redirectIfDisabled()\\n\\t\\t\\tthis.$store.commit('resetUsers')\\n\\t\\t\\tthis.$refs.infiniteLoading.stateChanger.reset()\\n\\t\\t\\tthis.setNewUserDefaultGroup(val)\\n\\t\\t},\\n\\n\\t\\t// make sure the infiniteLoading state is changed if we manually\\n\\t\\t// add/remove data from the store\\n\\t\\tusersCount(val, old) {\\n\\t\\t\\t// deleting the last user, reset the list\\n\\t\\t\\tif (val === 0 && old === 1) {\\n\\t\\t\\t\\tthis.$refs.infiniteLoading.stateChanger.reset()\\n\\t\\t\\t\\t// adding the first user, warn the infiniteLoader that\\n\\t\\t\\t\\t// the list is not empty anymore (we don't fetch the newly\\n\\t\\t\\t\\t// added user as we already have all the info we need)\\n\\t\\t\\t} else if (val === 1 && old === 0) {\\n\\t\\t\\t\\tthis.$refs.infiniteLoading.stateChanger.loaded()\\n\\t\\t\\t}\\n\\t\\t},\\n\\t},\\n\\n\\tmounted() {\\n\\t\\tif (!this.settings.canChangePassword) {\\n\\t\\t\\tOC.Notification.showTemporary(t('settings', 'Password change is disabled because the master key is disabled'))\\n\\t\\t}\\n\\n\\t\\t/**\\n\\t\\t * Reset and init new user form\\n\\t\\t */\\n\\t\\tthis.resetForm()\\n\\n\\t\\t/**\\n\\t\\t * Register search\\n\\t\\t */\\n\\t\\tsubscribe('nextcloud:unified-search.search', this.search)\\n\\t\\tsubscribe('nextcloud:unified-search.reset', this.resetSearch)\\n\\n\\t\\t/**\\n\\t\\t * If disabled group but empty, redirect\\n\\t\\t */\\n\\t\\tthis.redirectIfDisabled()\\n\\t},\\n\\tbeforeDestroy() {\\n\\t\\tunsubscribe('nextcloud:unified-search.search', this.search)\\n\\t\\tunsubscribe('nextcloud:unified-search.reset', this.resetSearch)\\n\\t},\\n\\n\\tmethods: {\\n\\t\\tonScroll(event) {\\n\\t\\t\\tthis.scrolled = event.target.scrollTo > 0\\n\\t\\t},\\n\\n\\t\\t/**\\n\\t\\t * Validate quota string to make sure it's a valid human file size\\n\\t\\t *\\n\\t\\t * @param {string} quota Quota in readable format '5 GB'\\n\\t\\t * @return {object}\\n\\t\\t */\\n\\t\\tvalidateQuota(quota) {\\n\\t\\t\\t// only used for new presets sent through @Tag\\n\\t\\t\\tconst validQuota = OC.Util.computerFileSize(quota)\\n\\t\\t\\tif (validQuota !== null && validQuota >= 0) {\\n\\t\\t\\t\\t// unify format output\\n\\t\\t\\t\\tquota = OC.Util.humanFileSize(OC.Util.computerFileSize(quota))\\n\\t\\t\\t\\tthis.newUser.quota = { id: quota, label: quota }\\n\\t\\t\\t\\treturn this.newUser.quota\\n\\t\\t\\t}\\n\\t\\t\\t// Default is unlimited\\n\\t\\t\\tthis.newUser.quota = this.quotaOptions[0]\\n\\t\\t\\treturn this.quotaOptions[0]\\n\\t\\t},\\n\\n\\t\\tinfiniteHandler($state) {\\n\\t\\t\\tthis.$store.dispatch('getUsers', {\\n\\t\\t\\t\\toffset: this.usersOffset,\\n\\t\\t\\t\\tlimit: this.usersLimit,\\n\\t\\t\\t\\tgroup: this.selectedGroup !== 'disabled' ? this.selectedGroup : '',\\n\\t\\t\\t\\tsearch: this.searchQuery,\\n\\t\\t\\t})\\n\\t\\t\\t\\t.then((usersCount) => {\\n\\t\\t\\t\\t\\tif (usersCount > 0) {\\n\\t\\t\\t\\t\\t\\t$state.loaded()\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\tif (usersCount < this.usersLimit) {\\n\\t\\t\\t\\t\\t\\t$state.complete()\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t})\\n\\t\\t},\\n\\n\\t\\t/* SEARCH */\\n\\t\\tsearch({ query }) {\\n\\t\\t\\tthis.searchQuery = query\\n\\t\\t\\tthis.$store.commit('resetUsers')\\n\\t\\t\\tthis.$refs.infiniteLoading.stateChanger.reset()\\n\\t\\t},\\n\\t\\tresetSearch() {\\n\\t\\t\\tthis.search({ query: '' })\\n\\t\\t},\\n\\n\\t\\tresetForm() {\\n\\t\\t\\t// revert form to original state\\n\\t\\t\\tthis.newUser = Object.assign({}, newUser)\\n\\n\\t\\t\\t/**\\n\\t\\t\\t * Init default language from server data. The use of this.settings\\n\\t\\t\\t * requires a computed variable, which break the v-model binding of the form,\\n\\t\\t\\t * this is a much easier solution than getter and setter on a computed var\\n\\t\\t\\t */\\n\\t\\t\\tif (this.settings.defaultLanguage) {\\n\\t\\t\\t\\tVue.set(this.newUser.language, 'code', this.settings.defaultLanguage)\\n\\t\\t\\t}\\n\\n\\t\\t\\t/**\\n\\t\\t\\t * In case the user directly loaded the user list within a group\\n\\t\\t\\t * the watch won't be triggered. We need to initialize it.\\n\\t\\t\\t */\\n\\t\\t\\tthis.setNewUserDefaultGroup(this.selectedGroup)\\n\\n\\t\\t\\tthis.loading.all = false\\n\\t\\t},\\n\\t\\tcreateUser() {\\n\\t\\t\\tthis.loading.all = true\\n\\t\\t\\tthis.$store.dispatch('addUser', {\\n\\t\\t\\t\\tuserid: this.newUser.id,\\n\\t\\t\\t\\tpassword: this.newUser.password,\\n\\t\\t\\t\\tdisplayName: this.newUser.displayName,\\n\\t\\t\\t\\temail: this.newUser.mailAddress,\\n\\t\\t\\t\\tgroups: this.newUser.groups.map(group => group.id),\\n\\t\\t\\t\\tsubadmin: this.newUser.subAdminsGroups.map(group => group.id),\\n\\t\\t\\t\\tquota: this.newUser.quota.id,\\n\\t\\t\\t\\tlanguage: this.newUser.language.code,\\n\\t\\t\\t})\\n\\t\\t\\t\\t.then(() => {\\n\\t\\t\\t\\t\\tthis.resetForm()\\n\\t\\t\\t\\t\\tthis.$refs.newusername.focus()\\n\\t\\t\\t\\t\\tthis.closeModal()\\n\\t\\t\\t\\t})\\n\\t\\t\\t\\t.catch((error) => {\\n\\t\\t\\t\\t\\tthis.loading.all = false\\n\\t\\t\\t\\t\\tif (error.response && error.response.data && error.response.data.ocs && error.response.data.ocs.meta) {\\n\\t\\t\\t\\t\\t\\tconst statuscode = error.response.data.ocs.meta.statuscode\\n\\t\\t\\t\\t\\t\\tif (statuscode === 102) {\\n\\t\\t\\t\\t\\t\\t\\t// wrong username\\n\\t\\t\\t\\t\\t\\t\\tthis.$refs.newusername.focus()\\n\\t\\t\\t\\t\\t\\t} else if (statuscode === 107) {\\n\\t\\t\\t\\t\\t\\t\\t// wrong password\\n\\t\\t\\t\\t\\t\\t\\tthis.$refs.newuserpassword.focus()\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t})\\n\\t\\t},\\n\\t\\tsetNewUserDefaultGroup(value) {\\n\\t\\t\\tif (value && value.length > 0) {\\n\\t\\t\\t\\t// setting new user default group to the current selected one\\n\\t\\t\\t\\tconst currentGroup = this.groups.find(group => group.id === value)\\n\\t\\t\\t\\tif (currentGroup) {\\n\\t\\t\\t\\t\\tthis.newUser.groups = [currentGroup]\\n\\t\\t\\t\\t\\treturn\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t\\t// fallback, empty selected group\\n\\t\\t\\tthis.newUser.groups = []\\n\\t\\t},\\n\\n\\t\\t/**\\n\\t\\t * Create a new group\\n\\t\\t *\\n\\t\\t * @param {string} gid Group id\\n\\t\\t * @return {Promise}\\n\\t\\t */\\n\\t\\tcreateGroup(gid) {\\n\\t\\t\\tthis.loading.groups = true\\n\\t\\t\\tthis.$store.dispatch('addGroup', gid)\\n\\t\\t\\t\\t.then((group) => {\\n\\t\\t\\t\\t\\tthis.newUser.groups.push(this.groups.find(group => group.id === gid))\\n\\t\\t\\t\\t\\tthis.loading.groups = false\\n\\t\\t\\t\\t})\\n\\t\\t\\t\\t.catch(() => {\\n\\t\\t\\t\\t\\tthis.loading.groups = false\\n\\t\\t\\t\\t})\\n\\t\\t\\treturn this.$store.getters.getGroups[this.groups.length]\\n\\t\\t},\\n\\n\\t\\t/**\\n\\t\\t * If the selected group is the disabled group but the count is 0\\n\\t\\t * redirect to the all users page.\\n\\t\\t * we only check for 0 because we don't have the count on ldap\\n\\t\\t * and we therefore set the usercount to -1 in this specific case\\n\\t\\t */\\n\\t\\tredirectIfDisabled() {\\n\\t\\t\\tconst allGroups = this.$store.getters.getGroups\\n\\t\\t\\tif (this.selectedGroup === 'disabled'\\n\\t\\t\\t\\t\\t\\t&& allGroups.findIndex(group => group.id === 'disabled' && group.usercount === 0) > -1) {\\n\\t\\t\\t\\t// disabled group is empty, redirection to all users\\n\\t\\t\\t\\tthis.$router.push({ name: 'users' })\\n\\t\\t\\t\\tthis.$refs.infiniteLoading.stateChanger.reset()\\n\\t\\t\\t}\\n\\t\\t},\\n\\t\\tcloseModal() {\\n\\t\\t\\t// eslint-disable-next-line vue/no-mutating-props\\n\\t\\t\\tthis.showConfig.showNewUserForm = false\\n\\t\\t},\\n\\t},\\n}\\n</script>\\n<style scoped>\\n\\t.modal-wrapper {\\n\\t\\tmargin: 2vh 0;\\n\\t\\talign-items: flex-start;\\n\\t}\\n\\t.modal__content {\\n\\t\\tdisplay: flex;\\n\\t\\tpadding: 20px;\\n\\t\\tflex-direction: column;\\n\\t\\talign-items: center;\\n\\t\\ttext-align: center;\\n\\t}\\n\\t.modal__item {\\n\\t\\tmargin-bottom: 16px;\\n\\t\\twidth: 100%;\\n\\t}\\n\\t.modal__item:not(:focus):not(:active) {\\n\\t\\tborder-color: var(--color-border-dark);\\n\\t}\\n\\t.modal__item::v-deep .multiselect {\\n\\t\\twidth: 100%;\\n\\t}\\n\\t.user-actions {\\n\\t\\tmargin-top: 20px;\\n\\t}\\n\\t.modal__content::v-deep .multiselect__single {\\n\\t\\ttext-align: left;\\n\\t\\tbox-sizing: border-box;\\n\\t}\\n\\t.modal__content::v-deep .multiselect__content-wrapper {\\n\\t\\tbox-sizing: border-box;\\n\\t}\\n\\t.row::v-deep .multiselect__single {\\n\\t\\tz-index: auto !important;\\n\\t}\\n\\n\\t/* fake input for groups validation */\\n\\tinput#newgroups {\\n\\t\\tposition: absolute;\\n\\t\\topacity: 0;\\n\\t\\t/* The \\\"hidden\\\" input is behind the Multiselect, so in general it does\\n\\t\\t * not receives clicks. However, with Firefox, after the validation\\n\\t\\t * fails, it will receive the first click done on it, so its width needs\\n\\t\\t * to be set to 0 to prevent that (\\\"pointer-events: none\\\" does not\\n\\t\\t * prevent it). */\\n\\t\\twidth: 0;\\n\\t}\\n</style>\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('NcContent',{attrs:{\"app-name\":\"settings\",\"navigation-class\":{ 'icon-loading': _vm.loadingAddGroup }}},[_c('NcAppNavigation',{scopedSlots:_vm._u([{key:\"list\",fn:function(){return [_c('NcAppNavigationItem',{ref:\"addGroup\",attrs:{\"id\":\"addgroup\",\"edit-placeholder\":_vm.t('settings', 'Enter group name'),\"editable\":true,\"loading\":_vm.loadingAddGroup,\"title\":_vm.t('settings', 'Add group'),\"icon\":\"icon-add\"},on:{\"click\":_vm.showAddGroupForm,\"update:title\":_vm.createGroup}}),_vm._v(\" \"),_c('NcAppNavigationItem',{attrs:{\"id\":\"everyone\",\"exact\":true,\"title\":_vm.t('settings', 'Active users'),\"to\":{ name: 'users' },\"icon\":\"icon-contacts-dark\"}},[(_vm.userCount > 0)?_c('NcAppNavigationCounter',{attrs:{\"slot\":\"counter\"},slot:\"counter\"},[_vm._v(\"\\n\\t\\t\\t\\t\\t\"+_vm._s(_vm.userCount)+\"\\n\\t\\t\\t\\t\")]):_vm._e()],1),_vm._v(\" \"),(_vm.settings.isAdmin)?_c('NcAppNavigationItem',{attrs:{\"id\":\"admin\",\"exact\":true,\"title\":_vm.t('settings', 'Admins'),\"to\":{ name: 'group', params: { selectedGroup: 'admin' } },\"icon\":\"icon-user-admin\"}},[(_vm.adminGroupMenu.count)?_c('NcAppNavigationCounter',{attrs:{\"slot\":\"counter\"},slot:\"counter\"},[_vm._v(\"\\n\\t\\t\\t\\t\\t\"+_vm._s(_vm.adminGroupMenu.count)+\"\\n\\t\\t\\t\\t\")]):_vm._e()],1):_vm._e(),_vm._v(\" \"),(_vm.disabledGroupMenu.usercount > 0 || _vm.disabledGroupMenu.usercount === -1)?_c('NcAppNavigationItem',{attrs:{\"id\":\"disabled\",\"exact\":true,\"title\":_vm.t('settings', 'Disabled users'),\"to\":{ name: 'group', params: { selectedGroup: 'disabled' } },\"icon\":\"icon-disabled-users\"}},[(_vm.disabledGroupMenu.usercount > 0)?_c('NcAppNavigationCounter',{attrs:{\"slot\":\"counter\"},slot:\"counter\"},[_vm._v(\"\\n\\t\\t\\t\\t\\t\"+_vm._s(_vm.disabledGroupMenu.usercount)+\"\\n\\t\\t\\t\\t\")]):_vm._e()],1):_vm._e(),_vm._v(\" \"),(_vm.groupList.length > 0)?_c('NcAppNavigationCaption',{attrs:{\"title\":_vm.t('settings', 'Groups')}}):_vm._e(),_vm._v(\" \"),_vm._l((_vm.groupList),function(group){return _c('GroupListItem',{key:group.id,attrs:{\"id\":group.id,\"title\":group.title,\"count\":group.count}})})]},proxy:true},{key:\"footer\",fn:function(){return [_c('NcAppNavigationSettings',[_c('div',[_c('p',[_vm._v(_vm._s(_vm.t('settings', 'Default quota:')))]),_vm._v(\" \"),_c('NcMultiselect',{attrs:{\"value\":_vm.defaultQuota,\"options\":_vm.quotaOptions,\"tag-placeholder\":\"create\",\"placeholder\":_vm.t('settings', 'Select default quota'),\"label\":\"label\",\"track-by\":\"id\",\"allow-empty\":false,\"taggable\":true},on:{\"tag\":_vm.validateQuota,\"input\":_vm.setDefaultQuota}})],1),_vm._v(\" \"),_c('div',[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.showLanguages),expression:\"showLanguages\"}],staticClass:\"checkbox\",attrs:{\"id\":\"showLanguages\",\"type\":\"checkbox\"},domProps:{\"checked\":Array.isArray(_vm.showLanguages)?_vm._i(_vm.showLanguages,null)>-1:(_vm.showLanguages)},on:{\"change\":function($event){var $$a=_vm.showLanguages,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=null,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.showLanguages=$$a.concat([$$v]))}else{$$i>-1&&(_vm.showLanguages=$$a.slice(0,$$i).concat($$a.slice($$i+1)))}}else{_vm.showLanguages=$$c}}}}),_vm._v(\" \"),_c('label',{attrs:{\"for\":\"showLanguages\"}},[_vm._v(_vm._s(_vm.t('settings', 'Show Languages')))])]),_vm._v(\" \"),_c('div',[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.showLastLogin),expression:\"showLastLogin\"}],staticClass:\"checkbox\",attrs:{\"id\":\"showLastLogin\",\"type\":\"checkbox\"},domProps:{\"checked\":Array.isArray(_vm.showLastLogin)?_vm._i(_vm.showLastLogin,null)>-1:(_vm.showLastLogin)},on:{\"change\":function($event){var $$a=_vm.showLastLogin,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=null,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.showLastLogin=$$a.concat([$$v]))}else{$$i>-1&&(_vm.showLastLogin=$$a.slice(0,$$i).concat($$a.slice($$i+1)))}}else{_vm.showLastLogin=$$c}}}}),_vm._v(\" \"),_c('label',{attrs:{\"for\":\"showLastLogin\"}},[_vm._v(_vm._s(_vm.t('settings', 'Show last login')))])]),_vm._v(\" \"),_c('div',[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.showUserBackend),expression:\"showUserBackend\"}],staticClass:\"checkbox\",attrs:{\"id\":\"showUserBackend\",\"type\":\"checkbox\"},domProps:{\"checked\":Array.isArray(_vm.showUserBackend)?_vm._i(_vm.showUserBackend,null)>-1:(_vm.showUserBackend)},on:{\"change\":function($event){var $$a=_vm.showUserBackend,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=null,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.showUserBackend=$$a.concat([$$v]))}else{$$i>-1&&(_vm.showUserBackend=$$a.slice(0,$$i).concat($$a.slice($$i+1)))}}else{_vm.showUserBackend=$$c}}}}),_vm._v(\" \"),_c('label',{attrs:{\"for\":\"showUserBackend\"}},[_vm._v(_vm._s(_vm.t('settings', 'Show user backend')))])]),_vm._v(\" \"),_c('div',[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.showStoragePath),expression:\"showStoragePath\"}],staticClass:\"checkbox\",attrs:{\"id\":\"showStoragePath\",\"type\":\"checkbox\"},domProps:{\"checked\":Array.isArray(_vm.showStoragePath)?_vm._i(_vm.showStoragePath,null)>-1:(_vm.showStoragePath)},on:{\"change\":function($event){var $$a=_vm.showStoragePath,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=null,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.showStoragePath=$$a.concat([$$v]))}else{$$i>-1&&(_vm.showStoragePath=$$a.slice(0,$$i).concat($$a.slice($$i+1)))}}else{_vm.showStoragePath=$$c}}}}),_vm._v(\" \"),_c('label',{attrs:{\"for\":\"showStoragePath\"}},[_vm._v(_vm._s(_vm.t('settings', 'Show storage path')))])]),_vm._v(\" \"),_c('div',[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.sendWelcomeMail),expression:\"sendWelcomeMail\"}],staticClass:\"checkbox\",attrs:{\"id\":\"sendWelcomeMail\",\"disabled\":_vm.loadingSendMail,\"type\":\"checkbox\"},domProps:{\"checked\":Array.isArray(_vm.sendWelcomeMail)?_vm._i(_vm.sendWelcomeMail,null)>-1:(_vm.sendWelcomeMail)},on:{\"change\":function($event){var $$a=_vm.sendWelcomeMail,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=null,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.sendWelcomeMail=$$a.concat([$$v]))}else{$$i>-1&&(_vm.sendWelcomeMail=$$a.slice(0,$$i).concat($$a.slice($$i+1)))}}else{_vm.sendWelcomeMail=$$c}}}}),_vm._v(\" \"),_c('label',{attrs:{\"for\":\"sendWelcomeMail\"}},[_vm._v(_vm._s(_vm.t('settings', 'Send email to new user')))])])])]},proxy:true}])},[_c('NcAppNavigationNew',{attrs:{\"button-id\":\"new-user-button\",\"text\":_vm.t('settings','New user'),\"button-class\":\"icon-add\"},on:{\"click\":_vm.showNewUserMenu,\"keyup\":[function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"enter\",13,$event.key,\"Enter\")){ return null; }return _vm.showNewUserMenu.apply(null, arguments)},function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"space\",32,$event.key,[\" \",\"Spacebar\"])){ return null; }return _vm.showNewUserMenu.apply(null, arguments)}]}})],1),_vm._v(\" \"),_c('NcAppContent',[_c('UserList',{attrs:{\"users\":_vm.users,\"show-config\":_vm.showConfig,\"selected-group\":_vm.selectedGroupDecoded,\"external-actions\":_vm.externalActions}})],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<!--\n - @copyright Copyright (c) 2021 Martin Jänel <spammemore@posteo.de>\n -\n - @author Martin Jänel <spammemore@posteo.de>\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<NcAppNavigationItem :key=\"id\"\n\t\t:exact=\"true\"\n\t\t:title=\"title\"\n\t\t:to=\"{ name: 'group', params: { selectedGroup: encodeURIComponent(id) } }\"\n\t\ticon=\"icon-group\"\n\t\t:loading=\"loadingRenameGroup\"\n\t\t:menu-open=\"openGroupMenu\"\n\t\t@update:menuOpen=\"handleGroupMenuOpen\">\n\t\t<template #counter>\n\t\t\t<NcCounterBubble v-if=\"count\">\n\t\t\t\t{{ count }}\n\t\t\t</NcCounterBubble>\n\t\t</template>\n\t\t<template #actions>\n\t\t\t<NcActionInput v-if=\"id !== 'admin' && id !== 'disabled' && settings.isAdmin\"\n\t\t\t\tref=\"displayNameInput\"\n\t\t\t\ticon=\"icon-edit\"\n\t\t\t\ttype=\"text\"\n\t\t\t\t:value=\"title\"\n\t\t\t\t@submit=\"renameGroup(id)\">\n\t\t\t\t{{ t('settings', 'Rename group') }}\n\t\t\t</NcActionInput>\n\t\t\t<NcActionButton v-if=\"id !== 'admin' && id !== 'disabled' && settings.isAdmin\"\n\t\t\t\ticon=\"icon-delete\"\n\t\t\t\t@click=\"removeGroup(id)\">\n\t\t\t\t{{ t('settings', 'Remove group') }}\n\t\t\t</NcActionButton>\n\t\t</template>\n\t</NcAppNavigationItem>\n</template>\n\n<script>\nimport NcActionInput from '@nextcloud/vue/dist/Components/NcActionInput'\nimport NcActionButton from '@nextcloud/vue/dist/Components/NcActionButton'\nimport NcCounterBubble from '@nextcloud/vue/dist/Components/NcCounterBubble'\nimport NcAppNavigationItem from '@nextcloud/vue/dist/Components/NcAppNavigationItem'\n\nexport default {\n\tname: 'GroupListItem',\n\tcomponents: {\n\t\tNcActionInput,\n\t\tNcActionButton,\n\t\tNcCounterBubble,\n\t\tNcAppNavigationItem,\n\t},\n\tprops: {\n\t\tid: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t},\n\t\ttitle: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t},\n\t\tcount: {\n\t\t\ttype: Number,\n\t\t\trequired: false,\n\t\t},\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tloadingRenameGroup: false,\n\t\t\topenGroupMenu: false,\n\t\t}\n\t},\n\tcomputed: {\n\t\tsettings() {\n\t\t\treturn this.$store.getters.getServerData\n\t\t},\n\t},\n\tmethods: {\n\t\thandleGroupMenuOpen() {\n\t\t\tthis.openGroupMenu = true\n\t\t},\n\t\tasync renameGroup(gid) {\n\t\t\t// check if group id is valid\n\t\t\tif (gid.trim() === '') {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tconst displayName = this.$refs.displayNameInput.$el.querySelector('input[type=\"text\"]').value\n\n\t\t\t// check if group name is valid\n\t\t\tif (displayName.trim() === '') {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tthis.openGroupMenu = false\n\t\t\t\tthis.loadingRenameGroup = true\n\t\t\t\tawait this.$store.dispatch('renameGroup', {\n\t\t\t\t\tgroupid: gid.trim(),\n\t\t\t\t\tdisplayName: displayName.trim(),\n\t\t\t\t})\n\n\t\t\t\tthis.loadingRenameGroup = false\n\t\t\t} catch {\n\t\t\t\tthis.openGroupMenu = true\n\t\t\t\tthis.loadingRenameGroup = false\n\t\t\t}\n\t\t},\n\t\tremoveGroup(groupid) {\n\t\t\tconst self = this\n\t\t\t// TODO migrate to a vue js confirm dialog component\n\t\t\tOC.dialogs.confirm(\n\t\t\t\tt('settings', 'You are about to remove the group {group}. The users will NOT be deleted.', { group: groupid }),\n\t\t\t\tt('settings', 'Please confirm the group removal '),\n\t\t\t\tfunction(success) {\n\t\t\t\t\tif (success) {\n\t\t\t\t\t\tself.$store.dispatch('removeGroup', groupid)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t)\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!./GroupListItem.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!./GroupListItem.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./GroupListItem.vue?vue&type=template&id=03bc8784&\"\nimport script from \"./GroupListItem.vue?vue&type=script&lang=js&\"\nexport * from \"./GroupListItem.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('NcAppNavigationItem',{key:_vm.id,attrs:{\"exact\":true,\"title\":_vm.title,\"to\":{ name: 'group', params: { selectedGroup: encodeURIComponent(_vm.id) } },\"icon\":\"icon-group\",\"loading\":_vm.loadingRenameGroup,\"menu-open\":_vm.openGroupMenu},on:{\"update:menuOpen\":_vm.handleGroupMenuOpen},scopedSlots:_vm._u([{key:\"counter\",fn:function(){return [(_vm.count)?_c('NcCounterBubble',[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.count)+\"\\n\\t\\t\")]):_vm._e()]},proxy:true},{key:\"actions\",fn:function(){return [(_vm.id !== 'admin' && _vm.id !== 'disabled' && _vm.settings.isAdmin)?_c('NcActionInput',{ref:\"displayNameInput\",attrs:{\"icon\":\"icon-edit\",\"type\":\"text\",\"value\":_vm.title},on:{\"submit\":function($event){return _vm.renameGroup(_vm.id)}}},[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.t('settings', 'Rename group'))+\"\\n\\t\\t\")]):_vm._e(),_vm._v(\" \"),(_vm.id !== 'admin' && _vm.id !== 'disabled' && _vm.settings.isAdmin)?_c('NcActionButton',{attrs:{\"icon\":\"icon-delete\"},on:{\"click\":function($event){return _vm.removeGroup(_vm.id)}}},[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.t('settings', 'Remove group'))+\"\\n\\t\\t\")]):_vm._e()]},proxy:true}])})}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","/**\n * @copyright Copyright (c) 2019 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author Greta Doci <gretadoci@gmail.com>\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n * @author Roeland Jago Douma <roeland@famdouma.nl>\n *\n * @license AGPL-3.0-or-later\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\nimport { generateUrl } from '@nextcloud/router'\n\nexport default {\n\tprops: {\n\t\tuser: {\n\t\t\ttype: Object,\n\t\t\trequired: true,\n\t\t},\n\t\tsettings: {\n\t\t\ttype: Object,\n\t\t\tdefault: () => ({}),\n\t\t},\n\t\tgroups: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\t\tsubAdminsGroups: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\t\tquotaOptions: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\t\tshowConfig: {\n\t\t\ttype: Object,\n\t\t\tdefault: () => ({}),\n\t\t},\n\t\tlanguages: {\n\t\t\ttype: Array,\n\t\t\trequired: true,\n\t\t},\n\t\texternalActions: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\t},\n\tcomputed: {\n\t\t/* GROUPS MANAGEMENT */\n\t\tuserGroups() {\n\t\t\tconst userGroups = this.groups.filter(group => this.user.groups.includes(group.id))\n\t\t\treturn userGroups\n\t\t},\n\t\tuserSubAdminsGroups() {\n\t\t\tconst userSubAdminsGroups = this.subAdminsGroups.filter(group => this.user.subadmin.includes(group.id))\n\t\t\treturn userSubAdminsGroups\n\t\t},\n\t\tavailableGroups() {\n\t\t\treturn this.groups.map((group) => {\n\t\t\t\t// clone object because we don't want\n\t\t\t\t// to edit the original groups\n\t\t\t\tconst groupClone = Object.assign({}, group)\n\n\t\t\t\t// two settings here:\n\t\t\t\t// 1. user NOT in group but no permission to add\n\t\t\t\t// 2. user is in group but no permission to remove\n\t\t\t\tgroupClone.$isDisabled\n\t\t\t\t\t= (group.canAdd === false\n\t\t\t\t\t\t&& !this.user.groups.includes(group.id))\n\t\t\t\t\t|| (group.canRemove === false\n\t\t\t\t\t\t&& this.user.groups.includes(group.id))\n\t\t\t\treturn groupClone\n\t\t\t})\n\t\t},\n\n\t\t/* QUOTA MANAGEMENT */\n\t\tusedSpace() {\n\t\t\tif (this.user.quota.used) {\n\t\t\t\treturn t('settings', '{size} used', { size: OC.Util.humanFileSize(this.user.quota.used) })\n\t\t\t}\n\t\t\treturn t('settings', '{size} used', { size: OC.Util.humanFileSize(0) })\n\t\t},\n\t\tusedQuota() {\n\t\t\tlet quota = this.user.quota.quota\n\t\t\tif (quota > 0) {\n\t\t\t\tquota = Math.min(100, Math.round(this.user.quota.used / quota * 100))\n\t\t\t} else {\n\t\t\t\tconst usedInGB = this.user.quota.used / (10 * Math.pow(2, 30))\n\t\t\t\t// asymptotic curve approaching 50% at 10GB to visualize used stace with infinite quota\n\t\t\t\tquota = 95 * (1 - (1 / (usedInGB + 1)))\n\t\t\t}\n\t\t\treturn isNaN(quota) ? 0 : quota\n\t\t},\n\t\t// Mapping saved values to objects\n\t\tuserQuota() {\n\t\t\tif (this.user.quota.quota >= 0) {\n\t\t\t\t// if value is valid, let's map the quotaOptions or return custom quota\n\t\t\t\tconst humanQuota = OC.Util.humanFileSize(this.user.quota.quota)\n\t\t\t\tconst userQuota = this.quotaOptions.find(quota => quota.id === humanQuota)\n\t\t\t\treturn userQuota || { id: humanQuota, label: humanQuota }\n\t\t\t} else if (this.user.quota.quota === 'default') {\n\t\t\t\t// default quota is replaced by the proper value on load\n\t\t\t\treturn this.quotaOptions[0]\n\t\t\t}\n\t\t\treturn this.quotaOptions[1] // unlimited\n\t\t},\n\n\t\t/* PASSWORD POLICY? */\n\t\tminPasswordLength() {\n\t\t\treturn this.$store.getters.getPasswordPolicyMinLength\n\t\t},\n\n\t\t/* LANGUAGE */\n\t\tuserLanguage() {\n\t\t\tconst availableLanguages = this.languages[0].languages.concat(this.languages[1].languages)\n\t\t\tconst userLang = availableLanguages.find(lang => lang.code === this.user.language)\n\t\t\tif (typeof userLang !== 'object' && this.user.language !== '') {\n\t\t\t\treturn {\n\t\t\t\t\tcode: this.user.language,\n\t\t\t\t\tname: this.user.language,\n\t\t\t\t}\n\t\t\t} else if (this.user.language === '') {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\treturn userLang\n\t\t},\n\n\t\t/* LAST LOGIN */\n\t\tuserLastLoginTooltip() {\n\t\t\tif (this.user.lastLogin > 0) {\n\t\t\t\treturn OC.Util.formatDate(this.user.lastLogin)\n\t\t\t}\n\t\t\treturn ''\n\t\t},\n\t\tuserLastLogin() {\n\t\t\tif (this.user.lastLogin > 0) {\n\t\t\t\treturn OC.Util.relativeModifiedDate(this.user.lastLogin)\n\t\t\t}\n\t\t\treturn t('settings', 'Never')\n\t\t},\n\t},\n\tmethods: {\n\t\t/**\n\t\t * Generate avatar url\n\t\t *\n\t\t * @param {string} user The user name\n\t\t * @param {bool} isDarkTheme Whether the avatar should be the dark version\n\t\t * @return {string}\n\t\t */\n\t\tgenerateAvatar(user, isDarkTheme) {\n\t\t\tif (isDarkTheme) {\n\t\t\t\treturn generateUrl(\n\t\t\t\t\t'/avatar/{user}/64/dark?v={version}',\n\t\t\t\t\t{\n\t\t\t\t\t\tuser,\n\t\t\t\t\t\tversion: oc_userconfig.avatar.version,\n\t\t\t\t\t}\n\t\t\t\t)\n\t\t\t} else {\n\t\t\t\treturn generateUrl(\n\t\t\t\t\t'/avatar/{user}/64?v={version}',\n\t\t\t\t\t{\n\t\t\t\t\t\tuser,\n\t\t\t\t\t\tversion: oc_userconfig.avatar.version,\n\t\t\t\t\t}\n\t\t\t\t)\n\t\t\t}\n\t\t},\n\t},\n}\n","import mod from \"-!../../../../../node_modules/babel-loader/lib/index.js!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./UserRowSimple.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!./UserRowSimple.vue?vue&type=script&lang=js&\"","<template>\n\t<div class=\"row\"\n\t\t:class=\"{'disabled': loading.delete || loading.disable}\"\n\t\t:data-id=\"user.id\">\n\t\t<div class=\"avatar\" :class=\"{'icon-loading-small': loading.delete || loading.disable || loading.wipe}\">\n\t\t\t<img v-if=\"!loading.delete && !loading.disable && !loading.wipe\"\n\t\t\t\talt=\"\"\n\t\t\t\twidth=\"32\"\n\t\t\t\theight=\"32\"\n\t\t\t\t:src=\"generateAvatar(user.id, isDarkTheme)\" />\n\t\t</div>\n\t\t<!-- dirty hack to ellipsis on two lines -->\n\t\t<div class=\"name\">\n\t\t\t<div class=\"displayName subtitle\">\n\t\t\t\t<div v-tooltip=\"user.displayname.length > 20 ? user.displayname : ''\" class=\"cellText\">\n\t\t\t\t\t<strong>\n\t\t\t\t\t\t{{ user.displayname }}\n\t\t\t\t\t</strong>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t{{ user.id }}\n\t\t</div>\n\t\t<div />\n\t\t<div class=\"mailAddress\">\n\t\t\t<div v-tooltip=\"user.email !== null && user.email.length > 20 ? user.email : ''\" class=\"cellText\">\n\t\t\t\t{{ user.email }}\n\t\t\t</div>\n\t\t</div>\n\t\t<div class=\"groups\">\n\t\t\t{{ userGroupsLabels }}\n\t\t</div>\n\t\t<div v-if=\"subAdminsGroups.length > 0 && settings.isAdmin\" class=\"subAdminsGroups\">\n\t\t\t{{ userSubAdminsGroupsLabels }}\n\t\t</div>\n\t\t<div class=\"userQuota\">\n\t\t\t<div class=\"quota\">\n\t\t\t\t{{ userQuota }} ({{ usedSpace }})\n\t\t\t\t<progress class=\"quota-user-progress\"\n\t\t\t\t\t:class=\"{'warn': usedQuota > 80}\"\n\t\t\t\t\t:value=\"usedQuota\"\n\t\t\t\t\tmax=\"100\" />\n\t\t\t</div>\n\t\t</div>\n\t\t<div v-if=\"showConfig.showLanguages\" class=\"languages\">\n\t\t\t{{ userLanguage.name }}\n\t\t</div>\n\t\t<div v-if=\"showConfig.showUserBackend || showConfig.showStoragePath\" class=\"userBackend\">\n\t\t\t<div v-if=\"showConfig.showUserBackend\" class=\"userBackend\">\n\t\t\t\t{{ user.backend }}\n\t\t\t</div>\n\t\t\t<div v-if=\"showConfig.showStoragePath\" v-tooltip=\"user.storageLocation\" class=\"storageLocation subtitle\">\n\t\t\t\t{{ user.storageLocation }}\n\t\t\t</div>\n\t\t</div>\n\t\t<div v-if=\"showConfig.showLastLogin\" v-tooltip.auto=\"userLastLoginTooltip\" class=\"lastLogin\">\n\t\t\t{{ userLastLogin }}\n\t\t</div>\n\n\t\t<div class=\"userActions\">\n\t\t\t<div v-if=\"canEdit && !loading.all\" class=\"toggleUserActions\">\n\t\t\t\t<NcActions>\n\t\t\t\t\t<NcActionButton icon=\"icon-rename\" @click=\"toggleEdit\">\n\t\t\t\t\t\t{{ t('settings', 'Edit User') }}\n\t\t\t\t\t</NcActionButton>\n\t\t\t\t</NcActions>\n\t\t\t\t<div class=\"userPopoverMenuWrapper\">\n\t\t\t\t\t<button v-click-outside=\"hideMenu\"\n\t\t\t\t\t\tclass=\"icon-more\"\n\t\t\t\t\t\t:aria-label=\"t('settings', 'Toggle user actions menu')\"\n\t\t\t\t\t\t@click.prevent=\"toggleMenu\" />\n\t\t\t\t\t<div class=\"popovermenu\" :class=\"{ 'open': openedMenu }\" :aria-expanded=\"openedMenu\">\n\t\t\t\t\t\t<NcPopoverMenu :menu=\"userActions\" />\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div class=\"feedback\" :style=\"{opacity: feedbackMessage !== '' ? 1 : 0}\">\n\t\t\t\t<div class=\"icon-checkmark\" />\n\t\t\t\t{{ feedbackMessage }}\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</template>\n\n<script>\nimport NcPopoverMenu from '@nextcloud/vue/dist/Components/NcPopoverMenu'\nimport NcActions from '@nextcloud/vue/dist/Components/NcActions'\nimport NcActionButton from '@nextcloud/vue/dist/Components/NcActionButton'\nimport ClickOutside from 'vue-click-outside'\nimport { getCurrentUser } from '@nextcloud/auth'\nimport UserRowMixin from '../../mixins/UserRowMixin'\nexport default {\n\tname: 'UserRowSimple',\n\tcomponents: {\n\t\tNcPopoverMenu,\n\t\tNcActionButton,\n\t\tNcActions,\n\t},\n\tdirectives: {\n\t\tClickOutside,\n\t},\n\tmixins: [UserRowMixin],\n\tprops: {\n\t\tuser: {\n\t\t\ttype: Object,\n\t\t\trequired: true,\n\t\t},\n\t\tloading: {\n\t\t\ttype: Object,\n\t\t\trequired: true,\n\t\t},\n\t\tshowConfig: {\n\t\t\ttype: Object,\n\t\t\trequired: true,\n\t\t},\n\t\tuserActions: {\n\t\t\ttype: Array,\n\t\t\trequired: true,\n\t\t},\n\t\topenedMenu: {\n\t\t\ttype: Boolean,\n\t\t\trequired: true,\n\t\t},\n\t\tfeedbackMessage: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t},\n\t\tsubAdminsGroups: {\n\t\t\ttype: Array,\n\t\t\trequired: true,\n\t\t},\n\t\tsettings: {\n\t\t\ttype: Object,\n\t\t\trequired: true,\n\t\t},\n\t\tisDarkTheme: {\n\t\t\ttype: Boolean,\n\t\t\trequired: true,\n\t\t},\n\t},\n\tcomputed: {\n\t\tuserGroupsLabels() {\n\t\t\treturn this.userGroups\n\t\t\t\t.map(group => group.name)\n\t\t\t\t.join(', ')\n\t\t},\n\t\tuserSubAdminsGroupsLabels() {\n\t\t\treturn this.userSubAdminsGroups\n\t\t\t\t.map(group => group.name)\n\t\t\t\t.join(', ')\n\t\t},\n\t\tusedSpace() {\n\t\t\tif (this.user.quota.used) {\n\t\t\t\treturn t('settings', '{size} used', { size: OC.Util.humanFileSize(this.user.quota.used) })\n\t\t\t}\n\t\t\treturn t('settings', '{size} used', { size: OC.Util.humanFileSize(0) })\n\t\t},\n\t\tcanEdit() {\n\t\t\treturn getCurrentUser().uid !== this.user.id || this.settings.isAdmin\n\t\t},\n\t\tuserQuota() {\n\t\t\tlet quota = this.user.quota.quota\n\n\t\t\tif (quota === 'default') {\n\t\t\t\tquota = this.settings.defaultQuota\n\t\t\t\tif (quota !== 'none') {\n\t\t\t\t\t// convert to numeric value to match what the server would usually return\n\t\t\t\t\tquota = OC.Util.computerFileSize(quota)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// when the default quota is unlimited, the server returns -3 here, map it to \"none\"\n\t\t\tif (quota === 'none' || quota === -3) {\n\t\t\t\treturn t('settings', 'Unlimited')\n\t\t\t} else if (quota >= 0) {\n\t\t\t\treturn OC.Util.humanFileSize(quota)\n\t\t\t}\n\t\t\treturn OC.Util.humanFileSize(0)\n\t\t},\n\t},\n\tmethods: {\n\t\ttoggleMenu() {\n\t\t\tthis.$emit('update:openedMenu', !this.openedMenu)\n\t\t},\n\t\thideMenu() {\n\t\t\tthis.$emit('update:openedMenu', false)\n\t\t},\n\t\ttoggleEdit() {\n\t\t\tthis.$emit('update:editing', true)\n\t\t},\n\t},\n}\n</script>\n\n<style lang=\"scss\">\n\t.cellText {\n\t\toverflow: hidden;\n\t\ttext-overflow: ellipsis;\n\t\twhite-space: nowrap;\n}\n\t.icon-more {\n\t\tbackground-color: var(--color-main-background);\n\t\tborder: 0;\n\t}\n</style>\n","\n import API from \"!../../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../../node_modules/css-loader/dist/cjs.js!../../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../node_modules/sass-loader/dist/cjs.js!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./UserRowSimple.vue?vue&type=style&index=0&lang=scss&\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../../node_modules/css-loader/dist/cjs.js!../../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../node_modules/sass-loader/dist/cjs.js!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./UserRowSimple.vue?vue&type=style&index=0&lang=scss&\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./UserRowSimple.vue?vue&type=template&id=6bcca1e8&\"\nimport script from \"./UserRowSimple.vue?vue&type=script&lang=js&\"\nexport * from \"./UserRowSimple.vue?vue&type=script&lang=js&\"\nimport style0 from \"./UserRowSimple.vue?vue&type=style&index=0&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n 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',{staticClass:\"row\",class:{'disabled': _vm.loading.delete || _vm.loading.disable},attrs:{\"data-id\":_vm.user.id}},[_c('div',{staticClass:\"avatar\",class:{'icon-loading-small': _vm.loading.delete || _vm.loading.disable || _vm.loading.wipe}},[(!_vm.loading.delete && !_vm.loading.disable && !_vm.loading.wipe)?_c('img',{attrs:{\"alt\":\"\",\"width\":\"32\",\"height\":\"32\",\"src\":_vm.generateAvatar(_vm.user.id, _vm.isDarkTheme)}}):_vm._e()]),_vm._v(\" \"),_c('div',{staticClass:\"name\"},[_c('div',{staticClass:\"displayName subtitle\"},[_c('div',{directives:[{name:\"tooltip\",rawName:\"v-tooltip\",value:(_vm.user.displayname.length > 20 ? _vm.user.displayname : ''),expression:\"user.displayname.length > 20 ? user.displayname : ''\"}],staticClass:\"cellText\"},[_c('strong',[_vm._v(\"\\n\\t\\t\\t\\t\\t\"+_vm._s(_vm.user.displayname)+\"\\n\\t\\t\\t\\t\")])])]),_vm._v(\"\\n\\t\\t\"+_vm._s(_vm.user.id)+\"\\n\\t\")]),_vm._v(\" \"),_c('div'),_vm._v(\" \"),_c('div',{staticClass:\"mailAddress\"},[_c('div',{directives:[{name:\"tooltip\",rawName:\"v-tooltip\",value:(_vm.user.email !== null && _vm.user.email.length > 20 ? _vm.user.email : ''),expression:\"user.email !== null && user.email.length > 20 ? user.email : ''\"}],staticClass:\"cellText\"},[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.user.email)+\"\\n\\t\\t\")])]),_vm._v(\" \"),_c('div',{staticClass:\"groups\"},[_vm._v(\"\\n\\t\\t\"+_vm._s(_vm.userGroupsLabels)+\"\\n\\t\")]),_vm._v(\" \"),(_vm.subAdminsGroups.length > 0 && _vm.settings.isAdmin)?_c('div',{staticClass:\"subAdminsGroups\"},[_vm._v(\"\\n\\t\\t\"+_vm._s(_vm.userSubAdminsGroupsLabels)+\"\\n\\t\")]):_vm._e(),_vm._v(\" \"),_c('div',{staticClass:\"userQuota\"},[_c('div',{staticClass:\"quota\"},[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.userQuota)+\" (\"+_vm._s(_vm.usedSpace)+\")\\n\\t\\t\\t\"),_c('progress',{staticClass:\"quota-user-progress\",class:{'warn': _vm.usedQuota > 80},attrs:{\"max\":\"100\"},domProps:{\"value\":_vm.usedQuota}})])]),_vm._v(\" \"),(_vm.showConfig.showLanguages)?_c('div',{staticClass:\"languages\"},[_vm._v(\"\\n\\t\\t\"+_vm._s(_vm.userLanguage.name)+\"\\n\\t\")]):_vm._e(),_vm._v(\" \"),(_vm.showConfig.showUserBackend || _vm.showConfig.showStoragePath)?_c('div',{staticClass:\"userBackend\"},[(_vm.showConfig.showUserBackend)?_c('div',{staticClass:\"userBackend\"},[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.user.backend)+\"\\n\\t\\t\")]):_vm._e(),_vm._v(\" \"),(_vm.showConfig.showStoragePath)?_c('div',{directives:[{name:\"tooltip\",rawName:\"v-tooltip\",value:(_vm.user.storageLocation),expression:\"user.storageLocation\"}],staticClass:\"storageLocation subtitle\"},[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.user.storageLocation)+\"\\n\\t\\t\")]):_vm._e()]):_vm._e(),_vm._v(\" \"),(_vm.showConfig.showLastLogin)?_c('div',{directives:[{name:\"tooltip\",rawName:\"v-tooltip.auto\",value:(_vm.userLastLoginTooltip),expression:\"userLastLoginTooltip\",modifiers:{\"auto\":true}}],staticClass:\"lastLogin\"},[_vm._v(\"\\n\\t\\t\"+_vm._s(_vm.userLastLogin)+\"\\n\\t\")]):_vm._e(),_vm._v(\" \"),_c('div',{staticClass:\"userActions\"},[(_vm.canEdit && !_vm.loading.all)?_c('div',{staticClass:\"toggleUserActions\"},[_c('NcActions',[_c('NcActionButton',{attrs:{\"icon\":\"icon-rename\"},on:{\"click\":_vm.toggleEdit}},[_vm._v(\"\\n\\t\\t\\t\\t\\t\"+_vm._s(_vm.t('settings', 'Edit User'))+\"\\n\\t\\t\\t\\t\")])],1),_vm._v(\" \"),_c('div',{staticClass:\"userPopoverMenuWrapper\"},[_c('button',{directives:[{name:\"click-outside\",rawName:\"v-click-outside\",value:(_vm.hideMenu),expression:\"hideMenu\"}],staticClass:\"icon-more\",attrs:{\"aria-label\":_vm.t('settings', 'Toggle user actions menu')},on:{\"click\":function($event){$event.preventDefault();return _vm.toggleMenu.apply(null, arguments)}}}),_vm._v(\" \"),_c('div',{staticClass:\"popovermenu\",class:{ 'open': _vm.openedMenu },attrs:{\"aria-expanded\":_vm.openedMenu}},[_c('NcPopoverMenu',{attrs:{\"menu\":_vm.userActions}})],1)])],1):_vm._e(),_vm._v(\" \"),_c('div',{staticClass:\"feedback\",style:({opacity: _vm.feedbackMessage !== '' ? 1 : 0})},[_c('div',{staticClass:\"icon-checkmark\"}),_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.feedbackMessage)+\"\\n\\t\\t\")])])])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<!--\n - @copyright Copyright (c) 2018 John Molakvoæ <skjnldsv@protonmail.com>\n - @copyright Copyright (c) 2019 Gary Kim <gary@garykim.dev>\n -\n - @author John Molakvoæ <skjnldsv@protonmail.com>\n - @author Gary Kim <gary@garykim.dev>\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<!-- Obfuscated user: Logged in user does not have permissions to see all of the data -->\n\t<div v-if=\"Object.keys(user).length ===1\" :data-id=\"user.id\" class=\"row\">\n\t\t<div :class=\"{'icon-loading-small': loading.delete || loading.disable || loading.wipe}\"\n\t\t\tclass=\"avatar\">\n\t\t\t<img v-if=\"!loading.delete && !loading.disable && !loading.wipe\"\n\t\t\t\t:src=\"generateAvatar(user.id, isDarkTheme)\"\n\t\t\t\talt=\"\"\n\t\t\t\theight=\"32\"\n\t\t\t\twidth=\"32\">\n\t\t</div>\n\t\t<div class=\"name\">\n\t\t\t{{ user.id }}\n\t\t</div>\n\t\t<div class=\"obfuscated\">\n\t\t\t{{ t('settings','You do not have permissions to see the details of this user') }}\n\t\t</div>\n\t</div>\n\n\t<!-- User full data -->\n\t<UserRowSimple v-else-if=\"!editing\"\n\t\t:editing.sync=\"editing\"\n\t\t:feedback-message=\"feedbackMessage\"\n\t\t:groups=\"groups\"\n\t\t:languages=\"languages\"\n\t\t:loading=\"loading\"\n\t\t:opened-menu.sync=\"openedMenu\"\n\t\t:settings=\"settings\"\n\t\t:show-config=\"showConfig\"\n\t\t:sub-admins-groups=\"subAdminsGroups\"\n\t\t:user-actions=\"userActions\"\n\t\t:user=\"user\"\n\t\t:is-dark-theme=\"isDarkTheme\"\n\t\t:class=\"{'row--menu-opened': openedMenu}\" />\n\t<div v-else\n\t\t:class=\"{\n\t\t\t'disabled': loading.delete || loading.disable,\n\t\t\t'row--menu-opened': openedMenu\n\t\t}\"\n\t\t:data-id=\"user.id\"\n\t\tclass=\"row row--editable\">\n\t\t<div :class=\"{'icon-loading-small': loading.delete || loading.disable || loading.wipe}\"\n\t\t\tclass=\"avatar\">\n\t\t\t<img v-if=\"!loading.delete && !loading.disable && !loading.wipe\"\n\t\t\t\t:src=\"generateAvatar(user.id, isDarkTheme)\"\n\t\t\t\talt=\"\"\n\t\t\t\theight=\"32\"\n\t\t\t\twidth=\"32\">\n\t\t</div>\n\t\t<!-- dirty hack to ellipsis on two lines -->\n\t\t<div v-if=\"user.backendCapabilities.setDisplayName\" class=\"displayName\">\n\t\t\t<form :class=\"{'icon-loading-small': loading.displayName}\"\n\t\t\t\tclass=\"displayName\"\n\t\t\t\t@submit.prevent=\"updateDisplayName\">\n\t\t\t\t<input :id=\"'displayName'+user.id+rand\"\n\t\t\t\t\tref=\"displayName\"\n\t\t\t\t\t:disabled=\"loading.displayName||loading.all\"\n\t\t\t\t\t:value=\"user.displayname\"\n\t\t\t\t\tautocapitalize=\"off\"\n\t\t\t\t\tautocomplete=\"off\"\n\t\t\t\t\tautocorrect=\"off\"\n\t\t\t\t\tspellcheck=\"false\"\n\t\t\t\t\ttype=\"text\">\n\t\t\t\t<input class=\"icon-confirm\"\n\t\t\t\t\ttype=\"submit\"\n\t\t\t\t\tvalue=\"\">\n\t\t\t</form>\n\t\t</div>\n\t\t<div v-else class=\"name\">\n\t\t\t{{ user.id }}\n\t\t\t<div class=\"displayName subtitle\">\n\t\t\t\t<div v-tooltip=\"user.displayname.length > 20 ? user.displayname : ''\" class=\"cellText\">\n\t\t\t\t\t{{ user.displayname }}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t\t<form v-if=\"settings.canChangePassword && user.backendCapabilities.setPassword\"\n\t\t\t:class=\"{'icon-loading-small': loading.password}\"\n\t\t\tclass=\"password\"\n\t\t\t@submit.prevent=\"updatePassword\">\n\t\t\t<input :id=\"'password'+user.id+rand\"\n\t\t\t\tref=\"password\"\n\t\t\t\t:disabled=\"loading.password || loading.all\"\n\t\t\t\t:minlength=\"minPasswordLength\"\n\t\t\t\tmaxlength=\"469\"\n\t\t\t\t:placeholder=\"t('settings', 'Add new password')\"\n\t\t\t\tautocapitalize=\"off\"\n\t\t\t\tautocomplete=\"new-password\"\n\t\t\t\tautocorrect=\"off\"\n\t\t\t\trequired\n\t\t\t\tspellcheck=\"false\"\n\t\t\t\ttype=\"password\"\n\t\t\t\tvalue=\"\">\n\t\t\t<input class=\"icon-confirm\" type=\"submit\" value=\"\">\n\t\t</form>\n\t\t<div v-else />\n\t\t<form :class=\"{'icon-loading-small': loading.mailAddress}\"\n\t\t\tclass=\"mailAddress\"\n\t\t\t@submit.prevent=\"updateEmail\">\n\t\t\t<input :id=\"'mailAddress'+user.id+rand\"\n\t\t\t\tref=\"mailAddress\"\n\t\t\t\t:disabled=\"loading.mailAddress||loading.all\"\n\t\t\t\t:placeholder=\"t('settings', 'Add new email address')\"\n\t\t\t\t:value=\"user.email\"\n\t\t\t\tautocapitalize=\"off\"\n\t\t\t\tautocomplete=\"new-password\"\n\t\t\t\tautocorrect=\"off\"\n\t\t\t\tspellcheck=\"false\"\n\t\t\t\ttype=\"email\">\n\t\t\t<input class=\"icon-confirm\" type=\"submit\" value=\"\">\n\t\t</form>\n\t\t<div :class=\"{'icon-loading-small': loading.groups}\" class=\"groups\">\n\t\t\t<NcMultiselect :close-on-select=\"false\"\n\t\t\t\t:disabled=\"loading.groups||loading.all\"\n\t\t\t\t:limit=\"2\"\n\t\t\t\t:multiple=\"true\"\n\t\t\t\t:options=\"availableGroups\"\n\t\t\t\t:placeholder=\"t('settings', 'Add user to group')\"\n\t\t\t\t:tag-width=\"60\"\n\t\t\t\t:taggable=\"settings.isAdmin\"\n\t\t\t\t:value=\"userGroups\"\n\t\t\t\tclass=\"multiselect-vue\"\n\t\t\t\tlabel=\"name\"\n\t\t\t\ttag-placeholder=\"create\"\n\t\t\t\ttrack-by=\"id\"\n\t\t\t\t@remove=\"removeUserGroup\"\n\t\t\t\t@select=\"addUserGroup\"\n\t\t\t\t@tag=\"createGroup\">\n\t\t\t\t<span slot=\"noResult\">{{ t('settings', 'No results') }}</span>\n\t\t\t</NcMultiselect>\n\t\t</div>\n\t\t<div v-if=\"subAdminsGroups.length>0 && settings.isAdmin\"\n\t\t\t:class=\"{'icon-loading-small': loading.subadmins}\"\n\t\t\tclass=\"subadmins\">\n\t\t\t<NcMultiselect :close-on-select=\"false\"\n\t\t\t\t:disabled=\"loading.subadmins||loading.all\"\n\t\t\t\t:limit=\"2\"\n\t\t\t\t:multiple=\"true\"\n\t\t\t\t:options=\"subAdminsGroups\"\n\t\t\t\t:placeholder=\"t('settings', 'Set user as admin for')\"\n\t\t\t\t:tag-width=\"60\"\n\t\t\t\t:value=\"userSubAdminsGroups\"\n\t\t\t\tclass=\"multiselect-vue\"\n\t\t\t\tlabel=\"name\"\n\t\t\t\ttrack-by=\"id\"\n\t\t\t\t@remove=\"removeUserSubAdmin\"\n\t\t\t\t@select=\"addUserSubAdmin\">\n\t\t\t\t<span slot=\"noResult\">{{ t('settings', 'No results') }}</span>\n\t\t\t</NcMultiselect>\n\t\t</div>\n\t\t<div v-tooltip.auto=\"usedSpace\"\n\t\t\t:class=\"{'icon-loading-small': loading.quota}\"\n\t\t\tclass=\"quota\">\n\t\t\t<NcMultiselect :allow-empty=\"false\"\n\t\t\t\t:disabled=\"loading.quota||loading.all\"\n\t\t\t\t:options=\"quotaOptions\"\n\t\t\t\t:placeholder=\"t('settings', 'Select user quota')\"\n\t\t\t\t:taggable=\"true\"\n\t\t\t\t:value=\"userQuota\"\n\t\t\t\tclass=\"multiselect-vue\"\n\t\t\t\tlabel=\"label\"\n\t\t\t\ttag-placeholder=\"create\"\n\t\t\t\ttrack-by=\"id\"\n\t\t\t\t@input=\"setUserQuota\"\n\t\t\t\t@tag=\"validateQuota\" />\n\t\t</div>\n\t\t<div v-if=\"showConfig.showLanguages\"\n\t\t\t:class=\"{'icon-loading-small': loading.languages}\"\n\t\t\tclass=\"languages\">\n\t\t\t<NcMultiselect :allow-empty=\"false\"\n\t\t\t\t:disabled=\"loading.languages||loading.all\"\n\t\t\t\t:options=\"languages\"\n\t\t\t\t:placeholder=\"t('settings', 'No language set')\"\n\t\t\t\t:value=\"userLanguage\"\n\t\t\t\tclass=\"multiselect-vue\"\n\t\t\t\tgroup-label=\"label\"\n\t\t\t\tgroup-values=\"languages\"\n\t\t\t\tlabel=\"name\"\n\t\t\t\ttrack-by=\"code\"\n\t\t\t\t@input=\"setUserLanguage\" />\n\t\t</div>\n\n\t\t<!-- don't show this on edit mode -->\n\t\t<div v-if=\"showConfig.showStoragePath || showConfig.showUserBackend\"\n\t\t\tclass=\"storageLocation\" />\n\t\t<div v-if=\"showConfig.showLastLogin\" />\n\n\t\t<div class=\"userActions\">\n\t\t\t<div v-if=\"!loading.all\"\n\t\t\t\tclass=\"toggleUserActions\">\n\t\t\t\t<NcActions>\n\t\t\t\t\t<NcActionButton icon=\"icon-checkmark\"\n\t\t\t\t\t\t@click=\"editing = false\">\n\t\t\t\t\t\t{{ t('settings', 'Done') }}\n\t\t\t\t\t</NcActionButton>\n\t\t\t\t</NcActions>\n\t\t\t\t<div v-click-outside=\"hideMenu\" class=\"userPopoverMenuWrapper\">\n\t\t\t\t\t<button class=\"icon-more\"\n\t\t\t\t\t\t@click.prevent=\"toggleMenu\" />\n\t\t\t\t\t<div :class=\"{ 'open': openedMenu }\" class=\"popovermenu\">\n\t\t\t\t\t\t<NcPopoverMenu :menu=\"userActions\" />\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div :style=\"{opacity: feedbackMessage !== '' ? 1 : 0}\"\n\t\t\t\tclass=\"feedback\">\n\t\t\t\t<div class=\"icon-checkmark\" />\n\t\t\t\t{{ feedbackMessage }}\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</template>\n\n<script>\nimport ClickOutside from 'vue-click-outside'\nimport Vue from 'vue'\nimport VTooltip from 'v-tooltip'\nimport {\n\tNcPopoverMenu,\n\tNcMultiselect,\n\tNcActions,\n\tNcActionButton,\n} from '@nextcloud/vue'\nimport UserRowSimple from './UserRowSimple'\nimport UserRowMixin from '../../mixins/UserRowMixin'\n\nVue.use(VTooltip)\n\nexport default {\n\tname: 'UserRow',\n\tcomponents: {\n\t\tUserRowSimple,\n\t\tNcPopoverMenu,\n\t\tNcActions,\n\t\tNcActionButton,\n\t\tNcMultiselect,\n\t},\n\tdirectives: {\n\t\tClickOutside,\n\t},\n\tmixins: [UserRowMixin],\n\tprops: {\n\t\tuser: {\n\t\t\ttype: Object,\n\t\t\trequired: true,\n\t\t},\n\t\tsettings: {\n\t\t\ttype: Object,\n\t\t\tdefault: () => ({}),\n\t\t},\n\t\tgroups: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\t\tsubAdminsGroups: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\t\tquotaOptions: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\t\tshowConfig: {\n\t\t\ttype: Object,\n\t\t\tdefault: () => ({}),\n\t\t},\n\t\tlanguages: {\n\t\t\ttype: Array,\n\t\t\trequired: true,\n\t\t},\n\t\texternalActions: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\t\tisDarkTheme: {\n\t\t\ttype: Boolean,\n\t\t\trequired: true,\n\t\t},\n\t},\n\tdata() {\n\t\treturn {\n\t\t\trand: parseInt(Math.random() * 1000),\n\t\t\topenedMenu: false,\n\t\t\tfeedbackMessage: '',\n\t\t\tediting: false,\n\t\t\tloading: {\n\t\t\t\tall: false,\n\t\t\t\tdisplayName: false,\n\t\t\t\tpassword: false,\n\t\t\t\tmailAddress: false,\n\t\t\t\tgroups: false,\n\t\t\t\tsubadmins: false,\n\t\t\t\tquota: false,\n\t\t\t\tdelete: false,\n\t\t\t\tdisable: false,\n\t\t\t\tlanguages: false,\n\t\t\t\twipe: false,\n\t\t\t},\n\t\t}\n\t},\n\tcomputed: {\n\t\t/* USER POPOVERMENU ACTIONS */\n\t\tuserActions() {\n\t\t\tconst actions = [\n\t\t\t\t{\n\t\t\t\t\ticon: 'icon-delete',\n\t\t\t\t\ttext: t('settings', 'Delete user'),\n\t\t\t\t\taction: this.deleteUser,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\ticon: 'icon-delete',\n\t\t\t\t\ttext: t('settings', 'Wipe all devices'),\n\t\t\t\t\taction: this.wipeUserDevices,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\ticon: this.user.enabled ? 'icon-close' : 'icon-add',\n\t\t\t\t\ttext: this.user.enabled ? t('settings', 'Disable user') : t('settings', 'Enable user'),\n\t\t\t\t\taction: this.enableDisableUser,\n\t\t\t\t},\n\t\t\t]\n\t\t\tif (this.user.email !== null && this.user.email !== '') {\n\t\t\t\tactions.push({\n\t\t\t\t\ticon: 'icon-mail',\n\t\t\t\t\ttext: t('settings', 'Resend welcome email'),\n\t\t\t\t\taction: this.sendWelcomeMail,\n\t\t\t\t})\n\t\t\t}\n\t\t\treturn actions.concat(this.externalActions)\n\t\t},\n\t},\n\n\tmethods: {\n\t\t/* MENU HANDLING */\n\t\ttoggleMenu() {\n\t\t\tthis.openedMenu = !this.openedMenu\n\t\t},\n\t\thideMenu() {\n\t\t\tthis.openedMenu = false\n\t\t},\n\n\t\twipeUserDevices() {\n\t\t\tconst userid = this.user.id\n\t\t\tOC.dialogs.confirmDestructive(\n\t\t\t\tt('settings', 'In case of lost device or exiting the organization, this can remotely wipe the Nextcloud data from all devices associated with {userid}. Only works if the devices are connected to the internet.', { userid }),\n\t\t\t\tt('settings', 'Remote wipe of devices'),\n\t\t\t\t{\n\t\t\t\t\ttype: OC.dialogs.YES_NO_BUTTONS,\n\t\t\t\t\tconfirm: t('settings', 'Wipe {userid}\\'s devices', { userid }),\n\t\t\t\t\tconfirmClasses: 'error',\n\t\t\t\t\tcancel: t('settings', 'Cancel'),\n\t\t\t\t},\n\t\t\t\t(result) => {\n\t\t\t\t\tif (result) {\n\t\t\t\t\t\tthis.loading.wipe = true\n\t\t\t\t\t\tthis.loading.all = true\n\t\t\t\t\t\tthis.$store.dispatch('wipeUserDevices', userid)\n\t\t\t\t\t\t\t.then(() => {\n\t\t\t\t\t\t\t\tthis.loading.wipe = false\n\t\t\t\t\t\t\t\tthis.loading.all = false\n\t\t\t\t\t\t\t})\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\ttrue\n\t\t\t)\n\t\t},\n\n\t\tdeleteUser() {\n\t\t\tconst userid = this.user.id\n\t\t\tOC.dialogs.confirmDestructive(\n\t\t\t\tt('settings', 'Fully delete {userid}\\'s account including all their personal files, app data, etc.', { userid }),\n\t\t\t\tt('settings', 'Account deletion'),\n\t\t\t\t{\n\t\t\t\t\ttype: OC.dialogs.YES_NO_BUTTONS,\n\t\t\t\t\tconfirm: t('settings', 'Delete {userid}\\'s account', { userid }),\n\t\t\t\t\tconfirmClasses: 'error',\n\t\t\t\t\tcancel: t('settings', 'Cancel'),\n\t\t\t\t},\n\t\t\t\t(result) => {\n\t\t\t\t\tif (result) {\n\t\t\t\t\t\tthis.loading.delete = true\n\t\t\t\t\t\tthis.loading.all = true\n\t\t\t\t\t\treturn this.$store.dispatch('deleteUser', userid)\n\t\t\t\t\t\t\t.then(() => {\n\t\t\t\t\t\t\t\tthis.loading.delete = false\n\t\t\t\t\t\t\t\tthis.loading.all = false\n\t\t\t\t\t\t\t})\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\ttrue\n\t\t\t)\n\t\t},\n\n\t\tenableDisableUser() {\n\t\t\tthis.loading.delete = true\n\t\t\tthis.loading.all = true\n\t\t\tconst userid = this.user.id\n\t\t\tconst enabled = !this.user.enabled\n\t\t\treturn this.$store.dispatch('enableDisableUser', {\n\t\t\t\tuserid,\n\t\t\t\tenabled,\n\t\t\t})\n\t\t\t\t.then(() => {\n\t\t\t\t\tthis.loading.delete = false\n\t\t\t\t\tthis.loading.all = false\n\t\t\t\t})\n\t\t},\n\n\t\t/**\n\t\t * Set user displayName\n\t\t *\n\t\t * @param {string} displayName The display name\n\t\t */\n\t\tupdateDisplayName() {\n\t\t\tconst displayName = this.$refs.displayName.value\n\t\t\tthis.loading.displayName = true\n\t\t\tthis.$store.dispatch('setUserData', {\n\t\t\t\tuserid: this.user.id,\n\t\t\t\tkey: 'displayname',\n\t\t\t\tvalue: displayName,\n\t\t\t}).then(() => {\n\t\t\t\tthis.loading.displayName = false\n\t\t\t\tthis.$refs.displayName.value = displayName\n\t\t\t})\n\t\t},\n\n\t\t/**\n\t\t * Set user password\n\t\t *\n\t\t * @param {string} password The email address\n\t\t */\n\t\tupdatePassword() {\n\t\t\tconst password = this.$refs.password.value\n\t\t\tthis.loading.password = true\n\t\t\tthis.$store.dispatch('setUserData', {\n\t\t\t\tuserid: this.user.id,\n\t\t\t\tkey: 'password',\n\t\t\t\tvalue: password,\n\t\t\t}).then(() => {\n\t\t\t\tthis.loading.password = false\n\t\t\t\tthis.$refs.password.value = '' // empty & show placeholder\n\t\t\t})\n\t\t},\n\n\t\t/**\n\t\t * Set user mailAddress\n\t\t *\n\t\t * @param {string} mailAddress The email address\n\t\t */\n\t\tupdateEmail() {\n\t\t\tconst mailAddress = this.$refs.mailAddress.value\n\t\t\tthis.loading.mailAddress = true\n\t\t\tthis.$store.dispatch('setUserData', {\n\t\t\t\tuserid: this.user.id,\n\t\t\t\tkey: 'email',\n\t\t\t\tvalue: mailAddress,\n\t\t\t}).then(() => {\n\t\t\t\tthis.loading.mailAddress = false\n\t\t\t\tthis.$refs.mailAddress.value = mailAddress\n\t\t\t})\n\t\t},\n\n\t\t/**\n\t\t * Create a new group and add user to it\n\t\t *\n\t\t * @param {string} gid Group id\n\t\t */\n\t\tasync createGroup(gid) {\n\t\t\tthis.loading = { groups: true, subadmins: true }\n\t\t\ttry {\n\t\t\t\tawait this.$store.dispatch('addGroup', gid)\n\t\t\t\tconst userid = this.user.id\n\t\t\t\tawait this.$store.dispatch('addUserGroup', { userid, gid })\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error(error)\n\t\t\t} finally {\n\t\t\t\tthis.loading = { groups: false, subadmins: false }\n\t\t\t}\n\t\t\treturn this.$store.getters.getGroups[this.groups.length]\n\t\t},\n\n\t\t/**\n\t\t * Add user to group\n\t\t *\n\t\t * @param {object} group Group object\n\t\t */\n\t\tasync addUserGroup(group) {\n\t\t\tif (group.canAdd === false) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tthis.loading.groups = true\n\t\t\tconst userid = this.user.id\n\t\t\tconst gid = group.id\n\t\t\ttry {\n\t\t\t\tawait this.$store.dispatch('addUserGroup', { userid, gid })\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error(error)\n\t\t\t} finally {\n\t\t\t\tthis.loading.groups = false\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Remove user from group\n\t\t *\n\t\t * @param {object} group Group object\n\t\t */\n\t\tasync removeUserGroup(group) {\n\t\t\tif (group.canRemove === false) {\n\t\t\t\treturn false\n\t\t\t}\n\n\t\t\tthis.loading.groups = true\n\t\t\tconst userid = this.user.id\n\t\t\tconst gid = group.id\n\n\t\t\ttry {\n\t\t\t\tawait this.$store.dispatch('removeUserGroup', {\n\t\t\t\t\tuserid,\n\t\t\t\t\tgid,\n\t\t\t\t})\n\t\t\t\tthis.loading.groups = false\n\t\t\t\t// remove user from current list if current list is the removed group\n\t\t\t\tif (this.$route.params.selectedGroup === gid) {\n\t\t\t\t\tthis.$store.commit('deleteUser', userid)\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\tthis.loading.groups = false\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Add user to group\n\t\t *\n\t\t * @param {object} group Group object\n\t\t */\n\t\tasync addUserSubAdmin(group) {\n\t\t\tthis.loading.subadmins = true\n\t\t\tconst userid = this.user.id\n\t\t\tconst gid = group.id\n\n\t\t\ttry {\n\t\t\t\tawait this.$store.dispatch('addUserSubAdmin', {\n\t\t\t\t\tuserid,\n\t\t\t\t\tgid,\n\t\t\t\t})\n\t\t\t\tthis.loading.subadmins = false\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error(error)\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Remove user from group\n\t\t *\n\t\t * @param {object} group Group object\n\t\t */\n\t\tasync removeUserSubAdmin(group) {\n\t\t\tthis.loading.subadmins = true\n\t\t\tconst userid = this.user.id\n\t\t\tconst gid = group.id\n\n\t\t\ttry {\n\t\t\t\tawait this.$store.dispatch('removeUserSubAdmin', {\n\t\t\t\t\tuserid,\n\t\t\t\t\tgid,\n\t\t\t\t})\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error(error)\n\t\t\t} finally {\n\t\t\t\tthis.loading.subadmins = false\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Dispatch quota set request\n\t\t *\n\t\t * @param {string | object} quota Quota in readable format '5 GB' or Object {id: '5 GB', label: '5GB'}\n\t\t * @return {string}\n\t\t */\n\t\tasync setUserQuota(quota = 'none') {\n\t\t\tthis.loading.quota = true\n\t\t\t// ensure we only send the preset id\n\t\t\tquota = quota.id ? quota.id : quota\n\n\t\t\ttry {\n\t\t\t\tawait this.$store.dispatch('setUserData', {\n\t\t\t\t\tuserid: this.user.id,\n\t\t\t\t\tkey: 'quota',\n\t\t\t\t\tvalue: quota,\n\t\t\t\t})\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error(error)\n\t\t\t} finally {\n\t\t\t\tthis.loading.quota = false\n\t\t\t}\n\t\t\treturn quota\n\t\t},\n\n\t\t/**\n\t\t * Validate quota string to make sure it's a valid human file size\n\t\t *\n\t\t * @param {string} quota Quota in readable format '5 GB'\n\t\t * @return {Promise|boolean}\n\t\t */\n\t\tvalidateQuota(quota) {\n\t\t\t// only used for new presets sent through @Tag\n\t\t\tconst validQuota = OC.Util.computerFileSize(quota)\n\t\t\tif (validQuota !== null && validQuota >= 0) {\n\t\t\t\t// unify format output\n\t\t\t\treturn this.setUserQuota(OC.Util.humanFileSize(OC.Util.computerFileSize(quota)))\n\t\t\t}\n\t\t\t// if no valid do not change\n\t\t\treturn false\n\t\t},\n\n\t\t/**\n\t\t * Dispatch language set request\n\t\t *\n\t\t * @param {object} lang language object {code:'en', name:'English'}\n\t\t * @return {object}\n\t\t */\n\t\tasync setUserLanguage(lang) {\n\t\t\tthis.loading.languages = true\n\t\t\t// ensure we only send the preset id\n\t\t\ttry {\n\t\t\t\tawait this.$store.dispatch('setUserData', {\n\t\t\t\t\tuserid: this.user.id,\n\t\t\t\t\tkey: 'language',\n\t\t\t\t\tvalue: lang.code,\n\t\t\t\t})\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error(error)\n\t\t\t} finally {\n\t\t\t\tthis.loading.languages = false\n\t\t\t}\n\t\t\treturn lang\n\t\t},\n\n\t\t/**\n\t\t * Dispatch new welcome mail request\n\t\t */\n\t\tsendWelcomeMail() {\n\t\t\tthis.loading.all = true\n\t\t\tthis.$store.dispatch('sendWelcomeMail', this.user.id)\n\t\t\t\t.then(success => {\n\t\t\t\t\tif (success) {\n\t\t\t\t\t\t// Show feedback to indicate the success\n\t\t\t\t\t\tthis.feedbackMessage = t('setting', 'Welcome mail sent!')\n\t\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\t\tthis.feedbackMessage = ''\n\t\t\t\t\t\t}, 2000)\n\t\t\t\t\t}\n\t\t\t\t\tthis.loading.all = false\n\t\t\t\t})\n\t\t},\n\n\t},\n}\n</script>\n<style scoped lang=\"scss\">\n\t// Force menu to be above other rows\n\t.row--menu-opened {\n\t\tz-index: 1 !important;\n\t}\n\t.row::v-deep .multiselect__single {\n\t\tz-index: auto !important;\n\t}\n</style>\n","import mod from \"-!../../../../../node_modules/babel-loader/lib/index.js!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./UserRow.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!./UserRow.vue?vue&type=script&lang=js&\"","\n import API from \"!../../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../../node_modules/css-loader/dist/cjs.js!../../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../node_modules/sass-loader/dist/cjs.js!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./UserRow.vue?vue&type=style&index=0&id=573e6411&scoped=true&lang=scss&\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../../node_modules/css-loader/dist/cjs.js!../../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../node_modules/sass-loader/dist/cjs.js!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./UserRow.vue?vue&type=style&index=0&id=573e6411&scoped=true&lang=scss&\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./UserRow.vue?vue&type=template&id=573e6411&scoped=true&\"\nimport script from \"./UserRow.vue?vue&type=script&lang=js&\"\nexport * from \"./UserRow.vue?vue&type=script&lang=js&\"\nimport style0 from \"./UserRow.vue?vue&type=style&index=0&id=573e6411&scoped=true&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"573e6411\",\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 (Object.keys(_vm.user).length ===1)?_c('div',{staticClass:\"row\",attrs:{\"data-id\":_vm.user.id}},[_c('div',{staticClass:\"avatar\",class:{'icon-loading-small': _vm.loading.delete || _vm.loading.disable || _vm.loading.wipe}},[(!_vm.loading.delete && !_vm.loading.disable && !_vm.loading.wipe)?_c('img',{attrs:{\"src\":_vm.generateAvatar(_vm.user.id, _vm.isDarkTheme),\"alt\":\"\",\"height\":\"32\",\"width\":\"32\"}}):_vm._e()]),_vm._v(\" \"),_c('div',{staticClass:\"name\"},[_vm._v(\"\\n\\t\\t\"+_vm._s(_vm.user.id)+\"\\n\\t\")]),_vm._v(\" \"),_c('div',{staticClass:\"obfuscated\"},[_vm._v(\"\\n\\t\\t\"+_vm._s(_vm.t('settings','You do not have permissions to see the details of this user'))+\"\\n\\t\")])]):(!_vm.editing)?_c('UserRowSimple',{class:{'row--menu-opened': _vm.openedMenu},attrs:{\"editing\":_vm.editing,\"feedback-message\":_vm.feedbackMessage,\"groups\":_vm.groups,\"languages\":_vm.languages,\"loading\":_vm.loading,\"opened-menu\":_vm.openedMenu,\"settings\":_vm.settings,\"show-config\":_vm.showConfig,\"sub-admins-groups\":_vm.subAdminsGroups,\"user-actions\":_vm.userActions,\"user\":_vm.user,\"is-dark-theme\":_vm.isDarkTheme},on:{\"update:editing\":function($event){_vm.editing=$event},\"update:openedMenu\":function($event){_vm.openedMenu=$event},\"update:opened-menu\":function($event){_vm.openedMenu=$event}}}):_c('div',{staticClass:\"row row--editable\",class:{\n\t\t'disabled': _vm.loading.delete || _vm.loading.disable,\n\t\t'row--menu-opened': _vm.openedMenu\n\t},attrs:{\"data-id\":_vm.user.id}},[_c('div',{staticClass:\"avatar\",class:{'icon-loading-small': _vm.loading.delete || _vm.loading.disable || _vm.loading.wipe}},[(!_vm.loading.delete && !_vm.loading.disable && !_vm.loading.wipe)?_c('img',{attrs:{\"src\":_vm.generateAvatar(_vm.user.id, _vm.isDarkTheme),\"alt\":\"\",\"height\":\"32\",\"width\":\"32\"}}):_vm._e()]),_vm._v(\" \"),(_vm.user.backendCapabilities.setDisplayName)?_c('div',{staticClass:\"displayName\"},[_c('form',{staticClass:\"displayName\",class:{'icon-loading-small': _vm.loading.displayName},on:{\"submit\":function($event){$event.preventDefault();return _vm.updateDisplayName.apply(null, arguments)}}},[_c('input',{ref:\"displayName\",attrs:{\"id\":'displayName'+_vm.user.id+_vm.rand,\"disabled\":_vm.loading.displayName||_vm.loading.all,\"autocapitalize\":\"off\",\"autocomplete\":\"off\",\"autocorrect\":\"off\",\"spellcheck\":\"false\",\"type\":\"text\"},domProps:{\"value\":_vm.user.displayname}}),_vm._v(\" \"),_c('input',{staticClass:\"icon-confirm\",attrs:{\"type\":\"submit\",\"value\":\"\"}})])]):_c('div',{staticClass:\"name\"},[_vm._v(\"\\n\\t\\t\"+_vm._s(_vm.user.id)+\"\\n\\t\\t\"),_c('div',{staticClass:\"displayName subtitle\"},[_c('div',{directives:[{name:\"tooltip\",rawName:\"v-tooltip\",value:(_vm.user.displayname.length > 20 ? _vm.user.displayname : ''),expression:\"user.displayname.length > 20 ? user.displayname : ''\"}],staticClass:\"cellText\"},[_vm._v(\"\\n\\t\\t\\t\\t\"+_vm._s(_vm.user.displayname)+\"\\n\\t\\t\\t\")])])]),_vm._v(\" \"),(_vm.settings.canChangePassword && _vm.user.backendCapabilities.setPassword)?_c('form',{staticClass:\"password\",class:{'icon-loading-small': _vm.loading.password},on:{\"submit\":function($event){$event.preventDefault();return _vm.updatePassword.apply(null, arguments)}}},[_c('input',{ref:\"password\",attrs:{\"id\":'password'+_vm.user.id+_vm.rand,\"disabled\":_vm.loading.password || _vm.loading.all,\"minlength\":_vm.minPasswordLength,\"maxlength\":\"469\",\"placeholder\":_vm.t('settings', 'Add new password'),\"autocapitalize\":\"off\",\"autocomplete\":\"new-password\",\"autocorrect\":\"off\",\"required\":\"\",\"spellcheck\":\"false\",\"type\":\"password\",\"value\":\"\"}}),_vm._v(\" \"),_c('input',{staticClass:\"icon-confirm\",attrs:{\"type\":\"submit\",\"value\":\"\"}})]):_c('div'),_vm._v(\" \"),_c('form',{staticClass:\"mailAddress\",class:{'icon-loading-small': _vm.loading.mailAddress},on:{\"submit\":function($event){$event.preventDefault();return _vm.updateEmail.apply(null, arguments)}}},[_c('input',{ref:\"mailAddress\",attrs:{\"id\":'mailAddress'+_vm.user.id+_vm.rand,\"disabled\":_vm.loading.mailAddress||_vm.loading.all,\"placeholder\":_vm.t('settings', 'Add new email address'),\"autocapitalize\":\"off\",\"autocomplete\":\"new-password\",\"autocorrect\":\"off\",\"spellcheck\":\"false\",\"type\":\"email\"},domProps:{\"value\":_vm.user.email}}),_vm._v(\" \"),_c('input',{staticClass:\"icon-confirm\",attrs:{\"type\":\"submit\",\"value\":\"\"}})]),_vm._v(\" \"),_c('div',{staticClass:\"groups\",class:{'icon-loading-small': _vm.loading.groups}},[_c('NcMultiselect',{staticClass:\"multiselect-vue\",attrs:{\"close-on-select\":false,\"disabled\":_vm.loading.groups||_vm.loading.all,\"limit\":2,\"multiple\":true,\"options\":_vm.availableGroups,\"placeholder\":_vm.t('settings', 'Add user to group'),\"tag-width\":60,\"taggable\":_vm.settings.isAdmin,\"value\":_vm.userGroups,\"label\":\"name\",\"tag-placeholder\":\"create\",\"track-by\":\"id\"},on:{\"remove\":_vm.removeUserGroup,\"select\":_vm.addUserGroup,\"tag\":_vm.createGroup}},[_c('span',{attrs:{\"slot\":\"noResult\"},slot:\"noResult\"},[_vm._v(_vm._s(_vm.t('settings', 'No results')))])])],1),_vm._v(\" \"),(_vm.subAdminsGroups.length>0 && _vm.settings.isAdmin)?_c('div',{staticClass:\"subadmins\",class:{'icon-loading-small': _vm.loading.subadmins}},[_c('NcMultiselect',{staticClass:\"multiselect-vue\",attrs:{\"close-on-select\":false,\"disabled\":_vm.loading.subadmins||_vm.loading.all,\"limit\":2,\"multiple\":true,\"options\":_vm.subAdminsGroups,\"placeholder\":_vm.t('settings', 'Set user as admin for'),\"tag-width\":60,\"value\":_vm.userSubAdminsGroups,\"label\":\"name\",\"track-by\":\"id\"},on:{\"remove\":_vm.removeUserSubAdmin,\"select\":_vm.addUserSubAdmin}},[_c('span',{attrs:{\"slot\":\"noResult\"},slot:\"noResult\"},[_vm._v(_vm._s(_vm.t('settings', 'No results')))])])],1):_vm._e(),_vm._v(\" \"),_c('div',{directives:[{name:\"tooltip\",rawName:\"v-tooltip.auto\",value:(_vm.usedSpace),expression:\"usedSpace\",modifiers:{\"auto\":true}}],staticClass:\"quota\",class:{'icon-loading-small': _vm.loading.quota}},[_c('NcMultiselect',{staticClass:\"multiselect-vue\",attrs:{\"allow-empty\":false,\"disabled\":_vm.loading.quota||_vm.loading.all,\"options\":_vm.quotaOptions,\"placeholder\":_vm.t('settings', 'Select user quota'),\"taggable\":true,\"value\":_vm.userQuota,\"label\":\"label\",\"tag-placeholder\":\"create\",\"track-by\":\"id\"},on:{\"input\":_vm.setUserQuota,\"tag\":_vm.validateQuota}})],1),_vm._v(\" \"),(_vm.showConfig.showLanguages)?_c('div',{staticClass:\"languages\",class:{'icon-loading-small': _vm.loading.languages}},[_c('NcMultiselect',{staticClass:\"multiselect-vue\",attrs:{\"allow-empty\":false,\"disabled\":_vm.loading.languages||_vm.loading.all,\"options\":_vm.languages,\"placeholder\":_vm.t('settings', 'No language set'),\"value\":_vm.userLanguage,\"group-label\":\"label\",\"group-values\":\"languages\",\"label\":\"name\",\"track-by\":\"code\"},on:{\"input\":_vm.setUserLanguage}})],1):_vm._e(),_vm._v(\" \"),(_vm.showConfig.showStoragePath || _vm.showConfig.showUserBackend)?_c('div',{staticClass:\"storageLocation\"}):_vm._e(),_vm._v(\" \"),(_vm.showConfig.showLastLogin)?_c('div'):_vm._e(),_vm._v(\" \"),_c('div',{staticClass:\"userActions\"},[(!_vm.loading.all)?_c('div',{staticClass:\"toggleUserActions\"},[_c('NcActions',[_c('NcActionButton',{attrs:{\"icon\":\"icon-checkmark\"},on:{\"click\":function($event){_vm.editing = false}}},[_vm._v(\"\\n\\t\\t\\t\\t\\t\"+_vm._s(_vm.t('settings', 'Done'))+\"\\n\\t\\t\\t\\t\")])],1),_vm._v(\" \"),_c('div',{directives:[{name:\"click-outside\",rawName:\"v-click-outside\",value:(_vm.hideMenu),expression:\"hideMenu\"}],staticClass:\"userPopoverMenuWrapper\"},[_c('button',{staticClass:\"icon-more\",on:{\"click\":function($event){$event.preventDefault();return _vm.toggleMenu.apply(null, arguments)}}}),_vm._v(\" \"),_c('div',{staticClass:\"popovermenu\",class:{ 'open': _vm.openedMenu }},[_c('NcPopoverMenu',{attrs:{\"menu\":_vm.userActions}})],1)])],1):_vm._e(),_vm._v(\" \"),_c('div',{staticClass:\"feedback\",style:({opacity: _vm.feedbackMessage !== '' ? 1 : 0})},[_c('div',{staticClass:\"icon-checkmark\"}),_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.feedbackMessage)+\"\\n\\t\\t\")])])])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<!--\n - @copyright Copyright (c) 2018 John Molakvoæ <skjnldsv@protonmail.com>\n -\n - @author John Molakvoæ <skjnldsv@protonmail.com>\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\" class=\"user-list-grid\" @scroll.passive=\"onScroll\">\n\t\t<NcModal v-if=\"showConfig.showNewUserForm\" size=\"small\" @close=\"closeModal\">\n\t\t\t<form id=\"new-user\"\n\t\t\t\t:disabled=\"loading.all\"\n\t\t\t\tclass=\"modal__content\"\n\t\t\t\t@submit.prevent=\"createUser\">\n\t\t\t\t<h2>{{ t('settings','New user') }}</h2>\n\t\t\t\t<input id=\"newusername\"\n\t\t\t\t\tref=\"newusername\"\n\t\t\t\t\tv-model=\"newUser.id\"\n\t\t\t\t\t:disabled=\"settings.newUserGenerateUserID\"\n\t\t\t\t\t:placeholder=\"settings.newUserGenerateUserID\n\t\t\t\t\t\t? t('settings', 'Will be autogenerated')\n\t\t\t\t\t\t: t('settings', 'Username')\"\n\t\t\t\t\tautocapitalize=\"none\"\n\t\t\t\t\tautocomplete=\"off\"\n\t\t\t\t\tautocorrect=\"off\"\n\t\t\t\t\tclass=\"modal__item\"\n\t\t\t\t\tname=\"username\"\n\t\t\t\t\tpattern=\"[a-zA-Z0-9 _\\.@\\-']+\"\n\t\t\t\t\trequired\n\t\t\t\t\ttype=\"text\">\n\t\t\t\t<input id=\"newdisplayname\"\n\t\t\t\t\tv-model=\"newUser.displayName\"\n\t\t\t\t\t:placeholder=\"t('settings', 'Display name')\"\n\t\t\t\t\tautocapitalize=\"none\"\n\t\t\t\t\tautocomplete=\"off\"\n\t\t\t\t\tautocorrect=\"off\"\n\t\t\t\t\tclass=\"modal__item\"\n\t\t\t\t\tname=\"displayname\"\n\t\t\t\t\ttype=\"text\">\n\t\t\t\t<input id=\"newuserpassword\"\n\t\t\t\t\tref=\"newuserpassword\"\n\t\t\t\t\tv-model=\"newUser.password\"\n\t\t\t\t\t:minlength=\"minPasswordLength\"\n\t\t\t\t\t:maxlength=\"469\"\n\t\t\t\t\t:placeholder=\"t('settings', 'Password')\"\n\t\t\t\t\t:required=\"newUser.mailAddress===''\"\n\t\t\t\t\tautocapitalize=\"none\"\n\t\t\t\t\tautocomplete=\"new-password\"\n\t\t\t\t\tautocorrect=\"off\"\n\t\t\t\t\tclass=\"modal__item\"\n\t\t\t\t\tname=\"password\"\n\t\t\t\t\ttype=\"password\">\n\t\t\t\t<input id=\"newemail\"\n\t\t\t\t\tv-model=\"newUser.mailAddress\"\n\t\t\t\t\t:placeholder=\"t('settings', 'Email')\"\n\t\t\t\t\t:required=\"newUser.password==='' || settings.newUserRequireEmail\"\n\t\t\t\t\tautocapitalize=\"none\"\n\t\t\t\t\tautocomplete=\"off\"\n\t\t\t\t\tautocorrect=\"off\"\n\t\t\t\t\tclass=\"modal__item\"\n\t\t\t\t\tname=\"email\"\n\t\t\t\t\ttype=\"email\">\n\t\t\t\t<div class=\"groups modal__item\">\n\t\t\t\t\t<!-- hidden input trick for vanilla html5 form validation -->\n\t\t\t\t\t<input v-if=\"!settings.isAdmin\"\n\t\t\t\t\t\tid=\"newgroups\"\n\t\t\t\t\t\t:class=\"{'icon-loading-small': loading.groups}\"\n\t\t\t\t\t\t:required=\"!settings.isAdmin\"\n\t\t\t\t\t\t:value=\"newUser.groups\"\n\t\t\t\t\t\ttabindex=\"-1\"\n\t\t\t\t\t\ttype=\"text\">\n\t\t\t\t\t<NcMultiselect v-model=\"newUser.groups\"\n\t\t\t\t\t\t:close-on-select=\"false\"\n\t\t\t\t\t\t:disabled=\"loading.groups||loading.all\"\n\t\t\t\t\t\t:multiple=\"true\"\n\t\t\t\t\t\t:options=\"canAddGroups\"\n\t\t\t\t\t\t:placeholder=\"t('settings', 'Add user to group')\"\n\t\t\t\t\t\t:tag-width=\"60\"\n\t\t\t\t\t\t:taggable=\"true\"\n\t\t\t\t\t\tclass=\"multiselect-vue\"\n\t\t\t\t\t\tlabel=\"name\"\n\t\t\t\t\t\ttag-placeholder=\"create\"\n\t\t\t\t\t\ttrack-by=\"id\"\n\t\t\t\t\t\t@tag=\"createGroup\">\n\t\t\t\t\t\t<!-- If user is not admin, he is a subadmin.\n\t\t\t\t\t\t\tSubadmins can't create users outside their groups\n\t\t\t\t\t\t\tTherefore, empty select is forbidden -->\n\t\t\t\t\t\t<span slot=\"noResult\">{{ t('settings', 'No results') }}</span>\n\t\t\t\t\t</NcMultiselect>\n\t\t\t\t</div>\n\t\t\t\t<div v-if=\"subAdminsGroups.length>0 && settings.isAdmin\"\n\t\t\t\t\tclass=\"subadmins modal__item\">\n\t\t\t\t\t<NcMultiselect v-model=\"newUser.subAdminsGroups\"\n\t\t\t\t\t\t:close-on-select=\"false\"\n\t\t\t\t\t\t:multiple=\"true\"\n\t\t\t\t\t\t:options=\"subAdminsGroups\"\n\t\t\t\t\t\t:placeholder=\"t('settings', 'Set user as admin for')\"\n\t\t\t\t\t\t:tag-width=\"60\"\n\t\t\t\t\t\tclass=\"multiselect-vue\"\n\t\t\t\t\t\tlabel=\"name\"\n\t\t\t\t\t\ttrack-by=\"id\">\n\t\t\t\t\t\t<span slot=\"noResult\">{{ t('settings', 'No results') }}</span>\n\t\t\t\t\t</NcMultiselect>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"quota modal__item\">\n\t\t\t\t\t<NcMultiselect v-model=\"newUser.quota\"\n\t\t\t\t\t\t:allow-empty=\"false\"\n\t\t\t\t\t\t:options=\"quotaOptions\"\n\t\t\t\t\t\t:placeholder=\"t('settings', 'Select user quota')\"\n\t\t\t\t\t\t:taggable=\"true\"\n\t\t\t\t\t\tclass=\"multiselect-vue\"\n\t\t\t\t\t\tlabel=\"label\"\n\t\t\t\t\t\ttrack-by=\"id\"\n\t\t\t\t\t\t@tag=\"validateQuota\" />\n\t\t\t\t</div>\n\t\t\t\t<div v-if=\"showConfig.showLanguages\" class=\"languages modal__item\">\n\t\t\t\t\t<NcMultiselect v-model=\"newUser.language\"\n\t\t\t\t\t\t:allow-empty=\"false\"\n\t\t\t\t\t\t:options=\"languages\"\n\t\t\t\t\t\t:placeholder=\"t('settings', 'Default language')\"\n\t\t\t\t\t\tclass=\"multiselect-vue\"\n\t\t\t\t\t\tgroup-label=\"label\"\n\t\t\t\t\t\tgroup-values=\"languages\"\n\t\t\t\t\t\tlabel=\"name\"\n\t\t\t\t\t\ttrack-by=\"code\" />\n\t\t\t\t</div>\n\t\t\t\t<div v-if=\"showConfig.showStoragePath\" class=\"storageLocation\" />\n\t\t\t\t<div v-if=\"showConfig.showUserBackend\" class=\"userBackend\" />\n\t\t\t\t<div v-if=\"showConfig.showLastLogin\" class=\"lastLogin\" />\n\t\t\t\t<div class=\"user-actions\">\n\t\t\t\t\t<NcButton id=\"newsubmit\"\n\t\t\t\t\t\ttype=\"primary\"\n\t\t\t\t\t\tnative-type=\"submit\"\n\t\t\t\t\t\tvalue=\"\">\n\t\t\t\t\t\t{{ t('settings', 'Add a new user') }}\n\t\t\t\t\t</NcButton>\n\t\t\t\t</div>\n\t\t\t</form>\n\t\t</NcModal>\n\t\t<div id=\"grid-header\"\n\t\t\t:class=\"{'sticky': scrolled && !showConfig.showNewUserForm}\"\n\t\t\tclass=\"row\">\n\t\t\t<div id=\"headerAvatar\" class=\"avatar\" />\n\t\t\t<div id=\"headerName\" class=\"name\">\n\t\t\t\t<div class=\"subtitle\">\n\t\t\t\t\t<strong>\n\t\t\t\t\t\t{{ t('settings', 'Display name') }}\n\t\t\t\t\t</strong>\n\t\t\t\t</div>\n\t\t\t\t{{ t('settings', 'Username') }}\n\t\t\t</div>\n\t\t\t<div id=\"headerPassword\" class=\"password\">\n\t\t\t\t{{ t('settings', 'Password') }}\n\t\t\t</div>\n\t\t\t<div id=\"headerAddress\" class=\"mailAddress\">\n\t\t\t\t{{ t('settings', 'Email') }}\n\t\t\t</div>\n\t\t\t<div id=\"headerGroups\" class=\"groups\">\n\t\t\t\t{{ t('settings', 'Groups') }}\n\t\t\t</div>\n\t\t\t<div v-if=\"subAdminsGroups.length>0 && settings.isAdmin\"\n\t\t\t\tid=\"headerSubAdmins\"\n\t\t\t\tclass=\"subadmins\">\n\t\t\t\t{{ t('settings', 'Group admin for') }}\n\t\t\t</div>\n\t\t\t<div id=\"headerQuota\" class=\"quota\">\n\t\t\t\t{{ t('settings', 'Quota') }}\n\t\t\t</div>\n\t\t\t<div v-if=\"showConfig.showLanguages\"\n\t\t\t\tid=\"headerLanguages\"\n\t\t\t\tclass=\"languages\">\n\t\t\t\t{{ t('settings', 'Language') }}\n\t\t\t</div>\n\n\t\t\t<div v-if=\"showConfig.showUserBackend || showConfig.showStoragePath\"\n\t\t\t\tclass=\"headerUserBackend userBackend\">\n\t\t\t\t<div v-if=\"showConfig.showUserBackend\" class=\"userBackend\">\n\t\t\t\t\t{{ t('settings', 'User backend') }}\n\t\t\t\t</div>\n\t\t\t\t<div v-if=\"showConfig.showStoragePath\"\n\t\t\t\t\tclass=\"subtitle storageLocation\">\n\t\t\t\t\t{{ t('settings', 'Storage location') }}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div v-if=\"showConfig.showLastLogin\"\n\t\t\t\tclass=\"headerLastLogin lastLogin\">\n\t\t\t\t{{ t('settings', 'Last login') }}\n\t\t\t</div>\n\n\t\t\t<div class=\"userActions\" />\n\t\t</div>\n\n\t\t<user-row v-for=\"user in filteredUsers\"\n\t\t\t:key=\"user.id\"\n\t\t\t:external-actions=\"externalActions\"\n\t\t\t:groups=\"groups\"\n\t\t\t:languages=\"languages\"\n\t\t\t:quota-options=\"quotaOptions\"\n\t\t\t:settings=\"settings\"\n\t\t\t:show-config=\"showConfig\"\n\t\t\t:sub-admins-groups=\"subAdminsGroups\"\n\t\t\t:user=\"user\"\n\t\t\t:is-dark-theme=\"isDarkTheme\" />\n\t\t<InfiniteLoading ref=\"infiniteLoading\" @infinite=\"infiniteHandler\">\n\t\t\t<div slot=\"spinner\">\n\t\t\t\t<div class=\"users-icon-loading icon-loading\" />\n\t\t\t</div>\n\t\t\t<div slot=\"no-more\">\n\t\t\t\t<div class=\"users-list-end\" />\n\t\t\t</div>\n\t\t\t<div slot=\"no-results\">\n\t\t\t\t<div id=\"emptycontent\">\n\t\t\t\t\t<div class=\"icon-contacts-dark\" />\n\t\t\t\t\t<h2>{{ t('settings', 'No users in here') }}</h2>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</InfiniteLoading>\n\t</div>\n</template>\n\n<script>\nimport { subscribe, unsubscribe } from '@nextcloud/event-bus'\nimport InfiniteLoading from 'vue-infinite-loading'\nimport Vue from 'vue'\nimport NcModal from '@nextcloud/vue/dist/Components/NcModal'\nimport NcButton from '@nextcloud/vue/dist/Components/NcButton'\nimport NcMultiselect from '@nextcloud/vue/dist/Components/NcMultiselect'\n\nimport userRow from './UserList/UserRow'\n\nconst unlimitedQuota = {\n\tid: 'none',\n\tlabel: t('settings', 'Unlimited'),\n}\nconst defaultQuota = {\n\tid: 'default',\n\tlabel: t('settings', 'Default quota'),\n}\nconst newUser = {\n\tid: '',\n\tdisplayName: '',\n\tpassword: '',\n\tmailAddress: '',\n\tgroups: [],\n\tsubAdminsGroups: [],\n\tquota: defaultQuota,\n\tlanguage: {\n\t\tcode: 'en',\n\t\tname: t('settings', 'Default language'),\n\t},\n}\n\nexport default {\n\tname: 'UserList',\n\tcomponents: {\n\t\tNcModal,\n\t\tuserRow,\n\t\tNcMultiselect,\n\t\tInfiniteLoading,\n\t\tNcButton,\n\t},\n\tprops: {\n\t\tusers: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\t\tshowConfig: {\n\t\t\ttype: Object,\n\t\t\trequired: true,\n\t\t},\n\t\tselectedGroup: {\n\t\t\ttype: String,\n\t\t\tdefault: null,\n\t\t},\n\t\texternalActions: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tunlimitedQuota,\n\t\t\tdefaultQuota,\n\t\t\tloading: {\n\t\t\t\tall: false,\n\t\t\t\tgroups: false,\n\t\t\t},\n\t\t\tscrolled: false,\n\t\t\tsearchQuery: '',\n\t\t\tnewUser: Object.assign({}, newUser),\n\t\t}\n\t},\n\tcomputed: {\n\t\tsettings() {\n\t\t\treturn this.$store.getters.getServerData\n\t\t},\n\t\tselectedGroupDecoded() {\n\t\t\treturn decodeURIComponent(this.selectedGroup)\n\t\t},\n\t\tfilteredUsers() {\n\t\t\tif (this.selectedGroup === 'disabled') {\n\t\t\t\treturn this.users.filter(user => user.enabled === false)\n\t\t\t}\n\t\t\tif (!this.settings.isAdmin) {\n\t\t\t\t// we don't want subadmins to edit themselves\n\t\t\t\treturn this.users.filter(user => user.enabled !== false)\n\t\t\t}\n\t\t\treturn this.users.filter(user => user.enabled !== false)\n\t\t},\n\t\tgroups() {\n\t\t\t// data provided php side + remove the disabled group\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\tcanAddGroups() {\n\t\t\t// disabled if no permission to add new users to group\n\t\t\treturn this.groups.map(group => {\n\t\t\t\t// clone object because we don't want\n\t\t\t\t// to edit the original groups\n\t\t\t\tgroup = Object.assign({}, group)\n\t\t\t\tgroup.$isDisabled = group.canAdd === false\n\t\t\t\treturn group\n\t\t\t})\n\t\t},\n\t\tsubAdminsGroups() {\n\t\t\t// data provided php side\n\t\t\treturn this.$store.getters.getSubadminGroups\n\t\t},\n\t\tquotaOptions() {\n\t\t\t// convert the preset array into objects\n\t\t\tconst quotaPreset = this.settings.quotaPreset.reduce((acc, cur) => acc.concat({\n\t\t\t\tid: cur,\n\t\t\t\tlabel: cur,\n\t\t\t}), [])\n\t\t\t// add default presets\n\t\t\tif (this.settings.allowUnlimitedQuota) {\n\t\t\t\tquotaPreset.unshift(this.unlimitedQuota)\n\t\t\t}\n\t\t\tquotaPreset.unshift(this.defaultQuota)\n\t\t\treturn quotaPreset\n\t\t},\n\t\tminPasswordLength() {\n\t\t\treturn this.$store.getters.getPasswordPolicyMinLength\n\t\t},\n\t\tusersOffset() {\n\t\t\treturn this.$store.getters.getUsersOffset\n\t\t},\n\t\tusersLimit() {\n\t\t\treturn this.$store.getters.getUsersLimit\n\t\t},\n\t\tusersCount() {\n\t\t\treturn this.users.length\n\t\t},\n\n\t\t/* LANGUAGES */\n\t\tlanguages() {\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\tlabel: t('settings', 'Common languages'),\n\t\t\t\t\tlanguages: this.settings.languages.commonLanguages,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tlabel: t('settings', 'Other languages'),\n\t\t\t\t\tlanguages: this.settings.languages.otherLanguages,\n\t\t\t\t},\n\t\t\t]\n\t\t},\n\t\tisDarkTheme() {\n\t\t\treturn window.getComputedStyle(this.$el)\n\t\t\t\t.getPropertyValue('--background-invert-if-dark') === 'invert(100%)'\n\t\t},\n\t},\n\twatch: {\n\t\t// watch url change and group select\n\t\tselectedGroup(val, old) {\n\t\t\t// if selected is the disabled group but it's empty\n\t\t\tthis.redirectIfDisabled()\n\t\t\tthis.$store.commit('resetUsers')\n\t\t\tthis.$refs.infiniteLoading.stateChanger.reset()\n\t\t\tthis.setNewUserDefaultGroup(val)\n\t\t},\n\n\t\t// make sure the infiniteLoading state is changed if we manually\n\t\t// add/remove data from the store\n\t\tusersCount(val, old) {\n\t\t\t// deleting the last user, reset the list\n\t\t\tif (val === 0 && old === 1) {\n\t\t\t\tthis.$refs.infiniteLoading.stateChanger.reset()\n\t\t\t\t// adding the first user, warn the infiniteLoader that\n\t\t\t\t// the list is not empty anymore (we don't fetch the newly\n\t\t\t\t// added user as we already have all the info we need)\n\t\t\t} else if (val === 1 && old === 0) {\n\t\t\t\tthis.$refs.infiniteLoading.stateChanger.loaded()\n\t\t\t}\n\t\t},\n\t},\n\n\tmounted() {\n\t\tif (!this.settings.canChangePassword) {\n\t\t\tOC.Notification.showTemporary(t('settings', 'Password change is disabled because the master key is disabled'))\n\t\t}\n\n\t\t/**\n\t\t * Reset and init new user form\n\t\t */\n\t\tthis.resetForm()\n\n\t\t/**\n\t\t * Register search\n\t\t */\n\t\tsubscribe('nextcloud:unified-search.search', this.search)\n\t\tsubscribe('nextcloud:unified-search.reset', this.resetSearch)\n\n\t\t/**\n\t\t * If disabled group but empty, redirect\n\t\t */\n\t\tthis.redirectIfDisabled()\n\t},\n\tbeforeDestroy() {\n\t\tunsubscribe('nextcloud:unified-search.search', this.search)\n\t\tunsubscribe('nextcloud:unified-search.reset', this.resetSearch)\n\t},\n\n\tmethods: {\n\t\tonScroll(event) {\n\t\t\tthis.scrolled = event.target.scrollTo > 0\n\t\t},\n\n\t\t/**\n\t\t * Validate quota string to make sure it's a valid human file size\n\t\t *\n\t\t * @param {string} quota Quota in readable format '5 GB'\n\t\t * @return {object}\n\t\t */\n\t\tvalidateQuota(quota) {\n\t\t\t// only used for new presets sent through @Tag\n\t\t\tconst validQuota = OC.Util.computerFileSize(quota)\n\t\t\tif (validQuota !== null && validQuota >= 0) {\n\t\t\t\t// unify format output\n\t\t\t\tquota = OC.Util.humanFileSize(OC.Util.computerFileSize(quota))\n\t\t\t\tthis.newUser.quota = { id: quota, label: quota }\n\t\t\t\treturn this.newUser.quota\n\t\t\t}\n\t\t\t// Default is unlimited\n\t\t\tthis.newUser.quota = this.quotaOptions[0]\n\t\t\treturn this.quotaOptions[0]\n\t\t},\n\n\t\tinfiniteHandler($state) {\n\t\t\tthis.$store.dispatch('getUsers', {\n\t\t\t\toffset: this.usersOffset,\n\t\t\t\tlimit: this.usersLimit,\n\t\t\t\tgroup: this.selectedGroup !== 'disabled' ? this.selectedGroup : '',\n\t\t\t\tsearch: this.searchQuery,\n\t\t\t})\n\t\t\t\t.then((usersCount) => {\n\t\t\t\t\tif (usersCount > 0) {\n\t\t\t\t\t\t$state.loaded()\n\t\t\t\t\t}\n\t\t\t\t\tif (usersCount < this.usersLimit) {\n\t\t\t\t\t\t$state.complete()\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t},\n\n\t\t/* SEARCH */\n\t\tsearch({ query }) {\n\t\t\tthis.searchQuery = query\n\t\t\tthis.$store.commit('resetUsers')\n\t\t\tthis.$refs.infiniteLoading.stateChanger.reset()\n\t\t},\n\t\tresetSearch() {\n\t\t\tthis.search({ query: '' })\n\t\t},\n\n\t\tresetForm() {\n\t\t\t// revert form to original state\n\t\t\tthis.newUser = Object.assign({}, newUser)\n\n\t\t\t/**\n\t\t\t * Init default language from server data. The use of this.settings\n\t\t\t * requires a computed variable, which break the v-model binding of the form,\n\t\t\t * this is a much easier solution than getter and setter on a computed var\n\t\t\t */\n\t\t\tif (this.settings.defaultLanguage) {\n\t\t\t\tVue.set(this.newUser.language, 'code', this.settings.defaultLanguage)\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * In case the user directly loaded the user list within a group\n\t\t\t * the watch won't be triggered. We need to initialize it.\n\t\t\t */\n\t\t\tthis.setNewUserDefaultGroup(this.selectedGroup)\n\n\t\t\tthis.loading.all = false\n\t\t},\n\t\tcreateUser() {\n\t\t\tthis.loading.all = true\n\t\t\tthis.$store.dispatch('addUser', {\n\t\t\t\tuserid: this.newUser.id,\n\t\t\t\tpassword: this.newUser.password,\n\t\t\t\tdisplayName: this.newUser.displayName,\n\t\t\t\temail: this.newUser.mailAddress,\n\t\t\t\tgroups: this.newUser.groups.map(group => group.id),\n\t\t\t\tsubadmin: this.newUser.subAdminsGroups.map(group => group.id),\n\t\t\t\tquota: this.newUser.quota.id,\n\t\t\t\tlanguage: this.newUser.language.code,\n\t\t\t})\n\t\t\t\t.then(() => {\n\t\t\t\t\tthis.resetForm()\n\t\t\t\t\tthis.$refs.newusername.focus()\n\t\t\t\t\tthis.closeModal()\n\t\t\t\t})\n\t\t\t\t.catch((error) => {\n\t\t\t\t\tthis.loading.all = false\n\t\t\t\t\tif (error.response && error.response.data && error.response.data.ocs && error.response.data.ocs.meta) {\n\t\t\t\t\t\tconst statuscode = error.response.data.ocs.meta.statuscode\n\t\t\t\t\t\tif (statuscode === 102) {\n\t\t\t\t\t\t\t// wrong username\n\t\t\t\t\t\t\tthis.$refs.newusername.focus()\n\t\t\t\t\t\t} else if (statuscode === 107) {\n\t\t\t\t\t\t\t// wrong password\n\t\t\t\t\t\t\tthis.$refs.newuserpassword.focus()\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t},\n\t\tsetNewUserDefaultGroup(value) {\n\t\t\tif (value && value.length > 0) {\n\t\t\t\t// setting new user default group to the current selected one\n\t\t\t\tconst currentGroup = this.groups.find(group => group.id === value)\n\t\t\t\tif (currentGroup) {\n\t\t\t\t\tthis.newUser.groups = [currentGroup]\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t}\n\t\t\t// fallback, empty selected group\n\t\t\tthis.newUser.groups = []\n\t\t},\n\n\t\t/**\n\t\t * Create a new group\n\t\t *\n\t\t * @param {string} gid Group id\n\t\t * @return {Promise}\n\t\t */\n\t\tcreateGroup(gid) {\n\t\t\tthis.loading.groups = true\n\t\t\tthis.$store.dispatch('addGroup', gid)\n\t\t\t\t.then((group) => {\n\t\t\t\t\tthis.newUser.groups.push(this.groups.find(group => group.id === gid))\n\t\t\t\t\tthis.loading.groups = false\n\t\t\t\t})\n\t\t\t\t.catch(() => {\n\t\t\t\t\tthis.loading.groups = false\n\t\t\t\t})\n\t\t\treturn this.$store.getters.getGroups[this.groups.length]\n\t\t},\n\n\t\t/**\n\t\t * If the selected group is the disabled group but the count is 0\n\t\t * redirect to the all users page.\n\t\t * we only check for 0 because we don't have the count on ldap\n\t\t * and we therefore set the usercount to -1 in this specific case\n\t\t */\n\t\tredirectIfDisabled() {\n\t\t\tconst allGroups = this.$store.getters.getGroups\n\t\t\tif (this.selectedGroup === 'disabled'\n\t\t\t\t\t\t&& allGroups.findIndex(group => group.id === 'disabled' && group.usercount === 0) > -1) {\n\t\t\t\t// disabled group is empty, redirection to all users\n\t\t\t\tthis.$router.push({ name: 'users' })\n\t\t\t\tthis.$refs.infiniteLoading.stateChanger.reset()\n\t\t\t}\n\t\t},\n\t\tcloseModal() {\n\t\t\t// eslint-disable-next-line vue/no-mutating-props\n\t\t\tthis.showConfig.showNewUserForm = false\n\t\t},\n\t},\n}\n</script>\n<style scoped>\n\t.modal-wrapper {\n\t\tmargin: 2vh 0;\n\t\talign-items: flex-start;\n\t}\n\t.modal__content {\n\t\tdisplay: flex;\n\t\tpadding: 20px;\n\t\tflex-direction: column;\n\t\talign-items: center;\n\t\ttext-align: center;\n\t}\n\t.modal__item {\n\t\tmargin-bottom: 16px;\n\t\twidth: 100%;\n\t}\n\t.modal__item:not(:focus):not(:active) {\n\t\tborder-color: var(--color-border-dark);\n\t}\n\t.modal__item::v-deep .multiselect {\n\t\twidth: 100%;\n\t}\n\t.user-actions {\n\t\tmargin-top: 20px;\n\t}\n\t.modal__content::v-deep .multiselect__single {\n\t\ttext-align: left;\n\t\tbox-sizing: border-box;\n\t}\n\t.modal__content::v-deep .multiselect__content-wrapper {\n\t\tbox-sizing: border-box;\n\t}\n\t.row::v-deep .multiselect__single {\n\t\tz-index: auto !important;\n\t}\n\n\t/* fake input for groups validation */\n\tinput#newgroups {\n\t\tposition: absolute;\n\t\topacity: 0;\n\t\t/* The \"hidden\" input is behind the Multiselect, so in general it does\n\t\t * not receives clicks. However, with Firefox, after the validation\n\t\t * fails, it will receive the first click done on it, so its width needs\n\t\t * to be set to 0 to prevent that (\"pointer-events: none\" does not\n\t\t * prevent it). */\n\t\twidth: 0;\n\t}\n</style>\n","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./UserList.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!./UserList.vue?vue&type=script&lang=js&\"","\n import API from \"!../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./UserList.vue?vue&type=style&index=0&id=09961579&scoped=true&lang=css&\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./UserList.vue?vue&type=style&index=0&id=09961579&scoped=true&lang=css&\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./UserList.vue?vue&type=template&id=09961579&scoped=true&\"\nimport script from \"./UserList.vue?vue&type=script&lang=js&\"\nexport * from \"./UserList.vue?vue&type=script&lang=js&\"\nimport style0 from \"./UserList.vue?vue&type=style&index=0&id=09961579&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 \"09961579\",\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:\"user-list-grid\",attrs:{\"id\":\"app-content\"},on:{\"&scroll\":function($event){return _vm.onScroll.apply(null, arguments)}}},[(_vm.showConfig.showNewUserForm)?_c('NcModal',{attrs:{\"size\":\"small\"},on:{\"close\":_vm.closeModal}},[_c('form',{staticClass:\"modal__content\",attrs:{\"id\":\"new-user\",\"disabled\":_vm.loading.all},on:{\"submit\":function($event){$event.preventDefault();return _vm.createUser.apply(null, arguments)}}},[_c('h2',[_vm._v(_vm._s(_vm.t('settings','New user')))]),_vm._v(\" \"),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.newUser.id),expression:\"newUser.id\"}],ref:\"newusername\",staticClass:\"modal__item\",attrs:{\"id\":\"newusername\",\"disabled\":_vm.settings.newUserGenerateUserID,\"placeholder\":_vm.settings.newUserGenerateUserID\n\t\t\t\t\t? _vm.t('settings', 'Will be autogenerated')\n\t\t\t\t\t: _vm.t('settings', 'Username'),\"autocapitalize\":\"none\",\"autocomplete\":\"off\",\"autocorrect\":\"off\",\"name\":\"username\",\"pattern\":\"[a-zA-Z0-9 _\\\\.@\\\\-']+\",\"required\":\"\",\"type\":\"text\"},domProps:{\"value\":(_vm.newUser.id)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.$set(_vm.newUser, \"id\", $event.target.value)}}}),_vm._v(\" \"),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.newUser.displayName),expression:\"newUser.displayName\"}],staticClass:\"modal__item\",attrs:{\"id\":\"newdisplayname\",\"placeholder\":_vm.t('settings', 'Display name'),\"autocapitalize\":\"none\",\"autocomplete\":\"off\",\"autocorrect\":\"off\",\"name\":\"displayname\",\"type\":\"text\"},domProps:{\"value\":(_vm.newUser.displayName)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.$set(_vm.newUser, \"displayName\", $event.target.value)}}}),_vm._v(\" \"),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.newUser.password),expression:\"newUser.password\"}],ref:\"newuserpassword\",staticClass:\"modal__item\",attrs:{\"id\":\"newuserpassword\",\"minlength\":_vm.minPasswordLength,\"maxlength\":469,\"placeholder\":_vm.t('settings', 'Password'),\"required\":_vm.newUser.mailAddress==='',\"autocapitalize\":\"none\",\"autocomplete\":\"new-password\",\"autocorrect\":\"off\",\"name\":\"password\",\"type\":\"password\"},domProps:{\"value\":(_vm.newUser.password)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.$set(_vm.newUser, \"password\", $event.target.value)}}}),_vm._v(\" \"),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.newUser.mailAddress),expression:\"newUser.mailAddress\"}],staticClass:\"modal__item\",attrs:{\"id\":\"newemail\",\"placeholder\":_vm.t('settings', 'Email'),\"required\":_vm.newUser.password==='' || _vm.settings.newUserRequireEmail,\"autocapitalize\":\"none\",\"autocomplete\":\"off\",\"autocorrect\":\"off\",\"name\":\"email\",\"type\":\"email\"},domProps:{\"value\":(_vm.newUser.mailAddress)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.$set(_vm.newUser, \"mailAddress\", $event.target.value)}}}),_vm._v(\" \"),_c('div',{staticClass:\"groups modal__item\"},[(!_vm.settings.isAdmin)?_c('input',{class:{'icon-loading-small': _vm.loading.groups},attrs:{\"id\":\"newgroups\",\"required\":!_vm.settings.isAdmin,\"tabindex\":\"-1\",\"type\":\"text\"},domProps:{\"value\":_vm.newUser.groups}}):_vm._e(),_vm._v(\" \"),_c('NcMultiselect',{staticClass:\"multiselect-vue\",attrs:{\"close-on-select\":false,\"disabled\":_vm.loading.groups||_vm.loading.all,\"multiple\":true,\"options\":_vm.canAddGroups,\"placeholder\":_vm.t('settings', 'Add user to group'),\"tag-width\":60,\"taggable\":true,\"label\":\"name\",\"tag-placeholder\":\"create\",\"track-by\":\"id\"},on:{\"tag\":_vm.createGroup},model:{value:(_vm.newUser.groups),callback:function ($$v) {_vm.$set(_vm.newUser, \"groups\", $$v)},expression:\"newUser.groups\"}},[_c('span',{attrs:{\"slot\":\"noResult\"},slot:\"noResult\"},[_vm._v(_vm._s(_vm.t('settings', 'No results')))])])],1),_vm._v(\" \"),(_vm.subAdminsGroups.length>0 && _vm.settings.isAdmin)?_c('div',{staticClass:\"subadmins modal__item\"},[_c('NcMultiselect',{staticClass:\"multiselect-vue\",attrs:{\"close-on-select\":false,\"multiple\":true,\"options\":_vm.subAdminsGroups,\"placeholder\":_vm.t('settings', 'Set user as admin for'),\"tag-width\":60,\"label\":\"name\",\"track-by\":\"id\"},model:{value:(_vm.newUser.subAdminsGroups),callback:function ($$v) {_vm.$set(_vm.newUser, \"subAdminsGroups\", $$v)},expression:\"newUser.subAdminsGroups\"}},[_c('span',{attrs:{\"slot\":\"noResult\"},slot:\"noResult\"},[_vm._v(_vm._s(_vm.t('settings', 'No results')))])])],1):_vm._e(),_vm._v(\" \"),_c('div',{staticClass:\"quota modal__item\"},[_c('NcMultiselect',{staticClass:\"multiselect-vue\",attrs:{\"allow-empty\":false,\"options\":_vm.quotaOptions,\"placeholder\":_vm.t('settings', 'Select user quota'),\"taggable\":true,\"label\":\"label\",\"track-by\":\"id\"},on:{\"tag\":_vm.validateQuota},model:{value:(_vm.newUser.quota),callback:function ($$v) {_vm.$set(_vm.newUser, \"quota\", $$v)},expression:\"newUser.quota\"}})],1),_vm._v(\" \"),(_vm.showConfig.showLanguages)?_c('div',{staticClass:\"languages modal__item\"},[_c('NcMultiselect',{staticClass:\"multiselect-vue\",attrs:{\"allow-empty\":false,\"options\":_vm.languages,\"placeholder\":_vm.t('settings', 'Default language'),\"group-label\":\"label\",\"group-values\":\"languages\",\"label\":\"name\",\"track-by\":\"code\"},model:{value:(_vm.newUser.language),callback:function ($$v) {_vm.$set(_vm.newUser, \"language\", $$v)},expression:\"newUser.language\"}})],1):_vm._e(),_vm._v(\" \"),(_vm.showConfig.showStoragePath)?_c('div',{staticClass:\"storageLocation\"}):_vm._e(),_vm._v(\" \"),(_vm.showConfig.showUserBackend)?_c('div',{staticClass:\"userBackend\"}):_vm._e(),_vm._v(\" \"),(_vm.showConfig.showLastLogin)?_c('div',{staticClass:\"lastLogin\"}):_vm._e(),_vm._v(\" \"),_c('div',{staticClass:\"user-actions\"},[_c('NcButton',{attrs:{\"id\":\"newsubmit\",\"type\":\"primary\",\"native-type\":\"submit\",\"value\":\"\"}},[_vm._v(\"\\n\\t\\t\\t\\t\\t\"+_vm._s(_vm.t('settings', 'Add a new user'))+\"\\n\\t\\t\\t\\t\")])],1)])]):_vm._e(),_vm._v(\" \"),_c('div',{staticClass:\"row\",class:{'sticky': _vm.scrolled && !_vm.showConfig.showNewUserForm},attrs:{\"id\":\"grid-header\"}},[_c('div',{staticClass:\"avatar\",attrs:{\"id\":\"headerAvatar\"}}),_vm._v(\" \"),_c('div',{staticClass:\"name\",attrs:{\"id\":\"headerName\"}},[_c('div',{staticClass:\"subtitle\"},[_c('strong',[_vm._v(\"\\n\\t\\t\\t\\t\\t\"+_vm._s(_vm.t('settings', 'Display name'))+\"\\n\\t\\t\\t\\t\")])]),_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.t('settings', 'Username'))+\"\\n\\t\\t\")]),_vm._v(\" \"),_c('div',{staticClass:\"password\",attrs:{\"id\":\"headerPassword\"}},[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.t('settings', 'Password'))+\"\\n\\t\\t\")]),_vm._v(\" \"),_c('div',{staticClass:\"mailAddress\",attrs:{\"id\":\"headerAddress\"}},[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.t('settings', 'Email'))+\"\\n\\t\\t\")]),_vm._v(\" \"),_c('div',{staticClass:\"groups\",attrs:{\"id\":\"headerGroups\"}},[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.t('settings', 'Groups'))+\"\\n\\t\\t\")]),_vm._v(\" \"),(_vm.subAdminsGroups.length>0 && _vm.settings.isAdmin)?_c('div',{staticClass:\"subadmins\",attrs:{\"id\":\"headerSubAdmins\"}},[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.t('settings', 'Group admin for'))+\"\\n\\t\\t\")]):_vm._e(),_vm._v(\" \"),_c('div',{staticClass:\"quota\",attrs:{\"id\":\"headerQuota\"}},[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.t('settings', 'Quota'))+\"\\n\\t\\t\")]),_vm._v(\" \"),(_vm.showConfig.showLanguages)?_c('div',{staticClass:\"languages\",attrs:{\"id\":\"headerLanguages\"}},[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.t('settings', 'Language'))+\"\\n\\t\\t\")]):_vm._e(),_vm._v(\" \"),(_vm.showConfig.showUserBackend || _vm.showConfig.showStoragePath)?_c('div',{staticClass:\"headerUserBackend userBackend\"},[(_vm.showConfig.showUserBackend)?_c('div',{staticClass:\"userBackend\"},[_vm._v(\"\\n\\t\\t\\t\\t\"+_vm._s(_vm.t('settings', 'User backend'))+\"\\n\\t\\t\\t\")]):_vm._e(),_vm._v(\" \"),(_vm.showConfig.showStoragePath)?_c('div',{staticClass:\"subtitle storageLocation\"},[_vm._v(\"\\n\\t\\t\\t\\t\"+_vm._s(_vm.t('settings', 'Storage location'))+\"\\n\\t\\t\\t\")]):_vm._e()]):_vm._e(),_vm._v(\" \"),(_vm.showConfig.showLastLogin)?_c('div',{staticClass:\"headerLastLogin lastLogin\"},[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.t('settings', 'Last login'))+\"\\n\\t\\t\")]):_vm._e(),_vm._v(\" \"),_c('div',{staticClass:\"userActions\"})]),_vm._v(\" \"),_vm._l((_vm.filteredUsers),function(user){return _c('user-row',{key:user.id,attrs:{\"external-actions\":_vm.externalActions,\"groups\":_vm.groups,\"languages\":_vm.languages,\"quota-options\":_vm.quotaOptions,\"settings\":_vm.settings,\"show-config\":_vm.showConfig,\"sub-admins-groups\":_vm.subAdminsGroups,\"user\":user,\"is-dark-theme\":_vm.isDarkTheme}})}),_vm._v(\" \"),_c('InfiniteLoading',{ref:\"infiniteLoading\",on:{\"infinite\":_vm.infiniteHandler}},[_c('div',{attrs:{\"slot\":\"spinner\"},slot:\"spinner\"},[_c('div',{staticClass:\"users-icon-loading icon-loading\"})]),_vm._v(\" \"),_c('div',{attrs:{\"slot\":\"no-more\"},slot:\"no-more\"},[_c('div',{staticClass:\"users-list-end\"})]),_vm._v(\" \"),_c('div',{attrs:{\"slot\":\"no-results\"},slot:\"no-results\"},[_c('div',{attrs:{\"id\":\"emptycontent\"}},[_c('div',{staticClass:\"icon-contacts-dark\"}),_vm._v(\" \"),_c('h2',[_vm._v(_vm._s(_vm.t('settings', 'No users in here')))])])])])],2)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<!--\n - @copyright Copyright (c) 2018 John Molakvoæ <skjnldsv@protonmail.com>\n -\n - @author John Molakvoæ <skjnldsv@protonmail.com>\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<NcContent app-name=\"settings\" :navigation-class=\"{ 'icon-loading': loadingAddGroup }\">\n\t\t<NcAppNavigation>\n\t\t\t<NcAppNavigationNew button-id=\"new-user-button\"\n\t\t\t\t:text=\"t('settings','New user')\"\n\t\t\t\tbutton-class=\"icon-add\"\n\t\t\t\t@click=\"showNewUserMenu\"\n\t\t\t\t@keyup.enter=\"showNewUserMenu\"\n\t\t\t\t@keyup.space=\"showNewUserMenu\" />\n\t\t\t<template #list>\n\t\t\t\t<NcAppNavigationItem id=\"addgroup\"\n\t\t\t\t\tref=\"addGroup\"\n\t\t\t\t\t:edit-placeholder=\"t('settings', 'Enter group name')\"\n\t\t\t\t\t:editable=\"true\"\n\t\t\t\t\t:loading=\"loadingAddGroup\"\n\t\t\t\t\t:title=\"t('settings', 'Add group')\"\n\t\t\t\t\ticon=\"icon-add\"\n\t\t\t\t\t@click=\"showAddGroupForm\"\n\t\t\t\t\t@update:title=\"createGroup\" />\n\t\t\t\t<NcAppNavigationItem id=\"everyone\"\n\t\t\t\t\t:exact=\"true\"\n\t\t\t\t\t:title=\"t('settings', 'Active users')\"\n\t\t\t\t\t:to=\"{ name: 'users' }\"\n\t\t\t\t\ticon=\"icon-contacts-dark\">\n\t\t\t\t\t<NcAppNavigationCounter v-if=\"userCount > 0\" slot=\"counter\">\n\t\t\t\t\t\t{{ userCount }}\n\t\t\t\t\t</NcAppNavigationCounter>\n\t\t\t\t</NcAppNavigationItem>\n\t\t\t\t<NcAppNavigationItem v-if=\"settings.isAdmin\"\n\t\t\t\t\tid=\"admin\"\n\t\t\t\t\t:exact=\"true\"\n\t\t\t\t\t:title=\"t('settings', 'Admins')\"\n\t\t\t\t\t:to=\"{ name: 'group', params: { selectedGroup: 'admin' } }\"\n\t\t\t\t\ticon=\"icon-user-admin\">\n\t\t\t\t\t<NcAppNavigationCounter v-if=\"adminGroupMenu.count\" slot=\"counter\">\n\t\t\t\t\t\t{{ adminGroupMenu.count }}\n\t\t\t\t\t</NcAppNavigationCounter>\n\t\t\t\t</NcAppNavigationItem>\n\n\t\t\t\t<!-- Hide the disabled if none, if we don't have the data (-1) show it -->\n\t\t\t\t<NcAppNavigationItem v-if=\"disabledGroupMenu.usercount > 0 || disabledGroupMenu.usercount === -1\"\n\t\t\t\t\tid=\"disabled\"\n\t\t\t\t\t:exact=\"true\"\n\t\t\t\t\t:title=\"t('settings', 'Disabled users')\"\n\t\t\t\t\t:to=\"{ name: 'group', params: { selectedGroup: 'disabled' } }\"\n\t\t\t\t\ticon=\"icon-disabled-users\">\n\t\t\t\t\t<NcAppNavigationCounter v-if=\"disabledGroupMenu.usercount > 0\" slot=\"counter\">\n\t\t\t\t\t\t{{ disabledGroupMenu.usercount }}\n\t\t\t\t\t</NcAppNavigationCounter>\n\t\t\t\t</NcAppNavigationItem>\n\n\t\t\t\t<NcAppNavigationCaption v-if=\"groupList.length > 0\" :title=\"t('settings', 'Groups')\" />\n\t\t\t\t<GroupListItem v-for=\"group in groupList\"\n\t\t\t\t\t:id=\"group.id\"\n\t\t\t\t\t:key=\"group.id\"\n\t\t\t\t\t:title=\"group.title\"\n\t\t\t\t\t:count=\"group.count\" />\n\t\t\t</template>\n\t\t\t<template #footer>\n\t\t\t\t<NcAppNavigationSettings>\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<p>{{ t('settings', 'Default quota:') }}</p>\n\t\t\t\t\t\t<NcMultiselect :value=\"defaultQuota\"\n\t\t\t\t\t\t\t:options=\"quotaOptions\"\n\t\t\t\t\t\t\ttag-placeholder=\"create\"\n\t\t\t\t\t\t\t:placeholder=\"t('settings', 'Select default quota')\"\n\t\t\t\t\t\t\tlabel=\"label\"\n\t\t\t\t\t\t\ttrack-by=\"id\"\n\t\t\t\t\t\t\t:allow-empty=\"false\"\n\t\t\t\t\t\t\t:taggable=\"true\"\n\t\t\t\t\t\t\t@tag=\"validateQuota\"\n\t\t\t\t\t\t\t@input=\"setDefaultQuota\" />\n\t\t\t\t\t</div>\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<input id=\"showLanguages\"\n\t\t\t\t\t\t\tv-model=\"showLanguages\"\n\t\t\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\t\t\tclass=\"checkbox\">\n\t\t\t\t\t\t<label for=\"showLanguages\">{{ t('settings', 'Show Languages') }}</label>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<input id=\"showLastLogin\"\n\t\t\t\t\t\t\tv-model=\"showLastLogin\"\n\t\t\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\t\t\tclass=\"checkbox\">\n\t\t\t\t\t\t<label for=\"showLastLogin\">{{ t('settings', 'Show last login') }}</label>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<input id=\"showUserBackend\"\n\t\t\t\t\t\t\tv-model=\"showUserBackend\"\n\t\t\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\t\t\tclass=\"checkbox\">\n\t\t\t\t\t\t<label for=\"showUserBackend\">{{ t('settings', 'Show user backend') }}</label>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<input id=\"showStoragePath\"\n\t\t\t\t\t\t\tv-model=\"showStoragePath\"\n\t\t\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\t\t\tclass=\"checkbox\">\n\t\t\t\t\t\t<label for=\"showStoragePath\">{{ t('settings', 'Show storage path') }}</label>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<input id=\"sendWelcomeMail\"\n\t\t\t\t\t\t\tv-model=\"sendWelcomeMail\"\n\t\t\t\t\t\t\t:disabled=\"loadingSendMail\"\n\t\t\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\t\t\tclass=\"checkbox\">\n\t\t\t\t\t\t<label for=\"sendWelcomeMail\">{{ t('settings', 'Send email to new user') }}</label>\n\t\t\t\t\t</div>\n\t\t\t\t</NcAppNavigationSettings>\n\t\t\t</template>\n\t\t</NcAppNavigation>\n\t\t<NcAppContent>\n\t\t\t<UserList :users=\"users\"\n\t\t\t\t:show-config=\"showConfig\"\n\t\t\t\t:selected-group=\"selectedGroupDecoded\"\n\t\t\t\t:external-actions=\"externalActions\" />\n\t\t</NcAppContent>\n\t</NcContent>\n</template>\n\n<script>\nimport NcAppContent from '@nextcloud/vue/dist/Components/NcAppContent'\nimport NcAppNavigation from '@nextcloud/vue/dist/Components/NcAppNavigation'\nimport NcAppNavigationCaption from '@nextcloud/vue/dist/Components/NcAppNavigationCaption'\nimport NcAppNavigationCounter from '@nextcloud/vue/dist/Components/NcAppNavigationCounter'\nimport NcAppNavigationItem from '@nextcloud/vue/dist/Components/NcAppNavigationItem'\nimport NcAppNavigationNew from '@nextcloud/vue/dist/Components/NcAppNavigationNew'\nimport NcAppNavigationSettings from '@nextcloud/vue/dist/Components/NcAppNavigationSettings'\nimport axios from '@nextcloud/axios'\nimport NcContent from '@nextcloud/vue/dist/Components/NcContent'\nimport { generateUrl } from '@nextcloud/router'\nimport NcMultiselect from '@nextcloud/vue/dist/Components/NcMultiselect'\nimport Vue from 'vue'\nimport VueLocalStorage from 'vue-localstorage'\n\nimport GroupListItem from '../components/GroupListItem'\nimport UserList from '../components/UserList'\n\nVue.use(VueLocalStorage)\n\nexport default {\n\tname: 'Users',\n\tcomponents: {\n\t\tNcAppContent,\n\t\tNcAppNavigation,\n\t\tNcAppNavigationCaption,\n\t\tNcAppNavigationCounter,\n\t\tNcAppNavigationItem,\n\t\tNcAppNavigationNew,\n\t\tNcAppNavigationSettings,\n\t\tNcContent,\n\t\tGroupListItem,\n\t\tNcMultiselect,\n\t\tUserList,\n\t},\n\tprops: {\n\t\tselectedGroup: {\n\t\t\ttype: String,\n\t\t\tdefault: null,\n\t\t},\n\t},\n\tdata() {\n\t\treturn {\n\t\t\t// default quota is set to unlimited\n\t\t\tunlimitedQuota: { id: 'none', label: t('settings', 'Unlimited') },\n\t\t\t// temporary value used for multiselect change\n\t\t\tselectedQuota: false,\n\t\t\texternalActions: [],\n\t\t\tloadingAddGroup: false,\n\t\t\tloadingSendMail: false,\n\t\t\tshowConfig: {\n\t\t\t\tshowStoragePath: false,\n\t\t\t\tshowUserBackend: false,\n\t\t\t\tshowLastLogin: false,\n\t\t\t\tshowNewUserForm: false,\n\t\t\t\tshowLanguages: false,\n\t\t\t},\n\t\t}\n\t},\n\tcomputed: {\n\t\tselectedGroupDecoded() {\n\t\t\treturn this.selectedGroup ? decodeURIComponent(this.selectedGroup) : null\n\t\t},\n\t\tusers() {\n\t\t\treturn this.$store.getters.getUsers\n\t\t},\n\t\tgroups() {\n\t\t\treturn this.$store.getters.getGroups\n\t\t},\n\t\tusersOffset() {\n\t\t\treturn this.$store.getters.getUsersOffset\n\t\t},\n\t\tusersLimit() {\n\t\t\treturn this.$store.getters.getUsersLimit\n\t\t},\n\n\t\t// Local settings\n\t\tshowLanguages: {\n\t\t\tget() { return this.getLocalstorage('showLanguages') },\n\t\t\tset(status) {\n\t\t\t\tthis.setLocalStorage('showLanguages', status)\n\t\t\t},\n\t\t},\n\t\tshowLastLogin: {\n\t\t\tget() { return this.getLocalstorage('showLastLogin') },\n\t\t\tset(status) {\n\t\t\t\tthis.setLocalStorage('showLastLogin', status)\n\t\t\t},\n\t\t},\n\t\tshowUserBackend: {\n\t\t\tget() { return this.getLocalstorage('showUserBackend') },\n\t\t\tset(status) {\n\t\t\t\tthis.setLocalStorage('showUserBackend', status)\n\t\t\t},\n\t\t},\n\t\tshowStoragePath: {\n\t\t\tget() { return this.getLocalstorage('showStoragePath') },\n\t\t\tset(status) {\n\t\t\t\tthis.setLocalStorage('showStoragePath', status)\n\t\t\t},\n\t\t},\n\n\t\tuserCount() {\n\t\t\treturn this.$store.getters.getUserCount\n\t\t},\n\t\tsettings() {\n\t\t\treturn this.$store.getters.getServerData\n\t\t},\n\n\t\t// default quota\n\t\tquotaOptions() {\n\t\t\t// convert the preset array into objects\n\t\t\tconst quotaPreset = this.settings.quotaPreset.reduce((acc, cur) => acc.concat({ id: cur, label: cur }), [])\n\t\t\t// add default presets\n\t\t\tif (this.settings.allowUnlimitedQuota) {\n\t\t\t\tquotaPreset.unshift(this.unlimitedQuota)\n\t\t\t}\n\t\t\treturn quotaPreset\n\t\t},\n\t\t// mapping saved values to objects\n\t\tdefaultQuota: {\n\t\t\tget() {\n\t\t\t\tif (this.selectedQuota !== false) {\n\t\t\t\t\treturn this.selectedQuota\n\t\t\t\t}\n\t\t\t\tif (this.settings.defaultQuota !== this.unlimitedQuota.id && OC.Util.computerFileSize(this.settings.defaultQuota) >= 0) {\n\t\t\t\t\t// if value is valid, let's map the quotaOptions or return custom quota\n\t\t\t\t\treturn { id: this.settings.defaultQuota, label: this.settings.defaultQuota }\n\t\t\t\t}\n\t\t\t\treturn this.unlimitedQuota // unlimited\n\t\t\t},\n\t\t\tset(quota) {\n\t\t\t\tthis.selectedQuota = quota\n\t\t\t},\n\n\t\t},\n\n\t\tsendWelcomeMail: {\n\t\t\tget() {\n\t\t\t\treturn this.settings.newUserSendEmail\n\t\t\t},\n\t\t\tasync set(value) {\n\t\t\t\ttry {\n\t\t\t\t\tthis.loadingSendMail = true\n\t\t\t\t\tthis.$store.commit('setServerData', {\n\t\t\t\t\t\t...this.settings,\n\t\t\t\t\t\tnewUserSendEmail: value,\n\t\t\t\t\t})\n\t\t\t\t\tawait axios.post(generateUrl('/settings/users/preferences/newUser.sendEmail'), { value: value ? 'yes' : 'no' })\n\t\t\t\t} catch (e) {\n\t\t\t\t\tconsole.error('could not update newUser.sendEmail preference: ' + e.message, e)\n\t\t\t\t} finally {\n\t\t\t\t\tthis.loadingSendMail = false\n\t\t\t\t}\n\t\t\t},\n\t\t},\n\n\t\tgroupList() {\n\t\t\tconst groups = Array.isArray(this.groups) ? this.groups : []\n\n\t\t\treturn groups\n\t\t\t\t// filter out disabled and admin\n\t\t\t\t.filter(group => group.id !== 'disabled' && group.id !== 'admin')\n\t\t\t\t.map(group => this.formatGroupMenu(group))\n\t\t},\n\n\t\tadminGroupMenu() {\n\t\t\treturn this.formatGroupMenu(this.groups.find(group => group.id === 'admin'))\n\t\t},\n\t\tdisabledGroupMenu() {\n\t\t\treturn this.formatGroupMenu(this.groups.find(group => group.id === 'disabled'))\n\t\t},\n\t},\n\tbeforeMount() {\n\t\tthis.$store.commit('initGroups', {\n\t\t\tgroups: this.$store.getters.getServerData.groups,\n\t\t\torderBy: this.$store.getters.getServerData.sortGroups,\n\t\t\tuserCount: this.$store.getters.getServerData.userCount,\n\t\t})\n\t\tthis.$store.dispatch('getPasswordPolicyMinLength')\n\t},\n\tcreated() {\n\t\t// init the OCA.Settings.UserList object\n\t\t// and add the registerAction method\n\t\tObject.assign(OCA, {\n\t\t\tSettings: {\n\t\t\t\tUserList: {\n\t\t\t\t\tregisterAction: this.registerAction,\n\t\t\t\t},\n\t\t\t},\n\t\t})\n\t},\n\tmethods: {\n\t\tshowNewUserMenu() {\n\t\t\tthis.showConfig.showNewUserForm = true\n\t\t\tif (this.showConfig.showNewUserForm) {\n\t\t\t\tVue.nextTick(() => {\n\t\t\t\t\twindow.newusername.focus()\n\t\t\t\t})\n\t\t\t}\n\t\t},\n\t\tgetLocalstorage(key) {\n\t\t\t// force initialization\n\t\t\tconst localConfig = this.$localStorage.get(key)\n\t\t\t// if localstorage is null, fallback to original values\n\t\t\tthis.showConfig[key] = localConfig !== null ? localConfig === 'true' : this.showConfig[key]\n\t\t\treturn this.showConfig[key]\n\t\t},\n\t\tsetLocalStorage(key, status) {\n\t\t\tthis.showConfig[key] = status\n\t\t\tthis.$localStorage.set(key, status)\n\t\t\treturn status\n\t\t},\n\n\t\t/**\n\t\t * Dispatch default quota set request\n\t\t *\n\t\t * @param {string | object} quota Quota in readable format '5 GB' or Object {id: '5 GB', label: '5GB'}\n\t\t */\n\t\tsetDefaultQuota(quota = 'none') {\n\t\t\tthis.$store.dispatch('setAppConfig', {\n\t\t\t\tapp: 'files',\n\t\t\t\tkey: 'default_quota',\n\t\t\t\t// ensure we only send the preset id\n\t\t\t\tvalue: quota.id ? quota.id : quota,\n\t\t\t}).then(() => {\n\t\t\t\tif (typeof quota !== 'object') {\n\t\t\t\t\tquota = { id: quota, label: quota }\n\t\t\t\t}\n\t\t\t\tthis.defaultQuota = quota\n\t\t\t})\n\t\t},\n\n\t\t/**\n\t\t * Validate quota string to make sure it's a valid human file size\n\t\t *\n\t\t * @param {string} quota Quota in readable format '5 GB'\n\t\t * @return {Promise|boolean}\n\t\t */\n\t\tvalidateQuota(quota) {\n\t\t\t// only used for new presets sent through @Tag\n\t\t\tconst validQuota = OC.Util.computerFileSize(quota)\n\t\t\tif (validQuota === null) {\n\t\t\t\treturn this.setDefaultQuota('none')\n\t\t\t} else {\n\t\t\t\t// unify format output\n\t\t\t\treturn this.setDefaultQuota(OC.Util.humanFileSize(OC.Util.computerFileSize(quota)))\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Register a new action for the user menu\n\t\t *\n\t\t * @param {string} icon the icon class\n\t\t * @param {string} text the text to display\n\t\t * @param {Function} action the function to run\n\t\t * @return {Array}\n\t\t */\n\t\tregisterAction(icon, text, action) {\n\t\t\tthis.externalActions.push({\n\t\t\t\ticon,\n\t\t\t\ttext,\n\t\t\t\taction,\n\t\t\t})\n\t\t\treturn this.externalActions\n\t\t},\n\n\t\t/**\n\t\t * Create a new group\n\t\t *\n\t\t * @param {string} gid The group id\n\t\t */\n\t\tasync createGroup(gid) {\n\t\t\t// group is not valid\n\t\t\tif (gid.trim() === '') {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tthis.loadingAddGroup = true\n\t\t\t\tawait this.$store.dispatch('addGroup', gid.trim())\n\n\t\t\t\tthis.hideAddGroupForm()\n\t\t\t\tawait this.$router.push({\n\t\t\t\t\tname: 'group',\n\t\t\t\t\tparams: {\n\t\t\t\t\t\tselectedGroup: encodeURIComponent(gid.trim()),\n\t\t\t\t\t},\n\t\t\t\t})\n\t\t\t} catch {\n\t\t\t\tthis.showAddGroupForm()\n\t\t\t} finally {\n\t\t\t\tthis.loadingAddGroup = false\n\t\t\t}\n\t\t},\n\n\t\tshowAddGroupForm() {\n\t\t\tthis.$refs.addGroup.editingActive = true\n\t\t\tthis.$refs.addGroup.onMenuToggle(false)\n\t\t\tthis.$nextTick(() => {\n\t\t\t\tthis.$refs.addGroup.$refs.editingInput.focusInput()\n\t\t\t})\n\t\t},\n\n\t\thideAddGroupForm() {\n\t\t\tthis.$refs.addGroup.editingActive = false\n\t\t\tthis.$refs.addGroup.editingValue = ''\n\t\t},\n\n\t\t/**\n\t\t * Format a group to a menu entry\n\t\t *\n\t\t * @param {object} group the group\n\t\t * @return {object}\n\t\t */\n\t\tformatGroupMenu(group) {\n\t\t\tconst item = {}\n\t\t\tif (typeof group === 'undefined') {\n\t\t\t\treturn {}\n\t\t\t}\n\n\t\t\titem.id = group.id\n\t\t\titem.title = group.name\n\t\t\titem.usercount = group.usercount\n\n\t\t\t// users count for all groups\n\t\t\tif (group.usercount - group.disabled > 0) {\n\t\t\t\titem.count = group.usercount - group.disabled\n\t\t\t}\n\n\t\t\treturn item\n\t\t},\n\t},\n}\n</script>\n\n<style lang=\"scss\" scoped>\n// force hiding the editing action for the add group entry\n.app-navigation__list #addgroup::v-deep .app-navigation-entry__utils {\n\tdisplay: none;\n}\n</style>\n","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Users.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!./Users.vue?vue&type=script&lang=js&\"","\n import API from \"!../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Users.vue?vue&type=style&index=0&id=7004587b&lang=scss&scoped=true&\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Users.vue?vue&type=style&index=0&id=7004587b&lang=scss&scoped=true&\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./Users.vue?vue&type=template&id=7004587b&scoped=true&\"\nimport script from \"./Users.vue?vue&type=script&lang=js&\"\nexport * from \"./Users.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Users.vue?vue&type=style&index=0&id=7004587b&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"7004587b\",\n null\n \n)\n\nexport default component.exports"],"names":["___CSS_LOADER_EXPORT___","push","module","id","_vm","this","_h","$createElement","_c","_self","key","attrs","title","name","params","selectedGroup","encodeURIComponent","loadingRenameGroup","openGroupMenu","on","handleGroupMenuOpen","scopedSlots","_u","fn","_v","_s","count","_e","proxy","settings","isAdmin","ref","$event","renameGroup","t","removeGroup","props","user","type","Object","required","default","groups","Array","subAdminsGroups","quotaOptions","showConfig","languages","externalActions","computed","userGroups","filter","group","includes","userSubAdminsGroups","subadmin","availableGroups","map","groupClone","assign","$isDisabled","canAdd","canRemove","usedSpace","quota","used","size","OC","Util","humanFileSize","usedQuota","Math","min","round","pow","isNaN","userQuota","humanQuota","find","label","minPasswordLength","$store","getters","getPasswordPolicyMinLength","userLanguage","userLang","concat","lang","code","language","userLastLoginTooltip","lastLogin","formatDate","userLastLogin","relativeModifiedDate","methods","generateAvatar","isDarkTheme","generateUrl","version","oc_userconfig","avatar","options","styleTagTransform","setAttributes","insert","domAPI","insertStyleElement","staticClass","class","loading","delete","disable","wipe","directives","rawName","value","displayname","length","expression","email","userGroupsLabels","userSubAdminsGroupsLabels","domProps","showUserBackend","showStoragePath","backend","storageLocation","modifiers","canEdit","all","toggleEdit","preventDefault","toggleMenu","apply","arguments","openedMenu","userActions","style","opacity","feedbackMessage","keys","editing","backendCapabilities","displayName","updateDisplayName","rand","canChangePassword","setPassword","password","updatePassword","mailAddress","updateEmail","removeUserGroup","addUserGroup","createGroup","slot","subadmins","removeUserSubAdmin","addUserSubAdmin","setUserQuota","validateQuota","setUserLanguage","onScroll","closeModal","createUser","newUser","newUserGenerateUserID","target","composing","$set","newUserRequireEmail","canAddGroups","model","callback","$$v","scrolled","showNewUserForm","_l","infiniteHandler","loadingAddGroup","showAddGroupForm","userCount","adminGroupMenu","disabledGroupMenu","usercount","groupList","defaultQuota","setDefaultQuota","isArray","showLanguages","_i","$$a","$$el","$$c","checked","$$i","slice","showLastLogin","loadingSendMail","sendWelcomeMail","showNewUserMenu","indexOf","_k","keyCode","users","selectedGroupDecoded"],"sourceRoot":""}
\ No newline at end of file diff --git a/dist/settings-vue-settings-apps-users-management.js b/dist/settings-vue-settings-apps-users-management.js index 241fcd9a761..44be23a3277 100644 --- a/dist/settings-vue-settings-apps-users-management.js +++ b/dist/settings-vue-settings-apps-users-management.js @@ -1,3 +1,3 @@ /*! For license information please see settings-vue-settings-apps-users-management.js.LICENSE.txt */ -!function(){"use strict";var e,r,o,i={78778:function(e,r,o){var i=o(20144),u=o(34741),s=o(83678),a={name:"App",beforeMount:function(){null!==document.getElementById("serverData")&&this.$store.commit("setServerData",JSON.parse(document.getElementById("serverData").dataset.server))}},c=(0,o(51900).Z)(a,(function(){var e=this.$createElement;return(this._self._c||e)("router-view")}),[],!1,null,null,null).exports,d=o(78345),p=o(79753),f=function(){return Promise.all([o.e(7874),o.e(8351)]).then(o.bind(o,57272))},l=function(){return Promise.all([o.e(7874),o.e(7418)]).then(o.bind(o,62128))};i.ZP.use(d.Z);var m=new d.Z({mode:"history",base:(0,p.generateUrl)(""),linkActiveClass:"active",routes:[{path:"/:index(index.php/)?settings/users",component:f,props:!0,name:"users",children:[{path:":selectedGroup",name:"group",component:f}]},{path:"/:index(index.php/)?settings/apps",component:l,props:!0,name:"apps",children:[{path:":category",name:"apps-category",component:l,children:[{path:":id",name:"apps-details",component:l}]}]}]}),g=o(20629),h=o(4820),v=o(10128),A=(o(65509),function(e){return e.replace(/\/$/,"")}),b=function(){return(0,v.confirmPassword)()},U=function(e,t){return h.default.get(A(e),t)},I=function(e,t){return h.default.post(A(e),t)},y=function(e,t){return h.default.put(A(e),t)},L=function(e,t){return h.default.delete(A(e),{params:t})},P=(0,o(17499).IY)().setApp("settings").detectUser().build(),w=function(e,t){return 1===t?e.sort((function(e,t){return e.usercount-e.disabled<t.usercount-t.disabled})):e.sort((function(e,t){return e.name.localeCompare(t.name)}))},E={id:"",name:"",usercount:0,disabled:0,canAdd:!0,canRemove:!0},O={appendUsers:function(e,t){var r=e.users.concat(Object.keys(t).map((function(e){return t[e]})));e.usersOffset+=e.usersLimit,e.users=r},setPasswordPolicyMinLength:function(e,t){e.minPasswordLength=""!==t?t:0},initGroups:function(e,t){var r=t.groups,n=t.orderBy,o=t.userCount;e.groups=r.map((function(e){return Object.assign({},E,e)})),e.orderBy=n,e.userCount=o,e.groups=w(e.groups,e.orderBy)},addGroup:function(e,t){var r=t.gid,n=t.displayName;try{if(void 0!==e.groups.find((function(e){return e.id===r})))return;var o=Object.assign({},E,{id:r,name:n});e.groups.push(o),e.groups=w(e.groups,e.orderBy)}catch(e){console.error("Can't create group",e)}},renameGroup:function(e,t){var r=t.gid,n=t.displayName,o=e.groups.findIndex((function(e){return e.id===r}));if(o>=0){var i=e.groups[o];i.name=n,e.groups.splice(o,1,i),e.groups=w(e.groups,e.orderBy)}},removeGroup:function(e,t){var r=e.groups.findIndex((function(e){return e.id===t}));r>=0&&e.groups.splice(r,1)},addUserGroup:function(e,t){var r=t.userid,n=t.gid,o=e.groups.find((function(e){return e.id===n})),i=e.users.find((function(e){return e.id===r}));o&&i.enabled&&e.userCount>0&&o.usercount++,i.groups.push(n),e.groups=w(e.groups,e.orderBy)},removeUserGroup:function(e,t){var r=t.userid,n=t.gid,o=e.groups.find((function(e){return e.id===n})),i=e.users.find((function(e){return e.id===r}));o&&i.enabled&&e.userCount>0&&o.usercount--;var u=i.groups;u.splice(u.indexOf(n),1),e.groups=w(e.groups,e.orderBy)},addUserSubAdmin:function(e,t){var r=t.userid,n=t.gid;e.users.find((function(e){return e.id===r})).subadmin.push(n)},removeUserSubAdmin:function(e,t){var r=t.userid,n=t.gid,o=e.users.find((function(e){return e.id===r})).subadmin;o.splice(o.indexOf(n),1)},deleteUser:function(e,t){var r=e.users.findIndex((function(e){return e.id===t}));this.commit("updateUserCounts",{user:e.users[r],actionType:"remove"}),e.users.splice(r,1)},addUserData:function(e,t){var r=t.data.ocs.data;e.users.push(r),this.commit("updateUserCounts",{user:r,actionType:"create"})},enableDisableUser:function(e,t){var r=t.userid,n=t.enabled,o=e.users.find((function(e){return e.id===r}));o.enabled=n,this.commit("updateUserCounts",{user:o,actionType:n?"enable":"disable"})},updateUserCounts:function(e,t){var r=t.user,n=t.actionType,o=e.groups.find((function(e){return"disabled"===e.id}));switch(n){case"enable":case"disable":o.usercount+=r.enabled?-1:1,e.userCount+=r.enabled?1:-1,r.groups.forEach((function(t){e.groups.find((function(e){return e.id===t})).disabled+=r.enabled?-1:1}));break;case"create":e.userCount++,r.groups.forEach((function(t){e.groups.find((function(e){return e.id===t})).usercount++}));break;case"remove":r.enabled?(e.userCount--,r.groups.forEach((function(t){e.groups.find((function(e){return e.id===t})).usercount--}))):(o.usercount--,r.groups.forEach((function(t){e.groups.find((function(e){return e.id===t})).disabled--})));break;default:P.error("Unknown action type in updateUserCounts: '".concat(n,"'"))}},setUserData:function(e,t){var r=t.userid,n=t.key,o=t.value;if("quota"===n){var i=OC.Util.computerFileSize(o);e.users.find((function(e){return e.id===r}))[n][n]=null!==i?i:o}else e.users.find((function(e){return e.id===r}))[n]=o},resetUsers:function(e){e.users=[],e.usersOffset=0}},C=h.default.CancelToken,_=null,R={state:{users:[],groups:[],orderBy:1,minPasswordLength:0,usersOffset:0,usersLimit:25,userCount:0},mutations:O,getters:{getUsers:function(e){return e.users},getGroups:function(e){return e.groups},getSubadminGroups:function(e){return e.groups.filter((function(e){return"admin"!==e.id&&"disabled"!==e.id}))},getPasswordPolicyMinLength:function(e){return e.minPasswordLength},getUsersOffset:function(e){return e.usersOffset},getUsersLimit:function(e){return e.usersLimit},getUserCount:function(e){return e.userCount}},actions:{getUsers:function(e,t){var r=t.offset,n=t.limit,o=t.search,i=t.group;return _&&_.cancel("Operation canceled by another search request."),_=C.source(),o="string"==typeof o?o:"",""!==(i="string"==typeof i?i:"")?U((0,p.generateOcsUrl)("cloud/groups/{group}/users/details?offset={offset}&limit={limit}&search={search}",{group:encodeURIComponent(i),offset:r,limit:n,search:o}),{cancelToken:_.token}).then((function(t){var r=Object.keys(t.data.ocs.data.users).length;return r>0&&e.commit("appendUsers",t.data.ocs.data.users),r})).catch((function(t){h.default.isCancel(t)||e.commit("API_FAILURE",t)})):U((0,p.generateOcsUrl)("cloud/users/details?offset={offset}&limit={limit}&search={search}",{offset:r,limit:n,search:o}),{cancelToken:_.token}).then((function(t){var r=Object.keys(t.data.ocs.data.users).length;return r>0&&e.commit("appendUsers",t.data.ocs.data.users),r})).catch((function(t){h.default.isCancel(t)||e.commit("API_FAILURE",t)}))},getGroups:function(e,t){var r=t.offset,n=t.limit,o=t.search;o="string"==typeof o?o:"";var i=-1===n?"":"&limit=".concat(n);return U((0,p.generateOcsUrl)("cloud/groups?offset={offset}&search={search}",{offset:r,search:o})+i).then((function(t){return Object.keys(t.data.ocs.data.groups).length>0&&(t.data.ocs.data.groups.forEach((function(t){e.commit("addGroup",{gid:t,displayName:t})})),!0)})).catch((function(t){return e.commit("API_FAILURE",t)}))},getUsersFromList:function(e,t){var r=t.offset,n=t.limit,o=t.search;return o="string"==typeof o?o:"",U((0,p.generateOcsUrl)("cloud/users/details?offset={offset}&limit={limit}&search={search}",{offset:r,limit:n,search:o})).then((function(t){return Object.keys(t.data.ocs.data.users).length>0&&(e.commit("appendUsers",t.data.ocs.data.users),!0)})).catch((function(t){return e.commit("API_FAILURE",t)}))},getUsersFromGroup:function(e,t){var r=t.groupid,n=t.offset,o=t.limit;return U((0,p.generateOcsUrl)("cloud/users/{groupId}/details?offset={offset}&limit={limit}",{groupId:encodeURIComponent(r),offset:n,limit:o})).then((function(t){return e.commit("getUsersFromList",t.data.ocs.data.users)})).catch((function(t){return e.commit("API_FAILURE",t)}))},getPasswordPolicyMinLength:function(e){return!(!OC.getCapabilities().password_policy||!OC.getCapabilities().password_policy.minLength)&&(e.commit("setPasswordPolicyMinLength",OC.getCapabilities().password_policy.minLength),OC.getCapabilities().password_policy.minLength)},addGroup:function(e,t){return b().then((function(r){return I((0,p.generateOcsUrl)("cloud/groups"),{groupid:t}).then((function(r){return e.commit("addGroup",{gid:t,displayName:t}),{gid:t,displayName:t}})).catch((function(e){throw e}))})).catch((function(r){throw e.commit("API_FAILURE",{gid:t,error:r}),r}))},renameGroup:function(e,t){var r=t.groupid,n=t.displayName;return b().then((function(t){return y((0,p.generateOcsUrl)("cloud/groups/{groupId}",{groupId:encodeURIComponent(r)}),{key:"displayname",value:n}).then((function(t){return e.commit("renameGroup",{gid:r,displayName:n}),{groupid:r,displayName:n}})).catch((function(e){throw e}))})).catch((function(t){throw e.commit("API_FAILURE",{groupid:r,error:t}),t}))},removeGroup:function(e,t){return b().then((function(r){return L((0,p.generateOcsUrl)("cloud/groups/{groupId}",{groupId:encodeURIComponent(t)})).then((function(r){return e.commit("removeGroup",t)})).catch((function(e){throw e}))})).catch((function(r){return e.commit("API_FAILURE",{gid:t,error:r})}))},addUserGroup:function(e,t){var r=t.userid,n=t.gid;return b().then((function(t){return I((0,p.generateOcsUrl)("cloud/users/{userid}/groups",{userid:r}),{groupid:n}).then((function(t){return e.commit("addUserGroup",{userid:r,gid:n})})).catch((function(e){throw e}))})).catch((function(t){return e.commit("API_FAILURE",{userid:r,error:t})}))},removeUserGroup:function(e,t){var r=t.userid,n=t.gid;return b().then((function(t){return L((0,p.generateOcsUrl)("cloud/users/{userid}/groups",{userid:r}),{groupid:n}).then((function(t){return e.commit("removeUserGroup",{userid:r,gid:n})})).catch((function(e){throw e}))})).catch((function(t){throw e.commit("API_FAILURE",{userid:r,error:t}),t}))},addUserSubAdmin:function(e,t){var r=t.userid,n=t.gid;return b().then((function(t){return I((0,p.generateOcsUrl)("cloud/users/{userid}/subadmins",{userid:r}),{groupid:n}).then((function(t){return e.commit("addUserSubAdmin",{userid:r,gid:n})})).catch((function(e){throw e}))})).catch((function(t){return e.commit("API_FAILURE",{userid:r,error:t})}))},removeUserSubAdmin:function(e,t){var r=t.userid,n=t.gid;return b().then((function(t){return L((0,p.generateOcsUrl)("cloud/users/{userid}/subadmins",{userid:r}),{groupid:n}).then((function(t){return e.commit("removeUserSubAdmin",{userid:r,gid:n})})).catch((function(e){throw e}))})).catch((function(t){return e.commit("API_FAILURE",{userid:r,error:t})}))},wipeUserDevices:function(e,t){return b().then((function(e){return I((0,p.generateOcsUrl)("cloud/users/{userid}/wipe",{userid:t})).catch((function(e){throw e}))})).catch((function(r){return e.commit("API_FAILURE",{userid:t,error:r})}))},deleteUser:function(e,t){return b().then((function(r){return L((0,p.generateOcsUrl)("cloud/users/{userid}",{userid:t})).then((function(r){return e.commit("deleteUser",t)})).catch((function(e){throw e}))})).catch((function(r){return e.commit("API_FAILURE",{userid:t,error:r})}))},addUser:function(e,t){var r=e.commit,n=e.dispatch,o=t.userid,i=t.password,u=t.displayName,s=t.email,a=t.groups,c=t.subadmin,d=t.quota,f=t.language;return b().then((function(e){return I((0,p.generateOcsUrl)("cloud/users"),{userid:o,password:i,displayName:u,email:s,groups:a,subadmin:c,quota:d,language:f}).then((function(e){return n("addUserData",o||e.data.ocs.data.id)})).catch((function(e){throw e}))})).catch((function(e){throw r("API_FAILURE",{userid:o,error:e}),e}))},addUserData:function(e,t){return b().then((function(r){return U((0,p.generateOcsUrl)("cloud/users/{userid}",{userid:t})).then((function(t){return e.commit("addUserData",t)})).catch((function(e){throw e}))})).catch((function(r){return e.commit("API_FAILURE",{userid:t,error:r})}))},enableDisableUser:function(e,t){var r=t.userid,n=t.enabled,o=void 0===n||n,i=o?"enable":"disable";return b().then((function(t){return y((0,p.generateOcsUrl)("cloud/users/{userid}/{userStatus}",{userid:r,userStatus:i})).then((function(t){return e.commit("enableDisableUser",{userid:r,enabled:o})})).catch((function(e){throw e}))})).catch((function(t){return e.commit("API_FAILURE",{userid:r,error:t})}))},setUserData:function(e,t){var r=t.userid,n=t.key,o=t.value,i=["email","displayname"];return-1!==["email","language","quota","displayname","password"].indexOf(n)&&"string"==typeof o&&(-1===i.indexOf(n)&&o.length>0||-1!==i.indexOf(n))?b().then((function(t){return y((0,p.generateOcsUrl)("cloud/users/{userid}",{userid:r}),{key:n,value:o}).then((function(t){return e.commit("setUserData",{userid:r,key:n,value:o})})).catch((function(e){throw e}))})).catch((function(t){return e.commit("API_FAILURE",{userid:r,error:t})})):Promise.reject(new Error("Invalid request data"))},sendWelcomeMail:function(e,t){return b().then((function(e){return I((0,p.generateOcsUrl)("cloud/users/{userid}/welcome",{userid:t})).then((function(e){return!0})).catch((function(e){throw e}))})).catch((function(r){return e.commit("API_FAILURE",{userid:t,error:r})}))}}},k=o(26932),F=(o(73317),{APPS_API_FAILURE:function(e,r){(0,k.showError)(t("settings","An error occurred during the request. Unable to proceed.")+"<br>"+r.error.response.data.data.message,{isHTML:!0}),console.error(e,r)},initCategories:function(e,t){var r=t.categories,n=t.updateCount;e.categories=r,e.updateCount=n},setUpdateCount:function(e,t){e.updateCount=t},addCategory:function(e,t){e.categories.push(t)},appendCategories:function(e,t){e.categories=t},setAllApps:function(e,t){e.apps=t},setError:function(e,t){var r=t.appId,n=t.error;Array.isArray(r)||(r=[r]),r.forEach((function(t){e.apps.find((function(e){return e.id===t})).error=n}))},clearError:function(e,t){var r=t.appId;t.error,e.apps.find((function(e){return e.id===r})).error=null},enableApp:function(e,t){var r=t.appId,n=t.groups,o=e.apps.find((function(e){return e.id===r}));o.active=!0,o.groups=n},disableApp:function(e,t){var r=e.apps.find((function(e){return e.id===t}));r.active=!1,r.groups=[],r.removable&&(r.canUnInstall=!0)},uninstallApp:function(e,t){e.apps.find((function(e){return e.id===t})).active=!1,e.apps.find((function(e){return e.id===t})).groups=[],e.apps.find((function(e){return e.id===t})).needsDownload=!0,e.apps.find((function(e){return e.id===t})).installed=!1,e.apps.find((function(e){return e.id===t})).canUnInstall=!1,e.apps.find((function(e){return e.id===t})).canInstall=!0},updateApp:function(e,t){var r=e.apps.find((function(e){return e.id===t})),n=r.update;r.update=null,r.version=n,e.updateCount--},resetApps:function(e){e.apps=[]},reset:function(e){e.apps=[],e.categories=[],e.updateCount=0},startLoading:function(e,t){Array.isArray(t)?t.forEach((function(t){i.ZP.set(e.loading,t,!0)})):i.ZP.set(e.loading,t,!0)},stopLoading:function(e,t){Array.isArray(t)?t.forEach((function(t){i.ZP.set(e.loading,t,!1)})):i.ZP.set(e.loading,t,!1)}}),S={enableApp:function(e,r){var n,o=r.appId,i=r.groups;return n=Array.isArray(o)?o:[o],b().then((function(r){return e.commit("startLoading",n),e.commit("startLoading","install"),I((0,p.generateUrl)("settings/apps/enable"),{appIds:n,groups:i}).then((function(r){return e.commit("stopLoading",n),e.commit("stopLoading","install"),n.forEach((function(t){e.commit("enableApp",{appId:t,groups:i})})),U((0,p.generateUrl)("apps/files")).then((function(){r.data.update_required&&((0,k.showInfo)(t("settings","The app has been enabled but needs to be updated. You will be redirected to the update page in 5 seconds."),{onClick:function(){return window.location.reload()},close:!1}),setTimeout((function(){location.reload()}),5e3))})).catch((function(){Array.isArray(o)||e.commit("setError",{appId:n,error:t("settings","Error: This app cannot be enabled because it makes the server unstable")})}))})).catch((function(t){e.commit("stopLoading",n),e.commit("stopLoading","install"),e.commit("setError",{appId:n,error:t.response.data.data.message}),e.commit("APPS_API_FAILURE",{appId:o,error:t})}))})).catch((function(t){return e.commit("API_FAILURE",{appId:o,error:t})}))},forceEnableApp:function(e,t){var r,n=t.appId;return t.groups,r=Array.isArray(n)?n:[n],b().then((function(){return e.commit("startLoading",r),e.commit("startLoading","install"),I((0,p.generateUrl)("settings/apps/force"),{appId:n}).then((function(e){location.reload()})).catch((function(t){e.commit("stopLoading",r),e.commit("stopLoading","install"),e.commit("setError",{appId:r,error:t.response.data.data.message}),e.commit("APPS_API_FAILURE",{appId:n,error:t})}))})).catch((function(t){return e.commit("API_FAILURE",{appId:n,error:t})}))},disableApp:function(e,t){var r,n=t.appId;return r=Array.isArray(n)?n:[n],b().then((function(t){return e.commit("startLoading",r),I((0,p.generateUrl)("settings/apps/disable"),{appIds:r}).then((function(t){return e.commit("stopLoading",r),r.forEach((function(t){e.commit("disableApp",t)})),!0})).catch((function(t){e.commit("stopLoading",r),e.commit("APPS_API_FAILURE",{appId:n,error:t})}))})).catch((function(t){return e.commit("API_FAILURE",{appId:n,error:t})}))},uninstallApp:function(e,t){var r=t.appId;return b().then((function(t){return e.commit("startLoading",r),U((0,p.generateUrl)("settings/apps/uninstall/".concat(r))).then((function(t){return e.commit("stopLoading",r),e.commit("uninstallApp",r),!0})).catch((function(t){e.commit("stopLoading",r),e.commit("APPS_API_FAILURE",{appId:r,error:t})}))})).catch((function(t){return e.commit("API_FAILURE",{appId:r,error:t})}))},updateApp:function(e,t){var r=t.appId;return b().then((function(t){return e.commit("startLoading",r),e.commit("startLoading","install"),U((0,p.generateUrl)("settings/apps/update/".concat(r))).then((function(t){return e.commit("stopLoading","install"),e.commit("stopLoading",r),e.commit("updateApp",r),!0})).catch((function(t){e.commit("stopLoading",r),e.commit("stopLoading","install"),e.commit("APPS_API_FAILURE",{appId:r,error:t})}))})).catch((function(t){return e.commit("API_FAILURE",{appId:r,error:t})}))},getAllApps:function(e){return e.commit("startLoading","list"),U((0,p.generateUrl)("settings/apps/list")).then((function(t){return e.commit("setAllApps",t.data.apps),e.commit("stopLoading","list"),!0})).catch((function(t){return e.commit("API_FAILURE",t)}))},getCategories:function(e){return e.commit("startLoading","categories"),U((0,p.generateUrl)("settings/apps/categories")).then((function(t){return t.data.length>0&&(e.commit("appendCategories",t.data),e.commit("stopLoading","categories"),!0)})).catch((function(t){return e.commit("API_FAILURE",t)}))}},G={state:{apps:[],categories:[],updateCount:0,loading:{},loadingList:!1},mutations:F,getters:{loading:function(e){return function(t){return e.loading[t]}},getCategories:function(e){return e.categories},getAllApps:function(e){return e.apps},getUpdateCount:function(e){return e.updateCount}},actions:S},x={state:{},mutations:{},getters:{},actions:{setAppConfig:function(e,t){var r=t.app,n=t.key,o=t.value;return b().then((function(e){return I((0,p.generateOcsUrl)("apps/provisioning_api/api/v1/config/apps/{app}/{key}",{app:r,key:n}),{value:o}).catch((function(e){throw e}))})).catch((function(t){return e.commit("API_FAILURE",{app:r,key:n,value:o,error:t})}))}}};i.ZP.use(g.ZP);var D={API_FAILURE:function(e,r){try{var n=r.error.response.data.ocs.meta.message;(0,k.showError)(t("settings","An error occurred during the request. Unable to proceed.")+"<br>"+n,{isHTML:!0})}catch(e){(0,k.showError)(t("settings","An error occurred during the request. Unable to proceed."))}console.error(e,r)}},T=new g.yh({modules:{users:R,apps:G,settings:{state:{serverData:{}},mutations:{setServerData:function(e,t){e.serverData=t}},getters:{getServerData:function(e){return e.serverData}},actions:{}},oc:x},strict:!1,mutations:D});i.ZP.use(u.default,{defaultHtml:!1}),(0,s.Z)(T,m),o.nc=btoa(OC.requestToken),i.ZP.prototype.t=t,i.ZP.prototype.n=n,i.ZP.prototype.OC=OC,i.ZP.prototype.OCA=OCA,i.ZP.prototype.oc_userconfig=oc_userconfig,new i.ZP({router:m,store:T,render:function(e){return e(c)}}).$mount("#content")}},u={};function s(e){var t=u[e];if(void 0!==t)return t.exports;var r=u[e]={id:e,loaded:!1,exports:{}};return i[e].call(r.exports,r,r.exports,s),r.loaded=!0,r.exports}s.m=i,s.amdD=function(){throw new Error("define cannot be used indirect")},s.amdO={},e=[],s.O=function(t,r,n,o){if(!r){var i=1/0;for(d=0;d<e.length;d++){r=e[d][0],n=e[d][1],o=e[d][2];for(var u=!0,a=0;a<r.length;a++)(!1&o||i>=o)&&Object.keys(s.O).every((function(e){return s.O[e](r[a])}))?r.splice(a--,1):(u=!1,o<i&&(i=o));if(u){e.splice(d--,1);var c=n();void 0!==c&&(t=c)}}return t}o=o||0;for(var d=e.length;d>0&&e[d-1][2]>o;d--)e[d]=e[d-1];e[d]=[r,n,o]},s.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return s.d(t,{a:t}),t},s.d=function(e,t){for(var r in t)s.o(t,r)&&!s.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},s.f={},s.e=function(e){return Promise.all(Object.keys(s.f).reduce((function(t,r){return s.f[r](e,t),t}),[]))},s.u=function(e){return{7418:"settings-apps-view",8351:"settings-users"}[e]+"-"+e+".js?v="+{7418:"d54d22a587fea7ef7311",8351:"0fb4eae666669f163a13"}[e]},s.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),s.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r={},o="nextcloud:",s.l=function(e,t,n,i){if(r[e])r[e].push(t);else{var u,a;if(void 0!==n)for(var c=document.getElementsByTagName("script"),d=0;d<c.length;d++){var p=c[d];if(p.getAttribute("src")==e||p.getAttribute("data-webpack")==o+n){u=p;break}}u||(a=!0,(u=document.createElement("script")).charset="utf-8",u.timeout=120,s.nc&&u.setAttribute("nonce",s.nc),u.setAttribute("data-webpack",o+n),u.src=e),r[e]=[t];var f=function(t,n){u.onerror=u.onload=null,clearTimeout(l);var o=r[e];if(delete r[e],u.parentNode&&u.parentNode.removeChild(u),o&&o.forEach((function(e){return e(n)})),t)return t(n)},l=setTimeout(f.bind(null,void 0,{type:"timeout",target:u}),12e4);u.onerror=f.bind(null,u.onerror),u.onload=f.bind(null,u.onload),a&&document.head.appendChild(u)}},s.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},s.nmd=function(e){return e.paths=[],e.children||(e.children=[]),e},s.j=8562,function(){var e;s.g.importScripts&&(e=s.g.location+"");var t=s.g.document;if(!e&&t&&(t.currentScript&&(e=t.currentScript.src),!e)){var r=t.getElementsByTagName("script");r.length&&(e=r[r.length-1].src)}if(!e)throw new Error("Automatic publicPath is not supported in this browser");e=e.replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),s.p=e}(),function(){s.b=document.baseURI||self.location.href;var e={8562:0};s.f.j=function(t,r){var n=s.o(e,t)?e[t]:void 0;if(0!==n)if(n)r.push(n[2]);else{var o=new Promise((function(r,o){n=e[t]=[r,o]}));r.push(n[2]=o);var i=s.p+s.u(t),u=new Error;s.l(i,(function(r){if(s.o(e,t)&&(0!==(n=e[t])&&(e[t]=void 0),n)){var o=r&&("load"===r.type?"missing":r.type),i=r&&r.target&&r.target.src;u.message="Loading chunk "+t+" failed.\n("+o+": "+i+")",u.name="ChunkLoadError",u.type=o,u.request=i,n[1](u)}}),"chunk-"+t,t)}},s.O.j=function(t){return 0===e[t]};var t=function(t,r){var n,o,i=r[0],u=r[1],a=r[2],c=0;if(i.some((function(t){return 0!==e[t]}))){for(n in u)s.o(u,n)&&(s.m[n]=u[n]);if(a)var d=a(s)}for(t&&t(r);c<i.length;c++)o=i[c],s.o(e,o)&&e[o]&&e[o][0](),e[o]=0;return s.O(d)},r=self.webpackChunknextcloud=self.webpackChunknextcloud||[];r.forEach(t.bind(null,0)),r.push=t.bind(null,r.push.bind(r))}(),s.nc=void 0;var a=s.O(void 0,[7874],(function(){return s(78778)}));a=s.O(a)}(); -//# sourceMappingURL=settings-vue-settings-apps-users-management.js.map?v=db422a6d7aab3272481a
\ No newline at end of file +!function(){"use strict";var e,r,o,i={78778:function(e,r,o){var i=o(20144),u=o(34741),s=o(83678),a={name:"App",beforeMount:function(){null!==document.getElementById("serverData")&&this.$store.commit("setServerData",JSON.parse(document.getElementById("serverData").dataset.server))}},c=(0,o(51900).Z)(a,(function(){var e=this.$createElement;return(this._self._c||e)("router-view")}),[],!1,null,null,null).exports,d=o(78345),p=o(79753),f=function(){return Promise.all([o.e(7874),o.e(8351)]).then(o.bind(o,2709))},l=function(){return Promise.all([o.e(7874),o.e(7418)]).then(o.bind(o,62128))};i.ZP.use(d.Z);var m=new d.Z({mode:"history",base:(0,p.generateUrl)(""),linkActiveClass:"active",routes:[{path:"/:index(index.php/)?settings/users",component:f,props:!0,name:"users",children:[{path:":selectedGroup",name:"group",component:f}]},{path:"/:index(index.php/)?settings/apps",component:l,props:!0,name:"apps",children:[{path:":category",name:"apps-category",component:l,children:[{path:":id",name:"apps-details",component:l}]}]}]}),g=o(20629),h=o(4820),v=o(10128),A=(o(65509),function(e){return e.replace(/\/$/,"")}),b=function(){return(0,v.confirmPassword)()},U=function(e,t){return h.default.get(A(e),t)},I=function(e,t){return h.default.post(A(e),t)},y=function(e,t){return h.default.put(A(e),t)},L=function(e,t){return h.default.delete(A(e),{params:t})},P=(0,o(17499).IY)().setApp("settings").detectUser().build(),w=function(e,t){return 1===t?e.sort((function(e,t){return e.usercount-e.disabled<t.usercount-t.disabled})):e.sort((function(e,t){return e.name.localeCompare(t.name)}))},E={id:"",name:"",usercount:0,disabled:0,canAdd:!0,canRemove:!0},O={appendUsers:function(e,t){var r=e.users.concat(Object.keys(t).map((function(e){return t[e]})));e.usersOffset+=e.usersLimit,e.users=r},setPasswordPolicyMinLength:function(e,t){e.minPasswordLength=""!==t?t:0},initGroups:function(e,t){var r=t.groups,n=t.orderBy,o=t.userCount;e.groups=r.map((function(e){return Object.assign({},E,e)})),e.orderBy=n,e.userCount=o,e.groups=w(e.groups,e.orderBy)},addGroup:function(e,t){var r=t.gid,n=t.displayName;try{if(void 0!==e.groups.find((function(e){return e.id===r})))return;var o=Object.assign({},E,{id:r,name:n});e.groups.push(o),e.groups=w(e.groups,e.orderBy)}catch(e){console.error("Can't create group",e)}},renameGroup:function(e,t){var r=t.gid,n=t.displayName,o=e.groups.findIndex((function(e){return e.id===r}));if(o>=0){var i=e.groups[o];i.name=n,e.groups.splice(o,1,i),e.groups=w(e.groups,e.orderBy)}},removeGroup:function(e,t){var r=e.groups.findIndex((function(e){return e.id===t}));r>=0&&e.groups.splice(r,1)},addUserGroup:function(e,t){var r=t.userid,n=t.gid,o=e.groups.find((function(e){return e.id===n})),i=e.users.find((function(e){return e.id===r}));o&&i.enabled&&e.userCount>0&&o.usercount++,i.groups.push(n),e.groups=w(e.groups,e.orderBy)},removeUserGroup:function(e,t){var r=t.userid,n=t.gid,o=e.groups.find((function(e){return e.id===n})),i=e.users.find((function(e){return e.id===r}));o&&i.enabled&&e.userCount>0&&o.usercount--;var u=i.groups;u.splice(u.indexOf(n),1),e.groups=w(e.groups,e.orderBy)},addUserSubAdmin:function(e,t){var r=t.userid,n=t.gid;e.users.find((function(e){return e.id===r})).subadmin.push(n)},removeUserSubAdmin:function(e,t){var r=t.userid,n=t.gid,o=e.users.find((function(e){return e.id===r})).subadmin;o.splice(o.indexOf(n),1)},deleteUser:function(e,t){var r=e.users.findIndex((function(e){return e.id===t}));this.commit("updateUserCounts",{user:e.users[r],actionType:"remove"}),e.users.splice(r,1)},addUserData:function(e,t){var r=t.data.ocs.data;e.users.push(r),this.commit("updateUserCounts",{user:r,actionType:"create"})},enableDisableUser:function(e,t){var r=t.userid,n=t.enabled,o=e.users.find((function(e){return e.id===r}));o.enabled=n,this.commit("updateUserCounts",{user:o,actionType:n?"enable":"disable"})},updateUserCounts:function(e,t){var r=t.user,n=t.actionType,o=e.groups.find((function(e){return"disabled"===e.id}));switch(n){case"enable":case"disable":o.usercount+=r.enabled?-1:1,e.userCount+=r.enabled?1:-1,r.groups.forEach((function(t){e.groups.find((function(e){return e.id===t})).disabled+=r.enabled?-1:1}));break;case"create":e.userCount++,r.groups.forEach((function(t){e.groups.find((function(e){return e.id===t})).usercount++}));break;case"remove":r.enabled?(e.userCount--,r.groups.forEach((function(t){e.groups.find((function(e){return e.id===t})).usercount--}))):(o.usercount--,r.groups.forEach((function(t){e.groups.find((function(e){return e.id===t})).disabled--})));break;default:P.error("Unknown action type in updateUserCounts: '".concat(n,"'"))}},setUserData:function(e,t){var r=t.userid,n=t.key,o=t.value;if("quota"===n){var i=OC.Util.computerFileSize(o);e.users.find((function(e){return e.id===r}))[n][n]=null!==i?i:o}else e.users.find((function(e){return e.id===r}))[n]=o},resetUsers:function(e){e.users=[],e.usersOffset=0}},C=h.default.CancelToken,_=null,R={state:{users:[],groups:[],orderBy:1,minPasswordLength:0,usersOffset:0,usersLimit:25,userCount:0},mutations:O,getters:{getUsers:function(e){return e.users},getGroups:function(e){return e.groups},getSubadminGroups:function(e){return e.groups.filter((function(e){return"admin"!==e.id&&"disabled"!==e.id}))},getPasswordPolicyMinLength:function(e){return e.minPasswordLength},getUsersOffset:function(e){return e.usersOffset},getUsersLimit:function(e){return e.usersLimit},getUserCount:function(e){return e.userCount}},actions:{getUsers:function(e,t){var r=t.offset,n=t.limit,o=t.search,i=t.group;return _&&_.cancel("Operation canceled by another search request."),_=C.source(),o="string"==typeof o?o:"",""!==(i="string"==typeof i?i:"")?U((0,p.generateOcsUrl)("cloud/groups/{group}/users/details?offset={offset}&limit={limit}&search={search}",{group:encodeURIComponent(i),offset:r,limit:n,search:o}),{cancelToken:_.token}).then((function(t){var r=Object.keys(t.data.ocs.data.users).length;return r>0&&e.commit("appendUsers",t.data.ocs.data.users),r})).catch((function(t){h.default.isCancel(t)||e.commit("API_FAILURE",t)})):U((0,p.generateOcsUrl)("cloud/users/details?offset={offset}&limit={limit}&search={search}",{offset:r,limit:n,search:o}),{cancelToken:_.token}).then((function(t){var r=Object.keys(t.data.ocs.data.users).length;return r>0&&e.commit("appendUsers",t.data.ocs.data.users),r})).catch((function(t){h.default.isCancel(t)||e.commit("API_FAILURE",t)}))},getGroups:function(e,t){var r=t.offset,n=t.limit,o=t.search;o="string"==typeof o?o:"";var i=-1===n?"":"&limit=".concat(n);return U((0,p.generateOcsUrl)("cloud/groups?offset={offset}&search={search}",{offset:r,search:o})+i).then((function(t){return Object.keys(t.data.ocs.data.groups).length>0&&(t.data.ocs.data.groups.forEach((function(t){e.commit("addGroup",{gid:t,displayName:t})})),!0)})).catch((function(t){return e.commit("API_FAILURE",t)}))},getUsersFromList:function(e,t){var r=t.offset,n=t.limit,o=t.search;return o="string"==typeof o?o:"",U((0,p.generateOcsUrl)("cloud/users/details?offset={offset}&limit={limit}&search={search}",{offset:r,limit:n,search:o})).then((function(t){return Object.keys(t.data.ocs.data.users).length>0&&(e.commit("appendUsers",t.data.ocs.data.users),!0)})).catch((function(t){return e.commit("API_FAILURE",t)}))},getUsersFromGroup:function(e,t){var r=t.groupid,n=t.offset,o=t.limit;return U((0,p.generateOcsUrl)("cloud/users/{groupId}/details?offset={offset}&limit={limit}",{groupId:encodeURIComponent(r),offset:n,limit:o})).then((function(t){return e.commit("getUsersFromList",t.data.ocs.data.users)})).catch((function(t){return e.commit("API_FAILURE",t)}))},getPasswordPolicyMinLength:function(e){return!(!OC.getCapabilities().password_policy||!OC.getCapabilities().password_policy.minLength)&&(e.commit("setPasswordPolicyMinLength",OC.getCapabilities().password_policy.minLength),OC.getCapabilities().password_policy.minLength)},addGroup:function(e,t){return b().then((function(r){return I((0,p.generateOcsUrl)("cloud/groups"),{groupid:t}).then((function(r){return e.commit("addGroup",{gid:t,displayName:t}),{gid:t,displayName:t}})).catch((function(e){throw e}))})).catch((function(r){throw e.commit("API_FAILURE",{gid:t,error:r}),r}))},renameGroup:function(e,t){var r=t.groupid,n=t.displayName;return b().then((function(t){return y((0,p.generateOcsUrl)("cloud/groups/{groupId}",{groupId:encodeURIComponent(r)}),{key:"displayname",value:n}).then((function(t){return e.commit("renameGroup",{gid:r,displayName:n}),{groupid:r,displayName:n}})).catch((function(e){throw e}))})).catch((function(t){throw e.commit("API_FAILURE",{groupid:r,error:t}),t}))},removeGroup:function(e,t){return b().then((function(r){return L((0,p.generateOcsUrl)("cloud/groups/{groupId}",{groupId:encodeURIComponent(t)})).then((function(r){return e.commit("removeGroup",t)})).catch((function(e){throw e}))})).catch((function(r){return e.commit("API_FAILURE",{gid:t,error:r})}))},addUserGroup:function(e,t){var r=t.userid,n=t.gid;return b().then((function(t){return I((0,p.generateOcsUrl)("cloud/users/{userid}/groups",{userid:r}),{groupid:n}).then((function(t){return e.commit("addUserGroup",{userid:r,gid:n})})).catch((function(e){throw e}))})).catch((function(t){return e.commit("API_FAILURE",{userid:r,error:t})}))},removeUserGroup:function(e,t){var r=t.userid,n=t.gid;return b().then((function(t){return L((0,p.generateOcsUrl)("cloud/users/{userid}/groups",{userid:r}),{groupid:n}).then((function(t){return e.commit("removeUserGroup",{userid:r,gid:n})})).catch((function(e){throw e}))})).catch((function(t){throw e.commit("API_FAILURE",{userid:r,error:t}),t}))},addUserSubAdmin:function(e,t){var r=t.userid,n=t.gid;return b().then((function(t){return I((0,p.generateOcsUrl)("cloud/users/{userid}/subadmins",{userid:r}),{groupid:n}).then((function(t){return e.commit("addUserSubAdmin",{userid:r,gid:n})})).catch((function(e){throw e}))})).catch((function(t){return e.commit("API_FAILURE",{userid:r,error:t})}))},removeUserSubAdmin:function(e,t){var r=t.userid,n=t.gid;return b().then((function(t){return L((0,p.generateOcsUrl)("cloud/users/{userid}/subadmins",{userid:r}),{groupid:n}).then((function(t){return e.commit("removeUserSubAdmin",{userid:r,gid:n})})).catch((function(e){throw e}))})).catch((function(t){return e.commit("API_FAILURE",{userid:r,error:t})}))},wipeUserDevices:function(e,t){return b().then((function(e){return I((0,p.generateOcsUrl)("cloud/users/{userid}/wipe",{userid:t})).catch((function(e){throw e}))})).catch((function(r){return e.commit("API_FAILURE",{userid:t,error:r})}))},deleteUser:function(e,t){return b().then((function(r){return L((0,p.generateOcsUrl)("cloud/users/{userid}",{userid:t})).then((function(r){return e.commit("deleteUser",t)})).catch((function(e){throw e}))})).catch((function(r){return e.commit("API_FAILURE",{userid:t,error:r})}))},addUser:function(e,t){var r=e.commit,n=e.dispatch,o=t.userid,i=t.password,u=t.displayName,s=t.email,a=t.groups,c=t.subadmin,d=t.quota,f=t.language;return b().then((function(e){return I((0,p.generateOcsUrl)("cloud/users"),{userid:o,password:i,displayName:u,email:s,groups:a,subadmin:c,quota:d,language:f}).then((function(e){return n("addUserData",o||e.data.ocs.data.id)})).catch((function(e){throw e}))})).catch((function(e){throw r("API_FAILURE",{userid:o,error:e}),e}))},addUserData:function(e,t){return b().then((function(r){return U((0,p.generateOcsUrl)("cloud/users/{userid}",{userid:t})).then((function(t){return e.commit("addUserData",t)})).catch((function(e){throw e}))})).catch((function(r){return e.commit("API_FAILURE",{userid:t,error:r})}))},enableDisableUser:function(e,t){var r=t.userid,n=t.enabled,o=void 0===n||n,i=o?"enable":"disable";return b().then((function(t){return y((0,p.generateOcsUrl)("cloud/users/{userid}/{userStatus}",{userid:r,userStatus:i})).then((function(t){return e.commit("enableDisableUser",{userid:r,enabled:o})})).catch((function(e){throw e}))})).catch((function(t){return e.commit("API_FAILURE",{userid:r,error:t})}))},setUserData:function(e,t){var r=t.userid,n=t.key,o=t.value,i=["email","displayname"];return-1!==["email","language","quota","displayname","password"].indexOf(n)&&"string"==typeof o&&(-1===i.indexOf(n)&&o.length>0||-1!==i.indexOf(n))?b().then((function(t){return y((0,p.generateOcsUrl)("cloud/users/{userid}",{userid:r}),{key:n,value:o}).then((function(t){return e.commit("setUserData",{userid:r,key:n,value:o})})).catch((function(e){throw e}))})).catch((function(t){return e.commit("API_FAILURE",{userid:r,error:t})})):Promise.reject(new Error("Invalid request data"))},sendWelcomeMail:function(e,t){return b().then((function(e){return I((0,p.generateOcsUrl)("cloud/users/{userid}/welcome",{userid:t})).then((function(e){return!0})).catch((function(e){throw e}))})).catch((function(r){return e.commit("API_FAILURE",{userid:t,error:r})}))}}},k=o(26932),F=(o(73317),{APPS_API_FAILURE:function(e,r){(0,k.showError)(t("settings","An error occurred during the request. Unable to proceed.")+"<br>"+r.error.response.data.data.message,{isHTML:!0}),console.error(e,r)},initCategories:function(e,t){var r=t.categories,n=t.updateCount;e.categories=r,e.updateCount=n},setUpdateCount:function(e,t){e.updateCount=t},addCategory:function(e,t){e.categories.push(t)},appendCategories:function(e,t){e.categories=t},setAllApps:function(e,t){e.apps=t},setError:function(e,t){var r=t.appId,n=t.error;Array.isArray(r)||(r=[r]),r.forEach((function(t){e.apps.find((function(e){return e.id===t})).error=n}))},clearError:function(e,t){var r=t.appId;t.error,e.apps.find((function(e){return e.id===r})).error=null},enableApp:function(e,t){var r=t.appId,n=t.groups,o=e.apps.find((function(e){return e.id===r}));o.active=!0,o.groups=n},disableApp:function(e,t){var r=e.apps.find((function(e){return e.id===t}));r.active=!1,r.groups=[],r.removable&&(r.canUnInstall=!0)},uninstallApp:function(e,t){e.apps.find((function(e){return e.id===t})).active=!1,e.apps.find((function(e){return e.id===t})).groups=[],e.apps.find((function(e){return e.id===t})).needsDownload=!0,e.apps.find((function(e){return e.id===t})).installed=!1,e.apps.find((function(e){return e.id===t})).canUnInstall=!1,e.apps.find((function(e){return e.id===t})).canInstall=!0},updateApp:function(e,t){var r=e.apps.find((function(e){return e.id===t})),n=r.update;r.update=null,r.version=n,e.updateCount--},resetApps:function(e){e.apps=[]},reset:function(e){e.apps=[],e.categories=[],e.updateCount=0},startLoading:function(e,t){Array.isArray(t)?t.forEach((function(t){i.ZP.set(e.loading,t,!0)})):i.ZP.set(e.loading,t,!0)},stopLoading:function(e,t){Array.isArray(t)?t.forEach((function(t){i.ZP.set(e.loading,t,!1)})):i.ZP.set(e.loading,t,!1)}}),S={enableApp:function(e,r){var n,o=r.appId,i=r.groups;return n=Array.isArray(o)?o:[o],b().then((function(r){return e.commit("startLoading",n),e.commit("startLoading","install"),I((0,p.generateUrl)("settings/apps/enable"),{appIds:n,groups:i}).then((function(r){return e.commit("stopLoading",n),e.commit("stopLoading","install"),n.forEach((function(t){e.commit("enableApp",{appId:t,groups:i})})),U((0,p.generateUrl)("apps/files")).then((function(){r.data.update_required&&((0,k.showInfo)(t("settings","The app has been enabled but needs to be updated. You will be redirected to the update page in 5 seconds."),{onClick:function(){return window.location.reload()},close:!1}),setTimeout((function(){location.reload()}),5e3))})).catch((function(){Array.isArray(o)||e.commit("setError",{appId:n,error:t("settings","Error: This app cannot be enabled because it makes the server unstable")})}))})).catch((function(t){e.commit("stopLoading",n),e.commit("stopLoading","install"),e.commit("setError",{appId:n,error:t.response.data.data.message}),e.commit("APPS_API_FAILURE",{appId:o,error:t})}))})).catch((function(t){return e.commit("API_FAILURE",{appId:o,error:t})}))},forceEnableApp:function(e,t){var r,n=t.appId;return t.groups,r=Array.isArray(n)?n:[n],b().then((function(){return e.commit("startLoading",r),e.commit("startLoading","install"),I((0,p.generateUrl)("settings/apps/force"),{appId:n}).then((function(e){location.reload()})).catch((function(t){e.commit("stopLoading",r),e.commit("stopLoading","install"),e.commit("setError",{appId:r,error:t.response.data.data.message}),e.commit("APPS_API_FAILURE",{appId:n,error:t})}))})).catch((function(t){return e.commit("API_FAILURE",{appId:n,error:t})}))},disableApp:function(e,t){var r,n=t.appId;return r=Array.isArray(n)?n:[n],b().then((function(t){return e.commit("startLoading",r),I((0,p.generateUrl)("settings/apps/disable"),{appIds:r}).then((function(t){return e.commit("stopLoading",r),r.forEach((function(t){e.commit("disableApp",t)})),!0})).catch((function(t){e.commit("stopLoading",r),e.commit("APPS_API_FAILURE",{appId:n,error:t})}))})).catch((function(t){return e.commit("API_FAILURE",{appId:n,error:t})}))},uninstallApp:function(e,t){var r=t.appId;return b().then((function(t){return e.commit("startLoading",r),U((0,p.generateUrl)("settings/apps/uninstall/".concat(r))).then((function(t){return e.commit("stopLoading",r),e.commit("uninstallApp",r),!0})).catch((function(t){e.commit("stopLoading",r),e.commit("APPS_API_FAILURE",{appId:r,error:t})}))})).catch((function(t){return e.commit("API_FAILURE",{appId:r,error:t})}))},updateApp:function(e,t){var r=t.appId;return b().then((function(t){return e.commit("startLoading",r),e.commit("startLoading","install"),U((0,p.generateUrl)("settings/apps/update/".concat(r))).then((function(t){return e.commit("stopLoading","install"),e.commit("stopLoading",r),e.commit("updateApp",r),!0})).catch((function(t){e.commit("stopLoading",r),e.commit("stopLoading","install"),e.commit("APPS_API_FAILURE",{appId:r,error:t})}))})).catch((function(t){return e.commit("API_FAILURE",{appId:r,error:t})}))},getAllApps:function(e){return e.commit("startLoading","list"),U((0,p.generateUrl)("settings/apps/list")).then((function(t){return e.commit("setAllApps",t.data.apps),e.commit("stopLoading","list"),!0})).catch((function(t){return e.commit("API_FAILURE",t)}))},getCategories:function(e){return e.commit("startLoading","categories"),U((0,p.generateUrl)("settings/apps/categories")).then((function(t){return t.data.length>0&&(e.commit("appendCategories",t.data),e.commit("stopLoading","categories"),!0)})).catch((function(t){return e.commit("API_FAILURE",t)}))}},G={state:{apps:[],categories:[],updateCount:0,loading:{},loadingList:!1},mutations:F,getters:{loading:function(e){return function(t){return e.loading[t]}},getCategories:function(e){return e.categories},getAllApps:function(e){return e.apps},getUpdateCount:function(e){return e.updateCount}},actions:S},x={state:{},mutations:{},getters:{},actions:{setAppConfig:function(e,t){var r=t.app,n=t.key,o=t.value;return b().then((function(e){return I((0,p.generateOcsUrl)("apps/provisioning_api/api/v1/config/apps/{app}/{key}",{app:r,key:n}),{value:o}).catch((function(e){throw e}))})).catch((function(t){return e.commit("API_FAILURE",{app:r,key:n,value:o,error:t})}))}}};i.ZP.use(g.ZP);var D={API_FAILURE:function(e,r){try{var n=r.error.response.data.ocs.meta.message;(0,k.showError)(t("settings","An error occurred during the request. Unable to proceed.")+"<br>"+n,{isHTML:!0})}catch(e){(0,k.showError)(t("settings","An error occurred during the request. Unable to proceed."))}console.error(e,r)}},T=new g.yh({modules:{users:R,apps:G,settings:{state:{serverData:{}},mutations:{setServerData:function(e,t){e.serverData=t}},getters:{getServerData:function(e){return e.serverData}},actions:{}},oc:x},strict:!1,mutations:D});i.ZP.use(u.default,{defaultHtml:!1}),(0,s.Z)(T,m),o.nc=btoa(OC.requestToken),i.ZP.prototype.t=t,i.ZP.prototype.n=n,i.ZP.prototype.OC=OC,i.ZP.prototype.OCA=OCA,i.ZP.prototype.oc_userconfig=oc_userconfig,new i.ZP({router:m,store:T,render:function(e){return e(c)}}).$mount("#content")}},u={};function s(e){var t=u[e];if(void 0!==t)return t.exports;var r=u[e]={id:e,loaded:!1,exports:{}};return i[e].call(r.exports,r,r.exports,s),r.loaded=!0,r.exports}s.m=i,s.amdD=function(){throw new Error("define cannot be used indirect")},s.amdO={},e=[],s.O=function(t,r,n,o){if(!r){var i=1/0;for(d=0;d<e.length;d++){r=e[d][0],n=e[d][1],o=e[d][2];for(var u=!0,a=0;a<r.length;a++)(!1&o||i>=o)&&Object.keys(s.O).every((function(e){return s.O[e](r[a])}))?r.splice(a--,1):(u=!1,o<i&&(i=o));if(u){e.splice(d--,1);var c=n();void 0!==c&&(t=c)}}return t}o=o||0;for(var d=e.length;d>0&&e[d-1][2]>o;d--)e[d]=e[d-1];e[d]=[r,n,o]},s.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return s.d(t,{a:t}),t},s.d=function(e,t){for(var r in t)s.o(t,r)&&!s.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},s.f={},s.e=function(e){return Promise.all(Object.keys(s.f).reduce((function(t,r){return s.f[r](e,t),t}),[]))},s.u=function(e){return{7418:"settings-apps-view",8351:"settings-users"}[e]+"-"+e+".js?v="+{7418:"d54d22a587fea7ef7311",8351:"48806c008b493bc010bb"}[e]},s.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),s.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r={},o="nextcloud:",s.l=function(e,t,n,i){if(r[e])r[e].push(t);else{var u,a;if(void 0!==n)for(var c=document.getElementsByTagName("script"),d=0;d<c.length;d++){var p=c[d];if(p.getAttribute("src")==e||p.getAttribute("data-webpack")==o+n){u=p;break}}u||(a=!0,(u=document.createElement("script")).charset="utf-8",u.timeout=120,s.nc&&u.setAttribute("nonce",s.nc),u.setAttribute("data-webpack",o+n),u.src=e),r[e]=[t];var f=function(t,n){u.onerror=u.onload=null,clearTimeout(l);var o=r[e];if(delete r[e],u.parentNode&&u.parentNode.removeChild(u),o&&o.forEach((function(e){return e(n)})),t)return t(n)},l=setTimeout(f.bind(null,void 0,{type:"timeout",target:u}),12e4);u.onerror=f.bind(null,u.onerror),u.onload=f.bind(null,u.onload),a&&document.head.appendChild(u)}},s.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},s.nmd=function(e){return e.paths=[],e.children||(e.children=[]),e},s.j=8562,function(){var e;s.g.importScripts&&(e=s.g.location+"");var t=s.g.document;if(!e&&t&&(t.currentScript&&(e=t.currentScript.src),!e)){var r=t.getElementsByTagName("script");r.length&&(e=r[r.length-1].src)}if(!e)throw new Error("Automatic publicPath is not supported in this browser");e=e.replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),s.p=e}(),function(){s.b=document.baseURI||self.location.href;var e={8562:0};s.f.j=function(t,r){var n=s.o(e,t)?e[t]:void 0;if(0!==n)if(n)r.push(n[2]);else{var o=new Promise((function(r,o){n=e[t]=[r,o]}));r.push(n[2]=o);var i=s.p+s.u(t),u=new Error;s.l(i,(function(r){if(s.o(e,t)&&(0!==(n=e[t])&&(e[t]=void 0),n)){var o=r&&("load"===r.type?"missing":r.type),i=r&&r.target&&r.target.src;u.message="Loading chunk "+t+" failed.\n("+o+": "+i+")",u.name="ChunkLoadError",u.type=o,u.request=i,n[1](u)}}),"chunk-"+t,t)}},s.O.j=function(t){return 0===e[t]};var t=function(t,r){var n,o,i=r[0],u=r[1],a=r[2],c=0;if(i.some((function(t){return 0!==e[t]}))){for(n in u)s.o(u,n)&&(s.m[n]=u[n]);if(a)var d=a(s)}for(t&&t(r);c<i.length;c++)o=i[c],s.o(e,o)&&e[o]&&e[o][0](),e[o]=0;return s.O(d)},r=self.webpackChunknextcloud=self.webpackChunknextcloud||[];r.forEach(t.bind(null,0)),r.push=t.bind(null,r.push.bind(r))}(),s.nc=void 0;var a=s.O(void 0,[7874],(function(){return s(78778)}));a=s.O(a)}(); +//# sourceMappingURL=settings-vue-settings-apps-users-management.js.map?v=93cc944de2be12e7244d
\ No newline at end of file diff --git a/dist/settings-vue-settings-apps-users-management.js.map b/dist/settings-vue-settings-apps-users-management.js.map index 5815901d32f..7b00fe0951a 100644 --- a/dist/settings-vue-settings-apps-users-management.js.map +++ b/dist/settings-vue-settings-apps-users-management.js.map @@ -1 +1 @@ -{"version":3,"file":"settings-vue-settings-apps-users-management.js?v=db422a6d7aab3272481a","mappings":"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","sources":["webpack:///nextcloud/webpack/runtime/chunk loaded","webpack:///nextcloud/webpack/runtime/load script","webpack:///nextcloud/apps/settings/src/App.vue?vue&type=script&lang=js&","webpack:///nextcloud/apps/settings/src/App.vue","webpack://nextcloud/./apps/settings/src/App.vue?536c","webpack:///nextcloud/apps/settings/src/App.vue?vue&type=template&id=50420604&","webpack:///nextcloud/apps/settings/src/router.js","webpack:///nextcloud/apps/settings/src/store/api.js","webpack:///nextcloud/apps/settings/src/logger.js","webpack:///nextcloud/apps/settings/src/store/users.js","webpack:///nextcloud/apps/settings/src/store/apps.js","webpack:///nextcloud/apps/settings/src/store/oc.js","webpack:///nextcloud/apps/settings/src/store/index.js","webpack:///nextcloud/apps/settings/src/store/settings.js","webpack:///nextcloud/apps/settings/src/main-apps-users-management.js","webpack:///nextcloud/webpack/bootstrap","webpack:///nextcloud/webpack/runtime/amd define","webpack:///nextcloud/webpack/runtime/amd options","webpack:///nextcloud/webpack/runtime/compat get default export","webpack:///nextcloud/webpack/runtime/define property getters","webpack:///nextcloud/webpack/runtime/ensure chunk","webpack:///nextcloud/webpack/runtime/get javascript chunk filename","webpack:///nextcloud/webpack/runtime/global","webpack:///nextcloud/webpack/runtime/hasOwnProperty shorthand","webpack:///nextcloud/webpack/runtime/make namespace object","webpack:///nextcloud/webpack/runtime/node module decorator","webpack:///nextcloud/webpack/runtime/runtimeId","webpack:///nextcloud/webpack/runtime/publicPath","webpack:///nextcloud/webpack/runtime/jsonp chunk loading","webpack:///nextcloud/webpack/runtime/nonce","webpack:///nextcloud/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = function(result, chunkIds, fn, priority) {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar chunkIds = deferred[i][0];\n\t\tvar fn = deferred[i][1];\n\t\tvar priority = deferred[i][2];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every(function(key) { return __webpack_require__.O[key](chunkIds[j]); })) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","var inProgress = {};\nvar dataWebpackPrefix = \"nextcloud:\";\n// loadScript function to load a script via script tag\n__webpack_require__.l = function(url, done, key, chunkId) {\n\tif(inProgress[url]) { inProgress[url].push(done); return; }\n\tvar script, needAttach;\n\tif(key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor(var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif(s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) { script = s; break; }\n\t\t}\n\t}\n\tif(!script) {\n\t\tneedAttach = true;\n\t\tscript = document.createElement('script');\n\n\t\tscript.charset = 'utf-8';\n\t\tscript.timeout = 120;\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n\t\tscript.src = url;\n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = function(prev, event) {\n\t\t// avoid mem leaks in IE.\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns && doneFns.forEach(function(fn) { return fn(event); });\n\t\tif(prev) return prev(event);\n\t}\n\t;\n\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};","import mod from \"-!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./App.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!./App.vue?vue&type=script&lang=js&\"","<!--\n - @copyright Copyright (c) 2018 John Molakvoæ <skjnldsv@protonmail.com>\n -\n - @author John Molakvoæ <skjnldsv@protonmail.com>\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<router-view />\n</template>\n\n<script>\nexport default {\n\tname: 'App',\n\tbeforeMount() {\n\t\t// importing server data into the store\n\t\tconst serverDataElmt = document.getElementById('serverData')\n\t\tif (serverDataElmt !== null) {\n\t\t\tthis.$store.commit('setServerData', JSON.parse(document.getElementById('serverData').dataset.server))\n\t\t}\n\t},\n}\n</script>\n","import { render, staticRenderFns } from \"./App.vue?vue&type=template&id=50420604&\"\nimport script from \"./App.vue?vue&type=script&lang=js&\"\nexport * from \"./App.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('router-view')}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","/**\n * @copyright Copyright (c) 2018 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n * @author Julius Härtl <jus@bitgrid.net>\n * @author Roeland Jago Douma <roeland@famdouma.nl>\n *\n * @license AGPL-3.0-or-later\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\nimport Vue from 'vue'\nimport Router from 'vue-router'\nimport { generateUrl } from '@nextcloud/router'\n\n// Dynamic loading\nconst Users = () => import(/* webpackChunkName: 'settings-users' */'./views/Users')\nconst Apps = () => import(/* webpackChunkName: 'settings-apps-view' */'./views/Apps')\n\nVue.use(Router)\n\n/*\n * This is the list of routes where the vuejs app will\n * take over php to provide data\n * You need to forward the php routing (routes.php) to\n * the settings-vue template, where the vue-router will\n * ensure the proper route.\n * ⚠️ Routes needs to match the php routes.\n */\n\nexport default new Router({\n\tmode: 'history',\n\t// if index.php is in the url AND we got this far, then it's working:\n\t// let's keep using index.php in the url\n\tbase: generateUrl(''),\n\tlinkActiveClass: 'active',\n\troutes: [\n\t\t{\n\t\t\tpath: '/:index(index.php/)?settings/users',\n\t\t\tcomponent: Users,\n\t\t\tprops: true,\n\t\t\tname: 'users',\n\t\t\tchildren: [\n\t\t\t\t{\n\t\t\t\t\tpath: ':selectedGroup',\n\t\t\t\t\tname: 'group',\n\t\t\t\t\tcomponent: Users,\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t\t{\n\t\t\tpath: '/:index(index.php/)?settings/apps',\n\t\t\tcomponent: Apps,\n\t\t\tprops: true,\n\t\t\tname: 'apps',\n\t\t\tchildren: [\n\t\t\t\t{\n\t\t\t\t\tpath: ':category',\n\t\t\t\t\tname: 'apps-category',\n\t\t\t\t\tcomponent: Apps,\n\t\t\t\t\tchildren: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpath: ':id',\n\t\t\t\t\t\t\tname: 'apps-details',\n\t\t\t\t\t\t\tcomponent: Apps,\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t],\n})\n","/**\n * @copyright Copyright (c) 2018 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author Christoph Wurst <christoph@winzerhof-wurst.at>\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n * @author Julius Härtl <jus@bitgrid.net>\n * @author Roeland Jago Douma <roeland@famdouma.nl>\n * @author Sujith Haridasan <sujith.h@gmail.com>\n *\n * @license AGPL-3.0-or-later\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\nimport axios from '@nextcloud/axios'\nimport { confirmPassword } from '@nextcloud/password-confirmation'\nimport '@nextcloud/password-confirmation/dist/style.css'\n\nconst sanitize = function(url) {\n\treturn url.replace(/\\/$/, '') // Remove last url slash\n}\n\nexport default {\n\n\t/**\n\t * This Promise is used to chain a request that require an admin password confirmation\n\t * Since chaining Promise have a very precise behavior concerning catch and then,\n\t * you'll need to be careful when using it.\n\t * e.g\n\t * // store\n\t * action(context) {\n\t * return api.requireAdmin().then((response) => {\n\t * return api.get('url')\n\t * .then((response) => {API success})\n\t * .catch((error) => {API failure});\n\t * }).catch((error) => {requireAdmin failure});\n\t * }\n\t * // vue\n\t * this.$store.dispatch('action').then(() => {always executed})\n\t *\n\t * Since Promise.then().catch().then() will always execute the last then\n\t * this.$store.dispatch('action').then will always be executed\n\t *\n\t * If you want requireAdmin failure to also catch the API request failure\n\t * you will need to throw a new error in the api.get.catch()\n\t *\n\t * e.g\n\t * api.requireAdmin().then((response) => {\n\t * api.get('url')\n\t * .then((response) => {API success})\n\t * .catch((error) => {throw error;});\n\t * }).catch((error) => {requireAdmin OR API failure});\n\t *\n\t * @return {Promise}\n\t */\n\trequireAdmin() {\n\t\treturn confirmPassword()\n\t},\n\tget(url, options) {\n\t\treturn axios.get(sanitize(url), options)\n\t},\n\tpost(url, data) {\n\t\treturn axios.post(sanitize(url), data)\n\t},\n\tpatch(url, data) {\n\t\treturn axios.patch(sanitize(url), data)\n\t},\n\tput(url, data) {\n\t\treturn axios.put(sanitize(url), data)\n\t},\n\tdelete(url, data) {\n\t\treturn axios.delete(sanitize(url), { params: data })\n\t},\n}\n","/**\n * @copyright 2020 Christoph Wurst <christoph@winzerhof-wurst.at>\n *\n * @author Roeland Jago Douma <roeland@famdouma.nl>\n *\n * @license AGPL-3.0-or-later\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\nimport { getLoggerBuilder } from '@nextcloud/logger'\n\nexport default getLoggerBuilder()\n\t.setApp('settings')\n\t.detectUser()\n\t.build()\n","/**\n * @copyright Copyright (c) 2018 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author Arthur Schiwon <blizzz@arthur-schiwon.de>\n * @author Christoph Wurst <christoph@winzerhof-wurst.at>\n * @author Daniel Calviño Sánchez <danxuliu@gmail.com>\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n * @author Julius Härtl <jus@bitgrid.net>\n * @author Roeland Jago Douma <roeland@famdouma.nl>\n * @author Vincent Petry <vincent@nextcloud.com>\n *\n * @license AGPL-3.0-or-later\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\nimport api from './api'\nimport axios from '@nextcloud/axios'\nimport { generateOcsUrl } from '@nextcloud/router'\nimport logger from '../logger'\n\nconst orderGroups = function(groups, orderBy) {\n\t/* const SORT_USERCOUNT = 1;\n\t * const SORT_GROUPNAME = 2;\n\t * https://github.com/nextcloud/server/blob/208e38e84e1a07a49699aa90dc5b7272d24489f0/lib/private/Group/MetaData.php#L34\n\t */\n\tif (orderBy === 1) {\n\t\treturn groups.sort((a, b) => a.usercount - a.disabled < b.usercount - b.disabled)\n\t} else {\n\t\treturn groups.sort((a, b) => a.name.localeCompare(b.name))\n\t}\n}\n\nconst defaults = {\n\tgroup: {\n\t\tid: '',\n\t\tname: '',\n\t\tusercount: 0,\n\t\tdisabled: 0,\n\t\tcanAdd: true,\n\t\tcanRemove: true,\n\t},\n}\n\nconst state = {\n\tusers: [],\n\tgroups: [],\n\torderBy: 1,\n\tminPasswordLength: 0,\n\tusersOffset: 0,\n\tusersLimit: 25,\n\tuserCount: 0,\n}\n\nconst mutations = {\n\tappendUsers(state, usersObj) {\n\t\t// convert obj to array\n\t\tconst users = state.users.concat(Object.keys(usersObj).map(userid => usersObj[userid]))\n\t\tstate.usersOffset += state.usersLimit\n\t\tstate.users = users\n\t},\n\tsetPasswordPolicyMinLength(state, length) {\n\t\tstate.minPasswordLength = length !== '' ? length : 0\n\t},\n\tinitGroups(state, { groups, orderBy, userCount }) {\n\t\tstate.groups = groups.map(group => Object.assign({}, defaults.group, group))\n\t\tstate.orderBy = orderBy\n\t\tstate.userCount = userCount\n\t\tstate.groups = orderGroups(state.groups, state.orderBy)\n\n\t},\n\taddGroup(state, { gid, displayName }) {\n\t\ttry {\n\t\t\tif (typeof state.groups.find((group) => group.id === gid) !== 'undefined') {\n\t\t\t\treturn\n\t\t\t}\n\t\t\t// extend group to default values\n\t\t\tconst group = Object.assign({}, defaults.group, {\n\t\t\t\tid: gid,\n\t\t\t\tname: displayName,\n\t\t\t})\n\t\t\tstate.groups.push(group)\n\t\t\tstate.groups = orderGroups(state.groups, state.orderBy)\n\t\t} catch (e) {\n\t\t\tconsole.error('Can\\'t create group', e)\n\t\t}\n\t},\n\trenameGroup(state, { gid, displayName }) {\n\t\tconst groupIndex = state.groups.findIndex(groupSearch => groupSearch.id === gid)\n\t\tif (groupIndex >= 0) {\n\t\t\tconst updatedGroup = state.groups[groupIndex]\n\t\t\tupdatedGroup.name = displayName\n\t\t\tstate.groups.splice(groupIndex, 1, updatedGroup)\n\t\t\tstate.groups = orderGroups(state.groups, state.orderBy)\n\t\t}\n\t},\n\tremoveGroup(state, gid) {\n\t\tconst groupIndex = state.groups.findIndex(groupSearch => groupSearch.id === gid)\n\t\tif (groupIndex >= 0) {\n\t\t\tstate.groups.splice(groupIndex, 1)\n\t\t}\n\t},\n\taddUserGroup(state, { userid, gid }) {\n\t\tconst group = state.groups.find(groupSearch => groupSearch.id === gid)\n\t\tconst user = state.users.find(user => user.id === userid)\n\t\t// increase count if user is enabled\n\t\tif (group && user.enabled && state.userCount > 0) {\n\t\t\tgroup.usercount++\n\t\t}\n\t\tconst groups = user.groups\n\t\tgroups.push(gid)\n\t\tstate.groups = orderGroups(state.groups, state.orderBy)\n\t},\n\tremoveUserGroup(state, { userid, gid }) {\n\t\tconst group = state.groups.find(groupSearch => groupSearch.id === gid)\n\t\tconst user = state.users.find(user => user.id === userid)\n\t\t// lower count if user is enabled\n\t\tif (group && user.enabled && state.userCount > 0) {\n\t\t\tgroup.usercount--\n\t\t}\n\t\tconst groups = user.groups\n\t\tgroups.splice(groups.indexOf(gid), 1)\n\t\tstate.groups = orderGroups(state.groups, state.orderBy)\n\t},\n\taddUserSubAdmin(state, { userid, gid }) {\n\t\tconst groups = state.users.find(user => user.id === userid).subadmin\n\t\tgroups.push(gid)\n\t},\n\tremoveUserSubAdmin(state, { userid, gid }) {\n\t\tconst groups = state.users.find(user => user.id === userid).subadmin\n\t\tgroups.splice(groups.indexOf(gid), 1)\n\t},\n\tdeleteUser(state, userid) {\n\t\tconst userIndex = state.users.findIndex(user => user.id === userid)\n\t\tthis.commit('updateUserCounts', { user: state.users[userIndex], actionType: 'remove' })\n\t\tstate.users.splice(userIndex, 1)\n\t},\n\taddUserData(state, response) {\n\t\tconst user = response.data.ocs.data\n\t\tstate.users.push(user)\n\t\tthis.commit('updateUserCounts', { user, actionType: 'create' })\n\t},\n\tenableDisableUser(state, { userid, enabled }) {\n\t\tconst user = state.users.find(user => user.id === userid)\n\t\tuser.enabled = enabled\n\t\tthis.commit('updateUserCounts', { user, actionType: enabled ? 'enable' : 'disable' })\n\t},\n\t// update active/disabled counts, groups counts\n\tupdateUserCounts(state, { user, actionType }) {\n\t\tconst disabledGroup = state.groups.find(group => group.id === 'disabled')\n\t\tswitch (actionType) {\n\t\tcase 'enable':\n\t\tcase 'disable':\n\t\t\tdisabledGroup.usercount += user.enabled ? -1 : 1 // update Disabled Users count\n\t\t\tstate.userCount += user.enabled ? 1 : -1 // update Active Users count\n\t\t\tuser.groups.forEach(userGroup => {\n\t\t\t\tconst group = state.groups.find(groupSearch => groupSearch.id === userGroup)\n\t\t\t\tgroup.disabled += user.enabled ? -1 : 1 // update group disabled count\n\t\t\t})\n\t\t\tbreak\n\t\tcase 'create':\n\t\t\tstate.userCount++ // increment Active Users count\n\n\t\t\tuser.groups.forEach(userGroup => {\n\t\t\t\tstate.groups\n\t\t\t\t\t.find(groupSearch => groupSearch.id === userGroup)\n\t\t\t\t .usercount++ // increment group total count\n\t\t\t})\n\t\t\tbreak\n\t\tcase 'remove':\n\t\t\tif (user.enabled) {\n\t\t\t\tstate.userCount-- // decrement Active Users count\n\t\t\t\tuser.groups.forEach(userGroup => {\n\t\t\t\t\tconst group = state.groups.find(groupSearch => groupSearch.id === userGroup)\n\t\t\t\t\tgroup.usercount-- // decrement group total count\n\t\t\t\t})\n\t\t\t} else {\n\t\t\t\tdisabledGroup.usercount-- // decrement Disabled Users count\n\t\t\t\tuser.groups.forEach(userGroup => {\n\t\t\t\t\tconst group = state.groups.find(groupSearch => groupSearch.id === userGroup)\n\t\t\t\t\tgroup.disabled-- // decrement group disabled count\n\t\t\t\t})\n\t\t\t}\n\t\t\tbreak\n\t\tdefault:\n\t\t\tlogger.error(`Unknown action type in updateUserCounts: '${actionType}'`)\n\t\t\t// not throwing error to interrupt execution as this is not fatal\n\t\t}\n\t},\n\tsetUserData(state, { userid, key, value }) {\n\t\tif (key === 'quota') {\n\t\t\tconst humanValue = OC.Util.computerFileSize(value)\n\t\t\tstate.users.find(user => user.id === userid)[key][key] = humanValue !== null ? humanValue : value\n\t\t} else {\n\t\t\tstate.users.find(user => user.id === userid)[key] = value\n\t\t}\n\t},\n\n\t/**\n\t * Reset users list\n\t *\n\t * @param {object} state the store state\n\t */\n\tresetUsers(state) {\n\t\tstate.users = []\n\t\tstate.usersOffset = 0\n\t},\n}\n\nconst getters = {\n\tgetUsers(state) {\n\t\treturn state.users\n\t},\n\tgetGroups(state) {\n\t\treturn state.groups\n\t},\n\tgetSubadminGroups(state) {\n\t\t// Can't be subadmin of admin or disabled\n\t\treturn state.groups.filter(group => group.id !== 'admin' && group.id !== 'disabled')\n\t},\n\tgetPasswordPolicyMinLength(state) {\n\t\treturn state.minPasswordLength\n\t},\n\tgetUsersOffset(state) {\n\t\treturn state.usersOffset\n\t},\n\tgetUsersLimit(state) {\n\t\treturn state.usersLimit\n\t},\n\tgetUserCount(state) {\n\t\treturn state.userCount\n\t},\n}\n\nconst CancelToken = axios.CancelToken\nlet searchRequestCancelSource = null\n\nconst actions = {\n\n\t/**\n\t * Get all users with full details\n\t *\n\t * @param {object} context store context\n\t * @param {object} options destructuring object\n\t * @param {number} options.offset List offset to request\n\t * @param {number} options.limit List number to return from offset\n\t * @param {string} options.search Search amongst users\n\t * @param {string} options.group Get users from group\n\t * @return {Promise}\n\t */\n\tgetUsers(context, { offset, limit, search, group }) {\n\t\tif (searchRequestCancelSource) {\n\t\t\tsearchRequestCancelSource.cancel('Operation canceled by another search request.')\n\t\t}\n\t\tsearchRequestCancelSource = CancelToken.source()\n\t\tsearch = typeof search === 'string' ? search : ''\n\t\tgroup = typeof group === 'string' ? group : ''\n\t\tif (group !== '') {\n\t\t\treturn api.get(generateOcsUrl('cloud/groups/{group}/users/details?offset={offset}&limit={limit}&search={search}', { group: encodeURIComponent(group), offset, limit, search }), {\n\t\t\t\tcancelToken: searchRequestCancelSource.token,\n\t\t\t})\n\t\t\t\t.then((response) => {\n\t\t\t\t\tconst usersCount = Object.keys(response.data.ocs.data.users).length\n\t\t\t\t\tif (usersCount > 0) {\n\t\t\t\t\t\tcontext.commit('appendUsers', response.data.ocs.data.users)\n\t\t\t\t\t}\n\t\t\t\t\treturn usersCount\n\t\t\t\t})\n\t\t\t\t.catch((error) => {\n\t\t\t\t\tif (!axios.isCancel(error)) {\n\t\t\t\t\t\tcontext.commit('API_FAILURE', error)\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t}\n\n\t\treturn api.get(generateOcsUrl('cloud/users/details?offset={offset}&limit={limit}&search={search}', { offset, limit, search }), {\n\t\t\tcancelToken: searchRequestCancelSource.token,\n\t\t})\n\t\t\t.then((response) => {\n\t\t\t\tconst usersCount = Object.keys(response.data.ocs.data.users).length\n\t\t\t\tif (usersCount > 0) {\n\t\t\t\t\tcontext.commit('appendUsers', response.data.ocs.data.users)\n\t\t\t\t}\n\t\t\t\treturn usersCount\n\t\t\t})\n\t\t\t.catch((error) => {\n\t\t\t\tif (!axios.isCancel(error)) {\n\t\t\t\t\tcontext.commit('API_FAILURE', error)\n\t\t\t\t}\n\t\t\t})\n\t},\n\n\tgetGroups(context, { offset, limit, search }) {\n\t\tsearch = typeof search === 'string' ? search : ''\n\t\tconst limitParam = limit === -1 ? '' : `&limit=${limit}`\n\t\treturn api.get(generateOcsUrl('cloud/groups?offset={offset}&search={search}', { offset, search }) + limitParam)\n\t\t\t.then((response) => {\n\t\t\t\tif (Object.keys(response.data.ocs.data.groups).length > 0) {\n\t\t\t\t\tresponse.data.ocs.data.groups.forEach(function(group) {\n\t\t\t\t\t\tcontext.commit('addGroup', { gid: group, displayName: group })\n\t\t\t\t\t})\n\t\t\t\t\treturn true\n\t\t\t\t}\n\t\t\t\treturn false\n\t\t\t})\n\t\t\t.catch((error) => context.commit('API_FAILURE', error))\n\t},\n\n\t/**\n\t * Get all users with full details\n\t *\n\t * @param {object} context store context\n\t * @param {object} options destructuring object\n\t * @param {number} options.offset List offset to request\n\t * @param {number} options.limit List number to return from offset\n\t * @param {string} options.search -\n\t * @return {Promise}\n\t */\n\tgetUsersFromList(context, { offset, limit, search }) {\n\t\tsearch = typeof search === 'string' ? search : ''\n\t\treturn api.get(generateOcsUrl('cloud/users/details?offset={offset}&limit={limit}&search={search}', { offset, limit, search }))\n\t\t\t.then((response) => {\n\t\t\t\tif (Object.keys(response.data.ocs.data.users).length > 0) {\n\t\t\t\t\tcontext.commit('appendUsers', response.data.ocs.data.users)\n\t\t\t\t\treturn true\n\t\t\t\t}\n\t\t\t\treturn false\n\t\t\t})\n\t\t\t.catch((error) => context.commit('API_FAILURE', error))\n\t},\n\n\t/**\n\t * Get all users with full details from a groupid\n\t *\n\t * @param {object} context store context\n\t * @param {object} options destructuring object\n\t * @param {number} options.offset List offset to request\n\t * @param {number} options.limit List number to return from offset\n\t * @param {string} options.groupid -\n\t * @return {Promise}\n\t */\n\tgetUsersFromGroup(context, { groupid, offset, limit }) {\n\t\treturn api.get(generateOcsUrl('cloud/users/{groupId}/details?offset={offset}&limit={limit}', { groupId: encodeURIComponent(groupid), offset, limit }))\n\t\t\t.then((response) => context.commit('getUsersFromList', response.data.ocs.data.users))\n\t\t\t.catch((error) => context.commit('API_FAILURE', error))\n\t},\n\n\tgetPasswordPolicyMinLength(context) {\n\t\tif (OC.getCapabilities().password_policy && OC.getCapabilities().password_policy.minLength) {\n\t\t\tcontext.commit('setPasswordPolicyMinLength', OC.getCapabilities().password_policy.minLength)\n\t\t\treturn OC.getCapabilities().password_policy.minLength\n\t\t}\n\t\treturn false\n\t},\n\n\t/**\n\t * Add group\n\t *\n\t * @param {object} context store context\n\t * @param {string} gid Group id\n\t * @return {Promise}\n\t */\n\taddGroup(context, gid) {\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\treturn api.post(generateOcsUrl('cloud/groups'), { groupid: gid })\n\t\t\t\t.then((response) => {\n\t\t\t\t\tcontext.commit('addGroup', { gid, displayName: gid })\n\t\t\t\t\treturn { gid, displayName: gid }\n\t\t\t\t})\n\t\t\t\t.catch((error) => { throw error })\n\t\t}).catch((error) => {\n\t\t\tcontext.commit('API_FAILURE', { gid, error })\n\t\t\t// let's throw one more time to prevent the view\n\t\t\t// from adding the user to a group that doesn't exists\n\t\t\tthrow error\n\t\t})\n\t},\n\n\t/**\n\t * Rename group\n\t *\n\t * @param {object} context store context\n\t * @param {string} groupid Group id\n\t * @param {string} displayName Group display name\n\t * @return {Promise}\n\t */\n\trenameGroup(context, { groupid, displayName }) {\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\treturn api.put(generateOcsUrl('cloud/groups/{groupId}', { groupId: encodeURIComponent(groupid) }), { key: 'displayname', value: displayName })\n\t\t\t\t.then((response) => {\n\t\t\t\t\tcontext.commit('renameGroup', { gid: groupid, displayName })\n\t\t\t\t\treturn { groupid, displayName }\n\t\t\t\t})\n\t\t\t\t.catch((error) => { throw error })\n\t\t}).catch((error) => {\n\t\t\tcontext.commit('API_FAILURE', { groupid, error })\n\t\t\t// let's throw one more time to prevent the view\n\t\t\t// from renaming the group\n\t\t\tthrow error\n\t\t})\n\t},\n\n\t/**\n\t * Remove group\n\t *\n\t * @param {object} context store context\n\t * @param {string} gid Group id\n\t * @return {Promise}\n\t */\n\tremoveGroup(context, gid) {\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\treturn api.delete(generateOcsUrl('cloud/groups/{groupId}', { groupId: encodeURIComponent(gid) }))\n\t\t\t\t.then((response) => context.commit('removeGroup', gid))\n\t\t\t\t.catch((error) => { throw error })\n\t\t}).catch((error) => context.commit('API_FAILURE', { gid, error }))\n\t},\n\n\t/**\n\t * Add user to group\n\t *\n\t * @param {object} context store context\n\t * @param {object} options destructuring object\n\t * @param {string} options.userid User id\n\t * @param {string} options.gid Group id\n\t * @return {Promise}\n\t */\n\taddUserGroup(context, { userid, gid }) {\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\treturn api.post(generateOcsUrl('cloud/users/{userid}/groups', { userid }), { groupid: gid })\n\t\t\t\t.then((response) => context.commit('addUserGroup', { userid, gid }))\n\t\t\t\t.catch((error) => { throw error })\n\t\t}).catch((error) => context.commit('API_FAILURE', { userid, error }))\n\t},\n\n\t/**\n\t * Remove user from group\n\t *\n\t * @param {object} context store context\n\t * @param {object} options destructuring object\n\t * @param {string} options.userid User id\n\t * @param {string} options.gid Group id\n\t * @return {Promise}\n\t */\n\tremoveUserGroup(context, { userid, gid }) {\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\treturn api.delete(generateOcsUrl('cloud/users/{userid}/groups', { userid }), { groupid: gid })\n\t\t\t\t.then((response) => context.commit('removeUserGroup', { userid, gid }))\n\t\t\t\t.catch((error) => { throw error })\n\t\t}).catch((error) => {\n\t\t\tcontext.commit('API_FAILURE', { userid, error })\n\t\t\t// let's throw one more time to prevent\n\t\t\t// the view from removing the user row on failure\n\t\t\tthrow error\n\t\t})\n\t},\n\n\t/**\n\t * Add user to group admin\n\t *\n\t * @param {object} context store context\n\t * @param {object} options destructuring object\n\t * @param {string} options.userid User id\n\t * @param {string} options.gid Group id\n\t * @return {Promise}\n\t */\n\taddUserSubAdmin(context, { userid, gid }) {\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\treturn api.post(generateOcsUrl('cloud/users/{userid}/subadmins', { userid }), { groupid: gid })\n\t\t\t\t.then((response) => context.commit('addUserSubAdmin', { userid, gid }))\n\t\t\t\t.catch((error) => { throw error })\n\t\t}).catch((error) => context.commit('API_FAILURE', { userid, error }))\n\t},\n\n\t/**\n\t * Remove user from group admin\n\t *\n\t * @param {object} context store context\n\t * @param {object} options destructuring object\n\t * @param {string} options.userid User id\n\t * @param {string} options.gid Group id\n\t * @return {Promise}\n\t */\n\tremoveUserSubAdmin(context, { userid, gid }) {\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\treturn api.delete(generateOcsUrl('cloud/users/{userid}/subadmins', { userid }), { groupid: gid })\n\t\t\t\t.then((response) => context.commit('removeUserSubAdmin', { userid, gid }))\n\t\t\t\t.catch((error) => { throw error })\n\t\t}).catch((error) => context.commit('API_FAILURE', { userid, error }))\n\t},\n\n\t/**\n\t * Mark all user devices for remote wipe\n\t *\n\t * @param {object} context store context\n\t * @param {string} userid User id\n\t * @return {Promise}\n\t */\n\twipeUserDevices(context, userid) {\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\treturn api.post(generateOcsUrl('cloud/users/{userid}/wipe', { userid }))\n\t\t\t\t.catch((error) => { throw error })\n\t\t}).catch((error) => context.commit('API_FAILURE', { userid, error }))\n\t},\n\n\t/**\n\t * Delete a user\n\t *\n\t * @param {object} context store context\n\t * @param {string} userid User id\n\t * @return {Promise}\n\t */\n\tdeleteUser(context, userid) {\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\treturn api.delete(generateOcsUrl('cloud/users/{userid}', { userid }))\n\t\t\t\t.then((response) => context.commit('deleteUser', userid))\n\t\t\t\t.catch((error) => { throw error })\n\t\t}).catch((error) => context.commit('API_FAILURE', { userid, error }))\n\t},\n\n\t/**\n\t * Add a user\n\t *\n\t * @param {object} context store context\n\t * @param {Function} context.commit -\n\t * @param {Function} context.dispatch -\n\t * @param {object} options destructuring object\n\t * @param {string} options.userid User id\n\t * @param {string} options.password User password\n\t * @param {string} options.displayName User display name\n\t * @param {string} options.email User email\n\t * @param {string} options.groups User groups\n\t * @param {string} options.subadmin User subadmin groups\n\t * @param {string} options.quota User email\n\t * @param {string} options.language User language\n\t * @return {Promise}\n\t */\n\taddUser({ commit, dispatch }, { userid, password, displayName, email, groups, subadmin, quota, language }) {\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\treturn api.post(generateOcsUrl('cloud/users'), { userid, password, displayName, email, groups, subadmin, quota, language })\n\t\t\t\t.then((response) => dispatch('addUserData', userid || response.data.ocs.data.id))\n\t\t\t\t.catch((error) => { throw error })\n\t\t}).catch((error) => {\n\t\t\tcommit('API_FAILURE', { userid, error })\n\t\t\tthrow error\n\t\t})\n\t},\n\n\t/**\n\t * Get user data and commit addition\n\t *\n\t * @param {object} context store context\n\t * @param {string} userid User id\n\t * @return {Promise}\n\t */\n\taddUserData(context, userid) {\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\treturn api.get(generateOcsUrl('cloud/users/{userid}', { userid }))\n\t\t\t\t.then((response) => context.commit('addUserData', response))\n\t\t\t\t.catch((error) => { throw error })\n\t\t}).catch((error) => context.commit('API_FAILURE', { userid, error }))\n\t},\n\n\t/**\n\t * Enable or disable user\n\t *\n\t * @param {object} context store context\n\t * @param {object} options destructuring object\n\t * @param {string} options.userid User id\n\t * @param {boolean} options.enabled User enablement status\n\t * @return {Promise}\n\t */\n\tenableDisableUser(context, { userid, enabled = true }) {\n\t\tconst userStatus = enabled ? 'enable' : 'disable'\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\treturn api.put(generateOcsUrl('cloud/users/{userid}/{userStatus}', { userid, userStatus }))\n\t\t\t\t.then((response) => context.commit('enableDisableUser', { userid, enabled }))\n\t\t\t\t.catch((error) => { throw error })\n\t\t}).catch((error) => context.commit('API_FAILURE', { userid, error }))\n\t},\n\n\t/**\n\t * Edit user data\n\t *\n\t * @param {object} context store context\n\t * @param {object} options destructuring object\n\t * @param {string} options.userid User id\n\t * @param {string} options.key User field to edit\n\t * @param {string} options.value Value of the change\n\t * @return {Promise}\n\t */\n\tsetUserData(context, { userid, key, value }) {\n\t\tconst allowedEmpty = ['email', 'displayname']\n\t\tif (['email', 'language', 'quota', 'displayname', 'password'].indexOf(key) !== -1) {\n\t\t\t// We allow empty email or displayname\n\t\t\tif (typeof value === 'string'\n\t\t\t\t&& (\n\t\t\t\t\t(allowedEmpty.indexOf(key) === -1 && value.length > 0)\n\t\t\t\t\t|| allowedEmpty.indexOf(key) !== -1\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\treturn api.requireAdmin().then((response) => {\n\t\t\t\t\treturn api.put(generateOcsUrl('cloud/users/{userid}', { userid }), { key, value })\n\t\t\t\t\t\t.then((response) => context.commit('setUserData', { userid, key, value }))\n\t\t\t\t\t\t.catch((error) => { throw error })\n\t\t\t\t}).catch((error) => context.commit('API_FAILURE', { userid, error }))\n\t\t\t}\n\t\t}\n\t\treturn Promise.reject(new Error('Invalid request data'))\n\t},\n\n\t/**\n\t * Send welcome mail\n\t *\n\t * @param {object} context store context\n\t * @param {string} userid User id\n\t * @return {Promise}\n\t */\n\tsendWelcomeMail(context, userid) {\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\treturn api.post(generateOcsUrl('cloud/users/{userid}/welcome', { userid }))\n\t\t\t\t.then(response => true)\n\t\t\t\t.catch((error) => { throw error })\n\t\t}).catch((error) => context.commit('API_FAILURE', { userid, error }))\n\t},\n}\n\nexport default { state, mutations, getters, actions }\n","/**\n * @copyright Copyright (c) 2018 Julius Härtl <jus@bitgrid.net>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n * @author Julius Härtl <jus@bitgrid.net>\n * @author Roeland Jago Douma <roeland@famdouma.nl>\n *\n * @license AGPL-3.0-or-later\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\nimport api from './api'\nimport Vue from 'vue'\nimport { generateUrl } from '@nextcloud/router'\nimport { showError, showInfo } from '@nextcloud/dialogs'\nimport '@nextcloud/dialogs/styles/toast.scss'\n\nconst state = {\n\tapps: [],\n\tcategories: [],\n\tupdateCount: 0,\n\tloading: {},\n\tloadingList: false,\n}\n\nconst mutations = {\n\n\tAPPS_API_FAILURE(state, error) {\n\t\tshowError(t('settings', 'An error occurred during the request. Unable to proceed.') + '<br>' + error.error.response.data.data.message, { isHTML: true })\n\t\tconsole.error(state, error)\n\t},\n\n\tinitCategories(state, { categories, updateCount }) {\n\t\tstate.categories = categories\n\t\tstate.updateCount = updateCount\n\t},\n\n\tsetUpdateCount(state, updateCount) {\n\t\tstate.updateCount = updateCount\n\t},\n\n\taddCategory(state, category) {\n\t\tstate.categories.push(category)\n\t},\n\n\tappendCategories(state, categoriesArray) {\n\t\t// convert obj to array\n\t\tstate.categories = categoriesArray\n\t},\n\n\tsetAllApps(state, apps) {\n\t\tstate.apps = apps\n\t},\n\n\tsetError(state, { appId, error }) {\n\t\tif (!Array.isArray(appId)) {\n\t\t\tappId = [appId]\n\t\t}\n\t\tappId.forEach((_id) => {\n\t\t\tconst app = state.apps.find(app => app.id === _id)\n\t\t\tapp.error = error\n\t\t})\n\t},\n\n\tclearError(state, { appId, error }) {\n\t\tconst app = state.apps.find(app => app.id === appId)\n\t\tapp.error = null\n\t},\n\n\tenableApp(state, { appId, groups }) {\n\t\tconst app = state.apps.find(app => app.id === appId)\n\t\tapp.active = true\n\t\tapp.groups = groups\n\t},\n\n\tdisableApp(state, appId) {\n\t\tconst app = state.apps.find(app => app.id === appId)\n\t\tapp.active = false\n\t\tapp.groups = []\n\t\tif (app.removable) {\n\t\t\tapp.canUnInstall = true\n\t\t}\n\t},\n\n\tuninstallApp(state, appId) {\n\t\tstate.apps.find(app => app.id === appId).active = false\n\t\tstate.apps.find(app => app.id === appId).groups = []\n\t\tstate.apps.find(app => app.id === appId).needsDownload = true\n\t\tstate.apps.find(app => app.id === appId).installed = false\n\t\tstate.apps.find(app => app.id === appId).canUnInstall = false\n\t\tstate.apps.find(app => app.id === appId).canInstall = true\n\t},\n\n\tupdateApp(state, appId) {\n\t\tconst app = state.apps.find(app => app.id === appId)\n\t\tconst version = app.update\n\t\tapp.update = null\n\t\tapp.version = version\n\t\tstate.updateCount--\n\n\t},\n\n\tresetApps(state) {\n\t\tstate.apps = []\n\t},\n\treset(state) {\n\t\tstate.apps = []\n\t\tstate.categories = []\n\t\tstate.updateCount = 0\n\t},\n\tstartLoading(state, id) {\n\t\tif (Array.isArray(id)) {\n\t\t\tid.forEach((_id) => {\n\t\t\t\tVue.set(state.loading, _id, true)\n\t\t\t})\n\t\t} else {\n\t\t\tVue.set(state.loading, id, true)\n\t\t}\n\t},\n\tstopLoading(state, id) {\n\t\tif (Array.isArray(id)) {\n\t\t\tid.forEach((_id) => {\n\t\t\t\tVue.set(state.loading, _id, false)\n\t\t\t})\n\t\t} else {\n\t\t\tVue.set(state.loading, id, false)\n\t\t}\n\t},\n}\n\nconst getters = {\n\tloading(state) {\n\t\treturn function(id) {\n\t\t\treturn state.loading[id]\n\t\t}\n\t},\n\tgetCategories(state) {\n\t\treturn state.categories\n\t},\n\tgetAllApps(state) {\n\t\treturn state.apps\n\t},\n\tgetUpdateCount(state) {\n\t\treturn state.updateCount\n\t},\n}\n\nconst actions = {\n\n\tenableApp(context, { appId, groups }) {\n\t\tlet apps\n\t\tif (Array.isArray(appId)) {\n\t\t\tapps = appId\n\t\t} else {\n\t\t\tapps = [appId]\n\t\t}\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\tcontext.commit('startLoading', apps)\n\t\t\tcontext.commit('startLoading', 'install')\n\t\t\treturn api.post(generateUrl('settings/apps/enable'), { appIds: apps, groups })\n\t\t\t\t.then((response) => {\n\t\t\t\t\tcontext.commit('stopLoading', apps)\n\t\t\t\t\tcontext.commit('stopLoading', 'install')\n\t\t\t\t\tapps.forEach(_appId => {\n\t\t\t\t\t\tcontext.commit('enableApp', { appId: _appId, groups })\n\t\t\t\t\t})\n\n\t\t\t\t\t// check for server health\n\t\t\t\t\treturn api.get(generateUrl('apps/files'))\n\t\t\t\t\t\t.then(() => {\n\t\t\t\t\t\t\tif (response.data.update_required) {\n\t\t\t\t\t\t\t\tshowInfo(\n\t\t\t\t\t\t\t\t\tt(\n\t\t\t\t\t\t\t\t\t\t'settings',\n\t\t\t\t\t\t\t\t\t\t'The app has been enabled but needs to be updated. You will be redirected to the update page in 5 seconds.'\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tonClick: () => window.location.reload(),\n\t\t\t\t\t\t\t\t\t\tclose: false,\n\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\tsetTimeout(function() {\n\t\t\t\t\t\t\t\t\tlocation.reload()\n\t\t\t\t\t\t\t\t}, 5000)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.catch(() => {\n\t\t\t\t\t\t\tif (!Array.isArray(appId)) {\n\t\t\t\t\t\t\t\tcontext.commit('setError', {\n\t\t\t\t\t\t\t\t\tappId: apps,\n\t\t\t\t\t\t\t\t\terror: t('settings', 'Error: This app cannot be enabled because it makes the server unstable'),\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t})\n\t\t\t\t})\n\t\t\t\t.catch((error) => {\n\t\t\t\t\tcontext.commit('stopLoading', apps)\n\t\t\t\t\tcontext.commit('stopLoading', 'install')\n\t\t\t\t\tcontext.commit('setError', {\n\t\t\t\t\t\tappId: apps,\n\t\t\t\t\t\terror: error.response.data.data.message,\n\t\t\t\t\t})\n\t\t\t\t\tcontext.commit('APPS_API_FAILURE', { appId, error })\n\t\t\t\t})\n\t\t}).catch((error) => context.commit('API_FAILURE', { appId, error }))\n\t},\n\tforceEnableApp(context, { appId, groups }) {\n\t\tlet apps\n\t\tif (Array.isArray(appId)) {\n\t\t\tapps = appId\n\t\t} else {\n\t\t\tapps = [appId]\n\t\t}\n\t\treturn api.requireAdmin().then(() => {\n\t\t\tcontext.commit('startLoading', apps)\n\t\t\tcontext.commit('startLoading', 'install')\n\t\t\treturn api.post(generateUrl('settings/apps/force'), { appId })\n\t\t\t\t.then((response) => {\n\t\t\t\t\t// TODO: find a cleaner solution\n\t\t\t\t\tlocation.reload()\n\t\t\t\t})\n\t\t\t\t.catch((error) => {\n\t\t\t\t\tcontext.commit('stopLoading', apps)\n\t\t\t\t\tcontext.commit('stopLoading', 'install')\n\t\t\t\t\tcontext.commit('setError', {\n\t\t\t\t\t\tappId: apps,\n\t\t\t\t\t\terror: error.response.data.data.message,\n\t\t\t\t\t})\n\t\t\t\t\tcontext.commit('APPS_API_FAILURE', { appId, error })\n\t\t\t\t})\n\t\t}).catch((error) => context.commit('API_FAILURE', { appId, error }))\n\t},\n\tdisableApp(context, { appId }) {\n\t\tlet apps\n\t\tif (Array.isArray(appId)) {\n\t\t\tapps = appId\n\t\t} else {\n\t\t\tapps = [appId]\n\t\t}\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\tcontext.commit('startLoading', apps)\n\t\t\treturn api.post(generateUrl('settings/apps/disable'), { appIds: apps })\n\t\t\t\t.then((response) => {\n\t\t\t\t\tcontext.commit('stopLoading', apps)\n\t\t\t\t\tapps.forEach(_appId => {\n\t\t\t\t\t\tcontext.commit('disableApp', _appId)\n\t\t\t\t\t})\n\t\t\t\t\treturn true\n\t\t\t\t})\n\t\t\t\t.catch((error) => {\n\t\t\t\t\tcontext.commit('stopLoading', apps)\n\t\t\t\t\tcontext.commit('APPS_API_FAILURE', { appId, error })\n\t\t\t\t})\n\t\t}).catch((error) => context.commit('API_FAILURE', { appId, error }))\n\t},\n\tuninstallApp(context, { appId }) {\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\tcontext.commit('startLoading', appId)\n\t\t\treturn api.get(generateUrl(`settings/apps/uninstall/${appId}`))\n\t\t\t\t.then((response) => {\n\t\t\t\t\tcontext.commit('stopLoading', appId)\n\t\t\t\t\tcontext.commit('uninstallApp', appId)\n\t\t\t\t\treturn true\n\t\t\t\t})\n\t\t\t\t.catch((error) => {\n\t\t\t\t\tcontext.commit('stopLoading', appId)\n\t\t\t\t\tcontext.commit('APPS_API_FAILURE', { appId, error })\n\t\t\t\t})\n\t\t}).catch((error) => context.commit('API_FAILURE', { appId, error }))\n\t},\n\n\tupdateApp(context, { appId }) {\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\tcontext.commit('startLoading', appId)\n\t\t\tcontext.commit('startLoading', 'install')\n\t\t\treturn api.get(generateUrl(`settings/apps/update/${appId}`))\n\t\t\t\t.then((response) => {\n\t\t\t\t\tcontext.commit('stopLoading', 'install')\n\t\t\t\t\tcontext.commit('stopLoading', appId)\n\t\t\t\t\tcontext.commit('updateApp', appId)\n\t\t\t\t\treturn true\n\t\t\t\t})\n\t\t\t\t.catch((error) => {\n\t\t\t\t\tcontext.commit('stopLoading', appId)\n\t\t\t\t\tcontext.commit('stopLoading', 'install')\n\t\t\t\t\tcontext.commit('APPS_API_FAILURE', { appId, error })\n\t\t\t\t})\n\t\t}).catch((error) => context.commit('API_FAILURE', { appId, error }))\n\t},\n\n\tgetAllApps(context) {\n\t\tcontext.commit('startLoading', 'list')\n\t\treturn api.get(generateUrl('settings/apps/list'))\n\t\t\t.then((response) => {\n\t\t\t\tcontext.commit('setAllApps', response.data.apps)\n\t\t\t\tcontext.commit('stopLoading', 'list')\n\t\t\t\treturn true\n\t\t\t})\n\t\t\t.catch((error) => context.commit('API_FAILURE', error))\n\t},\n\n\tgetCategories(context) {\n\t\tcontext.commit('startLoading', 'categories')\n\t\treturn api.get(generateUrl('settings/apps/categories'))\n\t\t\t.then((response) => {\n\t\t\t\tif (response.data.length > 0) {\n\t\t\t\t\tcontext.commit('appendCategories', response.data)\n\t\t\t\t\tcontext.commit('stopLoading', 'categories')\n\t\t\t\t\treturn true\n\t\t\t\t}\n\t\t\t\treturn false\n\t\t\t})\n\t\t\t.catch((error) => context.commit('API_FAILURE', error))\n\t},\n\n}\n\nexport default { state, mutations, getters, actions }\n","/**\n * @copyright Copyright (c) 2018 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n * @author Roeland Jago Douma <roeland@famdouma.nl>\n *\n * @license AGPL-3.0-or-later\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\nimport api from './api'\nimport { generateOcsUrl } from '@nextcloud/router'\n\nconst state = {}\nconst mutations = {}\nconst getters = {}\nconst actions = {\n\t/**\n\t * Set application config in database\n\t *\n\t * @param {object} context store context\n\t * @param {object} options destructuring object\n\t * @param {string} options.app Application name\n\t * @param {boolean} options.key Config key\n\t * @param {boolean} options.value Value to set\n\t * @return {Promise}\n\t */\n\tsetAppConfig(context, { app, key, value }) {\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\treturn api.post(generateOcsUrl('apps/provisioning_api/api/v1/config/apps/{app}/{key}', { app, key }), { value })\n\t\t\t\t.catch((error) => { throw error })\n\t\t}).catch((error) => context.commit('API_FAILURE', { app, key, value, error }))\n\t},\n}\n\nexport default { state, mutations, getters, actions }\n","/**\n * @copyright Copyright (c) 2018 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n * @author Julius Härtl <jus@bitgrid.net>\n *\n * @license AGPL-3.0-or-later\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\nimport Vue from 'vue'\nimport Vuex, { Store } from 'vuex'\nimport users from './users'\nimport apps from './apps'\nimport settings from './settings'\nimport oc from './oc'\nimport { showError } from '@nextcloud/dialogs'\n\nVue.use(Vuex)\n\nconst debug = process.env.NODE_ENV !== 'production'\n\nconst mutations = {\n\tAPI_FAILURE(state, error) {\n\t\ttry {\n\t\t\tconst message = error.error.response.data.ocs.meta.message\n\t\t\tshowError(t('settings', 'An error occurred during the request. Unable to proceed.') + '<br>' + message, { isHTML: true })\n\t\t} catch (e) {\n\t\t\tshowError(t('settings', 'An error occurred during the request. Unable to proceed.'))\n\t\t}\n\t\tconsole.error(state, error)\n\t},\n}\n\nexport default new Store({\n\tmodules: {\n\t\tusers,\n\t\tapps,\n\t\tsettings,\n\t\toc,\n\t},\n\tstrict: debug,\n\n\tmutations,\n})\n","/**\n * @copyright Copyright (c) 2018 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @license AGPL-3.0-or-later\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\nconst state = {\n\tserverData: {},\n}\nconst mutations = {\n\tsetServerData(state, data) {\n\t\tstate.serverData = data\n\t},\n}\nconst getters = {\n\tgetServerData(state) {\n\t\treturn state.serverData\n\t},\n}\nconst actions = {}\n\nexport default { state, mutations, getters, actions }\n","/**\n * @copyright Copyright (c) 2018 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n * @author rakekniven <mark.ziegler@rakekniven.de>\n * @author Roeland Jago Douma <roeland@famdouma.nl>\n *\n * @license AGPL-3.0-or-later\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\nimport Vue from 'vue'\nimport VTooltip from 'v-tooltip'\nimport { sync } from 'vuex-router-sync'\n\nimport App from './App.vue'\nimport router from './router'\nimport store from './store'\n\nVue.use(VTooltip, { defaultHtml: false })\n\nsync(store, router)\n\n// CSP config for webpack dynamic chunk loading\n// eslint-disable-next-line camelcase\n__webpack_nonce__ = btoa(OC.requestToken)\n\n// bind to window\nVue.prototype.t = t\nVue.prototype.n = n\nVue.prototype.OC = OC\nVue.prototype.OCA = OCA\n// eslint-disable-next-line camelcase\nVue.prototype.oc_userconfig = oc_userconfig\n\nconst app = new Vue({\n\trouter,\n\tstore,\n\trender: h => h(App),\n}).$mount('#content')\n\nexport { app, router, store }\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\tloaded: false,\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Flag the module as loaded\n\tmodule.loaded = true;\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","__webpack_require__.amdD = function () {\n\tthrow new Error('define cannot be used indirect');\n};","__webpack_require__.amdO = {};","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = function(module) {\n\tvar getter = module && module.__esModule ?\n\t\tfunction() { return module['default']; } :\n\t\tfunction() { return module; };\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = function(exports, definition) {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = function(chunkId) {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce(function(promises, key) {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = function(chunkId) {\n\t// return url for filenames based on template\n\treturn \"\" + {\"7418\":\"settings-apps-view\",\"8351\":\"settings-users\"}[chunkId] + \"-\" + chunkId + \".js?v=\" + {\"7418\":\"d54d22a587fea7ef7311\",\"8351\":\"0fb4eae666669f163a13\"}[chunkId] + \"\";\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }","// define __esModule on exports\n__webpack_require__.r = function(exports) {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.nmd = function(module) {\n\tmodule.paths = [];\n\tif (!module.children) module.children = [];\n\treturn module;\n};","__webpack_require__.j = 8562;","var scriptUrl;\nif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\nvar document = __webpack_require__.g.document;\nif (!scriptUrl && document) {\n\tif (document.currentScript)\n\t\tscriptUrl = document.currentScript.src\n\tif (!scriptUrl) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tif(scripts.length) scriptUrl = scripts[scripts.length - 1].src\n\t}\n}\n// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\nif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\nscriptUrl = scriptUrl.replace(/#.*$/, \"\").replace(/\\?.*$/, \"\").replace(/\\/[^\\/]+$/, \"/\");\n__webpack_require__.p = scriptUrl;","__webpack_require__.b = document.baseURI || self.location.href;\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t8562: 0\n};\n\n__webpack_require__.f.j = function(chunkId, promises) {\n\t\t// JSONP chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\n\t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n\t\t\t// a Promise means \"currently loading\".\n\t\t\tif(installedChunkData) {\n\t\t\t\tpromises.push(installedChunkData[2]);\n\t\t\t} else {\n\t\t\t\tif(true) { // all chunks have JS\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = new Promise(function(resolve, reject) { installedChunkData = installedChunks[chunkId] = [resolve, reject]; });\n\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n\t\t\t\t\t// start chunk loading\n\t\t\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\t\t\tvar error = new Error();\n\t\t\t\t\tvar loadingEnded = function(event) {\n\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\t\tif(installedChunkData) {\n\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t\t\t} else installedChunks[chunkId] = 0;\n\t\t\t}\n\t\t}\n};\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = function(chunkId) { return installedChunks[chunkId] === 0; };\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = function(parentChunkLoadingFunction, data) {\n\tvar chunkIds = data[0];\n\tvar moreModules = data[1];\n\tvar runtime = data[2];\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some(function(id) { return installedChunks[id] !== 0; })) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunknextcloud\"] = self[\"webpackChunknextcloud\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","__webpack_require__.nc = undefined;","// startup\n// Load entry module and return exports\n// This entry module depends on other loaded chunks and execution need to be delayed\nvar __webpack_exports__ = __webpack_require__.O(undefined, [7874], function() { return __webpack_require__(78778); })\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["deferred","inProgress","dataWebpackPrefix","_h","this","$createElement","_self","_c","Users","Apps","Vue","Router","mode","base","generateUrl","linkActiveClass","routes","path","component","props","name","children","sanitize","url","replace","confirmPassword","options","axios","data","params","getLoggerBuilder","setApp","detectUser","build","orderGroups","groups","orderBy","sort","a","b","usercount","disabled","localeCompare","defaults","id","canAdd","canRemove","mutations","appendUsers","state","usersObj","users","concat","Object","keys","map","userid","usersOffset","usersLimit","setPasswordPolicyMinLength","length","minPasswordLength","initGroups","userCount","group","assign","addGroup","gid","displayName","find","push","e","console","error","renameGroup","groupIndex","findIndex","groupSearch","updatedGroup","splice","removeGroup","addUserGroup","user","enabled","removeUserGroup","indexOf","addUserSubAdmin","subadmin","removeUserSubAdmin","deleteUser","userIndex","commit","actionType","addUserData","response","ocs","enableDisableUser","updateUserCounts","disabledGroup","forEach","userGroup","logger","setUserData","key","value","humanValue","OC","Util","computerFileSize","resetUsers","CancelToken","searchRequestCancelSource","getters","getUsers","getGroups","getSubadminGroups","filter","getPasswordPolicyMinLength","getUsersOffset","getUsersLimit","getUserCount","actions","context","offset","limit","search","cancel","source","api","generateOcsUrl","encodeURIComponent","cancelToken","token","then","usersCount","catch","limitParam","getUsersFromList","getUsersFromGroup","groupid","groupId","getCapabilities","password_policy","minLength","wipeUserDevices","addUser","dispatch","password","email","quota","language","userStatus","allowedEmpty","Promise","reject","Error","sendWelcomeMail","APPS_API_FAILURE","showError","t","message","isHTML","initCategories","categories","updateCount","setUpdateCount","addCategory","category","appendCategories","categoriesArray","setAllApps","apps","setError","appId","Array","isArray","_id","app","clearError","enableApp","active","disableApp","removable","canUnInstall","uninstallApp","needsDownload","installed","canInstall","updateApp","version","update","resetApps","reset","startLoading","loading","stopLoading","appIds","_appId","update_required","showInfo","onClick","window","location","reload","close","setTimeout","forceEnableApp","getAllApps","getCategories","loadingList","getUpdateCount","setAppConfig","Vuex","API_FAILURE","meta","Store","modules","settings","serverData","setServerData","getServerData","oc","strict","process","VTooltip","defaultHtml","sync","store","router","__webpack_nonce__","btoa","requestToken","n","OCA","oc_userconfig","render","h","App","$mount","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","exports","module","loaded","__webpack_modules__","call","m","amdD","amdO","O","result","chunkIds","fn","priority","notFulfilled","Infinity","i","fulfilled","j","every","r","getter","__esModule","d","definition","o","defineProperty","enumerable","get","f","chunkId","all","reduce","promises","u","g","globalThis","Function","obj","prop","prototype","hasOwnProperty","l","done","script","needAttach","scripts","document","getElementsByTagName","s","getAttribute","createElement","charset","timeout","nc","setAttribute","src","onScriptComplete","prev","event","onerror","onload","clearTimeout","doneFns","parentNode","removeChild","bind","type","target","head","appendChild","Symbol","toStringTag","nmd","paths","scriptUrl","importScripts","currentScript","p","baseURI","self","href","installedChunks","installedChunkData","promise","resolve","errorType","realSrc","request","webpackJsonpCallback","parentChunkLoadingFunction","moreModules","runtime","some","chunkLoadingGlobal","__webpack_exports__"],"sourceRoot":""}
\ No newline at end of file +{"version":3,"file":"settings-vue-settings-apps-users-management.js?v=93cc944de2be12e7244d","mappings":"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","sources":["webpack:///nextcloud/webpack/runtime/chunk loaded","webpack:///nextcloud/webpack/runtime/load script","webpack:///nextcloud/apps/settings/src/App.vue?vue&type=script&lang=js&","webpack:///nextcloud/apps/settings/src/App.vue","webpack://nextcloud/./apps/settings/src/App.vue?536c","webpack:///nextcloud/apps/settings/src/App.vue?vue&type=template&id=50420604&","webpack:///nextcloud/apps/settings/src/router.js","webpack:///nextcloud/apps/settings/src/store/api.js","webpack:///nextcloud/apps/settings/src/logger.js","webpack:///nextcloud/apps/settings/src/store/users.js","webpack:///nextcloud/apps/settings/src/store/apps.js","webpack:///nextcloud/apps/settings/src/store/oc.js","webpack:///nextcloud/apps/settings/src/store/index.js","webpack:///nextcloud/apps/settings/src/store/settings.js","webpack:///nextcloud/apps/settings/src/main-apps-users-management.js","webpack:///nextcloud/webpack/bootstrap","webpack:///nextcloud/webpack/runtime/amd define","webpack:///nextcloud/webpack/runtime/amd options","webpack:///nextcloud/webpack/runtime/compat get default export","webpack:///nextcloud/webpack/runtime/define property getters","webpack:///nextcloud/webpack/runtime/ensure chunk","webpack:///nextcloud/webpack/runtime/get javascript chunk filename","webpack:///nextcloud/webpack/runtime/global","webpack:///nextcloud/webpack/runtime/hasOwnProperty shorthand","webpack:///nextcloud/webpack/runtime/make namespace object","webpack:///nextcloud/webpack/runtime/node module decorator","webpack:///nextcloud/webpack/runtime/runtimeId","webpack:///nextcloud/webpack/runtime/publicPath","webpack:///nextcloud/webpack/runtime/jsonp chunk loading","webpack:///nextcloud/webpack/runtime/nonce","webpack:///nextcloud/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = function(result, chunkIds, fn, priority) {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar chunkIds = deferred[i][0];\n\t\tvar fn = deferred[i][1];\n\t\tvar priority = deferred[i][2];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every(function(key) { return __webpack_require__.O[key](chunkIds[j]); })) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","var inProgress = {};\nvar dataWebpackPrefix = \"nextcloud:\";\n// loadScript function to load a script via script tag\n__webpack_require__.l = function(url, done, key, chunkId) {\n\tif(inProgress[url]) { inProgress[url].push(done); return; }\n\tvar script, needAttach;\n\tif(key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor(var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif(s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) { script = s; break; }\n\t\t}\n\t}\n\tif(!script) {\n\t\tneedAttach = true;\n\t\tscript = document.createElement('script');\n\n\t\tscript.charset = 'utf-8';\n\t\tscript.timeout = 120;\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n\t\tscript.src = url;\n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = function(prev, event) {\n\t\t// avoid mem leaks in IE.\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns && doneFns.forEach(function(fn) { return fn(event); });\n\t\tif(prev) return prev(event);\n\t}\n\t;\n\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};","import mod from \"-!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./App.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!./App.vue?vue&type=script&lang=js&\"","<!--\n - @copyright Copyright (c) 2018 John Molakvoæ <skjnldsv@protonmail.com>\n -\n - @author John Molakvoæ <skjnldsv@protonmail.com>\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<router-view />\n</template>\n\n<script>\nexport default {\n\tname: 'App',\n\tbeforeMount() {\n\t\t// importing server data into the store\n\t\tconst serverDataElmt = document.getElementById('serverData')\n\t\tif (serverDataElmt !== null) {\n\t\t\tthis.$store.commit('setServerData', JSON.parse(document.getElementById('serverData').dataset.server))\n\t\t}\n\t},\n}\n</script>\n","import { render, staticRenderFns } from \"./App.vue?vue&type=template&id=50420604&\"\nimport script from \"./App.vue?vue&type=script&lang=js&\"\nexport * from \"./App.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('router-view')}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","/**\n * @copyright Copyright (c) 2018 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n * @author Julius Härtl <jus@bitgrid.net>\n * @author Roeland Jago Douma <roeland@famdouma.nl>\n *\n * @license AGPL-3.0-or-later\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\nimport Vue from 'vue'\nimport Router from 'vue-router'\nimport { generateUrl } from '@nextcloud/router'\n\n// Dynamic loading\nconst Users = () => import(/* webpackChunkName: 'settings-users' */'./views/Users')\nconst Apps = () => import(/* webpackChunkName: 'settings-apps-view' */'./views/Apps')\n\nVue.use(Router)\n\n/*\n * This is the list of routes where the vuejs app will\n * take over php to provide data\n * You need to forward the php routing (routes.php) to\n * the settings-vue template, where the vue-router will\n * ensure the proper route.\n * ⚠️ Routes needs to match the php routes.\n */\n\nexport default new Router({\n\tmode: 'history',\n\t// if index.php is in the url AND we got this far, then it's working:\n\t// let's keep using index.php in the url\n\tbase: generateUrl(''),\n\tlinkActiveClass: 'active',\n\troutes: [\n\t\t{\n\t\t\tpath: '/:index(index.php/)?settings/users',\n\t\t\tcomponent: Users,\n\t\t\tprops: true,\n\t\t\tname: 'users',\n\t\t\tchildren: [\n\t\t\t\t{\n\t\t\t\t\tpath: ':selectedGroup',\n\t\t\t\t\tname: 'group',\n\t\t\t\t\tcomponent: Users,\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t\t{\n\t\t\tpath: '/:index(index.php/)?settings/apps',\n\t\t\tcomponent: Apps,\n\t\t\tprops: true,\n\t\t\tname: 'apps',\n\t\t\tchildren: [\n\t\t\t\t{\n\t\t\t\t\tpath: ':category',\n\t\t\t\t\tname: 'apps-category',\n\t\t\t\t\tcomponent: Apps,\n\t\t\t\t\tchildren: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpath: ':id',\n\t\t\t\t\t\t\tname: 'apps-details',\n\t\t\t\t\t\t\tcomponent: Apps,\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t],\n})\n","/**\n * @copyright Copyright (c) 2018 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author Christoph Wurst <christoph@winzerhof-wurst.at>\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n * @author Julius Härtl <jus@bitgrid.net>\n * @author Roeland Jago Douma <roeland@famdouma.nl>\n * @author Sujith Haridasan <sujith.h@gmail.com>\n *\n * @license AGPL-3.0-or-later\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\nimport axios from '@nextcloud/axios'\nimport { confirmPassword } from '@nextcloud/password-confirmation'\nimport '@nextcloud/password-confirmation/dist/style.css'\n\nconst sanitize = function(url) {\n\treturn url.replace(/\\/$/, '') // Remove last url slash\n}\n\nexport default {\n\n\t/**\n\t * This Promise is used to chain a request that require an admin password confirmation\n\t * Since chaining Promise have a very precise behavior concerning catch and then,\n\t * you'll need to be careful when using it.\n\t * e.g\n\t * // store\n\t * action(context) {\n\t * return api.requireAdmin().then((response) => {\n\t * return api.get('url')\n\t * .then((response) => {API success})\n\t * .catch((error) => {API failure});\n\t * }).catch((error) => {requireAdmin failure});\n\t * }\n\t * // vue\n\t * this.$store.dispatch('action').then(() => {always executed})\n\t *\n\t * Since Promise.then().catch().then() will always execute the last then\n\t * this.$store.dispatch('action').then will always be executed\n\t *\n\t * If you want requireAdmin failure to also catch the API request failure\n\t * you will need to throw a new error in the api.get.catch()\n\t *\n\t * e.g\n\t * api.requireAdmin().then((response) => {\n\t * api.get('url')\n\t * .then((response) => {API success})\n\t * .catch((error) => {throw error;});\n\t * }).catch((error) => {requireAdmin OR API failure});\n\t *\n\t * @return {Promise}\n\t */\n\trequireAdmin() {\n\t\treturn confirmPassword()\n\t},\n\tget(url, options) {\n\t\treturn axios.get(sanitize(url), options)\n\t},\n\tpost(url, data) {\n\t\treturn axios.post(sanitize(url), data)\n\t},\n\tpatch(url, data) {\n\t\treturn axios.patch(sanitize(url), data)\n\t},\n\tput(url, data) {\n\t\treturn axios.put(sanitize(url), data)\n\t},\n\tdelete(url, data) {\n\t\treturn axios.delete(sanitize(url), { params: data })\n\t},\n}\n","/**\n * @copyright 2020 Christoph Wurst <christoph@winzerhof-wurst.at>\n *\n * @author Roeland Jago Douma <roeland@famdouma.nl>\n *\n * @license AGPL-3.0-or-later\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\nimport { getLoggerBuilder } from '@nextcloud/logger'\n\nexport default getLoggerBuilder()\n\t.setApp('settings')\n\t.detectUser()\n\t.build()\n","/**\n * @copyright Copyright (c) 2018 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author Arthur Schiwon <blizzz@arthur-schiwon.de>\n * @author Christoph Wurst <christoph@winzerhof-wurst.at>\n * @author Daniel Calviño Sánchez <danxuliu@gmail.com>\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n * @author Julius Härtl <jus@bitgrid.net>\n * @author Roeland Jago Douma <roeland@famdouma.nl>\n * @author Vincent Petry <vincent@nextcloud.com>\n *\n * @license AGPL-3.0-or-later\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\nimport api from './api'\nimport axios from '@nextcloud/axios'\nimport { generateOcsUrl } from '@nextcloud/router'\nimport logger from '../logger'\n\nconst orderGroups = function(groups, orderBy) {\n\t/* const SORT_USERCOUNT = 1;\n\t * const SORT_GROUPNAME = 2;\n\t * https://github.com/nextcloud/server/blob/208e38e84e1a07a49699aa90dc5b7272d24489f0/lib/private/Group/MetaData.php#L34\n\t */\n\tif (orderBy === 1) {\n\t\treturn groups.sort((a, b) => a.usercount - a.disabled < b.usercount - b.disabled)\n\t} else {\n\t\treturn groups.sort((a, b) => a.name.localeCompare(b.name))\n\t}\n}\n\nconst defaults = {\n\tgroup: {\n\t\tid: '',\n\t\tname: '',\n\t\tusercount: 0,\n\t\tdisabled: 0,\n\t\tcanAdd: true,\n\t\tcanRemove: true,\n\t},\n}\n\nconst state = {\n\tusers: [],\n\tgroups: [],\n\torderBy: 1,\n\tminPasswordLength: 0,\n\tusersOffset: 0,\n\tusersLimit: 25,\n\tuserCount: 0,\n}\n\nconst mutations = {\n\tappendUsers(state, usersObj) {\n\t\t// convert obj to array\n\t\tconst users = state.users.concat(Object.keys(usersObj).map(userid => usersObj[userid]))\n\t\tstate.usersOffset += state.usersLimit\n\t\tstate.users = users\n\t},\n\tsetPasswordPolicyMinLength(state, length) {\n\t\tstate.minPasswordLength = length !== '' ? length : 0\n\t},\n\tinitGroups(state, { groups, orderBy, userCount }) {\n\t\tstate.groups = groups.map(group => Object.assign({}, defaults.group, group))\n\t\tstate.orderBy = orderBy\n\t\tstate.userCount = userCount\n\t\tstate.groups = orderGroups(state.groups, state.orderBy)\n\n\t},\n\taddGroup(state, { gid, displayName }) {\n\t\ttry {\n\t\t\tif (typeof state.groups.find((group) => group.id === gid) !== 'undefined') {\n\t\t\t\treturn\n\t\t\t}\n\t\t\t// extend group to default values\n\t\t\tconst group = Object.assign({}, defaults.group, {\n\t\t\t\tid: gid,\n\t\t\t\tname: displayName,\n\t\t\t})\n\t\t\tstate.groups.push(group)\n\t\t\tstate.groups = orderGroups(state.groups, state.orderBy)\n\t\t} catch (e) {\n\t\t\tconsole.error('Can\\'t create group', e)\n\t\t}\n\t},\n\trenameGroup(state, { gid, displayName }) {\n\t\tconst groupIndex = state.groups.findIndex(groupSearch => groupSearch.id === gid)\n\t\tif (groupIndex >= 0) {\n\t\t\tconst updatedGroup = state.groups[groupIndex]\n\t\t\tupdatedGroup.name = displayName\n\t\t\tstate.groups.splice(groupIndex, 1, updatedGroup)\n\t\t\tstate.groups = orderGroups(state.groups, state.orderBy)\n\t\t}\n\t},\n\tremoveGroup(state, gid) {\n\t\tconst groupIndex = state.groups.findIndex(groupSearch => groupSearch.id === gid)\n\t\tif (groupIndex >= 0) {\n\t\t\tstate.groups.splice(groupIndex, 1)\n\t\t}\n\t},\n\taddUserGroup(state, { userid, gid }) {\n\t\tconst group = state.groups.find(groupSearch => groupSearch.id === gid)\n\t\tconst user = state.users.find(user => user.id === userid)\n\t\t// increase count if user is enabled\n\t\tif (group && user.enabled && state.userCount > 0) {\n\t\t\tgroup.usercount++\n\t\t}\n\t\tconst groups = user.groups\n\t\tgroups.push(gid)\n\t\tstate.groups = orderGroups(state.groups, state.orderBy)\n\t},\n\tremoveUserGroup(state, { userid, gid }) {\n\t\tconst group = state.groups.find(groupSearch => groupSearch.id === gid)\n\t\tconst user = state.users.find(user => user.id === userid)\n\t\t// lower count if user is enabled\n\t\tif (group && user.enabled && state.userCount > 0) {\n\t\t\tgroup.usercount--\n\t\t}\n\t\tconst groups = user.groups\n\t\tgroups.splice(groups.indexOf(gid), 1)\n\t\tstate.groups = orderGroups(state.groups, state.orderBy)\n\t},\n\taddUserSubAdmin(state, { userid, gid }) {\n\t\tconst groups = state.users.find(user => user.id === userid).subadmin\n\t\tgroups.push(gid)\n\t},\n\tremoveUserSubAdmin(state, { userid, gid }) {\n\t\tconst groups = state.users.find(user => user.id === userid).subadmin\n\t\tgroups.splice(groups.indexOf(gid), 1)\n\t},\n\tdeleteUser(state, userid) {\n\t\tconst userIndex = state.users.findIndex(user => user.id === userid)\n\t\tthis.commit('updateUserCounts', { user: state.users[userIndex], actionType: 'remove' })\n\t\tstate.users.splice(userIndex, 1)\n\t},\n\taddUserData(state, response) {\n\t\tconst user = response.data.ocs.data\n\t\tstate.users.push(user)\n\t\tthis.commit('updateUserCounts', { user, actionType: 'create' })\n\t},\n\tenableDisableUser(state, { userid, enabled }) {\n\t\tconst user = state.users.find(user => user.id === userid)\n\t\tuser.enabled = enabled\n\t\tthis.commit('updateUserCounts', { user, actionType: enabled ? 'enable' : 'disable' })\n\t},\n\t// update active/disabled counts, groups counts\n\tupdateUserCounts(state, { user, actionType }) {\n\t\tconst disabledGroup = state.groups.find(group => group.id === 'disabled')\n\t\tswitch (actionType) {\n\t\tcase 'enable':\n\t\tcase 'disable':\n\t\t\tdisabledGroup.usercount += user.enabled ? -1 : 1 // update Disabled Users count\n\t\t\tstate.userCount += user.enabled ? 1 : -1 // update Active Users count\n\t\t\tuser.groups.forEach(userGroup => {\n\t\t\t\tconst group = state.groups.find(groupSearch => groupSearch.id === userGroup)\n\t\t\t\tgroup.disabled += user.enabled ? -1 : 1 // update group disabled count\n\t\t\t})\n\t\t\tbreak\n\t\tcase 'create':\n\t\t\tstate.userCount++ // increment Active Users count\n\n\t\t\tuser.groups.forEach(userGroup => {\n\t\t\t\tstate.groups\n\t\t\t\t\t.find(groupSearch => groupSearch.id === userGroup)\n\t\t\t\t .usercount++ // increment group total count\n\t\t\t})\n\t\t\tbreak\n\t\tcase 'remove':\n\t\t\tif (user.enabled) {\n\t\t\t\tstate.userCount-- // decrement Active Users count\n\t\t\t\tuser.groups.forEach(userGroup => {\n\t\t\t\t\tconst group = state.groups.find(groupSearch => groupSearch.id === userGroup)\n\t\t\t\t\tgroup.usercount-- // decrement group total count\n\t\t\t\t})\n\t\t\t} else {\n\t\t\t\tdisabledGroup.usercount-- // decrement Disabled Users count\n\t\t\t\tuser.groups.forEach(userGroup => {\n\t\t\t\t\tconst group = state.groups.find(groupSearch => groupSearch.id === userGroup)\n\t\t\t\t\tgroup.disabled-- // decrement group disabled count\n\t\t\t\t})\n\t\t\t}\n\t\t\tbreak\n\t\tdefault:\n\t\t\tlogger.error(`Unknown action type in updateUserCounts: '${actionType}'`)\n\t\t\t// not throwing error to interrupt execution as this is not fatal\n\t\t}\n\t},\n\tsetUserData(state, { userid, key, value }) {\n\t\tif (key === 'quota') {\n\t\t\tconst humanValue = OC.Util.computerFileSize(value)\n\t\t\tstate.users.find(user => user.id === userid)[key][key] = humanValue !== null ? humanValue : value\n\t\t} else {\n\t\t\tstate.users.find(user => user.id === userid)[key] = value\n\t\t}\n\t},\n\n\t/**\n\t * Reset users list\n\t *\n\t * @param {object} state the store state\n\t */\n\tresetUsers(state) {\n\t\tstate.users = []\n\t\tstate.usersOffset = 0\n\t},\n}\n\nconst getters = {\n\tgetUsers(state) {\n\t\treturn state.users\n\t},\n\tgetGroups(state) {\n\t\treturn state.groups\n\t},\n\tgetSubadminGroups(state) {\n\t\t// Can't be subadmin of admin or disabled\n\t\treturn state.groups.filter(group => group.id !== 'admin' && group.id !== 'disabled')\n\t},\n\tgetPasswordPolicyMinLength(state) {\n\t\treturn state.minPasswordLength\n\t},\n\tgetUsersOffset(state) {\n\t\treturn state.usersOffset\n\t},\n\tgetUsersLimit(state) {\n\t\treturn state.usersLimit\n\t},\n\tgetUserCount(state) {\n\t\treturn state.userCount\n\t},\n}\n\nconst CancelToken = axios.CancelToken\nlet searchRequestCancelSource = null\n\nconst actions = {\n\n\t/**\n\t * Get all users with full details\n\t *\n\t * @param {object} context store context\n\t * @param {object} options destructuring object\n\t * @param {number} options.offset List offset to request\n\t * @param {number} options.limit List number to return from offset\n\t * @param {string} options.search Search amongst users\n\t * @param {string} options.group Get users from group\n\t * @return {Promise}\n\t */\n\tgetUsers(context, { offset, limit, search, group }) {\n\t\tif (searchRequestCancelSource) {\n\t\t\tsearchRequestCancelSource.cancel('Operation canceled by another search request.')\n\t\t}\n\t\tsearchRequestCancelSource = CancelToken.source()\n\t\tsearch = typeof search === 'string' ? search : ''\n\t\tgroup = typeof group === 'string' ? group : ''\n\t\tif (group !== '') {\n\t\t\treturn api.get(generateOcsUrl('cloud/groups/{group}/users/details?offset={offset}&limit={limit}&search={search}', { group: encodeURIComponent(group), offset, limit, search }), {\n\t\t\t\tcancelToken: searchRequestCancelSource.token,\n\t\t\t})\n\t\t\t\t.then((response) => {\n\t\t\t\t\tconst usersCount = Object.keys(response.data.ocs.data.users).length\n\t\t\t\t\tif (usersCount > 0) {\n\t\t\t\t\t\tcontext.commit('appendUsers', response.data.ocs.data.users)\n\t\t\t\t\t}\n\t\t\t\t\treturn usersCount\n\t\t\t\t})\n\t\t\t\t.catch((error) => {\n\t\t\t\t\tif (!axios.isCancel(error)) {\n\t\t\t\t\t\tcontext.commit('API_FAILURE', error)\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t}\n\n\t\treturn api.get(generateOcsUrl('cloud/users/details?offset={offset}&limit={limit}&search={search}', { offset, limit, search }), {\n\t\t\tcancelToken: searchRequestCancelSource.token,\n\t\t})\n\t\t\t.then((response) => {\n\t\t\t\tconst usersCount = Object.keys(response.data.ocs.data.users).length\n\t\t\t\tif (usersCount > 0) {\n\t\t\t\t\tcontext.commit('appendUsers', response.data.ocs.data.users)\n\t\t\t\t}\n\t\t\t\treturn usersCount\n\t\t\t})\n\t\t\t.catch((error) => {\n\t\t\t\tif (!axios.isCancel(error)) {\n\t\t\t\t\tcontext.commit('API_FAILURE', error)\n\t\t\t\t}\n\t\t\t})\n\t},\n\n\tgetGroups(context, { offset, limit, search }) {\n\t\tsearch = typeof search === 'string' ? search : ''\n\t\tconst limitParam = limit === -1 ? '' : `&limit=${limit}`\n\t\treturn api.get(generateOcsUrl('cloud/groups?offset={offset}&search={search}', { offset, search }) + limitParam)\n\t\t\t.then((response) => {\n\t\t\t\tif (Object.keys(response.data.ocs.data.groups).length > 0) {\n\t\t\t\t\tresponse.data.ocs.data.groups.forEach(function(group) {\n\t\t\t\t\t\tcontext.commit('addGroup', { gid: group, displayName: group })\n\t\t\t\t\t})\n\t\t\t\t\treturn true\n\t\t\t\t}\n\t\t\t\treturn false\n\t\t\t})\n\t\t\t.catch((error) => context.commit('API_FAILURE', error))\n\t},\n\n\t/**\n\t * Get all users with full details\n\t *\n\t * @param {object} context store context\n\t * @param {object} options destructuring object\n\t * @param {number} options.offset List offset to request\n\t * @param {number} options.limit List number to return from offset\n\t * @param {string} options.search -\n\t * @return {Promise}\n\t */\n\tgetUsersFromList(context, { offset, limit, search }) {\n\t\tsearch = typeof search === 'string' ? search : ''\n\t\treturn api.get(generateOcsUrl('cloud/users/details?offset={offset}&limit={limit}&search={search}', { offset, limit, search }))\n\t\t\t.then((response) => {\n\t\t\t\tif (Object.keys(response.data.ocs.data.users).length > 0) {\n\t\t\t\t\tcontext.commit('appendUsers', response.data.ocs.data.users)\n\t\t\t\t\treturn true\n\t\t\t\t}\n\t\t\t\treturn false\n\t\t\t})\n\t\t\t.catch((error) => context.commit('API_FAILURE', error))\n\t},\n\n\t/**\n\t * Get all users with full details from a groupid\n\t *\n\t * @param {object} context store context\n\t * @param {object} options destructuring object\n\t * @param {number} options.offset List offset to request\n\t * @param {number} options.limit List number to return from offset\n\t * @param {string} options.groupid -\n\t * @return {Promise}\n\t */\n\tgetUsersFromGroup(context, { groupid, offset, limit }) {\n\t\treturn api.get(generateOcsUrl('cloud/users/{groupId}/details?offset={offset}&limit={limit}', { groupId: encodeURIComponent(groupid), offset, limit }))\n\t\t\t.then((response) => context.commit('getUsersFromList', response.data.ocs.data.users))\n\t\t\t.catch((error) => context.commit('API_FAILURE', error))\n\t},\n\n\tgetPasswordPolicyMinLength(context) {\n\t\tif (OC.getCapabilities().password_policy && OC.getCapabilities().password_policy.minLength) {\n\t\t\tcontext.commit('setPasswordPolicyMinLength', OC.getCapabilities().password_policy.minLength)\n\t\t\treturn OC.getCapabilities().password_policy.minLength\n\t\t}\n\t\treturn false\n\t},\n\n\t/**\n\t * Add group\n\t *\n\t * @param {object} context store context\n\t * @param {string} gid Group id\n\t * @return {Promise}\n\t */\n\taddGroup(context, gid) {\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\treturn api.post(generateOcsUrl('cloud/groups'), { groupid: gid })\n\t\t\t\t.then((response) => {\n\t\t\t\t\tcontext.commit('addGroup', { gid, displayName: gid })\n\t\t\t\t\treturn { gid, displayName: gid }\n\t\t\t\t})\n\t\t\t\t.catch((error) => { throw error })\n\t\t}).catch((error) => {\n\t\t\tcontext.commit('API_FAILURE', { gid, error })\n\t\t\t// let's throw one more time to prevent the view\n\t\t\t// from adding the user to a group that doesn't exists\n\t\t\tthrow error\n\t\t})\n\t},\n\n\t/**\n\t * Rename group\n\t *\n\t * @param {object} context store context\n\t * @param {string} groupid Group id\n\t * @param {string} displayName Group display name\n\t * @return {Promise}\n\t */\n\trenameGroup(context, { groupid, displayName }) {\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\treturn api.put(generateOcsUrl('cloud/groups/{groupId}', { groupId: encodeURIComponent(groupid) }), { key: 'displayname', value: displayName })\n\t\t\t\t.then((response) => {\n\t\t\t\t\tcontext.commit('renameGroup', { gid: groupid, displayName })\n\t\t\t\t\treturn { groupid, displayName }\n\t\t\t\t})\n\t\t\t\t.catch((error) => { throw error })\n\t\t}).catch((error) => {\n\t\t\tcontext.commit('API_FAILURE', { groupid, error })\n\t\t\t// let's throw one more time to prevent the view\n\t\t\t// from renaming the group\n\t\t\tthrow error\n\t\t})\n\t},\n\n\t/**\n\t * Remove group\n\t *\n\t * @param {object} context store context\n\t * @param {string} gid Group id\n\t * @return {Promise}\n\t */\n\tremoveGroup(context, gid) {\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\treturn api.delete(generateOcsUrl('cloud/groups/{groupId}', { groupId: encodeURIComponent(gid) }))\n\t\t\t\t.then((response) => context.commit('removeGroup', gid))\n\t\t\t\t.catch((error) => { throw error })\n\t\t}).catch((error) => context.commit('API_FAILURE', { gid, error }))\n\t},\n\n\t/**\n\t * Add user to group\n\t *\n\t * @param {object} context store context\n\t * @param {object} options destructuring object\n\t * @param {string} options.userid User id\n\t * @param {string} options.gid Group id\n\t * @return {Promise}\n\t */\n\taddUserGroup(context, { userid, gid }) {\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\treturn api.post(generateOcsUrl('cloud/users/{userid}/groups', { userid }), { groupid: gid })\n\t\t\t\t.then((response) => context.commit('addUserGroup', { userid, gid }))\n\t\t\t\t.catch((error) => { throw error })\n\t\t}).catch((error) => context.commit('API_FAILURE', { userid, error }))\n\t},\n\n\t/**\n\t * Remove user from group\n\t *\n\t * @param {object} context store context\n\t * @param {object} options destructuring object\n\t * @param {string} options.userid User id\n\t * @param {string} options.gid Group id\n\t * @return {Promise}\n\t */\n\tremoveUserGroup(context, { userid, gid }) {\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\treturn api.delete(generateOcsUrl('cloud/users/{userid}/groups', { userid }), { groupid: gid })\n\t\t\t\t.then((response) => context.commit('removeUserGroup', { userid, gid }))\n\t\t\t\t.catch((error) => { throw error })\n\t\t}).catch((error) => {\n\t\t\tcontext.commit('API_FAILURE', { userid, error })\n\t\t\t// let's throw one more time to prevent\n\t\t\t// the view from removing the user row on failure\n\t\t\tthrow error\n\t\t})\n\t},\n\n\t/**\n\t * Add user to group admin\n\t *\n\t * @param {object} context store context\n\t * @param {object} options destructuring object\n\t * @param {string} options.userid User id\n\t * @param {string} options.gid Group id\n\t * @return {Promise}\n\t */\n\taddUserSubAdmin(context, { userid, gid }) {\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\treturn api.post(generateOcsUrl('cloud/users/{userid}/subadmins', { userid }), { groupid: gid })\n\t\t\t\t.then((response) => context.commit('addUserSubAdmin', { userid, gid }))\n\t\t\t\t.catch((error) => { throw error })\n\t\t}).catch((error) => context.commit('API_FAILURE', { userid, error }))\n\t},\n\n\t/**\n\t * Remove user from group admin\n\t *\n\t * @param {object} context store context\n\t * @param {object} options destructuring object\n\t * @param {string} options.userid User id\n\t * @param {string} options.gid Group id\n\t * @return {Promise}\n\t */\n\tremoveUserSubAdmin(context, { userid, gid }) {\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\treturn api.delete(generateOcsUrl('cloud/users/{userid}/subadmins', { userid }), { groupid: gid })\n\t\t\t\t.then((response) => context.commit('removeUserSubAdmin', { userid, gid }))\n\t\t\t\t.catch((error) => { throw error })\n\t\t}).catch((error) => context.commit('API_FAILURE', { userid, error }))\n\t},\n\n\t/**\n\t * Mark all user devices for remote wipe\n\t *\n\t * @param {object} context store context\n\t * @param {string} userid User id\n\t * @return {Promise}\n\t */\n\twipeUserDevices(context, userid) {\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\treturn api.post(generateOcsUrl('cloud/users/{userid}/wipe', { userid }))\n\t\t\t\t.catch((error) => { throw error })\n\t\t}).catch((error) => context.commit('API_FAILURE', { userid, error }))\n\t},\n\n\t/**\n\t * Delete a user\n\t *\n\t * @param {object} context store context\n\t * @param {string} userid User id\n\t * @return {Promise}\n\t */\n\tdeleteUser(context, userid) {\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\treturn api.delete(generateOcsUrl('cloud/users/{userid}', { userid }))\n\t\t\t\t.then((response) => context.commit('deleteUser', userid))\n\t\t\t\t.catch((error) => { throw error })\n\t\t}).catch((error) => context.commit('API_FAILURE', { userid, error }))\n\t},\n\n\t/**\n\t * Add a user\n\t *\n\t * @param {object} context store context\n\t * @param {Function} context.commit -\n\t * @param {Function} context.dispatch -\n\t * @param {object} options destructuring object\n\t * @param {string} options.userid User id\n\t * @param {string} options.password User password\n\t * @param {string} options.displayName User display name\n\t * @param {string} options.email User email\n\t * @param {string} options.groups User groups\n\t * @param {string} options.subadmin User subadmin groups\n\t * @param {string} options.quota User email\n\t * @param {string} options.language User language\n\t * @return {Promise}\n\t */\n\taddUser({ commit, dispatch }, { userid, password, displayName, email, groups, subadmin, quota, language }) {\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\treturn api.post(generateOcsUrl('cloud/users'), { userid, password, displayName, email, groups, subadmin, quota, language })\n\t\t\t\t.then((response) => dispatch('addUserData', userid || response.data.ocs.data.id))\n\t\t\t\t.catch((error) => { throw error })\n\t\t}).catch((error) => {\n\t\t\tcommit('API_FAILURE', { userid, error })\n\t\t\tthrow error\n\t\t})\n\t},\n\n\t/**\n\t * Get user data and commit addition\n\t *\n\t * @param {object} context store context\n\t * @param {string} userid User id\n\t * @return {Promise}\n\t */\n\taddUserData(context, userid) {\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\treturn api.get(generateOcsUrl('cloud/users/{userid}', { userid }))\n\t\t\t\t.then((response) => context.commit('addUserData', response))\n\t\t\t\t.catch((error) => { throw error })\n\t\t}).catch((error) => context.commit('API_FAILURE', { userid, error }))\n\t},\n\n\t/**\n\t * Enable or disable user\n\t *\n\t * @param {object} context store context\n\t * @param {object} options destructuring object\n\t * @param {string} options.userid User id\n\t * @param {boolean} options.enabled User enablement status\n\t * @return {Promise}\n\t */\n\tenableDisableUser(context, { userid, enabled = true }) {\n\t\tconst userStatus = enabled ? 'enable' : 'disable'\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\treturn api.put(generateOcsUrl('cloud/users/{userid}/{userStatus}', { userid, userStatus }))\n\t\t\t\t.then((response) => context.commit('enableDisableUser', { userid, enabled }))\n\t\t\t\t.catch((error) => { throw error })\n\t\t}).catch((error) => context.commit('API_FAILURE', { userid, error }))\n\t},\n\n\t/**\n\t * Edit user data\n\t *\n\t * @param {object} context store context\n\t * @param {object} options destructuring object\n\t * @param {string} options.userid User id\n\t * @param {string} options.key User field to edit\n\t * @param {string} options.value Value of the change\n\t * @return {Promise}\n\t */\n\tsetUserData(context, { userid, key, value }) {\n\t\tconst allowedEmpty = ['email', 'displayname']\n\t\tif (['email', 'language', 'quota', 'displayname', 'password'].indexOf(key) !== -1) {\n\t\t\t// We allow empty email or displayname\n\t\t\tif (typeof value === 'string'\n\t\t\t\t&& (\n\t\t\t\t\t(allowedEmpty.indexOf(key) === -1 && value.length > 0)\n\t\t\t\t\t|| allowedEmpty.indexOf(key) !== -1\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\treturn api.requireAdmin().then((response) => {\n\t\t\t\t\treturn api.put(generateOcsUrl('cloud/users/{userid}', { userid }), { key, value })\n\t\t\t\t\t\t.then((response) => context.commit('setUserData', { userid, key, value }))\n\t\t\t\t\t\t.catch((error) => { throw error })\n\t\t\t\t}).catch((error) => context.commit('API_FAILURE', { userid, error }))\n\t\t\t}\n\t\t}\n\t\treturn Promise.reject(new Error('Invalid request data'))\n\t},\n\n\t/**\n\t * Send welcome mail\n\t *\n\t * @param {object} context store context\n\t * @param {string} userid User id\n\t * @return {Promise}\n\t */\n\tsendWelcomeMail(context, userid) {\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\treturn api.post(generateOcsUrl('cloud/users/{userid}/welcome', { userid }))\n\t\t\t\t.then(response => true)\n\t\t\t\t.catch((error) => { throw error })\n\t\t}).catch((error) => context.commit('API_FAILURE', { userid, error }))\n\t},\n}\n\nexport default { state, mutations, getters, actions }\n","/**\n * @copyright Copyright (c) 2018 Julius Härtl <jus@bitgrid.net>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n * @author Julius Härtl <jus@bitgrid.net>\n * @author Roeland Jago Douma <roeland@famdouma.nl>\n *\n * @license AGPL-3.0-or-later\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\nimport api from './api'\nimport Vue from 'vue'\nimport { generateUrl } from '@nextcloud/router'\nimport { showError, showInfo } from '@nextcloud/dialogs'\nimport '@nextcloud/dialogs/styles/toast.scss'\n\nconst state = {\n\tapps: [],\n\tcategories: [],\n\tupdateCount: 0,\n\tloading: {},\n\tloadingList: false,\n}\n\nconst mutations = {\n\n\tAPPS_API_FAILURE(state, error) {\n\t\tshowError(t('settings', 'An error occurred during the request. Unable to proceed.') + '<br>' + error.error.response.data.data.message, { isHTML: true })\n\t\tconsole.error(state, error)\n\t},\n\n\tinitCategories(state, { categories, updateCount }) {\n\t\tstate.categories = categories\n\t\tstate.updateCount = updateCount\n\t},\n\n\tsetUpdateCount(state, updateCount) {\n\t\tstate.updateCount = updateCount\n\t},\n\n\taddCategory(state, category) {\n\t\tstate.categories.push(category)\n\t},\n\n\tappendCategories(state, categoriesArray) {\n\t\t// convert obj to array\n\t\tstate.categories = categoriesArray\n\t},\n\n\tsetAllApps(state, apps) {\n\t\tstate.apps = apps\n\t},\n\n\tsetError(state, { appId, error }) {\n\t\tif (!Array.isArray(appId)) {\n\t\t\tappId = [appId]\n\t\t}\n\t\tappId.forEach((_id) => {\n\t\t\tconst app = state.apps.find(app => app.id === _id)\n\t\t\tapp.error = error\n\t\t})\n\t},\n\n\tclearError(state, { appId, error }) {\n\t\tconst app = state.apps.find(app => app.id === appId)\n\t\tapp.error = null\n\t},\n\n\tenableApp(state, { appId, groups }) {\n\t\tconst app = state.apps.find(app => app.id === appId)\n\t\tapp.active = true\n\t\tapp.groups = groups\n\t},\n\n\tdisableApp(state, appId) {\n\t\tconst app = state.apps.find(app => app.id === appId)\n\t\tapp.active = false\n\t\tapp.groups = []\n\t\tif (app.removable) {\n\t\t\tapp.canUnInstall = true\n\t\t}\n\t},\n\n\tuninstallApp(state, appId) {\n\t\tstate.apps.find(app => app.id === appId).active = false\n\t\tstate.apps.find(app => app.id === appId).groups = []\n\t\tstate.apps.find(app => app.id === appId).needsDownload = true\n\t\tstate.apps.find(app => app.id === appId).installed = false\n\t\tstate.apps.find(app => app.id === appId).canUnInstall = false\n\t\tstate.apps.find(app => app.id === appId).canInstall = true\n\t},\n\n\tupdateApp(state, appId) {\n\t\tconst app = state.apps.find(app => app.id === appId)\n\t\tconst version = app.update\n\t\tapp.update = null\n\t\tapp.version = version\n\t\tstate.updateCount--\n\n\t},\n\n\tresetApps(state) {\n\t\tstate.apps = []\n\t},\n\treset(state) {\n\t\tstate.apps = []\n\t\tstate.categories = []\n\t\tstate.updateCount = 0\n\t},\n\tstartLoading(state, id) {\n\t\tif (Array.isArray(id)) {\n\t\t\tid.forEach((_id) => {\n\t\t\t\tVue.set(state.loading, _id, true)\n\t\t\t})\n\t\t} else {\n\t\t\tVue.set(state.loading, id, true)\n\t\t}\n\t},\n\tstopLoading(state, id) {\n\t\tif (Array.isArray(id)) {\n\t\t\tid.forEach((_id) => {\n\t\t\t\tVue.set(state.loading, _id, false)\n\t\t\t})\n\t\t} else {\n\t\t\tVue.set(state.loading, id, false)\n\t\t}\n\t},\n}\n\nconst getters = {\n\tloading(state) {\n\t\treturn function(id) {\n\t\t\treturn state.loading[id]\n\t\t}\n\t},\n\tgetCategories(state) {\n\t\treturn state.categories\n\t},\n\tgetAllApps(state) {\n\t\treturn state.apps\n\t},\n\tgetUpdateCount(state) {\n\t\treturn state.updateCount\n\t},\n}\n\nconst actions = {\n\n\tenableApp(context, { appId, groups }) {\n\t\tlet apps\n\t\tif (Array.isArray(appId)) {\n\t\t\tapps = appId\n\t\t} else {\n\t\t\tapps = [appId]\n\t\t}\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\tcontext.commit('startLoading', apps)\n\t\t\tcontext.commit('startLoading', 'install')\n\t\t\treturn api.post(generateUrl('settings/apps/enable'), { appIds: apps, groups })\n\t\t\t\t.then((response) => {\n\t\t\t\t\tcontext.commit('stopLoading', apps)\n\t\t\t\t\tcontext.commit('stopLoading', 'install')\n\t\t\t\t\tapps.forEach(_appId => {\n\t\t\t\t\t\tcontext.commit('enableApp', { appId: _appId, groups })\n\t\t\t\t\t})\n\n\t\t\t\t\t// check for server health\n\t\t\t\t\treturn api.get(generateUrl('apps/files'))\n\t\t\t\t\t\t.then(() => {\n\t\t\t\t\t\t\tif (response.data.update_required) {\n\t\t\t\t\t\t\t\tshowInfo(\n\t\t\t\t\t\t\t\t\tt(\n\t\t\t\t\t\t\t\t\t\t'settings',\n\t\t\t\t\t\t\t\t\t\t'The app has been enabled but needs to be updated. You will be redirected to the update page in 5 seconds.'\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tonClick: () => window.location.reload(),\n\t\t\t\t\t\t\t\t\t\tclose: false,\n\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\tsetTimeout(function() {\n\t\t\t\t\t\t\t\t\tlocation.reload()\n\t\t\t\t\t\t\t\t}, 5000)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.catch(() => {\n\t\t\t\t\t\t\tif (!Array.isArray(appId)) {\n\t\t\t\t\t\t\t\tcontext.commit('setError', {\n\t\t\t\t\t\t\t\t\tappId: apps,\n\t\t\t\t\t\t\t\t\terror: t('settings', 'Error: This app cannot be enabled because it makes the server unstable'),\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t})\n\t\t\t\t})\n\t\t\t\t.catch((error) => {\n\t\t\t\t\tcontext.commit('stopLoading', apps)\n\t\t\t\t\tcontext.commit('stopLoading', 'install')\n\t\t\t\t\tcontext.commit('setError', {\n\t\t\t\t\t\tappId: apps,\n\t\t\t\t\t\terror: error.response.data.data.message,\n\t\t\t\t\t})\n\t\t\t\t\tcontext.commit('APPS_API_FAILURE', { appId, error })\n\t\t\t\t})\n\t\t}).catch((error) => context.commit('API_FAILURE', { appId, error }))\n\t},\n\tforceEnableApp(context, { appId, groups }) {\n\t\tlet apps\n\t\tif (Array.isArray(appId)) {\n\t\t\tapps = appId\n\t\t} else {\n\t\t\tapps = [appId]\n\t\t}\n\t\treturn api.requireAdmin().then(() => {\n\t\t\tcontext.commit('startLoading', apps)\n\t\t\tcontext.commit('startLoading', 'install')\n\t\t\treturn api.post(generateUrl('settings/apps/force'), { appId })\n\t\t\t\t.then((response) => {\n\t\t\t\t\t// TODO: find a cleaner solution\n\t\t\t\t\tlocation.reload()\n\t\t\t\t})\n\t\t\t\t.catch((error) => {\n\t\t\t\t\tcontext.commit('stopLoading', apps)\n\t\t\t\t\tcontext.commit('stopLoading', 'install')\n\t\t\t\t\tcontext.commit('setError', {\n\t\t\t\t\t\tappId: apps,\n\t\t\t\t\t\terror: error.response.data.data.message,\n\t\t\t\t\t})\n\t\t\t\t\tcontext.commit('APPS_API_FAILURE', { appId, error })\n\t\t\t\t})\n\t\t}).catch((error) => context.commit('API_FAILURE', { appId, error }))\n\t},\n\tdisableApp(context, { appId }) {\n\t\tlet apps\n\t\tif (Array.isArray(appId)) {\n\t\t\tapps = appId\n\t\t} else {\n\t\t\tapps = [appId]\n\t\t}\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\tcontext.commit('startLoading', apps)\n\t\t\treturn api.post(generateUrl('settings/apps/disable'), { appIds: apps })\n\t\t\t\t.then((response) => {\n\t\t\t\t\tcontext.commit('stopLoading', apps)\n\t\t\t\t\tapps.forEach(_appId => {\n\t\t\t\t\t\tcontext.commit('disableApp', _appId)\n\t\t\t\t\t})\n\t\t\t\t\treturn true\n\t\t\t\t})\n\t\t\t\t.catch((error) => {\n\t\t\t\t\tcontext.commit('stopLoading', apps)\n\t\t\t\t\tcontext.commit('APPS_API_FAILURE', { appId, error })\n\t\t\t\t})\n\t\t}).catch((error) => context.commit('API_FAILURE', { appId, error }))\n\t},\n\tuninstallApp(context, { appId }) {\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\tcontext.commit('startLoading', appId)\n\t\t\treturn api.get(generateUrl(`settings/apps/uninstall/${appId}`))\n\t\t\t\t.then((response) => {\n\t\t\t\t\tcontext.commit('stopLoading', appId)\n\t\t\t\t\tcontext.commit('uninstallApp', appId)\n\t\t\t\t\treturn true\n\t\t\t\t})\n\t\t\t\t.catch((error) => {\n\t\t\t\t\tcontext.commit('stopLoading', appId)\n\t\t\t\t\tcontext.commit('APPS_API_FAILURE', { appId, error })\n\t\t\t\t})\n\t\t}).catch((error) => context.commit('API_FAILURE', { appId, error }))\n\t},\n\n\tupdateApp(context, { appId }) {\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\tcontext.commit('startLoading', appId)\n\t\t\tcontext.commit('startLoading', 'install')\n\t\t\treturn api.get(generateUrl(`settings/apps/update/${appId}`))\n\t\t\t\t.then((response) => {\n\t\t\t\t\tcontext.commit('stopLoading', 'install')\n\t\t\t\t\tcontext.commit('stopLoading', appId)\n\t\t\t\t\tcontext.commit('updateApp', appId)\n\t\t\t\t\treturn true\n\t\t\t\t})\n\t\t\t\t.catch((error) => {\n\t\t\t\t\tcontext.commit('stopLoading', appId)\n\t\t\t\t\tcontext.commit('stopLoading', 'install')\n\t\t\t\t\tcontext.commit('APPS_API_FAILURE', { appId, error })\n\t\t\t\t})\n\t\t}).catch((error) => context.commit('API_FAILURE', { appId, error }))\n\t},\n\n\tgetAllApps(context) {\n\t\tcontext.commit('startLoading', 'list')\n\t\treturn api.get(generateUrl('settings/apps/list'))\n\t\t\t.then((response) => {\n\t\t\t\tcontext.commit('setAllApps', response.data.apps)\n\t\t\t\tcontext.commit('stopLoading', 'list')\n\t\t\t\treturn true\n\t\t\t})\n\t\t\t.catch((error) => context.commit('API_FAILURE', error))\n\t},\n\n\tgetCategories(context) {\n\t\tcontext.commit('startLoading', 'categories')\n\t\treturn api.get(generateUrl('settings/apps/categories'))\n\t\t\t.then((response) => {\n\t\t\t\tif (response.data.length > 0) {\n\t\t\t\t\tcontext.commit('appendCategories', response.data)\n\t\t\t\t\tcontext.commit('stopLoading', 'categories')\n\t\t\t\t\treturn true\n\t\t\t\t}\n\t\t\t\treturn false\n\t\t\t})\n\t\t\t.catch((error) => context.commit('API_FAILURE', error))\n\t},\n\n}\n\nexport default { state, mutations, getters, actions }\n","/**\n * @copyright Copyright (c) 2018 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n * @author Roeland Jago Douma <roeland@famdouma.nl>\n *\n * @license AGPL-3.0-or-later\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\nimport api from './api'\nimport { generateOcsUrl } from '@nextcloud/router'\n\nconst state = {}\nconst mutations = {}\nconst getters = {}\nconst actions = {\n\t/**\n\t * Set application config in database\n\t *\n\t * @param {object} context store context\n\t * @param {object} options destructuring object\n\t * @param {string} options.app Application name\n\t * @param {boolean} options.key Config key\n\t * @param {boolean} options.value Value to set\n\t * @return {Promise}\n\t */\n\tsetAppConfig(context, { app, key, value }) {\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\treturn api.post(generateOcsUrl('apps/provisioning_api/api/v1/config/apps/{app}/{key}', { app, key }), { value })\n\t\t\t\t.catch((error) => { throw error })\n\t\t}).catch((error) => context.commit('API_FAILURE', { app, key, value, error }))\n\t},\n}\n\nexport default { state, mutations, getters, actions }\n","/**\n * @copyright Copyright (c) 2018 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n * @author Julius Härtl <jus@bitgrid.net>\n *\n * @license AGPL-3.0-or-later\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\nimport Vue from 'vue'\nimport Vuex, { Store } from 'vuex'\nimport users from './users'\nimport apps from './apps'\nimport settings from './settings'\nimport oc from './oc'\nimport { showError } from '@nextcloud/dialogs'\n\nVue.use(Vuex)\n\nconst debug = process.env.NODE_ENV !== 'production'\n\nconst mutations = {\n\tAPI_FAILURE(state, error) {\n\t\ttry {\n\t\t\tconst message = error.error.response.data.ocs.meta.message\n\t\t\tshowError(t('settings', 'An error occurred during the request. Unable to proceed.') + '<br>' + message, { isHTML: true })\n\t\t} catch (e) {\n\t\t\tshowError(t('settings', 'An error occurred during the request. Unable to proceed.'))\n\t\t}\n\t\tconsole.error(state, error)\n\t},\n}\n\nexport default new Store({\n\tmodules: {\n\t\tusers,\n\t\tapps,\n\t\tsettings,\n\t\toc,\n\t},\n\tstrict: debug,\n\n\tmutations,\n})\n","/**\n * @copyright Copyright (c) 2018 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @license AGPL-3.0-or-later\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\nconst state = {\n\tserverData: {},\n}\nconst mutations = {\n\tsetServerData(state, data) {\n\t\tstate.serverData = data\n\t},\n}\nconst getters = {\n\tgetServerData(state) {\n\t\treturn state.serverData\n\t},\n}\nconst actions = {}\n\nexport default { state, mutations, getters, actions }\n","/**\n * @copyright Copyright (c) 2018 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n * @author rakekniven <mark.ziegler@rakekniven.de>\n * @author Roeland Jago Douma <roeland@famdouma.nl>\n *\n * @license AGPL-3.0-or-later\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\nimport Vue from 'vue'\nimport VTooltip from 'v-tooltip'\nimport { sync } from 'vuex-router-sync'\n\nimport App from './App.vue'\nimport router from './router'\nimport store from './store'\n\nVue.use(VTooltip, { defaultHtml: false })\n\nsync(store, router)\n\n// CSP config for webpack dynamic chunk loading\n// eslint-disable-next-line camelcase\n__webpack_nonce__ = btoa(OC.requestToken)\n\n// bind to window\nVue.prototype.t = t\nVue.prototype.n = n\nVue.prototype.OC = OC\nVue.prototype.OCA = OCA\n// eslint-disable-next-line camelcase\nVue.prototype.oc_userconfig = oc_userconfig\n\nconst app = new Vue({\n\trouter,\n\tstore,\n\trender: h => h(App),\n}).$mount('#content')\n\nexport { app, router, store }\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\tloaded: false,\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Flag the module as loaded\n\tmodule.loaded = true;\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","__webpack_require__.amdD = function () {\n\tthrow new Error('define cannot be used indirect');\n};","__webpack_require__.amdO = {};","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = function(module) {\n\tvar getter = module && module.__esModule ?\n\t\tfunction() { return module['default']; } :\n\t\tfunction() { return module; };\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = function(exports, definition) {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = function(chunkId) {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce(function(promises, key) {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = function(chunkId) {\n\t// return url for filenames based on template\n\treturn \"\" + {\"7418\":\"settings-apps-view\",\"8351\":\"settings-users\"}[chunkId] + \"-\" + chunkId + \".js?v=\" + {\"7418\":\"d54d22a587fea7ef7311\",\"8351\":\"48806c008b493bc010bb\"}[chunkId] + \"\";\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }","// define __esModule on exports\n__webpack_require__.r = function(exports) {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.nmd = function(module) {\n\tmodule.paths = [];\n\tif (!module.children) module.children = [];\n\treturn module;\n};","__webpack_require__.j = 8562;","var scriptUrl;\nif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\nvar document = __webpack_require__.g.document;\nif (!scriptUrl && document) {\n\tif (document.currentScript)\n\t\tscriptUrl = document.currentScript.src\n\tif (!scriptUrl) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tif(scripts.length) scriptUrl = scripts[scripts.length - 1].src\n\t}\n}\n// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\nif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\nscriptUrl = scriptUrl.replace(/#.*$/, \"\").replace(/\\?.*$/, \"\").replace(/\\/[^\\/]+$/, \"/\");\n__webpack_require__.p = scriptUrl;","__webpack_require__.b = document.baseURI || self.location.href;\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t8562: 0\n};\n\n__webpack_require__.f.j = function(chunkId, promises) {\n\t\t// JSONP chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\n\t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n\t\t\t// a Promise means \"currently loading\".\n\t\t\tif(installedChunkData) {\n\t\t\t\tpromises.push(installedChunkData[2]);\n\t\t\t} else {\n\t\t\t\tif(true) { // all chunks have JS\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = new Promise(function(resolve, reject) { installedChunkData = installedChunks[chunkId] = [resolve, reject]; });\n\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n\t\t\t\t\t// start chunk loading\n\t\t\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\t\t\tvar error = new Error();\n\t\t\t\t\tvar loadingEnded = function(event) {\n\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\t\tif(installedChunkData) {\n\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t\t\t} else installedChunks[chunkId] = 0;\n\t\t\t}\n\t\t}\n};\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = function(chunkId) { return installedChunks[chunkId] === 0; };\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = function(parentChunkLoadingFunction, data) {\n\tvar chunkIds = data[0];\n\tvar moreModules = data[1];\n\tvar runtime = data[2];\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some(function(id) { return installedChunks[id] !== 0; })) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunknextcloud\"] = self[\"webpackChunknextcloud\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","__webpack_require__.nc = undefined;","// startup\n// Load entry module and return exports\n// This entry module depends on other loaded chunks and execution need to be delayed\nvar __webpack_exports__ = __webpack_require__.O(undefined, [7874], function() { return __webpack_require__(78778); })\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["deferred","inProgress","dataWebpackPrefix","_h","this","$createElement","_self","_c","Users","Apps","Vue","Router","mode","base","generateUrl","linkActiveClass","routes","path","component","props","name","children","sanitize","url","replace","confirmPassword","options","axios","data","params","getLoggerBuilder","setApp","detectUser","build","orderGroups","groups","orderBy","sort","a","b","usercount","disabled","localeCompare","defaults","id","canAdd","canRemove","mutations","appendUsers","state","usersObj","users","concat","Object","keys","map","userid","usersOffset","usersLimit","setPasswordPolicyMinLength","length","minPasswordLength","initGroups","userCount","group","assign","addGroup","gid","displayName","find","push","e","console","error","renameGroup","groupIndex","findIndex","groupSearch","updatedGroup","splice","removeGroup","addUserGroup","user","enabled","removeUserGroup","indexOf","addUserSubAdmin","subadmin","removeUserSubAdmin","deleteUser","userIndex","commit","actionType","addUserData","response","ocs","enableDisableUser","updateUserCounts","disabledGroup","forEach","userGroup","logger","setUserData","key","value","humanValue","OC","Util","computerFileSize","resetUsers","CancelToken","searchRequestCancelSource","getters","getUsers","getGroups","getSubadminGroups","filter","getPasswordPolicyMinLength","getUsersOffset","getUsersLimit","getUserCount","actions","context","offset","limit","search","cancel","source","api","generateOcsUrl","encodeURIComponent","cancelToken","token","then","usersCount","catch","limitParam","getUsersFromList","getUsersFromGroup","groupid","groupId","getCapabilities","password_policy","minLength","wipeUserDevices","addUser","dispatch","password","email","quota","language","userStatus","allowedEmpty","Promise","reject","Error","sendWelcomeMail","APPS_API_FAILURE","showError","t","message","isHTML","initCategories","categories","updateCount","setUpdateCount","addCategory","category","appendCategories","categoriesArray","setAllApps","apps","setError","appId","Array","isArray","_id","app","clearError","enableApp","active","disableApp","removable","canUnInstall","uninstallApp","needsDownload","installed","canInstall","updateApp","version","update","resetApps","reset","startLoading","loading","stopLoading","appIds","_appId","update_required","showInfo","onClick","window","location","reload","close","setTimeout","forceEnableApp","getAllApps","getCategories","loadingList","getUpdateCount","setAppConfig","Vuex","API_FAILURE","meta","Store","modules","settings","serverData","setServerData","getServerData","oc","strict","process","VTooltip","defaultHtml","sync","store","router","__webpack_nonce__","btoa","requestToken","n","OCA","oc_userconfig","render","h","App","$mount","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","exports","module","loaded","__webpack_modules__","call","m","amdD","amdO","O","result","chunkIds","fn","priority","notFulfilled","Infinity","i","fulfilled","j","every","r","getter","__esModule","d","definition","o","defineProperty","enumerable","get","f","chunkId","all","reduce","promises","u","g","globalThis","Function","obj","prop","prototype","hasOwnProperty","l","done","script","needAttach","scripts","document","getElementsByTagName","s","getAttribute","createElement","charset","timeout","nc","setAttribute","src","onScriptComplete","prev","event","onerror","onload","clearTimeout","doneFns","parentNode","removeChild","bind","type","target","head","appendChild","Symbol","toStringTag","nmd","paths","scriptUrl","importScripts","currentScript","p","baseURI","self","href","installedChunks","installedChunkData","promise","resolve","errorType","realSrc","request","webpackJsonpCallback","parentChunkLoadingFunction","moreModules","runtime","some","chunkLoadingGlobal","__webpack_exports__"],"sourceRoot":""}
\ No newline at end of file diff --git a/dist/updatenotification-updatenotification.js b/dist/updatenotification-updatenotification.js index 115c6c1b6cf..ca8840be62a 100644 --- a/dist/updatenotification-updatenotification.js +++ b/dist/updatenotification-updatenotification.js @@ -1,3 +1,3 @@ /*! For license information please see updatenotification-updatenotification.js.LICENSE.txt */ -!function(){"use strict";var e,a={38296:function(e,a,i){var o=i(20144),s=i(79753),r=i(32996),p=i.n(r),c=i(98266),l=i.n(c),d=i(13299),u=i.n(d),h=i(57290),f=i.n(h),v=i(34741),A=i(2649),g=i.n(A),m=i(4820),C=i(16453),b=i(26932),w=i(20296),_=i.n(w);function U(n,t,e,a,i,o,s){try{var r=n[o](s),p=r.value}catch(n){return void e(n)}r.done?t(p):Promise.resolve(p).then(a,i)}var k=(0,i(17499).IY)().setApp("updatenotification").detectUser().build();v.VTooltip.options.defaultHtml=!1;var y={name:"UpdateNotification",components:{NcMultiselect:l(),NcPopoverMenu:p(),NcSettingsSection:u(),NcNoteCard:f()},directives:{ClickOutside:g(),tooltip:v.VTooltip},data:function(){return{loadingGroups:!1,newVersionString:"",lastCheckedDate:"",isUpdateChecked:!1,webUpdaterEnabled:!0,isWebUpdaterRecommended:!0,updaterEnabled:!0,versionIsEol:!1,downloadLink:"",isNewVersionAvailable:!1,hasValidSubscription:!1,updateServerURL:"",changelogURL:"",whatsNewData:[],currentChannel:"",channels:[],notifyGroups:"",groups:[],isDefaultUpdateServerURL:!0,enableChangeWatcher:!1,availableAppUpdates:[],missingAppUpdates:[],appStoreFailed:!1,appStoreDisabled:!1,isListFetched:!1,hideMissingUpdates:!1,hideAvailableUpdates:!0,openedWhatsNew:!1,openedUpdateChannelMenu:!1}},computed:{newVersionAvailableString:function(){return t("updatenotification","A new version is available: <strong>{newVersionString}</strong>",{newVersionString:this.newVersionString})},noteDelayedStableString:function(){return t("updatenotification","Note that after a new release the update only shows up after the first minor release or later. We roll out new versions spread out over time to our users and sometimes skip a version when issues are found. Learn more about updates and release channels at {link}").replace("{link}",'<a href="https://nextcloud.com/release-channels/">https://nextcloud.com/release-channels/</a>')},lastCheckedOnString:function(){return t("updatenotification","Checked on {lastCheckedDate}",{lastCheckedDate:this.lastCheckedDate})},statusText:function(){return this.isListFetched?this.appStoreDisabled?t("updatenotification","Please make sure your config.php does not set <samp>appstoreenabled</samp> to false."):this.appStoreFailed?t("updatenotification","Could not connect to the App Store or no updates have been returned at all. Search manually for updates or make sure your server has access to the internet and can connect to the App Store."):0===this.missingAppUpdates.length?t("updatenotification","<strong>All</strong> apps have a compatible version for this Nextcloud version available.",this):n("updatenotification","<strong>%n</strong> app has no compatible version for this Nextcloud version available.","<strong>%n</strong> apps have no compatible version for this Nextcloud version available.",this.missingAppUpdates.length):t("updatenotification","Checking apps for compatible versions")},whatsNew:function(){if(0===this.whatsNewData.length)return null;var n=[];for(var e in this.whatsNewData)n[e]={icon:"icon-checkmark",longtext:this.whatsNewData[e]};return this.changelogURL&&n.push({href:this.changelogURL,text:t("updatenotification","View changelog"),icon:"icon-link",target:"_blank",action:""}),n},channelList:function(){var n=[];return n.push({text:t("updatenotification","Enterprise"),longtext:t("updatenotification","For enterprise use. Provides always the latest patch level, but will not update to the next major release immediately. That update happens once Nextcloud GmbH has done additional hardening and testing for large-scale and mission-critical deployments. This channel is only available to customers and provides the Nextcloud Enterprise package."),icon:"icon-star",active:"enterprise"===this.currentChannel,disabled:!this.hasValidSubscription,action:this.changeReleaseChannelToEnterprise}),n.push({text:t("updatenotification","Stable"),longtext:t("updatenotification","The most recent stable version. It is suited for regular use and will always update to the latest major version."),icon:"icon-checkmark",active:"stable"===this.currentChannel,action:this.changeReleaseChannelToStable}),n.push({text:t("updatenotification","Beta"),longtext:t("updatenotification","A pre-release version only for testing new features, not for production environments."),icon:"icon-category-customization",active:"beta"===this.currentChannel,action:this.changeReleaseChannelToBeta}),this.isNonDefaultChannel&&n.push({text:this.currentChannel,icon:"icon-rename",active:!0}),n},isNonDefaultChannel:function(){return"enterprise"!==this.currentChannel&&"stable"!==this.currentChannel&&"beta"!==this.currentChannel},localizedChannelName:function(){switch(this.currentChannel){case"enterprise":return t("updatenotification","Enterprise");case"stable":return t("updatenotification","Stable");case"beta":return t("updatenotification","Beta");default:return this.currentChannel}}},watch:{notifyGroups:function(n){if(this.enableChangeWatcher){var t=this.notifyGroups.map((function(n){return n.id}));OCP.AppConfig.setValue("updatenotification","notify_groups",JSON.stringify(t))}else this.enableChangeWatcher=!0},isNewVersionAvailable:function(){var n=this;this.isNewVersionAvailable&&m.default.get((0,s.generateOcsUrl)("apps/updatenotification/api/v1/applist/{newVersion}",{newVersion:this.newVersion})).then((function(t){var e=t.data;n.availableAppUpdates=e.ocs.data.available,n.missingAppUpdates=e.ocs.data.missing,n.isListFetched=!0,n.appStoreFailed=!1})).catch((function(t){var e=t.data;n.availableAppUpdates=[],n.missingAppUpdates=[],n.appStoreDisabled=e.ocs.data.appstore_disabled,n.isListFetched=!0,n.appStoreFailed=!0}))}},beforeMount:function(){var n=(0,C.loadState)("updatenotification","data");this.newVersion=n.newVersion,this.newVersionString=n.newVersionString,this.lastCheckedDate=n.lastChecked,this.isUpdateChecked=n.isUpdateChecked,this.webUpdaterEnabled=n.webUpdaterEnabled,this.isWebUpdaterRecommended=n.isWebUpdaterRecommended,this.updaterEnabled=n.updaterEnabled,this.downloadLink=n.downloadLink,this.isNewVersionAvailable=n.isNewVersionAvailable,this.updateServerURL=n.updateServerURL,this.currentChannel=n.currentChannel,this.channels=n.channels,this.notifyGroups=n.notifyGroups,this.isDefaultUpdateServerURL=n.isDefaultUpdateServerURL,this.versionIsEol=n.versionIsEol,this.hasValidSubscription=n.hasValidSubscription,n.changes&&n.changes.changelogURL&&(this.changelogURL=n.changes.changelogURL),n.changes&&n.changes.whatsNew&&(n.changes.whatsNew.admin&&(this.whatsNewData=this.whatsNewData.concat(n.changes.whatsNew.admin)),this.whatsNewData=this.whatsNewData.concat(n.changes.whatsNew.regular))},mounted:function(){this.searchGroup()},methods:{searchGroup:_()(function(){var n,t=(n=regeneratorRuntime.mark((function n(t){var e;return regeneratorRuntime.wrap((function(n){for(;;)switch(n.prev=n.next){case 0:return this.loadingGroups=!0,n.prev=1,n.next=4,m.default.get((0,s.generateOcsUrl)("cloud/groups/details"),{search:t,limit:20,offset:0});case 4:e=n.sent,this.groups=e.data.ocs.data.groups.sort((function(n,t){return n.displayname.localeCompare(t.displayname)})),n.next=11;break;case 8:n.prev=8,n.t0=n.catch(1),k.error("Could not fetch groups",n.t0);case 11:return n.prev=11,this.loadingGroups=!1,n.finish(11);case 14:case"end":return n.stop()}}),n,this,[[1,8,11,14]])})),function(){var t=this,e=arguments;return new Promise((function(a,i){var o=n.apply(t,e);function s(n){U(o,a,i,s,r,"next",n)}function r(n){U(o,a,i,s,r,"throw",n)}s(void 0)}))});return function(n){return t.apply(this,arguments)}}(),500),clickUpdaterButton:function(){m.default.get((0,s.generateUrl)("/apps/updatenotification/credentials")).then((function(n){var t=n.data,e=document.createElement("form");e.setAttribute("method","post"),e.setAttribute("action",(0,s.getRootUrl)()+"/updater/");var a=document.createElement("input");a.setAttribute("type","hidden"),a.setAttribute("name","updater-secret-input"),a.setAttribute("value",t.token),e.appendChild(a),document.body.appendChild(e),e.submit()}))},changeReleaseChannelToEnterprise:function(){this.changeReleaseChannel("enterprise")},changeReleaseChannelToStable:function(){this.changeReleaseChannel("stable")},changeReleaseChannelToBeta:function(){this.changeReleaseChannel("beta")},changeReleaseChannel:function(n){this.currentChannel=n,m.default.post((0,s.generateUrl)("/apps/updatenotification/channel"),{channel:this.currentChannel}).then((function(n){var t=n.data;(0,b.showSuccess)(t.data.message)})),this.openedUpdateChannelMenu=!1},toggleUpdateChannelMenu:function(){this.openedUpdateChannelMenu=!this.openedUpdateChannelMenu},toggleHideMissingUpdates:function(){this.hideMissingUpdates=!this.hideMissingUpdates},toggleHideAvailableUpdates:function(){this.hideAvailableUpdates=!this.hideAvailableUpdates},toggleMenu:function(){this.openedWhatsNew=!this.openedWhatsNew},closeUpdateChannelMenu:function(){this.openedUpdateChannelMenu=!1},hideMenu:function(){this.openedWhatsNew=!1}}},x=y,N=i(93379),S=i.n(N),D=i(7795),E=i.n(D),M=i(90569),L=i.n(M),R=i(3565),V=i.n(R),T=i(19216),O=i.n(T),P=i(44589),G=i.n(P),B=i(97815),W={};W.styleTagTransform=G(),W.setAttributes=V(),W.insert=L().bind(null,"head"),W.domAPI=E(),W.insertStyleElement=O(),S()(B.Z,W),B.Z&&B.Z.locals&&B.Z.locals;var F=i(16722),Z={};Z.styleTagTransform=G(),Z.setAttributes=V(),Z.insert=L().bind(null,"head"),Z.domAPI=E(),Z.insertStyleElement=O(),S()(F.Z,Z),F.Z&&F.Z.locals&&F.Z.locals;var j=(0,i(51900).Z)(x,(function(){var n=this,t=n.$createElement,e=n._self._c||t;return e("NcSettingsSection",{attrs:{id:"updatenotification",title:n.t("updatenotification","Update")}},[e("div",{staticClass:"update"},[n.isNewVersionAvailable?[n.versionIsEol?e("NcNoteCard",{attrs:{type:"warning"}},[n._v("\n\t\t\t\t"+n._s(n.t("updatenotification","The version you are running is not maintained anymore. Please make sure to update to a supported version as soon as possible."))+"\n\t\t\t")]):n._e(),n._v(" "),e("p",[e("span",{domProps:{innerHTML:n._s(n.newVersionAvailableString)}}),e("br"),n._v(" "),n.isListFetched?n._e():e("span",{staticClass:"icon icon-loading-small"}),n._v(" "),e("span",{domProps:{innerHTML:n._s(n.statusText)}})]),n._v(" "),n.missingAppUpdates.length?[e("h3",{on:{click:n.toggleHideMissingUpdates}},[n._v("\n\t\t\t\t\t"+n._s(n.t("updatenotification","Apps missing compatible version"))+"\n\t\t\t\t\t"),n.hideMissingUpdates?n._e():e("span",{staticClass:"icon icon-triangle-n"}),n._v(" "),n.hideMissingUpdates?e("span",{staticClass:"icon icon-triangle-s"}):n._e()]),n._v(" "),n.hideMissingUpdates?n._e():e("ul",{staticClass:"applist"},n._l(n.missingAppUpdates,(function(t,a){return e("li",{key:a},[e("a",{attrs:{href:"https://apps.nextcloud.com/apps/"+t.appId,title:n.t("settings","View in store")}},[n._v(n._s(t.appName)+" ↗")])])})),0)]:n._e(),n._v(" "),n.availableAppUpdates.length?[e("h3",{on:{click:n.toggleHideAvailableUpdates}},[n._v("\n\t\t\t\t\t"+n._s(n.t("updatenotification","Apps with compatible version"))+"\n\t\t\t\t\t"),n.hideAvailableUpdates?n._e():e("span",{staticClass:"icon icon-triangle-n"}),n._v(" "),n.hideAvailableUpdates?e("span",{staticClass:"icon icon-triangle-s"}):n._e()]),n._v(" "),n.hideAvailableUpdates?n._e():e("ul",{staticClass:"applist"},n._l(n.availableAppUpdates,(function(t,a){return e("li",{key:a},[e("a",{attrs:{href:"https://apps.nextcloud.com/apps/"+t.appId,title:n.t("settings","View in store")}},[n._v(n._s(t.appName)+" ↗")])])})),0)]:n._e(),n._v(" "),!n.isWebUpdaterRecommended&&n.updaterEnabled&&n.webUpdaterEnabled?[e("h3",{staticClass:"warning"},[n._v("\n\t\t\t\t\t"+n._s(n.t("updatenotification","Please note that the web updater is not recommended with more than 100 users! Please use the command line updater instead!"))+"\n\t\t\t\t")])]:n._e(),n._v(" "),e("div",[n.updaterEnabled&&n.webUpdaterEnabled?e("a",{staticClass:"button primary",attrs:{href:"#"},on:{click:n.clickUpdaterButton}},[n._v(n._s(n.t("updatenotification","Open updater")))]):n._e(),n._v(" "),n.downloadLink?e("a",{staticClass:"button",class:{hidden:!n.updaterEnabled},attrs:{href:n.downloadLink}},[n._v(n._s(n.t("updatenotification","Download now")))]):n._e(),n._v(" "),n.updaterEnabled&&!n.webUpdaterEnabled?e("span",[n._v("\n\t\t\t\t\t"+n._s(n.t("updatenotification","Please use the command line updater to update."))+"\n\t\t\t\t")]):n._e(),n._v(" "),n.whatsNew?e("div",{staticClass:"whatsNew"},[e("div",{staticClass:"toggleWhatsNew"},[e("a",{directives:[{name:"click-outside",rawName:"v-click-outside",value:n.hideMenu,expression:"hideMenu"}],staticClass:"button",on:{click:n.toggleMenu}},[n._v(n._s(n.t("updatenotification","What's new?")))]),n._v(" "),e("div",{staticClass:"popovermenu",class:{"menu-center":!0,open:n.openedWhatsNew}},[e("NcPopoverMenu",{attrs:{menu:n.whatsNew}})],1)])]):n._e()])]:n.isUpdateChecked?[n._v("\n\t\t\t"+n._s(n.t("updatenotification","Your version is up to date."))+"\n\t\t\t"),e("span",{directives:[{name:"tooltip",rawName:"v-tooltip.auto",value:n.lastCheckedOnString,expression:"lastCheckedOnString",modifiers:{auto:!0}}],staticClass:"icon-info svg"})]:[n._v("\n\t\t\t"+n._s(n.t("updatenotification","The update check is not yet finished. Please refresh the page."))+"\n\t\t")],n._v(" "),n.isDefaultUpdateServerURL?n._e():[e("p",{staticClass:"topMargin"},[e("em",[n._v(n._s(n.t("updatenotification","A non-default update server is in use to be checked for updates:"))+" "),e("code",[n._v(n._s(n.updateServerURL))])])])]],2),n._v(" "),e("div",[n._v("\n\t\t"+n._s(n.t("updatenotification","You can change the update channel below which also affects the apps management page. E.g. after switching to the beta channel, beta app updates will be offered to you in the apps management page."))+"\n\t")]),n._v(" "),e("h3",{staticClass:"update-channel-selector"},[n._v("\n\t\t"+n._s(n.t("updatenotification","Update channel:"))+"\n\t\t"),e("div",{directives:[{name:"click-outside",rawName:"v-click-outside",value:n.closeUpdateChannelMenu,expression:"closeUpdateChannelMenu"}],staticClass:"update-menu"},[e("span",{staticClass:"icon-update-menu",on:{click:n.toggleUpdateChannelMenu}},[n._v("\n\t\t\t\t"+n._s(n.localizedChannelName)+"\n\t\t\t\t"),e("span",{staticClass:"icon-triangle-s"})]),n._v(" "),e("div",{staticClass:"popovermenu menu menu-center",class:{"show-menu":n.openedUpdateChannelMenu}},[e("NcPopoverMenu",{attrs:{menu:n.channelList}})],1)])]),n._v(" "),e("span",{staticClass:"msg",attrs:{id:"channel_save_msg"}}),e("br"),n._v(" "),e("p",[e("em",[n._v(n._s(n.t("updatenotification","You can always update to a newer version. But you can never downgrade to a more stable version.")))]),e("br"),n._v(" "),e("em",{domProps:{innerHTML:n._s(n.noteDelayedStableString)}})]),n._v(" "),e("p",{attrs:{id:"oca_updatenotification_groups"}},[n._v("\n\t\t"+n._s(n.t("updatenotification","Notify members of the following groups about available updates:"))+"\n\t\t"),e("NcMultiselect",{attrs:{options:n.groups,multiple:!0,searchable:!0,label:"displayname",loading:n.loadingGroups,"show-no-options":!1,"close-on-select":!1,"track-by":"id","tag-width":75},on:{"search-change":n.searchGroup},model:{value:n.notifyGroups,callback:function(t){n.notifyGroups=t},expression:"notifyGroups"}}),e("br"),n._v(" "),"daily"===n.currentChannel||"git"===n.currentChannel?e("em",[n._v(n._s(n.t("updatenotification","Only notifications for app updates are available.")))]):n._e(),n._v(" "),"daily"===n.currentChannel?e("em",[n._v(n._s(n.t("updatenotification","The selected update channel makes dedicated notifications for the server obsolete.")))]):n._e(),n._v(" "),"git"===n.currentChannel?e("em",[n._v(n._s(n.t("updatenotification","The selected update channel does not support updates of the server.")))]):n._e()],1)])}),[],!1,null,"3ebf503a",null).exports;o.ZP.mixin({methods:{t:function(n,t,e,a,i){return OC.L10N.translate(n,t,e,a,i)},n:function(n,t,e,a,i,o){return OC.L10N.translatePlural(n,t,e,a,i,o)}}}),new o.ZP({el:"#updatenotification",render:function(n){return n(j)}})},97815:function(n,t,e){var a=e(87537),i=e.n(a),o=e(23645),s=e.n(o)()(i());s.push([n.id,"#updatenotification>*[data-v-3ebf503a]{max-width:900px}#updatenotification div.update[data-v-3ebf503a],#updatenotification p[data-v-3ebf503a]:not(.inlineblock){margin-bottom:25px}#updatenotification h2.inlineblock[data-v-3ebf503a]{margin-top:25px}#updatenotification h3[data-v-3ebf503a]{cursor:pointer}#updatenotification h3 .icon[data-v-3ebf503a]{cursor:pointer}#updatenotification h3[data-v-3ebf503a]:first-of-type{margin-top:0}#updatenotification h3.update-channel-selector[data-v-3ebf503a]{display:inline-block;cursor:inherit}#updatenotification .icon[data-v-3ebf503a]{display:inline-block;margin-bottom:-3px}#updatenotification .icon-triangle-s[data-v-3ebf503a],#updatenotification .icon-triangle-n[data-v-3ebf503a]{opacity:.5}#updatenotification .whatsNew[data-v-3ebf503a]{display:inline-block}#updatenotification .toggleWhatsNew[data-v-3ebf503a]{position:relative}#updatenotification .popovermenu[data-v-3ebf503a]{margin-top:5px;width:300px}#updatenotification .popovermenu p[data-v-3ebf503a]{margin-bottom:0;width:100%}#updatenotification .applist[data-v-3ebf503a]{margin-bottom:25px}#updatenotification .update-menu[data-v-3ebf503a]{position:relative;cursor:pointer;margin-left:3px;display:inline-block}#updatenotification .update-menu .icon-update-menu[data-v-3ebf503a]{cursor:inherit}#updatenotification .update-menu .icon-update-menu .icon-triangle-s[data-v-3ebf503a]{display:inline-block;vertical-align:middle;cursor:inherit;opacity:1}#updatenotification .update-menu .popovermenu[data-v-3ebf503a]{display:none;top:28px}#updatenotification .update-menu .popovermenu.show-menu[data-v-3ebf503a]{display:block}","",{version:3,sources:["webpack://./apps/updatenotification/src/components/UpdateNotification.vue"],names:[],mappings:"AA4cC,uCACC,eAAA,CAGD,yGAEC,kBAAA,CAED,oDACC,eAAA,CAED,wCACC,cAAA,CACA,8CACC,cAAA,CAED,sDACC,YAAA,CAED,gEACC,oBAAA,CACA,cAAA,CAGF,2CACC,oBAAA,CACA,kBAAA,CAED,4GACC,UAAA,CAED,+CACC,oBAAA,CAED,qDACC,iBAAA,CAED,kDAKC,cAAA,CACA,WAAA,CALA,oDACC,eAAA,CACA,UAAA,CAKF,8CACC,kBAAA,CAGD,kDACC,iBAAA,CACA,cAAA,CACA,eAAA,CACA,oBAAA,CACA,oEACC,cAAA,CACA,qFACC,oBAAA,CACA,qBAAA,CACA,cAAA,CACA,SAAA,CAGF,+DACC,YAAA,CACA,QAAA,CACA,yEACC,aAAA",sourcesContent:["\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n#updatenotification {\n\t& > * {\n\t\tmax-width: 900px;\n\t}\n\n\tdiv.update,\n\tp:not(.inlineblock) {\n\t\tmargin-bottom: 25px;\n\t}\n\th2.inlineblock {\n\t\tmargin-top: 25px;\n\t}\n\th3 {\n\t\tcursor: pointer;\n\t\t.icon {\n\t\t\tcursor: pointer;\n\t\t}\n\t\t&:first-of-type {\n\t\t\tmargin-top: 0;\n\t\t}\n\t\t&.update-channel-selector {\n\t\t\tdisplay: inline-block;\n\t\t\tcursor: inherit;\n\t\t}\n\t}\n\t.icon {\n\t\tdisplay: inline-block;\n\t\tmargin-bottom: -3px;\n\t}\n\t.icon-triangle-s, .icon-triangle-n {\n\t\topacity: 0.5;\n\t}\n\t.whatsNew {\n\t\tdisplay: inline-block;\n\t}\n\t.toggleWhatsNew {\n\t\tposition: relative;\n\t}\n\t.popovermenu {\n\t\tp {\n\t\t\tmargin-bottom: 0;\n\t\t\twidth: 100%;\n\t\t}\n\t\tmargin-top: 5px;\n\t\twidth: 300px;\n\t}\n\t.applist {\n\t\tmargin-bottom: 25px;\n\t}\n\n\t.update-menu {\n\t\tposition: relative;\n\t\tcursor: pointer;\n\t\tmargin-left: 3px;\n\t\tdisplay: inline-block;\n\t\t.icon-update-menu {\n\t\t\tcursor: inherit;\n\t\t\t.icon-triangle-s {\n\t\t\t\tdisplay: inline-block;\n\t\t\t\tvertical-align: middle;\n\t\t\t\tcursor: inherit;\n\t\t\t\topacity: 1;\n\t\t\t}\n\t\t}\n\t\t.popovermenu {\n\t\t\tdisplay: none;\n\t\t\ttop: 28px;\n\t\t\t&.show-menu {\n\t\t\t\tdisplay: block;\n\t\t\t}\n\t\t}\n\t}\n}\n"],sourceRoot:""}]),t.Z=s},16722:function(n,t,e){var a=e(87537),i=e.n(a),o=e(23645),s=e.n(o)()(i());s.push([n.id,"#updatenotification .popovermenu{margin-top:5px;width:300px}#updatenotification .popovermenu p{margin-top:5px;width:100%}#updatenotification .update-menu .icon-star:hover,#updatenotification .update-menu .icon-star:focus{background-image:var(--icon-starred)}#updatenotification .topMargin{margin-top:15px}","",{version:3,sources:["webpack://./apps/updatenotification/src/components/UpdateNotification.vue"],names:[],mappings:"AAuhBA,iCAKC,cAAA,CACA,WAAA,CALA,mCACC,cAAA,CACA,UAAA,CAMF,oGAEC,oCAAA,CAED,+BACC,eAAA",sourcesContent:["\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/* override needed to make menu wider */\n#updatenotification .popovermenu {\n\tp {\n\t\tmargin-top: 5px;\n\t\twidth: 100%;\n\t}\n\tmargin-top: 5px;\n\twidth: 300px;\n}\n/* override needed to replace yellow hover state with a dark one */\n#updatenotification .update-menu .icon-star:hover,\n#updatenotification .update-menu .icon-star:focus {\n\tbackground-image: var(--icon-starred);\n}\n#updatenotification .topMargin {\n\tmargin-top: 15px;\n}\n"],sourceRoot:""}]),t.Z=s}},i={};function o(n){var t=i[n];if(void 0!==t)return t.exports;var e=i[n]={id:n,loaded:!1,exports:{}};return a[n].call(e.exports,e,e.exports,o),e.loaded=!0,e.exports}o.m=a,o.amdD=function(){throw new Error("define cannot be used indirect")},o.amdO={},e=[],o.O=function(n,t,a,i){if(!t){var s=1/0;for(l=0;l<e.length;l++){t=e[l][0],a=e[l][1],i=e[l][2];for(var r=!0,p=0;p<t.length;p++)(!1&i||s>=i)&&Object.keys(o.O).every((function(n){return o.O[n](t[p])}))?t.splice(p--,1):(r=!1,i<s&&(s=i));if(r){e.splice(l--,1);var c=a();void 0!==c&&(n=c)}}return n}i=i||0;for(var l=e.length;l>0&&e[l-1][2]>i;l--)e[l]=e[l-1];e[l]=[t,a,i]},o.n=function(n){var t=n&&n.__esModule?function(){return n.default}:function(){return n};return o.d(t,{a:t}),t},o.d=function(n,t){for(var e in t)o.o(t,e)&&!o.o(n,e)&&Object.defineProperty(n,e,{enumerable:!0,get:t[e]})},o.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(n){if("object"==typeof window)return window}}(),o.o=function(n,t){return Object.prototype.hasOwnProperty.call(n,t)},o.r=function(n){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(n,"__esModule",{value:!0})},o.nmd=function(n){return n.paths=[],n.children||(n.children=[]),n},o.j=7292,function(){o.b=document.baseURI||self.location.href;var n={7292:0};o.O.j=function(t){return 0===n[t]};var t=function(t,e){var a,i,s=e[0],r=e[1],p=e[2],c=0;if(s.some((function(t){return 0!==n[t]}))){for(a in r)o.o(r,a)&&(o.m[a]=r[a]);if(p)var l=p(o)}for(t&&t(e);c<s.length;c++)i=s[c],o.o(n,i)&&n[i]&&n[i][0](),n[i]=0;return o.O(l)},e=self.webpackChunknextcloud=self.webpackChunknextcloud||[];e.forEach(t.bind(null,0)),e.push=t.bind(null,e.push.bind(e))}(),o.nc=void 0;var s=o.O(void 0,[7874],(function(){return o(38296)}));s=o.O(s)}(); -//# sourceMappingURL=updatenotification-updatenotification.js.map?v=790f65b11952d3dece3c
\ No newline at end of file +!function(){"use strict";var e,a={94224:function(e,a,i){var o=i(20144),s=i(79753),r=i(32996),p=i.n(r),c=i(98266),l=i.n(c),d=i(13299),u=i.n(d),h=i(57290),f=i.n(h),v=i(34741),A=i(2649),g=i.n(A),m=i(4820),C=i(16453),b=i(26932),w=i(20296),_=i.n(w);function U(n,t,e,a,i,o,s){try{var r=n[o](s),p=r.value}catch(n){return void e(n)}r.done?t(p):Promise.resolve(p).then(a,i)}var y=(0,i(17499).IY)().setApp("updatenotification").detectUser().build();v.VTooltip.options.defaultHtml=!1;var k={name:"UpdateNotification",components:{NcMultiselect:l(),NcPopoverMenu:p(),NcSettingsSection:u(),NcNoteCard:f()},directives:{ClickOutside:g(),tooltip:v.VTooltip},data:function(){return{loadingGroups:!1,newVersionString:"",lastCheckedDate:"",isUpdateChecked:!1,webUpdaterEnabled:!0,isWebUpdaterRecommended:!0,updaterEnabled:!0,versionIsEol:!1,downloadLink:"",isNewVersionAvailable:!1,hasValidSubscription:!1,updateServerURL:"",changelogURL:"",whatsNewData:[],currentChannel:"",channels:[],notifyGroups:"",groups:[],isDefaultUpdateServerURL:!0,enableChangeWatcher:!1,availableAppUpdates:[],missingAppUpdates:[],appStoreFailed:!1,appStoreDisabled:!1,isListFetched:!1,hideMissingUpdates:!1,hideAvailableUpdates:!0,openedWhatsNew:!1,openedUpdateChannelMenu:!1}},computed:{newVersionAvailableString:function(){return t("updatenotification","A new version is available: <strong>{newVersionString}</strong>",{newVersionString:this.newVersionString})},noteDelayedStableString:function(){return t("updatenotification","Note that after a new release the update only shows up after the first minor release or later. We roll out new versions spread out over time to our users and sometimes skip a version when issues are found. Learn more about updates and release channels at {link}").replace("{link}",'<a href="https://nextcloud.com/release-channels/">https://nextcloud.com/release-channels/</a>')},lastCheckedOnString:function(){return t("updatenotification","Checked on {lastCheckedDate}",{lastCheckedDate:this.lastCheckedDate})},statusText:function(){return this.isListFetched?this.appStoreDisabled?t("updatenotification","Please make sure your config.php does not set <samp>appstoreenabled</samp> to false."):this.appStoreFailed?t("updatenotification","Could not connect to the App Store or no updates have been returned at all. Search manually for updates or make sure your server has access to the internet and can connect to the App Store."):0===this.missingAppUpdates.length?t("updatenotification","<strong>All</strong> apps have a compatible version for this Nextcloud version available.",this):n("updatenotification","<strong>%n</strong> app has no compatible version for this Nextcloud version available.","<strong>%n</strong> apps have no compatible version for this Nextcloud version available.",this.missingAppUpdates.length):t("updatenotification","Checking apps for compatible versions")},whatsNew:function(){if(0===this.whatsNewData.length)return null;var n=[];for(var e in this.whatsNewData)n[e]={icon:"icon-checkmark",longtext:this.whatsNewData[e]};return this.changelogURL&&n.push({href:this.changelogURL,text:t("updatenotification","View changelog"),icon:"icon-link",target:"_blank",action:""}),n},channelList:function(){var n=[];return n.push({text:t("updatenotification","Enterprise"),longtext:t("updatenotification","For enterprise use. Provides always the latest patch level, but will not update to the next major release immediately. That update happens once Nextcloud GmbH has done additional hardening and testing for large-scale and mission-critical deployments. This channel is only available to customers and provides the Nextcloud Enterprise package."),icon:"icon-star",active:"enterprise"===this.currentChannel,disabled:!this.hasValidSubscription,action:this.changeReleaseChannelToEnterprise}),n.push({text:t("updatenotification","Stable"),longtext:t("updatenotification","The most recent stable version. It is suited for regular use and will always update to the latest major version."),icon:"icon-checkmark",active:"stable"===this.currentChannel,action:this.changeReleaseChannelToStable}),n.push({text:t("updatenotification","Beta"),longtext:t("updatenotification","A pre-release version only for testing new features, not for production environments."),icon:"icon-category-customization",active:"beta"===this.currentChannel,action:this.changeReleaseChannelToBeta}),this.isNonDefaultChannel&&n.push({text:this.currentChannel,icon:"icon-rename",active:!0}),n},isNonDefaultChannel:function(){return"enterprise"!==this.currentChannel&&"stable"!==this.currentChannel&&"beta"!==this.currentChannel},localizedChannelName:function(){switch(this.currentChannel){case"enterprise":return t("updatenotification","Enterprise");case"stable":return t("updatenotification","Stable");case"beta":return t("updatenotification","Beta");default:return this.currentChannel}}},watch:{notifyGroups:function(n){if(this.enableChangeWatcher){var t=this.notifyGroups.map((function(n){return n.id}));OCP.AppConfig.setValue("updatenotification","notify_groups",JSON.stringify(t))}else this.enableChangeWatcher=!0},isNewVersionAvailable:function(){var n=this;this.isNewVersionAvailable&&m.default.get((0,s.generateOcsUrl)("apps/updatenotification/api/v1/applist/{newVersion}",{newVersion:this.newVersion})).then((function(t){var e=t.data;n.availableAppUpdates=e.ocs.data.available,n.missingAppUpdates=e.ocs.data.missing,n.isListFetched=!0,n.appStoreFailed=!1})).catch((function(t){var e=t.data;n.availableAppUpdates=[],n.missingAppUpdates=[],n.appStoreDisabled=e.ocs.data.appstore_disabled,n.isListFetched=!0,n.appStoreFailed=!0}))}},beforeMount:function(){var n=(0,C.loadState)("updatenotification","data");this.newVersion=n.newVersion,this.newVersionString=n.newVersionString,this.lastCheckedDate=n.lastChecked,this.isUpdateChecked=n.isUpdateChecked,this.webUpdaterEnabled=n.webUpdaterEnabled,this.isWebUpdaterRecommended=n.isWebUpdaterRecommended,this.updaterEnabled=n.updaterEnabled,this.downloadLink=n.downloadLink,this.isNewVersionAvailable=n.isNewVersionAvailable,this.updateServerURL=n.updateServerURL,this.currentChannel=n.currentChannel,this.channels=n.channels,this.notifyGroups=n.notifyGroups,this.isDefaultUpdateServerURL=n.isDefaultUpdateServerURL,this.versionIsEol=n.versionIsEol,this.hasValidSubscription=n.hasValidSubscription,n.changes&&n.changes.changelogURL&&(this.changelogURL=n.changes.changelogURL),n.changes&&n.changes.whatsNew&&(n.changes.whatsNew.admin&&(this.whatsNewData=this.whatsNewData.concat(n.changes.whatsNew.admin)),this.whatsNewData=this.whatsNewData.concat(n.changes.whatsNew.regular))},mounted:function(){this.searchGroup()},methods:{searchGroup:_()(function(){var n,t=(n=regeneratorRuntime.mark((function n(t){var e;return regeneratorRuntime.wrap((function(n){for(;;)switch(n.prev=n.next){case 0:return this.loadingGroups=!0,n.prev=1,n.next=4,m.default.get((0,s.generateOcsUrl)("cloud/groups/details"),{search:t,limit:20,offset:0});case 4:e=n.sent,this.groups=e.data.ocs.data.groups.sort((function(n,t){return n.displayname.localeCompare(t.displayname)})),n.next=11;break;case 8:n.prev=8,n.t0=n.catch(1),y.error("Could not fetch groups",n.t0);case 11:return n.prev=11,this.loadingGroups=!1,n.finish(11);case 14:case"end":return n.stop()}}),n,this,[[1,8,11,14]])})),function(){var t=this,e=arguments;return new Promise((function(a,i){var o=n.apply(t,e);function s(n){U(o,a,i,s,r,"next",n)}function r(n){U(o,a,i,s,r,"throw",n)}s(void 0)}))});return function(n){return t.apply(this,arguments)}}(),500),clickUpdaterButton:function(){m.default.get((0,s.generateUrl)("/apps/updatenotification/credentials")).then((function(n){var t=n.data,e=document.createElement("form");e.setAttribute("method","post"),e.setAttribute("action",(0,s.getRootUrl)()+"/updater/");var a=document.createElement("input");a.setAttribute("type","hidden"),a.setAttribute("name","updater-secret-input"),a.setAttribute("value",t),e.appendChild(a),document.body.appendChild(e),e.submit()}))},changeReleaseChannelToEnterprise:function(){this.changeReleaseChannel("enterprise")},changeReleaseChannelToStable:function(){this.changeReleaseChannel("stable")},changeReleaseChannelToBeta:function(){this.changeReleaseChannel("beta")},changeReleaseChannel:function(n){this.currentChannel=n,m.default.post((0,s.generateUrl)("/apps/updatenotification/channel"),{channel:this.currentChannel}).then((function(n){var t=n.data;(0,b.showSuccess)(t.data.message)})),this.openedUpdateChannelMenu=!1},toggleUpdateChannelMenu:function(){this.openedUpdateChannelMenu=!this.openedUpdateChannelMenu},toggleHideMissingUpdates:function(){this.hideMissingUpdates=!this.hideMissingUpdates},toggleHideAvailableUpdates:function(){this.hideAvailableUpdates=!this.hideAvailableUpdates},toggleMenu:function(){this.openedWhatsNew=!this.openedWhatsNew},closeUpdateChannelMenu:function(){this.openedUpdateChannelMenu=!1},hideMenu:function(){this.openedWhatsNew=!1}}},x=k,N=i(93379),S=i.n(N),D=i(7795),E=i.n(D),M=i(90569),L=i.n(M),R=i(3565),V=i.n(R),T=i(19216),O=i.n(T),P=i(44589),G=i.n(P),B=i(98264),W={};W.styleTagTransform=G(),W.setAttributes=V(),W.insert=L().bind(null,"head"),W.domAPI=E(),W.insertStyleElement=O(),S()(B.Z,W),B.Z&&B.Z.locals&&B.Z.locals;var F=i(16722),Z={};Z.styleTagTransform=G(),Z.setAttributes=V(),Z.insert=L().bind(null,"head"),Z.domAPI=E(),Z.insertStyleElement=O(),S()(F.Z,Z),F.Z&&F.Z.locals&&F.Z.locals;var j=(0,i(51900).Z)(x,(function(){var n=this,t=n.$createElement,e=n._self._c||t;return e("NcSettingsSection",{attrs:{id:"updatenotification",title:n.t("updatenotification","Update")}},[e("div",{staticClass:"update"},[n.isNewVersionAvailable?[n.versionIsEol?e("NcNoteCard",{attrs:{type:"warning"}},[n._v("\n\t\t\t\t"+n._s(n.t("updatenotification","The version you are running is not maintained anymore. Please make sure to update to a supported version as soon as possible."))+"\n\t\t\t")]):n._e(),n._v(" "),e("p",[e("span",{domProps:{innerHTML:n._s(n.newVersionAvailableString)}}),e("br"),n._v(" "),n.isListFetched?n._e():e("span",{staticClass:"icon icon-loading-small"}),n._v(" "),e("span",{domProps:{innerHTML:n._s(n.statusText)}})]),n._v(" "),n.missingAppUpdates.length?[e("h3",{on:{click:n.toggleHideMissingUpdates}},[n._v("\n\t\t\t\t\t"+n._s(n.t("updatenotification","Apps missing compatible version"))+"\n\t\t\t\t\t"),n.hideMissingUpdates?n._e():e("span",{staticClass:"icon icon-triangle-n"}),n._v(" "),n.hideMissingUpdates?e("span",{staticClass:"icon icon-triangle-s"}):n._e()]),n._v(" "),n.hideMissingUpdates?n._e():e("ul",{staticClass:"applist"},n._l(n.missingAppUpdates,(function(t,a){return e("li",{key:a},[e("a",{attrs:{href:"https://apps.nextcloud.com/apps/"+t.appId,title:n.t("settings","View in store")}},[n._v(n._s(t.appName)+" ↗")])])})),0)]:n._e(),n._v(" "),n.availableAppUpdates.length?[e("h3",{on:{click:n.toggleHideAvailableUpdates}},[n._v("\n\t\t\t\t\t"+n._s(n.t("updatenotification","Apps with compatible version"))+"\n\t\t\t\t\t"),n.hideAvailableUpdates?n._e():e("span",{staticClass:"icon icon-triangle-n"}),n._v(" "),n.hideAvailableUpdates?e("span",{staticClass:"icon icon-triangle-s"}):n._e()]),n._v(" "),n.hideAvailableUpdates?n._e():e("ul",{staticClass:"applist"},n._l(n.availableAppUpdates,(function(t,a){return e("li",{key:a},[e("a",{attrs:{href:"https://apps.nextcloud.com/apps/"+t.appId,title:n.t("settings","View in store")}},[n._v(n._s(t.appName)+" ↗")])])})),0)]:n._e(),n._v(" "),!n.isWebUpdaterRecommended&&n.updaterEnabled&&n.webUpdaterEnabled?[e("h3",{staticClass:"warning"},[n._v("\n\t\t\t\t\t"+n._s(n.t("updatenotification","Please note that the web updater is not recommended with more than 100 users! Please use the command line updater instead!"))+"\n\t\t\t\t")])]:n._e(),n._v(" "),e("div",[n.updaterEnabled&&n.webUpdaterEnabled?e("a",{staticClass:"button primary",attrs:{href:"#"},on:{click:n.clickUpdaterButton}},[n._v(n._s(n.t("updatenotification","Open updater")))]):n._e(),n._v(" "),n.downloadLink?e("a",{staticClass:"button",class:{hidden:!n.updaterEnabled},attrs:{href:n.downloadLink}},[n._v(n._s(n.t("updatenotification","Download now")))]):n._e(),n._v(" "),n.updaterEnabled&&!n.webUpdaterEnabled?e("span",[n._v("\n\t\t\t\t\t"+n._s(n.t("updatenotification","Please use the command line updater to update."))+"\n\t\t\t\t")]):n._e(),n._v(" "),n.whatsNew?e("div",{staticClass:"whatsNew"},[e("div",{staticClass:"toggleWhatsNew"},[e("a",{directives:[{name:"click-outside",rawName:"v-click-outside",value:n.hideMenu,expression:"hideMenu"}],staticClass:"button",on:{click:n.toggleMenu}},[n._v(n._s(n.t("updatenotification","What's new?")))]),n._v(" "),e("div",{staticClass:"popovermenu",class:{"menu-center":!0,open:n.openedWhatsNew}},[e("NcPopoverMenu",{attrs:{menu:n.whatsNew}})],1)])]):n._e()])]:n.isUpdateChecked?[n._v("\n\t\t\t"+n._s(n.t("updatenotification","Your version is up to date."))+"\n\t\t\t"),e("span",{directives:[{name:"tooltip",rawName:"v-tooltip.auto",value:n.lastCheckedOnString,expression:"lastCheckedOnString",modifiers:{auto:!0}}],staticClass:"icon-info svg"})]:[n._v("\n\t\t\t"+n._s(n.t("updatenotification","The update check is not yet finished. Please refresh the page."))+"\n\t\t")],n._v(" "),n.isDefaultUpdateServerURL?n._e():[e("p",{staticClass:"topMargin"},[e("em",[n._v(n._s(n.t("updatenotification","A non-default update server is in use to be checked for updates:"))+" "),e("code",[n._v(n._s(n.updateServerURL))])])])]],2),n._v(" "),e("div",[n._v("\n\t\t"+n._s(n.t("updatenotification","You can change the update channel below which also affects the apps management page. E.g. after switching to the beta channel, beta app updates will be offered to you in the apps management page."))+"\n\t")]),n._v(" "),e("h3",{staticClass:"update-channel-selector"},[n._v("\n\t\t"+n._s(n.t("updatenotification","Update channel:"))+"\n\t\t"),e("div",{directives:[{name:"click-outside",rawName:"v-click-outside",value:n.closeUpdateChannelMenu,expression:"closeUpdateChannelMenu"}],staticClass:"update-menu"},[e("span",{staticClass:"icon-update-menu",on:{click:n.toggleUpdateChannelMenu}},[n._v("\n\t\t\t\t"+n._s(n.localizedChannelName)+"\n\t\t\t\t"),e("span",{staticClass:"icon-triangle-s"})]),n._v(" "),e("div",{staticClass:"popovermenu menu menu-center",class:{"show-menu":n.openedUpdateChannelMenu}},[e("NcPopoverMenu",{attrs:{menu:n.channelList}})],1)])]),n._v(" "),e("span",{staticClass:"msg",attrs:{id:"channel_save_msg"}}),e("br"),n._v(" "),e("p",[e("em",[n._v(n._s(n.t("updatenotification","You can always update to a newer version. But you can never downgrade to a more stable version.")))]),e("br"),n._v(" "),e("em",{domProps:{innerHTML:n._s(n.noteDelayedStableString)}})]),n._v(" "),e("p",{attrs:{id:"oca_updatenotification_groups"}},[n._v("\n\t\t"+n._s(n.t("updatenotification","Notify members of the following groups about available updates:"))+"\n\t\t"),e("NcMultiselect",{attrs:{options:n.groups,multiple:!0,searchable:!0,label:"displayname",loading:n.loadingGroups,"show-no-options":!1,"close-on-select":!1,"track-by":"id","tag-width":75},on:{"search-change":n.searchGroup},model:{value:n.notifyGroups,callback:function(t){n.notifyGroups=t},expression:"notifyGroups"}}),e("br"),n._v(" "),"daily"===n.currentChannel||"git"===n.currentChannel?e("em",[n._v(n._s(n.t("updatenotification","Only notifications for app updates are available.")))]):n._e(),n._v(" "),"daily"===n.currentChannel?e("em",[n._v(n._s(n.t("updatenotification","The selected update channel makes dedicated notifications for the server obsolete.")))]):n._e(),n._v(" "),"git"===n.currentChannel?e("em",[n._v(n._s(n.t("updatenotification","The selected update channel does not support updates of the server.")))]):n._e()],1)])}),[],!1,null,"e918afa2",null).exports;o.ZP.mixin({methods:{t:function(n,t,e,a,i){return OC.L10N.translate(n,t,e,a,i)},n:function(n,t,e,a,i,o){return OC.L10N.translatePlural(n,t,e,a,i,o)}}}),new o.ZP({el:"#updatenotification",render:function(n){return n(j)}})},98264:function(n,t,e){var a=e(87537),i=e.n(a),o=e(23645),s=e.n(o)()(i());s.push([n.id,"#updatenotification>*[data-v-e918afa2]{max-width:900px}#updatenotification div.update[data-v-e918afa2],#updatenotification p[data-v-e918afa2]:not(.inlineblock){margin-bottom:25px}#updatenotification h2.inlineblock[data-v-e918afa2]{margin-top:25px}#updatenotification h3[data-v-e918afa2]{cursor:pointer}#updatenotification h3 .icon[data-v-e918afa2]{cursor:pointer}#updatenotification h3[data-v-e918afa2]:first-of-type{margin-top:0}#updatenotification h3.update-channel-selector[data-v-e918afa2]{display:inline-block;cursor:inherit}#updatenotification .icon[data-v-e918afa2]{display:inline-block;margin-bottom:-3px}#updatenotification .icon-triangle-s[data-v-e918afa2],#updatenotification .icon-triangle-n[data-v-e918afa2]{opacity:.5}#updatenotification .whatsNew[data-v-e918afa2]{display:inline-block}#updatenotification .toggleWhatsNew[data-v-e918afa2]{position:relative}#updatenotification .popovermenu[data-v-e918afa2]{margin-top:5px;width:300px}#updatenotification .popovermenu p[data-v-e918afa2]{margin-bottom:0;width:100%}#updatenotification .applist[data-v-e918afa2]{margin-bottom:25px}#updatenotification .update-menu[data-v-e918afa2]{position:relative;cursor:pointer;margin-left:3px;display:inline-block}#updatenotification .update-menu .icon-update-menu[data-v-e918afa2]{cursor:inherit}#updatenotification .update-menu .icon-update-menu .icon-triangle-s[data-v-e918afa2]{display:inline-block;vertical-align:middle;cursor:inherit;opacity:1}#updatenotification .update-menu .popovermenu[data-v-e918afa2]{display:none;top:28px}#updatenotification .update-menu .popovermenu.show-menu[data-v-e918afa2]{display:block}","",{version:3,sources:["webpack://./apps/updatenotification/src/components/UpdateNotification.vue"],names:[],mappings:"AA4cC,uCACC,eAAA,CAGD,yGAEC,kBAAA,CAED,oDACC,eAAA,CAED,wCACC,cAAA,CACA,8CACC,cAAA,CAED,sDACC,YAAA,CAED,gEACC,oBAAA,CACA,cAAA,CAGF,2CACC,oBAAA,CACA,kBAAA,CAED,4GACC,UAAA,CAED,+CACC,oBAAA,CAED,qDACC,iBAAA,CAED,kDAKC,cAAA,CACA,WAAA,CALA,oDACC,eAAA,CACA,UAAA,CAKF,8CACC,kBAAA,CAGD,kDACC,iBAAA,CACA,cAAA,CACA,eAAA,CACA,oBAAA,CACA,oEACC,cAAA,CACA,qFACC,oBAAA,CACA,qBAAA,CACA,cAAA,CACA,SAAA,CAGF,+DACC,YAAA,CACA,QAAA,CACA,yEACC,aAAA",sourcesContent:["\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n#updatenotification {\n\t& > * {\n\t\tmax-width: 900px;\n\t}\n\n\tdiv.update,\n\tp:not(.inlineblock) {\n\t\tmargin-bottom: 25px;\n\t}\n\th2.inlineblock {\n\t\tmargin-top: 25px;\n\t}\n\th3 {\n\t\tcursor: pointer;\n\t\t.icon {\n\t\t\tcursor: pointer;\n\t\t}\n\t\t&:first-of-type {\n\t\t\tmargin-top: 0;\n\t\t}\n\t\t&.update-channel-selector {\n\t\t\tdisplay: inline-block;\n\t\t\tcursor: inherit;\n\t\t}\n\t}\n\t.icon {\n\t\tdisplay: inline-block;\n\t\tmargin-bottom: -3px;\n\t}\n\t.icon-triangle-s, .icon-triangle-n {\n\t\topacity: 0.5;\n\t}\n\t.whatsNew {\n\t\tdisplay: inline-block;\n\t}\n\t.toggleWhatsNew {\n\t\tposition: relative;\n\t}\n\t.popovermenu {\n\t\tp {\n\t\t\tmargin-bottom: 0;\n\t\t\twidth: 100%;\n\t\t}\n\t\tmargin-top: 5px;\n\t\twidth: 300px;\n\t}\n\t.applist {\n\t\tmargin-bottom: 25px;\n\t}\n\n\t.update-menu {\n\t\tposition: relative;\n\t\tcursor: pointer;\n\t\tmargin-left: 3px;\n\t\tdisplay: inline-block;\n\t\t.icon-update-menu {\n\t\t\tcursor: inherit;\n\t\t\t.icon-triangle-s {\n\t\t\t\tdisplay: inline-block;\n\t\t\t\tvertical-align: middle;\n\t\t\t\tcursor: inherit;\n\t\t\t\topacity: 1;\n\t\t\t}\n\t\t}\n\t\t.popovermenu {\n\t\t\tdisplay: none;\n\t\t\ttop: 28px;\n\t\t\t&.show-menu {\n\t\t\t\tdisplay: block;\n\t\t\t}\n\t\t}\n\t}\n}\n"],sourceRoot:""}]),t.Z=s},16722:function(n,t,e){var a=e(87537),i=e.n(a),o=e(23645),s=e.n(o)()(i());s.push([n.id,"#updatenotification .popovermenu{margin-top:5px;width:300px}#updatenotification .popovermenu p{margin-top:5px;width:100%}#updatenotification .update-menu .icon-star:hover,#updatenotification .update-menu .icon-star:focus{background-image:var(--icon-starred)}#updatenotification .topMargin{margin-top:15px}","",{version:3,sources:["webpack://./apps/updatenotification/src/components/UpdateNotification.vue"],names:[],mappings:"AAuhBA,iCAKC,cAAA,CACA,WAAA,CALA,mCACC,cAAA,CACA,UAAA,CAMF,oGAEC,oCAAA,CAED,+BACC,eAAA",sourcesContent:["\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/* override needed to make menu wider */\n#updatenotification .popovermenu {\n\tp {\n\t\tmargin-top: 5px;\n\t\twidth: 100%;\n\t}\n\tmargin-top: 5px;\n\twidth: 300px;\n}\n/* override needed to replace yellow hover state with a dark one */\n#updatenotification .update-menu .icon-star:hover,\n#updatenotification .update-menu .icon-star:focus {\n\tbackground-image: var(--icon-starred);\n}\n#updatenotification .topMargin {\n\tmargin-top: 15px;\n}\n"],sourceRoot:""}]),t.Z=s}},i={};function o(n){var t=i[n];if(void 0!==t)return t.exports;var e=i[n]={id:n,loaded:!1,exports:{}};return a[n].call(e.exports,e,e.exports,o),e.loaded=!0,e.exports}o.m=a,o.amdD=function(){throw new Error("define cannot be used indirect")},o.amdO={},e=[],o.O=function(n,t,a,i){if(!t){var s=1/0;for(l=0;l<e.length;l++){t=e[l][0],a=e[l][1],i=e[l][2];for(var r=!0,p=0;p<t.length;p++)(!1&i||s>=i)&&Object.keys(o.O).every((function(n){return o.O[n](t[p])}))?t.splice(p--,1):(r=!1,i<s&&(s=i));if(r){e.splice(l--,1);var c=a();void 0!==c&&(n=c)}}return n}i=i||0;for(var l=e.length;l>0&&e[l-1][2]>i;l--)e[l]=e[l-1];e[l]=[t,a,i]},o.n=function(n){var t=n&&n.__esModule?function(){return n.default}:function(){return n};return o.d(t,{a:t}),t},o.d=function(n,t){for(var e in t)o.o(t,e)&&!o.o(n,e)&&Object.defineProperty(n,e,{enumerable:!0,get:t[e]})},o.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(n){if("object"==typeof window)return window}}(),o.o=function(n,t){return Object.prototype.hasOwnProperty.call(n,t)},o.r=function(n){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(n,"__esModule",{value:!0})},o.nmd=function(n){return n.paths=[],n.children||(n.children=[]),n},o.j=7292,function(){o.b=document.baseURI||self.location.href;var n={7292:0};o.O.j=function(t){return 0===n[t]};var t=function(t,e){var a,i,s=e[0],r=e[1],p=e[2],c=0;if(s.some((function(t){return 0!==n[t]}))){for(a in r)o.o(r,a)&&(o.m[a]=r[a]);if(p)var l=p(o)}for(t&&t(e);c<s.length;c++)i=s[c],o.o(n,i)&&n[i]&&n[i][0](),n[i]=0;return o.O(l)},e=self.webpackChunknextcloud=self.webpackChunknextcloud||[];e.forEach(t.bind(null,0)),e.push=t.bind(null,e.push.bind(e))}(),o.nc=void 0;var s=o.O(void 0,[7874],(function(){return o(94224)}));s=o.O(s)}(); +//# sourceMappingURL=updatenotification-updatenotification.js.map?v=84e09c730fc054814d39
\ No newline at end of file diff --git a/dist/updatenotification-updatenotification.js.map b/dist/updatenotification-updatenotification.js.map index c1748de11ed..d8f883d3eed 100644 --- a/dist/updatenotification-updatenotification.js.map +++ b/dist/updatenotification-updatenotification.js.map @@ -1 +1 @@ -{"version":3,"file":"updatenotification-updatenotification.js?v=790f65b11952d3dece3c","mappings":";6BAAIA,gVC2IJ,wBACA,6BACA,aACA,QAEA,EAAAC,SAAA,uBAEA,OACA,0BACA,YACA,kBACA,kBACA,sBACA,gBAEA,YACA,iBACA,oBAEA,KAZA,WAaA,OACA,iBACA,oBACA,mBACA,mBACA,qBACA,2BACA,kBACA,gBACA,gBACA,yBACA,wBACA,mBACA,gBACA,gBACA,kBACA,YACA,gBACA,UACA,4BACA,uBAEA,uBACA,qBACA,kBACA,oBACA,iBACA,sBACA,wBACA,kBACA,6BAIA,UACA,0BADA,WAEA,iGACA,0CAIA,wBAPA,WAQA,uSACA,mHAGA,oBAZA,WAaA,8DACA,wCAIA,WAlBA,WAmBA,0BAIA,sBACA,+GAGA,oBACA,wNAGA,kCACA,yHACA,4OAbA,iEAgBA,SApCA,WAqCA,gCACA,YAEA,SACA,+BACA,2DAWA,OATA,mBACA,QACA,uBACA,8CACA,iBACA,gBACA,YAGA,GAGA,YAxDA,WAyDA,SAmCA,OAjCA,QACA,0CACA,yXACA,iBACA,0CACA,oCACA,+CAGA,QACA,sCACA,oJACA,sBACA,sCACA,2CAGA,QACA,oCACA,yHACA,mCACA,oCACA,yCAGA,0BACA,QACA,yBACA,mBACA,YAIA,GAGA,oBA/FA,WAgGA,wGAGA,qBAnGA,WAoGA,4BACA,iBACA,4CACA,aACA,wCACA,WACA,sCACA,QACA,8BAKA,OACA,aADA,SACA,GACA,6BAMA,yCACA,eAGA,oFARA,6BAUA,sBAdA,WAcA,WACA,4BAIA,0FACA,8BACA,+BACA,2CACA,uCACA,mBACA,uBACA,gCACA,yBACA,uBACA,gDACA,mBACA,yBAIA,YAnMA,WAqMA,mDAEA,6BACA,yCACA,mCACA,uCACA,2CACA,uDACA,qCACA,iCACA,mDACA,uCACA,qCACA,yBACA,iCACA,yDACA,iCACA,iDACA,oCACA,0CAEA,gCACA,2BACA,sEAEA,yEAIA,QAlOA,WAmOA,oBAGA,SACA,0KACA,sBADA,kBAGA,4DACA,SACA,SACA,WANA,OAGA,EAHA,OAQA,uDACA,qDATA,gDAYA,uCAZA,yBAcA,sBAdA,gTAgBA,K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","sources":["webpack:///nextcloud/webpack/runtime/chunk loaded","webpack:///nextcloud/apps/updatenotification/src/components/UpdateNotification.vue","webpack:///nextcloud/apps/updatenotification/src/components/UpdateNotification.vue?vue&type=script&lang=js&","webpack://nextcloud/./apps/updatenotification/src/components/UpdateNotification.vue?1a77","webpack://nextcloud/./apps/updatenotification/src/components/UpdateNotification.vue?fbe8","webpack://nextcloud/./apps/updatenotification/src/components/UpdateNotification.vue?1fb0","webpack:///nextcloud/apps/updatenotification/src/components/UpdateNotification.vue?vue&type=template&id=3ebf503a&scoped=true&","webpack:///nextcloud/apps/updatenotification/src/init.js","webpack:///nextcloud/apps/updatenotification/src/components/UpdateNotification.vue?vue&type=style&index=0&id=3ebf503a&lang=scss&scoped=true&","webpack:///nextcloud/apps/updatenotification/src/components/UpdateNotification.vue?vue&type=style&index=1&lang=scss&","webpack:///nextcloud/webpack/bootstrap","webpack:///nextcloud/webpack/runtime/amd define","webpack:///nextcloud/webpack/runtime/amd options","webpack:///nextcloud/webpack/runtime/compat get default export","webpack:///nextcloud/webpack/runtime/define property getters","webpack:///nextcloud/webpack/runtime/global","webpack:///nextcloud/webpack/runtime/hasOwnProperty shorthand","webpack:///nextcloud/webpack/runtime/make namespace object","webpack:///nextcloud/webpack/runtime/node module decorator","webpack:///nextcloud/webpack/runtime/runtimeId","webpack:///nextcloud/webpack/runtime/jsonp chunk loading","webpack:///nextcloud/webpack/runtime/nonce","webpack:///nextcloud/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = function(result, chunkIds, fn, priority) {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar chunkIds = deferred[i][0];\n\t\tvar fn = deferred[i][1];\n\t\tvar priority = deferred[i][2];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every(function(key) { return __webpack_require__.O[key](chunkIds[j]); })) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","<template>\n\t<NcSettingsSection id=\"updatenotification\" :title=\"t('updatenotification', 'Update')\">\n\t\t<div class=\"update\">\n\t\t\t<template v-if=\"isNewVersionAvailable\">\n\t\t\t\t<NcNoteCard v-if=\"versionIsEol\" type=\"warning\">\n\t\t\t\t\t{{ t('updatenotification', 'The version you are running is not maintained anymore. Please make sure to update to a supported version as soon as possible.') }}\n\t\t\t\t</NcNoteCard>\n\n\t\t\t\t<p>\n\t\t\t\t\t<span v-html=\"newVersionAvailableString\" /><br>\n\t\t\t\t\t<span v-if=\"!isListFetched\" class=\"icon icon-loading-small\" />\n\t\t\t\t\t<span v-html=\"statusText\" />\n\t\t\t\t</p>\n\n\t\t\t\t<template v-if=\"missingAppUpdates.length\">\n\t\t\t\t\t<h3 @click=\"toggleHideMissingUpdates\">\n\t\t\t\t\t\t{{ t('updatenotification', 'Apps missing compatible version') }}\n\t\t\t\t\t\t<span v-if=\"!hideMissingUpdates\" class=\"icon icon-triangle-n\" />\n\t\t\t\t\t\t<span v-if=\"hideMissingUpdates\" class=\"icon icon-triangle-s\" />\n\t\t\t\t\t</h3>\n\t\t\t\t\t<ul v-if=\"!hideMissingUpdates\" class=\"applist\">\n\t\t\t\t\t\t<li v-for=\"(app, index) in missingAppUpdates\" :key=\"index\">\n\t\t\t\t\t\t\t<a :href=\"'https://apps.nextcloud.com/apps/' + app.appId\" :title=\"t('settings', 'View in store')\">{{ app.appName }} ↗</a>\n\t\t\t\t\t\t</li>\n\t\t\t\t\t</ul>\n\t\t\t\t</template>\n\n\t\t\t\t<template v-if=\"availableAppUpdates.length\">\n\t\t\t\t\t<h3 @click=\"toggleHideAvailableUpdates\">\n\t\t\t\t\t\t{{ t('updatenotification', 'Apps with compatible version') }}\n\t\t\t\t\t\t<span v-if=\"!hideAvailableUpdates\" class=\"icon icon-triangle-n\" />\n\t\t\t\t\t\t<span v-if=\"hideAvailableUpdates\" class=\"icon icon-triangle-s\" />\n\t\t\t\t\t</h3>\n\t\t\t\t\t<ul v-if=\"!hideAvailableUpdates\" class=\"applist\">\n\t\t\t\t\t\t<li v-for=\"(app, index) in availableAppUpdates\" :key=\"index\">\n\t\t\t\t\t\t\t<a :href=\"'https://apps.nextcloud.com/apps/' + app.appId\" :title=\"t('settings', 'View in store')\">{{ app.appName }} ↗</a>\n\t\t\t\t\t\t</li>\n\t\t\t\t\t</ul>\n\t\t\t\t</template>\n\n\t\t\t\t<template v-if=\"!isWebUpdaterRecommended && updaterEnabled && webUpdaterEnabled\">\n\t\t\t\t\t<h3 class=\"warning\">\n\t\t\t\t\t\t{{ t('updatenotification', 'Please note that the web updater is not recommended with more than 100 users! Please use the command line updater instead!') }}\n\t\t\t\t\t</h3>\n\t\t\t\t</template>\n\n\t\t\t\t<div>\n\t\t\t\t\t<a v-if=\"updaterEnabled && webUpdaterEnabled\"\n\t\t\t\t\t\thref=\"#\"\n\t\t\t\t\t\tclass=\"button primary\"\n\t\t\t\t\t\t@click=\"clickUpdaterButton\">{{ t('updatenotification', 'Open updater') }}</a>\n\t\t\t\t\t<a v-if=\"downloadLink\"\n\t\t\t\t\t\t:href=\"downloadLink\"\n\t\t\t\t\t\tclass=\"button\"\n\t\t\t\t\t\t:class=\"{ hidden: !updaterEnabled }\">{{ t('updatenotification', 'Download now') }}</a>\n\t\t\t\t\t<span v-if=\"updaterEnabled && !webUpdaterEnabled\">\n\t\t\t\t\t\t{{ t('updatenotification', 'Please use the command line updater to update.') }}\n\t\t\t\t\t</span>\n\t\t\t\t\t<div v-if=\"whatsNew\" class=\"whatsNew\">\n\t\t\t\t\t\t<div class=\"toggleWhatsNew\">\n\t\t\t\t\t\t\t<a v-click-outside=\"hideMenu\" class=\"button\" @click=\"toggleMenu\">{{ t('updatenotification', 'What\\'s new?') }}</a>\n\t\t\t\t\t\t\t<div class=\"popovermenu\" :class=\"{ 'menu-center': true, open: openedWhatsNew }\">\n\t\t\t\t\t\t\t\t<NcPopoverMenu :menu=\"whatsNew\" />\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</template>\n\t\t\t<template v-else-if=\"!isUpdateChecked\">\n\t\t\t\t{{ t('updatenotification', 'The update check is not yet finished. Please refresh the page.') }}\n\t\t\t</template>\n\t\t\t<template v-else>\n\t\t\t\t{{ t('updatenotification', 'Your version is up to date.') }}\n\t\t\t\t<span v-tooltip.auto=\"lastCheckedOnString\" class=\"icon-info svg\" />\n\t\t\t</template>\n\n\t\t\t<template v-if=\"!isDefaultUpdateServerURL\">\n\t\t\t\t<p class=\"topMargin\">\n\t\t\t\t\t<em>{{ t('updatenotification', 'A non-default update server is in use to be checked for updates:') }} <code>{{ updateServerURL }}</code></em>\n\t\t\t\t</p>\n\t\t\t</template>\n\t\t</div>\n\n\t\t<div>\n\t\t\t{{ t('updatenotification', 'You can change the update channel below which also affects the apps management page. E.g. after switching to the beta channel, beta app updates will be offered to you in the apps management page.') }}\n\t\t</div>\n\n\t\t<h3 class=\"update-channel-selector\">\n\t\t\t{{ t('updatenotification', 'Update channel:') }}\n\t\t\t<div v-click-outside=\"closeUpdateChannelMenu\" class=\"update-menu\">\n\t\t\t\t<span class=\"icon-update-menu\" @click=\"toggleUpdateChannelMenu\">\n\t\t\t\t\t{{ localizedChannelName }}\n\t\t\t\t\t<span class=\"icon-triangle-s\" />\n\t\t\t\t</span>\n\t\t\t\t<div class=\"popovermenu menu menu-center\" :class=\"{ 'show-menu': openedUpdateChannelMenu}\">\n\t\t\t\t\t<NcPopoverMenu :menu=\"channelList\" />\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</h3>\n\t\t<span id=\"channel_save_msg\" class=\"msg\" /><br>\n\t\t<p>\n\t\t\t<em>{{ t('updatenotification', 'You can always update to a newer version. But you can never downgrade to a more stable version.') }}</em><br>\n\t\t\t<em v-html=\"noteDelayedStableString\" />\n\t\t</p>\n\n\t\t<p id=\"oca_updatenotification_groups\">\n\t\t\t{{ t('updatenotification', 'Notify members of the following groups about available updates:') }}\n\t\t\t<NcMultiselect v-model=\"notifyGroups\"\n\t\t\t\t:options=\"groups\"\n\t\t\t\t:multiple=\"true\"\n\t\t\t\t:searchable=\"true\"\n\t\t\t\tlabel=\"displayname\"\n\t\t\t\t:loading=\"loadingGroups\"\n\t\t\t\t:show-no-options=\"false\"\n\t\t\t\t:close-on-select=\"false\"\n\t\t\t\ttrack-by=\"id\"\n\t\t\t\t:tag-width=\"75\"\n\t\t\t\t@search-change=\"searchGroup\" /><br>\n\t\t\t<em v-if=\"currentChannel === 'daily' || currentChannel === 'git'\">{{ t('updatenotification', 'Only notifications for app updates are available.') }}</em>\n\t\t\t<em v-if=\"currentChannel === 'daily'\">{{ t('updatenotification', 'The selected update channel makes dedicated notifications for the server obsolete.') }}</em>\n\t\t\t<em v-if=\"currentChannel === 'git'\">{{ t('updatenotification', 'The selected update channel does not support updates of the server.') }}</em>\n\t\t</p>\n\t</NcSettingsSection>\n</template>\n\n<script>\nimport { generateUrl, getRootUrl, generateOcsUrl } from '@nextcloud/router'\nimport NcPopoverMenu from '@nextcloud/vue/dist/Components/NcPopoverMenu.js'\nimport NcMultiselect from '@nextcloud/vue/dist/Components/NcMultiselect.js'\nimport NcSettingsSection from '@nextcloud/vue/dist/Components/NcSettingsSection.js'\nimport NcNoteCard from '@nextcloud/vue/dist/Components/NcNoteCard.js'\nimport { VTooltip } from 'v-tooltip'\nimport ClickOutside from 'vue-click-outside'\nimport axios from '@nextcloud/axios'\nimport { loadState } from '@nextcloud/initial-state'\nimport { showSuccess } from '@nextcloud/dialogs'\nimport debounce from 'debounce'\nimport { getLoggerBuilder } from '@nextcloud/logger'\n\nconst logger = getLoggerBuilder()\n\t.setApp('updatenotification')\n\t.detectUser()\n\t.build()\n\nVTooltip.options.defaultHtml = false\n\nexport default {\n\tname: 'UpdateNotification',\n\tcomponents: {\n\t\tNcMultiselect,\n\t\tNcPopoverMenu,\n\t\tNcSettingsSection,\n\t\tNcNoteCard,\n\t},\n\tdirectives: {\n\t\tClickOutside,\n\t\ttooltip: VTooltip,\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tloadingGroups: false,\n\t\t\tnewVersionString: '',\n\t\t\tlastCheckedDate: '',\n\t\t\tisUpdateChecked: false,\n\t\t\twebUpdaterEnabled: true,\n\t\t\tisWebUpdaterRecommended: true,\n\t\t\tupdaterEnabled: true,\n\t\t\tversionIsEol: false,\n\t\t\tdownloadLink: '',\n\t\t\tisNewVersionAvailable: false,\n\t\t\thasValidSubscription: false,\n\t\t\tupdateServerURL: '',\n\t\t\tchangelogURL: '',\n\t\t\twhatsNewData: [],\n\t\t\tcurrentChannel: '',\n\t\t\tchannels: [],\n\t\t\tnotifyGroups: '',\n\t\t\tgroups: [],\n\t\t\tisDefaultUpdateServerURL: true,\n\t\t\tenableChangeWatcher: false,\n\n\t\t\tavailableAppUpdates: [],\n\t\t\tmissingAppUpdates: [],\n\t\t\tappStoreFailed: false,\n\t\t\tappStoreDisabled: false,\n\t\t\tisListFetched: false,\n\t\t\thideMissingUpdates: false,\n\t\t\thideAvailableUpdates: true,\n\t\t\topenedWhatsNew: false,\n\t\t\topenedUpdateChannelMenu: false,\n\t\t}\n\t},\n\n\tcomputed: {\n\t\tnewVersionAvailableString() {\n\t\t\treturn t('updatenotification', 'A new version is available: <strong>{newVersionString}</strong>', {\n\t\t\t\tnewVersionString: this.newVersionString,\n\t\t\t})\n\t\t},\n\n\t\tnoteDelayedStableString() {\n\t\t\treturn t('updatenotification', 'Note that after a new release the update only shows up after the first minor release or later. We roll out new versions spread out over time to our users and sometimes skip a version when issues are found. Learn more about updates and release channels at {link}')\n\t\t\t\t.replace('{link}', '<a href=\"https://nextcloud.com/release-channels/\">https://nextcloud.com/release-channels/</a>')\n\t\t},\n\n\t\tlastCheckedOnString() {\n\t\t\treturn t('updatenotification', 'Checked on {lastCheckedDate}', {\n\t\t\t\tlastCheckedDate: this.lastCheckedDate,\n\t\t\t})\n\t\t},\n\n\t\tstatusText() {\n\t\t\tif (!this.isListFetched) {\n\t\t\t\treturn t('updatenotification', 'Checking apps for compatible versions')\n\t\t\t}\n\n\t\t\tif (this.appStoreDisabled) {\n\t\t\t\treturn t('updatenotification', 'Please make sure your config.php does not set <samp>appstoreenabled</samp> to false.')\n\t\t\t}\n\n\t\t\tif (this.appStoreFailed) {\n\t\t\t\treturn t('updatenotification', 'Could not connect to the App Store or no updates have been returned at all. Search manually for updates or make sure your server has access to the internet and can connect to the App Store.')\n\t\t\t}\n\n\t\t\treturn this.missingAppUpdates.length === 0\n\t\t\t\t? t('updatenotification', '<strong>All</strong> apps have a compatible version for this Nextcloud version available.', this)\n\t\t\t\t: n('updatenotification', '<strong>%n</strong> app has no compatible version for this Nextcloud version available.', '<strong>%n</strong> apps have no compatible version for this Nextcloud version available.', this.missingAppUpdates.length)\n\t\t},\n\n\t\twhatsNew() {\n\t\t\tif (this.whatsNewData.length === 0) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\tconst whatsNew = []\n\t\t\tfor (const i in this.whatsNewData) {\n\t\t\t\twhatsNew[i] = { icon: 'icon-checkmark', longtext: this.whatsNewData[i] }\n\t\t\t}\n\t\t\tif (this.changelogURL) {\n\t\t\t\twhatsNew.push({\n\t\t\t\t\thref: this.changelogURL,\n\t\t\t\t\ttext: t('updatenotification', 'View changelog'),\n\t\t\t\t\ticon: 'icon-link',\n\t\t\t\t\ttarget: '_blank',\n\t\t\t\t\taction: '',\n\t\t\t\t})\n\t\t\t}\n\t\t\treturn whatsNew\n\t\t},\n\n\t\tchannelList() {\n\t\t\tconst channelList = []\n\n\t\t\tchannelList.push({\n\t\t\t\ttext: t('updatenotification', 'Enterprise'),\n\t\t\t\tlongtext: t('updatenotification', 'For enterprise use. Provides always the latest patch level, but will not update to the next major release immediately. That update happens once Nextcloud GmbH has done additional hardening and testing for large-scale and mission-critical deployments. This channel is only available to customers and provides the Nextcloud Enterprise package.'),\n\t\t\t\ticon: 'icon-star',\n\t\t\t\tactive: this.currentChannel === 'enterprise',\n\t\t\t\tdisabled: !this.hasValidSubscription,\n\t\t\t\taction: this.changeReleaseChannelToEnterprise,\n\t\t\t})\n\n\t\t\tchannelList.push({\n\t\t\t\ttext: t('updatenotification', 'Stable'),\n\t\t\t\tlongtext: t('updatenotification', 'The most recent stable version. It is suited for regular use and will always update to the latest major version.'),\n\t\t\t\ticon: 'icon-checkmark',\n\t\t\t\tactive: this.currentChannel === 'stable',\n\t\t\t\taction: this.changeReleaseChannelToStable,\n\t\t\t})\n\n\t\t\tchannelList.push({\n\t\t\t\ttext: t('updatenotification', 'Beta'),\n\t\t\t\tlongtext: t('updatenotification', 'A pre-release version only for testing new features, not for production environments.'),\n\t\t\t\ticon: 'icon-category-customization',\n\t\t\t\tactive: this.currentChannel === 'beta',\n\t\t\t\taction: this.changeReleaseChannelToBeta,\n\t\t\t})\n\n\t\t\tif (this.isNonDefaultChannel) {\n\t\t\t\tchannelList.push({\n\t\t\t\t\ttext: this.currentChannel,\n\t\t\t\t\ticon: 'icon-rename',\n\t\t\t\t\tactive: true,\n\t\t\t\t})\n\t\t\t}\n\n\t\t\treturn channelList\n\t\t},\n\n\t\tisNonDefaultChannel() {\n\t\t\treturn this.currentChannel !== 'enterprise' && this.currentChannel !== 'stable' && this.currentChannel !== 'beta'\n\t\t},\n\n\t\tlocalizedChannelName() {\n\t\t\tswitch (this.currentChannel) {\n\t\t\tcase 'enterprise':\n\t\t\t\treturn t('updatenotification', 'Enterprise')\n\t\t\tcase 'stable':\n\t\t\t\treturn t('updatenotification', 'Stable')\n\t\t\tcase 'beta':\n\t\t\t\treturn t('updatenotification', 'Beta')\n\t\t\tdefault:\n\t\t\t\treturn this.currentChannel\n\t\t\t}\n\t\t},\n\t},\n\n\twatch: {\n\t\tnotifyGroups(selectedOptions) {\n\t\t\tif (!this.enableChangeWatcher) {\n\t\t\t\t// The first time is when loading the app\n\t\t\t\tthis.enableChangeWatcher = true\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tconst groups = this.notifyGroups.map(group => {\n\t\t\t\treturn group.id\n\t\t\t})\n\n\t\t\tOCP.AppConfig.setValue('updatenotification', 'notify_groups', JSON.stringify(groups))\n\t\t},\n\t\tisNewVersionAvailable() {\n\t\t\tif (!this.isNewVersionAvailable) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\taxios.get(generateOcsUrl('apps/updatenotification/api/v1/applist/{newVersion}', {\n\t\t\t\tnewVersion: this.newVersion,\n\t\t\t})).then(({ data }) => {\n\t\t\t\tthis.availableAppUpdates = data.ocs.data.available\n\t\t\t\tthis.missingAppUpdates = data.ocs.data.missing\n\t\t\t\tthis.isListFetched = true\n\t\t\t\tthis.appStoreFailed = false\n\t\t\t}).catch(({ data }) => {\n\t\t\t\tthis.availableAppUpdates = []\n\t\t\t\tthis.missingAppUpdates = []\n\t\t\t\tthis.appStoreDisabled = data.ocs.data.appstore_disabled\n\t\t\t\tthis.isListFetched = true\n\t\t\t\tthis.appStoreFailed = true\n\t\t\t})\n\t\t},\n\t},\n\tbeforeMount() {\n\t\t// Parse server data\n\t\tconst data = loadState('updatenotification', 'data')\n\n\t\tthis.newVersion = data.newVersion\n\t\tthis.newVersionString = data.newVersionString\n\t\tthis.lastCheckedDate = data.lastChecked\n\t\tthis.isUpdateChecked = data.isUpdateChecked\n\t\tthis.webUpdaterEnabled = data.webUpdaterEnabled\n\t\tthis.isWebUpdaterRecommended = data.isWebUpdaterRecommended\n\t\tthis.updaterEnabled = data.updaterEnabled\n\t\tthis.downloadLink = data.downloadLink\n\t\tthis.isNewVersionAvailable = data.isNewVersionAvailable\n\t\tthis.updateServerURL = data.updateServerURL\n\t\tthis.currentChannel = data.currentChannel\n\t\tthis.channels = data.channels\n\t\tthis.notifyGroups = data.notifyGroups\n\t\tthis.isDefaultUpdateServerURL = data.isDefaultUpdateServerURL\n\t\tthis.versionIsEol = data.versionIsEol\n\t\tthis.hasValidSubscription = data.hasValidSubscription\n\t\tif (data.changes && data.changes.changelogURL) {\n\t\t\tthis.changelogURL = data.changes.changelogURL\n\t\t}\n\t\tif (data.changes && data.changes.whatsNew) {\n\t\t\tif (data.changes.whatsNew.admin) {\n\t\t\t\tthis.whatsNewData = this.whatsNewData.concat(data.changes.whatsNew.admin)\n\t\t\t}\n\t\t\tthis.whatsNewData = this.whatsNewData.concat(data.changes.whatsNew.regular)\n\t\t}\n\t},\n\n\tmounted() {\n\t\tthis.searchGroup()\n\t},\n\n\tmethods: {\n\t\tsearchGroup: debounce(async function(query) {\n\t\t\tthis.loadingGroups = true\n\t\t\ttry {\n\t\t\t\tconst response = await axios.get(generateOcsUrl('cloud/groups/details'), {\n\t\t\t\t\tsearch: query,\n\t\t\t\t\tlimit: 20,\n\t\t\t\t\toffset: 0,\n\t\t\t\t})\n\t\t\t\tthis.groups = response.data.ocs.data.groups.sort(function(a, b) {\n\t\t\t\t\treturn a.displayname.localeCompare(b.displayname)\n\t\t\t\t})\n\t\t\t} catch (err) {\n\t\t\t\tlogger.error('Could not fetch groups', err)\n\t\t\t} finally {\n\t\t\t\tthis.loadingGroups = false\n\t\t\t}\n\t\t}, 500),\n\t\t/**\n\t\t * Creates a new authentication token and loads the updater URL\n\t\t */\n\t\tclickUpdaterButton() {\n\t\t\taxios.get(generateUrl('/apps/updatenotification/credentials'))\n\t\t\t\t.then(({ data }) => {\n\t\t\t\t// create a form to send a proper post request to the updater\n\t\t\t\t\tconst form = document.createElement('form')\n\t\t\t\t\tform.setAttribute('method', 'post')\n\t\t\t\t\tform.setAttribute('action', getRootUrl() + '/updater/')\n\n\t\t\t\t\tconst hiddenField = document.createElement('input')\n\t\t\t\t\thiddenField.setAttribute('type', 'hidden')\n\t\t\t\t\thiddenField.setAttribute('name', 'updater-secret-input')\n\t\t\t\t\thiddenField.setAttribute('value', data.token)\n\n\t\t\t\t\tform.appendChild(hiddenField)\n\n\t\t\t\t\tdocument.body.appendChild(form)\n\t\t\t\t\tform.submit()\n\t\t\t\t})\n\t\t},\n\t\tchangeReleaseChannelToEnterprise() {\n\t\t\tthis.changeReleaseChannel('enterprise')\n\t\t},\n\t\tchangeReleaseChannelToStable() {\n\t\t\tthis.changeReleaseChannel('stable')\n\t\t},\n\t\tchangeReleaseChannelToBeta() {\n\t\t\tthis.changeReleaseChannel('beta')\n\t\t},\n\t\tchangeReleaseChannel(channel) {\n\t\t\tthis.currentChannel = channel\n\n\t\t\taxios.post(generateUrl('/apps/updatenotification/channel'), {\n\t\t\t\tchannel: this.currentChannel,\n\t\t\t}).then(({ data }) => {\n\t\t\t\tshowSuccess(data.data.message)\n\t\t\t})\n\n\t\t\tthis.openedUpdateChannelMenu = false\n\t\t},\n\t\ttoggleUpdateChannelMenu() {\n\t\t\tthis.openedUpdateChannelMenu = !this.openedUpdateChannelMenu\n\t\t},\n\t\ttoggleHideMissingUpdates() {\n\t\t\tthis.hideMissingUpdates = !this.hideMissingUpdates\n\t\t},\n\t\ttoggleHideAvailableUpdates() {\n\t\t\tthis.hideAvailableUpdates = !this.hideAvailableUpdates\n\t\t},\n\t\ttoggleMenu() {\n\t\t\tthis.openedWhatsNew = !this.openedWhatsNew\n\t\t},\n\t\tcloseUpdateChannelMenu() {\n\t\t\tthis.openedUpdateChannelMenu = false\n\t\t},\n\t\thideMenu() {\n\t\t\tthis.openedWhatsNew = false\n\t\t},\n\t},\n}\n</script>\n\n<style lang=\"scss\" scoped>\n\t#updatenotification {\n\t\t& > * {\n\t\t\tmax-width: 900px;\n\t\t}\n\n\t\tdiv.update,\n\t\tp:not(.inlineblock) {\n\t\t\tmargin-bottom: 25px;\n\t\t}\n\t\th2.inlineblock {\n\t\t\tmargin-top: 25px;\n\t\t}\n\t\th3 {\n\t\t\tcursor: pointer;\n\t\t\t.icon {\n\t\t\t\tcursor: pointer;\n\t\t\t}\n\t\t\t&:first-of-type {\n\t\t\t\tmargin-top: 0;\n\t\t\t}\n\t\t\t&.update-channel-selector {\n\t\t\t\tdisplay: inline-block;\n\t\t\t\tcursor: inherit;\n\t\t\t}\n\t\t}\n\t\t.icon {\n\t\t\tdisplay: inline-block;\n\t\t\tmargin-bottom: -3px;\n\t\t}\n\t\t.icon-triangle-s, .icon-triangle-n {\n\t\t\topacity: 0.5;\n\t\t}\n\t\t.whatsNew {\n\t\t\tdisplay: inline-block;\n\t\t}\n\t\t.toggleWhatsNew {\n\t\t\tposition: relative;\n\t\t}\n\t\t.popovermenu {\n\t\t\tp {\n\t\t\t\tmargin-bottom: 0;\n\t\t\t\twidth: 100%;\n\t\t\t}\n\t\t\tmargin-top: 5px;\n\t\t\twidth: 300px;\n\t\t}\n\t\t.applist {\n\t\t\tmargin-bottom: 25px;\n\t\t}\n\n\t\t.update-menu {\n\t\t\tposition: relative;\n\t\t\tcursor: pointer;\n\t\t\tmargin-left: 3px;\n\t\t\tdisplay: inline-block;\n\t\t\t.icon-update-menu {\n\t\t\t\tcursor: inherit;\n\t\t\t\t.icon-triangle-s {\n\t\t\t\t\tdisplay: inline-block;\n\t\t\t\t\tvertical-align: middle;\n\t\t\t\t\tcursor: inherit;\n\t\t\t\t\topacity: 1;\n\t\t\t\t}\n\t\t\t}\n\t\t\t.popovermenu {\n\t\t\t\tdisplay: none;\n\t\t\t\ttop: 28px;\n\t\t\t\t&.show-menu {\n\t\t\t\t\tdisplay: block;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n</style>\n<style lang=\"scss\">\n\t/* override needed to make menu wider */\n\t#updatenotification .popovermenu {\n\t\tp {\n\t\t\tmargin-top: 5px;\n\t\t\twidth: 100%;\n\t\t}\n\t\tmargin-top: 5px;\n\t\twidth: 300px;\n\t}\n\t/* override needed to replace yellow hover state with a dark one */\n\t#updatenotification .update-menu .icon-star:hover,\n\t#updatenotification .update-menu .icon-star:focus {\n\t\tbackground-image: var(--icon-starred);\n\t}\n\t#updatenotification .topMargin {\n\t\tmargin-top: 15px;\n\t}\n</style>\n","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./UpdateNotification.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!./UpdateNotification.vue?vue&type=script&lang=js&\"","\n import API from \"!../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./UpdateNotification.vue?vue&type=style&index=0&id=3ebf503a&lang=scss&scoped=true&\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./UpdateNotification.vue?vue&type=style&index=0&id=3ebf503a&lang=scss&scoped=true&\";\n export default content && content.locals ? content.locals : undefined;\n","\n import API from \"!../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./UpdateNotification.vue?vue&type=style&index=1&lang=scss&\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./UpdateNotification.vue?vue&type=style&index=1&lang=scss&\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./UpdateNotification.vue?vue&type=template&id=3ebf503a&scoped=true&\"\nimport script from \"./UpdateNotification.vue?vue&type=script&lang=js&\"\nexport * from \"./UpdateNotification.vue?vue&type=script&lang=js&\"\nimport style0 from \"./UpdateNotification.vue?vue&type=style&index=0&id=3ebf503a&lang=scss&scoped=true&\"\nimport style1 from \"./UpdateNotification.vue?vue&type=style&index=1&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"3ebf503a\",\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('NcSettingsSection',{attrs:{\"id\":\"updatenotification\",\"title\":_vm.t('updatenotification', 'Update')}},[_c('div',{staticClass:\"update\"},[(_vm.isNewVersionAvailable)?[(_vm.versionIsEol)?_c('NcNoteCard',{attrs:{\"type\":\"warning\"}},[_vm._v(\"\\n\\t\\t\\t\\t\"+_vm._s(_vm.t('updatenotification', 'The version you are running is not maintained anymore. Please make sure to update to a supported version as soon as possible.'))+\"\\n\\t\\t\\t\")]):_vm._e(),_vm._v(\" \"),_c('p',[_c('span',{domProps:{\"innerHTML\":_vm._s(_vm.newVersionAvailableString)}}),_c('br'),_vm._v(\" \"),(!_vm.isListFetched)?_c('span',{staticClass:\"icon icon-loading-small\"}):_vm._e(),_vm._v(\" \"),_c('span',{domProps:{\"innerHTML\":_vm._s(_vm.statusText)}})]),_vm._v(\" \"),(_vm.missingAppUpdates.length)?[_c('h3',{on:{\"click\":_vm.toggleHideMissingUpdates}},[_vm._v(\"\\n\\t\\t\\t\\t\\t\"+_vm._s(_vm.t('updatenotification', 'Apps missing compatible version'))+\"\\n\\t\\t\\t\\t\\t\"),(!_vm.hideMissingUpdates)?_c('span',{staticClass:\"icon icon-triangle-n\"}):_vm._e(),_vm._v(\" \"),(_vm.hideMissingUpdates)?_c('span',{staticClass:\"icon icon-triangle-s\"}):_vm._e()]),_vm._v(\" \"),(!_vm.hideMissingUpdates)?_c('ul',{staticClass:\"applist\"},_vm._l((_vm.missingAppUpdates),function(app,index){return _c('li',{key:index},[_c('a',{attrs:{\"href\":'https://apps.nextcloud.com/apps/' + app.appId,\"title\":_vm.t('settings', 'View in store')}},[_vm._v(_vm._s(app.appName)+\" ↗\")])])}),0):_vm._e()]:_vm._e(),_vm._v(\" \"),(_vm.availableAppUpdates.length)?[_c('h3',{on:{\"click\":_vm.toggleHideAvailableUpdates}},[_vm._v(\"\\n\\t\\t\\t\\t\\t\"+_vm._s(_vm.t('updatenotification', 'Apps with compatible version'))+\"\\n\\t\\t\\t\\t\\t\"),(!_vm.hideAvailableUpdates)?_c('span',{staticClass:\"icon icon-triangle-n\"}):_vm._e(),_vm._v(\" \"),(_vm.hideAvailableUpdates)?_c('span',{staticClass:\"icon icon-triangle-s\"}):_vm._e()]),_vm._v(\" \"),(!_vm.hideAvailableUpdates)?_c('ul',{staticClass:\"applist\"},_vm._l((_vm.availableAppUpdates),function(app,index){return _c('li',{key:index},[_c('a',{attrs:{\"href\":'https://apps.nextcloud.com/apps/' + app.appId,\"title\":_vm.t('settings', 'View in store')}},[_vm._v(_vm._s(app.appName)+\" ↗\")])])}),0):_vm._e()]:_vm._e(),_vm._v(\" \"),(!_vm.isWebUpdaterRecommended && _vm.updaterEnabled && _vm.webUpdaterEnabled)?[_c('h3',{staticClass:\"warning\"},[_vm._v(\"\\n\\t\\t\\t\\t\\t\"+_vm._s(_vm.t('updatenotification', 'Please note that the web updater is not recommended with more than 100 users! Please use the command line updater instead!'))+\"\\n\\t\\t\\t\\t\")])]:_vm._e(),_vm._v(\" \"),_c('div',[(_vm.updaterEnabled && _vm.webUpdaterEnabled)?_c('a',{staticClass:\"button primary\",attrs:{\"href\":\"#\"},on:{\"click\":_vm.clickUpdaterButton}},[_vm._v(_vm._s(_vm.t('updatenotification', 'Open updater')))]):_vm._e(),_vm._v(\" \"),(_vm.downloadLink)?_c('a',{staticClass:\"button\",class:{ hidden: !_vm.updaterEnabled },attrs:{\"href\":_vm.downloadLink}},[_vm._v(_vm._s(_vm.t('updatenotification', 'Download now')))]):_vm._e(),_vm._v(\" \"),(_vm.updaterEnabled && !_vm.webUpdaterEnabled)?_c('span',[_vm._v(\"\\n\\t\\t\\t\\t\\t\"+_vm._s(_vm.t('updatenotification', 'Please use the command line updater to update.'))+\"\\n\\t\\t\\t\\t\")]):_vm._e(),_vm._v(\" \"),(_vm.whatsNew)?_c('div',{staticClass:\"whatsNew\"},[_c('div',{staticClass:\"toggleWhatsNew\"},[_c('a',{directives:[{name:\"click-outside\",rawName:\"v-click-outside\",value:(_vm.hideMenu),expression:\"hideMenu\"}],staticClass:\"button\",on:{\"click\":_vm.toggleMenu}},[_vm._v(_vm._s(_vm.t('updatenotification', 'What\\'s new?')))]),_vm._v(\" \"),_c('div',{staticClass:\"popovermenu\",class:{ 'menu-center': true, open: _vm.openedWhatsNew }},[_c('NcPopoverMenu',{attrs:{\"menu\":_vm.whatsNew}})],1)])]):_vm._e()])]:(!_vm.isUpdateChecked)?[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.t('updatenotification', 'The update check is not yet finished. Please refresh the page.'))+\"\\n\\t\\t\")]:[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.t('updatenotification', 'Your version is up to date.'))+\"\\n\\t\\t\\t\"),_c('span',{directives:[{name:\"tooltip\",rawName:\"v-tooltip.auto\",value:(_vm.lastCheckedOnString),expression:\"lastCheckedOnString\",modifiers:{\"auto\":true}}],staticClass:\"icon-info svg\"})],_vm._v(\" \"),(!_vm.isDefaultUpdateServerURL)?[_c('p',{staticClass:\"topMargin\"},[_c('em',[_vm._v(_vm._s(_vm.t('updatenotification', 'A non-default update server is in use to be checked for updates:'))+\" \"),_c('code',[_vm._v(_vm._s(_vm.updateServerURL))])])])]:_vm._e()],2),_vm._v(\" \"),_c('div',[_vm._v(\"\\n\\t\\t\"+_vm._s(_vm.t('updatenotification', 'You can change the update channel below which also affects the apps management page. E.g. after switching to the beta channel, beta app updates will be offered to you in the apps management page.'))+\"\\n\\t\")]),_vm._v(\" \"),_c('h3',{staticClass:\"update-channel-selector\"},[_vm._v(\"\\n\\t\\t\"+_vm._s(_vm.t('updatenotification', 'Update channel:'))+\"\\n\\t\\t\"),_c('div',{directives:[{name:\"click-outside\",rawName:\"v-click-outside\",value:(_vm.closeUpdateChannelMenu),expression:\"closeUpdateChannelMenu\"}],staticClass:\"update-menu\"},[_c('span',{staticClass:\"icon-update-menu\",on:{\"click\":_vm.toggleUpdateChannelMenu}},[_vm._v(\"\\n\\t\\t\\t\\t\"+_vm._s(_vm.localizedChannelName)+\"\\n\\t\\t\\t\\t\"),_c('span',{staticClass:\"icon-triangle-s\"})]),_vm._v(\" \"),_c('div',{staticClass:\"popovermenu menu menu-center\",class:{ 'show-menu': _vm.openedUpdateChannelMenu}},[_c('NcPopoverMenu',{attrs:{\"menu\":_vm.channelList}})],1)])]),_vm._v(\" \"),_c('span',{staticClass:\"msg\",attrs:{\"id\":\"channel_save_msg\"}}),_c('br'),_vm._v(\" \"),_c('p',[_c('em',[_vm._v(_vm._s(_vm.t('updatenotification', 'You can always update to a newer version. But you can never downgrade to a more stable version.')))]),_c('br'),_vm._v(\" \"),_c('em',{domProps:{\"innerHTML\":_vm._s(_vm.noteDelayedStableString)}})]),_vm._v(\" \"),_c('p',{attrs:{\"id\":\"oca_updatenotification_groups\"}},[_vm._v(\"\\n\\t\\t\"+_vm._s(_vm.t('updatenotification', 'Notify members of the following groups about available updates:'))+\"\\n\\t\\t\"),_c('NcMultiselect',{attrs:{\"options\":_vm.groups,\"multiple\":true,\"searchable\":true,\"label\":\"displayname\",\"loading\":_vm.loadingGroups,\"show-no-options\":false,\"close-on-select\":false,\"track-by\":\"id\",\"tag-width\":75},on:{\"search-change\":_vm.searchGroup},model:{value:(_vm.notifyGroups),callback:function ($$v) {_vm.notifyGroups=$$v},expression:\"notifyGroups\"}}),_c('br'),_vm._v(\" \"),(_vm.currentChannel === 'daily' || _vm.currentChannel === 'git')?_c('em',[_vm._v(_vm._s(_vm.t('updatenotification', 'Only notifications for app updates are available.')))]):_vm._e(),_vm._v(\" \"),(_vm.currentChannel === 'daily')?_c('em',[_vm._v(_vm._s(_vm.t('updatenotification', 'The selected update channel makes dedicated notifications for the server obsolete.')))]):_vm._e(),_vm._v(\" \"),(_vm.currentChannel === 'git')?_c('em',[_vm._v(_vm._s(_vm.t('updatenotification', 'The selected update channel does not support updates of the server.')))]):_vm._e()],1)])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","/**\n * @copyright Copyright (c) 2018 Joas Schilling <coding@schilljs.com>\n *\n * @author Joas Schilling <coding@schilljs.com>\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @license AGPL-3.0-or-later\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\nimport Vue from 'vue'\nimport Root from './components/UpdateNotification'\n\nVue.mixin({\n\tmethods: {\n\t\tt(app, text, vars, count, options) {\n\t\t\treturn OC.L10N.translate(app, text, vars, count, options)\n\t\t},\n\t\tn(app, textSingular, textPlural, count, vars, options) {\n\t\t\treturn OC.L10N.translatePlural(app, textSingular, textPlural, count, vars, options)\n\t\t},\n\t},\n})\n\n// eslint-disable-next-line no-new\nnew Vue({\n\tel: '#updatenotification',\n\trender: h => h(Root),\n})\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"#updatenotification>*[data-v-3ebf503a]{max-width:900px}#updatenotification div.update[data-v-3ebf503a],#updatenotification p[data-v-3ebf503a]:not(.inlineblock){margin-bottom:25px}#updatenotification h2.inlineblock[data-v-3ebf503a]{margin-top:25px}#updatenotification h3[data-v-3ebf503a]{cursor:pointer}#updatenotification h3 .icon[data-v-3ebf503a]{cursor:pointer}#updatenotification h3[data-v-3ebf503a]:first-of-type{margin-top:0}#updatenotification h3.update-channel-selector[data-v-3ebf503a]{display:inline-block;cursor:inherit}#updatenotification .icon[data-v-3ebf503a]{display:inline-block;margin-bottom:-3px}#updatenotification .icon-triangle-s[data-v-3ebf503a],#updatenotification .icon-triangle-n[data-v-3ebf503a]{opacity:.5}#updatenotification .whatsNew[data-v-3ebf503a]{display:inline-block}#updatenotification .toggleWhatsNew[data-v-3ebf503a]{position:relative}#updatenotification .popovermenu[data-v-3ebf503a]{margin-top:5px;width:300px}#updatenotification .popovermenu p[data-v-3ebf503a]{margin-bottom:0;width:100%}#updatenotification .applist[data-v-3ebf503a]{margin-bottom:25px}#updatenotification .update-menu[data-v-3ebf503a]{position:relative;cursor:pointer;margin-left:3px;display:inline-block}#updatenotification .update-menu .icon-update-menu[data-v-3ebf503a]{cursor:inherit}#updatenotification .update-menu .icon-update-menu .icon-triangle-s[data-v-3ebf503a]{display:inline-block;vertical-align:middle;cursor:inherit;opacity:1}#updatenotification .update-menu .popovermenu[data-v-3ebf503a]{display:none;top:28px}#updatenotification .update-menu .popovermenu.show-menu[data-v-3ebf503a]{display:block}\", \"\",{\"version\":3,\"sources\":[\"webpack://./apps/updatenotification/src/components/UpdateNotification.vue\"],\"names\":[],\"mappings\":\"AA4cC,uCACC,eAAA,CAGD,yGAEC,kBAAA,CAED,oDACC,eAAA,CAED,wCACC,cAAA,CACA,8CACC,cAAA,CAED,sDACC,YAAA,CAED,gEACC,oBAAA,CACA,cAAA,CAGF,2CACC,oBAAA,CACA,kBAAA,CAED,4GACC,UAAA,CAED,+CACC,oBAAA,CAED,qDACC,iBAAA,CAED,kDAKC,cAAA,CACA,WAAA,CALA,oDACC,eAAA,CACA,UAAA,CAKF,8CACC,kBAAA,CAGD,kDACC,iBAAA,CACA,cAAA,CACA,eAAA,CACA,oBAAA,CACA,oEACC,cAAA,CACA,qFACC,oBAAA,CACA,qBAAA,CACA,cAAA,CACA,SAAA,CAGF,+DACC,YAAA,CACA,QAAA,CACA,yEACC,aAAA\",\"sourcesContent\":[\"\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n#updatenotification {\\n\\t& > * {\\n\\t\\tmax-width: 900px;\\n\\t}\\n\\n\\tdiv.update,\\n\\tp:not(.inlineblock) {\\n\\t\\tmargin-bottom: 25px;\\n\\t}\\n\\th2.inlineblock {\\n\\t\\tmargin-top: 25px;\\n\\t}\\n\\th3 {\\n\\t\\tcursor: pointer;\\n\\t\\t.icon {\\n\\t\\t\\tcursor: pointer;\\n\\t\\t}\\n\\t\\t&:first-of-type {\\n\\t\\t\\tmargin-top: 0;\\n\\t\\t}\\n\\t\\t&.update-channel-selector {\\n\\t\\t\\tdisplay: inline-block;\\n\\t\\t\\tcursor: inherit;\\n\\t\\t}\\n\\t}\\n\\t.icon {\\n\\t\\tdisplay: inline-block;\\n\\t\\tmargin-bottom: -3px;\\n\\t}\\n\\t.icon-triangle-s, .icon-triangle-n {\\n\\t\\topacity: 0.5;\\n\\t}\\n\\t.whatsNew {\\n\\t\\tdisplay: inline-block;\\n\\t}\\n\\t.toggleWhatsNew {\\n\\t\\tposition: relative;\\n\\t}\\n\\t.popovermenu {\\n\\t\\tp {\\n\\t\\t\\tmargin-bottom: 0;\\n\\t\\t\\twidth: 100%;\\n\\t\\t}\\n\\t\\tmargin-top: 5px;\\n\\t\\twidth: 300px;\\n\\t}\\n\\t.applist {\\n\\t\\tmargin-bottom: 25px;\\n\\t}\\n\\n\\t.update-menu {\\n\\t\\tposition: relative;\\n\\t\\tcursor: pointer;\\n\\t\\tmargin-left: 3px;\\n\\t\\tdisplay: inline-block;\\n\\t\\t.icon-update-menu {\\n\\t\\t\\tcursor: inherit;\\n\\t\\t\\t.icon-triangle-s {\\n\\t\\t\\t\\tdisplay: inline-block;\\n\\t\\t\\t\\tvertical-align: middle;\\n\\t\\t\\t\\tcursor: inherit;\\n\\t\\t\\t\\topacity: 1;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t\\t.popovermenu {\\n\\t\\t\\tdisplay: none;\\n\\t\\t\\ttop: 28px;\\n\\t\\t\\t&.show-menu {\\n\\t\\t\\t\\tdisplay: block;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"#updatenotification .popovermenu{margin-top:5px;width:300px}#updatenotification .popovermenu p{margin-top:5px;width:100%}#updatenotification .update-menu .icon-star:hover,#updatenotification .update-menu .icon-star:focus{background-image:var(--icon-starred)}#updatenotification .topMargin{margin-top:15px}\", \"\",{\"version\":3,\"sources\":[\"webpack://./apps/updatenotification/src/components/UpdateNotification.vue\"],\"names\":[],\"mappings\":\"AAuhBA,iCAKC,cAAA,CACA,WAAA,CALA,mCACC,cAAA,CACA,UAAA,CAMF,oGAEC,oCAAA,CAED,+BACC,eAAA\",\"sourcesContent\":[\"\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n/* override needed to make menu wider */\\n#updatenotification .popovermenu {\\n\\tp {\\n\\t\\tmargin-top: 5px;\\n\\t\\twidth: 100%;\\n\\t}\\n\\tmargin-top: 5px;\\n\\twidth: 300px;\\n}\\n/* override needed to replace yellow hover state with a dark one */\\n#updatenotification .update-menu .icon-star:hover,\\n#updatenotification .update-menu .icon-star:focus {\\n\\tbackground-image: var(--icon-starred);\\n}\\n#updatenotification .topMargin {\\n\\tmargin-top: 15px;\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\tloaded: false,\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Flag the module as loaded\n\tmodule.loaded = true;\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","__webpack_require__.amdD = function () {\n\tthrow new Error('define cannot be used indirect');\n};","__webpack_require__.amdO = {};","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = function(module) {\n\tvar getter = module && module.__esModule ?\n\t\tfunction() { return module['default']; } :\n\t\tfunction() { return module; };\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = function(exports, definition) {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }","// define __esModule on exports\n__webpack_require__.r = function(exports) {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.nmd = function(module) {\n\tmodule.paths = [];\n\tif (!module.children) module.children = [];\n\treturn module;\n};","__webpack_require__.j = 7292;","__webpack_require__.b = document.baseURI || self.location.href;\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t7292: 0\n};\n\n// no chunk on demand loading\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = function(chunkId) { return installedChunks[chunkId] === 0; };\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = function(parentChunkLoadingFunction, data) {\n\tvar chunkIds = data[0];\n\tvar moreModules = data[1];\n\tvar runtime = data[2];\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some(function(id) { return installedChunks[id] !== 0; })) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunknextcloud\"] = self[\"webpackChunknextcloud\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","__webpack_require__.nc = undefined;","// startup\n// Load entry module and return exports\n// This entry module depends on other loaded chunks and execution need to be delayed\nvar __webpack_exports__ = __webpack_require__.O(undefined, [7874], function() { return __webpack_require__(38296); })\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["deferred","VTooltip","options","styleTagTransform","setAttributes","insert","domAPI","insertStyleElement","_vm","this","_h","$createElement","_c","_self","attrs","t","staticClass","_v","_s","_e","domProps","newVersionAvailableString","isListFetched","statusText","missingAppUpdates","on","toggleHideMissingUpdates","hideMissingUpdates","_l","app","index","key","appId","appName","availableAppUpdates","toggleHideAvailableUpdates","hideAvailableUpdates","isWebUpdaterRecommended","updaterEnabled","webUpdaterEnabled","clickUpdaterButton","class","hidden","downloadLink","directives","name","rawName","value","expression","toggleMenu","open","openedWhatsNew","whatsNew","isUpdateChecked","modifiers","isDefaultUpdateServerURL","updateServerURL","toggleUpdateChannelMenu","localizedChannelName","openedUpdateChannelMenu","channelList","noteDelayedStableString","groups","loadingGroups","searchGroup","model","callback","$$v","notifyGroups","currentChannel","Vue","methods","text","vars","count","OC","L10N","translate","n","textSingular","textPlural","translatePlural","el","render","h","Root","___CSS_LOADER_EXPORT___","push","module","id","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","exports","loaded","__webpack_modules__","call","m","amdD","Error","amdO","O","result","chunkIds","fn","priority","notFulfilled","Infinity","i","length","fulfilled","j","Object","keys","every","splice","r","getter","__esModule","d","a","definition","o","defineProperty","enumerable","get","g","globalThis","Function","e","window","obj","prop","prototype","hasOwnProperty","Symbol","toStringTag","nmd","paths","children","b","document","baseURI","self","location","href","installedChunks","chunkId","webpackJsonpCallback","parentChunkLoadingFunction","data","moreModules","runtime","some","chunkLoadingGlobal","forEach","bind","nc","__webpack_exports__"],"sourceRoot":""}
\ No newline at end of file +{"version":3,"file":"updatenotification-updatenotification.js?v=84e09c730fc054814d39","mappings":";6BAAIA,gVC2IJ,wBACA,6BACA,aACA,QAEA,EAAAC,SAAA,uBAEA,OACA,0BACA,YACA,kBACA,kBACA,sBACA,gBAEA,YACA,iBACA,oBAEA,KAZA,WAaA,OACA,iBACA,oBACA,mBACA,mBACA,qBACA,2BACA,kBACA,gBACA,gBACA,yBACA,wBACA,mBACA,gBACA,gBACA,kBACA,YACA,gBACA,UACA,4BACA,uBAEA,uBACA,qBACA,kBACA,oBACA,iBACA,sBACA,wBACA,kBACA,6BAIA,UACA,0BADA,WAEA,iGACA,0CAIA,wBAPA,WAQA,uSACA,mHAGA,oBAZA,WAaA,8DACA,wCAIA,WAlBA,WAmBA,0BAIA,sBACA,+GAGA,oBACA,wNAGA,kCACA,yHACA,4OAbA,iEAgBA,SApCA,WAqCA,gCACA,YAEA,SACA,+BACA,2DAWA,OATA,mBACA,QACA,uBACA,8CACA,iBACA,gBACA,YAGA,GAGA,YAxDA,WAyDA,SAmCA,OAjCA,QACA,0CACA,yXACA,iBACA,0CACA,oCACA,+CAGA,QACA,sCACA,oJACA,sBACA,sCACA,2CAGA,QACA,oCACA,yHACA,mCACA,oCACA,yCAGA,0BACA,QACA,yBACA,mBACA,YAIA,GAGA,oBA/FA,WAgGA,wGAGA,qBAnGA,WAoGA,4BACA,iBACA,4CACA,aACA,wCACA,WACA,sCACA,QACA,8BAKA,OACA,aADA,SACA,GACA,6BAMA,yCACA,eAGA,oFARA,6BAUA,sBAdA,WAcA,WACA,4BAIA,0FACA,8BACA,+BACA,2CACA,uCACA,mBACA,uBACA,gCACA,yBACA,uBACA,gDACA,mBACA,yBAIA,YAnMA,WAqMA,mDAEA,6BACA,yCACA,mCACA,uCACA,2CACA,uDACA,qCACA,iCACA,mDACA,uCACA,qCACA,yBACA,iCACA,yDACA,iCACA,iDACA,oCACA,0CAEA,gCACA,2BACA,sEAEA,yEAIA,QAlOA,WAmOA,oBAGA,SACA,0KACA,sBADA,kBAGA,4DACA,SACA,SACA,WANA,OAGA,EAHA,OAQA,uDACA,qDATA,gDAYA,uCAZA,yBAcA,sBAdA,gTAgBA,K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","sources":["webpack:///nextcloud/webpack/runtime/chunk loaded","webpack:///nextcloud/apps/updatenotification/src/components/UpdateNotification.vue","webpack:///nextcloud/apps/updatenotification/src/components/UpdateNotification.vue?vue&type=script&lang=js&","webpack://nextcloud/./apps/updatenotification/src/components/UpdateNotification.vue?a10c","webpack://nextcloud/./apps/updatenotification/src/components/UpdateNotification.vue?fbe8","webpack://nextcloud/./apps/updatenotification/src/components/UpdateNotification.vue?1fb0","webpack:///nextcloud/apps/updatenotification/src/components/UpdateNotification.vue?vue&type=template&id=e918afa2&scoped=true&","webpack:///nextcloud/apps/updatenotification/src/init.js","webpack:///nextcloud/apps/updatenotification/src/components/UpdateNotification.vue?vue&type=style&index=0&id=e918afa2&lang=scss&scoped=true&","webpack:///nextcloud/apps/updatenotification/src/components/UpdateNotification.vue?vue&type=style&index=1&lang=scss&","webpack:///nextcloud/webpack/bootstrap","webpack:///nextcloud/webpack/runtime/amd define","webpack:///nextcloud/webpack/runtime/amd options","webpack:///nextcloud/webpack/runtime/compat get default export","webpack:///nextcloud/webpack/runtime/define property getters","webpack:///nextcloud/webpack/runtime/global","webpack:///nextcloud/webpack/runtime/hasOwnProperty shorthand","webpack:///nextcloud/webpack/runtime/make namespace object","webpack:///nextcloud/webpack/runtime/node module decorator","webpack:///nextcloud/webpack/runtime/runtimeId","webpack:///nextcloud/webpack/runtime/jsonp chunk loading","webpack:///nextcloud/webpack/runtime/nonce","webpack:///nextcloud/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = function(result, chunkIds, fn, priority) {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar chunkIds = deferred[i][0];\n\t\tvar fn = deferred[i][1];\n\t\tvar priority = deferred[i][2];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every(function(key) { return __webpack_require__.O[key](chunkIds[j]); })) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","<template>\n\t<NcSettingsSection id=\"updatenotification\" :title=\"t('updatenotification', 'Update')\">\n\t\t<div class=\"update\">\n\t\t\t<template v-if=\"isNewVersionAvailable\">\n\t\t\t\t<NcNoteCard v-if=\"versionIsEol\" type=\"warning\">\n\t\t\t\t\t{{ t('updatenotification', 'The version you are running is not maintained anymore. Please make sure to update to a supported version as soon as possible.') }}\n\t\t\t\t</NcNoteCard>\n\n\t\t\t\t<p>\n\t\t\t\t\t<span v-html=\"newVersionAvailableString\" /><br>\n\t\t\t\t\t<span v-if=\"!isListFetched\" class=\"icon icon-loading-small\" />\n\t\t\t\t\t<span v-html=\"statusText\" />\n\t\t\t\t</p>\n\n\t\t\t\t<template v-if=\"missingAppUpdates.length\">\n\t\t\t\t\t<h3 @click=\"toggleHideMissingUpdates\">\n\t\t\t\t\t\t{{ t('updatenotification', 'Apps missing compatible version') }}\n\t\t\t\t\t\t<span v-if=\"!hideMissingUpdates\" class=\"icon icon-triangle-n\" />\n\t\t\t\t\t\t<span v-if=\"hideMissingUpdates\" class=\"icon icon-triangle-s\" />\n\t\t\t\t\t</h3>\n\t\t\t\t\t<ul v-if=\"!hideMissingUpdates\" class=\"applist\">\n\t\t\t\t\t\t<li v-for=\"(app, index) in missingAppUpdates\" :key=\"index\">\n\t\t\t\t\t\t\t<a :href=\"'https://apps.nextcloud.com/apps/' + app.appId\" :title=\"t('settings', 'View in store')\">{{ app.appName }} ↗</a>\n\t\t\t\t\t\t</li>\n\t\t\t\t\t</ul>\n\t\t\t\t</template>\n\n\t\t\t\t<template v-if=\"availableAppUpdates.length\">\n\t\t\t\t\t<h3 @click=\"toggleHideAvailableUpdates\">\n\t\t\t\t\t\t{{ t('updatenotification', 'Apps with compatible version') }}\n\t\t\t\t\t\t<span v-if=\"!hideAvailableUpdates\" class=\"icon icon-triangle-n\" />\n\t\t\t\t\t\t<span v-if=\"hideAvailableUpdates\" class=\"icon icon-triangle-s\" />\n\t\t\t\t\t</h3>\n\t\t\t\t\t<ul v-if=\"!hideAvailableUpdates\" class=\"applist\">\n\t\t\t\t\t\t<li v-for=\"(app, index) in availableAppUpdates\" :key=\"index\">\n\t\t\t\t\t\t\t<a :href=\"'https://apps.nextcloud.com/apps/' + app.appId\" :title=\"t('settings', 'View in store')\">{{ app.appName }} ↗</a>\n\t\t\t\t\t\t</li>\n\t\t\t\t\t</ul>\n\t\t\t\t</template>\n\n\t\t\t\t<template v-if=\"!isWebUpdaterRecommended && updaterEnabled && webUpdaterEnabled\">\n\t\t\t\t\t<h3 class=\"warning\">\n\t\t\t\t\t\t{{ t('updatenotification', 'Please note that the web updater is not recommended with more than 100 users! Please use the command line updater instead!') }}\n\t\t\t\t\t</h3>\n\t\t\t\t</template>\n\n\t\t\t\t<div>\n\t\t\t\t\t<a v-if=\"updaterEnabled && webUpdaterEnabled\"\n\t\t\t\t\t\thref=\"#\"\n\t\t\t\t\t\tclass=\"button primary\"\n\t\t\t\t\t\t@click=\"clickUpdaterButton\">{{ t('updatenotification', 'Open updater') }}</a>\n\t\t\t\t\t<a v-if=\"downloadLink\"\n\t\t\t\t\t\t:href=\"downloadLink\"\n\t\t\t\t\t\tclass=\"button\"\n\t\t\t\t\t\t:class=\"{ hidden: !updaterEnabled }\">{{ t('updatenotification', 'Download now') }}</a>\n\t\t\t\t\t<span v-if=\"updaterEnabled && !webUpdaterEnabled\">\n\t\t\t\t\t\t{{ t('updatenotification', 'Please use the command line updater to update.') }}\n\t\t\t\t\t</span>\n\t\t\t\t\t<div v-if=\"whatsNew\" class=\"whatsNew\">\n\t\t\t\t\t\t<div class=\"toggleWhatsNew\">\n\t\t\t\t\t\t\t<a v-click-outside=\"hideMenu\" class=\"button\" @click=\"toggleMenu\">{{ t('updatenotification', 'What\\'s new?') }}</a>\n\t\t\t\t\t\t\t<div class=\"popovermenu\" :class=\"{ 'menu-center': true, open: openedWhatsNew }\">\n\t\t\t\t\t\t\t\t<NcPopoverMenu :menu=\"whatsNew\" />\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</template>\n\t\t\t<template v-else-if=\"!isUpdateChecked\">\n\t\t\t\t{{ t('updatenotification', 'The update check is not yet finished. Please refresh the page.') }}\n\t\t\t</template>\n\t\t\t<template v-else>\n\t\t\t\t{{ t('updatenotification', 'Your version is up to date.') }}\n\t\t\t\t<span v-tooltip.auto=\"lastCheckedOnString\" class=\"icon-info svg\" />\n\t\t\t</template>\n\n\t\t\t<template v-if=\"!isDefaultUpdateServerURL\">\n\t\t\t\t<p class=\"topMargin\">\n\t\t\t\t\t<em>{{ t('updatenotification', 'A non-default update server is in use to be checked for updates:') }} <code>{{ updateServerURL }}</code></em>\n\t\t\t\t</p>\n\t\t\t</template>\n\t\t</div>\n\n\t\t<div>\n\t\t\t{{ t('updatenotification', 'You can change the update channel below which also affects the apps management page. E.g. after switching to the beta channel, beta app updates will be offered to you in the apps management page.') }}\n\t\t</div>\n\n\t\t<h3 class=\"update-channel-selector\">\n\t\t\t{{ t('updatenotification', 'Update channel:') }}\n\t\t\t<div v-click-outside=\"closeUpdateChannelMenu\" class=\"update-menu\">\n\t\t\t\t<span class=\"icon-update-menu\" @click=\"toggleUpdateChannelMenu\">\n\t\t\t\t\t{{ localizedChannelName }}\n\t\t\t\t\t<span class=\"icon-triangle-s\" />\n\t\t\t\t</span>\n\t\t\t\t<div class=\"popovermenu menu menu-center\" :class=\"{ 'show-menu': openedUpdateChannelMenu}\">\n\t\t\t\t\t<NcPopoverMenu :menu=\"channelList\" />\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</h3>\n\t\t<span id=\"channel_save_msg\" class=\"msg\" /><br>\n\t\t<p>\n\t\t\t<em>{{ t('updatenotification', 'You can always update to a newer version. But you can never downgrade to a more stable version.') }}</em><br>\n\t\t\t<em v-html=\"noteDelayedStableString\" />\n\t\t</p>\n\n\t\t<p id=\"oca_updatenotification_groups\">\n\t\t\t{{ t('updatenotification', 'Notify members of the following groups about available updates:') }}\n\t\t\t<NcMultiselect v-model=\"notifyGroups\"\n\t\t\t\t:options=\"groups\"\n\t\t\t\t:multiple=\"true\"\n\t\t\t\t:searchable=\"true\"\n\t\t\t\tlabel=\"displayname\"\n\t\t\t\t:loading=\"loadingGroups\"\n\t\t\t\t:show-no-options=\"false\"\n\t\t\t\t:close-on-select=\"false\"\n\t\t\t\ttrack-by=\"id\"\n\t\t\t\t:tag-width=\"75\"\n\t\t\t\t@search-change=\"searchGroup\" /><br>\n\t\t\t<em v-if=\"currentChannel === 'daily' || currentChannel === 'git'\">{{ t('updatenotification', 'Only notifications for app updates are available.') }}</em>\n\t\t\t<em v-if=\"currentChannel === 'daily'\">{{ t('updatenotification', 'The selected update channel makes dedicated notifications for the server obsolete.') }}</em>\n\t\t\t<em v-if=\"currentChannel === 'git'\">{{ t('updatenotification', 'The selected update channel does not support updates of the server.') }}</em>\n\t\t</p>\n\t</NcSettingsSection>\n</template>\n\n<script>\nimport { generateUrl, getRootUrl, generateOcsUrl } from '@nextcloud/router'\nimport NcPopoverMenu from '@nextcloud/vue/dist/Components/NcPopoverMenu.js'\nimport NcMultiselect from '@nextcloud/vue/dist/Components/NcMultiselect.js'\nimport NcSettingsSection from '@nextcloud/vue/dist/Components/NcSettingsSection.js'\nimport NcNoteCard from '@nextcloud/vue/dist/Components/NcNoteCard.js'\nimport { VTooltip } from 'v-tooltip'\nimport ClickOutside from 'vue-click-outside'\nimport axios from '@nextcloud/axios'\nimport { loadState } from '@nextcloud/initial-state'\nimport { showSuccess } from '@nextcloud/dialogs'\nimport debounce from 'debounce'\nimport { getLoggerBuilder } from '@nextcloud/logger'\n\nconst logger = getLoggerBuilder()\n\t.setApp('updatenotification')\n\t.detectUser()\n\t.build()\n\nVTooltip.options.defaultHtml = false\n\nexport default {\n\tname: 'UpdateNotification',\n\tcomponents: {\n\t\tNcMultiselect,\n\t\tNcPopoverMenu,\n\t\tNcSettingsSection,\n\t\tNcNoteCard,\n\t},\n\tdirectives: {\n\t\tClickOutside,\n\t\ttooltip: VTooltip,\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tloadingGroups: false,\n\t\t\tnewVersionString: '',\n\t\t\tlastCheckedDate: '',\n\t\t\tisUpdateChecked: false,\n\t\t\twebUpdaterEnabled: true,\n\t\t\tisWebUpdaterRecommended: true,\n\t\t\tupdaterEnabled: true,\n\t\t\tversionIsEol: false,\n\t\t\tdownloadLink: '',\n\t\t\tisNewVersionAvailable: false,\n\t\t\thasValidSubscription: false,\n\t\t\tupdateServerURL: '',\n\t\t\tchangelogURL: '',\n\t\t\twhatsNewData: [],\n\t\t\tcurrentChannel: '',\n\t\t\tchannels: [],\n\t\t\tnotifyGroups: '',\n\t\t\tgroups: [],\n\t\t\tisDefaultUpdateServerURL: true,\n\t\t\tenableChangeWatcher: false,\n\n\t\t\tavailableAppUpdates: [],\n\t\t\tmissingAppUpdates: [],\n\t\t\tappStoreFailed: false,\n\t\t\tappStoreDisabled: false,\n\t\t\tisListFetched: false,\n\t\t\thideMissingUpdates: false,\n\t\t\thideAvailableUpdates: true,\n\t\t\topenedWhatsNew: false,\n\t\t\topenedUpdateChannelMenu: false,\n\t\t}\n\t},\n\n\tcomputed: {\n\t\tnewVersionAvailableString() {\n\t\t\treturn t('updatenotification', 'A new version is available: <strong>{newVersionString}</strong>', {\n\t\t\t\tnewVersionString: this.newVersionString,\n\t\t\t})\n\t\t},\n\n\t\tnoteDelayedStableString() {\n\t\t\treturn t('updatenotification', 'Note that after a new release the update only shows up after the first minor release or later. We roll out new versions spread out over time to our users and sometimes skip a version when issues are found. Learn more about updates and release channels at {link}')\n\t\t\t\t.replace('{link}', '<a href=\"https://nextcloud.com/release-channels/\">https://nextcloud.com/release-channels/</a>')\n\t\t},\n\n\t\tlastCheckedOnString() {\n\t\t\treturn t('updatenotification', 'Checked on {lastCheckedDate}', {\n\t\t\t\tlastCheckedDate: this.lastCheckedDate,\n\t\t\t})\n\t\t},\n\n\t\tstatusText() {\n\t\t\tif (!this.isListFetched) {\n\t\t\t\treturn t('updatenotification', 'Checking apps for compatible versions')\n\t\t\t}\n\n\t\t\tif (this.appStoreDisabled) {\n\t\t\t\treturn t('updatenotification', 'Please make sure your config.php does not set <samp>appstoreenabled</samp> to false.')\n\t\t\t}\n\n\t\t\tif (this.appStoreFailed) {\n\t\t\t\treturn t('updatenotification', 'Could not connect to the App Store or no updates have been returned at all. Search manually for updates or make sure your server has access to the internet and can connect to the App Store.')\n\t\t\t}\n\n\t\t\treturn this.missingAppUpdates.length === 0\n\t\t\t\t? t('updatenotification', '<strong>All</strong> apps have a compatible version for this Nextcloud version available.', this)\n\t\t\t\t: n('updatenotification', '<strong>%n</strong> app has no compatible version for this Nextcloud version available.', '<strong>%n</strong> apps have no compatible version for this Nextcloud version available.', this.missingAppUpdates.length)\n\t\t},\n\n\t\twhatsNew() {\n\t\t\tif (this.whatsNewData.length === 0) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\tconst whatsNew = []\n\t\t\tfor (const i in this.whatsNewData) {\n\t\t\t\twhatsNew[i] = { icon: 'icon-checkmark', longtext: this.whatsNewData[i] }\n\t\t\t}\n\t\t\tif (this.changelogURL) {\n\t\t\t\twhatsNew.push({\n\t\t\t\t\thref: this.changelogURL,\n\t\t\t\t\ttext: t('updatenotification', 'View changelog'),\n\t\t\t\t\ticon: 'icon-link',\n\t\t\t\t\ttarget: '_blank',\n\t\t\t\t\taction: '',\n\t\t\t\t})\n\t\t\t}\n\t\t\treturn whatsNew\n\t\t},\n\n\t\tchannelList() {\n\t\t\tconst channelList = []\n\n\t\t\tchannelList.push({\n\t\t\t\ttext: t('updatenotification', 'Enterprise'),\n\t\t\t\tlongtext: t('updatenotification', 'For enterprise use. Provides always the latest patch level, but will not update to the next major release immediately. That update happens once Nextcloud GmbH has done additional hardening and testing for large-scale and mission-critical deployments. This channel is only available to customers and provides the Nextcloud Enterprise package.'),\n\t\t\t\ticon: 'icon-star',\n\t\t\t\tactive: this.currentChannel === 'enterprise',\n\t\t\t\tdisabled: !this.hasValidSubscription,\n\t\t\t\taction: this.changeReleaseChannelToEnterprise,\n\t\t\t})\n\n\t\t\tchannelList.push({\n\t\t\t\ttext: t('updatenotification', 'Stable'),\n\t\t\t\tlongtext: t('updatenotification', 'The most recent stable version. It is suited for regular use and will always update to the latest major version.'),\n\t\t\t\ticon: 'icon-checkmark',\n\t\t\t\tactive: this.currentChannel === 'stable',\n\t\t\t\taction: this.changeReleaseChannelToStable,\n\t\t\t})\n\n\t\t\tchannelList.push({\n\t\t\t\ttext: t('updatenotification', 'Beta'),\n\t\t\t\tlongtext: t('updatenotification', 'A pre-release version only for testing new features, not for production environments.'),\n\t\t\t\ticon: 'icon-category-customization',\n\t\t\t\tactive: this.currentChannel === 'beta',\n\t\t\t\taction: this.changeReleaseChannelToBeta,\n\t\t\t})\n\n\t\t\tif (this.isNonDefaultChannel) {\n\t\t\t\tchannelList.push({\n\t\t\t\t\ttext: this.currentChannel,\n\t\t\t\t\ticon: 'icon-rename',\n\t\t\t\t\tactive: true,\n\t\t\t\t})\n\t\t\t}\n\n\t\t\treturn channelList\n\t\t},\n\n\t\tisNonDefaultChannel() {\n\t\t\treturn this.currentChannel !== 'enterprise' && this.currentChannel !== 'stable' && this.currentChannel !== 'beta'\n\t\t},\n\n\t\tlocalizedChannelName() {\n\t\t\tswitch (this.currentChannel) {\n\t\t\tcase 'enterprise':\n\t\t\t\treturn t('updatenotification', 'Enterprise')\n\t\t\tcase 'stable':\n\t\t\t\treturn t('updatenotification', 'Stable')\n\t\t\tcase 'beta':\n\t\t\t\treturn t('updatenotification', 'Beta')\n\t\t\tdefault:\n\t\t\t\treturn this.currentChannel\n\t\t\t}\n\t\t},\n\t},\n\n\twatch: {\n\t\tnotifyGroups(selectedOptions) {\n\t\t\tif (!this.enableChangeWatcher) {\n\t\t\t\t// The first time is when loading the app\n\t\t\t\tthis.enableChangeWatcher = true\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tconst groups = this.notifyGroups.map(group => {\n\t\t\t\treturn group.id\n\t\t\t})\n\n\t\t\tOCP.AppConfig.setValue('updatenotification', 'notify_groups', JSON.stringify(groups))\n\t\t},\n\t\tisNewVersionAvailable() {\n\t\t\tif (!this.isNewVersionAvailable) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\taxios.get(generateOcsUrl('apps/updatenotification/api/v1/applist/{newVersion}', {\n\t\t\t\tnewVersion: this.newVersion,\n\t\t\t})).then(({ data }) => {\n\t\t\t\tthis.availableAppUpdates = data.ocs.data.available\n\t\t\t\tthis.missingAppUpdates = data.ocs.data.missing\n\t\t\t\tthis.isListFetched = true\n\t\t\t\tthis.appStoreFailed = false\n\t\t\t}).catch(({ data }) => {\n\t\t\t\tthis.availableAppUpdates = []\n\t\t\t\tthis.missingAppUpdates = []\n\t\t\t\tthis.appStoreDisabled = data.ocs.data.appstore_disabled\n\t\t\t\tthis.isListFetched = true\n\t\t\t\tthis.appStoreFailed = true\n\t\t\t})\n\t\t},\n\t},\n\tbeforeMount() {\n\t\t// Parse server data\n\t\tconst data = loadState('updatenotification', 'data')\n\n\t\tthis.newVersion = data.newVersion\n\t\tthis.newVersionString = data.newVersionString\n\t\tthis.lastCheckedDate = data.lastChecked\n\t\tthis.isUpdateChecked = data.isUpdateChecked\n\t\tthis.webUpdaterEnabled = data.webUpdaterEnabled\n\t\tthis.isWebUpdaterRecommended = data.isWebUpdaterRecommended\n\t\tthis.updaterEnabled = data.updaterEnabled\n\t\tthis.downloadLink = data.downloadLink\n\t\tthis.isNewVersionAvailable = data.isNewVersionAvailable\n\t\tthis.updateServerURL = data.updateServerURL\n\t\tthis.currentChannel = data.currentChannel\n\t\tthis.channels = data.channels\n\t\tthis.notifyGroups = data.notifyGroups\n\t\tthis.isDefaultUpdateServerURL = data.isDefaultUpdateServerURL\n\t\tthis.versionIsEol = data.versionIsEol\n\t\tthis.hasValidSubscription = data.hasValidSubscription\n\t\tif (data.changes && data.changes.changelogURL) {\n\t\t\tthis.changelogURL = data.changes.changelogURL\n\t\t}\n\t\tif (data.changes && data.changes.whatsNew) {\n\t\t\tif (data.changes.whatsNew.admin) {\n\t\t\t\tthis.whatsNewData = this.whatsNewData.concat(data.changes.whatsNew.admin)\n\t\t\t}\n\t\t\tthis.whatsNewData = this.whatsNewData.concat(data.changes.whatsNew.regular)\n\t\t}\n\t},\n\n\tmounted() {\n\t\tthis.searchGroup()\n\t},\n\n\tmethods: {\n\t\tsearchGroup: debounce(async function(query) {\n\t\t\tthis.loadingGroups = true\n\t\t\ttry {\n\t\t\t\tconst response = await axios.get(generateOcsUrl('cloud/groups/details'), {\n\t\t\t\t\tsearch: query,\n\t\t\t\t\tlimit: 20,\n\t\t\t\t\toffset: 0,\n\t\t\t\t})\n\t\t\t\tthis.groups = response.data.ocs.data.groups.sort(function(a, b) {\n\t\t\t\t\treturn a.displayname.localeCompare(b.displayname)\n\t\t\t\t})\n\t\t\t} catch (err) {\n\t\t\t\tlogger.error('Could not fetch groups', err)\n\t\t\t} finally {\n\t\t\t\tthis.loadingGroups = false\n\t\t\t}\n\t\t}, 500),\n\t\t/**\n\t\t * Creates a new authentication token and loads the updater URL\n\t\t */\n\t\tclickUpdaterButton() {\n\t\t\taxios.get(generateUrl('/apps/updatenotification/credentials'))\n\t\t\t\t.then(({ data }) => {\n\t\t\t\t// create a form to send a proper post request to the updater\n\t\t\t\t\tconst form = document.createElement('form')\n\t\t\t\t\tform.setAttribute('method', 'post')\n\t\t\t\t\tform.setAttribute('action', getRootUrl() + '/updater/')\n\n\t\t\t\t\tconst hiddenField = document.createElement('input')\n\t\t\t\t\thiddenField.setAttribute('type', 'hidden')\n\t\t\t\t\thiddenField.setAttribute('name', 'updater-secret-input')\n\t\t\t\t\thiddenField.setAttribute('value', data)\n\n\t\t\t\t\tform.appendChild(hiddenField)\n\n\t\t\t\t\tdocument.body.appendChild(form)\n\t\t\t\t\tform.submit()\n\t\t\t\t})\n\t\t},\n\t\tchangeReleaseChannelToEnterprise() {\n\t\t\tthis.changeReleaseChannel('enterprise')\n\t\t},\n\t\tchangeReleaseChannelToStable() {\n\t\t\tthis.changeReleaseChannel('stable')\n\t\t},\n\t\tchangeReleaseChannelToBeta() {\n\t\t\tthis.changeReleaseChannel('beta')\n\t\t},\n\t\tchangeReleaseChannel(channel) {\n\t\t\tthis.currentChannel = channel\n\n\t\t\taxios.post(generateUrl('/apps/updatenotification/channel'), {\n\t\t\t\tchannel: this.currentChannel,\n\t\t\t}).then(({ data }) => {\n\t\t\t\tshowSuccess(data.data.message)\n\t\t\t})\n\n\t\t\tthis.openedUpdateChannelMenu = false\n\t\t},\n\t\ttoggleUpdateChannelMenu() {\n\t\t\tthis.openedUpdateChannelMenu = !this.openedUpdateChannelMenu\n\t\t},\n\t\ttoggleHideMissingUpdates() {\n\t\t\tthis.hideMissingUpdates = !this.hideMissingUpdates\n\t\t},\n\t\ttoggleHideAvailableUpdates() {\n\t\t\tthis.hideAvailableUpdates = !this.hideAvailableUpdates\n\t\t},\n\t\ttoggleMenu() {\n\t\t\tthis.openedWhatsNew = !this.openedWhatsNew\n\t\t},\n\t\tcloseUpdateChannelMenu() {\n\t\t\tthis.openedUpdateChannelMenu = false\n\t\t},\n\t\thideMenu() {\n\t\t\tthis.openedWhatsNew = false\n\t\t},\n\t},\n}\n</script>\n\n<style lang=\"scss\" scoped>\n\t#updatenotification {\n\t\t& > * {\n\t\t\tmax-width: 900px;\n\t\t}\n\n\t\tdiv.update,\n\t\tp:not(.inlineblock) {\n\t\t\tmargin-bottom: 25px;\n\t\t}\n\t\th2.inlineblock {\n\t\t\tmargin-top: 25px;\n\t\t}\n\t\th3 {\n\t\t\tcursor: pointer;\n\t\t\t.icon {\n\t\t\t\tcursor: pointer;\n\t\t\t}\n\t\t\t&:first-of-type {\n\t\t\t\tmargin-top: 0;\n\t\t\t}\n\t\t\t&.update-channel-selector {\n\t\t\t\tdisplay: inline-block;\n\t\t\t\tcursor: inherit;\n\t\t\t}\n\t\t}\n\t\t.icon {\n\t\t\tdisplay: inline-block;\n\t\t\tmargin-bottom: -3px;\n\t\t}\n\t\t.icon-triangle-s, .icon-triangle-n {\n\t\t\topacity: 0.5;\n\t\t}\n\t\t.whatsNew {\n\t\t\tdisplay: inline-block;\n\t\t}\n\t\t.toggleWhatsNew {\n\t\t\tposition: relative;\n\t\t}\n\t\t.popovermenu {\n\t\t\tp {\n\t\t\t\tmargin-bottom: 0;\n\t\t\t\twidth: 100%;\n\t\t\t}\n\t\t\tmargin-top: 5px;\n\t\t\twidth: 300px;\n\t\t}\n\t\t.applist {\n\t\t\tmargin-bottom: 25px;\n\t\t}\n\n\t\t.update-menu {\n\t\t\tposition: relative;\n\t\t\tcursor: pointer;\n\t\t\tmargin-left: 3px;\n\t\t\tdisplay: inline-block;\n\t\t\t.icon-update-menu {\n\t\t\t\tcursor: inherit;\n\t\t\t\t.icon-triangle-s {\n\t\t\t\t\tdisplay: inline-block;\n\t\t\t\t\tvertical-align: middle;\n\t\t\t\t\tcursor: inherit;\n\t\t\t\t\topacity: 1;\n\t\t\t\t}\n\t\t\t}\n\t\t\t.popovermenu {\n\t\t\t\tdisplay: none;\n\t\t\t\ttop: 28px;\n\t\t\t\t&.show-menu {\n\t\t\t\t\tdisplay: block;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n</style>\n<style lang=\"scss\">\n\t/* override needed to make menu wider */\n\t#updatenotification .popovermenu {\n\t\tp {\n\t\t\tmargin-top: 5px;\n\t\t\twidth: 100%;\n\t\t}\n\t\tmargin-top: 5px;\n\t\twidth: 300px;\n\t}\n\t/* override needed to replace yellow hover state with a dark one */\n\t#updatenotification .update-menu .icon-star:hover,\n\t#updatenotification .update-menu .icon-star:focus {\n\t\tbackground-image: var(--icon-starred);\n\t}\n\t#updatenotification .topMargin {\n\t\tmargin-top: 15px;\n\t}\n</style>\n","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./UpdateNotification.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!./UpdateNotification.vue?vue&type=script&lang=js&\"","\n import API from \"!../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./UpdateNotification.vue?vue&type=style&index=0&id=e918afa2&lang=scss&scoped=true&\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./UpdateNotification.vue?vue&type=style&index=0&id=e918afa2&lang=scss&scoped=true&\";\n export default content && content.locals ? content.locals : undefined;\n","\n import API from \"!../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./UpdateNotification.vue?vue&type=style&index=1&lang=scss&\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./UpdateNotification.vue?vue&type=style&index=1&lang=scss&\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./UpdateNotification.vue?vue&type=template&id=e918afa2&scoped=true&\"\nimport script from \"./UpdateNotification.vue?vue&type=script&lang=js&\"\nexport * from \"./UpdateNotification.vue?vue&type=script&lang=js&\"\nimport style0 from \"./UpdateNotification.vue?vue&type=style&index=0&id=e918afa2&lang=scss&scoped=true&\"\nimport style1 from \"./UpdateNotification.vue?vue&type=style&index=1&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"e918afa2\",\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('NcSettingsSection',{attrs:{\"id\":\"updatenotification\",\"title\":_vm.t('updatenotification', 'Update')}},[_c('div',{staticClass:\"update\"},[(_vm.isNewVersionAvailable)?[(_vm.versionIsEol)?_c('NcNoteCard',{attrs:{\"type\":\"warning\"}},[_vm._v(\"\\n\\t\\t\\t\\t\"+_vm._s(_vm.t('updatenotification', 'The version you are running is not maintained anymore. Please make sure to update to a supported version as soon as possible.'))+\"\\n\\t\\t\\t\")]):_vm._e(),_vm._v(\" \"),_c('p',[_c('span',{domProps:{\"innerHTML\":_vm._s(_vm.newVersionAvailableString)}}),_c('br'),_vm._v(\" \"),(!_vm.isListFetched)?_c('span',{staticClass:\"icon icon-loading-small\"}):_vm._e(),_vm._v(\" \"),_c('span',{domProps:{\"innerHTML\":_vm._s(_vm.statusText)}})]),_vm._v(\" \"),(_vm.missingAppUpdates.length)?[_c('h3',{on:{\"click\":_vm.toggleHideMissingUpdates}},[_vm._v(\"\\n\\t\\t\\t\\t\\t\"+_vm._s(_vm.t('updatenotification', 'Apps missing compatible version'))+\"\\n\\t\\t\\t\\t\\t\"),(!_vm.hideMissingUpdates)?_c('span',{staticClass:\"icon icon-triangle-n\"}):_vm._e(),_vm._v(\" \"),(_vm.hideMissingUpdates)?_c('span',{staticClass:\"icon icon-triangle-s\"}):_vm._e()]),_vm._v(\" \"),(!_vm.hideMissingUpdates)?_c('ul',{staticClass:\"applist\"},_vm._l((_vm.missingAppUpdates),function(app,index){return _c('li',{key:index},[_c('a',{attrs:{\"href\":'https://apps.nextcloud.com/apps/' + app.appId,\"title\":_vm.t('settings', 'View in store')}},[_vm._v(_vm._s(app.appName)+\" ↗\")])])}),0):_vm._e()]:_vm._e(),_vm._v(\" \"),(_vm.availableAppUpdates.length)?[_c('h3',{on:{\"click\":_vm.toggleHideAvailableUpdates}},[_vm._v(\"\\n\\t\\t\\t\\t\\t\"+_vm._s(_vm.t('updatenotification', 'Apps with compatible version'))+\"\\n\\t\\t\\t\\t\\t\"),(!_vm.hideAvailableUpdates)?_c('span',{staticClass:\"icon icon-triangle-n\"}):_vm._e(),_vm._v(\" \"),(_vm.hideAvailableUpdates)?_c('span',{staticClass:\"icon icon-triangle-s\"}):_vm._e()]),_vm._v(\" \"),(!_vm.hideAvailableUpdates)?_c('ul',{staticClass:\"applist\"},_vm._l((_vm.availableAppUpdates),function(app,index){return _c('li',{key:index},[_c('a',{attrs:{\"href\":'https://apps.nextcloud.com/apps/' + app.appId,\"title\":_vm.t('settings', 'View in store')}},[_vm._v(_vm._s(app.appName)+\" ↗\")])])}),0):_vm._e()]:_vm._e(),_vm._v(\" \"),(!_vm.isWebUpdaterRecommended && _vm.updaterEnabled && _vm.webUpdaterEnabled)?[_c('h3',{staticClass:\"warning\"},[_vm._v(\"\\n\\t\\t\\t\\t\\t\"+_vm._s(_vm.t('updatenotification', 'Please note that the web updater is not recommended with more than 100 users! Please use the command line updater instead!'))+\"\\n\\t\\t\\t\\t\")])]:_vm._e(),_vm._v(\" \"),_c('div',[(_vm.updaterEnabled && _vm.webUpdaterEnabled)?_c('a',{staticClass:\"button primary\",attrs:{\"href\":\"#\"},on:{\"click\":_vm.clickUpdaterButton}},[_vm._v(_vm._s(_vm.t('updatenotification', 'Open updater')))]):_vm._e(),_vm._v(\" \"),(_vm.downloadLink)?_c('a',{staticClass:\"button\",class:{ hidden: !_vm.updaterEnabled },attrs:{\"href\":_vm.downloadLink}},[_vm._v(_vm._s(_vm.t('updatenotification', 'Download now')))]):_vm._e(),_vm._v(\" \"),(_vm.updaterEnabled && !_vm.webUpdaterEnabled)?_c('span',[_vm._v(\"\\n\\t\\t\\t\\t\\t\"+_vm._s(_vm.t('updatenotification', 'Please use the command line updater to update.'))+\"\\n\\t\\t\\t\\t\")]):_vm._e(),_vm._v(\" \"),(_vm.whatsNew)?_c('div',{staticClass:\"whatsNew\"},[_c('div',{staticClass:\"toggleWhatsNew\"},[_c('a',{directives:[{name:\"click-outside\",rawName:\"v-click-outside\",value:(_vm.hideMenu),expression:\"hideMenu\"}],staticClass:\"button\",on:{\"click\":_vm.toggleMenu}},[_vm._v(_vm._s(_vm.t('updatenotification', 'What\\'s new?')))]),_vm._v(\" \"),_c('div',{staticClass:\"popovermenu\",class:{ 'menu-center': true, open: _vm.openedWhatsNew }},[_c('NcPopoverMenu',{attrs:{\"menu\":_vm.whatsNew}})],1)])]):_vm._e()])]:(!_vm.isUpdateChecked)?[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.t('updatenotification', 'The update check is not yet finished. Please refresh the page.'))+\"\\n\\t\\t\")]:[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.t('updatenotification', 'Your version is up to date.'))+\"\\n\\t\\t\\t\"),_c('span',{directives:[{name:\"tooltip\",rawName:\"v-tooltip.auto\",value:(_vm.lastCheckedOnString),expression:\"lastCheckedOnString\",modifiers:{\"auto\":true}}],staticClass:\"icon-info svg\"})],_vm._v(\" \"),(!_vm.isDefaultUpdateServerURL)?[_c('p',{staticClass:\"topMargin\"},[_c('em',[_vm._v(_vm._s(_vm.t('updatenotification', 'A non-default update server is in use to be checked for updates:'))+\" \"),_c('code',[_vm._v(_vm._s(_vm.updateServerURL))])])])]:_vm._e()],2),_vm._v(\" \"),_c('div',[_vm._v(\"\\n\\t\\t\"+_vm._s(_vm.t('updatenotification', 'You can change the update channel below which also affects the apps management page. E.g. after switching to the beta channel, beta app updates will be offered to you in the apps management page.'))+\"\\n\\t\")]),_vm._v(\" \"),_c('h3',{staticClass:\"update-channel-selector\"},[_vm._v(\"\\n\\t\\t\"+_vm._s(_vm.t('updatenotification', 'Update channel:'))+\"\\n\\t\\t\"),_c('div',{directives:[{name:\"click-outside\",rawName:\"v-click-outside\",value:(_vm.closeUpdateChannelMenu),expression:\"closeUpdateChannelMenu\"}],staticClass:\"update-menu\"},[_c('span',{staticClass:\"icon-update-menu\",on:{\"click\":_vm.toggleUpdateChannelMenu}},[_vm._v(\"\\n\\t\\t\\t\\t\"+_vm._s(_vm.localizedChannelName)+\"\\n\\t\\t\\t\\t\"),_c('span',{staticClass:\"icon-triangle-s\"})]),_vm._v(\" \"),_c('div',{staticClass:\"popovermenu menu menu-center\",class:{ 'show-menu': _vm.openedUpdateChannelMenu}},[_c('NcPopoverMenu',{attrs:{\"menu\":_vm.channelList}})],1)])]),_vm._v(\" \"),_c('span',{staticClass:\"msg\",attrs:{\"id\":\"channel_save_msg\"}}),_c('br'),_vm._v(\" \"),_c('p',[_c('em',[_vm._v(_vm._s(_vm.t('updatenotification', 'You can always update to a newer version. But you can never downgrade to a more stable version.')))]),_c('br'),_vm._v(\" \"),_c('em',{domProps:{\"innerHTML\":_vm._s(_vm.noteDelayedStableString)}})]),_vm._v(\" \"),_c('p',{attrs:{\"id\":\"oca_updatenotification_groups\"}},[_vm._v(\"\\n\\t\\t\"+_vm._s(_vm.t('updatenotification', 'Notify members of the following groups about available updates:'))+\"\\n\\t\\t\"),_c('NcMultiselect',{attrs:{\"options\":_vm.groups,\"multiple\":true,\"searchable\":true,\"label\":\"displayname\",\"loading\":_vm.loadingGroups,\"show-no-options\":false,\"close-on-select\":false,\"track-by\":\"id\",\"tag-width\":75},on:{\"search-change\":_vm.searchGroup},model:{value:(_vm.notifyGroups),callback:function ($$v) {_vm.notifyGroups=$$v},expression:\"notifyGroups\"}}),_c('br'),_vm._v(\" \"),(_vm.currentChannel === 'daily' || _vm.currentChannel === 'git')?_c('em',[_vm._v(_vm._s(_vm.t('updatenotification', 'Only notifications for app updates are available.')))]):_vm._e(),_vm._v(\" \"),(_vm.currentChannel === 'daily')?_c('em',[_vm._v(_vm._s(_vm.t('updatenotification', 'The selected update channel makes dedicated notifications for the server obsolete.')))]):_vm._e(),_vm._v(\" \"),(_vm.currentChannel === 'git')?_c('em',[_vm._v(_vm._s(_vm.t('updatenotification', 'The selected update channel does not support updates of the server.')))]):_vm._e()],1)])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","/**\n * @copyright Copyright (c) 2018 Joas Schilling <coding@schilljs.com>\n *\n * @author Joas Schilling <coding@schilljs.com>\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @license AGPL-3.0-or-later\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\nimport Vue from 'vue'\nimport Root from './components/UpdateNotification'\n\nVue.mixin({\n\tmethods: {\n\t\tt(app, text, vars, count, options) {\n\t\t\treturn OC.L10N.translate(app, text, vars, count, options)\n\t\t},\n\t\tn(app, textSingular, textPlural, count, vars, options) {\n\t\t\treturn OC.L10N.translatePlural(app, textSingular, textPlural, count, vars, options)\n\t\t},\n\t},\n})\n\n// eslint-disable-next-line no-new\nnew Vue({\n\tel: '#updatenotification',\n\trender: h => h(Root),\n})\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"#updatenotification>*[data-v-e918afa2]{max-width:900px}#updatenotification div.update[data-v-e918afa2],#updatenotification p[data-v-e918afa2]:not(.inlineblock){margin-bottom:25px}#updatenotification h2.inlineblock[data-v-e918afa2]{margin-top:25px}#updatenotification h3[data-v-e918afa2]{cursor:pointer}#updatenotification h3 .icon[data-v-e918afa2]{cursor:pointer}#updatenotification h3[data-v-e918afa2]:first-of-type{margin-top:0}#updatenotification h3.update-channel-selector[data-v-e918afa2]{display:inline-block;cursor:inherit}#updatenotification .icon[data-v-e918afa2]{display:inline-block;margin-bottom:-3px}#updatenotification .icon-triangle-s[data-v-e918afa2],#updatenotification .icon-triangle-n[data-v-e918afa2]{opacity:.5}#updatenotification .whatsNew[data-v-e918afa2]{display:inline-block}#updatenotification .toggleWhatsNew[data-v-e918afa2]{position:relative}#updatenotification .popovermenu[data-v-e918afa2]{margin-top:5px;width:300px}#updatenotification .popovermenu p[data-v-e918afa2]{margin-bottom:0;width:100%}#updatenotification .applist[data-v-e918afa2]{margin-bottom:25px}#updatenotification .update-menu[data-v-e918afa2]{position:relative;cursor:pointer;margin-left:3px;display:inline-block}#updatenotification .update-menu .icon-update-menu[data-v-e918afa2]{cursor:inherit}#updatenotification .update-menu .icon-update-menu .icon-triangle-s[data-v-e918afa2]{display:inline-block;vertical-align:middle;cursor:inherit;opacity:1}#updatenotification .update-menu .popovermenu[data-v-e918afa2]{display:none;top:28px}#updatenotification .update-menu .popovermenu.show-menu[data-v-e918afa2]{display:block}\", \"\",{\"version\":3,\"sources\":[\"webpack://./apps/updatenotification/src/components/UpdateNotification.vue\"],\"names\":[],\"mappings\":\"AA4cC,uCACC,eAAA,CAGD,yGAEC,kBAAA,CAED,oDACC,eAAA,CAED,wCACC,cAAA,CACA,8CACC,cAAA,CAED,sDACC,YAAA,CAED,gEACC,oBAAA,CACA,cAAA,CAGF,2CACC,oBAAA,CACA,kBAAA,CAED,4GACC,UAAA,CAED,+CACC,oBAAA,CAED,qDACC,iBAAA,CAED,kDAKC,cAAA,CACA,WAAA,CALA,oDACC,eAAA,CACA,UAAA,CAKF,8CACC,kBAAA,CAGD,kDACC,iBAAA,CACA,cAAA,CACA,eAAA,CACA,oBAAA,CACA,oEACC,cAAA,CACA,qFACC,oBAAA,CACA,qBAAA,CACA,cAAA,CACA,SAAA,CAGF,+DACC,YAAA,CACA,QAAA,CACA,yEACC,aAAA\",\"sourcesContent\":[\"\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n#updatenotification {\\n\\t& > * {\\n\\t\\tmax-width: 900px;\\n\\t}\\n\\n\\tdiv.update,\\n\\tp:not(.inlineblock) {\\n\\t\\tmargin-bottom: 25px;\\n\\t}\\n\\th2.inlineblock {\\n\\t\\tmargin-top: 25px;\\n\\t}\\n\\th3 {\\n\\t\\tcursor: pointer;\\n\\t\\t.icon {\\n\\t\\t\\tcursor: pointer;\\n\\t\\t}\\n\\t\\t&:first-of-type {\\n\\t\\t\\tmargin-top: 0;\\n\\t\\t}\\n\\t\\t&.update-channel-selector {\\n\\t\\t\\tdisplay: inline-block;\\n\\t\\t\\tcursor: inherit;\\n\\t\\t}\\n\\t}\\n\\t.icon {\\n\\t\\tdisplay: inline-block;\\n\\t\\tmargin-bottom: -3px;\\n\\t}\\n\\t.icon-triangle-s, .icon-triangle-n {\\n\\t\\topacity: 0.5;\\n\\t}\\n\\t.whatsNew {\\n\\t\\tdisplay: inline-block;\\n\\t}\\n\\t.toggleWhatsNew {\\n\\t\\tposition: relative;\\n\\t}\\n\\t.popovermenu {\\n\\t\\tp {\\n\\t\\t\\tmargin-bottom: 0;\\n\\t\\t\\twidth: 100%;\\n\\t\\t}\\n\\t\\tmargin-top: 5px;\\n\\t\\twidth: 300px;\\n\\t}\\n\\t.applist {\\n\\t\\tmargin-bottom: 25px;\\n\\t}\\n\\n\\t.update-menu {\\n\\t\\tposition: relative;\\n\\t\\tcursor: pointer;\\n\\t\\tmargin-left: 3px;\\n\\t\\tdisplay: inline-block;\\n\\t\\t.icon-update-menu {\\n\\t\\t\\tcursor: inherit;\\n\\t\\t\\t.icon-triangle-s {\\n\\t\\t\\t\\tdisplay: inline-block;\\n\\t\\t\\t\\tvertical-align: middle;\\n\\t\\t\\t\\tcursor: inherit;\\n\\t\\t\\t\\topacity: 1;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t\\t.popovermenu {\\n\\t\\t\\tdisplay: none;\\n\\t\\t\\ttop: 28px;\\n\\t\\t\\t&.show-menu {\\n\\t\\t\\t\\tdisplay: block;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"#updatenotification .popovermenu{margin-top:5px;width:300px}#updatenotification .popovermenu p{margin-top:5px;width:100%}#updatenotification .update-menu .icon-star:hover,#updatenotification .update-menu .icon-star:focus{background-image:var(--icon-starred)}#updatenotification .topMargin{margin-top:15px}\", \"\",{\"version\":3,\"sources\":[\"webpack://./apps/updatenotification/src/components/UpdateNotification.vue\"],\"names\":[],\"mappings\":\"AAuhBA,iCAKC,cAAA,CACA,WAAA,CALA,mCACC,cAAA,CACA,UAAA,CAMF,oGAEC,oCAAA,CAED,+BACC,eAAA\",\"sourcesContent\":[\"\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n/* override needed to make menu wider */\\n#updatenotification .popovermenu {\\n\\tp {\\n\\t\\tmargin-top: 5px;\\n\\t\\twidth: 100%;\\n\\t}\\n\\tmargin-top: 5px;\\n\\twidth: 300px;\\n}\\n/* override needed to replace yellow hover state with a dark one */\\n#updatenotification .update-menu .icon-star:hover,\\n#updatenotification .update-menu .icon-star:focus {\\n\\tbackground-image: var(--icon-starred);\\n}\\n#updatenotification .topMargin {\\n\\tmargin-top: 15px;\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\tloaded: false,\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Flag the module as loaded\n\tmodule.loaded = true;\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","__webpack_require__.amdD = function () {\n\tthrow new Error('define cannot be used indirect');\n};","__webpack_require__.amdO = {};","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = function(module) {\n\tvar getter = module && module.__esModule ?\n\t\tfunction() { return module['default']; } :\n\t\tfunction() { return module; };\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = function(exports, definition) {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }","// define __esModule on exports\n__webpack_require__.r = function(exports) {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.nmd = function(module) {\n\tmodule.paths = [];\n\tif (!module.children) module.children = [];\n\treturn module;\n};","__webpack_require__.j = 7292;","__webpack_require__.b = document.baseURI || self.location.href;\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t7292: 0\n};\n\n// no chunk on demand loading\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = function(chunkId) { return installedChunks[chunkId] === 0; };\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = function(parentChunkLoadingFunction, data) {\n\tvar chunkIds = data[0];\n\tvar moreModules = data[1];\n\tvar runtime = data[2];\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some(function(id) { return installedChunks[id] !== 0; })) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunknextcloud\"] = self[\"webpackChunknextcloud\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","__webpack_require__.nc = undefined;","// startup\n// Load entry module and return exports\n// This entry module depends on other loaded chunks and execution need to be delayed\nvar __webpack_exports__ = __webpack_require__.O(undefined, [7874], function() { return __webpack_require__(94224); })\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["deferred","VTooltip","options","styleTagTransform","setAttributes","insert","domAPI","insertStyleElement","_vm","this","_h","$createElement","_c","_self","attrs","t","staticClass","_v","_s","_e","domProps","newVersionAvailableString","isListFetched","statusText","missingAppUpdates","on","toggleHideMissingUpdates","hideMissingUpdates","_l","app","index","key","appId","appName","availableAppUpdates","toggleHideAvailableUpdates","hideAvailableUpdates","isWebUpdaterRecommended","updaterEnabled","webUpdaterEnabled","clickUpdaterButton","class","hidden","downloadLink","directives","name","rawName","value","expression","toggleMenu","open","openedWhatsNew","whatsNew","isUpdateChecked","modifiers","isDefaultUpdateServerURL","updateServerURL","toggleUpdateChannelMenu","localizedChannelName","openedUpdateChannelMenu","channelList","noteDelayedStableString","groups","loadingGroups","searchGroup","model","callback","$$v","notifyGroups","currentChannel","Vue","methods","text","vars","count","OC","L10N","translate","n","textSingular","textPlural","translatePlural","el","render","h","Root","___CSS_LOADER_EXPORT___","push","module","id","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","exports","loaded","__webpack_modules__","call","m","amdD","Error","amdO","O","result","chunkIds","fn","priority","notFulfilled","Infinity","i","length","fulfilled","j","Object","keys","every","splice","r","getter","__esModule","d","a","definition","o","defineProperty","enumerable","get","g","globalThis","Function","e","window","obj","prop","prototype","hasOwnProperty","Symbol","toStringTag","nmd","paths","children","b","document","baseURI","self","location","href","installedChunks","chunkId","webpackJsonpCallback","parentChunkLoadingFunction","data","moreModules","runtime","some","chunkLoadingGlobal","forEach","bind","nc","__webpack_exports__"],"sourceRoot":""}
\ No newline at end of file diff --git a/lib/composer/composer/autoload_classmap.php b/lib/composer/composer/autoload_classmap.php index ededda8d55c..9cdd19d7233 100644 --- a/lib/composer/composer/autoload_classmap.php +++ b/lib/composer/composer/autoload_classmap.php @@ -31,7 +31,6 @@ return array( 'OCP\\AppFramework\\Db\\DoesNotExistException' => $baseDir . '/lib/public/AppFramework/Db/DoesNotExistException.php', 'OCP\\AppFramework\\Db\\Entity' => $baseDir . '/lib/public/AppFramework/Db/Entity.php', 'OCP\\AppFramework\\Db\\IMapperException' => $baseDir . '/lib/public/AppFramework/Db/IMapperException.php', - 'OCP\\AppFramework\\Db\\Mapper' => $baseDir . '/lib/public/AppFramework/Db/Mapper.php', 'OCP\\AppFramework\\Db\\MultipleObjectsReturnedException' => $baseDir . '/lib/public/AppFramework/Db/MultipleObjectsReturnedException.php', 'OCP\\AppFramework\\Db\\QBMapper' => $baseDir . '/lib/public/AppFramework/Db/QBMapper.php', 'OCP\\AppFramework\\Db\\TTransactional' => $baseDir . '/lib/public/AppFramework/Db/TTransactional.php', diff --git a/lib/composer/composer/autoload_static.php b/lib/composer/composer/autoload_static.php index d2cdea38a81..fc636f312b5 100644 --- a/lib/composer/composer/autoload_static.php +++ b/lib/composer/composer/autoload_static.php @@ -64,7 +64,6 @@ class ComposerStaticInit749170dad3f5e7f9ca158f5a9f04f6a2 'OCP\\AppFramework\\Db\\DoesNotExistException' => __DIR__ . '/../../..' . '/lib/public/AppFramework/Db/DoesNotExistException.php', 'OCP\\AppFramework\\Db\\Entity' => __DIR__ . '/../../..' . '/lib/public/AppFramework/Db/Entity.php', 'OCP\\AppFramework\\Db\\IMapperException' => __DIR__ . '/../../..' . '/lib/public/AppFramework/Db/IMapperException.php', - 'OCP\\AppFramework\\Db\\Mapper' => __DIR__ . '/../../..' . '/lib/public/AppFramework/Db/Mapper.php', 'OCP\\AppFramework\\Db\\MultipleObjectsReturnedException' => __DIR__ . '/../../..' . '/lib/public/AppFramework/Db/MultipleObjectsReturnedException.php', 'OCP\\AppFramework\\Db\\QBMapper' => __DIR__ . '/../../..' . '/lib/public/AppFramework/Db/QBMapper.php', 'OCP\\AppFramework\\Db\\TTransactional' => __DIR__ . '/../../..' . '/lib/public/AppFramework/Db/TTransactional.php', diff --git a/lib/l10n/fr.js b/lib/l10n/fr.js index 01f30d040e7..932049a5296 100644 --- a/lib/l10n/fr.js +++ b/lib/l10n/fr.js @@ -93,6 +93,7 @@ OC.L10N.register( "Appearance and accessibility" : "Apparence et accessibilité", "Apps" : "Applications", "Personal settings" : "Paramètres personnels", + "Administration settings" : "Paramètres d'administration", "Settings" : "Paramètres", "Log out" : "Se déconnecter", "Users" : "Utilisateurs", diff --git a/lib/l10n/fr.json b/lib/l10n/fr.json index 561001d842d..d9a80af6a0e 100644 --- a/lib/l10n/fr.json +++ b/lib/l10n/fr.json @@ -91,6 +91,7 @@ "Appearance and accessibility" : "Apparence et accessibilité", "Apps" : "Applications", "Personal settings" : "Paramètres personnels", + "Administration settings" : "Paramètres d'administration", "Settings" : "Paramètres", "Log out" : "Se déconnecter", "Users" : "Utilisateurs", diff --git a/lib/private/DB/MigrationService.php b/lib/private/DB/MigrationService.php index 4b7e4d3a040..7993730b230 100644 --- a/lib/private/DB/MigrationService.php +++ b/lib/private/DB/MigrationService.php @@ -40,6 +40,7 @@ use OC\IntegrityCheck\Helpers\AppLocator; use OC\Migration\SimpleOutput; use OCP\AppFramework\App; use OCP\AppFramework\QueryException; +use OCP\DB\ISchemaWrapper; use OCP\Migration\IMigrationStep; use OCP\Migration\IOutput; use Psr\Log\LoggerInterface; @@ -440,7 +441,7 @@ class MigrationService { foreach ($toBeExecuted as $version) { $instance = $this->createInstance($version); - $toSchema = $instance->changeSchema($this->output, function () use ($toSchema) { + $toSchema = $instance->changeSchema($this->output, function () use ($toSchema): ISchemaWrapper { return $toSchema ?: new SchemaWrapper($this->connection); }, ['tablePrefix' => $this->connection->getPrefix()]) ?: $toSchema; } @@ -513,12 +514,12 @@ class MigrationService { $instance = $this->createInstance($version); if (!$schemaOnly) { - $instance->preSchemaChange($this->output, function () { + $instance->preSchemaChange($this->output, function (): ISchemaWrapper { return new SchemaWrapper($this->connection); }, ['tablePrefix' => $this->connection->getPrefix()]); } - $toSchema = $instance->changeSchema($this->output, function () { + $toSchema = $instance->changeSchema($this->output, function (): ISchemaWrapper { return new SchemaWrapper($this->connection); }, ['tablePrefix' => $this->connection->getPrefix()]); @@ -533,7 +534,7 @@ class MigrationService { } if (!$schemaOnly) { - $instance->postSchemaChange($this->output, function () { + $instance->postSchemaChange($this->output, function (): ISchemaWrapper { return new SchemaWrapper($this->connection); }, ['tablePrefix' => $this->connection->getPrefix()]); } diff --git a/lib/private/Files/ObjectStore/S3ObjectTrait.php b/lib/private/Files/ObjectStore/S3ObjectTrait.php index 9d692e01a23..a88ebbeda82 100644 --- a/lib/private/Files/ObjectStore/S3ObjectTrait.php +++ b/lib/private/Files/ObjectStore/S3ObjectTrait.php @@ -152,7 +152,7 @@ trait S3ObjectTrait { // ($psrStream->isSeekable() && $psrStream->getSize() !== null) evaluates to true for a On-Seekable stream // so the optimisation does not apply $buffer = new Psr7\Stream(fopen("php://memory", 'rwb+')); - Utils::copyToStream($psrStream, $buffer, $this->uploadPartSize); + Utils::copyToStream($psrStream, $buffer, $this->putSizeLimit); $buffer->seek(0); if ($buffer->getSize() < $this->putSizeLimit) { // buffer is fully seekable, so use it directly for the small upload diff --git a/lib/private/Metadata/FileMetadataMapper.php b/lib/private/Metadata/FileMetadataMapper.php index 53f750ae540..f8f8df4bf3b 100644 --- a/lib/private/Metadata/FileMetadataMapper.php +++ b/lib/private/Metadata/FileMetadataMapper.php @@ -3,6 +3,7 @@ declare(strict_types=1); /** * @copyright Copyright 2022 Carl Schwan <carl@carlschwan.eu> + * @copyright Copyright 2022 Louis Chmn <louis@chmn.me> * @license AGPL-3.0-or-later * * This code is free software: you can redistribute it and/or modify @@ -24,6 +25,7 @@ namespace OC\Metadata; use OCP\AppFramework\Db\DoesNotExistException; use OCP\AppFramework\Db\MultipleObjectsReturnedException; use OCP\AppFramework\Db\QBMapper; +use OCP\AppFramework\Db\Entity; use OCP\DB\Exception; use OCP\DB\QueryBuilder\IQueryBuilder; use OCP\IDBConnection; @@ -102,4 +104,45 @@ class FileMetadataMapper extends QBMapper { $qb->executeStatement(); } + + /** + * Updates an entry in the db from an entity + * + * @param Entity $entity the entity that should be created + * @return Entity the saved entity with the set id + * @throws Exception + * @throws \InvalidArgumentException if entity has no id + */ + public function update(Entity $entity): Entity { + if (!($entity instanceof FileMetadata)) { + throw new \Exception("Entity should be a FileMetadata entity"); + } + + // entity needs an id + $id = $entity->getId(); + if ($id === null) { + throw new \InvalidArgumentException('Entity which should be updated has no id'); + } + + // entity needs an group_name + $groupName = $entity->getGroupName(); + if ($groupName === null) { + throw new \InvalidArgumentException('Entity which should be updated has no group_name'); + } + + $idType = $this->getParameterTypeForProperty($entity, 'id'); + $groupNameType = $this->getParameterTypeForProperty($entity, 'groupName'); + $metadataValue = $entity->getMetadata(); + $metadataType = $this->getParameterTypeForProperty($entity, 'metadata'); + + $qb = $this->db->getQueryBuilder(); + + $qb->update($this->tableName) + ->set('metadata', $qb->createNamedParameter($metadataValue, $metadataType)) + ->where($qb->expr()->eq('id', $qb->createNamedParameter($id, $idType))) + ->andWhere($qb->expr()->eq('group_name', $qb->createNamedParameter($groupName, $groupNameType))) + ->executeStatement(); + + return $entity; + } } diff --git a/lib/private/Metadata/MetadataManager.php b/lib/private/Metadata/MetadataManager.php index d1cb896febf..77407a2f529 100644 --- a/lib/private/Metadata/MetadataManager.php +++ b/lib/private/Metadata/MetadataManager.php @@ -21,27 +21,19 @@ namespace OC\Metadata; use OC\Metadata\Provider\ExifProvider; use OCP\Files\File; -use OCP\IConfig; -use Psr\Log\LoggerInterface; class MetadataManager implements IMetadataManager { /** @var array<string, IMetadataProvider> */ private array $providers; private array $providerClasses; private FileMetadataMapper $fileMetadataMapper; - private IConfig $config; - private LoggerInterface $logger; public function __construct( - FileMetadataMapper $fileMetadataMapper, - IConfig $config, - LoggerInterface $logger + FileMetadataMapper $fileMetadataMapper ) { $this->providers = []; $this->providerClasses = []; $this->fileMetadataMapper = $fileMetadataMapper; - $this->config = $config; - $this->logger = $logger; // TODO move to another place, where? $this->registerProvider(ExifProvider::class); diff --git a/lib/private/Metadata/Provider/ExifProvider.php b/lib/private/Metadata/Provider/ExifProvider.php index 892671556b3..02024bd3877 100644 --- a/lib/private/Metadata/Provider/ExifProvider.php +++ b/lib/private/Metadata/Provider/ExifProvider.php @@ -1,23 +1,66 @@ <?php +declare(strict_types=1); +/** + * @copyright Copyright 2022 Carl Schwan <carl@carlschwan.eu> + * @copyright Copyright 2022 Louis Chmn <louis@chmn.me> + * @license AGPL-3.0-or-later + * + * This code is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * 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, version 3, + * along with this program. If not, see <http://www.gnu.org/licenses/> + * + */ + namespace OC\Metadata\Provider; use OC\Metadata\FileMetadata; use OC\Metadata\IMetadataProvider; use OCP\Files\File; +use Psr\Log\LoggerInterface; class ExifProvider implements IMetadataProvider { + private LoggerInterface $logger; + + public function __construct( + LoggerInterface $logger + ) { + $this->logger = $logger; + } + public static function groupsProvided(): array { - return ['size']; + return ['size', 'gps']; } public static function isAvailable(): bool { return extension_loaded('exif'); } + /** @return array{'gps': FileMetadata, 'size': FileMetadata} */ public function execute(File $file): array { + $exifData = []; $fileDescriptor = $file->fopen('rb'); - $data = exif_read_data($fileDescriptor, 'COMPUTED', true); + + $data = null; + try { + // Needed to make reading exif data reliable. + // This is to trigger this condition: https://github.com/php/php-src/blob/d64aa6f646a7b5e58359dc79479860164239580a/main/streams/streams.c#L710 + // But I don't understand why 1 as a special meaning. + // Revert right after reading the exif data. + $oldBufferSize = stream_set_chunk_size($fileDescriptor, 1); + $data = exif_read_data($fileDescriptor, 'ANY_TAG', true); + stream_set_chunk_size($fileDescriptor, $oldBufferSize); + } catch (\Exception $ex) { + $this->logger->warning("Couldn't extract metadata for ".$file->getId(), ['exception' => $ex]); + } $size = new FileMetadata(); $size->setGroupName('size'); @@ -31,29 +74,65 @@ class ExifProvider implements IMetadataProvider { 'width' => $sizeResult[0], 'height' => $sizeResult[1], ]); + + $exifData['size'] = $size; } + } elseif (array_key_exists('COMPUTED', $data)) { + if (array_key_exists('Width', $data['COMPUTED']) && array_key_exists('Height', $data['COMPUTED'])) { + $size->setMetadata([ + 'width' => $data['COMPUTED']['Width'], + 'height' => $data['COMPUTED']['Height'], + ]); - return [ - 'size' => $size, - ]; + $exifData['size'] = $size; + } } - if (array_key_exists('COMPUTED', $data) - && array_key_exists('Width', $data['COMPUTED']) - && array_key_exists('Height', $data['COMPUTED']) + if ($data && array_key_exists('GPS', $data) + && array_key_exists('GPSLatitude', $data['GPS']) && array_key_exists('GPSLatitudeRef', $data['GPS']) + && array_key_exists('GPSLongitude', $data['GPS']) && array_key_exists('GPSLongitudeRef', $data['GPS']) ) { - $size->setMetadata([ - 'width' => $data['COMPUTED']['Width'], - 'height' => $data['COMPUTED']['Height'], + $gps = new FileMetadata(); + $gps->setGroupName('gps'); + $gps->setId($file->getId()); + $gps->setMetadata([ + 'latitude' => $this->gpsDegreesToDecimal($data['GPS']['GPSLatitude'], $data['GPS']['GPSLatitudeRef']), + 'longitude' => $this->gpsDegreesToDecimal($data['GPS']['GPSLongitude'], $data['GPS']['GPSLongitudeRef']), ]); + + $exifData['gps'] = $gps; } - return [ - 'size' => $size, - ]; + return $exifData; } public static function getMimetypesSupported(): string { return '/image\/.*/'; } + + /** + * @param array|string $coordinates + */ + private static function gpsDegreesToDecimal($coordinates, ?string $hemisphere): float { + if (is_string($coordinates)) { + $coordinates = array_map("trim", explode(",", $coordinates)); + } + + if (count($coordinates) !== 3) { + throw new \Exception('Invalid coordinate format: ' . json_encode($coordinates)); + } + + [$degrees, $minutes, $seconds] = array_map(function (string $rawDegree) { + $parts = explode('/', $rawDegree); + + if ($parts[1] === '0') { + return 0; + } + + return floatval($parts[0]) / floatval($parts[1] ?? 1); + }, $coordinates); + + $sign = ($hemisphere === 'W' || $hemisphere === 'S') ? -1 : 1; + return $sign * ($degrees + $minutes / 60 + $seconds / 3600); + } } diff --git a/lib/public/AppFramework/Db/Mapper.php b/lib/public/AppFramework/Db/Mapper.php deleted file mode 100644 index 2d0dc87ebb3..00000000000 --- a/lib/public/AppFramework/Db/Mapper.php +++ /dev/null @@ -1,370 +0,0 @@ -<?php -/** - * @copyright Copyright (c) 2016, ownCloud, Inc. - * - * @author Bernhard Posselt <dev@bernhard-posselt.com> - * @author Christoph Wurst <christoph@winzerhof-wurst.at> - * @author Joas Schilling <coding@schilljs.com> - * @author Lukas Reschke <lukas@statuscode.ch> - * @author Morris Jobke <hey@morrisjobke.de> - * @author Roeland Jago Douma <roeland@famdouma.nl> - * @author Thomas Müller <thomas.mueller@tmit.eu> - * - * @license AGPL-3.0 - * - * This code is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License, version 3, - * as published by the Free Software Foundation. - * - * 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, version 3, - * along with this program. If not, see <http://www.gnu.org/licenses/> - * - */ -namespace OCP\AppFramework\Db; - -use OCP\IDBConnection; - -/** - * Simple parent class for inheriting your data access layer from. This class - * may be subject to change in the future - * @since 7.0.0 - * @deprecated 14.0.0 Move over to QBMapper - */ -abstract class Mapper { - protected $tableName; - protected $entityClass; - protected $db; - - /** - * @param IDBConnection $db Instance of the Db abstraction layer - * @param string $tableName the name of the table. set this to allow entity - * @param string $entityClass the name of the entity that the sql should be - * mapped to queries without using sql - * @since 7.0.0 - * @deprecated 14.0.0 Move over to QBMapper - */ - public function __construct(IDBConnection $db, $tableName, $entityClass = null) { - $this->db = $db; - $this->tableName = '*PREFIX*' . $tableName; - - // if not given set the entity name to the class without the mapper part - // cache it here for later use since reflection is slow - if ($entityClass === null) { - $this->entityClass = str_replace('Mapper', '', get_class($this)); - } else { - $this->entityClass = $entityClass; - } - } - - - /** - * @return string the table name - * @since 7.0.0 - * @deprecated 14.0.0 Move over to QBMapper - */ - public function getTableName() { - return $this->tableName; - } - - - /** - * Deletes an entity from the table - * @param Entity $entity the entity that should be deleted - * @return Entity the deleted entity - * @since 7.0.0 - return value added in 8.1.0 - * @deprecated 14.0.0 Move over to QBMapper - */ - public function delete(Entity $entity) { - $sql = 'DELETE FROM `' . $this->tableName . '` WHERE `id` = ?'; - $stmt = $this->execute($sql, [$entity->getId()]); - $stmt->closeCursor(); - return $entity; - } - - - /** - * Creates a new entry in the db from an entity - * @param Entity $entity the entity that should be created - * @return Entity the saved entity with the set id - * @since 7.0.0 - * @deprecated 14.0.0 Move over to QBMapper - */ - public function insert(Entity $entity) { - // get updated fields to save, fields have to be set using a setter to - // be saved - $properties = $entity->getUpdatedFields(); - $values = ''; - $columns = ''; - $params = []; - - // build the fields - $i = 0; - foreach ($properties as $property => $updated) { - $column = $entity->propertyToColumn($property); - $getter = 'get' . ucfirst($property); - - $columns .= '`' . $column . '`'; - $values .= '?'; - - // only append colon if there are more entries - if ($i < count($properties) - 1) { - $columns .= ','; - $values .= ','; - } - - $params[] = $entity->$getter(); - $i++; - } - - $sql = 'INSERT INTO `' . $this->tableName . '`(' . - $columns . ') VALUES(' . $values . ')'; - - $stmt = $this->execute($sql, $params); - - $entity->setId((int) $this->db->lastInsertId($this->tableName)); - - $stmt->closeCursor(); - - return $entity; - } - - - - /** - * Updates an entry in the db from an entity - * @throws \InvalidArgumentException if entity has no id - * @param Entity $entity the entity that should be created - * @return Entity the saved entity with the set id - * @since 7.0.0 - return value was added in 8.0.0 - * @deprecated 14.0.0 Move over to QBMapper - */ - public function update(Entity $entity) { - // if entity wasn't changed it makes no sense to run a db query - $properties = $entity->getUpdatedFields(); - if (count($properties) === 0) { - return $entity; - } - - // entity needs an id - $id = $entity->getId(); - if ($id === null) { - throw new \InvalidArgumentException( - 'Entity which should be updated has no id'); - } - - // get updated fields to save, fields have to be set using a setter to - // be saved - // do not update the id field - unset($properties['id']); - - $columns = ''; - $params = []; - - // build the fields - $i = 0; - foreach ($properties as $property => $updated) { - $column = $entity->propertyToColumn($property); - $getter = 'get' . ucfirst($property); - - $columns .= '`' . $column . '` = ?'; - - // only append colon if there are more entries - if ($i < count($properties) - 1) { - $columns .= ','; - } - - $params[] = $entity->$getter(); - $i++; - } - - $sql = 'UPDATE `' . $this->tableName . '` SET ' . - $columns . ' WHERE `id` = ?'; - $params[] = $id; - - $stmt = $this->execute($sql, $params); - $stmt->closeCursor(); - - return $entity; - } - - /** - * Checks if an array is associative - * @param array $array - * @return bool true if associative - * @since 8.1.0 - * @deprecated 14.0.0 Move over to QBMapper - */ - private function isAssocArray(array $array) { - return array_values($array) !== $array; - } - - /** - * Returns the correct PDO constant based on the value type - * @param $value - * @return int PDO constant - * @since 8.1.0 - * @deprecated 14.0.0 Move over to QBMapper - */ - private function getPDOType($value) { - switch (gettype($value)) { - case 'integer': - return \PDO::PARAM_INT; - case 'boolean': - return \PDO::PARAM_BOOL; - default: - return \PDO::PARAM_STR; - } - } - - - /** - * Runs an sql query - * @param string $sql the prepare string - * @param array $params the params which should replace the ? in the sql query - * @param int $limit the maximum number of rows - * @param int $offset from which row we want to start - * @return \PDOStatement the database query result - * @since 7.0.0 - * @deprecated 14.0.0 Move over to QBMapper - */ - protected function execute($sql, array $params = [], $limit = null, $offset = null) { - $query = $this->db->prepare($sql, $limit, $offset); - - if ($this->isAssocArray($params)) { - foreach ($params as $key => $param) { - $pdoConstant = $this->getPDOType($param); - $query->bindValue($key, $param, $pdoConstant); - } - } else { - $index = 1; // bindParam is 1 indexed - foreach ($params as $param) { - $pdoConstant = $this->getPDOType($param); - $query->bindValue($index, $param, $pdoConstant); - $index++; - } - } - - $query->execute(); - - return $query; - } - - /** - * Returns an db result and throws exceptions when there are more or less - * results - * @see findEntity - * @param string $sql the sql query - * @param array $params the parameters of the sql query - * @param int $limit the maximum number of rows - * @param int $offset from which row we want to start - * @throws DoesNotExistException if the item does not exist - * @throws MultipleObjectsReturnedException if more than one item exist - * @return array the result as row - * @since 7.0.0 - * @deprecated 14.0.0 Move over to QBMapper - */ - protected function findOneQuery($sql, array $params = [], $limit = null, $offset = null) { - $stmt = $this->execute($sql, $params, $limit, $offset); - $row = $stmt->fetch(); - - if ($row === false || $row === null) { - $stmt->closeCursor(); - $msg = $this->buildDebugMessage( - 'Did expect one result but found none when executing', $sql, $params, $limit, $offset - ); - throw new DoesNotExistException($msg); - } - $row2 = $stmt->fetch(); - $stmt->closeCursor(); - //MDB2 returns null, PDO and doctrine false when no row is available - if (! ($row2 === false || $row2 === null)) { - $msg = $this->buildDebugMessage( - 'Did not expect more than one result when executing', $sql, $params, $limit, $offset - ); - throw new MultipleObjectsReturnedException($msg); - } else { - return $row; - } - } - - /** - * Builds an error message by prepending the $msg to an error message which - * has the parameters - * @see findEntity - * @param string $sql the sql query - * @param array $params the parameters of the sql query - * @param int $limit the maximum number of rows - * @param int $offset from which row we want to start - * @return string formatted error message string - * @since 9.1.0 - * @deprecated 14.0.0 Move over to QBMapper - */ - private function buildDebugMessage($msg, $sql, array $params = [], $limit = null, $offset = null) { - return $msg . - ': query "' . $sql . '"; ' . - 'parameters ' . print_r($params, true) . '; ' . - 'limit "' . $limit . '"; '. - 'offset "' . $offset . '"'; - } - - - /** - * Creates an entity from a row. Automatically determines the entity class - * from the current mapper name (MyEntityMapper -> MyEntity) - * @param array $row the row which should be converted to an entity - * @return Entity the entity - * @since 7.0.0 - * @deprecated 14.0.0 Move over to QBMapper - */ - protected function mapRowToEntity($row) { - return call_user_func($this->entityClass .'::fromRow', $row); - } - - - /** - * Runs a sql query and returns an array of entities - * @param string $sql the prepare string - * @param array $params the params which should replace the ? in the sql query - * @param int $limit the maximum number of rows - * @param int $offset from which row we want to start - * @return array all fetched entities - * @since 7.0.0 - * @deprecated 14.0.0 Move over to QBMapper - */ - protected function findEntities($sql, array $params = [], $limit = null, $offset = null) { - $stmt = $this->execute($sql, $params, $limit, $offset); - - $entities = []; - - while ($row = $stmt->fetch()) { - $entities[] = $this->mapRowToEntity($row); - } - - $stmt->closeCursor(); - - return $entities; - } - - - /** - * Returns an db result and throws exceptions when there are more or less - * results - * @param string $sql the sql query - * @param array $params the parameters of the sql query - * @param int $limit the maximum number of rows - * @param int $offset from which row we want to start - * @throws DoesNotExistException if the item does not exist - * @throws MultipleObjectsReturnedException if more than one item exist - * @return Entity the entity - * @since 7.0.0 - * @deprecated 14.0.0 Move over to QBMapper - */ - protected function findEntity($sql, array $params = [], $limit = null, $offset = null) { - return $this->mapRowToEntity($this->findOneQuery($sql, $params, $limit, $offset)); - } -} diff --git a/resources/config/ca-bundle.crt b/resources/config/ca-bundle.crt index 6b70ee07b77..0c69f9fc75e 100644 --- a/resources/config/ca-bundle.crt +++ b/resources/config/ca-bundle.crt @@ -1,7 +1,7 @@ ## ## Bundle of CA Root Certificates ## -## Certificate data from Mozilla as of: Tue Jul 19 03:12:06 2022 GMT +## Certificate data from Mozilla as of: Tue Oct 11 03:12:05 2022 GMT ## ## This is a bundle of X.509 certificates of public Certificate Authorities ## (CA). These were automatically extracted from Mozilla's root certificates @@ -14,7 +14,7 @@ ## Just configure this file as the SSLCACertificateFile. ## ## Conversion done with mk-ca-bundle.pl version 1.29. -## SHA256: 9bf3799611fb58197f61d45e71ce3dc19f30e7dd73731915872ce5108a7bb066 +## SHA256: 3ff8bd209b5f2e739b9f2b96eacb694a774114685b02978257824f37ff528f71 ## @@ -3458,3 +3458,49 @@ zPUwHQYDVR0OBBYEFP+CMXI++cRmbK04ntGwUYilkMz1MA4GA1UdDwEB/wQEAwIBBjAKBggqhkjO PQQDAwNpADBmAjEA5gVYaWHlLcoNy/EZCL3W/VGSGn5jVASQkZo1kTmZ+gepZpO6yGjUij/67W4W Aie3AjEA3VoXK3YdZUKWpqxdinlW2Iob35reX8dQj7FbcQwm32pAAOwzkSFxvmjkI6TZraE3 -----END CERTIFICATE----- + +Security Communication RootCA3 +============================== +-----BEGIN CERTIFICATE----- +MIIFfzCCA2egAwIBAgIJAOF8N0D9G/5nMA0GCSqGSIb3DQEBDAUAMF0xCzAJBgNVBAYTAkpQMSUw +IwYDVQQKExxTRUNPTSBUcnVzdCBTeXN0ZW1zIENPLixMVEQuMScwJQYDVQQDEx5TZWN1cml0eSBD +b21tdW5pY2F0aW9uIFJvb3RDQTMwHhcNMTYwNjE2MDYxNzE2WhcNMzgwMTE4MDYxNzE2WjBdMQsw +CQYDVQQGEwJKUDElMCMGA1UEChMcU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UE +AxMeU2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBSb290Q0EzMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A +MIICCgKCAgEA48lySfcw3gl8qUCBWNO0Ot26YQ+TUG5pPDXC7ltzkBtnTCHsXzW7OT4rCmDvu20r +hvtxosis5FaU+cmvsXLUIKx00rgVrVH+hXShuRD+BYD5UpOzQD11EKzAlrenfna84xtSGc4RHwsE +NPXY9Wk8d/Nk9A2qhd7gCVAEF5aEt8iKvE1y/By7z/MGTfmfZPd+pmaGNXHIEYBMwXFAWB6+oHP2 +/D5Q4eAvJj1+XCO1eXDe+uDRpdYMQXF79+qMHIjH7Iv10S9VlkZ8WjtYO/u62C21Jdp6Ts9EriGm +npjKIG58u4iFW/vAEGK78vknR+/RiTlDxN/e4UG/VHMgly1s2vPUB6PmudhvrvyMGS7TZ2crldtY +XLVqAvO4g160a75BflcJdURQVc1aEWEhCmHCqYj9E7wtiS/NYeCVvsq1e+F7NGcLH7YMx3weGVPK +p7FKFSBWFHA9K4IsD50VHUeAR/94mQ4xr28+j+2GaR57GIgUssL8gjMunEst+3A7caoreyYn8xrC +3PsXuKHqy6C0rtOUfnrQq8PsOC0RLoi/1D+tEjtCrI8Cbn3M0V9hvqG8OmpI6iZVIhZdXw3/JzOf +GAN0iltSIEdrRU0id4xVJ/CvHozJgyJUt5rQT9nO/NkuHJYosQLTA70lUhw0Zk8jq/R3gpYd0Vcw +CBEF/VfR2ccCAwEAAaNCMEAwHQYDVR0OBBYEFGQUfPxYchamCik0FW8qy7z8r6irMA4GA1UdDwEB +/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBDAUAA4ICAQDcAiMI4u8hOscNtybS +YpOnpSNyByCCYN8Y11StaSWSntkUz5m5UoHPrmyKO1o5yGwBQ8IibQLwYs1OY0PAFNr0Y/Dq9HHu +Tofjcan0yVflLl8cebsjqodEV+m9NU1Bu0soo5iyG9kLFwfl9+qd9XbXv8S2gVj/yP9kaWJ5rW4O +H3/uHWnlt3Jxs/6lATWUVCvAUm2PVcTJ0rjLyjQIUYWg9by0F1jqClx6vWPGOi//lkkZhOpn2ASx +YfQAW0q3nHE3GYV5v4GwxxMOdnE+OoAGrgYWp421wsTL/0ClXI2lyTrtcoHKXJg80jQDdwj98ClZ +XSEIx2C/pHF7uNkegr4Jr2VvKKu/S7XuPghHJ6APbw+LP6yVGPO5DtxnVW5inkYO0QR4ynKudtml ++LLfiAlhi+8kTtFZP1rUPcmTPCtk9YENFpb3ksP+MW/oKjJ0DvRMmEoYDjBU1cXrvMUVnuiZIesn +KwkK2/HmcBhWuwzkvvnoEKQTkrgc4NtnHVMDpCKn3F2SEDzq//wbEBrD2NCcnWXL0CsnMQMeNuE9 +dnUM/0Umud1RvCPHX9jYhxBAEg09ODfnRDwYwFMJZI//1ZqmfHAuc1Uh6N//g7kdPjIe1qZ9LPFm +6Vwdp6POXiUyK+OVrCoHzrQoeIY8LaadTdJ0MN1kURXbg4NR16/9M51NZg== +-----END CERTIFICATE----- + +Security Communication ECC RootCA1 +================================== +-----BEGIN CERTIFICATE----- +MIICODCCAb6gAwIBAgIJANZdm7N4gS7rMAoGCCqGSM49BAMDMGExCzAJBgNVBAYTAkpQMSUwIwYD +VQQKExxTRUNPTSBUcnVzdCBTeXN0ZW1zIENPLixMVEQuMSswKQYDVQQDEyJTZWN1cml0eSBDb21t +dW5pY2F0aW9uIEVDQyBSb290Q0ExMB4XDTE2MDYxNjA1MTUyOFoXDTM4MDExODA1MTUyOFowYTEL +MAkGA1UEBhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xKzApBgNV +BAMTIlNlY3VyaXR5IENvbW11bmljYXRpb24gRUNDIFJvb3RDQTEwdjAQBgcqhkjOPQIBBgUrgQQA +IgNiAASkpW9gAwPDvTH00xecK4R1rOX9PVdu12O/5gSJko6BnOPpR27KkBLIE+CnnfdldB9sELLo +5OnvbYUymUSxXv3MdhDYW72ixvnWQuRXdtyQwjWpS4g8EkdtXP9JTxpKULGjQjBAMB0GA1UdDgQW +BBSGHOf+LaVKiwj+KBH6vqNm+GBZLzAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAK +BggqhkjOPQQDAwNoADBlAjAVXUI9/Lbu9zuxNuie9sRGKEkz0FhDKmMpzE2xtHqiuQ04pV1IKv3L +snNdo4gIxwwCMQDAqy0Obe0YottT6SXbVQjgUMzfRGEWgqtJsLKB7HOHeLRMsmIbEvoWTSVLY70e +N9k= +-----END CERTIFICATE----- diff --git a/tests/lib/AppFramework/Db/MapperTest.php b/tests/lib/AppFramework/Db/MapperTest.php deleted file mode 100644 index e5a4b63b7a3..00000000000 --- a/tests/lib/AppFramework/Db/MapperTest.php +++ /dev/null @@ -1,300 +0,0 @@ -<?php - -/** - * ownCloud - App Framework - * - * @author Bernhard Posselt - * @copyright 2012 Bernhard Posselt dev@bernhard-posselt.com - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE - * License as published by the Free Software Foundation; either - * version 3 of the License, or any later version. - * - * This library 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 library. If not, see <http://www.gnu.org/licenses/>. - * - */ - -namespace Test\AppFramework\Db; - -use OCP\AppFramework\Db\DoesNotExistException; -use OCP\AppFramework\Db\Entity; -use OCP\AppFramework\Db\Mapper; -use OCP\AppFramework\Db\MultipleObjectsReturnedException; -use OCP\IDBConnection; - -/** - * @method integer getId() - * @method void setId(integer $id) - * @method string getEmail() - * @method void setEmail(string $email) - * @method string getPreName() - * @method void setPreName(string $preName) - */ -class Example extends Entity { - protected $preName; - protected $email; -}; - - -class ExampleMapper extends Mapper { - public function __construct(IDBConnection $db) { - parent::__construct($db, 'table'); - } - public function find($table, $id) { - return $this->findOneQuery($table, $id); - } - public function findOneEntity($table, $id) { - return $this->findEntity($table, $id); - } - public function findAllEntities($table) { - return $this->findEntities($table); - } - public function mapRow($row) { - return $this->mapRowToEntity($row); - } - public function execSql($sql, $params) { - return $this->execute($sql, $params); - } -} - - -class MapperTest extends MapperTestUtility { - - /** - * @var Mapper - */ - private $mapper; - - protected function setUp(): void { - parent::setUp(); - $this->mapper = new ExampleMapper($this->db); - } - - - public function testMapperShouldSetTableName() { - $this->assertEquals('*PREFIX*table', $this->mapper->getTableName()); - } - - - public function testFindQuery() { - $sql = 'hi'; - $params = ['jo']; - $rows = [ - ['hi'] - ]; - $this->setMapperResult($sql, $params, $rows); - $this->mapper->find($sql, $params); - } - - public function testFindEntity() { - $sql = 'hi'; - $params = ['jo']; - $rows = [ - ['pre_name' => 'hi'] - ]; - $this->setMapperResult($sql, $params, $rows, null, null, true); - $this->mapper->findOneEntity($sql, $params); - } - - public function testFindNotFound() { - $sql = 'hi'; - $params = ['jo']; - $rows = []; - $this->setMapperResult($sql, $params, $rows); - $this->expectException(DoesNotExistException::class); - $this->mapper->find($sql, $params); - } - - public function testFindEntityNotFound() { - $sql = 'hi'; - $params = ['jo']; - $rows = []; - $this->setMapperResult($sql, $params, $rows, null, null, true); - $this->expectException(DoesNotExistException::class); - $this->mapper->findOneEntity($sql, $params); - } - - public function testFindMultiple() { - $sql = 'hi'; - $params = ['jo']; - $rows = [ - ['jo'], ['ho'] - ]; - $this->setMapperResult($sql, $params, $rows, null, null, true); - $this->expectException(MultipleObjectsReturnedException::class); - $this->mapper->find($sql, $params); - } - - public function testFindEntityMultiple() { - $sql = 'hi'; - $params = ['jo']; - $rows = [ - ['jo'], ['ho'] - ]; - $this->setMapperResult($sql, $params, $rows, null, null, true); - $this->expectException(MultipleObjectsReturnedException::class); - $this->mapper->findOneEntity($sql, $params); - } - - - public function testDelete() { - $sql = 'DELETE FROM `*PREFIX*table` WHERE `id` = ?'; - $params = [2]; - - $this->setMapperResult($sql, $params, [], null, null, true); - $entity = new Example(); - $entity->setId($params[0]); - - $this->mapper->delete($entity); - } - - - public function testCreate() { - $this->db->expects($this->once()) - ->method('lastInsertId') - ->with($this->equalTo('*PREFIX*table')) - ->willReturn(3); - $this->mapper = new ExampleMapper($this->db); - - $sql = 'INSERT INTO `*PREFIX*table`(`pre_name`,`email`) ' . - 'VALUES(?,?)'; - $params = ['john', 'my@email']; - $entity = new Example(); - $entity->setPreName($params[0]); - $entity->setEmail($params[1]); - - $this->setMapperResult($sql, $params, [], null, null, true); - - $this->mapper->insert($entity); - } - - - public function testCreateShouldReturnItemWithCorrectInsertId() { - $this->db->expects($this->once()) - ->method('lastInsertId') - ->with($this->equalTo('*PREFIX*table')) - ->willReturn(3); - $this->mapper = new ExampleMapper($this->db); - - $sql = 'INSERT INTO `*PREFIX*table`(`pre_name`,`email`) ' . - 'VALUES(?,?)'; - $params = ['john', 'my@email']; - $entity = new Example(); - $entity->setPreName($params[0]); - $entity->setEmail($params[1]); - - $this->setMapperResult($sql, $params); - - $result = $this->mapper->insert($entity); - - $this->assertEquals(3, $result->getId()); - } - - - public function testAssocParameters() { - $sql = 'test'; - $params = [':test' => 1, ':a' => 2]; - - $this->setMapperResult($sql, $params); - $this->mapper->execSql($sql, $params); - } - - - public function testUpdate() { - $sql = 'UPDATE `*PREFIX*table` ' . - 'SET ' . - '`pre_name` = ?,'. - '`email` = ? ' . - 'WHERE `id` = ?'; - - $params = ['john', 'my@email', 1]; - $entity = new Example(); - $entity->setPreName($params[0]); - $entity->setEmail($params[1]); - $entity->setId($params[2]); - - $this->setMapperResult($sql, $params, [], null, null, true); - - $this->mapper->update($entity); - } - - - public function testUpdateNoId() { - $params = ['john', 'my@email']; - $entity = new Example(); - $entity->setPreName($params[0]); - $entity->setEmail($params[1]); - - $this->expectException(\InvalidArgumentException::class); - - $this->mapper->update($entity); - } - - - public function testUpdateNothingChangedNoQuery() { - $params = ['john', 'my@email']; - $entity = new Example(); - $entity->setId(3); - $entity->setEmail($params[1]); - $entity->resetUpdatedFields(); - - $this->db->expects($this->never()) - ->method('prepare'); - - $this->mapper->update($entity); - } - - - public function testMapRowToEntity() { - $entity1 = $this->mapper->mapRow(['pre_name' => 'test1', 'email' => 'test2']); - $entity2 = new Example(); - $entity2->setPreName('test1'); - $entity2->setEmail('test2'); - $entity2->resetUpdatedFields(); - $this->assertEquals($entity2, $entity1); - } - - public function testFindEntities() { - $sql = 'hi'; - $rows = [ - ['pre_name' => 'hi'] - ]; - $entity = new Example(); - $entity->setPreName('hi'); - $entity->resetUpdatedFields(); - $this->setMapperResult($sql, [], $rows, null, null, true); - $result = $this->mapper->findAllEntities($sql); - $this->assertEquals([$entity], $result); - } - - public function testFindEntitiesNotFound() { - $sql = 'hi'; - $rows = []; - $this->setMapperResult($sql, [], $rows); - $result = $this->mapper->findAllEntities($sql); - $this->assertEquals([], $result); - } - - public function testFindEntitiesMultiple() { - $sql = 'hi'; - $rows = [ - ['pre_name' => 'jo'], ['email' => 'ho'] - ]; - $entity1 = new Example(); - $entity1->setPreName('jo'); - $entity1->resetUpdatedFields(); - $entity2 = new Example(); - $entity2->setEmail('ho'); - $entity2->resetUpdatedFields(); - $this->setMapperResult($sql, [], $rows); - $result = $this->mapper->findAllEntities($sql); - $this->assertEquals([$entity1, $entity2], $result); - } -} diff --git a/tests/lib/AppFramework/Db/MapperTestUtility.php b/tests/lib/AppFramework/Db/MapperTestUtility.php deleted file mode 100644 index e17b875e4c4..00000000000 --- a/tests/lib/AppFramework/Db/MapperTestUtility.php +++ /dev/null @@ -1,206 +0,0 @@ -<?php - -/** - * ownCloud - App Framework - * - * @author Bernhard Posselt - * @copyright 2012 Bernhard Posselt dev@bernhard-posselt.com - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE - * License as published by the Free Software Foundation; either - * version 3 of the License, or any later version. - * - * This library 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 library. If not, see <http://www.gnu.org/licenses/>. - * - */ - -namespace Test\AppFramework\Db; - -use OCP\DB\IPreparedStatement; -use OCP\DB\IResult; - -/** - * Simple utility class for testing mappers - */ -abstract class MapperTestUtility extends \Test\TestCase { - protected $db; - private $statement; - private $queryAt; - private $prepareAt; - private $fetchAt; - private $iterators; - - - /** - * Run this function before the actual test to either set or initialize the - * db. After this the db can be accessed by using $this->db - */ - protected function setUp(): void { - parent::setUp(); - - $this->db = $this->getMockBuilder( - '\OCP\IDBConnection') - ->disableOriginalConstructor() - ->getMock(); - - $this->statement = $this->createMock(IPreparedStatement::class); - $this->queryAt = 0; - $this->prepareAt = 0; - $this->iterators = []; - $this->fetchAt = 0; - } - - /** - * Checks if an array is associative - * @param array $array - * @return bool true if associative - */ - private function isAssocArray(array $array) { - return array_values($array) !== $array; - } - - /** - * Returns the correct PDO constant based on the value type - * @param $value - * @return int PDO constant - */ - private function getPDOType($value) { - switch (gettype($value)) { - case 'integer': - return \PDO::PARAM_INT; - case 'boolean': - return \PDO::PARAM_BOOL; - default: - return \PDO::PARAM_STR; - } - } - - /** - * Create mocks and set expected results for database queries - * @param string $sql the sql query that you expect to receive - * @param array $arguments the expected arguments for the prepare query - * method - * @param array $returnRows the rows that should be returned for the result - * of the database query. If not provided, it wont be assumed that fetch - * will be called on the result - */ - protected function setMapperResult($sql, $arguments = [], $returnRows = [], - $limit = null, $offset = null, $expectClose = false) { - if ($limit === null && $offset === null) { - $this->db->expects($this->at($this->prepareAt)) - ->method('prepare') - ->with($this->equalTo($sql)) - ->will(($this->returnValue($this->statement))); - } elseif ($limit !== null && $offset === null) { - $this->db->expects($this->at($this->prepareAt)) - ->method('prepare') - ->with($this->equalTo($sql), $this->equalTo($limit)) - ->will(($this->returnValue($this->statement))); - } elseif ($limit === null && $offset !== null) { - $this->db->expects($this->at($this->prepareAt)) - ->method('prepare') - ->with($this->equalTo($sql), - $this->equalTo(null), - $this->equalTo($offset)) - ->will(($this->returnValue($this->statement))); - } else { - $this->db->expects($this->at($this->prepareAt)) - ->method('prepare') - ->with($this->equalTo($sql), - $this->equalTo($limit), - $this->equalTo($offset)) - ->will(($this->returnValue($this->statement))); - } - - $this->iterators[] = new ArgumentIterator($returnRows); - - $iterators = $this->iterators; - $fetchAt = $this->fetchAt; - - $this->statement->expects($this->any()) - ->method('fetch') - ->willReturnCallback( - function () use ($iterators, $fetchAt) { - $iterator = $iterators[$fetchAt]; - $result = $iterator->next(); - - if ($result === false) { - $fetchAt++; - } - - $this->queryAt++; - - return $result; - } - ); - - if ($this->isAssocArray($arguments)) { - foreach ($arguments as $key => $argument) { - $pdoConstant = $this->getPDOType($argument); - $this->statement->expects($this->at($this->queryAt)) - ->method('bindValue') - ->with($this->equalTo($key), - $this->equalTo($argument), - $this->equalTo($pdoConstant)); - $this->queryAt++; - } - } else { - $index = 1; - foreach ($arguments as $argument) { - $pdoConstant = $this->getPDOType($argument); - $this->statement->expects($this->at($this->queryAt)) - ->method('bindValue') - ->with($this->equalTo($index), - $this->equalTo($argument), - $this->equalTo($pdoConstant)); - $index++; - $this->queryAt++; - } - } - - $this->statement->expects($this->at($this->queryAt)) - ->method('execute') - ->willReturnCallback(function ($sql, $p = null, $o = null, $s = null) { - return $this->createMock(IResult::class); - }); - $this->queryAt++; - - - - if ($expectClose) { - $closing = $this->at($this->queryAt); - } else { - $closing = $this->any(); - } - $this->statement->expects($closing)->method('closeCursor'); - $this->queryAt++; - - $this->prepareAt++; - $this->fetchAt++; - } -} - - -class ArgumentIterator { - private $arguments; - - public function __construct($arguments) { - $this->arguments = $arguments; - } - - public function next() { - $result = array_shift($this->arguments); - if ($result === null) { - return false; - } else { - return $result; - } - } -} |