diff options
author | Peter Zhang <peter@innocraft.com> | 2022-07-08 14:24:54 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-07-08 14:24:54 +0300 |
commit | 5df7397b4276a8f23e5537b7ba84394f4238dbed (patch) | |
tree | f38e8706090a4fb6d687415a89b29377d9bfda11 | |
parent | 49adc21534740eeb62a700562cdde095c7fa9589 (diff) |
update invite user (#19366)4.11.0-rc2
* update invite
update invite
* update tests and VUE error
update tests and VUE error
* built vue files
* update ui
update ui
* update vue
update vue
* update vue
update vue
* built vue files
* Update UsersManager_spec.js
update tests
* update clean
update clean
* Update UsersManager_spec.js
update success
* Update UsersManager_spec.js
remove popup error
* update tests order
update tests order
* Update UsersManager_next_click.png
updateui
* revert screenshot
revert screenshot
* delete if user if declined
delete use if declined
add privacy
split templated into 3 parts
* remove decline
remove decline
* add invited by column
add invited by column
* Revert "add invited by column"
This reverts commit e2358cb493684dc26fdf9a436d00a29981365861.
* Update UserRepository.php
add view user display
* add email tests and update admin email
add email tests and update admin email
* update php cs
update php cs
* add expire task and default setting
add expire task and default setting
* add api tests
add api tests
* add filter
add filter
* update ui tests
update ui tests
* built vue files
* update tests
update tests
* update signup and tests
update signup and tests
* update tests
update tests
* update screenshots
update screenshots
* update screenshots
update screenshots
* update ui
update ui
* update typo
update typo
* built vue files
* Update core/Updates/4.12.0-b1.php
Co-authored-by: Ben Burgess <88810029+bx80@users.noreply.github.com>
* Update plugins/UsersManager/API.php
Co-authored-by: Ben Burgess <88810029+bx80@users.noreply.github.com>
* Update plugins/UsersManager/UsersManager.php
Co-authored-by: Ben Burgess <88810029+bx80@users.noreply.github.com>
* Update plugins/UsersManager/lang/en.json
Co-authored-by: Ben Burgess <88810029+bx80@users.noreply.github.com>
* Update config/global.ini.php
Co-authored-by: Ben Burgess <88810029+bx80@users.noreply.github.com>
* update email date
update email date
* update typo
update typo
* update UI
update UI
* Updated UI screenshot
* Update plugins/Login/lang/en.json
Co-authored-by: Stefan Giehl <stefan@matomo.org>
* Update plugins/Login/templates/invitationDecline.twig
Co-authored-by: Stefan Giehl <stefan@matomo.org>
* update some feedbacks
update some feedbacks
* built vue files
* update feedbacks
update feedbacks
* update filter
update filter
* pending your can't reset password
pending your can't reset password
* fix php cs
fix php cs
* update column
update column
* built vue files
* set up terms in tests
set up terms in tests
* Update PendingUsers.php
setup website
* update tests and broken template
update tests
* update password
update password
* update screenshots
update screenshots
* add delete to admin
add delete to admin
* update invite success notification
update invite success notification
* add tests
add tests
* built vue files
* update tests
update tests
* update UI and checkbox
update UI and checkbox
* Update Invite_spec.js
show error screen
* update tests
update tests
* update lang
update lang
* Update OmniFixture-dump.sql
revert OmniFixture
* update wording
update wording
* update version
update version
* fix change column
fix change column
* Update UsersManagerTest.php
update tests
* Update Model.php
update tests
* Update Model.php
update tests
* remove fixes
remove fixes
* Revert "remove fixes"
This reverts commit f8fe33706513a32bf3386bc6b52800d68ec58562.
* update tests
update tests
* revert password reset
revert password reset
* update tests
update tests
* update resend
update resend
* update tests
update tests
* Update PasswordResetter.php
update tests
* correct pending user from last time
correct pending user from last time
* apply some fixes /improvements
* Apply suggestions from code review
Co-authored-by: Ben Burgess <88810029+bx80@users.noreply.github.com>
* Allow composer plugins for dev dependency codesniffer to fix travis builds. (#19468)
Co-authored-by: peterhashair <peterhashair@users.noreply.github.com>
Co-authored-by: Ben Burgess <88810029+bx80@users.noreply.github.com>
Co-authored-by: Ben <ben.burgess@innocraft.com>
Co-authored-by: Stefan Giehl <stefan@matomo.org>
Co-authored-by: dizzy <diosmosis@users.noreply.github.com>
99 files changed, 2887 insertions, 1714 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md index c7a2a0c131..80edb70006 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,21 @@ This is the Developer Changelog for Matomo platform developers. All changes in o The Product Changelog at **[matomo.org/changelog](https://matomo.org/changelog)** lets you see more details about any Matomo release, such as the list of new guides and FAQs, security fixes, and links to all closed issues. +## Matomo 4.11.0 + +### Breaking Changes + +* The user management UI no longer allows direct creation of a new user (with a password). Instead an invitation can be sent via email. Directly creating a new user is still possible using the API. + +#### New PHP events + +* Added new event `UsersManager.inviteUser.end`, which is triggered after a new user has been invited +* Added new event `UsersManager.inviteUser.resendInvite`, which is triggered after the invitation to a user has been resent +* Added new event `UsersManager.inviteUser.accepted`, which is triggered after an invitation has been accepted +* Added new event `UsersManager.inviteUser.declined`, which is triggered after an invitation has been declined + +* The existing event `UsersManager.addUser.end` will only be triggered when a user is added using the API. + ## Matomo 4.10.0 ### Breaking Changes diff --git a/composer.json b/composer.json index 0ffc8bcde4..1f808ab48f 100644 --- a/composer.json +++ b/composer.json @@ -28,7 +28,10 @@ "php": "7.2.9" }, "prepend-autoloader": false, - "sort-packages": true + "sort-packages": true, + "allow-plugins": { + "dealerdirect/phpcodesniffer-composer-installer": true + } }, "require": { "php": ">=7.2.5", diff --git a/config/global.ini.php b/config/global.ini.php index ffe327416e..b4c9954ffb 100644 --- a/config/global.ini.php +++ b/config/global.ini.php @@ -277,6 +277,9 @@ browser_archiving_disabled_enforce = 0 ; Add custom currencies to Sites Manager. currencies[BTC] = Bitcoin +; default expiry time in days for invite user tokens +default_invite_user_token_expiry_days = 7 + ; By default, users can create Segments which are to be processed in Real-time. ; Setting this to 0 will force all newly created Custom Segments to be "Pre-processed (faster, requires archive.php cron)" ; This can be useful if you want to prevent users from adding much load on the server. diff --git a/core/Db/Schema/Mysql.php b/core/Db/Schema/Mysql.php index 00fb8c31e9..75d5787aaa 100644 --- a/core/Db/Schema/Mysql.php +++ b/core/Db/Schema/Mysql.php @@ -53,7 +53,10 @@ class Mysql implements SchemaInterface date_registered TIMESTAMP NULL, ts_password_modified TIMESTAMP NULL, idchange_last_viewed TIMESTAMP NULL, - invite_status enum('accept','pending','decline','expired') DEFAULT 'accept', + invited_by VARCHAR(100) NULL, + invite_token VARCHAR(191) NULL, + invite_expired_at TIMESTAMP NULL, + invite_accept_at TIMESTAMP NULL, PRIMARY KEY(login) ) ENGINE=$engine DEFAULT CHARSET=$charset ", @@ -590,8 +593,8 @@ class Mysql implements SchemaInterface $db = $this->getDb(); $db->query("INSERT IGNORE INTO " . Common::prefixTable("user") . " (`login`, `password`, `email`, `twofactor_secret`, `superuser_access`, `date_registered`, `ts_password_modified`, - `idchange_last_viewed`, `invite_status`) - VALUES ( 'anonymous', '', 'anonymous@example.org', '', 0, '$now', '$now' , NULL, 'accept');"); + `idchange_last_viewed`) + VALUES ( 'anonymous', '', 'anonymous@example.org', '', 0, '$now', '$now' , NULL);"); $model = new Model(); $model->addTokenAuth('anonymous', 'anonymous', 'anonymous default token', $now); diff --git a/core/Updates/4.11.0-rc2.php b/core/Updates/4.11.0-rc2.php new file mode 100644 index 0000000000..745abe583a --- /dev/null +++ b/core/Updates/4.11.0-rc2.php @@ -0,0 +1,104 @@ +<?php + +/** + * Matomo - free/libre analytics platform + * + * @link https://matomo.org + * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later + * + */ + +namespace Piwik\Updates; + +use Piwik\Common; +use Piwik\Container\StaticContainer; +use Piwik\Db; +use Piwik\Piwik; +use Piwik\Plugins\UsersManager\Emails\UserInviteEmail; +use Piwik\Plugins\UsersManager\Model; +use Piwik\Site; +use Piwik\Updater; +use Piwik\Updater\Migration; +use Piwik\Updater\Migration\Factory as MigrationFactory; +use Piwik\Updates as PiwikUpdates; + +/** + * Update for version 4.11.0-rc2 + */ +class Updates_4_11_0_rc2 extends PiwikUpdates +{ + /** + * @var MigrationFactory + */ + private $migration; + + private $pendingUsers; + + private $userTable; + + public function __construct(MigrationFactory $factory) + { + $this->migration = $factory; + $this->userTable = Common::prefixTable('user'); + } + + /** + * @param Updater $updater + * + * @return Migration[] + */ + public function getMigrations(Updater $updater) + { + try { + $this->pendingUsers = Db::fetchAll( + "SELECT * FROM $this->userTable WHERE invite_status = ? ", + ['pending'] + ); + } catch (\Exception $e) { + // ignore any errors. The column might not exist when updating from an older version, + // so there wouldn't be anything to update anyway + } + return [ + $this->migration->db->dropColumn('user', 'invite_status'), + $this->migration->db->addColumns('user', ['invite_token' => 'VARCHAR(191) DEFAULT null']), + $this->migration->db->addColumns('user', ['invited_by' => 'VARCHAR(100) DEFAULT null']), + $this->migration->db->addColumns('user', ['invite_expired_at' => 'TIMESTAMP null DEFAULT null']), + $this->migration->db->addColumns('user', ['invite_accept_at' => 'TIMESTAMP null DEFAULT null']), + ]; + } + + public function doUpdate(Updater $updater) + { + $updater->executeMigrations(__FILE__, $this->getMigrations($updater)); + + $model = new Model(); + if (!empty($this->pendingUsers)) { + foreach ($this->pendingUsers as $user) { + $model->deleteAllTokensForUser($user['login']); + + $site = $model->getSitesAccessFromUser($user['login']); + if (isset($site[0])) { + $site = new Site($site[0]['site']); + $siteName = $site->getName(); + } else { + $siteName = "Default Site"; + } + //generate Token + $generatedToken = $model->generateRandomTokenAuth(); + + //attach token to user + $model->attachInviteToken($user['login'], $generatedToken, 7); + + // send email + $email = StaticContainer::getContainer()->make(UserInviteEmail::class, [ + 'currentUser' => Piwik::getCurrentUserLogin(), + 'invitedUser' => $user, + 'siteName' => $siteName, + 'token' => $generatedToken, + 'expiryInDays' => 7 + ]); + $email->safeSend(); + } + } + } +} diff --git a/core/Validators/Login.php b/core/Validators/Login.php deleted file mode 100644 index f377f79bec..0000000000 --- a/core/Validators/Login.php +++ /dev/null @@ -1,59 +0,0 @@ -<?php -/** - * Matomo - free/libre analytics platform - * - * @link https://matomo.org - * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later - * - */ - -namespace Piwik\Validators; - -use Piwik\Piwik; -use Piwik\SettingsPiwik; -use Piwik\Plugins\UsersManager\API as APIUsersManager; - -class Login extends BaseValidator -{ - protected $login; - const loginMinimumLength = 2; - const loginMaximumLength = 100; - - - public function validate($value) - { - if (!SettingsPiwik::isUserCredentialsSanityCheckEnabled() - && !empty($value) - ) { - return; - } - - $l = strlen($value); - if (!($l >= self::loginMinimumLength - && $l <= self::loginMaximumLength - && (preg_match('/^[A-Za-zÄäÖöÜüß0-9_.@+-]*$/D', $value) > 0)) - ) { - throw new Exception(Piwik::translate('UsersManager_ExceptionInvalidLoginFormat', - array(self::loginMinimumLength, self::loginMaximumLength))); - } - - $this->login = $value; - return $this; - } - - public function isUnique() - { - if (empty($this->login)) { - throw new Exception(Piwik::translate('UsersManager_ExceptionInvalidLoginFormat', - array(self::loginMinimumLength, self::loginMaximumLength))); - } - - if (APIUsersManager::getInstance()->userExists($this->login)) { - throw new Exception(Piwik::translate('UsersManager_ExceptionLoginExists', $this->login)); - } - - if (APIUsersManager::getInstance()->userEmailExists($this->login)) { - throw new Exception(Piwik::translate('UsersManager_ExceptionLoginExistsAsEmail', $this->login)); - } - } -}
\ No newline at end of file diff --git a/core/Version.php b/core/Version.php index b4a96877dd..5afc9f951a 100644 --- a/core/Version.php +++ b/core/Version.php @@ -21,7 +21,7 @@ final class Version * The current Matomo version. * @var string */ - const VERSION = '4.11.0-rc1'; + const VERSION = '4.11.0-rc2'; const MAJOR_VERSION = 4; diff --git a/plugins/CoreAdminHome/lang/en.json b/plugins/CoreAdminHome/lang/en.json index 4103987beb..7164f4454a 100644 --- a/plugins/CoreAdminHome/lang/en.json +++ b/plugins/CoreAdminHome/lang/en.json @@ -167,7 +167,7 @@ "AcceptInvite": "Accept Invite", "DeclineInvite": "Decline Invite", "UserInviteContent": "You can accept this invitation by clicking the accept button below.", - "UserInviteNotes": "This invitation was intended for %1$s access. If you were not expecting this invitation, you can ignore this email. If %2$s is sending you too many emails, you can block them or report abuse. The invitation automatically expires in 7 days.", + "UserInviteNotes": "If you were not expecting this invitation, you can ignore this email. If %1$s is sending you too many emails, you can block them or report abuse. The invitation automatically expires in %2$s days.", "SecurityNotificationUserAcceptInviteBody": "User (login: %s) accepted the invitation.", "SecurityNotificationUserDeclinedInviteBody": "User (login: %s) declined the invitation." diff --git a/plugins/Login/Controller.php b/plugins/Login/Controller.php index 98b0dd23e9..08c657827a 100644 --- a/plugins/Login/Controller.php +++ b/plugins/Login/Controller.php @@ -1,4 +1,5 @@ <?php + /** * Matomo - free/libre analytics platform * @@ -6,6 +7,7 @@ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later * */ + namespace Piwik\Plugins\Login; use Exception; @@ -13,12 +15,14 @@ use Piwik\Auth\Password; use Piwik\Common; use Piwik\Config; use Piwik\Container\StaticContainer; +use Piwik\Date; use Piwik\Log; use Piwik\Nonce; use Piwik\Piwik; use Piwik\Plugins\CoreAdminHome\Emails\UserAcceptInvitationEmail; use Piwik\Plugins\CoreAdminHome\Emails\UserDeclinedInvitationEmail; use Piwik\Plugins\Login\Security\BruteForceDetection; +use Piwik\Plugins\PrivacyManager\SystemSettings; use Piwik\Plugins\UsersManager\Model as UsersModel; use Piwik\Plugins\UsersManager\UsersManager; use Piwik\QuickForm2; @@ -70,19 +74,19 @@ class Controller extends \Piwik\Plugin\ControllerAdmin * Constructor. * * @param PasswordResetter $passwordResetter - * @param AuthInterface $auth + * @param \Piwik\Auth $auth * @param SessionInitializer $sessionInitializer * @param PasswordVerifier $passwordVerify * @param BruteForceDetection $bruteForceDetection * @param SystemSettings $systemSettings */ public function __construct( - $passwordResetter = null, - $auth = null, - $sessionInitializer = null, - $passwordVerify = null, - $bruteForceDetection = null, - $systemSettings = null + $passwordResetter = null, + $auth = null, + $sessionInitializer = null, + $passwordVerify = null, + $bruteForceDetection = null, + $systemSettings = null ) { parent::__construct(); @@ -122,7 +126,7 @@ class Controller extends \Piwik\Plugin\ControllerAdmin * * @return string */ - function index() + public function index() { return $this->login(); } @@ -135,7 +139,7 @@ class Controller extends \Piwik\Plugin\ControllerAdmin * @return string * @internal param string $currentUrl Current URL */ - function login($messageNoAccess = null, $infoMessage = false) + public function login($messageNoAccess = null, $infoMessage = false) { $form = new FormLogin(); if ($form->validate()) { @@ -231,20 +235,20 @@ class Controller extends \Piwik\Plugin\ControllerAdmin } } - return $this->renderTemplate('@Login/confirmPassword', array( + return $this->renderTemplate('@Login/confirmPassword', [ 'nonce' => Nonce::getNonce($nonceKey), 'AccessErrorString' => $messageNoAccess, 'loginPlugin' => Piwik::getLoginPluginName(), - )); + ]); } /** * Form-less login - * @see how to use it on http://piwik.org/faq/how-to/#faq_30 + * @see how to use it on https://matomo.org/faq/how-to/faq_30 * @throws Exception * @return void */ - function logme() + public function logme() { if (Config::getInstance()->General['login_allow_logme'] == 0) { throw new Exception('This functionality has been disabled in config'); @@ -254,8 +258,9 @@ class Controller extends \Piwik\Plugin\ControllerAdmin $login = Common::getRequestVar('login', null, 'string'); if (Piwik::hasTheUserSuperUserAccess($login)) { - throw new Exception(Piwik::translate('Login_ExceptionInvalidSuperUserAccessAuthenticationMethod', - array("logme"))); + throw new Exception( + Piwik::translate('Login_ExceptionInvalidSuperUserAccessAuthenticationMethod', ["logme"]) + ); } $currentUrl = 'index.php'; @@ -274,10 +279,10 @@ class Controller extends \Piwik\Plugin\ControllerAdmin { Piwik::checkUserHasSuperUserAccess(); - return $this->renderTemplate('bruteForceLog', array( + return $this->renderTemplate('bruteForceLog', [ 'blockedIps' => $this->bruteForceDetection->getCurrentlyBlockedIps(), 'blacklistedIps' => $this->systemSettings->blacklistedBruteForceIps->getValue() - )); + ]); } /** @@ -289,14 +294,14 @@ class Controller extends \Piwik\Plugin\ControllerAdmin public function ajaxNoAccess($errorMessage) { return sprintf( - '<div class="alert alert-danger"> + '<div class="alert alert-danger"> <p><strong>%s:</strong> %s</p> <p><a href="%s">%s</a></p> </div>', - Piwik::translate('General_Error'), - htmlentities($errorMessage, Common::HTML_ENCODING_QUOTE_STYLE, 'UTF-8', $doubleEncode = false), - 'index.php?module=' . Piwik::getLoginPluginName(), - Piwik::translate('Login_LogIn') + Piwik::translate('General_Error'), + htmlentities($errorMessage, Common::HTML_ENCODING_QUOTE_STYLE, 'UTF-8', $doubleEncode = false), + 'index.php?module=' . Piwik::getLoginPluginName(), + Piwik::translate('Login_LogIn') ); } @@ -345,7 +350,8 @@ class Controller extends \Piwik\Plugin\ControllerAdmin $currentHost = explode(':', $currentHost, 2)[0]; // we only redirect to a trusted host - if (!empty($host) && !empty($currentHost) && $host == $currentHost && Url::isValidHost($host) + if ( + !empty($host) && !empty($currentHost) && $host == $currentHost && Url::isValidHost($host) ) { $urlToRedirect = $redirect; } @@ -362,9 +368,8 @@ class Controller extends \Piwik\Plugin\ControllerAdmin /** * Reset password action. Stores new password as hash and sends email * to confirm use. - * */ - function resetPassword() + public function resetPassword() { $infoMessage = null; $formErrors = null; @@ -379,7 +384,7 @@ class Controller extends \Piwik\Plugin\ControllerAdmin $infoMessage = Piwik::translate('Login_ConfirmationLinkSent'); } } else { - $formErrors = array($errorMessage); + $formErrors = [$errorMessage]; } } else { // if invalid, display error @@ -410,7 +415,7 @@ class Controller extends \Piwik\Plugin\ControllerAdmin } catch (Exception $ex) { Log::debug($ex); - return array($ex->getMessage()); + return [$ex->getMessage()]; } return null; @@ -444,15 +449,21 @@ class Controller extends \Piwik\Plugin\ControllerAdmin return $this->login($errorMessage); } - if (!empty($_POST['nonce']) - && !empty($_POST['mtmpasswordconfirm']) - && !empty($resetToken) - && !empty($login) - && !empty($passwordHash) - && empty($errorMessage)) { + if ( + !empty($_POST['nonce']) + && !empty($_POST['mtmpasswordconfirm']) + && !empty($resetToken) + && !empty($login) + && !empty($passwordHash) + && empty($errorMessage) + ) { Nonce::checkNonce(self::NONCE_CONFIRMRESETPASSWORD, $_POST['nonce']); - if ($this->passwordResetter->doesResetPasswordHashMatchesPassword($_POST['mtmpasswordconfirm'], - $passwordHash)) { + if ( + $this->passwordResetter->doesResetPasswordHashMatchesPassword( + $_POST['mtmpasswordconfirm'], + $passwordHash + ) + ) { $this->passwordResetter->setHashedPasswordForLogin($login, $passwordHash); return $this->resetPasswordSuccess(); } else { @@ -462,10 +473,10 @@ class Controller extends \Piwik\Plugin\ControllerAdmin $nonce = Nonce::getNonce(self::NONCE_CONFIRMRESETPASSWORD); - return $this->renderTemplateAs('confirmResetPassword', array( + return $this->renderTemplateAs('confirmResetPassword', [ 'nonce' => $nonce, 'errorMessage' => $errorMessage - ), 'basic'); + ], 'basic'); } /** @@ -475,7 +486,7 @@ class Controller extends \Piwik\Plugin\ControllerAdmin */ public function resetPasswordSuccess() { - $_POST = array(); // prevent showing error message username and password is missing + $_POST = []; // prevent showing error message username and password is missing return $this->login($errorMessage = null, $infoMessage = Piwik::translate('Login_PasswordChanged')); } @@ -499,7 +510,7 @@ class Controller extends \Piwik\Plugin\ControllerAdmin */ public function logout() { - Piwik::postEvent('Login.logout', array(Piwik::getCurrentUserLogin())); + Piwik::postEvent('Login.logout', [Piwik::getCurrentUserLogin()]); self::clearSession(); @@ -524,79 +535,99 @@ class Controller extends \Piwik\Plugin\ControllerAdmin $token = Common::getRequestVar('token', null, 'string'); $form = Common::getRequestVar('invitation_form', false, 'string'); - //check token is valid - $user = $model->getUserByTokenAuth($token); - if ($user['invite_status'] !== 'pending') { - throw new Exception(Piwik::translate('Login_InvalidOrExpiredToken')); - } + $settings = new SystemSettings(); + $termsAndConditionUrl = $settings->termsAndConditionUrl->getValue(); + $privacyPolicyUrl = $settings->privacyPolicyUrl->getValue(); + $user = $model->getUserByInviteToken($token); - //if user not match the invite user + // if no user matches the invite token if (!$user) { throw new Exception(Piwik::translate('Login_InvalidUsernameEmail')); } - //if form is blank + if (!empty($user['invite_expired_at']) && Date::factory($user['invite_expired_at'])->isEarlier(Date::now())) { + throw new Exception(Piwik::translate('Login_InvalidOrExpiredToken')); + } + + // if form was sent if (!empty($form)) { $error = null; $password = Common::getRequestVar('password', false, 'string'); $passwordConfirmation = Common::getRequestVar('passwordConfirmation', false, 'string'); - $terms = Common::getRequestVar('terms', false, 'string'); + $conditionCheck = Common::getRequestVar('conditionCheck', false, 'string'); + if (!$password) { $error = Piwik::translate('Login_PasswordRequired'); } - //not accept terms - if (!$terms) { - $error = Piwik::translate('Login_TermsRequired'); + // check if terms accepted and privacy + if (!$conditionCheck && ($privacyPolicyUrl || $termsAndConditionUrl)) { + if ($privacyPolicyUrl && $termsAndConditionUrl) { + $error = Piwik::translate('Login_AcceptPrivacyPolicyAndTermsAndCondition'); + } elseif ($privacyPolicyUrl) { + $error = Piwik::translate('Login_AcceptPrivacyPolicy'); + } elseif ($termsAndConditionUrl) { + $error = Piwik::translate('Login_AcceptTermsAndCondition'); + } } - //valid password + // validate password if (!UsersManager::isValidPasswordString($password)) { - $error = Piwik::translate('UsersManager_ExceptionInvalidPassword', - array(UsersManager::PASSWORD_MIN_LENGTH)); + $error = Piwik::translate('UsersManager_ExceptionInvalidPassword', [UsersManager::PASSWORD_MIN_LENGTH]); } - //confirm matching password + + // confirm matching passwords if ($password !== $passwordConfirmation) { $error = Piwik::translate('Login_PasswordsDoNotMatch'); } if (!$error) { $password = UsersManager::getPasswordHash($password); - $passwordInfo = $passwordHelper->info($password); - - if (!isset($passwordInfo['algo']) || 0 >= $passwordInfo['algo']) { - // password may have already been fully hashed - $password = $passwordHelper->hash($password); + $password = $passwordHelper->hash($password); + + // update pending user to active user + $model->updateUserFields( + $user['login'], + [ + 'password' => $password, + 'invite_token' => null, + 'invite_accept_at' => Date::now()->getDatetime(), + 'invite_expired_at' => null, + ] + ); + + // send e-mail to inviter + if (!empty($user['invited_by'])) { + $invitedBy = $model->getUser($user['invited_by']); + if ($invitedBy) { + $mail = StaticContainer::getContainer()->make(UserAcceptInvitationEmail::class, [ + 'login' => $user['invited_by'], + 'emailAddress' => $invitedBy['email'], + 'userLogin' => $user['login'], + ]); + $mail->safeSend(); + } } - //update pending user to active user - $model->updateUserFields($user['login'], ['password' => $password, 'invite_status' => 'accept']); - $sessionInitializer = new SessionInitializer(); - $auth = StaticContainer::get('Piwik\Auth'); - $auth->setTokenAuth(null); // ensure authenticated through password - $auth->setLogin($user['login']); - $auth->setPassword($passwordConfirmation); - $sessionInitializer->initSession($auth); - - //send Admin Email - try { - $mail = StaticContainer::getContainer()->make(UserAcceptInvitationEmail::class, array( - 'login' => $user['login'], - 'emailAddress' => $user['email'], - 'userLogin' => $user['login'], - )); - $mail->safeSend(); - } catch (\Exception $e) { - - } + /** + * Triggered after a user accepted an invite + * + * @param string $userLogin The invited user's login. + * @param string $email The invited user's e-mail. + * @param string $inviterLogin The login of the user, who invited this user + */ + Piwik::postEvent('UsersManager.inviteUser.accepted', [$user['login'], $user['email'], $user['invited_by']]); - $this->redirectToIndex('CoreHome', 'index'); + $this->authenticateAndRedirect($user['login'], $passwordConfirmation); } + $view->AccessErrorString = $error; } + $view->user = $user; + $view->termsAndCondition = $termsAndConditionUrl; + $view->privacyPolicyUrl = $privacyPolicyUrl; $view->token = $token; - $view->declined = false; $this->configureView($view); self::setHostValidationVariablesView($view); return $view->render(); @@ -609,42 +640,56 @@ class Controller extends \Piwik\Plugin\ControllerAdmin $token = Common::getRequestVar('token', null, 'string'); $form = Common::getRequestVar('invitation_form', false, 'string'); - $user = $model->getUserByTokenAuth($token); - if ($user['invite_status'] !== 'pending') { + $user = $model->getUserByInviteToken($token); + + // if no user matches the invite token + if (!$user) { throw new Exception(Piwik::translate('Login_InvalidOrExpiredToken')); } - //if user not match the invite user - if (!$user) { - throw new Exception(Piwik::translate('Login_InvalidUsernameEmail')); + + if (!empty($user['invite_expired_at']) && Date::factory($user['invite_expired_at'])->isEarlier(Date::now())) { + throw new Exception(Piwik::translate('Login_InvalidOrExpiredToken')); } - if ($form) { - $model->deleteAllTokensForUser($user['login']); - $model->updateUserFields($user['login'], ['invite_status' => 'decline']); - $this->redirectToIndex('Login', 'index'); + $view = new View('@Login/invitationDecline'); - } + if ($form) { + // remove user + try { + $model->deleteUser($user['login']); + } catch (\Exception $e) { + // deleting the user triggers an event, which might call methods that require a user to be logged in + // as those operations might not be needed for a pending user, we simply ignore any errors here + } - $view = new View('@Login/invitation'); - $view->declined = true; - $view->token = $token; + // send e-mail to inviter + if (!empty($user['invited_by'])) { + $invitedBy = $model->getUser($user['invited_by']); + if ($invitedBy) { + $mail = StaticContainer::getContainer()->make(UserDeclinedInvitationEmail::class, [ + 'login' => $user['invited_by'], + 'emailAddress' => $invitedBy['email'], + 'userLogin' => $user['login'], + ]); + $mail->safeSend(); + } + } - //send Admin Email - try { - $mail = StaticContainer::getContainer()->make(UserDeclinedInvitationEmail::class, array( - 'login' => $user['login'], - 'emailAddress' => $user['email'], - 'userLogin' => $user['login'], - )); - $mail->safeSend(); - } catch (\Exception $e) { + $view = new View('@Login/invitationDeclineSuccess'); + /** + * Triggered after a user accepted an invite + * + * @param string $userLogin The invited user's login. + * @param string $email The invited user's e-mail. + * @param string $inviterLogin The login of the user, who invited this user + */ + Piwik::postEvent('UsersManager.inviteUser.declined', [$user['login'], $user['email'], $user['invited_by']]); } + + $view->token = $token; $this->configureView($view); self::setHostValidationVariablesView($view); return $view->render(); - - } - } diff --git a/plugins/Login/PasswordResetter.php b/plugins/Login/PasswordResetter.php index 45854f4601..3d0039554c 100644 --- a/plugins/Login/PasswordResetter.php +++ b/plugins/Login/PasswordResetter.php @@ -15,9 +15,9 @@ use Piwik\IP; use Piwik\Option; use Piwik\Piwik; use Piwik\Plugins\Login\Emails\PasswordResetEmail; +use Piwik\Plugins\UsersManager\API as UsersManagerAPI; use Piwik\Plugins\UsersManager\Model; use Piwik\Plugins\UsersManager\UsersManager; -use Piwik\Plugins\UsersManager\API as UsersManagerAPI; use Piwik\Plugins\UsersManager\UserUpdater; use Piwik\SettingsPiwik; use Piwik\Url; @@ -379,6 +379,8 @@ class PasswordResetter /** * Returns user information based on a login or email. * + * If user is pending, return null + * * Derived classes can override this method to provide custom user querying logic. * * @param string $loginMail user login or email address @@ -388,7 +390,12 @@ class PasswordResetter { $userModel = new Model(); + if ($userModel->isPendingUser($loginOrMail)) { + return null; + } + $user = null; + if ($userModel->userExists($loginOrMail)) { $user = $userModel->getUser($loginOrMail); } else if ($userModel->userEmailExists($loginOrMail)) { diff --git a/plugins/Login/lang/en.json b/plugins/Login/lang/en.json index 9f97cad22b..92ff4bc518 100644 --- a/plugins/Login/lang/en.json +++ b/plugins/Login/lang/en.json @@ -55,14 +55,18 @@ "SuspiciousLoginAttemptsInLastHourEmail4": "Setup two-factor auth so attackers will need more information than just your password in order to login.", "SuspiciousLoginAttemptsInLastHourEmail5": "Additionally, if your Matomo has a limited set of users or IPs through which users will access it, it may be beneficial to setup a IP address allowlist. %1$sRead our docs for more information.%2$s", "LoginNotAllowedBecauseUserLoginBlocked": "Login functionality is temporarily disabled since we've a suspicious amount of failed login attempts in the last hour.", - "InvitationTitle": "Accept Invitation", - "InvitationDeclineTitle": "Decline Invitation", - "InvitationDeclineBody": "Are you sure you want to decline this Invitation?", + "InvitationTitle": "Accept invitation", + "InvitationDeclineTitle": "Decline invitation", + "InvitationDeclineBody": "Are you sure you want to decline this invitation?", "InvitationHints": "(to cancel this action, just leave the page)", "Accept": "Accept", - "Yes": "Yes", - "TermsRequired": "Please Accept the terms and conditions", "PasswordRequired": "Please enter password to continue", - "declineInvitationInfo": "Your invitation has been decline." + "DeclineInvitationInfo": "Your invitation was successfully declined.", + "BySigningUpPrivacyPolicy": "By signing up, I accept the %1$sprivacy policy%2$s", + "BySigningUpTermsAndCondition": "By signing up, I accept the %1$sterms & conditions%2$s", + "BySigningUpPrivacyPolicyAndTermsAndCondition": "By signing up, I accept the %1$sprivacy policy%2$s and the %3$sterms & conditions%4$s", + "AcceptPrivacyPolicy": "You need to accept the privacy policy.", + "AcceptTermsAndCondition": "You need to accept the terms & conditions.", + "AcceptPrivacyPolicyAndTermsAndCondition": "You need to accept the privacy policy and the terms & conditions." } } diff --git a/plugins/Login/templates/invitation.twig b/plugins/Login/templates/invitation.twig index adcba7d505..a559a9aab4 100644 --- a/plugins/Login/templates/invitation.twig +++ b/plugins/Login/templates/invitation.twig @@ -1,83 +1,83 @@ -{% extends '@Login/inviteLayout.twig' %} +{% extends '@Login/loginLayout.twig' %} {% block loginContent %} - {% if not declined %} - <div class="contentForm invitationForm"> - <div class="card"> - <div class="card-content"> - <div class="card-title"> - {{ "Login_InvitationTitle"|translate }} - </div> + <div class="contentForm invitationForm"> + <div class="card"> + <div class="card-content"> + <div class="card-title"> + {{ "Login_InvitationTitle"|translate }} + </div> - {% if AccessErrorString is defined %} - <div piwik-notification - noclear="true" - context="error"> - <strong>{{ 'General_Error'|translate }}</strong>: {{ AccessErrorString|raw }}<br/> - </div> - {% endif %} - {% block content %} - <form method="post" action="?module=Login&action=acceptInvitation"> - <input type="hidden" name="token" value="{{ token }}"/> - <div class="row"> - <div class="col s12 input-field"> - <input type="text" name="login" value="{{ user.login }}" size="20" readonly - tabindex="0"/> - <label><i class="icon-user icon"></i> {{ 'Login_LoginOrEmail'|translate }}</label> - </div> - <div class="col s12 input-field"> - <input type="password" placeholder="" name="password" id="password" class="input" value="" size="20" - autocorrect="off" autocapitalize="none" - tabindex="1" required/> - <label for="password"><i class="icon-locked icon"></i> {{ 'Login_NewPassword'|translate }}</label> - </div> - <div class="col s12 input-field"> - <input type="password" placeholder="" name="passwordConfirmation" id="password_confirm" class="input" value="" size="20" - autocorrect="off" autocapitalize="none" - tabindex="2"/> - <label for="password_confirm"><i class="icon-locked icon"></i> {{ 'Login_NewPasswordRepeat'|translate }}</label> - </div> + {% if AccessErrorString is defined %} + <div piwik-notification + noclear="true" + context="error"> + <strong>{{ 'General_Error'|translate }}</strong>: {{ AccessErrorString|raw }}<br/> + </div> + {% endif %} + {% block content %} + <form method="post" action="?module=Login&action=acceptInvitation"> + <input type="hidden" name="token" value="{{ token }}"/> + <div class="row"> + <div class="col s12 input-field"> + <input type="text" name="login" value="{{ user.login }}" size="20" readonly + tabindex="0"/> + <label><i class="icon-user icon"></i> {{ 'Login_LoginOrEmail'|translate }}</label> + </div> + <div class="col s12 input-field"> + <input type="password" placeholder="" name="password" id="password" class="input" value="" size="20" + autocorrect="off" autocapitalize="none" + tabindex="1" required/> + <label for="password"><i class="icon-locked icon"></i> {{ 'Login_NewPassword'|translate }}</label> + </div> + <div class="col s12 input-field"> + <input type="password" placeholder="" name="passwordConfirmation" id="password_confirm" class="input" value="" size="20" + autocorrect="off" autocapitalize="none" + tabindex="2" required/> + <label for="password_confirm"><i class="icon-locked icon"></i> {{ 'Login_NewPasswordRepeat'|translate }}</label> </div> - <div class="row actions"> + </div> + <div class="row actions"> + {% if privacyPolicyUrl|default('') is not empty or termsAndCondition|default('') is not empty %} <div class="col s12"> <label> - <input name="terms" type="checkbox" id="terms" value="1" tabindex="90"/> - <span>{{ 'PrivacyManager_TermsAndConditions'|translate }}</span> + <input name="conditionCheck" type="checkbox" id="conditionCheck" value="1" tabindex="89"/> + <span> + {% if privacyPolicyUrl|default('') is not empty and termsAndCondition|default('') is empty %} + {{ 'Login_BySigningUpPrivacyPolicy'|translate( + '<a target="_blank" rel="noreferrer noopener" href="' ~ privacyPolicyUrl|safelink|e('html_attr') ~ '">', + '</a>' + )|raw }} + {% elseif privacyPolicyUrl|default('') is empty and termsAndCondition|default('') is not empty %} + {{ 'Login_BySigningUpTermsAndCondition'|translate( + '<a target="_blank" rel="noreferrer noopener" href="' ~ termsAndCondition|safelink|e('html_attr') ~ '">', + '</a>' + )|raw }} + {% elseif privacyPolicyUrl|default('') is not empty and termsAndCondition|default('') is not empty %} + {{ 'Login_BySigningUpPrivacyPolicyAndTermsAndCondition'|translate( + '<a target="_blank" rel="noreferrer noopener" href="' ~ privacyPolicyUrl|safelink|e('html_attr') ~ '">', + '</a>', + '<a target="_blank" rel="noreferrer noopener" href="' ~ termsAndCondition|safelink|e('html_attr') ~ '">', + '</a>' + )|raw }} + {% endif %} + </span> </label> - <input class="submit btn" name="invitation_form" id="login_form_submit" type="submit" value="{{ 'Login_Accept'|translate }}" - tabindex="100"/> </div> - </div> - </form> - {% if isCustomLogo %} - <p id="piwik"> - <i><a href="https://matomo.org/" rel="noreferrer noopener" target="_blank">{{ linkTitle }}</a></i> - </p> - {% endif %} - {% endblock %} - </div> - </div> - </div> - {% else %} - <div class="contentForm invitationForm"> - <div class="card"> - <div class="card-content"> - <div class="card-title"> - {{ "Login_InvitationDeclineTitle"|translate }} - </div> - <p> {{ "Login_InvitationDeclineBody"|translate }}</p> - <p class="hints"> {{ "Login_InvitationHints"|translate }}</p> - <form method="post" action="?module=Login&action=declineInvitation"> - <input type="hidden" name="token" value="{{ token }}"/> - <div class="row actions"> - <div class="col s12"> - <input class="submit btn" name="invitation_form" id="login_form_submit" type="submit" value="{{ 'Login_Yes'|translate }}" + {% endif %} + <div style="margin-top:10px" class="col s12"> + <input class="submit btn" name="invitation_form" id="login_form_submit" type="submit" value="{{ 'Login_Accept'|translate }}" tabindex="100"/> </div> </div> </form> - </div> + {% if isCustomLogo %} + <p id="piwik"> + <i><a href="https://matomo.org/" rel="noreferrer noopener" target="_blank">{{ linkTitle }}</a></i> + </p> + {% endif %} + {% endblock %} </div> </div> - {% endif %} + </div> {% endblock %}
\ No newline at end of file diff --git a/plugins/Login/templates/invitationDecline.twig b/plugins/Login/templates/invitationDecline.twig new file mode 100644 index 0000000000..0e72c6d874 --- /dev/null +++ b/plugins/Login/templates/invitationDecline.twig @@ -0,0 +1,23 @@ +{% extends '@Login/loginLayout.twig' %} + +{% block loginContent %} + <div class="contentForm invitationForm"> + <div class="card"> + <div class="card-content"> + <div class="card-title"> + {{ "Login_InvitationDeclineTitle"|translate }} + </div> + <p> {{ "Login_InvitationDeclineBody"|translate }}</p> + <p class="hints"> {{ "Login_InvitationHints"|translate }}</p> + <form method="post" action="?module=Login&action=declineInvitation"> + <input type="hidden" name="token" value="{{ token }}"/> + <div class="row actions"> + <div class="col s12"> + <input class="submit btn" name="invitation_form" id="login_form_submit" type="submit" value="{{ 'General_Yes'|translate }}" + </div> + </div> + </form> + </div> + </div> + </div> +{% endblock %}
\ No newline at end of file diff --git a/plugins/Login/templates/invitationDeclineSuccess.twig b/plugins/Login/templates/invitationDeclineSuccess.twig new file mode 100644 index 0000000000..cf4f94dbce --- /dev/null +++ b/plugins/Login/templates/invitationDeclineSuccess.twig @@ -0,0 +1,11 @@ +{% extends '@Login/loginLayout.twig' %} + +{% block loginContent %} + <div class="contentForm invitationForm"> + <div class="card"> + <div class="notification system notification-success"> + <p> {{ "Login_DeclineInvitationInfo"|translate }}</p> + </div> + </div> + </div> +{% endblock %}
\ No newline at end of file diff --git a/plugins/Login/templates/inviteLayout.twig b/plugins/Login/templates/inviteLayout.twig deleted file mode 100644 index 3db4ed5be6..0000000000 --- a/plugins/Login/templates/inviteLayout.twig +++ /dev/null @@ -1,46 +0,0 @@ -{% extends '@Morpheus/layout.twig' %} - -{% block meta %} - <meta name="robots" content="noindex,nofollow"> -{% endblock %} - -{% block head %} - {{ parent() }} -{% endblock %} - -{% set title %}{{ 'Login_InvitationTitle'|translate }}{% endset %} - -{% block pageDescription %}{{ 'General_OpenSourceWebAnalytics'|translate }}{% endblock %} - -{% set bodyId = 'loginPage' %} - -{% block body %} - - {{ postEvent("Template.beforeTopBar", "login") }} - {{ postEvent("Template.beforeContent", "login") }} - - {% include "_iframeBuster.twig" %} - - <div id="notificationContainer"> - </div> - <nav> - <div class="nav-wrapper"> - {% include "@CoreHome/_logo.twig" with { 'logoLink': 'https://matomo.org', 'centeredLogo': true, 'useLargeLogo': false } %} - </div> - </nav> - - <section class="loginSection row"> - <div class="col s12 m6 push-m3 l4 push-l4"> - - {# untrusted host warning #} - {% if (isValidHost is defined and invalidHostMessage is defined and isValidHost == false) %} - {% include '@CoreHome/_warningInvalidHost.twig' %} - {% else %} - {% block loginContent %} - {% endblock %} - {% endif %} - - </div> - </section> - -{% endblock %} diff --git a/plugins/Login/tests/Fixtures/PendingUsers.php b/plugins/Login/tests/Fixtures/PendingUsers.php index 4be64378ac..fea4f24000 100644 --- a/plugins/Login/tests/Fixtures/PendingUsers.php +++ b/plugins/Login/tests/Fixtures/PendingUsers.php @@ -1,39 +1,40 @@ <?php + /** * Matomo - free/libre analytics platform * * @link https://matomo.org * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later */ + namespace Piwik\Plugins\Login\tests\Fixtures; -use Piwik\Date; +use Piwik\Plugins\PrivacyManager\SystemSettings; use Piwik\Plugins\UsersManager\Model; use Piwik\Tests\Framework\Fixture; /** - * Generates tracker testing data for our APITest - * - * This Simple fixture adds one website and tracks one visit with couple pageviews and an ecommerce conversion + * Simple fixture that creates a user with pending invitation */ class PendingUsers extends Fixture { - public $dateTime = '2013-01-23 01:23:45'; public $idSite = 1; - public $users = array(); + public $users = []; - public $pendingUser = array( + public $pendingUser = [ 'login' => '000pendingUser', 'email' => 'pendinguser2light@example.com' - ); + ]; public $token = "13cb9dcef6cc70b02a640cee30dc8ce9"; public function setUp(): void { + $this->setUpWebsite(); $this->setUpUser(); + $this->setUpTermsAndPrivacy(); } public function tearDown(): void @@ -45,10 +46,23 @@ class PendingUsers extends Fixture { $model = new Model(); $model->addUser($this->pendingUser['login'], '', $this->pendingUser['email'], $this->dateTime, 1); + $model->attachInviteToken($this->pendingUser['login'], $this->token, 7); + } - $model->addTokenAuth($this->pendingUser['login'], $this->token, "Invite Token", - Date::now()->getDatetime(), - Date::now()->addDay(7)->getDatetime()); + private function setUpWebsite() + { + if (!self::siteCreated($this->idSite)) { + $idSite = self::createWebsite($this->dateTime, $ecommerce = 1); + $this->assertSame($this->idSite, $idSite); + } + } + + private function setUpTermsAndPrivacy() + { + $settings = new SystemSettings(); + $settings->termsAndConditionUrl->setValue('matomo.org'); + $settings->privacyPolicyUrl->setValue('matomo.org'); + $settings->save(); } -}
\ No newline at end of file +} diff --git a/plugins/Login/tests/Integration/LoginTest.php b/plugins/Login/tests/Integration/LoginTest.php index 39f2cc3e76..533a5747d4 100644 --- a/plugins/Login/tests/Integration/LoginTest.php +++ b/plugins/Login/tests/Integration/LoginTest.php @@ -341,14 +341,16 @@ class LoginTest extends IntegrationTestCase protected function _setUpUser() { - $user = array('login' => 'user', - 'password' => 'geqgeagae', - 'email' => 'test@test.com', - 'superuser_access' => 0); + $user = array( + 'login' => 'user', + 'password' => 'geqgeagae', + 'email' => 'test@test.com', + 'superuser_access' => 0 + ); API::getInstance()->addUser($user['login'], $user['password'], $user['email']); - $model = new \Piwik\Plugins\UsersManager\Model(); + $model = new \Piwik\Plugins\UsersManager\Model(); $tokenAuth = $model->generateRandomTokenAuth(); $model->addTokenAuth($user['login'], $tokenAuth, 'many users test', Date::now()->getDatetime()); @@ -393,7 +395,7 @@ class LoginTest extends IntegrationTestCase public function provideContainerConfig() { return array( - 'Piwik\Access' => new FakeAccess() + 'Piwik\Access' => new FakeAccess() ); } } diff --git a/plugins/Login/tests/Integration/PasswordResetterTest.php b/plugins/Login/tests/Integration/PasswordResetterTest.php index b6014aecff..b8f8af336e 100644 --- a/plugins/Login/tests/Integration/PasswordResetterTest.php +++ b/plugins/Login/tests/Integration/PasswordResetterTest.php @@ -11,6 +11,7 @@ namespace Piwik\Plugins\Login\tests\Integration; use PHPMailer\PHPMailer\PHPMailer; use Piwik\Access; +use Piwik\API\Request; use Piwik\Auth; use Piwik\Container\StaticContainer; use Piwik\Option; @@ -166,6 +167,26 @@ class PasswordResetterTest extends IntegrationTestCase $this->passwordResetter->checkValidConfirmPasswordToken('superUserLogin', $oldCapturedToken); } + public function testPasswordResetShouldNotWorkForPendingUser() + { + self::expectException(\Exception::class); + self::expectExceptionMessage('Invalid username or e-mail address.'); + + Request::processRequest( + 'UsersManager.inviteUser', + [ + 'userLogin' => 'pendingUser', + 'email' => 'pending@user.io', + 'idSite' => 1, + 'expiryInDays' => 7 + ] + ); + + self::assertTrue($this->userModel->isPendingUser('pendingUser')); + + $this->passwordResetter->initiatePasswordResetProcess('pendingUser', self::NEWPASSWORD); + } + /** * @param Fixture $fixture */ diff --git a/plugins/Login/tests/UI/Decline_spec.js b/plugins/Login/tests/UI/Decline_spec.js index b2b6893784..515a44a6a3 100644 --- a/plugins/Login/tests/UI/Decline_spec.js +++ b/plugins/Login/tests/UI/Decline_spec.js @@ -1,7 +1,7 @@ /*! * Matomo - free/libre analytics platform * - * login & password reset screenshot tests. + * Decline invitation UI tests * * @link https://matomo.org * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later @@ -10,16 +10,22 @@ describe('Decline', function () { this.timeout(0); this.fixture = 'Piwik\\Plugins\\Login\\tests\\Fixtures\\PendingUsers'; + this.optionsOverride = { + 'persist-fixture-data': false + }; var pendingUserUrl = '?module=Login&action=declineInvitation&token=13cb9dcef6cc70b02a640cee30dc8ce9'; - - it('should display decline invite page', async function () { await page.goto(pendingUserUrl); expect(await page.screenshot({ fullPage: true })).to.matchImage('default'); }); - - -});
\ No newline at end of file + it('should display decline success page', async function () { + await page.evaluate(function(){ + $('#login_form_submit').click(); + }); + await page.waitForNetworkIdle(); + expect(await page.screenshot({ fullPage: true })).to.matchImage('success'); + }); +}); diff --git a/plugins/Login/tests/UI/Invite_spec.js b/plugins/Login/tests/UI/Invite_spec.js index d937f2c891..decb080ff0 100644 --- a/plugins/Login/tests/UI/Invite_spec.js +++ b/plugins/Login/tests/UI/Invite_spec.js @@ -1,7 +1,7 @@ /*! * Matomo - free/libre analytics platform * - * login & password reset screenshot tests. + * Accept invitation UI tests * * @link https://matomo.org * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later @@ -10,11 +10,13 @@ describe('Invite', function () { this.timeout(0); this.fixture = 'Piwik\\Plugins\\Login\\tests\\Fixtures\\PendingUsers'; + this.optionsOverride = { + 'persist-fixture-data': false + }; var pendingUserUrl = '?module=Login&action=acceptInvitation&token=13cb9dcef6cc70b02a640cee30dc8ce9'; var wrongUserUrl = '?module=Login&action=acceptInvitation&token=123'; - it('should display error page', async function (){ await page.goto(wrongUserUrl); expect(await page.screenshot({ fullPage: true })).to.matchImage('error'); @@ -31,8 +33,19 @@ describe('Invite', function () { await page.evaluate(function(){ $('#login_form_submit').click(); }); + await page.waitForNetworkIdle(); expect(await page.screenshot({ fullPage: true })).to.matchImage('wrong_password'); - }); -});
\ No newline at end of file + it('it should login success', async function () { + await page.type('#password', 'abcd1234'); + await page.type('#password_confirm', 'abcd1234'); + await page.evaluate(function(){ + $('#conditionCheck').prop('checked', true); + $('#login_form_submit').click(); + }); + // should show site without data page + await page.waitForNetworkIdle(); + await page.waitForSelector('.site-without-data'); + }); +}); diff --git a/plugins/Login/tests/UI/expected-screenshots/Decline_default.png b/plugins/Login/tests/UI/expected-screenshots/Decline_default.png index fa9acf274f..a2e9c2522b 100644 --- a/plugins/Login/tests/UI/expected-screenshots/Decline_default.png +++ b/plugins/Login/tests/UI/expected-screenshots/Decline_default.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b4f71261c0c6e74cae66aba9d6749eb2e0852acb802349e573d35f38ad6a7861 -size 24210 +oid sha256:41aedf3327800c766eb323de2239e78a8854f73ed18bacad5a0e3c243aa4407f +size 24267 diff --git a/plugins/Login/tests/UI/expected-screenshots/Decline_success.png b/plugins/Login/tests/UI/expected-screenshots/Decline_success.png new file mode 100644 index 0000000000..e88135cd2e --- /dev/null +++ b/plugins/Login/tests/UI/expected-screenshots/Decline_success.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d92554f925821c014c4ec38647342c14595d07d060dc761256983838dd426518 +size 15961 diff --git a/plugins/Login/tests/UI/expected-screenshots/Invite_error.png b/plugins/Login/tests/UI/expected-screenshots/Invite_error.png index 5d5cc8fcd4..e9775cca1e 100644 --- a/plugins/Login/tests/UI/expected-screenshots/Invite_error.png +++ b/plugins/Login/tests/UI/expected-screenshots/Invite_error.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c273f68c05b5c8398aa2248a92633bc83b5209188b859d173d76be5a3d96f630 -size 40102 +oid sha256:6510477474c2b1bd247bb61dedb0b5d381306e1f647772628a712b1ef5361dd3 +size 40268 diff --git a/plugins/Login/tests/UI/expected-screenshots/Invite_set_password.png b/plugins/Login/tests/UI/expected-screenshots/Invite_set_password.png index 4979ed5066..cf6230982b 100644 --- a/plugins/Login/tests/UI/expected-screenshots/Invite_set_password.png +++ b/plugins/Login/tests/UI/expected-screenshots/Invite_set_password.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d59911d79ef8cf203efa7a7d64024fe66c9c655dcf6ec32900954be7d9e7b494 -size 27166 +oid sha256:2928cffb6651bf7304f3fe2b99f53570a7cba38655df2b24eac99b3a4e720c36 +size 33403 diff --git a/plugins/Login/tests/UI/expected-screenshots/Invite_wrong_password.png b/plugins/Login/tests/UI/expected-screenshots/Invite_wrong_password.png index ac1265c02a..9563f4704c 100644 --- a/plugins/Login/tests/UI/expected-screenshots/Invite_wrong_password.png +++ b/plugins/Login/tests/UI/expected-screenshots/Invite_wrong_password.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:9a8c371e544e1964269b1d6200e933a719a47a6b3dcba01549588dc67bb2f3ea -size 32681 +oid sha256:e984c2c1337416b377b6c1195696ad126028e9b2aa5d6ddbad4d2c3a8d2bbb8a +size 39188 diff --git a/plugins/SegmentEditor/SegmentEditor.php b/plugins/SegmentEditor/SegmentEditor.php index bd4e542a1e..9f2943f880 100644 --- a/plugins/SegmentEditor/SegmentEditor.php +++ b/plugins/SegmentEditor/SegmentEditor.php @@ -8,6 +8,7 @@ */ namespace Piwik\Plugins\SegmentEditor; +use Piwik\Access; use Piwik\API\Request; use Piwik\ArchiveProcessor\PluginsArchiver; use Piwik\ArchiveProcessor\Rules; @@ -177,7 +178,7 @@ class SegmentEditor extends \Piwik\Plugin return; } - list($segment, $storedSegment, $isSegmentToPreprocess) = $segmentInfo; + [$segment, $storedSegment, $isSegmentToPreprocess] = $segmentInfo; throw new UnprocessedSegmentException($segment, $isSegmentToPreprocess, $storedSegment); } @@ -194,7 +195,7 @@ class SegmentEditor extends \Piwik\Plugin return; } - list($segment, $storedSegment, $isSegmentToPreprocess, $canBeArchived) = $segmentInfo; + [$segment, $storedSegment, $isSegmentToPreprocess, $canBeArchived] = $segmentInfo; if (!$isSegmentToPreprocess) { return; // do not display the notification for custom segments @@ -389,30 +390,33 @@ class SegmentEditor extends \Piwik\Plugin public function transferAllUserSegmentsToSuperUser($userLogin) { - $model = new Model(); - $updatedAt = Date::factory('now')->toString('Y-m-d H:i:s'); - - $superUsers = UsersManagerApi::getInstance()->getUsersHavingSuperUserAccess(); - $superUserLogin = false; - - foreach ($superUsers as $superUser) { - if ($superUser['login'] !== $userLogin) { - $superUserLogin = $superUser['login']; - break; + // We need to do that as super user, as the event triggering this method might be initiated without a session + Access::doAsSuperUser(function () use ($userLogin) { + $model = new Model(); + $updatedAt = Date::factory('now')->toString('Y-m-d H:i:s'); + + $superUsers = UsersManagerApi::getInstance()->getUsersHavingSuperUserAccess(); + $superUserLogin = false; + + foreach ($superUsers as $superUser) { + if ($superUser['login'] !== $userLogin) { + $superUserLogin = $superUser['login']; + break; + } } - } - if (!$superUserLogin) { - return; - } + if (!$superUserLogin) { + return; + } - foreach ($model->getAllSegments($userLogin) as $segment) { - if ($segment['login'] === $userLogin) { - $model->updateSegment($segment['idsegment'], array( - 'login' => $superUserLogin, - 'ts_last_edit' => $updatedAt - )); + foreach ($model->getAllSegments($userLogin) as $segment) { + if ($segment['login'] === $userLogin) { + $model->updateSegment($segment['idsegment'], array( + 'login' => $superUserLogin, + 'ts_last_edit' => $updatedAt + )); + } } - } + }); } } diff --git a/plugins/Transitions/tests/UI/expected-screenshots/Transitions_transitions_popup_urls.png b/plugins/Transitions/tests/UI/expected-screenshots/Transitions_transitions_popup_urls.png index 969d9f1488..3853e3e873 100644 --- a/plugins/Transitions/tests/UI/expected-screenshots/Transitions_transitions_popup_urls.png +++ b/plugins/Transitions/tests/UI/expected-screenshots/Transitions_transitions_popup_urls.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:666d1e0bc17844d8b9ae45fa3beebb1ab7150578d60c1de531ea34bd56b0c2b5 -size 78767 +oid sha256:57105bb6ad30c699e06bdfecb01173ac6a898bb2ac65c4a601c8556fda184f15 +size 80827 diff --git a/plugins/TwoFactorAuth/tests/UI/expected-screenshots/TwoFactorAuthUsersManager_list.png b/plugins/TwoFactorAuth/tests/UI/expected-screenshots/TwoFactorAuthUsersManager_list.png index 025e7e1437..7128f385c5 100644 --- a/plugins/TwoFactorAuth/tests/UI/expected-screenshots/TwoFactorAuthUsersManager_list.png +++ b/plugins/TwoFactorAuth/tests/UI/expected-screenshots/TwoFactorAuthUsersManager_list.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:0b07a1448c7586d161c9ccd437aadeaae0e66278352bac861021f17aba1ec6f1 -size 68073 +oid sha256:7fe4087329a42c48ddf155880189062878b14923e3bd2540d0adc71c4945c42c +size 68829 diff --git a/plugins/UsersManager/API.php b/plugins/UsersManager/API.php index 6eb5e6b9b7..9accb8f35c 100644 --- a/plugins/UsersManager/API.php +++ b/plugins/UsersManager/API.php @@ -1,4 +1,5 @@ <?php + /** * Matomo - free/libre analytics platform * @@ -6,6 +7,7 @@ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later * */ + namespace Piwik\Plugins\UsersManager; use DeviceDetector\DeviceDetector; @@ -25,10 +27,10 @@ use Piwik\Plugins\CoreAdminHome\Emails\UserDeletedEmail; use Piwik\Plugins\Login\PasswordVerifier; use Piwik\Plugins\UsersManager\Emails\UserInfoChangedEmail; use Piwik\Plugins\UsersManager\Repository\UserRepository; +use Piwik\Plugins\UsersManager\Validators\Email; use Piwik\Site; use Piwik\Tracker\Cache; use Piwik\Validators\BaseValidator; -use Piwik\Validators\Email; /** * The UsersManager API lets you Manage Users and their permissions to access specific websites. @@ -94,13 +96,13 @@ class API extends \Piwik\Plugin\API private static $instance = null; public function __construct( - Model $model, - UserAccessFilter $filter, - Password $password, - Access $access = null, - Access\RolesProvider $roleProvider = null, - Access\CapabilitiesProvider $capabilityProvider = null, - PasswordVerifier $passwordVerifier = null + Model $model, + UserAccessFilter $filter, + Password $password, + Access $access = null, + Access\RolesProvider $roleProvider = null, + Access\CapabilitiesProvider $capabilityProvider = null, + PasswordVerifier $passwordVerifier = null ) { $this->model = $model; $this->userFilter = $filter; @@ -131,7 +133,6 @@ class API extends \Piwik\Plugin\API throw new Exception('UsersManager_API must inherit API'); } self::$instance = $instance; - } catch (Exception $e) { self::$instance = StaticContainer::get('Piwik\Plugins\UsersManager\API'); StaticContainer::getContainer()->set('UsersManager_API', self::$instance); @@ -149,15 +150,15 @@ class API extends \Piwik\Plugin\API { Piwik::checkUserHasSomeAdminAccess(); - $response = array(); + $response = []; foreach ($this->roleProvider->getAllRoles() as $role) { - $response[] = array( + $response[] = [ 'id' => $role->getId(), 'name' => $role->getName(), 'description' => $role->getDescription(), 'helpUrl' => $role->getHelpUrl(), - ); + ]; } return $response; @@ -171,17 +172,17 @@ class API extends \Piwik\Plugin\API { Piwik::checkUserHasSomeAdminAccess(); - $response = array(); + $response = []; foreach ($this->capabilityProvider->getAllCapabilities() as $capability) { - $response[] = array( + $response[] = [ 'id' => $capability->getId(), 'name' => $capability->getName(), 'description' => $capability->getDescription(), 'helpUrl' => $capability->getHelpUrl(), 'includedInRoles' => $capability->getIncludedInRoles(), 'category' => $capability->getCategory(), - ); + ]; } return $response; @@ -272,7 +273,7 @@ class API extends \Piwik\Plugin\API { Piwik::checkUserHasSuperUserAccess(); - $userPreferences = array(); + $userPreferences = []; foreach ($preferenceNames as $preferenceName) { $optionNameMatchAllUsers = $this->getPreferenceId('%', $preferenceName); $preferences = Option::getLike($optionNameMatchAllUsers); @@ -292,16 +293,18 @@ class API extends \Piwik\Plugin\API if (false !== strpos($preference, self::OPTION_NAME_PREFERENCE_SEPARATOR)) { throw new Exception("Preference name cannot contain underscores."); } - $names = array( + $names = [ self::PREFERENCE_DEFAULT_REPORT, self::PREFERENCE_DEFAULT_REPORT_DATE, 'isLDAPUser', // used in loginldap 'hideSegmentDefinitionChangeMessage',// used in JS - ); + ]; $customPreferences = StaticContainer::get('usersmanager.user_preference_names'); - if (!in_array($preference, $names, true) - && !in_array($preference, $customPreferences, true)) { + if ( + !in_array($preference, $names, true) + && !in_array($preference, $customPreferences, true) + ) { throw new Exception('Not supported preference name: ' . $preference); } return $login . self::OPTION_NAME_PREFERENCE_SEPARATOR . $preference; @@ -339,7 +342,7 @@ class API extends \Piwik\Plugin\API * Filtering by 'superuser' is only allowed for other superusers. * @return array */ - public function getUsersPlusRole($idSite, $limit = null, $offset = 0, $filter_search = null, $filter_access = null) + public function getUsersPlusRole($idSite, $limit = null, $offset = 0, $filter_search = null, $filter_access = null, $filter_status = null) { if (!$this->isUserHasAdminAccessTo($idSite)) { // if the user is not an admin to $idSite, they can only see their own user @@ -371,10 +374,16 @@ class API extends \Piwik\Plugin\API // access is managed by another plugin, and the current user cannot manage any user with UsersManager Common::sendHeader('X-Matomo-Total-Results: 0'); return []; - } else { - [$users, $totalResults] = $this->model->getUsersWithRole($idSite, $limit, $offset, $filter_search, - $filter_access, $loginsToLimit); + [$users, $totalResults] = $this->model->getUsersWithRole( + $idSite, + $limit, + $offset, + $filter_search, + $filter_access, + $filter_status, + $loginsToLimit + ); foreach ($users as &$user) { $user['superuser_access'] = $user['superuser_access'] == 1; @@ -419,7 +428,7 @@ class API extends \Piwik\Plugin\API throw new \Exception('Parameter userLogins needs to be a string containing a comma separated list of users'); } - $logins = array(); + $logins = []; if (!empty($userLogins)) { $logins = explode(',', $userLogins); @@ -428,7 +437,6 @@ class API extends \Piwik\Plugin\API $users = $this->model->getUsers($logins); $users = $this->userFilter->filterUsers($users); return $this->userRepository->enrichUsers($users); - } /** @@ -484,8 +492,10 @@ class API extends \Piwik\Plugin\API foreach ($access as $entry) { if (!$this->isValidAccessType($entry)) { - throw new Exception(Piwik::translate("UsersManager_ExceptionAccessValues", - [implode(", ", $this->getAllRolesAndCapabilities()), $entry])); + throw new Exception(Piwik::translate( + "UsersManager_ExceptionAccessValues", + [implode(", ", $this->getAllRolesAndCapabilities()), $entry] + )); } } } @@ -541,7 +551,7 @@ class API extends \Piwik\Plugin\API $logins = $this->model->getUsersLoginWithSiteAccess($idSite, $access); if (empty($logins)) { - return array(); + return []; } $logins = $this->userFilter->filterLogins($logins); @@ -572,14 +582,14 @@ class API extends \Piwik\Plugin\API $this->checkUserExists($userLogin); // Super users have 'admin' access for every site if (Piwik::hasTheUserSuperUserAccess($userLogin)) { - $return = array(); + $return = []; $siteManagerModel = new \Piwik\Plugins\SitesManager\Model(); $sites = $siteManagerModel->getAllSites(); foreach ($sites as $site) { - $return[] = array( + $return[] = [ 'site' => $site['idsite'], 'access' => 'admin' - ); + ]; } return $return; } @@ -607,11 +617,11 @@ class API extends \Piwik\Plugin\API * @throws Exception */ public function getSitesAccessForUser( - $userLogin, - $limit = null, - $offset = 0, - $filter_search = null, - $filter_access = null + $userLogin, + $limit = null, + $offset = 0, + $filter_search = null, + $filter_access = null ) { Piwik::checkUserHasSomeAdminAccess(); $this->checkUserExists($userLogin); @@ -628,8 +638,14 @@ class API extends \Piwik\Plugin\API } } - [$sites, $totalResults] = $this->model->getSitesAccessFromUserWithFilters($userLogin, $limit, $offset, - $filter_search, $filter_access, $idSites); + [$sites, $totalResults] = $this->model->getSitesAccessFromUserWithFilters( + $userLogin, + $limit, + $offset, + $filter_search, + $filter_access, + $idSites + ); foreach ($sites as &$siteAccess) { [ $siteAccess['role'], @@ -662,9 +678,12 @@ class API extends \Piwik\Plugin\API $user = $this->model->getUser($userLogin); + if (empty($user) || !is_array($user)) { + return []; + } + $user = $this->userFilter->filterUser($user); return $this->userRepository->enrichUser($user); - } /** @@ -681,6 +700,10 @@ class API extends \Piwik\Plugin\API $user = $this->model->getUserByEmail($userEmail); + if (empty($user) || !is_array($user)) { + return []; + } + $user = $this->userFilter->filterUser($user); return $this->userRepository->enrichUser($user); } @@ -701,24 +724,54 @@ class API extends \Piwik\Plugin\API */ public function addUser($userLogin, $password, $email, $_isPasswordHashed = false, $initialIdSite = null) { + Piwik::checkUserHasSomeAdminAccess(); + UsersManager::dieIfUsersAdminIsDisabled(); + $password = Common::unsanitizeInputValue($password); UsersManager::checkPassword($password); - //create User - $this->userRepository->create($userLogin, $email, $initialIdSite, $password, $_isPasswordHashed); + $initialIdSite = $initialIdSite === null ? null : intval($initialIdSite); + + $this->userRepository->create( + (string) $userLogin, + (string) $email, + $initialIdSite, + (string) $password, + (bool) $_isPasswordHashed + ); - // send admin Email - $this->userRepository->sendNewUserEmails($userLogin, null); + /** + * Triggered after a new user is created. + * + * @param string $userLogin The new user's login. + * @param string $email The new user's e-mail. + * @param string $inviterLogin The login of the user who created the new user + */ + Piwik::postEvent('UsersManager.addUser.end', [$userLogin, $email, Piwik::getCurrentUserLogin()]); } - - public function inviteUser($userLogin, $email, $initialIdSite = null, $expired = 7) + /** + * @throws Exception + */ + public function inviteUser($userLogin, $email, $idSite = null, $expiryInDays = null) { - //create User - $this->userRepository->create($userLogin, $email, $initialIdSite); + Piwik::checkUserHasSomeAdminAccess(); + UsersManager::dieIfUsersAdminIsDisabled(); + + if (empty($expiryInDays)) { + $expiryInDays = Config\GeneralConfig::getConfigValue('default_invite_user_token_expiry_days'); + } - // send invited user an email - $this->userRepository->sendNewUserEmails($userLogin, $expired); + $idSite = $idSite === null ? null : intval($idSite); + $this->userRepository->inviteUser((string) $userLogin, (string) $email, $idSite, (int) $expiryInDays); + + /** + * Triggered after a new user was invited. + * + * @param string $userLogin The new user's login. + * @param string $email The new user's e-mail. + */ + Piwik::postEvent('UsersManager.inviteUser.end', [$userLogin, $email]); } /** @@ -742,8 +795,9 @@ class API extends \Piwik\Plugin\API self::$SET_SUPERUSER_ACCESS_REQUIRE_PASSWORD_CONFIRMATION = true; $isCliMode = Common::isPhpCliMode() && !(defined('PIWIK_TEST_MODE') && PIWIK_TEST_MODE); - if (!$isCliMode - && $requirePasswordConfirmation + if ( + !$isCliMode + && $requirePasswordConfirmation ) { $this->confirmCurrentUserPassword($passwordConfirmation); } @@ -799,11 +853,11 @@ class API extends \Piwik\Plugin\API * @see addUser() for all the parameters */ public function updateUser( - $userLogin, - $password = false, - $email = false, - $_isPasswordHashed = false, - $passwordConfirmation = false + $userLogin, + $password = false, + $email = false, + $_isPasswordHashed = false, + $passwordConfirmation = false ) { $requirePasswordConfirmation = self::$UPDATE_USER_REQUIRE_PASSWORD_CONFIRMATION; self::$UPDATE_USER_REQUIRE_PASSWORD_CONFIRMATION = true; @@ -848,7 +902,7 @@ class API extends \Piwik\Plugin\API $hasEmailChanged = mb_strtolower($email) !== mb_strtolower($userInfo['email']); if ($hasEmailChanged) { - BaseValidator::check('email', $email, [new Email(true)]); + BaseValidator::check('email', $email, [new Email(true, $userLogin)]); $changeShouldRequirePasswordConfirmation = true; } @@ -875,7 +929,7 @@ class API extends \Piwik\Plugin\API * @param string $userLogin The user's login handle. * @param boolean $passwordHasBeenUpdated Flag containing information about password change. */ - Piwik::postEvent('UsersManager.updateUser.end', array($userLogin, $passwordHasBeenUpdated, $email, $password)); + Piwik::postEvent('UsersManager.updateUser.end', [$userLogin, $passwordHasBeenUpdated, $email, $password]); } /** @@ -889,10 +943,19 @@ class API extends \Piwik\Plugin\API */ public function deleteUser($userLogin) { - Piwik::checkUserHasSuperUserAccess(); + Piwik::checkUserHasSomeAdminAccess(); UsersManager::dieIfUsersAdminIsDisabled(); $this->checkUserIsNotAnonymous($userLogin); + $user = $this->model->getUser($userLogin); + + // If user is not a super user check if the user was invited by the current user + if (!Piwik::hasUserSuperUserAccess()) { + if ($user['invited_by'] !== Piwik::getCurrentUserLogin() || !$this->model->isPendingUser($userLogin)) { + throw new NoAccessException(Piwik::translate('UsersManager_ExceptionUserDoesNotExist', $userLogin)); + } + } + $this->checkUserExist($userLogin); if ($this->isUserTheOnlyUserHavingSuperUserAccess($userLogin)) { @@ -902,16 +965,14 @@ class API extends \Piwik\Plugin\API throw new Exception($message); } - $this->model->deleteUserOnly($userLogin); - $this->model->deleteUserOptions($userLogin); - $this->model->deleteUserAccess($userLogin); + $this->model->deleteUser($userLogin); $container = StaticContainer::getContainer(); - $email = $container->make(UserDeletedEmail::class, array( + $email = $container->make(UserDeletedEmail::class, [ 'login' => Piwik::getCurrentUserLogin(), 'emailAddress' => Piwik::getCurrentUserEmail(), 'userLogin' => $userLogin - )); + ]); $email->safeSend(); Cache::deleteTrackerCache(); @@ -999,15 +1060,18 @@ class API extends \Piwik\Plugin\API $idSites = $this->getIdSitesCheckAdminAccess($idSites); - if ($userLogin === 'anonymous' && - (is_array($access) || !in_array($access, array('view', 'noaccess'), true)) + if ( + $userLogin === 'anonymous' && + (is_array($access) || !in_array($access, ['view', 'noaccess'], true)) ) { - throw new Exception(Piwik::translate("UsersManager_ExceptionAnonymousAccessNotPossible", - array('noaccess', 'view'))); + throw new Exception(Piwik::translate( + "UsersManager_ExceptionAnonymousAccessNotPossible", + ['noaccess', 'view'] + )); } - $roles = array(); - $capabilities = array(); + $roles = []; + $capabilities = []; if (is_array($access)) { // we require one role, and optionally multiple capabilities @@ -1022,7 +1086,6 @@ class API extends \Piwik\Plugin\API $ids = implode(', ', $this->roleProvider->getAllRoleIds()); throw new Exception(Piwik::translate('UsersManager_ExceptionMultipleRoleSet', $ids)); } - } else { // as only one access is set, we require it to be a role or "noaccess"... if ($access !== 'noaccess') { @@ -1039,7 +1102,7 @@ class API extends \Piwik\Plugin\API if ($access === 'noaccess') { // if the access is noaccess then we don't save it as this is the default value // when no access are specified - Piwik::postEvent('UsersManager.removeSiteAccess', array($userLogin, $idSites)); + Piwik::postEvent('UsersManager.removeSiteAccess', [$userLogin, $idSites]); } else { $role = array_shift($roles); $this->model->addUserAccess($userLogin, $role, $idSites); @@ -1077,7 +1140,7 @@ class API extends \Piwik\Plugin\API $this->checkUsersHasNotSuperUserAccess([$userLogin]); if (!is_array($capabilities)) { - $capabilities = array($capabilities); + $capabilities = [$capabilities]; } foreach ($capabilities as $entry) { @@ -1091,8 +1154,11 @@ class API extends \Piwik\Plugin\API foreach ($idSites as $idSite) { $hasRole = array_key_exists($idSite, $sitesIdWithRole); - $hasCapabilityAlready = array_key_exists($idSite, $sitesIdWithCapability) && in_array($entry, - $sitesIdWithCapability[$idSite], true); + $hasCapabilityAlready = array_key_exists($idSite, $sitesIdWithCapability) && in_array( + $entry, + $sitesIdWithCapability[$idSite], + true + ); // so far we are adding the capability only to people that also have a role... // to be defined how to handle this... eg we are not throwing an exception currently @@ -1105,10 +1171,9 @@ class API extends \Piwik\Plugin\API continue; } - $this->model->addUserAccess($userLogin, $entry, array($idSite)); + $this->model->addUserAccess($userLogin, $entry, [$idSite]); } } - } // we reload the access list which doesn't yet take in consideration this new user access @@ -1120,14 +1185,14 @@ class API extends \Piwik\Plugin\API $sites = $this->model->getSitesAccessFromUser($userLogin); $roleIds = $this->roleProvider->getAllRoleIds(); - $sitesIdWithRole = array(); - $sitesIdWithCapability = array(); + $sitesIdWithRole = []; + $sitesIdWithCapability = []; foreach ($sites as $site) { if (in_array($site['access'], $roleIds, true)) { $sitesIdWithRole[(int)$site['site']] = $site['access']; } else { if (!isset($sitesIdWithCapability[(int)$site['site']])) { - $sitesIdWithCapability[(int)$site['site']] = array(); + $sitesIdWithCapability[(int)$site['site']] = []; } $sitesIdWithCapability[(int)$site['site']][] = $site['access']; } @@ -1153,7 +1218,7 @@ class API extends \Piwik\Plugin\API $this->checkUserExists($userLogin); if (!is_array($capabilities)) { - $capabilities = array($capabilities); + $capabilities = [$capabilities]; } foreach ($capabilities as $capability) { @@ -1176,11 +1241,11 @@ class API extends \Piwik\Plugin\API private function getIdSitesCheckAdminAccess($idSites) { - // in case idSites is all we grant access to all the websites on which the current connected user has an 'admin' access if ($idSites === 'all') { + // in case idSites is all we grant access to all the websites on which the current connected user has an 'admin' access $idSites = \Piwik\Plugins\SitesManager\API::getInstance()->getSitesIdWithAdminAccess(); - } // in case the idSites is an integer we build an array - else { + } else { + // in case the idSites is an integer we build an array $idSites = Site::getIdSitesFromIdSitesString($idSites); } @@ -1193,7 +1258,7 @@ class API extends \Piwik\Plugin\API Piwik::checkUserHasAdminAccess($idSites); if (!is_array($idSites)) { - $idSites = array($idSites); + $idSites = [$idSites]; } return $idSites; @@ -1282,11 +1347,11 @@ class API extends \Piwik\Plugin\API * @return string */ public function createAppSpecificTokenAuth( - $userLogin, - $passwordConfirmation, - $description, - $expireDate = null, - $expireHours = 0 + $userLogin, + $passwordConfirmation, + $description, + $expireDate = null, + $expireHours = 0 ) { $user = $this->model->getUser($userLogin); if (empty($user) && Piwik::isValidEmailString($userLogin)) { @@ -1303,7 +1368,7 @@ class API extends \Piwik\Plugin\API * @ignore * @internal */ - Piwik::postEvent('Login.authenticate.failed', array($userLogin)); + Piwik::postEvent('Login.authenticate.failed', [$userLogin]); } throw new \Exception(Piwik::translate('UsersManager_CurrentPasswordNotCorrect')); @@ -1329,7 +1394,7 @@ class API extends \Piwik\Plugin\API $email = Piwik::getCurrentUserEmail(); $success = NewsletterSignup::signupForNewsletter($userLogin, $email, true); - $result = $success ? array('success' => true) : array('error' => true); + $result = $success ? ['success' => true] : ['error' => true]; return $result; } @@ -1363,10 +1428,8 @@ class API extends \Piwik\Plugin\API if ($this->roleProvider->isValidRole($entry)) { $roles[] = $entry; - } else { - if ($this->isValidAccessType($entry)) { - $capabilities[] = $entry; - } + } elseif ($this->isValidAccessType($entry)) { + $capabilities[] = $entry; } } return [$roles, $capabilities]; @@ -1390,8 +1453,13 @@ class API extends \Piwik\Plugin\API { // send the mail to both the old email and the new email foreach ([$newEmail, $user['email']] as $emailTo) { - $this->sendUserInfoChangedEmail('email', $user, $newEmail, $emailTo, - 'UsersManager_EmailChangeNotificationSubject'); + $this->sendUserInfoChangedEmail( + 'email', + $user, + $newEmail, + $emailTo, + 'UsersManager_EmailChangeNotificationSubject' + ); } } @@ -1409,8 +1477,13 @@ class API extends \Piwik\Plugin\API private function sendPasswordChangedEmail($user) { - $this->sendUserInfoChangedEmail('password', $user, null, $user['email'], - 'UsersManager_PasswordChangeNotificationSubject'); + $this->sendUserInfoChangedEmail( + 'password', + $user, + null, + $user['email'], + 'UsersManager_PasswordChangeNotificationSubject' + ); } private function getDeviceDescription() @@ -1429,9 +1502,7 @@ class API extends \Piwik\Plugin\API $deviceBrand = $uaParser->getBrandName(); $deviceModel = $uaParser->getModel(); - if (!empty($deviceBrand) - || !empty($deviceModel) - ) { + if (!empty($deviceBrand) || !empty($deviceModel)) { $parts = array_filter([$deviceBrand, $deviceModel]); $description .= ' (' . implode(' ', $parts) . ')'; } @@ -1441,26 +1512,35 @@ class API extends \Piwik\Plugin\API /** * resend the invite email to user - * @param $userLogin + * + * @param string $userLogin + * @param int $expiryInDays * @throws NoAccessException - * @throws \DI\DependencyException - * @throws \DI\NotFoundException */ - public function resendInvite($userLogin, $expired = 7) + public function resendInvite($userLogin, $expiryInDays = 7) { - Piwik::checkUserIsNotAnonymous(); - Piwik::checkUserHasSuperUserAccess(); - - $this->checkUserIsNotAnonymous($userLogin); + Piwik::checkUserHasSomeAdminAccess(); - if (!$this->model->getPendingUser($userLogin)) { - throw new Exception(Piwik::translate("UsersManager_ExceptionUserDoesNotExist", $userLogin)); + if (!$this->model->isPendingUser($userLogin)) { + throw new Exception(Piwik::translate('UsersManager_ExceptionUserDoesNotExist', $userLogin)); } - $this->model->updateUserFields($userLogin, ['invite_status' => 'pending']); - $this->userRepository->sendNewUserEmails($userLogin, $expired, false); - Cache::deleteTrackerCache(); - } + $user = $this->model->getUser($userLogin); + + // If user is not a super user check if the user was invited by the current user + if (!Piwik::hasUserSuperUserAccess()) { + if ($user['invited_by'] !== Piwik::getCurrentUserLogin()) { + throw new NoAccessException(Piwik::translate('UsersManager_ExceptionResendInviteDenied', $userLogin)); + } + } + $this->userRepository->reInviteUser($userLogin, (int)$expiryInDays); + /** + * Triggered after a new user was invited. + * + * @param string $userLogin The new user's login. + */ + Piwik::postEvent('UsersManager.inviteUser.resendInvite', [$userLogin, $user['email']]); + } } diff --git a/plugins/UsersManager/Controller.php b/plugins/UsersManager/Controller.php index 559ffd4324..b5bad81dcd 100644 --- a/plugins/UsersManager/Controller.php +++ b/plugins/UsersManager/Controller.php @@ -110,6 +110,13 @@ class Controller extends ControllerAdmin ['key' => 'superuser', 'value' => Piwik::translate('Installation_SuperUser')], ]; + $view->statusAccessLevels = [ + ['key' => '', 'value' => ''], // show all + ['key' => 'pending', 'value' => Piwik::translate('UsersManager_Pending')], + ['key' => 'active', 'value' => Piwik::translate('UsersManager_Active')], + ['key' => 'expired', 'value' => Piwik::translate('UsersManager_Expired')], + ]; + $capabilities = Request::processRequest('UsersManager.getAvailableCapabilities', [], []); foreach ($capabilities as $capability) { $capabilityEntry = [ diff --git a/plugins/UsersManager/Emails/UserInviteEmail.php b/plugins/UsersManager/Emails/UserInviteEmail.php index bfe43771bc..62d6daca72 100644 --- a/plugins/UsersManager/Emails/UserInviteEmail.php +++ b/plugins/UsersManager/Emails/UserInviteEmail.php @@ -1,4 +1,5 @@ <?php + /** * Matomo - free/libre analytics platform * @@ -23,25 +24,34 @@ class UserInviteEmail extends Mail /** * @var object */ - private $user; + private $invitedUser; /** * @var string */ private $token; + /** + * @var int + */ + private $expiryInDays; + + private $siteName; /** * @param string $currentUser - * @param array $user - * @param string $idSite + * @param array $invitedUser + * @param string $siteName * @param string $token + * @param int $expiryInDays */ - public function __construct($currentUser, $user, $token) + public function __construct($currentUser, $invitedUser, $siteName, $token, $expiryInDays) { parent::__construct(); - $this->currentUser = $currentUser; - $this->user = $user; - $this->token = $token; + $this->currentUser = $currentUser; + $this->invitedUser = $invitedUser; + $this->token = $token; + $this->expiryInDays = $expiryInDays; + $this->siteName = $siteName; $this->setUpEmail(); } @@ -49,7 +59,7 @@ class UserInviteEmail extends Mail private function setUpEmail() { $this->setDefaultFromPiwik(); - $this->addTo($this->user['email']); + $this->addTo($this->invitedUser['email']); $this->setSubject($this->getDefaultSubject()); $this->addReplyTo($this->getFrom(), $this->getFromName()); $this->setWrappedHtmlBody($this->getDefaultBodyView()); @@ -57,28 +67,32 @@ class UserInviteEmail extends Mail protected function getDefaultSubject() { - return Piwik::translate('CoreAdminHome_UserInviteSubject', - [$this->currentUser, $this->user['login']]); + return Piwik::translate( + 'CoreAdminHome_UserInviteSubject', + [$this->currentUser, $this->siteName] + ); } private function getDefaultSubjectWithStyle() { - return Piwik::translate('CoreAdminHome_UserInviteSubject', - ["<strong>" . $this->currentUser . "</strong>", "<strong>" . $this->user['login'] . "</strong>"]); + return Piwik::translate( + 'CoreAdminHome_UserInviteSubject', + ['<strong>' . $this->currentUser . '</strong>', '<strong>' . $this->siteName . '</strong>'] + ); } protected function getDefaultBodyView() { $view = new View('@UsersManager/_userInviteEmail.twig'); - $view->login = $this->user['login']; - $view->emailAddress = $this->user['email']; + $view->login = $this->invitedUser['login']; + $view->emailAddress = $this->invitedUser['email']; $view->token = $this->token; // content line for email body $view->content = $this->getDefaultSubjectWithStyle(); //notes for email footer - $view->notes = Piwik::translate('CoreAdminHome_UserInviteNotes', [$this->user['login'], $this->currentUser]); + $view->notes = Piwik::translate('CoreAdminHome_UserInviteNotes', [$this->currentUser, $this->expiryInDays]); return $view; } }
\ No newline at end of file diff --git a/plugins/UsersManager/Model.php b/plugins/UsersManager/Model.php index 362491760e..873dbb12fa 100644 --- a/plugins/UsersManager/Model.php +++ b/plugins/UsersManager/Model.php @@ -264,6 +264,25 @@ class Model return hash(self::TOKEN_HASH_ALGO, $tokenAuth . $salt); } + public function generateRandomInviteToken() + { + $count = 0; + + do { + $token = $this->generateTokenAuth(); + + $count++; + if ($count > 20) { + // something seems wrong as the odds of that happening is basically 0. Only catching it to prevent + // endless loop in case there is some bug somewhere + throw new \Exception('Failed to generate token'); + } + + } while ($this->getUserByInviteToken($token)); + + return $token; + } + public function generateRandomTokenAuth() { $count = 0; @@ -369,6 +388,14 @@ class Model $expiredSince); } + public function getExpiredInvites($expiredSince) + { + $db = $this->getDb(); + + return $db->fetchAll("SELECT * FROM " . $this->userTable . " WHERE `invite_expired_at` is not null and invite_expired_at < ?", + $expiredSince); + } + public function checkUserHasUnexpiredToken($login) { $db = $this->getDb(); @@ -378,7 +405,6 @@ class Model $bind); } - public function deleteAllTokensForUser($login) { $db = $this->getDb(); @@ -465,6 +491,16 @@ class Model return $db->fetchRow("SELECT * FROM " . $this->userTable . " WHERE email = ?", $userEmail); } + + public function getUserByInviteToken($tokenAuth) + { + $token = $this->hashTokenAuth($tokenAuth); + if (!empty($token)) { + $db = $this->getDb(); + return $db->fetchRow("SELECT * FROM " . $this->userTable . " WHERE `invite_token` = ?", $token); + } + } + public function getUserByTokenAuth($tokenAuth) { if ($tokenAuth === 'anonymous') { @@ -478,7 +514,13 @@ class Model } } - public function addUser($userLogin, $hashedPassword, $email, $dateRegistered, $inviteStatus = null) + /** + * @param $userLogin + * @param $hashedPassword + * @param $email + * @param $dateRegistered + */ + public function addUser($userLogin, $hashedPassword, $email, $dateRegistered) { $user = array( 'login' => $userLogin, @@ -487,17 +529,20 @@ class Model 'date_registered' => $dateRegistered, 'superuser_access' => 0, 'ts_password_modified' => Date::now()->getDatetime(), - 'idchange_last_viewed' => null + 'idchange_last_viewed' => null, + 'invited_by' => null, ); - - if ($inviteStatus) { - $user['invite_status'] = 'pending'; - } - $db = $this->getDb(); $db->insert($this->userTable, $user); - return $user; + } + + public function attachInviteToken($userLogin, $token, $expiryInDays = 7) + { + $this->updateUserFields($userLogin, [ + 'invite_token' => $this->hashTokenAuth($token), + 'invite_expired_at' => Date::now()->addDay($expiryInDays)->getDatetime() + ]); } public function setSuperUserAccess($userLogin, $hasSuperUserAccess) @@ -593,6 +638,13 @@ class Model } } + public function deleteUser($userLogin): void + { + $this->deleteUserOnly($userLogin); + $this->deleteUserOptions($userLogin); + $this->deleteUserAccess($userLogin); + } + /** * @param string $userLogin */ @@ -640,23 +692,6 @@ class Model return Db::get(); } - public function getUserLoginsMatching($idSite = null, $pattern = null, $access = null, $logins = null) - { - $filter = new UserTableFilter($access, $idSite, $pattern, $logins); - - list($joins, $bind) = $filter->getJoins('u'); - list($where, $whereBind) = $filter->getWhere(); - - $bind = array_merge($bind, $whereBind); - - $sql = 'SELECT u.login FROM ' . $this->userTable . " u $joins $where"; - - $db = $this->getDb(); - - $result = $db->fetchAll($sql, $bind); - $result = array_column($result, 'login'); - return $result; - } /** * Returns all users and their access to `$idSite`. @@ -675,9 +710,10 @@ class Model $offset = null, $pattern = null, $access = null, + $status = null, $logins = null ) { - $filter = new UserTableFilter($access, $idSite, $pattern, $logins); + $filter = new UserTableFilter($access, $idSite, $pattern, $status, $logins); list($joins, $bind) = $filter->getJoins('u'); list($where, $whereBind) = $filter->getWhere(); @@ -735,12 +771,12 @@ class Model return $logins; } - public function getPendingUser($userLogin) + public function isPendingUser(string $userLogin): bool { $db = $this->getDb(); - $sql = "SELECT count(*) FROM " . $this->userTable . " WHERE login = ? and invite_status not like ?"; - $bind = [$userLogin, 'accept']; - return $db->fetchOne($sql, $bind); + $sql = "SELECT count(*) FROM " . $this->userTable . " WHERE (login = ? or email = ?) and invite_token is not null"; + $bind = [$userLogin, $userLogin]; + $count = (int) $db->fetchOne($sql, $bind); + return $count > 0; } - } diff --git a/plugins/UsersManager/Repository/UserRepository.php b/plugins/UsersManager/Repository/UserRepository.php index 51dd49636b..e806211abc 100644 --- a/plugins/UsersManager/Repository/UserRepository.php +++ b/plugins/UsersManager/Repository/UserRepository.php @@ -16,18 +16,26 @@ use Piwik\Plugins\UsersManager\UserAccessFilter; use Piwik\Plugins\UsersManager\UsersManager; use Piwik\Plugins\UsersManager\Validators\Email; use Piwik\Plugins\UsersManager\Validators\Login; +use Piwik\Site; use Piwik\Validators\BaseValidator; use Piwik\Validators\IdSite; use Piwik\Plugin; - class UserRepository { - + /** + * @var Model + */ protected $model; + /** + * @var UserAccessFilter + */ protected $filter; + /** + * @var Password + */ protected $password; public function __construct(Model $model, UserAccessFilter $filter, Password $password) @@ -37,36 +45,35 @@ class UserRepository $this->password = $password; } - - public function index($userLogin, $pending) - { - Piwik::checkUserHasSuperUserAccessOrIsTheUser($userLogin); - $this->checkUserExists($userLogin); - - $user = $this->model->getUser($userLogin, $pending); - - $user = $this->filter->filterUser($user); - return $this->enrichUser($user); - } - - public function create($userLogin, $email, $initialIdSite, $password = '', $_isPasswordHashed = false) - { - $this->validateAccess(); + /** + * @param string $userLogin + * @param string $email + * @param int $initialIdSite + * @param string $password + * @param bool $isPasswordHashed + * @throws \Exception + */ + public function create( + string $userLogin, + string $email, + ?int $initialIdSite = null, + string $password = '', + bool $isPasswordHashed = false + ): void { if (!Piwik::hasUserSuperUserAccess()) { if (empty($initialIdSite)) { throw new \Exception(Piwik::translate("UsersManager_AddUserNoInitialAccessError")); } - // check if the site exist + // check if the site exists BaseValidator::check('siteId', $initialIdSite, [new IdSite()]); Piwik::checkUserHasAdminAccess($initialIdSite); } - //validate info - BaseValidator::check('userLogin', $userLogin, [new Login(true)]); - BaseValidator::check('email', $email, [new Email(true)]); + BaseValidator::check(Piwik::translate('General_Username'), $userLogin, [new Login(true)]); + BaseValidator::check(Piwik::translate('Installation_Email'), $email, [new Email(true)]); if (!empty($password)) { - if (!$_isPasswordHashed) { + if (!$isPasswordHashed) { $passwordTransformed = UsersManager::getPasswordHash($password); } else { $passwordTransformed = $password; @@ -74,67 +81,69 @@ class UserRepository $password = $this->password->hash($passwordTransformed); } - //insert user into database. - $this->model->addUser($userLogin, $password, $email, Date::now()->getDatetime(), empty($password)); - - /** - * Triggered after a new user is invited. - * - * @param string $userLogin The new user's details handle. - */ - Piwik::postEvent('UsersManager.inviteUser.end', array($userLogin, $email)); + $this->model->addUser($userLogin, $password, $email, Date::now()->getDatetime()); if ($initialIdSite) { API::getInstance()->setUserAccess($userLogin, 'view', $initialIdSite); } + + $this->sendUserCreationNotification($userLogin); } - public function sendNewUserEmails($userLogin, $expired = 7, $newUser = true) + public function inviteUser(string $userLogin, string $email, ?int $initialIdSite = null, $expiryInDays = null): void { + $this->create($userLogin, $email, $initialIdSite); + $this->model->updateUserFields($userLogin, ['invited_by' => Piwik::getCurrentUserLogin()]); + $user = $this->model->getUser($userLogin); + $generatedToken = $this->model->generateRandomInviteToken(); + $this->model->attachInviteToken($userLogin, $generatedToken, $expiryInDays); + $this->sendInvitationEmail($user, $generatedToken, $expiryInDays); + } - //send Admin Email - if ($newUser) { - $mail = StaticContainer::getContainer()->make(UserCreatedEmail::class, array( - 'login' => Piwik::getCurrentUserLogin(), - 'emailAddress' => Piwik::getCurrentUserEmail(), - 'userLogin' => $userLogin, - )); - $mail->safeSend(); - } - - - if (!empty($expired)) { - //retrieve user details - $user = API::getInstance()->getUser($userLogin); - - //remove all previous token - $this->model->deleteAllTokensForUser($userLogin); - - //generate Token - $generatedToken = $this->model->generateRandomTokenAuth(); - - //attach token to user - $this->model->addTokenAuth($userLogin, $generatedToken, "Invite Token", Date::now()->getDatetime(), - Date::now()->addDay($expired)->getDatetime()); - + public function reInviteUser(string $userLogin, $expiryInDays = null): void + { + $user = $this->model->getUser($userLogin); + $generatedToken = $this->model->generateRandomInviteToken(); + $this->model->attachInviteToken($userLogin, $generatedToken, $expiryInDays); + $this->sendInvitationEmail($user, $generatedToken, $expiryInDays); + } - // send email - $email = StaticContainer::getContainer()->make(UserInviteEmail::class, array( - 'currentUser' => Piwik::getCurrentUserLogin(), - 'user' => $user, - 'token' => $generatedToken - )); - $email->safeSend(); - } + protected function sendUserCreationNotification(string $createdUserLogin): void + { + $mail = StaticContainer::getContainer()->make(UserCreatedEmail::class, [ + 'login' => Piwik::getCurrentUserLogin(), + 'emailAddress' => Piwik::getCurrentUserEmail(), + 'userLogin' => $createdUserLogin, + ]); + $mail->safeSend(); } - private function validateAccess() + protected function sendInvitationEmail(array $user, string $inviteToken, int $expiryInDays): void { - Piwik::checkUserHasSomeAdminAccess(); - UsersManager::dieIfUsersAdminIsDisabled(); + $site = $this->model->getSitesAccessFromUser($user['login']); + + if (isset($site[0])) { + $siteName = Site::getNameFor($site[0]['site']); + } else { + $siteName = "Default Site"; + } + + $email = StaticContainer::getContainer()->make(UserInviteEmail::class, [ + 'currentUser' => Piwik::getCurrentUserLogin(), + 'invitedUser' => $user, + 'siteName' => $siteName, + 'token' => $inviteToken, + 'expiryInDays' => $expiryInDays + ]); + $email->safeSend(); } - public function enrichUser($user) + /** + * @param array $user + * @return array + * @throws \Exception + */ + public function enrichUser(array $user): array { if (empty($user)) { return $user; @@ -149,22 +158,28 @@ class UserRepository $user['last_seen'] = Date::getDatetimeFromTimestamp($lastSeen); } + $user['invite_status'] = 'active'; + + if (!empty($user['invite_expired_at'])) { + $inviteExpireAt = Date::factory($user['invite_expired_at']); + // if token expired + if (Date::now()->isLater($inviteExpireAt)) { + $user['invite_status'] = 'expired'; + } + // if token not expired + if (Date::now()->isEarlier($inviteExpireAt)) { + $dayLeft = floor(Date::secondsToDays($inviteExpireAt->getTimestamp() - Date::now()->getTimestamp())); + $user['invite_status'] = $dayLeft; + } + } + if (Piwik::hasUserSuperUserAccess()) { $user['uses_2fa'] = !empty($user['twofactor_secret']) && $this->isTwoFactorAuthPluginEnabled(); unset($user['twofactor_secret']); - if (!empty($user['invite_status']) && $user['invite_status'] === 'pending') { - $validToken = $this->model->checkUserHasUnexpiredToken($user['login']); - if (!$validToken) { - $user['invite_status'] = 'expired'; - } - } - if (empty($user['invite_status'])) { - $user['invite_status'] = 'accept'; - } return $user; } - $newUser = array('login' => $user['login']); + $newUser = ['login' => $user['login']]; if ($user['login'] === Piwik::getCurrentUserLogin() || !empty($user['superuser_access'])) { $newUser['email'] = $user['email']; @@ -184,11 +199,20 @@ class UserRepository if (isset($user['last_seen'])) { $newUser['last_seen'] = $user['last_seen']; } + $newUser['invite_status'] = $user['invite_status']; + if (isset($user['invited_by'])) { + $newUser['invited_by'] = $user['invited_by']; + } return $newUser; } - public function enrichUsers($users) + /** + * @param array $users + * @return mixed + * @throws \Exception + */ + public function enrichUsers(array $users): array { if (!empty($users)) { foreach ($users as $index => $user) { @@ -198,7 +222,11 @@ class UserRepository return $users; } - public function enrichUsersWithLastSeen($users) + /** + * @param array $users + * @return mixed + */ + public function enrichUsersWithLastSeen(array $users): array { $formatter = new Formatter(); @@ -212,14 +240,11 @@ class UserRepository return $users; } - - private function isTwoFactorAuthPluginEnabled() + private function isTwoFactorAuthPluginEnabled(): bool { if (!isset($this->twoFaPluginActivated)) { $this->twoFaPluginActivated = Plugin\Manager::getInstance()->isPluginActivated('TwoFactorAuth'); } return $this->twoFaPluginActivated; } - - -}
\ No newline at end of file +} diff --git a/plugins/UsersManager/Sql/UserTableFilter.php b/plugins/UsersManager/Sql/UserTableFilter.php index 4743d17755..84d259639d 100644 --- a/plugins/UsersManager/Sql/UserTableFilter.php +++ b/plugins/UsersManager/Sql/UserTableFilter.php @@ -30,15 +30,21 @@ class UserTableFilter private $filterSearch; /** + * @var string + */ + private $filterStatus; + + /** * @var string[] */ private $logins; - public function __construct($filterByRole, $filterByRoleSite, $filterSearch, $logins = null) + public function __construct($filterByRole, $filterByRoleSite, $filterSearch, $filterStatus, $logins = null) { $this->filterByRole = $filterByRole; $this->filterByRoleSite = $filterByRoleSite; $this->filterSearch = $filterSearch; + $this->filterStatus = $filterStatus; $this->logins = $logins; if (isset($this->filterByRole) && !isset($this->filterByRoleSite)) { @@ -47,7 +53,7 @@ class UserTableFilter // can only filter by superuser if current user is a superuser if ($this->filterByRole == 'superuser' - && !Piwik::hasUserSuperUserAccess() + && !Piwik::hasUserSuperUserAccess() ) { $this->filterByRole = null; } @@ -78,6 +84,28 @@ class UserTableFilter $bind = array_merge($bind, ['%' . $this->filterSearch . '%', '%' . $this->filterSearch . '%']); } + if ($this->filterStatus) { + if ($this->filterStatus === 'active') { + $conditions[] = '(u.invite_token is NULL and u.invite_expired_at is NULL)'; + } + if ($this->filterStatus === 'pending') { + $conditions[] = '(u.invite_token is not NULL and u.invite_expired_at > DATE(Now()))'; + // Pending users are only visible for super user or the user, who invited the user + if (!Piwik::hasUserSuperUserAccess()) { + $conditions[] = 'u.invited_by = ?'; + $bind[] = Piwik::getCurrentUserLogin(); + } + } + if ($this->filterStatus === 'expired') { + $conditions[] = '(u.invite_token is not NULL and u.invite_expired_at < DATE(Now()))'; + // Expired users are only visible for super user or the user, who invited the user + if (!Piwik::hasUserSuperUserAccess()) { + $conditions[] = 'u.invited_by = ?'; + $bind[] = Piwik::getCurrentUserLogin(); + } + } + } + if ($this->logins !== null) { $logins = array_map('json_encode', $this->logins); $conditions[] = 'u.login IN (' . implode(',', $logins) . ')'; diff --git a/plugins/UsersManager/Tasks.php b/plugins/UsersManager/Tasks.php index 41484fe0c9..d8842d9c4d 100644 --- a/plugins/UsersManager/Tasks.php +++ b/plugins/UsersManager/Tasks.php @@ -1,10 +1,12 @@ <?php + /** * Matomo - free/libre analytics platform * * @link https://matomo.org * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later */ + namespace Piwik\Plugins\UsersManager; use Piwik\Access; @@ -32,12 +34,29 @@ class Tasks extends \Piwik\Plugin\Tasks { $this->daily("cleanupExpiredTokens"); $this->daily("setUserDefaultReportPreference"); + $this->daily("cleanUpExpiredInvites"); } - public function cleanupExpiredTokens() { + public function cleanupExpiredTokens() + { $this->usersModel->deleteExpiredTokens(Date::now()->getDatetime()); } + public function cleanUpExpiredInvites() + { + // Expired invites will be removed after 3 days, so there's a chance to resend an invite before it's removed. + + $expiredInvites = $this->usersModel->getExpiredInvites(Date::now()->subDay(3)->getDatetime()); + + foreach ($expiredInvites as $expiredInvite) { + try { + $this->usersModel->deleteUser($expiredInvite['login']); + } catch (\Exception $e) { + // ignore possible errors thrown during delete user event + } + } + } + public function setUserDefaultReportPreference() { // We initialize the default report user preference for each user (if it hasn't been inited before) for performance, @@ -46,7 +65,7 @@ class Tasks extends \Piwik\Plugin\Tasks $usersModel = $this->usersModel; $usersManagerApi = $this->usersManagerApi; Access::getInstance()->doAsSuperUser(function () use ($usersModel, $usersManagerApi) { - $allUsers = $usersModel->getUsers(array()); + $allUsers = $usersModel->getUsers([]); foreach ($allUsers as $user) { $usersManagerApi->initUserPreferenceWithDefault($user['login'], API::PREFERENCE_DEFAULT_REPORT); } diff --git a/plugins/UsersManager/UserAccessFilter.php b/plugins/UsersManager/UserAccessFilter.php index 9378b8a3d1..f0391138ce 100644 --- a/plugins/UsersManager/UserAccessFilter.php +++ b/plugins/UsersManager/UserAccessFilter.php @@ -108,7 +108,8 @@ class UserAccessFilter } return array_values(array_filter($users, function ($user) { - return $this->isNonSuperUserAllowedToSeeThisLogin($user['login']); + $isPendingVisible = empty($user['invite_token']) || $this->isOwnLogin($user['invited_by']); + return $isPendingVisible && $this->isNonSuperUserAllowedToSeeThisLogin($user['login']); })); } diff --git a/plugins/UsersManager/UsersManager.php b/plugins/UsersManager/UsersManager.php index 5403dd6645..16fc1aedf9 100644 --- a/plugins/UsersManager/UsersManager.php +++ b/plugins/UsersManager/UsersManager.php @@ -1,4 +1,5 @@ <?php + /** * Matomo - free/libre analytics platform * @@ -6,6 +7,7 @@ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later * */ + namespace Piwik\Plugins\UsersManager; use Exception; @@ -32,19 +34,19 @@ class UsersManager extends \Piwik\Plugin */ public function registerEvents() { - return array( - 'AssetManager.getStylesheetFiles' => 'getStylesheetFiles', - 'SitesManager.deleteSite.end' => 'deleteSite', - 'Tracker.Cache.getSiteAttributes' => 'recordAdminUsersInCache', - 'Translate.getClientSideTranslationKeys' => 'getClientSideTranslationKeys', - 'Platform.initialized' => 'onPlatformInitialized', - 'System.addSystemSummaryItems' => 'addSystemSummaryItems', - ); + return [ + 'AssetManager.getStylesheetFiles' => 'getStylesheetFiles', + 'SitesManager.deleteSite.end' => 'deleteSite', + 'Tracker.Cache.getSiteAttributes' => 'recordAdminUsersInCache', + 'Translate.getClientSideTranslationKeys' => 'getClientSideTranslationKeys', + 'Platform.initialized' => 'onPlatformInitialized', + 'System.addSystemSummaryItems' => 'addSystemSummaryItems', + ]; } public static function isUsersAdminEnabled() { - return (bool) Config::getInstance()->General['enable_users_admin']; + return (bool)Config::getInstance()->General['enable_users_admin']; } public static function dieIfUsersAdminIsDisabled() @@ -140,7 +142,7 @@ class UsersManager extends \Piwik\Plugin public static function isValidPasswordString($input) { if (!SettingsPiwik::isUserCredentialsSanityCheckEnabled() - && !empty($input) + && !empty($input) ) { return true; } @@ -171,10 +173,12 @@ class UsersManager extends \Piwik\Plugin Piwik::postEvent('UsersManager.checkPassword', array($password)); if (!self::isValidPasswordString($password)) { - throw new Exception(Piwik::translate('UsersManager_ExceptionInvalidPassword', array(self::PASSWORD_MIN_LENGTH))); + throw new Exception(Piwik::translate('UsersManager_ExceptionInvalidPassword', + array(self::PASSWORD_MIN_LENGTH))); } if (mb_strlen($password) > self::PASSWORD_MAX_LENGTH) { - throw new Exception(Piwik::translate('UsersManager_ExceptionInvalidPasswordTooLong', array(self::PASSWORD_MAX_LENGTH))); + throw new Exception(Piwik::translate('UsersManager_ExceptionInvalidPasswordTooLong', + array(self::PASSWORD_MAX_LENGTH))); } } @@ -331,6 +335,10 @@ class UsersManager extends \Piwik\Plugin $translationKeys[] = 'UsersManager_Pending'; $translationKeys[] = 'UsersManager_Expired'; $translationKeys[] = 'UsersManager_Decline'; - + $translationKeys[] = 'UsersManager_ResendInviteSuccess'; + $translationKeys[] = 'UsersManager_InviteSuccess'; + $translationKeys[] = 'UsersManager_InviteDayLeft'; + $translationKeys[] = 'UsersManager_FilterByStatus'; + $translationKeys[] = 'UsersManager_ExpiredInviteAutomaticallyRemoved'; } } diff --git a/plugins/UsersManager/Validators/Email.php b/plugins/UsersManager/Validators/Email.php index 98ed633747..4539c777bb 100644 --- a/plugins/UsersManager/Validators/Email.php +++ b/plugins/UsersManager/Validators/Email.php @@ -1,4 +1,5 @@ <?php + /** * Matomo - free/libre analytics platform * @@ -15,12 +16,13 @@ use Piwik\Validators\Exception; class Email extends BaseValidator { - private $checkUnique; + private $userLogin; - public function __construct($checkUnique = false) + public function __construct($checkUnique = false, $userLogin = null) { $this->checkUnique = $checkUnique; + $this->userLogin = $userLogin; } public function validate($value) @@ -30,13 +32,12 @@ class Email extends BaseValidator } if (!Piwik::isValidEmailString($value)) { - throw new Exception(Piwik::translate('General_ValidatorErrorNotEmailLike', array($value))); + throw new Exception(Piwik::translate('General_ValidatorErrorNotEmailLike', [$value])); } if ($this->checkUnique) { $this->isUnique($value); } - } /** @@ -46,13 +47,20 @@ class Email extends BaseValidator */ private function isUnique($email) { - if (APIUsersManager::getInstance()->userExists($email)) { - throw new Exception(Piwik::translate('UsersManager_ExceptionLoginExists', $email)); + if (APIUsersManager::getInstance()->userEmailExists($email)) { + throw new Exception(Piwik::translate('UsersManager_ExceptionEmailExists', $email)); } - if (APIUsersManager::getInstance()->userEmailExists($email)) { - throw new Exception(Piwik::translate('UsersManager_ExceptionLoginExistsAsEmail', $email)); + if ($this->userLogin && mb_strtolower($this->userLogin) !== mb_strtolower($email) && APIUsersManager::getInstance()->userExists($email)) { + throw new Exception(Piwik::translate('UsersManager_ExceptionEmailExistsAsLogin', $email)); + } + + if (!$this->userLogin && APIUsersManager::getInstance()->userExists($email)) { + throw new Exception(Piwik::translate('UsersManager_ExceptionEmailExistsAsLogin', $email)); } - } + if (!Piwik::isValidEmailString($email)) { + throw new Exception(Piwik::translate('UsersManager_ExceptionInvalidEmail')); + } + } } diff --git a/plugins/UsersManager/Validators/Login.php b/plugins/UsersManager/Validators/Login.php index 7e3e19cda5..ad97537c0d 100644 --- a/plugins/UsersManager/Validators/Login.php +++ b/plugins/UsersManager/Validators/Login.php @@ -1,4 +1,5 @@ <?php + /** * Matomo - free/libre analytics platform * @@ -15,7 +16,6 @@ use Piwik\Plugins\UsersManager\API as APIUsersManager; use Piwik\Validators\BaseValidator; use Piwik\Validators\Exception; - class Login extends BaseValidator { const loginMinimumLength = 2; @@ -30,19 +30,23 @@ class Login extends BaseValidator public function validate($value) { - if (!SettingsPiwik::isUserCredentialsSanityCheckEnabled() - && !empty($value) + if ( + !SettingsPiwik::isUserCredentialsSanityCheckEnabled() + && !empty($value) ) { return; } $l = strlen($value); - if (!($l >= self::loginMinimumLength - && $l <= self::loginMaximumLength - && (preg_match('/^[A-Za-zÄäÖöÜüß0-9_.@+-]*$/D', $value) > 0)) + if ( + !($l >= self::loginMinimumLength + && $l <= self::loginMaximumLength + && (preg_match('/^[A-Za-zÄäÖöÜüß0-9_.@+-]*$/D', $value) > 0)) ) { - throw new Exception(Piwik::translate('UsersManager_ExceptionInvalidLoginFormat', - array(self::loginMinimumLength, self::loginMaximumLength))); + throw new Exception(Piwik::translate( + 'UsersManager_ExceptionInvalidLoginFormat', + [self::loginMinimumLength, self::loginMaximumLength] + )); } if ($this->checkUnique) { @@ -65,4 +69,4 @@ class Login extends BaseValidator throw new Exception(Piwik::translate('UsersManager_ExceptionLoginExistsAsEmail', $login)); } } -}
\ No newline at end of file +} diff --git a/plugins/UsersManager/lang/en.json b/plugins/UsersManager/lang/en.json index a4fa908773..1e23b14686 100644 --- a/plugins/UsersManager/lang/en.json +++ b/plugins/UsersManager/lang/en.json @@ -187,12 +187,18 @@ "NewsletterSignupFailureMessage": "Whoops, something went wrong. We weren't able to sign you up for the newsletter.", "NewsletterSignupSuccessMessage": "Super, you're all signed up! We'll be in touch soon.", "FirstWebsitePermission": "First website permission", - "InviteSuccessNotification": "The invited User will receive an email to accept the invite, the invite valid for %1$s days, you can also resend and delete the invite in the user management page.", + "InviteSuccessNotification": "The invited user will receive an email to accept the invite. This invite is valid for %1$s days. You can also resend and delete the invite on the user management page.", "ResendInviteConfirmSingle": "Are you sure you want to resend invitation to %1$s?", "Status": "Status", "Pending": "Pending", "Active": "Active", - "Expired": "Invite Expired", - "Decline": "Invite Declined" + "Expired": "Invite expired", + "Decline": "Invite declined", + "ResendInviteSuccess": "Success! The invite has been resent to user %s", + "InviteSuccess": "Success! The invite has been sent.", + "InviteDayLeft": "Expires in %s days", + "FilterByStatus": "Filter by status", + "ExceptionResendInviteDenied": "Resending an invite is only allowed to the user who invited %s or any super user.", + "ExpiredInviteAutomaticallyRemoved": "Expired invites will be automatically deleted after %1$s days." } } diff --git a/plugins/UsersManager/templates/index.twig b/plugins/UsersManager/templates/index.twig index 82237074a1..fc6c0057f5 100644 --- a/plugins/UsersManager/templates/index.twig +++ b/plugins/UsersManager/templates/index.twig @@ -10,6 +10,7 @@ current-user-role="'{{ currentUserRole }}'" access-levels="{{ accessLevels|json_encode|e('html_attr') }}" filter-access-levels="{{ filterAccessLevels|json_encode|e('html_attr') }}" + filter-status-levels="{{ statusAccessLevels|json_encode|e('html_attr') }}" > </piwik-users-manager> diff --git a/plugins/UsersManager/tests/Fixtures/ManyUsers.php b/plugins/UsersManager/tests/Fixtures/ManyUsers.php index 2fa2607f4a..66da0384a4 100644 --- a/plugins/UsersManager/tests/Fixtures/ManyUsers.php +++ b/plugins/UsersManager/tests/Fixtures/ManyUsers.php @@ -1,10 +1,12 @@ <?php + /** * Matomo - free/libre analytics platform * * @link https://matomo.org * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later */ + namespace Piwik\Plugins\UsersManager\tests\Fixtures; use Piwik\Date; @@ -28,48 +30,56 @@ class ManyUsers extends Fixture public $siteCopyCount; public $userCopyCount; public $addTextSuffixes; - public $users = array(); - - public $baseUsers = array( - 'login1' => array('superuser' => 1), - 'login2' => array('view' => array(3,5), 'admin' => array(1,2,6)), - 'login3' => array('view' => array(), 'admin' => array()), // no access to any site - 'login4' => array('view' => array(6), 'admin' => array()), // only access to one with view - 'login5' => array('view' => array(), 'admin' => array(3)), // only access to one with admin - 'login6' => array('view' => array(), 'admin' => array(6,3)), // access to a couple of sites with admin - 'login7' => array('view' => array(2,1,6,3), 'admin' => array()), // access to a couple of sites with view - 'login8' => array('view' => array(4,7), 'admin' => array(2,5)), // access to a couple of sites with admin and view - 'login9' => array('view' => array(5,6), 'admin' => array(8,9)), - 'login10' => array('superuser' => 1) - ); - - public $pendingUser = array( - 'login'=>'000pendingUser1', - 'email'=>'pendinguser1light@example.com' - ); + public $users = []; + + public $baseUsers = [ + 'login1' => ['superuser' => 1], + 'login2' => ['view' => [3, 5], 'admin' => [1, 2, 6]], + 'login3' => ['view' => [], 'admin' => []], // no access to any site + 'login4' => ['view' => [6], 'admin' => []], // only access to one with view + 'login5' => ['view' => [], 'admin' => [3]], // only access to one with admin + 'login6' => ['view' => [], 'admin' => [6, 3]], // access to a couple of sites with admin + 'login7' => ['view' => [2, 1, 6, 3], 'admin' => []], // access to a couple of sites with view + 'login8' => ['view' => [4, 7], 'admin' => [2, 5]], // access to a couple of sites with admin and view + 'login9' => ['view' => [5, 6], 'admin' => [8, 9]], + 'login10' => ['superuser' => 1] + ]; + + public $pendingUser = [ + 'login' => '000pendingUser1', + 'email' => 'pendinguser1light@example.com' + ]; + + public $pendingUser2 = [ + 'login' => 'zzzpendingUser2', + 'email' => 'zpendinguser2light@example.com' + ]; public $baseSites = [ - 'sleep', - 'escapesequence', - 'hunter', - 'transistor', - 'wicket', - 'relentless', - 'scarecrow', - 'nova', - 'resilience', - 'tricks', + 'sleep', + 'escapesequence', + 'hunter', + 'transistor', + 'wicket', + 'relentless', + 'scarecrow', + 'nova', + 'resilience', + 'tricks', ]; public $textAdditions = [ - 'life', - 'light', - 'flight', - 'conchords', + 'life', + 'light', + 'flight', + 'conchords', ]; - public function __construct($userCopyCount = self::USER_COUNT, $siteCopyCount = self::SITE_COUNT, $addTextSuffixes = true) - { + public function __construct( + $userCopyCount = self::USER_COUNT, + $siteCopyCount = self::SITE_COUNT, + $addTextSuffixes = true + ) { $this->userCopyCount = $userCopyCount; $this->siteCopyCount = $siteCopyCount; $this->addTextSuffixes = $addTextSuffixes; @@ -105,7 +115,7 @@ class ManyUsers extends Fixture $api = API::getInstance(); // add a pending invite user - $api->inviteUser($this->pendingUser['login'], $this->pendingUser['email'],1); + $api->inviteUser($this->pendingUser['login'], $this->pendingUser['email'], 1); for ($i = 0; $i != $this->userCopyCount; ++$i) { $addToEmail = $i % 2 == 0; @@ -121,7 +131,7 @@ class ManyUsers extends Fixture } $email = $login . '@example.com'; - if ($this->addTextSuffixes &&$addToEmail) { + if ($this->addTextSuffixes && $addToEmail) { $email = $login . $textAddition . '@example.com'; } @@ -147,5 +157,9 @@ class ManyUsers extends Fixture $this->users[$login]['token'] = $tokenAuth; } } + + //add admin view pending user + $api->inviteUser($this->pendingUser2['login'], $this->pendingUser2['email'], 1); + $model->updateUserFields($this->pendingUser2['login'], ['invited_by' => 'login2']); } -}
\ No newline at end of file +} diff --git a/plugins/UsersManager/tests/Integration/APITest.php b/plugins/UsersManager/tests/Integration/APITest.php index 20a0c3a046..a6c8454d4d 100644 --- a/plugins/UsersManager/tests/Integration/APITest.php +++ b/plugins/UsersManager/tests/Integration/APITest.php @@ -1,4 +1,5 @@ <?php + /** * Matomo - free/libre analytics platform * @@ -6,13 +7,16 @@ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later */ -namespace Piwik\Plugins\UsersManager\tests; +namespace Piwik\Plugins\UsersManager\tests\Integration; use Piwik\Access\Role\View; use Piwik\Access\Role\Write; use Piwik\Auth\Password; use Piwik\Config; +use Piwik\Date; +use Piwik\EventDispatcher; use Piwik\Mail; +use Piwik\NoAccessException; use Piwik\Option; use Piwik\Piwik; use Piwik\Plugins\SitesManager\API as SitesManagerAPI; @@ -52,9 +56,9 @@ class TestCap1 extends Capability public function getIncludedInRoles(): array { - return array( - Admin::ID - ); + return [ + Admin::ID + ]; } } @@ -84,9 +88,10 @@ class TestCap2 extends Capability public function getIncludedInRoles(): array { - return array( - Write::ID, Admin::ID - ); + return [ + Write::ID, + Admin::ID + ]; } } @@ -116,7 +121,7 @@ class TestCap3 extends Capability public function getIncludedInRoles(): array { - return array(Admin::ID); + return [Admin::ID]; } } @@ -174,10 +179,10 @@ class APITest extends IntegrationTestCase Piwik::addAction('UsersManager.removeSiteAccess', function ($login, $idSites) use (&$eventTriggered, $self) { $eventTriggered = true; $self->assertEquals($self->login, $login); - $self->assertEquals(array(1, 2), $idSites); + $self->assertEquals([1, 2], $idSites); }); - $this->api->setUserAccess($this->login, 'noaccess', array(1, 2)); + $this->api->setUserAccess($this->login, 'noaccess', [1, 2]); $this->assertTrue($eventTriggered, 'UsersManager.removeSiteAccess event was not triggered'); } @@ -189,20 +194,20 @@ class APITest extends IntegrationTestCase $eventTriggered = true; }); - $this->api->setUserAccess($this->login, 'admin', array(1, 2)); + $this->api->setUserAccess($this->login, 'admin', [1, 2]); $this->assertFalse($eventTriggered, 'UsersManager.removeSiteAccess event was triggered but should not'); } public function test_getAllUsersPreferences_isEmpty_whenNoPreference() { - $preferences = $this->api->getAllUsersPreferences(array('preferenceName')); + $preferences = $this->api->getAllUsersPreferences(['preferenceName']); $this->assertEmpty($preferences); } public function test_getAllUsersPreferences_isEmpty_whenNoPreferenceAndMultipleRequested() { - $preferences = $this->api->getAllUsersPreferences(array('preferenceName', 'randomDoesNotExist')); + $preferences = $this->api->getAllUsersPreferences(['preferenceName', 'randomDoesNotExist']); $this->assertEmpty($preferences); } @@ -261,16 +266,20 @@ class APITest extends IntegrationTestCase $this->api->setUserPreference($user3, API::PREFERENCE_DEFAULT_REPORT_DATE, 'otherPreferenceVALUE'); $this->api->setUserPreference($user3, 'RandomNOTREQUESTED', 'RandomNOTREQUESTED'); - $expected = array( - $user2 => array( - API::PREFERENCE_DEFAULT_REPORT => 'valueForUser2' - ), - $user3 => array( - API::PREFERENCE_DEFAULT_REPORT => 'valueForUser3', - API::PREFERENCE_DEFAULT_REPORT_DATE => 'otherPreferenceVALUE', - ), - ); - $result = $this->api->getAllUsersPreferences(array(API::PREFERENCE_DEFAULT_REPORT, API::PREFERENCE_DEFAULT_REPORT_DATE, 'randomDoesNotExist')); + $expected = [ + $user2 => [ + API::PREFERENCE_DEFAULT_REPORT => 'valueForUser2' + ], + $user3 => [ + API::PREFERENCE_DEFAULT_REPORT => 'valueForUser3', + API::PREFERENCE_DEFAULT_REPORT_DATE => 'otherPreferenceVALUE', + ], + ]; + $result = $this->api->getAllUsersPreferences([ + API::PREFERENCE_DEFAULT_REPORT, + API::PREFERENCE_DEFAULT_REPORT_DATE, + 'randomDoesNotExist' + ]); $this->assertSame($expected, $result); } @@ -282,12 +291,12 @@ class APITest extends IntegrationTestCase $this->api->setUserPreference($user2, API::PREFERENCE_DEFAULT_REPORT, 'valueForUser2'); $this->api->setUserPreference($user2, API::PREFERENCE_DEFAULT_REPORT_DATE, 'RandomNOTREQUESTED'); - $expected = array( - $user2 => array( - API::PREFERENCE_DEFAULT_REPORT => 'valueForUser2' - ), - ); - $result = $this->api->getAllUsersPreferences(array(API::PREFERENCE_DEFAULT_REPORT, 'randomDoesNotExist')); + $expected = [ + $user2 => [ + API::PREFERENCE_DEFAULT_REPORT => 'valueForUser2' + ], + ]; + $result = $this->api->getAllUsersPreferences([API::PREFERENCE_DEFAULT_REPORT, 'randomDoesNotExist']); $this->assertSame($expected, $result); } @@ -310,7 +319,7 @@ class APITest extends IntegrationTestCase $identity = FakeAccess::$identity; FakeAccess::$identity = $this->login; // ensure password will be checked against this user - $this->api->updateUser($this->login, 'newPassword', 'email@example.com', false, $this->password); + $this->api->updateUser($this->login, 'newPassword', 'email@example.com', false, $this->password); FakeAccess::$identity = $identity; $model = new Model(); @@ -322,11 +331,13 @@ class APITest extends IntegrationTestCase $this->assertTrue($passwordHelper->verify(UsersManager::getPasswordHash('newPassword'), $user['password'])); - $subjects = array_map(function (Mail $mail) { return $mail->getSubject(); }, $capturedMails); + $subjects = array_map(function (Mail $mail) { + return $mail->getSubject(); + }, $capturedMails); $this->assertEquals([ - 'UsersManager_EmailChangeNotificationSubject', // sent twice to old email and new - 'UsersManager_EmailChangeNotificationSubject', - 'UsersManager_PasswordChangeNotificationSubject', + 'UsersManager_EmailChangeNotificationSubject', // sent twice to old email and new + 'UsersManager_EmailChangeNotificationSubject', + 'UsersManager_PasswordChangeNotificationSubject', ], $subjects); } @@ -343,7 +354,9 @@ class APITest extends IntegrationTestCase $this->api->updateUser($this->login, 'newPassword2', 'email2@example.com', false, $this->password); FakeAccess::$identity = $identity; - $subjects = array_map(function (Mail $mail) { return $mail->getSubject(); }, $capturedMails); + $subjects = array_map(function (Mail $mail) { + return $mail->getSubject(); + }, $capturedMails); $this->assertEquals([], $subjects); } @@ -384,18 +397,24 @@ class APITest extends IntegrationTestCase $this->expectException(\Exception::class); $this->expectExceptionMessage('UsersManager_ExceptionInvalidPasswordTooLong'); - $this->api->updateUser($this->login, str_pad('foo', UsersManager::PASSWORD_MAX_LENGTH + 1), 'email@example.com', false, $this->password); + $this->api->updateUser( + $this->login, + str_pad('foo', UsersManager::PASSWORD_MAX_LENGTH + 1), + 'email@example.com', + false, + $this->password + ); } public function test_update_user_fails_if_email_exists_as_other_user_username() { $this->expectException(\Exception::class); - $this->expectExceptionMessage('UsersManager_CurrentPasswordNotCorrect'); + $this->expectExceptionMessage('UsersManager_ExceptionEmailExistsAsLogin'); $user2 = 'existed@example.com'; $this->api->addUser($user2, 'password', 'userlogin2@password.de'); - $this->api->updateUser($this->login, $this->password, $user2, false, $this->password); + $this->api->updateUser($this->login, $this->password, $user2, false, $this->password); } public function test_update_can_update_user_email_to_own_username() @@ -414,7 +433,7 @@ class APITest extends IntegrationTestCase public function test_cannot_create_user_if_email_exists_as_username() { $this->expectException(\Exception::class); - $this->expectExceptionMessage('UsersManager_ExceptionLoginExists'); + $this->expectExceptionMessage('UsersManager_ExceptionEmailExistsAsLogin'); $user2 = 'existed@example.com'; $this->api->addUser($user2, 'password', 'email@example.com'); @@ -444,20 +463,20 @@ class APITest extends IntegrationTestCase // super user has admin access for every site $access = $this->api->getSitesAccessFromUser($user2); - $expected = array( - array( - 'site' => 1, - 'access' => 'admin' - ), - array( - 'site' => 2, - 'access' => 'admin' - ), - array( - 'site' => 3, - 'access' => 'admin' - ), - ); + $expected = [ + [ + 'site' => 1, + 'access' => 'admin' + ], + [ + 'site' => 2, + 'access' => 'admin' + ], + [ + 'site' => 3, + 'access' => 'admin' + ], + ]; $this->assertEquals($expected, $access); } @@ -469,7 +488,13 @@ class APITest extends IntegrationTestCase $users = $this->api->getUsersPlusRole(1); $this->cleanUsers($users); $expected = [ - ['login' => 'userLogin2', 'role' => 'view', 'capabilities' => [], 'email' => 'userLogin2@password.de', 'superuser_access' => '0'], + [ + 'login' => 'userLogin2', + 'role' => 'view', + 'capabilities' => [], + 'email' => 'userLogin2@password.de', + 'superuser_access' => '0', + ], ]; $this->assertEquals($expected, $users); } @@ -482,7 +507,13 @@ class APITest extends IntegrationTestCase $users = $this->api->getUsersPlusRole(1, $limit = null, $offset = 1); $this->cleanUsers($users); $expected = [ - ['login' => 'userLogin2', 'role' => 'view', 'capabilities' => [], 'email' => 'userLogin2@password.de', 'superuser_access' => '0'], + [ + 'login' => 'userLogin2', + 'role' => 'view', + 'capabilities' => [], + 'email' => 'userLogin2@password.de', + 'superuser_access' => '0', + ], ]; $this->assertEquals($expected, $users); } @@ -496,7 +527,13 @@ class APITest extends IntegrationTestCase $users = $this->api->getUsersPlusRole(1, null, null, null, 'superuser'); $this->cleanUsers($users); $expected = [ - ['login' => 'userLogin2', 'role' => 'view', 'capabilities' => [], 'email' => 'userLogin2@password.de', 'superuser_access' => '0'], + [ + 'login' => 'userLogin2', + 'role' => 'view', + 'capabilities' => [], + 'email' => 'userLogin2@password.de', + 'superuser_access' => '0', + ], ]; $this->assertEquals($expected, $users); } @@ -512,9 +549,25 @@ class APITest extends IntegrationTestCase $users = $this->api->getUsersPlusRole(1); $this->cleanUsers($users); $expected = [ - ['login' => 'userLogin2', 'role' => 'admin', 'capabilities' => [], 'email' => 'userLogin2@password.de', 'superuser_access' => false], - ['login' => 'userLogin3', 'role' => 'view', 'capabilities' => [], 'superuser_access' => false], - ['login' => 'userLogin4', 'role' => 'admin', 'capabilities' => [], 'superuser_access' => false], + [ + 'login' => 'userLogin2', + 'role' => 'admin', + 'capabilities' => [], + 'email' => 'userLogin2@password.de', + 'superuser_access' => false, + ], + [ + 'login' => 'userLogin3', + 'role' => 'view', + 'capabilities' => [], + 'superuser_access' => false, + ], + [ + 'login' => 'userLogin4', + 'role' => 'admin', + 'capabilities' => [], + 'superuser_access' => false, + ], ]; $this->assertEquals($expected, $users); } @@ -531,10 +584,31 @@ class APITest extends IntegrationTestCase $users = $this->api->getUsersPlusRole(1); $this->cleanUsers($users); $expected = [ - ['login' => 'userLogin2', 'role' => 'admin', 'capabilities' => [], 'email' => 'userLogin2@password.de', 'superuser_access' => false], - ['login' => 'userLogin3', 'role' => 'view', 'capabilities' => [], 'superuser_access' => false], - ['login' => 'userLogin4', 'role' => 'admin', 'capabilities' => [], 'superuser_access' => false], - ['login' => 'userLogin5', 'role' => 'noaccess', 'capabilities' => [], 'superuser_access' => false], + [ + 'login' => 'userLogin2', + 'role' => 'admin', + 'capabilities' => [], + 'email' => 'userLogin2@password.de', + 'superuser_access' => false, + ], + [ + 'login' => 'userLogin3', + 'role' => 'view', + 'capabilities' => [], + 'superuser_access' => false, + ], + [ + 'login' => 'userLogin4', + 'role' => 'admin', + 'capabilities' => [], + 'superuser_access' => false, + ], + [ + 'login' => 'userLogin5', + 'role' => 'noaccess', + 'capabilities' => [], + 'superuser_access' => false, + ], ]; $this->assertEquals($expected, $users); } @@ -550,11 +624,46 @@ class APITest extends IntegrationTestCase $users = $this->api->getUsersPlusRole(1); $this->cleanUsers($users); $expected = [ - ['login' => 'userLogin', 'email' => 'userlogin@password.de', 'superuser_access' => false, 'role' => 'noaccess', 'capabilities' => [], 'uses_2fa' => false], - ['login' => 'userLogin2', 'email' => 'userLogin2@password.de', 'superuser_access' => true, 'role' => 'superuser', 'capabilities' => [], 'uses_2fa' => false], - ['login' => 'userLogin3', 'email' => 'userLogin3@password.de', 'superuser_access' => false, 'role' => 'view', 'capabilities' => [], 'uses_2fa' => false], - ['login' => 'userLogin4', 'email' => 'userLogin4@password.de', 'superuser_access' => true, 'role' => 'superuser', 'capabilities' => [], 'uses_2fa' => false], - ['login' => 'userLogin5', 'email' => 'userLogin5@password.de', 'superuser_access' => false, 'role' => 'noaccess', 'capabilities' => [], 'uses_2fa' => false], + [ + 'login' => 'userLogin', + 'email' => 'userlogin@password.de', + 'superuser_access' => false, + 'role' => 'noaccess', + 'capabilities' => [], + 'uses_2fa' => false, + ], + [ + 'login' => 'userLogin2', + 'email' => 'userLogin2@password.de', + 'superuser_access' => true, + 'role' => 'superuser', + 'capabilities' => [], + 'uses_2fa' => false, + ], + [ + 'login' => 'userLogin3', + 'email' => 'userLogin3@password.de', + 'superuser_access' => false, + 'role' => 'view', + 'capabilities' => [], + 'uses_2fa' => false, + ], + [ + 'login' => 'userLogin4', + 'email' => 'userLogin4@password.de', + 'superuser_access' => true, + 'role' => 'superuser', + 'capabilities' => [], + 'uses_2fa' => false, + ], + [ + 'login' => 'userLogin5', + 'email' => 'userLogin5@password.de', + 'superuser_access' => false, + 'role' => 'noaccess', + 'capabilities' => [], + 'uses_2fa' => false, + ], ]; $this->assertEquals($expected, $users); } @@ -571,8 +680,18 @@ class APITest extends IntegrationTestCase $users = $this->api->getUsersPlusRole(1, null, null, null, 'admin'); $this->cleanUsers($users); $expected = [ - ['login' => 'userLogin2', 'role' => 'admin', 'capabilities' => [], 'email' => 'userLogin2@password.de', 'superuser_access' => false], - ['login' => 'userLogin5', 'role' => 'admin', 'capabilities' => [], 'superuser_access' => false], + [ + 'login' => 'userLogin2', + 'role' => 'admin', + 'capabilities' => [], + 'email' => 'userLogin2@password.de', + 'superuser_access' => false, + ], + ['login' => 'userLogin5', + 'role' => 'admin', + 'capabilities' => [], + 'superuser_access' => false, + ], ]; $this->assertEquals($expected, $users); @@ -580,7 +699,7 @@ class APITest extends IntegrationTestCase $users = $this->api->getUsersPlusRole(1, null, null, null, 'write'); $this->cleanUsers($users); $expected = [ - ['login' => 'userLogin6', 'role' => 'write', 'capabilities' => [], 'superuser_access' => false], + ['login' => 'userLogin6', 'role' => 'write', 'capabilities' => [], 'superuser_access' => false], ]; $this->assertEquals($expected, $users); } @@ -595,9 +714,30 @@ class APITest extends IntegrationTestCase $users = $this->api->getUsersPlusRole(1, null, null, null, 'noaccess'); $this->cleanUsers($users); $expected = [ - ['login' => 'userLogin', 'role' => 'noaccess', 'superuser_access' => false, 'email' => 'userlogin@password.de', 'capabilities' => [], 'uses_2fa' => false], - ['login' => 'userLogin2', 'role' => 'noaccess', 'superuser_access' => false, 'email' => 'userLogin2@password.de', 'capabilities' => [], 'uses_2fa' => false], - ['login' => 'userLogin5', 'role' => 'noaccess', 'superuser_access' => false, 'email' => 'userLogin5@password.de', 'capabilities' => [], 'uses_2fa' => false], + [ + 'login' => 'userLogin', + 'role' => 'noaccess', + 'superuser_access' => false, + 'email' => 'userlogin@password.de', + 'capabilities' => [], + 'uses_2fa' => false, + ], + [ + 'login' => 'userLogin2', + 'role' => 'noaccess', + 'superuser_access' => false, + 'email' => 'userLogin2@password.de', + 'capabilities' => [], + 'uses_2fa' => false, + ], + [ + 'login' => 'userLogin5', + 'role' => 'noaccess', + 'superuser_access' => false, + 'email' => 'userLogin5@password.de', + 'capabilities' => [], + 'uses_2fa' => false, + ], ]; $this->assertEquals($expected, $users); } @@ -615,8 +755,22 @@ class APITest extends IntegrationTestCase $users = $this->api->getUsersPlusRole(1, null, null, null, 'superuser'); $this->cleanUsers($users); $expected = [ - ['login' => 'userLogin2', 'email' => 'userLogin2@password.de', 'superuser_access' => true, 'role' => 'superuser', 'capabilities' => [], 'uses_2fa' => false], - ['login' => 'userLogin4', 'email' => 'userLogin4@password.de', 'superuser_access' => true, 'role' => 'superuser', 'capabilities' => [], 'uses_2fa' => false], + [ + 'login' => 'userLogin2', + 'email' => 'userLogin2@password.de', + 'superuser_access' => true, + 'role' => 'superuser', + 'capabilities' => [], + 'uses_2fa' => false, + ], + [ + 'login' => 'userLogin4', + 'email' => 'userLogin4@password.de', + 'superuser_access' => true, + 'role' => 'superuser', + 'capabilities' => [], + 'uses_2fa' => false, + ], ]; $this->assertEquals($expected, $users); } @@ -632,8 +786,22 @@ class APITest extends IntegrationTestCase $users = $this->api->getUsersPlusRole(1, null, null, 'searchText'); $this->cleanUsers($users); $expected = [ - ['login' => 'searchTextLogin', 'email' => 'someemail@email.com', 'superuser_access' => true, 'role' => 'superuser', 'capabilities' => [], 'uses_2fa' => false], - ['login' => 'userLogin2', 'email' => 'searchTextdef@email.com', 'superuser_access' => false, 'role' => 'view', 'capabilities' => [], 'uses_2fa' => false], + [ + 'login' => 'searchTextLogin', + 'email' => 'someemail@email.com', + 'superuser_access' => true, + 'role' => 'superuser', + 'capabilities' => [], + 'uses_2fa' => false, + ], + [ + 'login' => 'userLogin2', + 'email' => 'searchTextdef@email.com', + 'superuser_access' => false, + 'role' => 'view', + 'capabilities' => [], + 'uses_2fa' => false, + ], ]; $this->assertEquals($expected, $users); } @@ -649,8 +817,22 @@ class APITest extends IntegrationTestCase $users = $this->api->getUsersPlusRole(1, $limit = 2, $offset = 1); $this->cleanUsers($users); $expected = [ - ['login' => 'userLogin', 'email' => 'userlogin@password.de', 'superuser_access' => false, 'role' => 'noaccess', 'capabilities' => [], 'uses_2fa' => false], - ['login' => 'userLogin2', 'email' => 'searchTextdef@email.com', 'superuser_access' => false, 'role' => 'view', 'capabilities' => [], 'uses_2fa' => false], + [ + 'login' => 'userLogin', + 'email' => 'userlogin@password.de', + 'superuser_access' => false, + 'role' => 'noaccess', + 'capabilities' => [], + 'uses_2fa' => false, + ], + [ + 'login' => 'userLogin2', + 'email' => 'searchTextdef@email.com', + 'superuser_access' => false, + 'role' => 'view', + 'capabilities' => [], + 'uses_2fa' => false, + ], ]; $this->assertEquals($expected, $users); } @@ -663,9 +845,9 @@ class APITest extends IntegrationTestCase $access = $this->api->getSitesAccessForUser('userLogin'); $expected = [ - ['idsite' => '1', 'site_name' => 'Piwik test', 'role' => 'admin', 'capabilities' => []], - ['idsite' => '2', 'site_name' => 'Piwik test', 'role' => 'view', 'capabilities' => []], - ['idsite' => '3', 'site_name' => 'Piwik test', 'role' => 'view', 'capabilities' => []], + ['idsite' => '1', 'site_name' => 'Piwik test', 'role' => 'admin', 'capabilities' => []], + ['idsite' => '2', 'site_name' => 'Piwik test', 'role' => 'view', 'capabilities' => []], + ['idsite' => '3', 'site_name' => 'Piwik test', 'role' => 'view', 'capabilities' => []], ]; $this->assertEquals($expected, $access); } @@ -678,8 +860,8 @@ class APITest extends IntegrationTestCase $access = $this->api->getSitesAccessForUser('userLogin', $limit = null, $offset = 1); $expected = [ - ['idsite' => '2', 'site_name' => 'Piwik test', 'role' => 'view', 'capabilities' => []], - ['idsite' => '3', 'site_name' => 'Piwik test', 'role' => 'view', 'capabilities' => []], + ['idsite' => '2', 'site_name' => 'Piwik test', 'role' => 'view', 'capabilities' => []], + ['idsite' => '3', 'site_name' => 'Piwik test', 'role' => 'view', 'capabilities' => []], ]; $this->assertEquals($expected, $access); } @@ -692,8 +874,8 @@ class APITest extends IntegrationTestCase $access = $this->api->getSitesAccessForUser('userLogin', $limit = 2, $offset = 1); $expected = [ - ['idsite' => '2', 'site_name' => 'Piwik test', 'role' => 'view', 'capabilities' => []], - ['idsite' => '3', 'site_name' => 'Piwik test', 'role' => 'view', 'capabilities' => []], + ['idsite' => '2', 'site_name' => 'Piwik test', 'role' => 'view', 'capabilities' => []], + ['idsite' => '3', 'site_name' => 'Piwik test', 'role' => 'view', 'capabilities' => []], ]; $this->assertEquals($expected, $access); } @@ -709,13 +891,26 @@ class APITest extends IntegrationTestCase SitesManagerAPI::getInstance()->updateSite(1, 'searchTerm site'); SitesManagerAPI::getInstance()->updateSite(2, null, ['http://searchTerm.com']); - SitesManagerAPI::getInstance()->updateSite(3, null, null, null, null, null, null, null, null, null, null, 'the searchTerm group'); + SitesManagerAPI::getInstance()->updateSite( + 3, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + 'the searchTerm group' + ); $access = $this->api->getSitesAccessForUser('userLogin', null, null, 'searchTerm'); $expected = [ - ['idsite' => '2', 'site_name' => 'Piwik test', 'role' => 'view', 'capabilities' => []], - ['idsite' => '3', 'site_name' => 'Piwik test', 'role' => 'view', 'capabilities' => []], - ['idsite' => '1', 'site_name' => 'searchTerm site', 'role' => 'admin', 'capabilities' => []], + ['idsite' => '2', 'site_name' => 'Piwik test', 'role' => 'view', 'capabilities' => []], + ['idsite' => '3', 'site_name' => 'Piwik test', 'role' => 'view', 'capabilities' => []], + ['idsite' => '1', 'site_name' => 'searchTerm site', 'role' => 'admin', 'capabilities' => []], ]; $this->assertEquals($expected, $access); } @@ -728,8 +923,8 @@ class APITest extends IntegrationTestCase $access = $this->api->getSitesAccessForUser('userLogin', null, null, null, 'view'); $expected = [ - ['idsite' => '2', 'site_name' => 'Piwik test', 'role' => 'view', 'capabilities' => []], - ['idsite' => '3', 'site_name' => 'Piwik test', 'role' => 'view', 'capabilities' => []], + ['idsite' => '2', 'site_name' => 'Piwik test', 'role' => 'view', 'capabilities' => []], + ['idsite' => '3', 'site_name' => 'Piwik test', 'role' => 'view', 'capabilities' => []], ]; $this->assertEquals($expected, $access); } @@ -745,8 +940,8 @@ class APITest extends IntegrationTestCase $access = $this->api->getSitesAccessForUser('userLogin2', null, null, null, 'view'); $expected = [ - ['idsite' => '1', 'site_name' => 'Piwik test', 'role' => 'view', 'capabilities' => []], - ['idsite' => '2', 'site_name' => 'Piwik test', 'role' => 'view', 'capabilities' => []], + ['idsite' => '1', 'site_name' => 'Piwik test', 'role' => 'view', 'capabilities' => []], + ['idsite' => '2', 'site_name' => 'Piwik test', 'role' => 'view', 'capabilities' => []], ]; $this->assertEquals($expected, $access); } @@ -761,8 +956,8 @@ class APITest extends IntegrationTestCase $access = $this->api->getSitesAccessForUser('userLogin2', null, null, null, 'noaccess'); $expected = [ - ['idsite' => '2', 'site_name' => 'Piwik test', 'role' => 'noaccess', 'capabilities' => []], - ['idsite' => '3', 'site_name' => 'Piwik test', 'role' => 'noaccess', 'capabilities' => []], + ['idsite' => '2', 'site_name' => 'Piwik test', 'role' => 'noaccess', 'capabilities' => []], + ['idsite' => '3', 'site_name' => 'Piwik test', 'role' => 'noaccess', 'capabilities' => []], ]; $this->assertEquals($expected, $access); } @@ -774,8 +969,8 @@ class APITest extends IntegrationTestCase $access = $this->api->getSitesAccessForUser('userLogin2', null, null, null, 'some'); $expected = [ - ['idsite' => '1', 'site_name' => 'Piwik test', 'role' => 'view', 'capabilities' => []], - ['idsite' => '2', 'site_name' => 'Piwik test', 'role' => 'admin', 'capabilities' => []], + ['idsite' => '1', 'site_name' => 'Piwik test', 'role' => 'view', 'capabilities' => []], + ['idsite' => '2', 'site_name' => 'Piwik test', 'role' => 'admin', 'capabilities' => []], ]; $this->assertEquals($expected, $access); } @@ -784,9 +979,9 @@ class APITest extends IntegrationTestCase { $access = $this->api->getSitesAccessForUser('userLogin'); $expected = [ - ['idsite' => '1', 'site_name' => 'Piwik test', 'role' => 'noaccess', 'capabilities' => []], - ['idsite' => '2', 'site_name' => 'Piwik test', 'role' => 'noaccess', 'capabilities' => []], - ['idsite' => '3', 'site_name' => 'Piwik test', 'role' => 'noaccess', 'capabilities' => []], + ['idsite' => '1', 'site_name' => 'Piwik test', 'role' => 'noaccess', 'capabilities' => []], + ['idsite' => '2', 'site_name' => 'Piwik test', 'role' => 'noaccess', 'capabilities' => []], + ['idsite' => '3', 'site_name' => 'Piwik test', 'role' => 'noaccess', 'capabilities' => []], ]; $this->assertEquals($expected, $access); @@ -803,7 +998,7 @@ class APITest extends IntegrationTestCase $this->expectException(\Exception::class); $this->expectExceptionMessage('UsersManager_ExceptionMultipleRoleSet'); - $this->api->setUserAccess($this->login, array('view', 'admin'), array(1)); + $this->api->setUserAccess($this->login, ['view', 'admin'], [1]); } public function test_setUserAccess_NeedsAtLeastOneRole() @@ -811,7 +1006,7 @@ class APITest extends IntegrationTestCase $this->expectException(\Exception::class); $this->expectExceptionMessage('UsersManager_ExceptionNoRoleSet'); - $this->api->setUserAccess($this->login, array(TestCap2::ID), array(1)); + $this->api->setUserAccess($this->login, [TestCap2::ID], [1]); } public function test_setUserAccess_NeedsAtLeastOneRoleAsString() @@ -819,7 +1014,7 @@ class APITest extends IntegrationTestCase $this->expectException(\Exception::class); $this->expectExceptionMessage('UsersManager_ExceptionAccessValues'); - $this->api->setUserAccess($this->login, TestCap2::ID, array(1)); + $this->api->setUserAccess($this->login, TestCap2::ID, [1]); } public function test_setUserAccess_InvalidCapability() @@ -827,7 +1022,7 @@ class APITest extends IntegrationTestCase $this->expectException(\Exception::class); $this->expectExceptionMessage('UsersManager_ExceptionAccessValues'); - $this->api->setUserAccess($this->login, array('admin', 'foobar'), array(1)); + $this->api->setUserAccess($this->login, ['admin', 'foobar'], [1]); } public function test_setUserAccess_NeedsAtLeastOneRoleNoneGiven() @@ -835,7 +1030,7 @@ class APITest extends IntegrationTestCase $this->expectException(\Exception::class); $this->expectExceptionMessage('UsersManager_ExceptionNoRoleSet'); - $this->api->setUserAccess($this->login, array(), array(1)); + $this->api->setUserAccess($this->login, [], [1]); } public function test_setUserAccess_CannotSetAdminToAnonymous() @@ -843,7 +1038,7 @@ class APITest extends IntegrationTestCase $this->expectException(\Exception::class); $this->expectExceptionMessage('UsersManager_ExceptionAnonymousAccessNotPossible'); - $this->api->setUserAccess('anonymous', 'admin', array(1)); + $this->api->setUserAccess('anonymous', 'admin', [1]); } public function test_setUserAccess_CannotSetWriteToAnonymous() @@ -851,7 +1046,7 @@ class APITest extends IntegrationTestCase $this->expectException(\Exception::class); $this->expectExceptionMessage('UsersManager_ExceptionAnonymousAccessNotPossible'); - $this->api->setUserAccess('anonymous', 'write', array(1)); + $this->api->setUserAccess('anonymous', 'write', [1]); } public function test_setUserAccess_UserDoesNotExist() @@ -859,38 +1054,38 @@ class APITest extends IntegrationTestCase $this->expectException(\Exception::class); $this->expectExceptionMessage('UsersManager_ExceptionUserDoesNotExist'); - $this->api->setUserAccess('foobar', Admin::ID, array(1)); + $this->api->setUserAccess('foobar', Admin::ID, [1]); } public function test_setUserAccess_SetRoleAndCapabilities() { - $access = array(TestCap2::ID, View::ID, TestCap3::ID); - $this->api->setUserAccess($this->login, $access, array(1)); + $access = [TestCap2::ID, View::ID, TestCap3::ID]; + $this->api->setUserAccess($this->login, $access, [1]); $access = $this->model->getSitesAccessFromUser($this->login); - $expected = array( - array('site' => '1', 'access' => 'view'), - array('site' => '1', 'access' => TestCap2::ID), - array('site' => '1', 'access' => TestCap3::ID), - ); + $expected = [ + ['site' => '1', 'access' => 'view'], + ['site' => '1', 'access' => TestCap2::ID], + ['site' => '1', 'access' => TestCap3::ID], + ]; $this->assertEquals($expected, $access); } public function test_setUserAccess_SetRoleAsString() { - $this->api->setUserAccess($this->login, View::ID, array(1)); + $this->api->setUserAccess($this->login, View::ID, [1]); $access = $this->model->getSitesAccessFromUser($this->login); - $this->assertEquals(array(array('site' => '1', 'access' => 'view')), $access); + $this->assertEquals([['site' => '1', 'access' => 'view']], $access); } public function test_setUserAccess_SetRoleAsArray() { - $this->api->setUserAccess($this->login, array(View::ID), array(1)); + $this->api->setUserAccess($this->login, [View::ID], [1]); $access = $this->model->getSitesAccessFromUser($this->login); - $this->assertEquals(array(array('site' => '1', 'access' => 'view')), $access); + $this->assertEquals([['site' => '1', 'access' => 'view']], $access); } public function test_addCapabilities_failsWhenNotCapabilityIsGivenAsString() @@ -898,7 +1093,7 @@ class APITest extends IntegrationTestCase $this->expectException(\Exception::class); $this->expectExceptionMessage('UsersManager_ExceptionAccessValues'); - $this->api->addCapabilities($this->login, View::ID, array(1)); + $this->api->addCapabilities($this->login, View::ID, [1]); } public function test_addCapabilities_failsWhenNotCapabilityIsGivenAsArray() @@ -906,7 +1101,7 @@ class APITest extends IntegrationTestCase $this->expectException(\Exception::class); $this->expectExceptionMessage('UsersManager_ExceptionAccessValues'); - $this->api->addCapabilities($this->login, array(TestCap2::ID, View::ID), array(1)); + $this->api->addCapabilities($this->login, [TestCap2::ID, View::ID], [1]); } public function test_addCapabilities_failsWhenUserDoesNotExist() @@ -914,31 +1109,31 @@ class APITest extends IntegrationTestCase $this->expectException(\Exception::class); $this->expectExceptionMessage('UsersManager_ExceptionUserDoesNotExist'); - $this->api->addCapabilities('foobar', array(TestCap2::ID), array(1)); + $this->api->addCapabilities('foobar', [TestCap2::ID], [1]); } public function test_addCapabilities_DoesNotAddSameCapabilityTwice() { - $addAccess = array(TestCap2::ID, View::ID, TestCap3::ID); - $this->api->setUserAccess($this->login, $addAccess, array(1)); + $addAccess = [TestCap2::ID, View::ID, TestCap3::ID]; + $this->api->setUserAccess($this->login, $addAccess, [1]); $access = $this->model->getSitesAccessFromUser($this->login); - $expected = array( - array('site' => '1', 'access' => 'view'), - array('site' => '1', 'access' => TestCap2::ID), - array('site' => '1', 'access' => TestCap3::ID), - ); + $expected = [ + ['site' => '1', 'access' => 'view'], + ['site' => '1', 'access' => TestCap2::ID], + ['site' => '1', 'access' => TestCap3::ID], + ]; $this->assertEquals($expected, $access); - $this->api->addCapabilities($this->login, array(TestCap2::ID, TestCap3::ID), array(1)); + $this->api->addCapabilities($this->login, [TestCap2::ID, TestCap3::ID], [1]); $access = $this->model->getSitesAccessFromUser($this->login); $this->assertEquals($expected, $access); - $this->api->addCapabilities($this->login, array(TestCap2::ID, TestCap1::ID, TestCap3::ID), array(1)); + $this->api->addCapabilities($this->login, [TestCap2::ID, TestCap1::ID, TestCap3::ID], [1]); - $expected[] = array('site' => '1', 'access' => TestCap1::ID); + $expected[] = ['site' => '1', 'access' => TestCap1::ID]; $access = $this->model->getSitesAccessFromUser($this->login); $this->assertEquals($expected, $access); } @@ -947,27 +1142,27 @@ class APITest extends IntegrationTestCase { $access = $this->model->getSitesAccessFromUser($this->login); - $this->assertEquals(array(), $access); + $this->assertEquals([], $access); - $this->api->addCapabilities($this->login, array(TestCap2::ID, TestCap3::ID), array(1)); + $this->api->addCapabilities($this->login, [TestCap2::ID, TestCap3::ID], [1]); - $this->assertEquals(array(), $access); + $this->assertEquals([], $access); } public function test_addCapabilities_DoesNotAddCapabilitiesWhichAreIncludedInRoleAlready() { - $this->api->setUserAccess($this->login, Write::ID, array(1)); + $this->api->setUserAccess($this->login, Write::ID, [1]); $access = $this->model->getSitesAccessFromUser($this->login); - $expected = array( - array('site' => '1', 'access' => 'write'), - ); + $expected = [ + ['site' => '1', 'access' => 'write'], + ]; $this->assertEquals($expected, $access); - $this->api->addCapabilities($this->login, array(TestCap2::ID, TestCap3::ID), array(1)); + $this->api->addCapabilities($this->login, [TestCap2::ID, TestCap3::ID], [1]); - $expected[] = array('site' => '1', 'access' => TestCap3::ID); + $expected[] = ['site' => '1', 'access' => TestCap3::ID]; $access = $this->model->getSitesAccessFromUser($this->login); // did not add TestCap2 @@ -976,16 +1171,16 @@ class APITest extends IntegrationTestCase public function test_addCapabilities_DoesAddCapabilitiesWhichAreNotIncludedInRoleYetAlready() { - $this->api->setUserAccess($this->login, Admin::ID, array(1)); + $this->api->setUserAccess($this->login, Admin::ID, [1]); $access = $this->model->getSitesAccessFromUser($this->login); - $expected = array( - array('site' => '1', 'access' => 'admin'), - ); + $expected = [ + ['site' => '1', 'access' => 'admin'], + ]; $this->assertEquals($expected, $access); - $this->api->addCapabilities($this->login, array(TestCap2::ID, TestCap1::ID, TestCap3::ID), array(1)); + $this->api->addCapabilities($this->login, [TestCap2::ID, TestCap1::ID, TestCap3::ID], [1]); $access = $this->model->getSitesAccessFromUser($this->login); $this->assertEquals($expected, $access); @@ -996,7 +1191,7 @@ class APITest extends IntegrationTestCase $this->expectException(\Exception::class); $this->expectExceptionMessage('UsersManager_ExceptionAccessValues'); - $this->api->removeCapabilities($this->login, View::ID, array(1)); + $this->api->removeCapabilities($this->login, View::ID, [1]); } public function test_removeCapabilities_failsWhenNotCapabilityIsGivenAsArray() @@ -1004,7 +1199,7 @@ class APITest extends IntegrationTestCase $this->expectException(\Exception::class); $this->expectExceptionMessage('UsersManager_ExceptionAccessValues'); - $this->api->removeCapabilities($this->login, array(TestCap2::ID, View::ID), array(1)); + $this->api->removeCapabilities($this->login, [TestCap2::ID, View::ID], [1]); } public function test_removeCapabilities_failsWhenUserDoesNotExist() @@ -1012,21 +1207,21 @@ class APITest extends IntegrationTestCase $this->expectException(\Exception::class); $this->expectExceptionMessage('UsersManager_ExceptionUserDoesNotExist'); - $this->api->removeCapabilities('foobar', array(TestCap2::ID), array(1)); + $this->api->removeCapabilities('foobar', [TestCap2::ID], [1]); } public function test_removeCapabilities() { - $addAccess = array(View::ID, TestCap2::ID, TestCap3::ID, TestCap1::ID); - $this->api->setUserAccess($this->login, $addAccess, array(1)); + $addAccess = [View::ID, TestCap2::ID, TestCap3::ID, TestCap1::ID]; + $this->api->setUserAccess($this->login, $addAccess, [1]); $access = $this->getAccessInSite($this->login, 1); $this->assertEquals($addAccess, $access); - $this->api->removeCapabilities($this->login, array(TestCap3::ID, TestCap2::ID), 1); + $this->api->removeCapabilities($this->login, [TestCap3::ID, TestCap2::ID], 1); $access = $this->getAccessInSite($this->login, 1); - $this->assertEquals(array(View::ID, TestCap1::ID), $access); + $this->assertEquals([View::ID, TestCap1::ID], $access); } public function test_setSuperUserAccess_failsIfCurrentPasswordIsIncorrect() @@ -1037,10 +1232,211 @@ class APITest extends IntegrationTestCase $this->api->setSuperUserAccess($this->login, true, 'asldfkjds'); } + public function testInviteUserAsSuperUser() + { + $eventWasFired = false; + + EventDispatcher::getInstance()->addObserver('UsersManager.inviteUser.end', function ($userLogin, $email) use (&$eventWasFired) { + self::assertEquals('pendingLoginTest', $userLogin); + self::assertEquals('pendingLoginTest@matomo.org', $email); + $eventWasFired = true; + }); + + $this->api->inviteUser('pendingLoginTest', 'pendingLoginTest@matomo.org', 1); + $user = $this->model->isPendingUser('pendingLoginTest'); + $this->assertTrue($user); + $this->assertTrue($eventWasFired); + } + + public function testInviteUserAsAdmin() + { + $this->addUserWithAccess('adminUser', 'admin', 1); + $this->setCurrentUser('adminUser', 'admin', 1); + + $this->api->inviteUser('pendingLoginTest', 'pendingLoginTest@matomo.org', 1); + $user = $this->model->isPendingUser('pendingLoginTest'); + $this->assertTrue($user); + } + + public function testInviteUserAsAdminForAnotherSiteDoesntWork() + { + self::expectException(\Exception::class); + + $this->addUserWithAccess('adminUser', 'admin', 1); + $this->setCurrentUser('adminUser', 'admin', 1); + + $this->api->inviteUser('pendingLoginTest', 'pendingLoginTest@matomo.org', 2); + } + + public function testInviteUserAsWriteUserNotAllowed() + { + self::expectException(NoAccessException::class); + + $this->addUserWithAccess('anyUser', 'write', 1); + $this->setCurrentUser('anyUser', 'write', 1); + + $this->api->inviteUser('pendingLoginTest', 'pendingLoginTest@matomo.org', 1); + } + + public function testInviteUserAsUserNotAllowed() + { + self::expectException(NoAccessException::class); + + $this->addUserWithAccess('anyUser', 'view', 1); + $this->setCurrentUser('anyUser', 'view', 1); + + $this->api->inviteUser('pendingLoginTest', 'pendingLoginTest@matomo.org', 1); + } + + public function testInviteUserExpiredInGivenDays() + { + Date::$now = time(); // freeze time, so it doesn't change between inviting user and comparing the time + $expiredDays = 10; + $this->api->inviteUser('pendingLoginTest', 'pendingLoginTest@matomo.org', null, $expiredDays); + $user = $this->model->getUser('pendingLoginTest'); + $expired = Date::factory($user['invite_expired_at'])->getTimestamp(); + $now = Date::now()->getTimestamp(); + $diff = $expired - $now; + $this->assertEquals($expiredDays, $diff / 3600 / 24); + } + + public function testResendInviteAsSuperUser() + { + $this->api->inviteUser('pendingLoginTest', 'pendingLoginTest@matomo.org', 1); + $user = $this->model->isPendingUser('pendingLoginTest'); + $this->assertTrue($user); + + $eventWasFired = false; + + EventDispatcher::getInstance()->addObserver('UsersManager.inviteUser.resendInvite', function ($userLogin) use (&$eventWasFired) { + self::assertEquals('pendingLoginTest', $userLogin); + $eventWasFired = true; + }); + + $this->api->resendInvite('pendingLoginTest'); + self::assertTrue($eventWasFired); + } + + public function testResendInviteFailsIfUserNotPending() + { + self::expectException(\Exception::class); + self::expectExceptionMessage('UsersManager_ExceptionUserDoesNotExist'); + + $this->api->resendInvite('notExistingUser'); + } + + public function testResendInviteAsInviterWithAdminAccess() + { + $this->addUserWithAccess('adminUser', 'admin', 1); + $this->setCurrentUser('adminUser', 'admin', 1); + + $this->api->inviteUser('pendingLoginTest', 'pendingLoginTest@matomo.org', 1); + $user = $this->model->isPendingUser('pendingLoginTest'); + $this->assertTrue($user); + + $eventWasFired = false; + + EventDispatcher::getInstance()->addObserver('UsersManager.inviteUser.resendInvite', function ($userLogin) use (&$eventWasFired) { + self::assertEquals('pendingLoginTest', $userLogin); + $eventWasFired = true; + }); + + $this->api->resendInvite('pendingLoginTest'); + self::assertTrue($eventWasFired); + } + + public function testResendInviteFailsAsInviterWithoutAdminAccess() + { + self::expectException(NoAccessException::class); + + $this->addUserWithAccess('adminUser', 'write', 1); + + // fake admin access for inviting the user + $this->setCurrentUser('adminUser', 'admin', 1); + + $this->api->inviteUser('pendingLoginTest', 'pendingLoginTest@matomo.org', 1); + $user = $this->model->isPendingUser('pendingLoginTest'); + $this->assertTrue($user); + + // degraded to write access + $this->setCurrentUser('adminUser', 'admin', []); + $this->setCurrentUser('adminUser', 'write', 1); + + $this->api->resendInvite('pendingLoginTest'); + } + + public function testResendInviteFailsAsNotInvitingAdmin() + { + self::expectException(NoAccessException::class); + self::expectExceptionMessage('UsersManager_ExceptionResendInviteDenied'); + + $this->addUserWithAccess('adminUser', 'admin', 1); + $this->addUserWithAccess('anotherAdminUser', 'admin', 1); + + $this->setCurrentUser('adminUser', 'admin', 1); + + $this->api->inviteUser('pendingLoginTest', 'pendingLoginTest@matomo.org', 1); + $user = $this->model->isPendingUser('pendingLoginTest'); + $this->assertTrue($user); + + // another admin tries to resend invite + $this->setCurrentUser('anotherAdminUser', 'admin', 1); + + $this->api->resendInvite('pendingLoginTest'); + } + + public function testInvitedUserCanBeRemovedBySuperUser() + { + Fixture::createSuperUser(); + $this->addUserWithAccess('adminUser', 'admin', 1); + $this->setCurrentUser('adminUser', 'admin', 1); + + $this->api->inviteUser('pendingLoginTest', 'pendingLoginTest@matomo.org', 1); + $user = $this->model->isPendingUser('pendingLoginTest'); + $this->assertTrue($user); + + $this->setCurrentUser('superUserLogin', 'superuser', 1); + + $this->api->deleteUser('pendingLoginTest'); + self::assertEmpty($this->model->getUser('pendingLoginTest')); + } + + public function testInvitedUserCanBeRemovedByInviter() + { + Fixture::createSuperUser(); + $this->addUserWithAccess('adminUser', 'admin', 1); + $this->setCurrentUser('adminUser', 'admin', 1); + + $this->api->inviteUser('pendingLoginTest', 'pendingLoginTest@matomo.org', 1); + $user = $this->model->isPendingUser('pendingLoginTest'); + $this->assertTrue($user); + + $this->api->deleteUser('pendingLoginTest'); + self::assertEmpty($this->model->getUser('pendingLoginTest')); + } + + public function testInvitedUserCanNOTBeRemovedByOtherAdmin() + { + self::expectException(\Exception::class); + self::expectExceptionMessage('UsersManager_ExceptionUserDoesNotExist'); + + $this->addUserWithAccess('adminUser', 'admin', 1); + $this->addUserWithAccess('adminUser2', 'admin', 1); + $this->setCurrentUser('adminUser', 'admin', 1); + + $this->api->inviteUser('pendingLoginTest', 'pendingLoginTest@matomo.org', 1); + $user = $this->model->isPendingUser('pendingLoginTest'); + $this->assertTrue($user); + + $this->setCurrentUser('adminUser2', 'admin', 1); + + $this->api->deleteUser('pendingLoginTest'); + } + private function getAccessInSite($login, $idSite) { $access = $this->model->getSitesAccessFromUser($login); - $ids = array(); + $ids = []; foreach ($access as $entry) { if ($entry['site'] == $idSite) { $ids[] = $entry['access']; @@ -1056,17 +1452,24 @@ class APITest extends IntegrationTestCase public function provideContainerConfig() { - return array( - 'Piwik\Access' => new FakeAccess(), - 'usersmanager.user_preference_names' => \DI\add(['randomDoesNotExist', 'RandomNOTREQUESTED', 'preferenceName']), - 'observers.global' => \DI\add([ - ['Access.Capability.addCapabilities', \DI\value(function (&$capabilities) { - $capabilities[] = new TestCap1(); - $capabilities[] = new TestCap2(); - $capabilities[] = new TestCap3(); - })], - ]), - ); + return [ + 'Piwik\Access' => new FakeAccess(), + 'usersmanager.user_preference_names' => \DI\add([ + 'randomDoesNotExist', + 'RandomNOTREQUESTED', + 'preferenceName' + ]), + 'observers.global' => \DI\add([ + [ + 'Access.Capability.addCapabilities', + \DI\value(function (&$capabilities) { + $capabilities[] = new TestCap1(); + $capabilities[] = new TestCap2(); + $capabilities[] = new TestCap3(); + }) + ], + ]), + ]; } private function addUserWithAccess($username, $accessLevel, $idSite, $email = null) @@ -1075,7 +1478,7 @@ class APITest extends IntegrationTestCase if ($accessLevel == 'superuser') { $userUpdater = new UserUpdater(); $userUpdater->setSuperUserAccessWithoutCurrentPassword($username, true); - } else if ($accessLevel) { + } elseif ($accessLevel) { $this->api->setUserAccess($username, $accessLevel, $idSite); } } @@ -1086,8 +1489,10 @@ class APITest extends IntegrationTestCase FakeAccess::$superUser = $accessLevel == 'superuser'; if ($accessLevel == 'view') { FakeAccess::$idSitesView = is_array($idSite) ? $idSite : [$idSite]; - } else if ($accessLevel == 'admin') { + } elseif ($accessLevel == 'admin') { FakeAccess::$idSitesAdmin = is_array($idSite) ? $idSite : [$idSite]; + } elseif ($accessLevel == 'write') { + FakeAccess::$idSitesWrite = is_array($idSite) ? $idSite : [$idSite]; } } @@ -1095,7 +1500,11 @@ class APITest extends IntegrationTestCase { foreach ($users as &$user) { unset($user['date_registered']); + unset($user['invite_expired_at']); + unset($user['invite_accept_at']); + unset($user['invite_token']); unset($user['invite_status']); + unset($user['invited_by']); } } } diff --git a/plugins/UsersManager/tests/Integration/UserInviteTest.php b/plugins/UsersManager/tests/Integration/UserInviteTest.php index 098089d33e..3c70b7068a 100644 --- a/plugins/UsersManager/tests/Integration/UserInviteTest.php +++ b/plugins/UsersManager/tests/Integration/UserInviteTest.php @@ -1,4 +1,5 @@ <?php + /** * Matomo - free/libre analytics platform * @@ -8,10 +9,16 @@ namespace Piwik\Plugins\UsersManager\tests\Integration; +use PHPMailer\PHPMailer\PHPMailer; +use Piwik\API\Request; use Piwik\Date; +use Piwik\EventDispatcher; use Piwik\Http; +use Piwik\Plugins\UsersManager\API; use Piwik\Plugins\UsersManager\Model; +use Piwik\Plugins\UsersManager\Tasks; use Piwik\Tests\Framework\Fixture; +use Piwik\Tests\Framework\Mock\FakeAccess; use Piwik\Tests\Framework\TestCase\IntegrationTestCase; /** @@ -22,45 +29,102 @@ use Piwik\Tests\Framework\TestCase\IntegrationTestCase; */ class UserInviteTest extends IntegrationTestCase { - /** * @var Model */ private $model; - protected $dateTime = '2013-01-23 01:23:45'; - protected $token = "13cb9dcef6cc70b02a640cee30dc8ce9"; - protected $pendingUser = array( - 'login' => '000pendingUser3', - 'email' => 'pendinguser3light@example.com' - ); + protected $pendingUser = [ + 'login' => '000pendingUser3', + 'email' => 'pendinguser3light@example.com' + ]; + protected $capturedToken = null; public function setUp(): void { parent::setUp(); + Fixture::createSuperUser(); + Fixture::createWebsite('2010-01-01 05:00:00'); $this->model = new Model(); - $this->model->addUser($this->pendingUser['login'], '', $this->pendingUser['email'], $this->dateTime, 1); } - public function test_getInviteUser() + public function testInviteUser() { + Request::processRequest( + 'UsersManager.inviteUser', + [ + 'userLogin' => $this->pendingUser['login'], + 'email' => $this->pendingUser['email'], + 'idSite' => 1, + 'expiryInDays' => 7 + ] + ); + $user = $this->model->getUser($this->pendingUser['login']); - $this->assertEquals('pending', $user['invite_status']); - } + // check token in database matches token in email + self::assertEquals($user['invite_token'], $this->model->hashTokenAuth($this->capturedToken)); + $response = Http::sendHttpRequest( + Fixture::getRootUrl() . 'tests/PHPUnit/proxy/index.php?module=Login&action=acceptInvitation&token=' . $this->capturedToken, + 10 + ); - public function test_addInviteUserToken() - { - $this->model->addTokenAuth($this->pendingUser['login'], $this->token, "Invite Token", - Date::now()->getDatetime(), - Date::now()->addDay(7)->getDatetime()); + $this->assertStringContainsString('Accept invitation', $response, 'error on accept invite page'); + + $response = Http::sendHttpRequest( + Fixture::getRootUrl() . 'tests/PHPUnit/proxy/index.php?module=Login&action=declineInvitation&token=' . $this->capturedToken, + 10 + ); + + $this->assertStringContainsString('decline this invitation', $response, 'error on decline invite page'); + + // move date after expire time, but before deletion time + Date::$now = Date::today()->addDay(8)->getTimestamp(); + + $eventWasFired = false; - $response = Http::sendHttpRequest(Fixture::getRootUrl() . 'tests/PHPUnit/proxy/index.php?module=Login&action=acceptInvitation&token=' . $this->token, - 10); + EventDispatcher::getInstance()->addObserver('UsersManager.deleteUser', function ($userLogin) use (&$eventWasFired) { + self::assertEquals($this->pendingUser['login'], $userLogin); + $eventWasFired = true; + }); - $this->assertStringContainsString('Accept Invitation', $response, 'error on accept invitation'); + $tasks = new Tasks(new Model(), API::getInstance()); + $tasks->cleanUpExpiredInvites(); + + // Task should not have removed the user yet, as expiry date time is not 3 days ago + self::assertIsArray($this->model->getUser($this->pendingUser['login'])); + + self::assertFalse($eventWasFired); + + // move date after expire and deletion time + Date::$now = Date::today()->addDay(3)->getTimestamp(); + + $tasks->cleanUpExpiredInvites(); + + // Task should have removed the user now + self::assertEmpty($this->model->getUser($this->pendingUser['login'])); + + self::assertTrue($eventWasFired); } + public function provideContainerConfig() + { + return [ + 'Piwik\Access' => new FakeAccess(), + 'observers.global' => \DI\add([ + ['Test.Mail.send', \DI\value(function (PHPMailer $mail) { + $body = $mail->createBody(); + $body = preg_replace("/=[\r\n]+/", '', $body); + preg_match('/&token=[\s]*3D([a-zA-Z0-9=\s]+)"/', $body, $matches); + if (!empty($matches[1])) { + $capturedToken = $matches[1]; + $capturedToken = preg_replace('/=\s*/', '', $capturedToken); + $this->capturedToken = $capturedToken; + } + })], + ]), + ]; + } } diff --git a/plugins/UsersManager/tests/Integration/UsersManagerTest.php b/plugins/UsersManager/tests/Integration/UsersManagerTest.php index 49059acc10..92188ea024 100644 --- a/plugins/UsersManager/tests/Integration/UsersManagerTest.php +++ b/plugins/UsersManager/tests/Integration/UsersManagerTest.php @@ -13,18 +13,15 @@ use Piwik\Access; use Piwik\Auth\Password; use Piwik\Date; use Piwik\Option; -use Piwik\Piwik; use Piwik\Plugins\SitesManager\API as APISitesManager; use Piwik\Plugins\UsersManager\API; use Piwik\Plugins\UsersManager\Model; use Piwik\Plugins\UsersManager\NewsletterSignup; use Piwik\Plugins\UsersManager\UsersManager; use Piwik\Plugins\UsersManager\UserUpdater; -use Piwik\SettingsPiwik; use Piwik\Tests\Framework\Fixture; use Piwik\Tests\Framework\Mock\FakeAccess; use Piwik\Tests\Framework\TestCase\IntegrationTestCase; -use Piwik\View; /** @@ -66,7 +63,7 @@ class UsersManagerTest extends IntegrationTestCase FakeAccess::$superUserLogin = 'superusertest'; $this->backupIdentity = FakeAccess::$identity; - $this->api = API::getInstance(); + $this->api = API::getInstance(); $this->model = new Model(); } @@ -109,10 +106,13 @@ class UsersManagerTest extends IntegrationTestCase unset($userAfter['idchange_last_viewed']); unset($userAfter['password']); unset($userAfter['invite_status']); - + unset($userAfter['invite_token']); + unset($userAfter['invite_expired_at']); + unset($userAfter['invite_accept_at']); + unset($userAfter['invited_by']); // implicitly checks password! - $user['email'] = $newEmail; + $user['email'] = $newEmail; $user['superuser_access'] = 0; $user['twofactor_secret'] = ''; @@ -130,9 +130,11 @@ class UsersManagerTest extends IntegrationTestCase $this->expectExceptionMessage('UsersManager_ExceptionInvalidPassword'); $login = "login"; - $user = array('login' => $login, - 'password' => "geqgeagae", - 'email' => "test@test.com"); + $user = array( + 'login' => $login, + 'password' => "geqgeagae", + 'email' => "test@test.com", + ); $this->api->addUser($user['login'], $user['password'], $user['email']); @@ -150,10 +152,10 @@ class UsersManagerTest extends IntegrationTestCase public function getAddUserInvalidLoginData() { return array( - array(9, "password", "email@email.com"), // wrong login / integer => exception - array("gegag'ggea'", "password", "email@email.com"), // wrong login / too short => exception - array("gegag11gge&", "password", "email@email.com"), // wrong login / too long => exception - array("geg'ag11gge@", "password", "email@email.com"), // wrong login / bad characters => exception + array(9, "password", "email@email.com"), // wrong login / integer => exception + array("gegag'ggea'", "password", "email@email.com"), // wrong login / too short => exception + array("gegag11gge&", "password", "email@email.com"), // wrong login / too long => exception + array("geg'ag11gge@", "password", "email@email.com"), // wrong login / bad characters => exception ); } @@ -177,6 +179,25 @@ class UsersManagerTest extends IntegrationTestCase $this->api->addUser("test", "password2", "em2ail@email.com"); } + public function testAddUserExistingEmail() + { + $this->expectException(\Exception::class); + $this->expectExceptionMessage('UsersManager_ExceptionEmailExists'); + + $this->api->addUser("test", "password", "email@email.com"); + $this->api->addUser("test2", "password2", "email@email.com"); + } + + + public function testAddUserExistingEmailAsUserName() + { + $this->expectException(\Exception::class); + $this->expectExceptionMessage('UsersManager_ExceptionEmailExistsAsLogin'); + + $this->api->addUser("email@email.com", "password", "email2@email.com"); + $this->api->addUser("test2", "password2", "email@email.com"); + } + /** * @see https://github.com/piwik/piwik/issues/8548 */ @@ -195,8 +216,8 @@ class UsersManagerTest extends IntegrationTestCase public function getWrongPasswordTestData() { return array( - array("geggeqgeqag", "pas", "email@email.com"), // too short -> exception - array("geggeqgeqag", "", "email@email.com"), // empty -> exception + array("geggeqgeqag", "pas", "email@email.com"), // too short -> exception + array("geggeqgeqag", "", "email@email.com"), // empty -> exception ); } @@ -225,7 +246,9 @@ class UsersManagerTest extends IntegrationTestCase public function testAddUserLongPassword() { $login = "geggeqgeqag"; - $this->api->addUser($login, "geqgeagaegeqgeagaegeqgeagaegeqgeagaegeqgeagaegeqgeagaegeqgeagaegeqgeagaegeqgeagaegeqgeagaegeqgeagaeg", "mgeagi@geq.com"); + $this->api->addUser($login, + "geqgeagaegeqgeagaegeqgeagaegeqgeagaegeqgeagaegeqgeagaegeqgeagaegeqgeagaegeqgeagaegeqgeagaegeqgeagaeg", + "mgeagi@geq.com"); $user = $this->api->getUser($login); $this->assertEquals($login, $user['login']); } @@ -245,7 +268,7 @@ class UsersManagerTest extends IntegrationTestCase // check that the date registered is correct $this->assertTrue($time <= strtotime($user['date_registered']) && strtotime($user['date_registered']) <= time(), - "the date_registered " . strtotime($user['date_registered']) . " is different from the time() " . time()); + "the date_registered " . strtotime($user['date_registered']) . " is different from the time() " . time()); // check that password and token are properly set $this->assertEquals(60, strlen($user['password'])); @@ -280,7 +303,7 @@ class UsersManagerTest extends IntegrationTestCase $access = $this->api->getSitesAccessFromUser($login); $this->assertEquals([ - ['site' => 1, 'access' => 'view'], + ['site' => 1, 'access' => 'view'], ], $access); } @@ -295,7 +318,8 @@ class UsersManagerTest extends IntegrationTestCase $this->api->addUser('userLogin2', 'password', 'userlogin2@email.com'); } - public function test_addUser_shouldNotAllowAdminUsersToCreateUsersWithAccessToSite_ThatAdminUserDoesNotHaveAccessTo() + public function test_addUser_shouldNotAllowAdminUsersToCreateUsersWithAccessToSite_ThatAdminUserDoesNotHaveAccessTo( + ) { $this->expectException(\Exception::class); $this->expectExceptionMessage('checkUserHasAdminAccess Fake exception'); @@ -440,17 +464,32 @@ class UsersManagerTest extends IntegrationTestCase $this->api->addUser("geggeqge632ge56a4qag", "geqgegeagae", "tesggt@tesgt.com"); $this->api->addUser("geggeqgeqagqegg", "geqgeaggggae", "tesgggt@tesgt.com"); - Option::set('UsersManager.lastSeen.gegg4564eqgeqag',$now = time()); + Option::set('UsersManager.lastSeen.gegg4564eqgeqag', $now = time()); $users = $this->api->getUsers(); $users = $this->_removeNonTestableFieldsFromUsers($users); - $user1 = array('login' => "gegg4564eqgeqag", 'email' => "tegst@tesgt.com", 'superuser_access' => 0, 'uses_2fa' => false, 'last_seen' => Date::getDatetimeFromTimestamp($now)); - $user2 = array('login' => "geggeqge632ge56a4qag", 'email' => "tesggt@tesgt.com", 'superuser_access' => 0, 'uses_2fa' => false); - $user3 = array('login' => "geggeqgeqagqegg", 'email' => "tesgggt@tesgt.com", 'superuser_access' => 0, 'uses_2fa' => false); + $user1 = array('login' => "gegg4564eqgeqag", + 'email' => "tegst@tesgt.com", + 'superuser_access' => 0, + 'uses_2fa' => false, + 'last_seen' => Date::getDatetimeFromTimestamp($now) + ); + $user2 = array('login' => "geggeqge632ge56a4qag", + 'email' => "tesggt@tesgt.com", + 'superuser_access' => 0, + 'uses_2fa' => false + ); + $user3 = array('login' => "geggeqgeqagqegg", + 'email' => "tesgggt@tesgt.com", + 'superuser_access' => 0, + 'uses_2fa' => false + ); $expectedUsers = array($user1, $user2, $user3); $this->assertEquals($expectedUsers, $users); - $this->assertEquals(array($user1), $this->_removeNonTestableFieldsFromUsers($this->api->getUsers('gegg4564eqgeqag'))); - $this->assertEquals(array($user1, $user2), $this->_removeNonTestableFieldsFromUsers($this->api->getUsers('gegg4564eqgeqag,geggeqge632ge56a4qag'))); + $this->assertEquals(array($user1), + $this->_removeNonTestableFieldsFromUsers($this->api->getUsers('gegg4564eqgeqag'))); + $this->assertEquals(array($user1, $user2), + $this->_removeNonTestableFieldsFromUsers($this->api->getUsers('gegg4564eqgeqag,geggeqge632ge56a4qag'))); } public function testGetUsers_withViewAccess_shouldThrowAnException() @@ -475,6 +514,10 @@ class UsersManagerTest extends IntegrationTestCase unset($user['date_registered']); unset($user['ts_password_modified']); unset($user['invite_status']); + unset($user['invite_expired_at']); + unset($user['invite_token']); + unset($user['invite_accept_at']); + unset($user['invited_by']); } return $users; } @@ -518,7 +561,7 @@ class UsersManagerTest extends IntegrationTestCase $this->expectException(\Exception::class); $this->expectExceptionMessage('checkUserHasSomeAdminAccess Fake exception'); - FakeAccess::clearAccess($superUser = false, $admin =array(), $view = array(1)); + FakeAccess::clearAccess($superUser = false, $admin = array(), $view = array(1)); $this->api->getUserLoginFromUserEmail('tegst@tesgt.com'); } @@ -527,7 +570,7 @@ class UsersManagerTest extends IntegrationTestCase $this->expectException(\Exception::class); $this->expectExceptionMessage('UsersManager_ExceptionUserDoesNotExist'); - FakeAccess::clearAccess($superUser = false, $admin =array(1), $view = array()); + FakeAccess::clearAccess($superUser = false, $admin = array(1), $view = array()); $this->api->setUserAccess("nologin", "view", 1); } @@ -537,7 +580,7 @@ class UsersManagerTest extends IntegrationTestCase $this->expectExceptionMessage('UsersManager_ExceptionAccessValues'); $this->api->addUser("gegg4564eqgeqag", "geqgegagae", "tegst@tesgt.com"); - FakeAccess::clearAccess($superUser = false, $admin =array(1), $view = array()); + FakeAccess::clearAccess($superUser = false, $admin = array(1), $view = array()); $this->api->setUserAccess("gegg4564eqgeqag", "viewnotknown", 1); } @@ -547,7 +590,7 @@ class UsersManagerTest extends IntegrationTestCase $this->expectExceptionMessage('UsersManager_ExceptionAccessValues'); $this->api->addUser("gegg4564eqgeqag", "geqgegagae", "tegst@tesgt.com"); - FakeAccess::clearAccess($superUser = false, $admin =array(1), $view = array()); + FakeAccess::clearAccess($superUser = false, $admin = array(1), $view = array()); $this->api->setUserAccess("gegg4564eqgeqag", "superuser", 1); } @@ -556,7 +599,7 @@ class UsersManagerTest extends IntegrationTestCase $this->expectException(\Exception::class); $this->expectExceptionMessage('UsersManager_ExceptionUserDoesNotExist'); - FakeAccess::clearAccess($superUser = false, $admin =array(1), $view = array()); + FakeAccess::clearAccess($superUser = false, $admin = array(1), $view = array()); $this->api->setUserAccess('superusertest', 'view', 1); } @@ -769,7 +812,7 @@ class UsersManagerTest extends IntegrationTestCase $pwd = $this->createCurrentUser(); - FakeAccess::$superUser= false; + FakeAccess::$superUser = false; $this->api->setSuperUserAccess('nologin', false, $pwd); } @@ -901,9 +944,11 @@ class UsersManagerTest extends IntegrationTestCase $this->expectExceptionMessage('UsersManager_ConfirmWithPassword'); $login = "login"; - $user = array('login' => $login, - 'password' => "geqgeagae", - 'email' => "test@test.com"); + $user = array( + 'login' => $login, + 'password' => "geqgeagae", + 'email' => "test@test.com" + ); $this->api->addUser($user['login'], $user['password'], $user['email']); @@ -917,9 +962,11 @@ class UsersManagerTest extends IntegrationTestCase $this->expectExceptionMessage('UsersManager_CurrentPasswordNotCorrect'); $login = "login"; - $user = array('login' => $login, - 'password' => "geqgeagae", - 'email' => "test@test.com"); + $user = array( + 'login' => $login, + 'password' => "geqgeagae", + 'email' => "test@test.com" + ); $this->api->addUser($user['login'], $user['password'], $user['email']); @@ -933,9 +980,11 @@ class UsersManagerTest extends IntegrationTestCase $this->expectExceptionMessage('UsersManager_CurrentPasswordNotCorrect'); $login = "login"; - $user = array('login' => $login, - 'password' => "geqgeagae", - 'email' => "test@test.com"); + $user = array( + 'login' => $login, + 'password' => "geqgeagae", + 'email' => "test@test.com" + ); $this->api->addUser($user['login'], $user['password'], $user['email']); // currently logged in is a super user and not "login". therefore the password of "login" won't work @@ -948,9 +997,11 @@ class UsersManagerTest extends IntegrationTestCase public function testUpdateUserNoEmail() { $login = "login"; - $user = array('login' => $login, - 'password' => "geqgeagae", - 'email' => "test@test.com"); + $user = array( + 'login' => $login, + 'password' => "geqgeagae", + 'email' => "test@test.com" + ); $this->api->addUser($user['login'], $user['password'], $user['email']); @@ -990,9 +1041,11 @@ class UsersManagerTest extends IntegrationTestCase public function testUpdateUser() { $login = "login"; - $user = array('login' => $login, - 'password' => "geqgeagae", - 'email' => "test@test.com"); + $user = array( + 'login' => $login, + 'password' => "geqgeagae", + 'email' => "test@test.com" + ); $this->api->addUser($user['login'], $user['password'], $user['email']); @@ -1011,9 +1064,11 @@ class UsersManagerTest extends IntegrationTestCase public function testGetUserByEmail() { - $user = array('login' => "login", - 'password' => "geqgeagae", - 'email' => "test@test.com"); + $user = array( + 'login' => "login", + 'password' => "geqgeagae", + 'email' => "test@test.com" + ); $this->api->addUser($user['login'], $user['password'], $user['email']); @@ -1038,23 +1093,24 @@ class UsersManagerTest extends IntegrationTestCase $this->addSites(1); $roles = $this->api->getAvailableRoles(); $expected = array( - array ( - 'id' => 'view', - 'name' => 'UsersManager_PrivView', - 'description' => 'UsersManager_PrivViewDescription', - 'helpUrl' => 'https://matomo.org/faq/general/faq_70/' - ), array ( - 'id' => 'write', - 'name' => 'UsersManager_PrivWrite', - 'description' => 'UsersManager_PrivWriteDescription', - 'helpUrl' => 'https://matomo.org/faq/general/faq_26910' - ), - array ( - 'id' => 'admin', - 'name' => 'UsersManager_PrivAdmin', - 'description' => 'UsersManager_PrivAdminDescription', - 'helpUrl' => 'https://matomo.org/faq/general/faq_69/', - ) + array( + 'id' => 'view', + 'name' => 'UsersManager_PrivView', + 'description' => 'UsersManager_PrivViewDescription', + 'helpUrl' => 'https://matomo.org/faq/general/faq_70/' + ), + array( + 'id' => 'write', + 'name' => 'UsersManager_PrivWrite', + 'description' => 'UsersManager_PrivWriteDescription', + 'helpUrl' => 'https://matomo.org/faq/general/faq_26910' + ), + array( + 'id' => 'admin', + 'name' => 'UsersManager_PrivAdmin', + 'description' => 'UsersManager_PrivAdminDescription', + 'helpUrl' => 'https://matomo.org/faq/general/faq_69/', + ) ); $this->assertEquals($expected, $roles); } @@ -1063,30 +1119,30 @@ class UsersManagerTest extends IntegrationTestCase { $this->addSites(1); $this->assertSame(array( - 0 => array( - 'id' => 'tagmanager_write', - 'name' => 'UsersManager_PrivWrite', - 'description' => 'TagManager_CapabilityWriteDescription', - 'helpUrl' => '', - 'includedInRoles' => array ('write', 'admin'), - 'category' => 'TagManager_TagManager', - ), - 1 => array ( - 'id' => 'tagmanager_publish_live_container', - 'name' => 'TagManager_CapabilityPublishLiveContainer', - 'description' => 'TagManager_CapabilityPublishLiveContainerDescription', - 'helpUrl' => '', - 'includedInRoles' => array ('admin'), - 'category' => 'TagManager_TagManager', - ), - 2 => array ( - 'id' => 'tagmanager_use_custom_templates', - 'name' => 'TagManager_CapabilityUseCustomTemplates', - 'description' => 'TagManager_CapabilityUseCustomTemplateDescription', - 'helpUrl' => '', - 'includedInRoles' => array ('admin'), - 'category' => 'TagManager_TagManager', - ) + 0 => array( + 'id' => 'tagmanager_write', + 'name' => 'UsersManager_PrivWrite', + 'description' => 'TagManager_CapabilityWriteDescription', + 'helpUrl' => '', + 'includedInRoles' => array('write', 'admin'), + 'category' => 'TagManager_TagManager', + ), + 1 => array( + 'id' => 'tagmanager_publish_live_container', + 'name' => 'TagManager_CapabilityPublishLiveContainer', + 'description' => 'TagManager_CapabilityPublishLiveContainerDescription', + 'helpUrl' => '', + 'includedInRoles' => array('admin'), + 'category' => 'TagManager_TagManager', + ), + 2 => array( + 'id' => 'tagmanager_use_custom_templates', + 'name' => 'TagManager_CapabilityUseCustomTemplates', + 'description' => 'TagManager_CapabilityUseCustomTemplateDescription', + 'helpUrl' => '', + 'includedInRoles' => array('admin'), + 'category' => 'TagManager_TagManager', + ) ), $this->api->getAvailableCapabilities()); } @@ -1104,43 +1160,14 @@ class UsersManagerTest extends IntegrationTestCase $this->assertNotEmpty($user['invite_status']); } - public function testInviteUserEmail() - { - $view = new View('@UsersManager/_userInviteEmail.twig'); - $view->login = "test"; - $view->emailAddress = "test@test.com";; - $view->idSite = 1; - $view->siteName = 'test'; - $view->token = "thisisatoken"; - - // content line for email body - $view->content =Piwik::translate('CoreAdminHome_UserInviteSubject', - ["<strong>test</strong>", "<strong>test</strong>"]); - - //notes for email footer - $view->notes = Piwik::translate('CoreAdminHome_UserInviteNotes', ['test','test']); - $host = SettingsPiwik::getPiwikUrl(); - $content = <<<END -<p>General_HelloUser</p> -<p>CoreAdminHome_UserInviteSubject</p> -<a target="_blank" href="$host?module=Login&action=acceptInvitation&token=thisisatoken" ->CoreAdminHome_AcceptInvite</a> | -<a target="_blank" href="$host?module=Login&action=declineInvitation&token=thisisatoken" ->CoreAdminHome_DeclineInvite</a> -<p><b>Notes:</b>CoreAdminHome_UserInviteNotes</p> -END; - $this->assertEquals($content, $view->render()); - - } - - private function addSites($numberOfSites) { $idSites = array(); for ($index = 0; $index < $numberOfSites; $index++) { - $name = "test" . ($index + 1); - $idSites[] = APISitesManager::getInstance()->addSite($name, array("http://piwik.net", "http://piwik.com/test/")); + $name = "test" . ($index + 1); + $idSites[] = APISitesManager::getInstance()->addSite($name, + array("http://piwik.net", "http://piwik.com/test/")); } return $idSites; @@ -1149,7 +1176,7 @@ END; public function provideContainerConfig() { return array( - 'Piwik\Access' => new FakeAccess() + 'Piwik\Access' => new FakeAccess() ); } diff --git a/plugins/UsersManager/tests/System/ApiTest.php b/plugins/UsersManager/tests/System/ApiTest.php index dd5f1d99d5..528163512b 100644 --- a/plugins/UsersManager/tests/System/ApiTest.php +++ b/plugins/UsersManager/tests/System/ApiTest.php @@ -61,7 +61,18 @@ class ApiTest extends SystemTestCase // login1 = super user, login2 = some admin access, login4 = only view access foreach ($logins as $login => $appendix) { $params['token_auth'] = self::$fixture->users[$login]['token']; - $xmlFieldsToRemove = array('date_registered', 'invite_status', 'last_seen', 'password', 'token_auth', 'ts_password_modified', 'idchange_last_viewed'); + $xmlFieldsToRemove = array( + 'date_registered', + 'invite_token', + 'invite_accept_at', + 'invite_expired_at', + 'last_seen', + 'password', + 'token_auth', + 'ts_password_modified', + 'idchange_last_viewed', + 'invite_status' + ); $this->runAnyApiTest($api, $apiId . '_' . $appendix, $params, array('xmlFieldsToRemove' => $xmlFieldsToRemove)); } diff --git a/plugins/UsersManager/tests/System/expected/test___UsersManager.getUser_login1_when_superuseraccess.xml b/plugins/UsersManager/tests/System/expected/test___UsersManager.getUser_login1_when_superuseraccess.xml index 8dab9ca5ce..f07ca1cf6c 100644 --- a/plugins/UsersManager/tests/System/expected/test___UsersManager.getUser_login1_when_superuseraccess.xml +++ b/plugins/UsersManager/tests/System/expected/test___UsersManager.getUser_login1_when_superuseraccess.xml @@ -5,6 +5,10 @@ <email>login1@example.com</email> <superuser_access>1</superuser_access> + <invited_by /> + + + <uses_2fa>0</uses_2fa> </row> diff --git a/plugins/UsersManager/tests/System/expected/test___UsersManager.getUser_login2_when_adminaccess.xml b/plugins/UsersManager/tests/System/expected/test___UsersManager.getUser_login2_when_adminaccess.xml index 98231bbff5..96019b8419 100644 --- a/plugins/UsersManager/tests/System/expected/test___UsersManager.getUser_login2_when_adminaccess.xml +++ b/plugins/UsersManager/tests/System/expected/test___UsersManager.getUser_login2_when_adminaccess.xml @@ -4,5 +4,6 @@ <login>login2</login> <email>login2@example.com</email> <superuser_access>0</superuser_access> + </row> </result>
\ No newline at end of file diff --git a/plugins/UsersManager/tests/System/expected/test___UsersManager.getUser_login2_when_superuseraccess.xml b/plugins/UsersManager/tests/System/expected/test___UsersManager.getUser_login2_when_superuseraccess.xml index fa3bd7ac68..79f9f74969 100644 --- a/plugins/UsersManager/tests/System/expected/test___UsersManager.getUser_login2_when_superuseraccess.xml +++ b/plugins/UsersManager/tests/System/expected/test___UsersManager.getUser_login2_when_superuseraccess.xml @@ -5,6 +5,10 @@ <email>login2@example.com</email> <superuser_access>0</superuser_access> + <invited_by /> + + + <uses_2fa>0</uses_2fa> </row> diff --git a/plugins/UsersManager/tests/System/expected/test___UsersManager.getUser_login4_when_superuseraccess.xml b/plugins/UsersManager/tests/System/expected/test___UsersManager.getUser_login4_when_superuseraccess.xml index 9cc5801c8d..71f8ce19be 100644 --- a/plugins/UsersManager/tests/System/expected/test___UsersManager.getUser_login4_when_superuseraccess.xml +++ b/plugins/UsersManager/tests/System/expected/test___UsersManager.getUser_login4_when_superuseraccess.xml @@ -5,6 +5,10 @@ <email>login4@example.com</email> <superuser_access>0</superuser_access> + <invited_by /> + + + <uses_2fa>0</uses_2fa> </row> diff --git a/plugins/UsersManager/tests/System/expected/test___UsersManager.getUser_login4_when_viewaccess.xml b/plugins/UsersManager/tests/System/expected/test___UsersManager.getUser_login4_when_viewaccess.xml index b6cf8cb4c4..bccb9256f9 100644 --- a/plugins/UsersManager/tests/System/expected/test___UsersManager.getUser_login4_when_viewaccess.xml +++ b/plugins/UsersManager/tests/System/expected/test___UsersManager.getUser_login4_when_viewaccess.xml @@ -4,5 +4,6 @@ <login>login4</login> <email>login4@example.com</email> <superuser_access>0</superuser_access> + </row> </result>
\ No newline at end of file diff --git a/plugins/UsersManager/tests/System/expected/test___UsersManager.getUser_login6_when_superuseraccess.xml b/plugins/UsersManager/tests/System/expected/test___UsersManager.getUser_login6_when_superuseraccess.xml index dcddc97dfd..0ddf3a7097 100644 --- a/plugins/UsersManager/tests/System/expected/test___UsersManager.getUser_login6_when_superuseraccess.xml +++ b/plugins/UsersManager/tests/System/expected/test___UsersManager.getUser_login6_when_superuseraccess.xml @@ -5,6 +5,10 @@ <email>login6@example.com</email> <superuser_access>0</superuser_access> + <invited_by /> + + + <uses_2fa>0</uses_2fa> </row> diff --git a/plugins/UsersManager/tests/System/expected/test___UsersManager.getUsersLogin__when_adminaccess.xml b/plugins/UsersManager/tests/System/expected/test___UsersManager.getUsersLogin__when_adminaccess.xml index 7658fdd5a6..60a460dd8c 100644 --- a/plugins/UsersManager/tests/System/expected/test___UsersManager.getUsersLogin__when_adminaccess.xml +++ b/plugins/UsersManager/tests/System/expected/test___UsersManager.getUsersLogin__when_adminaccess.xml @@ -7,4 +7,5 @@ <row>login7</row> <row>login8</row> <row>login9</row> + <row>zzzpendingUser2</row> </result>
\ No newline at end of file diff --git a/plugins/UsersManager/tests/System/expected/test___UsersManager.getUsersLogin__when_superuseraccess.xml b/plugins/UsersManager/tests/System/expected/test___UsersManager.getUsersLogin__when_superuseraccess.xml index b81834b5fb..0083838caf 100644 --- a/plugins/UsersManager/tests/System/expected/test___UsersManager.getUsersLogin__when_superuseraccess.xml +++ b/plugins/UsersManager/tests/System/expected/test___UsersManager.getUsersLogin__when_superuseraccess.xml @@ -12,4 +12,5 @@ <row>login8</row> <row>login9</row> <row>superUserLogin</row> + <row>zzzpendingUser2</row> </result>
\ No newline at end of file diff --git a/plugins/UsersManager/tests/System/expected/test___UsersManager.getUsersWithSiteAccess_3_admin_when_superuseraccess.xml b/plugins/UsersManager/tests/System/expected/test___UsersManager.getUsersWithSiteAccess_3_admin_when_superuseraccess.xml index 02ec1e6d90..75c08d51bf 100644 --- a/plugins/UsersManager/tests/System/expected/test___UsersManager.getUsersWithSiteAccess_3_admin_when_superuseraccess.xml +++ b/plugins/UsersManager/tests/System/expected/test___UsersManager.getUsersWithSiteAccess_3_admin_when_superuseraccess.xml @@ -5,6 +5,10 @@ <email>login5@example.com</email> <superuser_access>0</superuser_access> + <invited_by /> + + + <uses_2fa>0</uses_2fa> </row> @@ -13,6 +17,10 @@ <email>login6@example.com</email> <superuser_access>0</superuser_access> + <invited_by /> + + + <uses_2fa>0</uses_2fa> </row> diff --git a/plugins/UsersManager/tests/System/expected/test___UsersManager.getUsers__when_adminaccess.xml b/plugins/UsersManager/tests/System/expected/test___UsersManager.getUsers__when_adminaccess.xml index 31a5fac273..5d3b34b562 100644 --- a/plugins/UsersManager/tests/System/expected/test___UsersManager.getUsers__when_adminaccess.xml +++ b/plugins/UsersManager/tests/System/expected/test___UsersManager.getUsers__when_adminaccess.xml @@ -1,32 +1,40 @@ <?xml version="1.0" encoding="utf-8" ?> <result> <row> - <login>000pendingUser1</login> - <superuser_access>0</superuser_access> - </row> - <row> <login>login2</login> <email>login2@example.com</email> <superuser_access>0</superuser_access> + </row> <row> <login>login4</login> <superuser_access>0</superuser_access> + </row> <row> <login>login6</login> <superuser_access>0</superuser_access> + </row> <row> <login>login7</login> <superuser_access>0</superuser_access> + </row> <row> <login>login8</login> <superuser_access>0</superuser_access> + </row> <row> <login>login9</login> <superuser_access>0</superuser_access> + + </row> + <row> + <login>zzzpendingUser2</login> + <superuser_access>0</superuser_access> + + <invited_by>login2</invited_by> </row> </result>
\ No newline at end of file diff --git a/plugins/UsersManager/tests/System/expected/test___UsersManager.getUsers__when_superuseraccess.xml b/plugins/UsersManager/tests/System/expected/test___UsersManager.getUsers__when_superuseraccess.xml index a2032128d8..25a13356b3 100644 --- a/plugins/UsersManager/tests/System/expected/test___UsersManager.getUsers__when_superuseraccess.xml +++ b/plugins/UsersManager/tests/System/expected/test___UsersManager.getUsers__when_superuseraccess.xml @@ -5,7 +5,11 @@ <email>pendinguser1light@example.com</email> <superuser_access>0</superuser_access> - <invite_status>today-date-removed-in-tests</invite_status> + <invited_by>superUserLogin</invited_by> + + + + <uses_2fa>0</uses_2fa> </row> <row> @@ -13,7 +17,11 @@ <email>login1@example.com</email> <superuser_access>1</superuser_access> - <invite_status /> + <invited_by /> + + + + <uses_2fa>0</uses_2fa> </row> <row> @@ -21,7 +29,11 @@ <email>login10@example.com</email> <superuser_access>1</superuser_access> - <invite_status /> + <invited_by /> + + + + <uses_2fa>0</uses_2fa> </row> <row> @@ -29,7 +41,11 @@ <email>login2@example.com</email> <superuser_access>0</superuser_access> - <invite_status /> + <invited_by /> + + + + <uses_2fa>0</uses_2fa> </row> <row> @@ -37,7 +53,11 @@ <email>login3@example.com</email> <superuser_access>0</superuser_access> - <invite_status /> + <invited_by /> + + + + <uses_2fa>0</uses_2fa> </row> <row> @@ -45,7 +65,11 @@ <email>login4@example.com</email> <superuser_access>0</superuser_access> - <invite_status /> + <invited_by /> + + + + <uses_2fa>0</uses_2fa> </row> <row> @@ -53,7 +77,11 @@ <email>login5@example.com</email> <superuser_access>0</superuser_access> - <invite_status /> + <invited_by /> + + + + <uses_2fa>0</uses_2fa> </row> <row> @@ -61,7 +89,11 @@ <email>login6@example.com</email> <superuser_access>0</superuser_access> - <invite_status /> + <invited_by /> + + + + <uses_2fa>0</uses_2fa> </row> <row> @@ -69,7 +101,11 @@ <email>login7@example.com</email> <superuser_access>0</superuser_access> - <invite_status /> + <invited_by /> + + + + <uses_2fa>0</uses_2fa> </row> <row> @@ -77,7 +113,11 @@ <email>login8@example.com</email> <superuser_access>0</superuser_access> - <invite_status /> + <invited_by /> + + + + <uses_2fa>0</uses_2fa> </row> <row> @@ -85,7 +125,11 @@ <email>login9@example.com</email> <superuser_access>0</superuser_access> - <invite_status /> + <invited_by /> + + + + <uses_2fa>0</uses_2fa> </row> <row> @@ -93,7 +137,23 @@ <email>hello@example.org</email> <superuser_access>1</superuser_access> - <invite_status /> + <invited_by /> + + + + + <uses_2fa>0</uses_2fa> + </row> + <row> + <login>zzzpendingUser2</login> + <email>zpendinguser2light@example.com</email> + <superuser_access>0</superuser_access> + + <invited_by>login2</invited_by> + + + + <uses_2fa>0</uses_2fa> </row> </result>
\ No newline at end of file diff --git a/plugins/UsersManager/tests/UI/UsersManager_spec.js b/plugins/UsersManager/tests/UI/UsersManager_spec.js index 9feb4e0fb8..87f9777c1a 100644 --- a/plugins/UsersManager/tests/UI/UsersManager_spec.js +++ b/plugins/UsersManager/tests/UI/UsersManager_spec.js @@ -36,13 +36,8 @@ describe("UsersManager", function () { expect(await page.screenshotSelector('.usersManager')).to.matchImage('load'); }); - it('should show resend confirm when resend clicked', async function () { - await (await page.jQuery('.resend')).click(); - expect(await page.screenshotSelector('.usersManager')).to.matchImage('resend_popup'); - }); it('should change the results page when next is clicked', async function () { - await (await page.jQuery('.resend-invite-confirm-modal .modal-close:not(.modal-no):visible')).click(); await page.click('.usersListPagination .btn.next'); await page.mouse.move(-10, -10); await page.waitForNetworkIdle(); @@ -54,6 +49,8 @@ describe("UsersManager", function () { await page.evaluate(function () { $('select[name=access-level-filter]').val('string:view').change(); $('#user-text-filter').val('ight').change(); + $('select[name=status-level-filter]').val('string:pending').change(); + }); await page.waitForNetworkIdle(); await page.waitForTimeout(1000); // wait for rendering @@ -65,6 +62,7 @@ describe("UsersManager", function () { // remove access filter await page.evaluate(function () { $('select[name=access-level-filter]').val('string:').change(); + $('select[name=status-level-filter]').val('string:').change(); }); await page.evaluate(() => $('th.role_header .siteSelector a.title').click()); @@ -173,11 +171,6 @@ describe("UsersManager", function () { it('should delete a single user when the modal is confirmed is clicked', async function () { - await page.evaluate(function () { - $('select[name=access-level-filter]').val('string:view').change(); - $('#user-text-filter').val('ight').change(); - }); - await (await page.jQuery('.deleteuser:eq(0)')).click(); await (await page.jQuery('.delete-user-confirm-modal .modal-close:not(.modal-no):visible')).click(); await page.waitForNetworkIdle(); @@ -440,6 +433,7 @@ describe("UsersManager", function () { it('should display the superuser access tab when the superuser tab is clicked', async function () { await page.click('.userEditForm .menuSuperuser'); await page.mouse.move(0, 0); + await page.waitForTimeout(100); expect(await page.screenshotSelector('.usersManager')).to.matchImage('superuser_tab'); }); @@ -490,7 +484,7 @@ describe("UsersManager", function () { }); it('should show the edit user form when the edit icon in a row is clicked', async function () { - await (await page.jQuery('button.edituser:eq(1)', { waitFor: true })).click(); + await (await page.jQuery('button.edituser:eq(2)', { waitFor: true })).click(); await page.waitForTimeout(250); await page.waitForNetworkIdle(); @@ -524,9 +518,25 @@ describe("UsersManager", function () { await page.waitForNetworkIdle(); await page.waitForSelector('#notificationContainer .notification'); + expect(await page.screenshotSelector('.admin#content,#notificationContainer')).to.matchImage('edit_user_basic_confirmed_wrong_password'); }); + it('should show resend confirm when resend clicked', async function () { + await page.goto(url); + await (await page.jQuery('.resend')).click(); + await page.waitForTimeout(500); // animation + await page.waitForSelector('.resend-invite-confirm-modal', { visible: true }); + expect(await page.screenshotSelector('.usersManager')).to.matchImage('resend_popup'); + }); + + it('should show resend success message', async function() { + await (await page.jQuery('.resend-invite-confirm-modal .modal-close:not(.modal-no):visible')).click(); + await page.waitForSelector('#notificationContainer .notification'); + expect(await page.screenshotSelector('.usersManager')).to.matchImage('resend_success'); + }); + + // admin user tests describe('UsersManager_admin_view', function () { before(async function () { diff --git a/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_add_new_user_form.png b/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_add_new_user_form.png index 49beda2f91..20d1fa159a 100644 --- a/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_add_new_user_form.png +++ b/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_add_new_user_form.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:df465b8206b76a6057fb58a5d48aeffb444e80ead2d0a6ea7a924b6b232e3f6b -size 51512 +oid sha256:fb9640614a2c2ce098c4c0d5320206cdac71c0611d7bd9e9c0e9a4d1c03a2827 +size 51975 diff --git a/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_admin_view_admin_add_user.png b/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_admin_view_admin_add_user.png index 49beda2f91..20d1fa159a 100644 --- a/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_admin_view_admin_add_user.png +++ b/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_admin_view_admin_add_user.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:df465b8206b76a6057fb58a5d48aeffb444e80ead2d0a6ea7a924b6b232e3f6b -size 51512 +oid sha256:fb9640614a2c2ce098c4c0d5320206cdac71c0611d7bd9e9c0e9a4d1c03a2827 +size 51975 diff --git a/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_admin_view_admin_add_user_by_email.png b/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_admin_view_admin_add_user_by_email.png index f367d4283b..4a95db6ece 100644 --- a/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_admin_view_admin_add_user_by_email.png +++ b/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_admin_view_admin_add_user_by_email.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:99aa09442363e539084d440c5f72c586e170f5c08202e3c7717ed94d107ab000 -size 46067 +oid sha256:ae0a19a32d2fb0ba3df609914db1710754aaf0bb4f852027d6a9a2498e19b9eb +size 45809 diff --git a/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_admin_view_admin_add_user_by_login.png b/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_admin_view_admin_add_user_by_login.png index d1269abd39..13c37d4e8a 100644 --- a/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_admin_view_admin_add_user_by_login.png +++ b/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_admin_view_admin_add_user_by_login.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:44c6177345745953c3eb700166b3d9826de1a83eea8ef8a2e25a7348905df814 -size 44138 +oid sha256:33ef14962b6edc965b2b928fbacf586e73222606fc73c5852e0186fbbf4bfbb9 +size 43835 diff --git a/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_admin_view_admin_add_user_not_exists.png b/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_admin_view_admin_add_user_not_exists.png index afffee7f11..fb6f3d074c 100644 --- a/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_admin_view_admin_add_user_not_exists.png +++ b/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_admin_view_admin_add_user_not_exists.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:2eaf09b2a278a4524a299fdabe08ec8f9127847af03b2380020f942135217f40 -size 40075 +oid sha256:8b0148b8066cee3d6b256d38a08753da4f3c3356075a719a44c7ce8ba25c4f14 +size 40840 diff --git a/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_admin_view_admin_load.png b/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_admin_view_admin_load.png index ed6d558535..6cf6aa4384 100644 --- a/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_admin_view_admin_load.png +++ b/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_admin_view_admin_load.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:3f7a1c8ede3bb61b869dbab37be56d784879f3d7be5c4e80bb86e7f275487374 -size 136964 +oid sha256:8a2c8af6d0c208d6803094f9762157429155751ae77240e796d18b44a8fdc18d +size 125120 diff --git a/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_all_rows_deselected.png b/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_all_rows_deselected.png index eeb04639af..fbbf3f66d2 100644 --- a/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_all_rows_deselected.png +++ b/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_all_rows_deselected.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:90cbdd69c29d89d3b843c3b29f8d2f06c1f9ae12cd547a385415ab94af710e98 -size 189876 +oid sha256:7b47dc217801273f99419123512394169fc612f2617ce2901e2ac7e88a5c2614 +size 177823 diff --git a/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_all_rows_in_search.png b/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_all_rows_in_search.png index c4f3c28fda..f1617699f0 100644 --- a/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_all_rows_in_search.png +++ b/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_all_rows_in_search.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:3c5af9e3e3b371d75765dfa99ac73239fa0bc6d5f28503aa9ddcde5cf8c36d67 -size 190238 +oid sha256:d572a26d1f78df50632821e9bd237e667bacf4c3bd18b9cbeb7d2a09821bfc7f +size 178182 diff --git a/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_all_rows_selected.png b/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_all_rows_selected.png index eeb04639af..fbbf3f66d2 100644 --- a/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_all_rows_selected.png +++ b/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_all_rows_selected.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:90cbdd69c29d89d3b843c3b29f8d2f06c1f9ae12cd547a385415ab94af710e98 -size 189876 +oid sha256:7b47dc217801273f99419123512394169fc612f2617ce2901e2ac7e88a5c2614 +size 177823 diff --git a/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_bulk_remove_access.png b/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_bulk_remove_access.png index a5e69931ad..0bf31bcb2d 100644 --- a/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_bulk_remove_access.png +++ b/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_bulk_remove_access.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:9a6067784a28a84cf9994cdd648f37fa471f51e34efce5d5e84d09665e5f518a -size 180900 +oid sha256:2c5cfbb45de502c5c709a8b9e729d17d7c5207f3a52d2e5a80251e8f044ab8e0 +size 168877 diff --git a/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_bulk_set_access.png b/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_bulk_set_access.png index 7197789c4a..ffe716941e 100644 --- a/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_bulk_set_access.png +++ b/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_bulk_set_access.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:de69e012f88d200df0fb0fac97485a9949fa3af94c89c828513eaa5a25cb06e9 -size 171656 +oid sha256:49f5101fa39e83217cb385ad9b11d19c138cd8063f1bc730006876f8bd622968 +size 159347 diff --git a/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_bulk_set_access_confirm.png b/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_bulk_set_access_confirm.png index 3756acdcee..87346b5818 100644 --- a/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_bulk_set_access_confirm.png +++ b/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_bulk_set_access_confirm.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:18dc30ffd01c62b5f591b05cc85b76a25786eb935f0538e65656f8848f0c59c8 -size 9351 +oid sha256:7223123c832edc705080b0bfbcd92ea4fa00255cfb17bde06cf04dfefb5b97f1 +size 9526 diff --git a/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_delete_bulk_access.png b/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_delete_bulk_access.png index dca72af936..436da04ed1 100644 --- a/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_delete_bulk_access.png +++ b/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_delete_bulk_access.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:92168d09555061bed7c9744f3b5252fc5328a24c51f80df7cb56331b398c04be -size 26969 +oid sha256:142a425ca04ec7b5a1580ac02fc2e29545348e586342c7f03ab1ea6563127443 +size 170040 diff --git a/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_delete_single.png b/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_delete_single.png index fc91101f8b..0cff043a61 100644 --- a/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_delete_single.png +++ b/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_delete_single.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:7f4cb4fcec0ec3eebad0063bddbfd1d7e0c8410a64ee8569d5ef78f8df3302a5 -size 170348 +oid sha256:27f1f1974ce5f805d81fe0ecade75d98a667d9c82e08b765cfd68be9a6e09a60 +size 171357 diff --git a/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_edit_user_basic_asks_confirmation.png b/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_edit_user_basic_asks_confirmation.png index 7854904373..e44dd90328 100644 --- a/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_edit_user_basic_asks_confirmation.png +++ b/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_edit_user_basic_asks_confirmation.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:86f5888587a18b98c0118ad5709d6d3d98486ac8f3f5f5f6c82a5936d72eafed -size 21978 +oid sha256:3b47b430f67f92811615b9b10dafc3137923b849580f50256598bc33e92d3bc5 +size 21831 diff --git a/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_edit_user_basic_confirmed_wrong_password.png b/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_edit_user_basic_confirmed_wrong_password.png index c5325fd782..c3a3455aaf 100644 --- a/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_edit_user_basic_confirmed_wrong_password.png +++ b/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_edit_user_basic_confirmed_wrong_password.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:052ed4ad65093f9967ddf7366847fc53fae99260bdbfced20f7bf11f9e33d3f2 -size 31099 +oid sha256:319f8ab21d7da64f61896b14966b3a290682a294b25e5372d22bd8ed8efb999d +size 30872 diff --git a/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_edit_user_form.png b/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_edit_user_form.png index 107d81d036..3e090100ff 100644 --- a/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_edit_user_form.png +++ b/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_edit_user_form.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:37d8b53b65dbe7e0b696f83e5ab4b8a2e4787ad5a524eb6dd619f1d3f5f56d82 -size 24864 +oid sha256:6808d97c5c13d69a0a622c925bd77000d8ec9807d5adc574f4961c88632863d1 +size 24258 diff --git a/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_filters.png b/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_filters.png index bd497115da..dc6d7c5cfd 100644 --- a/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_filters.png +++ b/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_filters.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:97938e80121da3aa373377e92066c1798341c91a53de14e516668e2467b3e5cb -size 172026 +oid sha256:5941c7d9be4d9648c7dd0a04ad0fbd71ec1a650b908526e28e541c87de60e86e +size 45243 diff --git a/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_load.png b/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_load.png index accf87147a..3896263dca 100644 --- a/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_load.png +++ b/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_load.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f9a2640f91c653940bd7f4f3f631f370122e6e7d81635fb18ada658e7f18fc01 -size 179096 +oid sha256:cc295812f1eddc30410ae5699b5c8b42b68c73da7dd046cde5ee40670c083f8f +size 180107 diff --git a/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_manage_users_back.png b/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_manage_users_back.png index 953c45f5cb..c1f185df9b 100644 --- a/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_manage_users_back.png +++ b/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_manage_users_back.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d15a7db15186c51b0103b34a6c842a10175a9993cc8c16a273c1f4bfb6bcafea -size 167125 +oid sha256:d399814e61b3b412ec24fd978138b935061a04f99d00abfd4c9e873704973f17 +size 181925 diff --git a/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_next_click.png b/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_next_click.png index accf87147a..0d9e82b574 100644 --- a/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_next_click.png +++ b/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_next_click.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f9a2640f91c653940bd7f4f3f631f370122e6e7d81635fb18ada658e7f18fc01 -size 179096 +oid sha256:563c7d96fe000357dbcd919bd7dd0c84ad9bd27985fb02a124f21b99abe2f5d6 +size 182540 diff --git a/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_permissions_all_rows_in_search.png b/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_permissions_all_rows_in_search.png index 5446e90a8f..793b53faa1 100644 --- a/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_permissions_all_rows_in_search.png +++ b/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_permissions_all_rows_in_search.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a828ac11b951dad41d2c9fde7ef4dba7fb3a0054a6f5642062fc5e2e90960ecb -size 92981 +oid sha256:79a3ac1d3b23ba1e7796be19ffd00441047d4b8a5bd012a922dbf93796601d6d +size 108004 diff --git a/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_permissions_edit.png b/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_permissions_edit.png index ef51a6b1dd..3682b1348e 100644 --- a/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_permissions_edit.png +++ b/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_permissions_edit.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:030cf64820bb2651df8089d886d22d734c8bf4db15003a1a03358808e6d22923 -size 81545 +oid sha256:0f73adc2c884b138c888a1edb0632ad192331cb4c8d8d17141a285a9a0f0e725 +size 96478 diff --git a/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_previous.png b/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_previous.png index 69eeda3864..b5b82113e2 100644 --- a/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_previous.png +++ b/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_previous.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:3a1f5d5c5e0015870d94550a7a08cb4ea7833171648398308c917183790da3db -size 170518 +oid sha256:e11665e96a0656366b93e8bed7f6d74a41bbeb68e1edc91b9b3382b45f07cced +size 171421 diff --git a/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_resend_popup.png b/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_resend_popup.png index 25cd79c9cd..23e1465e86 100644 --- a/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_resend_popup.png +++ b/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_resend_popup.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:28f70514a1c2aac645aef53f388bbe9428249d836d75c9b0bed1868c06eafb99 -size 189374 +oid sha256:fb25420e0fd845fe553714b65a914d430614b957f4aa725d397fdca1bdcecb3a +size 178586 diff --git a/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_resend_success.png b/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_resend_success.png new file mode 100644 index 0000000000..d945863595 --- /dev/null +++ b/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_resend_success.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:017e01af7e66509501c90f039bea70acf3a153e6745807dd0046e3849be13de8 +size 183036 diff --git a/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_role_for.png b/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_role_for.png index a388c9481a..58b34e9a60 100644 --- a/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_role_for.png +++ b/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_role_for.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:1fadec033c757181ce95c7364517de678dd933400259177cef0d2f87cfa6caeb -size 175226 +oid sha256:8006f4ec6a1f7e33fb45be40c9fb91a6872e8e6f4b219844f3d9baf3f22217bc +size 163058 diff --git a/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_rows_selected.png b/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_rows_selected.png index 48a5b74dc8..acd1c4131e 100644 --- a/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_rows_selected.png +++ b/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_rows_selected.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5ae5ffd11859c0040e4203967390d76c3fac06b2626579bb0eb3928ef732a42d -size 176975 +oid sha256:06d07ec3dceaae33679ac0fe68b891627d45c859d38fe37f676316ffedcfec20 +size 164900 diff --git a/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_user_created.png b/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_user_created.png index 0d4934988b..9184f1a37d 100644 --- a/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_user_created.png +++ b/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_user_created.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:406437e042339b681e39ce9e745e8ee5e391fd758a3bee0b8a1651a9c80f5c96 -size 22488 +oid sha256:f97cfaa64c56e51a88d1f4727be80753f5e51956fd474d4d1ec89a5dfd0d5508 +size 22833 diff --git a/plugins/UsersManager/vue/dist/UsersManager.umd.js b/plugins/UsersManager/vue/dist/UsersManager.umd.js index 424ce5a8c1..065b5b3fe4 100644 --- a/plugins/UsersManager/vue/dist/UsersManager.umd.js +++ b/plugins/UsersManager/vue/dist/UsersManager.umd.js @@ -103,13 +103,6 @@ module.exports = __WEBPACK_EXTERNAL_MODULE__19dc__; /***/ }), -/***/ "8bba": -/***/ (function(module, exports, __webpack_require__) { - -// extracted by mini-css-extract-plugin - -/***/ }), - /***/ "8bbf": /***/ (function(module, exports) { @@ -124,17 +117,6 @@ module.exports = __WEBPACK_EXTERNAL_MODULE_a5a2__; /***/ }), -/***/ "f2d6": -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -/* harmony import */ var _node_modules_vue_cli_service_node_modules_mini_css_extract_plugin_dist_loader_js_ref_6_oneOf_1_0_node_modules_vue_cli_service_node_modules_css_loader_dist_cjs_js_ref_6_oneOf_1_1_node_modules_vue_cli_service_node_modules_vue_loader_v16_dist_stylePostLoader_js_node_modules_postcss_loader_src_index_js_ref_6_oneOf_1_2_node_modules_vue_cli_service_node_modules_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_cli_service_node_modules_vue_loader_v16_dist_index_js_ref_0_1_PagedUsersList_vue_vue_type_style_index_0_id_2ff6c088_scoped_true_lang_css__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__("8bba"); -/* harmony import */ var _node_modules_vue_cli_service_node_modules_mini_css_extract_plugin_dist_loader_js_ref_6_oneOf_1_0_node_modules_vue_cli_service_node_modules_css_loader_dist_cjs_js_ref_6_oneOf_1_1_node_modules_vue_cli_service_node_modules_vue_loader_v16_dist_stylePostLoader_js_node_modules_postcss_loader_src_index_js_ref_6_oneOf_1_2_node_modules_vue_cli_service_node_modules_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_cli_service_node_modules_vue_loader_v16_dist_index_js_ref_0_1_PagedUsersList_vue_vue_type_style_index_0_id_2ff6c088_scoped_true_lang_css__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_vue_cli_service_node_modules_mini_css_extract_plugin_dist_loader_js_ref_6_oneOf_1_0_node_modules_vue_cli_service_node_modules_css_loader_dist_cjs_js_ref_6_oneOf_1_1_node_modules_vue_cli_service_node_modules_vue_loader_v16_dist_stylePostLoader_js_node_modules_postcss_loader_src_index_js_ref_6_oneOf_1_2_node_modules_vue_cli_service_node_modules_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_cli_service_node_modules_vue_loader_v16_dist_index_js_ref_0_1_PagedUsersList_vue_vue_type_style_index_0_id_2ff6c088_scoped_true_lang_css__WEBPACK_IMPORTED_MODULE_0__); -/* unused harmony reexport * */ - - -/***/ }), - /***/ "fae3": /***/ (function(module, __webpack_exports__, __webpack_require__) { @@ -1466,119 +1448,119 @@ UserPermissionsEditvue_type_script_lang_ts.render = UserPermissionsEditvue_type_ directiveName: 'piwikUserPermissionsEdit', restrict: 'E' })); -// CONCATENATED MODULE: ./node_modules/@vue/cli-plugin-babel/node_modules/cache-loader/dist/cjs.js??ref--12-0!./node_modules/@vue/cli-plugin-babel/node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib!./node_modules/@vue/cli-service/node_modules/vue-loader-v16/dist/templateLoader.js??ref--6!./node_modules/@vue/cli-service/node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/@vue/cli-service/node_modules/vue-loader-v16/dist??ref--0-1!./plugins/UsersManager/vue/src/UserEditForm/UserEditForm.vue?vue&type=template&id=630fdb84 +// CONCATENATED MODULE: ./node_modules/@vue/cli-plugin-babel/node_modules/cache-loader/dist/cjs.js??ref--12-0!./node_modules/@vue/cli-plugin-babel/node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib!./node_modules/@vue/cli-service/node_modules/vue-loader-v16/dist/templateLoader.js??ref--6!./node_modules/@vue/cli-service/node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/@vue/cli-service/node_modules/vue-loader-v16/dist??ref--0-1!./plugins/UsersManager/vue/src/UserEditForm/UserEditForm.vue?vue&type=template&id=71e0c307 -var UserEditFormvue_type_template_id_630fdb84_hoisted_1 = { +var UserEditFormvue_type_template_id_71e0c307_hoisted_1 = { class: "row" }; -var UserEditFormvue_type_template_id_630fdb84_hoisted_2 = { +var UserEditFormvue_type_template_id_71e0c307_hoisted_2 = { key: 0, class: "col m2 entityList" }; -var UserEditFormvue_type_template_id_630fdb84_hoisted_3 = { +var UserEditFormvue_type_template_id_71e0c307_hoisted_3 = { class: "listCircle" }; -var UserEditFormvue_type_template_id_630fdb84_hoisted_4 = { +var UserEditFormvue_type_template_id_71e0c307_hoisted_4 = { key: 0, class: "icon-warning" }; -var UserEditFormvue_type_template_id_630fdb84_hoisted_5 = /*#__PURE__*/Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", { +var UserEditFormvue_type_template_id_71e0c307_hoisted_5 = /*#__PURE__*/Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", { class: "save-button-spacer hide-on-small-only" }, null, -1); -var UserEditFormvue_type_template_id_630fdb84_hoisted_6 = { +var UserEditFormvue_type_template_id_71e0c307_hoisted_6 = { href: "", class: "entityCancelLink" }; -var UserEditFormvue_type_template_id_630fdb84_hoisted_7 = { +var UserEditFormvue_type_template_id_71e0c307_hoisted_7 = { class: "visibleTab col m10" }; -var UserEditFormvue_type_template_id_630fdb84_hoisted_8 = { +var UserEditFormvue_type_template_id_71e0c307_hoisted_8 = { key: 0, class: "basic-info-tab" }; -var UserEditFormvue_type_template_id_630fdb84_hoisted_9 = { +var UserEditFormvue_type_template_id_71e0c307_hoisted_9 = { class: "form-group row", style: { "position": "relative" } }; -var UserEditFormvue_type_template_id_630fdb84_hoisted_10 = { +var UserEditFormvue_type_template_id_71e0c307_hoisted_10 = { class: "col s12 m6" }; -var UserEditFormvue_type_template_id_630fdb84_hoisted_11 = { +var UserEditFormvue_type_template_id_71e0c307_hoisted_11 = { class: "col s12 m6" }; -var UserEditFormvue_type_template_id_630fdb84_hoisted_12 = { +var UserEditFormvue_type_template_id_71e0c307_hoisted_12 = { key: 0, class: "form-help" }; -var UserEditFormvue_type_template_id_630fdb84_hoisted_13 = ["innerHTML"]; -var UserEditFormvue_type_template_id_630fdb84_hoisted_14 = { +var UserEditFormvue_type_template_id_71e0c307_hoisted_13 = ["innerHTML"]; +var UserEditFormvue_type_template_id_71e0c307_hoisted_14 = { key: 0, class: "entityCancel" }; -var UserEditFormvue_type_template_id_630fdb84_hoisted_15 = { +var UserEditFormvue_type_template_id_71e0c307_hoisted_15 = { key: 1, class: "user-permissions" }; -var UserEditFormvue_type_template_id_630fdb84_hoisted_16 = { +var UserEditFormvue_type_template_id_71e0c307_hoisted_16 = { key: 0 }; -var UserEditFormvue_type_template_id_630fdb84_hoisted_17 = { +var UserEditFormvue_type_template_id_71e0c307_hoisted_17 = { key: 1, class: "alert alert-info" }; -var UserEditFormvue_type_template_id_630fdb84_hoisted_18 = { +var UserEditFormvue_type_template_id_71e0c307_hoisted_18 = { key: 2, class: "superuser-access" }; -var UserEditFormvue_type_template_id_630fdb84_hoisted_19 = { +var UserEditFormvue_type_template_id_71e0c307_hoisted_19 = { class: "superuser-confirm-modal modal", ref: "superUserConfirmModal" }; -var UserEditFormvue_type_template_id_630fdb84_hoisted_20 = { +var UserEditFormvue_type_template_id_71e0c307_hoisted_20 = { class: "modal-content" }; -var UserEditFormvue_type_template_id_630fdb84_hoisted_21 = { +var UserEditFormvue_type_template_id_71e0c307_hoisted_21 = { key: 0 }; -var UserEditFormvue_type_template_id_630fdb84_hoisted_22 = { +var UserEditFormvue_type_template_id_71e0c307_hoisted_22 = { key: 1 }; -var UserEditFormvue_type_template_id_630fdb84_hoisted_23 = { +var UserEditFormvue_type_template_id_71e0c307_hoisted_23 = { class: "modal-footer" }; -var UserEditFormvue_type_template_id_630fdb84_hoisted_24 = { +var UserEditFormvue_type_template_id_71e0c307_hoisted_24 = { key: 3, class: "twofa-reset" }; -var UserEditFormvue_type_template_id_630fdb84_hoisted_25 = { +var UserEditFormvue_type_template_id_71e0c307_hoisted_25 = { class: "resetTwoFa" }; -var UserEditFormvue_type_template_id_630fdb84_hoisted_26 = { +var UserEditFormvue_type_template_id_71e0c307_hoisted_26 = { class: "twofa-confirm-modal modal", ref: "twofaConfirmModal" }; -var UserEditFormvue_type_template_id_630fdb84_hoisted_27 = { +var UserEditFormvue_type_template_id_71e0c307_hoisted_27 = { class: "modal-content" }; -var UserEditFormvue_type_template_id_630fdb84_hoisted_28 = { +var UserEditFormvue_type_template_id_71e0c307_hoisted_28 = { class: "modal-footer" }; -var UserEditFormvue_type_template_id_630fdb84_hoisted_29 = { +var UserEditFormvue_type_template_id_71e0c307_hoisted_29 = { class: "change-password-modal modal", ref: "changePasswordModal" }; -var UserEditFormvue_type_template_id_630fdb84_hoisted_30 = { +var UserEditFormvue_type_template_id_71e0c307_hoisted_30 = { class: "modal-content" }; -var UserEditFormvue_type_template_id_630fdb84_hoisted_31 = ["innerHTML"]; -var UserEditFormvue_type_template_id_630fdb84_hoisted_32 = { +var UserEditFormvue_type_template_id_71e0c307_hoisted_31 = ["innerHTML"]; +var UserEditFormvue_type_template_id_71e0c307_hoisted_32 = { class: "modal-footer" }; -function UserEditFormvue_type_template_id_630fdb84_render(_ctx, _cache, $props, $setup, $data, $options) { +function UserEditFormvue_type_template_id_71e0c307_render(_ctx, _cache, $props, $setup, $data, $options) { var _component_Field = Object(external_commonjs_vue_commonjs2_vue_root_Vue_["resolveComponent"])("Field"); var _component_SaveButton = Object(external_commonjs_vue_commonjs2_vue_root_Vue_["resolveComponent"])("SaveButton"); @@ -1596,7 +1578,7 @@ function UserEditFormvue_type_template_id_630fdb84_render(_ctx, _cache, $props, "content-title": "".concat(_ctx.formTitle, " ").concat(!_ctx.isAdd ? "'".concat(_ctx.theUser.login, "'") : '') }, { default: Object(external_commonjs_vue_commonjs2_vue_root_Vue_["withCtx"])(function () { - return [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["withDirectives"])(Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", UserEditFormvue_type_template_id_630fdb84_hoisted_1, [!_ctx.isAdd ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("div", UserEditFormvue_type_template_id_630fdb84_hoisted_2, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("ul", UserEditFormvue_type_template_id_630fdb84_hoisted_3, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("li", { + return [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["withDirectives"])(Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", UserEditFormvue_type_template_id_71e0c307_hoisted_1, [!_ctx.isAdd ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("div", UserEditFormvue_type_template_id_71e0c307_hoisted_2, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("ul", UserEditFormvue_type_template_id_71e0c307_hoisted_3, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("li", { class: Object(external_commonjs_vue_commonjs2_vue_root_Vue_["normalizeClass"])([{ active: _ctx.activeTab === 'basic' }, "menuBasicInfo"]) @@ -1617,7 +1599,7 @@ function UserEditFormvue_type_template_id_630fdb84_render(_ctx, _cache, $props, style: { "margin-right": "3.5px" } - }, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('UsersManager_Permissions')), 1), !_ctx.userHasAccess && !_ctx.theUser.superuser_access ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("span", UserEditFormvue_type_template_id_630fdb84_hoisted_4)) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true)], 2), _ctx.currentUserRole === 'superuser' ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("li", { + }, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('UsersManager_Permissions')), 1), !_ctx.userHasAccess && !_ctx.theUser.superuser_access ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("span", UserEditFormvue_type_template_id_71e0c307_hoisted_4)) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true)], 2), _ctx.currentUserRole === 'superuser' ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("li", { key: 0, class: Object(external_commonjs_vue_commonjs2_vue_root_Vue_["normalizeClass"])([{ active: _ctx.activeTab === 'superuser' @@ -1637,12 +1619,12 @@ function UserEditFormvue_type_template_id_630fdb84_render(_ctx, _cache, $props, onClick: _cache[3] || (_cache[3] = Object(external_commonjs_vue_commonjs2_vue_root_Vue_["withModifiers"])(function ($event) { return _ctx.activeTab = '2fa'; }, ["prevent"])) - }, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('UsersManager_TwoFactorAuthentication')), 1)], 2)) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true)]), UserEditFormvue_type_template_id_630fdb84_hoisted_5, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", { + }, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('UsersManager_TwoFactorAuthentication')), 1)], 2)) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true)]), UserEditFormvue_type_template_id_71e0c307_hoisted_5, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", { class: "entityCancel", onClick: _cache[4] || (_cache[4] = Object(external_commonjs_vue_commonjs2_vue_root_Vue_["withModifiers"])(function ($event) { return _ctx.onDoneEditing(); }, ["prevent"])) - }, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("a", UserEditFormvue_type_template_id_630fdb84_hoisted_6, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('Mobile_NavigationBack')), 1)])])) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", UserEditFormvue_type_template_id_630fdb84_hoisted_7, [_ctx.activeTab === 'basic' ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("div", UserEditFormvue_type_template_id_630fdb84_hoisted_8, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", null, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createVNode"])(_component_Field, { + }, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("a", UserEditFormvue_type_template_id_71e0c307_hoisted_6, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('Mobile_NavigationBack')), 1)])])) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", UserEditFormvue_type_template_id_71e0c307_hoisted_7, [_ctx.activeTab === 'basic' ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("div", UserEditFormvue_type_template_id_71e0c307_hoisted_8, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", null, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createVNode"])(_component_Field, { modelValue: _ctx.theUser.login, "onUpdate:modelValue": _cache[5] || (_cache[5] = function ($event) { return _ctx.theUser.login = $event; @@ -1652,7 +1634,7 @@ function UserEditFormvue_type_template_id_630fdb84_render(_ctx, _cache, $props, name: "user_login", maxlength: 100, title: _ctx.translate('General_Username') - }, null, 8, ["modelValue", "disabled", "title"])]), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", null, [_ctx.isPendingUser ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createBlock"])(_component_Field, { + }, null, 8, ["modelValue", "disabled", "title"])]), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", null, [!_ctx.isPending ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createBlock"])(_component_Field, { key: 0, "model-value": _ctx.theUser.password, disabled: _ctx.isSavingUserInfo || _ctx.currentUserRole !== 'superuser' && !_ctx.isAdd || _ctx.isShowingPasswordConfirm, @@ -1688,7 +1670,7 @@ function UserEditFormvue_type_template_id_630fdb84_render(_ctx, _cache, $props, }, title: _ctx.translate('UsersManager_FirstWebsitePermission'), "inline-help": _ctx.translate('UsersManager_FirstSiteInlineHelp') - }, null, 8, ["modelValue", "disabled", "title", "inline-help"])) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true)]), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", null, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", UserEditFormvue_type_template_id_630fdb84_hoisted_9, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", UserEditFormvue_type_template_id_630fdb84_hoisted_10, [_ctx.currentUserRole === 'superuser' || _ctx.isAdd ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createBlock"])(_component_SaveButton, { + }, null, 8, ["modelValue", "disabled", "title", "inline-help"])) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true)]), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", null, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", UserEditFormvue_type_template_id_71e0c307_hoisted_9, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", UserEditFormvue_type_template_id_71e0c307_hoisted_10, [_ctx.currentUserRole === 'superuser' || _ctx.isAdd ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createBlock"])(_component_SaveButton, { key: 0, style: { "position": "absolute", @@ -1700,16 +1682,16 @@ function UserEditFormvue_type_template_id_630fdb84_render(_ctx, _cache, $props, onConfirm: _cache[9] || (_cache[9] = function ($event) { return _ctx.saveUserInfo(); }) - }, null, 8, ["value", "disabled", "saving"])) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true)]), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", UserEditFormvue_type_template_id_630fdb84_hoisted_11, [_ctx.isAdd ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("div", UserEditFormvue_type_template_id_630fdb84_hoisted_12, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("span", { + }, null, 8, ["value", "disabled", "saving"])) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true)]), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", UserEditFormvue_type_template_id_71e0c307_hoisted_11, [_ctx.isAdd ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("div", UserEditFormvue_type_template_id_71e0c307_hoisted_12, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("span", { class: "inline-help", innerHTML: _ctx.$sanitize(_ctx.translate('UsersManager_InviteSuccessNotification', [7])) - }, null, 8, UserEditFormvue_type_template_id_630fdb84_hoisted_13)])) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true)])])]), _ctx.isAdd ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("div", UserEditFormvue_type_template_id_630fdb84_hoisted_14, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("a", { + }, null, 8, UserEditFormvue_type_template_id_71e0c307_hoisted_13)])) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true)])])]), _ctx.isAdd ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("div", UserEditFormvue_type_template_id_71e0c307_hoisted_14, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("a", { href: "", class: "entityCancelLink", onClick: _cache[10] || (_cache[10] = Object(external_commonjs_vue_commonjs2_vue_root_Vue_["withModifiers"])(function ($event) { return _ctx.onDoneEditing(); }, ["prevent"])) - }, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('General_Cancel')), 1)])) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true)])) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true), !_ctx.isAdd ? Object(external_commonjs_vue_commonjs2_vue_root_Vue_["withDirectives"])((Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("div", UserEditFormvue_type_template_id_630fdb84_hoisted_15, [!_ctx.theUser.superuser_access ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("div", UserEditFormvue_type_template_id_630fdb84_hoisted_16, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createVNode"])(_component_UserPermissionsEdit, { + }, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('General_Cancel')), 1)])) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true)])) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true), !_ctx.isAdd ? Object(external_commonjs_vue_commonjs2_vue_root_Vue_["withDirectives"])((Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("div", UserEditFormvue_type_template_id_71e0c307_hoisted_15, [!_ctx.theUser.superuser_access ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("div", UserEditFormvue_type_template_id_71e0c307_hoisted_16, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createVNode"])(_component_UserPermissionsEdit, { "user-login": _ctx.theUser.login, onUserHasAccessDetected: _cache[11] || (_cache[11] = function ($event) { return _ctx.userHasAccess = $event.hasAccess; @@ -1719,7 +1701,7 @@ function UserEditFormvue_type_template_id_630fdb84_render(_ctx, _cache, $props, }), "access-levels": _ctx.accessLevels, "filter-access-levels": _ctx.filterAccessLevels - }, null, 8, ["user-login", "access-levels", "filter-access-levels"])])) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true), _ctx.theUser.superuser_access ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("div", UserEditFormvue_type_template_id_630fdb84_hoisted_17, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('UsersManager_SuperUsersPermissionsNotice')), 1)) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true)], 512)), [[external_commonjs_vue_commonjs2_vue_root_Vue_["vShow"], _ctx.activeTab === 'permissions']]) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true), _ctx.activeTab === 'superuser' && _ctx.currentUserRole === 'superuser' && !_ctx.isAdd ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("div", UserEditFormvue_type_template_id_630fdb84_hoisted_18, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("p", null, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('UsersManager_SuperUserIntro1')), 1), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("p", null, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("strong", null, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('UsersManager_SuperUserIntro2')), 1)]), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", null, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createVNode"])(_component_Field, { + }, null, 8, ["user-login", "access-levels", "filter-access-levels"])])) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true), _ctx.theUser.superuser_access ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("div", UserEditFormvue_type_template_id_71e0c307_hoisted_17, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('UsersManager_SuperUsersPermissionsNotice')), 1)) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true)], 512)), [[external_commonjs_vue_commonjs2_vue_root_Vue_["vShow"], _ctx.activeTab === 'permissions']]) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true), _ctx.activeTab === 'superuser' && _ctx.currentUserRole === 'superuser' && !_ctx.isAdd ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("div", UserEditFormvue_type_template_id_71e0c307_hoisted_18, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("p", null, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('UsersManager_SuperUserIntro1')), 1), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("p", null, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("strong", null, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('UsersManager_SuperUserIntro2')), 1)]), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", null, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createVNode"])(_component_Field, { modelValue: _ctx.superUserAccessChecked, "onUpdate:modelValue": _cache[13] || (_cache[13] = function ($event) { return _ctx.superUserAccessChecked = $event; @@ -1731,7 +1713,7 @@ function UserEditFormvue_type_template_id_630fdb84_render(_ctx, _cache, $props, uicontrol: "checkbox", name: "superuser_access", title: _ctx.translate('UsersManager_HasSuperUserAccess') - }, null, 8, ["modelValue", "disabled", "title"])]), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", UserEditFormvue_type_template_id_630fdb84_hoisted_19, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", UserEditFormvue_type_template_id_630fdb84_hoisted_20, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("h2", null, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('UsersManager_AreYouSure')), 1), _ctx.theUser.superuser_access ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("p", UserEditFormvue_type_template_id_630fdb84_hoisted_21, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('UsersManager_RemoveSuperuserAccessConfirm')), 1)) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true), !_ctx.theUser.superuser_access ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("p", UserEditFormvue_type_template_id_630fdb84_hoisted_22, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('UsersManager_AddSuperuserAccessConfirm')), 1)) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", null, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createVNode"])(_component_Field, { + }, null, 8, ["modelValue", "disabled", "title"])]), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", UserEditFormvue_type_template_id_71e0c307_hoisted_19, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", UserEditFormvue_type_template_id_71e0c307_hoisted_20, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("h2", null, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('UsersManager_AreYouSure')), 1), _ctx.theUser.superuser_access ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("p", UserEditFormvue_type_template_id_71e0c307_hoisted_21, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('UsersManager_RemoveSuperuserAccessConfirm')), 1)) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true), !_ctx.theUser.superuser_access ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("p", UserEditFormvue_type_template_id_71e0c307_hoisted_22, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('UsersManager_AddSuperuserAccessConfirm')), 1)) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", null, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createVNode"])(_component_Field, { modelValue: _ctx.passwordConfirmationForSuperUser, "onUpdate:modelValue": _cache[15] || (_cache[15] = function ($event) { return _ctx.passwordConfirmationForSuperUser = $event; @@ -1741,7 +1723,7 @@ function UserEditFormvue_type_template_id_630fdb84_render(_ctx, _cache, $props, autocomplete: false, "full-width": true, title: _ctx.translate('UsersManager_YourCurrentPassword') - }, null, 8, ["modelValue", "title"])])]), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", UserEditFormvue_type_template_id_630fdb84_hoisted_23, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("a", { + }, null, 8, ["modelValue", "title"])])]), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", UserEditFormvue_type_template_id_71e0c307_hoisted_23, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("a", { href: "", class: "modal-action modal-close btn", onClick: _cache[16] || (_cache[16] = Object(external_commonjs_vue_commonjs2_vue_root_Vue_["withModifiers"])(function ($event) { @@ -1758,13 +1740,13 @@ function UserEditFormvue_type_template_id_630fdb84_render(_ctx, _cache, $props, _ctx.passwordConfirmationForSuperUser = ''; }, ["prevent"])) - }, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('General_No')), 1)])], 512)])) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true), _ctx.currentUserRole === 'superuser' && !_ctx.isAdd ? Object(external_commonjs_vue_commonjs2_vue_root_Vue_["withDirectives"])((Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("div", UserEditFormvue_type_template_id_630fdb84_hoisted_24, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("p", null, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('UsersManager_ResetTwoFactorAuthenticationInfo')), 1), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", UserEditFormvue_type_template_id_630fdb84_hoisted_25, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createVNode"])(_component_SaveButton, { + }, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('General_No')), 1)])], 512)])) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true), _ctx.currentUserRole === 'superuser' && !_ctx.isAdd ? Object(external_commonjs_vue_commonjs2_vue_root_Vue_["withDirectives"])((Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("div", UserEditFormvue_type_template_id_71e0c307_hoisted_24, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("p", null, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('UsersManager_ResetTwoFactorAuthenticationInfo')), 1), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", UserEditFormvue_type_template_id_71e0c307_hoisted_25, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createVNode"])(_component_SaveButton, { saving: _ctx.isResetting2FA, onConfirm: _cache[18] || (_cache[18] = function ($event) { return _ctx.confirmReset2FA(); }), value: _ctx.translate('UsersManager_ResetTwoFactorAuthentication') - }, null, 8, ["saving", "value"])]), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", UserEditFormvue_type_template_id_630fdb84_hoisted_26, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", UserEditFormvue_type_template_id_630fdb84_hoisted_27, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("h2", null, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('UsersManager_AreYouSure')), 1), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("p", null, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('UsersManager_ConfirmWithPassword')), 1), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", null, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createVNode"])(_component_Field, { + }, null, 8, ["saving", "value"])]), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", UserEditFormvue_type_template_id_71e0c307_hoisted_26, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", UserEditFormvue_type_template_id_71e0c307_hoisted_27, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("h2", null, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('UsersManager_AreYouSure')), 1), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("p", null, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('UsersManager_ConfirmWithPassword')), 1), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", null, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createVNode"])(_component_Field, { modelValue: _ctx.passwordConfirmation, "onUpdate:modelValue": _cache[19] || (_cache[19] = function ($event) { return _ctx.passwordConfirmation = $event; @@ -1774,7 +1756,7 @@ function UserEditFormvue_type_template_id_630fdb84_render(_ctx, _cache, $props, autocomplete: false, "full-width": true, title: _ctx.translate('UsersManager_YourCurrentPassword') - }, null, 8, ["modelValue", "title"])])]), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", UserEditFormvue_type_template_id_630fdb84_hoisted_28, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("a", { + }, null, 8, ["modelValue", "title"])])]), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", UserEditFormvue_type_template_id_71e0c307_hoisted_28, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("a", { href: "", class: "modal-action modal-close btn", onClick: _cache[20] || (_cache[20] = Object(external_commonjs_vue_commonjs2_vue_root_Vue_["withModifiers"])(function ($event) { @@ -1790,9 +1772,9 @@ function UserEditFormvue_type_template_id_630fdb84_render(_ctx, _cache, $props, $event.preventDefault(); _ctx.passwordConfirmation = ''; }) - }, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('General_No')), 1)])], 512)], 512)), [[external_commonjs_vue_commonjs2_vue_root_Vue_["vShow"], _ctx.activeTab === '2fa']]) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true)])], 512), [[_directive_form]]), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", UserEditFormvue_type_template_id_630fdb84_hoisted_29, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", UserEditFormvue_type_template_id_630fdb84_hoisted_30, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("h2", { + }, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('General_No')), 1)])], 512)], 512)), [[external_commonjs_vue_commonjs2_vue_root_Vue_["vShow"], _ctx.activeTab === '2fa']]) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true)])], 512), [[_directive_form]]), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", UserEditFormvue_type_template_id_71e0c307_hoisted_29, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", UserEditFormvue_type_template_id_71e0c307_hoisted_30, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("h2", { innerHTML: _ctx.$sanitize(_ctx.changePasswordTitle) - }, null, 8, UserEditFormvue_type_template_id_630fdb84_hoisted_31), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("p", null, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('UsersManager_ConfirmWithPassword')), 1), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", null, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createVNode"])(_component_Field, { + }, null, 8, UserEditFormvue_type_template_id_71e0c307_hoisted_31), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("p", null, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('UsersManager_ConfirmWithPassword')), 1), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", null, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createVNode"])(_component_Field, { modelValue: _ctx.passwordConfirmation, "onUpdate:modelValue": _cache[22] || (_cache[22] = function ($event) { return _ctx.passwordConfirmation = $event; @@ -1802,7 +1784,7 @@ function UserEditFormvue_type_template_id_630fdb84_render(_ctx, _cache, $props, autocomplete: false, "full-width": true, title: _ctx.translate('UsersManager_YourCurrentPassword') - }, null, 8, ["modelValue", "title"])])]), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", UserEditFormvue_type_template_id_630fdb84_hoisted_32, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("a", { + }, null, 8, ["modelValue", "title"])])]), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", UserEditFormvue_type_template_id_71e0c307_hoisted_32, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("a", { href: "", class: "modal-action modal-close btn", onClick: _cache[23] || (_cache[23] = Object(external_commonjs_vue_commonjs2_vue_root_Vue_["withModifiers"])(function ($event) { @@ -1820,7 +1802,7 @@ function UserEditFormvue_type_template_id_630fdb84_render(_ctx, _cache, $props, _: 1 }, 8, ["class", "content-title"]); } -// CONCATENATED MODULE: ./plugins/UsersManager/vue/src/UserEditForm/UserEditForm.vue?vue&type=template&id=630fdb84 +// CONCATENATED MODULE: ./plugins/UsersManager/vue/src/UserEditForm/UserEditForm.vue?vue&type=template&id=71e0c307 // CONCATENATED MODULE: ./node_modules/@vue/cli-plugin-typescript/node_modules/cache-loader/dist/cjs.js??ref--14-0!./node_modules/babel-loader/lib!./node_modules/@vue/cli-plugin-typescript/node_modules/ts-loader??ref--14-2!./node_modules/@vue/cli-service/node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/@vue/cli-service/node_modules/vue-loader-v16/dist??ref--0-1!./plugins/UsersManager/vue/src/UserEditForm/UserEditForm.vue?vue&type=script&lang=ts @@ -1833,7 +1815,7 @@ var DEFAULT_USER = { uses_2fa: false, password: '', email: '', - invited_at: '' + invite_status: '' }; var UserEditFormvue_type_script_lang_ts_window = window, UserEditFormvue_type_script_lang_ts_$ = UserEditFormvue_type_script_lang_ts_window.$; @@ -1972,11 +1954,11 @@ var UserEditFormvue_type_script_lang_ts_window = window, _this3.firstSiteAccess = null; _this3.isSavingUserInfo = false; _this3.isUserModified = true; - _this3.theUser.invited_at = 'xx'; + _this3.theUser.invite_status = 'pending'; _this3.resetPasswordVar(); - _this3.showUserSavedNotification(); + _this3.showUserCreatedNotification(); }); }, resetPasswordVar: function resetPasswordVar() { @@ -2016,6 +1998,13 @@ var UserEditFormvue_type_script_lang_ts_window = window, type: 'toast' }); }, + showUserCreatedNotification: function showUserCreatedNotification() { + external_CoreHome_["NotificationsStore"].show({ + message: Object(external_CoreHome_["translate"])('UsersManager_InviteSuccess'), + context: 'success', + type: 'toast' + }); + }, reset2FA: function reset2FA() { var _this5 = this; @@ -2078,12 +2067,19 @@ var UserEditFormvue_type_script_lang_ts_window = window, saveButtonLabel: function saveButtonLabel() { return this.isAdd ? Object(external_CoreHome_["translate"])('UsersManager_InviteUser') : Object(external_CoreHome_["translate"])('UsersManager_SaveBasicInfo'); }, - isPendingUser: function isPendingUser() { - // eslint-disable-next-line eqeqeq - return this.user && (this.theUser.invited_at === '' || !this.theUser.invited_at); + isPending: function isPending() { + if (!this.user) { + return true; + } + + if (this.user.invite_status === 'pending' || Number.isInteger(this.user.invite_status)) { + return true; + } + + return false; }, isAdd: function isAdd() { - return !this.user; // purposefully checking input property not theUser state + return !this.user; }, changePasswordTitle: function changePasswordTitle() { return Object(external_CoreHome_["translate"])('UsersManager_AreYouSureChangeDetails', "<strong>".concat(this.theUser.login, "</strong>")); @@ -2096,7 +2092,7 @@ var UserEditFormvue_type_script_lang_ts_window = window, -UserEditFormvue_type_script_lang_ts.render = UserEditFormvue_type_template_id_630fdb84_render +UserEditFormvue_type_script_lang_ts.render = UserEditFormvue_type_template_id_71e0c307_render /* harmony default export */ var UserEditForm = (UserEditFormvue_type_script_lang_ts); // CONCATENATED MODULE: ./plugins/UsersManager/vue/src/UserEditForm/UserEditForm.adapter.ts @@ -2141,226 +2137,224 @@ UserEditFormvue_type_script_lang_ts.render = UserEditFormvue_type_template_id_63 directiveName: 'piwikUserEditForm', restrict: 'E' })); -// CONCATENATED MODULE: ./node_modules/@vue/cli-plugin-babel/node_modules/cache-loader/dist/cjs.js??ref--12-0!./node_modules/@vue/cli-plugin-babel/node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib!./node_modules/@vue/cli-service/node_modules/vue-loader-v16/dist/templateLoader.js??ref--6!./node_modules/@vue/cli-service/node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/@vue/cli-service/node_modules/vue-loader-v16/dist??ref--0-1!./plugins/UsersManager/vue/src/PagedUsersList/PagedUsersList.vue?vue&type=template&id=2ff6c088&scoped=true - +// CONCATENATED MODULE: ./node_modules/@vue/cli-plugin-babel/node_modules/cache-loader/dist/cjs.js??ref--12-0!./node_modules/@vue/cli-plugin-babel/node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib!./node_modules/@vue/cli-service/node_modules/vue-loader-v16/dist/templateLoader.js??ref--6!./node_modules/@vue/cli-service/node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/@vue/cli-service/node_modules/vue-loader-v16/dist??ref--0-1!./plugins/UsersManager/vue/src/PagedUsersList/PagedUsersList.vue?vue&type=template&id=4e2f5521 -Object(external_commonjs_vue_commonjs2_vue_root_Vue_["pushScopeId"])("data-v-2ff6c088"); - -var PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_1 = { +var PagedUsersListvue_type_template_id_4e2f5521_hoisted_1 = { class: "userListFilters row" }; -var PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_2 = { - class: "col s12 m12 l6" +var PagedUsersListvue_type_template_id_4e2f5521_hoisted_2 = { + class: "col s12 m12 l8" }; -var PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_3 = { - class: "input-field col s12 m4 l4" +var PagedUsersListvue_type_template_id_4e2f5521_hoisted_3 = { + class: "input-field col s12 m3 l3" }; -var PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_4 = { +var PagedUsersListvue_type_template_id_4e2f5521_hoisted_4 = { id: "user-list-bulk-actions", class: "dropdown-content" }; -var PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_5 = { +var PagedUsersListvue_type_template_id_4e2f5521_hoisted_5 = { class: "dropdown-trigger", "data-target": "bulk-set-access" }; -var PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_6 = { +var PagedUsersListvue_type_template_id_4e2f5521_hoisted_6 = { id: "bulk-set-access", class: "dropdown-content" }; -var PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_7 = ["onClick"]; -var PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_8 = { +var PagedUsersListvue_type_template_id_4e2f5521_hoisted_7 = ["onClick"]; +var PagedUsersListvue_type_template_id_4e2f5521_hoisted_8 = { key: 0 }; -var PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_9 = { - class: "input-field col s12 m4 l4" +var PagedUsersListvue_type_template_id_4e2f5521_hoisted_9 = { + class: "input-field col s12 m3 l3" }; -var PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_10 = { +var PagedUsersListvue_type_template_id_4e2f5521_hoisted_10 = { class: "permissions-for-selector" }; -var PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_11 = { - class: "input-field col s12 m4 l4" +var PagedUsersListvue_type_template_id_4e2f5521_hoisted_11 = { + class: "input-field col s12 m3 l3" }; -var PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_12 = { +var PagedUsersListvue_type_template_id_4e2f5521_hoisted_12 = { + class: "input-field col s12 m3 l3" +}; +var PagedUsersListvue_type_template_id_4e2f5521_hoisted_13 = { key: 0, - class: "input-field col s12 m12 l6 users-list-pagination-container" + class: "input-field col s12 m12 l4 users-list-pagination-container" }; -var PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_13 = { +var PagedUsersListvue_type_template_id_4e2f5521_hoisted_14 = { class: "usersListPagination" }; -var PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_14 = { +var PagedUsersListvue_type_template_id_4e2f5521_hoisted_15 = { class: "pointer" }; -var PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_15 = { +var PagedUsersListvue_type_template_id_4e2f5521_hoisted_16 = { class: "counter" }; -var PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_16 = { +var PagedUsersListvue_type_template_id_4e2f5521_hoisted_17 = { class: "pointer" }; -var PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_17 = { +var PagedUsersListvue_type_template_id_4e2f5521_hoisted_18 = { key: 0, class: "roles-help-notification" }; -var PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_18 = ["innerHTML"]; -var PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_19 = { +var PagedUsersListvue_type_template_id_4e2f5521_hoisted_19 = ["innerHTML"]; +var PagedUsersListvue_type_template_id_4e2f5521_hoisted_20 = { class: "select-cell" }; -var PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_20 = { +var PagedUsersListvue_type_template_id_4e2f5521_hoisted_21 = { class: "checkbox-container" }; -var PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_21 = /*#__PURE__*/Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("span", null, null, -1); +var PagedUsersListvue_type_template_id_4e2f5521_hoisted_22 = /*#__PURE__*/Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("span", null, null, -1); -var PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_22 = { +var PagedUsersListvue_type_template_id_4e2f5521_hoisted_23 = { class: "first" }; -var PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_23 = { +var PagedUsersListvue_type_template_id_4e2f5521_hoisted_24 = { class: "role_header" }; -var PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_24 = { +var PagedUsersListvue_type_template_id_4e2f5521_hoisted_25 = { style: { "margin-right": "3.5px" } }; -var PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_25 = /*#__PURE__*/Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("span", { +var PagedUsersListvue_type_template_id_4e2f5521_hoisted_26 = /*#__PURE__*/Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("span", { class: "icon-help" }, null, -1); -var PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_26 = [PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_25]; -var PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_27 = { +var PagedUsersListvue_type_template_id_4e2f5521_hoisted_27 = [PagedUsersListvue_type_template_id_4e2f5521_hoisted_26]; +var PagedUsersListvue_type_template_id_4e2f5521_hoisted_28 = { key: 0 }; -var PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_28 = ["title"]; -var PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_29 = { +var PagedUsersListvue_type_template_id_4e2f5521_hoisted_29 = ["title"]; +var PagedUsersListvue_type_template_id_4e2f5521_hoisted_30 = { key: 2 }; -var PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_30 = { +var PagedUsersListvue_type_template_id_4e2f5521_hoisted_31 = { class: "actions-cell-header" }; -var PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_31 = { +var PagedUsersListvue_type_template_id_4e2f5521_hoisted_32 = { key: 0, class: "select-all-row" }; -var PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_32 = { +var PagedUsersListvue_type_template_id_4e2f5521_hoisted_33 = { colspan: "8" }; -var PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_33 = { +var PagedUsersListvue_type_template_id_4e2f5521_hoisted_34 = { key: 0 }; -var PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_34 = ["innerHTML"]; -var PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_35 = ["innerHTML"]; -var PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_36 = { +var PagedUsersListvue_type_template_id_4e2f5521_hoisted_35 = ["innerHTML"]; +var PagedUsersListvue_type_template_id_4e2f5521_hoisted_36 = ["innerHTML"]; +var PagedUsersListvue_type_template_id_4e2f5521_hoisted_37 = { key: 1 }; -var PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_37 = ["innerHTML"]; -var PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_38 = ["innerHTML"]; -var PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_39 = ["id"]; -var PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_40 = { +var PagedUsersListvue_type_template_id_4e2f5521_hoisted_38 = ["innerHTML"]; +var PagedUsersListvue_type_template_id_4e2f5521_hoisted_39 = ["innerHTML"]; +var PagedUsersListvue_type_template_id_4e2f5521_hoisted_40 = ["id"]; +var PagedUsersListvue_type_template_id_4e2f5521_hoisted_41 = { class: "select-cell" }; -var PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_41 = { +var PagedUsersListvue_type_template_id_4e2f5521_hoisted_42 = { class: "checkbox-container" }; -var PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_42 = ["id", "onUpdate:modelValue"]; +var PagedUsersListvue_type_template_id_4e2f5521_hoisted_43 = ["id", "onUpdate:modelValue"]; -var PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_43 = /*#__PURE__*/Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("span", null, null, -1); +var PagedUsersListvue_type_template_id_4e2f5521_hoisted_44 = /*#__PURE__*/Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("span", null, null, -1); -var PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_44 = { +var PagedUsersListvue_type_template_id_4e2f5521_hoisted_45 = { id: "userLogin" }; -var PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_45 = { +var PagedUsersListvue_type_template_id_4e2f5521_hoisted_46 = { class: "access-cell" }; -var PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_46 = { +var PagedUsersListvue_type_template_id_4e2f5521_hoisted_47 = { key: 0, id: "email" }; -var PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_47 = { +var PagedUsersListvue_type_template_id_4e2f5521_hoisted_48 = { key: 1, id: "twofa" }; -var PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_48 = { +var PagedUsersListvue_type_template_id_4e2f5521_hoisted_49 = { key: 0, class: "icon-ok" }; -var PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_49 = { +var PagedUsersListvue_type_template_id_4e2f5521_hoisted_50 = { key: 1, class: "icon-close" }; -var PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_50 = { +var PagedUsersListvue_type_template_id_4e2f5521_hoisted_51 = { key: 2, id: "last_seen" }; -var PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_51 = { +var PagedUsersListvue_type_template_id_4e2f5521_hoisted_52 = { id: "status" }; -var PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_52 = { +var PagedUsersListvue_type_template_id_4e2f5521_hoisted_53 = ["title"]; +var PagedUsersListvue_type_template_id_4e2f5521_hoisted_54 = { class: "center actions-cell" }; -var PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_53 = ["onClick"]; +var PagedUsersListvue_type_template_id_4e2f5521_hoisted_55 = ["onClick"]; -var PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_54 = /*#__PURE__*/Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("span", { +var PagedUsersListvue_type_template_id_4e2f5521_hoisted_56 = /*#__PURE__*/Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("span", { class: "icon-email" }, null, -1); -var PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_55 = [PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_54]; -var PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_56 = ["onClick"]; +var PagedUsersListvue_type_template_id_4e2f5521_hoisted_57 = [PagedUsersListvue_type_template_id_4e2f5521_hoisted_56]; +var PagedUsersListvue_type_template_id_4e2f5521_hoisted_58 = ["onClick"]; -var PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_57 = /*#__PURE__*/Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("span", { +var PagedUsersListvue_type_template_id_4e2f5521_hoisted_59 = /*#__PURE__*/Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("span", { class: "icon-edit" }, null, -1); -var PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_58 = [PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_57]; -var PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_59 = ["onClick"]; +var PagedUsersListvue_type_template_id_4e2f5521_hoisted_60 = [PagedUsersListvue_type_template_id_4e2f5521_hoisted_59]; +var PagedUsersListvue_type_template_id_4e2f5521_hoisted_61 = ["onClick"]; -var PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_60 = /*#__PURE__*/Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("span", { +var PagedUsersListvue_type_template_id_4e2f5521_hoisted_62 = /*#__PURE__*/Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("span", { class: "icon-delete" }, null, -1); -var PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_61 = [PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_60]; -var PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_62 = { +var PagedUsersListvue_type_template_id_4e2f5521_hoisted_63 = [PagedUsersListvue_type_template_id_4e2f5521_hoisted_62]; +var _hoisted_64 = { class: "delete-user-confirm-modal modal", ref: "deleteUserConfirmModal" }; -var PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_63 = { +var _hoisted_65 = { class: "modal-content" }; -var _hoisted_64 = ["innerHTML"]; -var _hoisted_65 = ["innerHTML"]; -var _hoisted_66 = { +var _hoisted_66 = ["innerHTML"]; +var _hoisted_67 = ["innerHTML"]; +var _hoisted_68 = { class: "modal-footer" }; -var _hoisted_67 = { +var _hoisted_69 = { class: "change-user-role-confirm-modal modal", ref: "changeUserRoleConfirmModal" }; -var _hoisted_68 = { +var _hoisted_70 = { class: "modal-content" }; -var _hoisted_69 = ["innerHTML"]; -var _hoisted_70 = { +var _hoisted_71 = ["innerHTML"]; +var _hoisted_72 = { key: 1 }; -var _hoisted_71 = ["innerHTML"]; -var _hoisted_72 = ["innerHTML"]; -var _hoisted_73 = { +var _hoisted_73 = ["innerHTML"]; +var _hoisted_74 = ["innerHTML"]; +var _hoisted_75 = { class: "modal-footer" }; -var _hoisted_74 = { +var _hoisted_76 = { class: "resend-invite-confirm-modal modal", ref: "resendInviteConfirmModal" }; -var _hoisted_75 = { +var _hoisted_77 = { class: "modal-content" }; -var _hoisted_76 = ["innerHTML"]; -var _hoisted_77 = { +var _hoisted_78 = ["innerHTML"]; +var _hoisted_79 = { class: "modal-footer" }; - -Object(external_commonjs_vue_commonjs2_vue_root_Vue_["popScopeId"])(); - -function PagedUsersListvue_type_template_id_2ff6c088_scoped_true_render(_ctx, _cache, $props, $setup, $data, $options) { +function PagedUsersListvue_type_template_id_4e2f5521_render(_ctx, _cache, $props, $setup, $data, $options) { var _component_Field = Object(external_commonjs_vue_commonjs2_vue_root_Vue_["resolveComponent"])("Field"); var _component_ActivityIndicator = Object(external_commonjs_vue_commonjs2_vue_root_Vue_["resolveComponent"])("ActivityIndicator"); @@ -2377,13 +2371,13 @@ function PagedUsersListvue_type_template_id_2ff6c088_scoped_true_render(_ctx, _c class: Object(external_commonjs_vue_commonjs2_vue_root_Vue_["normalizeClass"])(["pagedUsersList", { loading: _ctx.isLoadingUsers }]) - }, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_1, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_2, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_3, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["withDirectives"])(Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("a", { + }, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", PagedUsersListvue_type_template_id_4e2f5521_hoisted_1, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", PagedUsersListvue_type_template_id_4e2f5521_hoisted_2, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", PagedUsersListvue_type_template_id_4e2f5521_hoisted_3, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["withDirectives"])(Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("a", { class: Object(external_commonjs_vue_commonjs2_vue_root_Vue_["normalizeClass"])(["dropdown-trigger btn bulk-actions", { disabled: _ctx.isBulkActionsDisabled }]), href: "", "data-target": "user-list-bulk-actions" - }, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createTextVNode"])(Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('UsersManager_BulkActions')), 1)], 2), [[_directive_dropdown_menu]]), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("ul", PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_4, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("li", null, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["withDirectives"])(Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("a", PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_5, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createTextVNode"])(Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('UsersManager_SetPermission')), 1)], 512), [[_directive_dropdown_menu]]), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("ul", PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_6, [(Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(true), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])(external_commonjs_vue_commonjs2_vue_root_Vue_["Fragment"], null, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["renderList"])(_ctx.bulkActionAccessLevels, function (access) { + }, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createTextVNode"])(Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('UsersManager_BulkActions')), 1)], 2), [[_directive_dropdown_menu]]), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("ul", PagedUsersListvue_type_template_id_4e2f5521_hoisted_4, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("li", null, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["withDirectives"])(Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("a", PagedUsersListvue_type_template_id_4e2f5521_hoisted_5, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createTextVNode"])(Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('UsersManager_SetPermission')), 1)], 512), [[_directive_dropdown_menu]]), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("ul", PagedUsersListvue_type_template_id_4e2f5521_hoisted_6, [(Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(true), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])(external_commonjs_vue_commonjs2_vue_root_Vue_["Fragment"], null, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["renderList"])(_ctx.bulkActionAccessLevels, function (access) { return Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("li", { key: access.key }, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("a", { @@ -2394,7 +2388,7 @@ function PagedUsersListvue_type_template_id_2ff6c088_scoped_true_render(_ctx, _c _ctx.showAccessChangeConfirm(); }, ["prevent"]) - }, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(access.value), 9, PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_7)]); + }, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(access.value), 9, PagedUsersListvue_type_template_id_4e2f5521_hoisted_7)]); }), 128))])]), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("li", null, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("a", { href: "", onClick: _cache[0] || (_cache[0] = Object(external_commonjs_vue_commonjs2_vue_root_Vue_["withModifiers"])(function ($event) { @@ -2403,12 +2397,12 @@ function PagedUsersListvue_type_template_id_2ff6c088_scoped_true_render(_ctx, _c _ctx.showAccessChangeConfirm(); }, ["prevent"])) - }, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('UsersManager_RemovePermissions')), 1)]), _ctx.currentUserRole === 'superuser' ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("li", PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_8, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("a", { + }, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('UsersManager_RemovePermissions')), 1)]), _ctx.currentUserRole === 'superuser' ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("li", PagedUsersListvue_type_template_id_4e2f5521_hoisted_8, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("a", { href: "", onClick: _cache[1] || (_cache[1] = Object(external_commonjs_vue_commonjs2_vue_root_Vue_["withModifiers"])(function ($event) { return _ctx.showDeleteConfirm(); }, ["prevent"])) - }, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('UsersManager_DeleteUsers')), 1)])) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true)])]), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_9, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_10, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createVNode"])(_component_Field, { + }, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('UsersManager_DeleteUsers')), 1)])) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true)])]), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", PagedUsersListvue_type_template_id_4e2f5521_hoisted_9, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", PagedUsersListvue_type_template_id_4e2f5521_hoisted_10, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createVNode"])(_component_Field, { "model-value": _ctx.userTextFilter, "onUpdate:modelValue": _cache[2] || (_cache[2] = function ($event) { return _ctx.onUserTextFilterChange($event); @@ -2417,7 +2411,7 @@ function PagedUsersListvue_type_template_id_2ff6c088_scoped_true_render(_ctx, _c uicontrol: "text", "full-width": true, placeholder: _ctx.translate('UsersManager_UserSearch') - }, null, 8, ["model-value", "placeholder"])])]), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_11, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", null, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createVNode"])(_component_Field, { + }, null, 8, ["model-value", "placeholder"])])]), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", PagedUsersListvue_type_template_id_4e2f5521_hoisted_11, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", null, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createVNode"])(_component_Field, { "model-value": _ctx.accessLevelFilter, "onUpdate:modelValue": _cache[3] || (_cache[3] = function ($event) { _ctx.accessLevelFilter = $event; @@ -2432,14 +2426,29 @@ function PagedUsersListvue_type_template_id_2ff6c088_scoped_true_render(_ctx, _c options: _ctx.filterAccessLevels, "full-width": true, placeholder: _ctx.translate('UsersManager_FilterByAccess') - }, null, 8, ["model-value", "options", "placeholder"])])])]), _ctx.totalEntries > _ctx.searchParams.limit ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("div", PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_12, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_13, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("a", { + }, null, 8, ["model-value", "options", "placeholder"])])]), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", PagedUsersListvue_type_template_id_4e2f5521_hoisted_12, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", null, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createVNode"])(_component_Field, { + "model-value": _ctx.statusLevelFilter, + "onUpdate:modelValue": _cache[4] || (_cache[4] = function ($event) { + _ctx.statusLevelFilter = $event; + + _ctx.changeSearch({ + filter_status: _ctx.statusLevelFilter, + offset: 0 + }); + }), + name: "status-level-filter", + uicontrol: "select", + options: _ctx.filterStatusLevels, + "full-width": true, + placeholder: _ctx.translate('UsersManager_FilterByStatus') + }, null, 8, ["model-value", "options", "placeholder"])])])]), _ctx.totalEntries > _ctx.searchParams.limit ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("div", PagedUsersListvue_type_template_id_4e2f5521_hoisted_13, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", PagedUsersListvue_type_template_id_4e2f5521_hoisted_14, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("a", { class: Object(external_commonjs_vue_commonjs2_vue_root_Vue_["normalizeClass"])(["btn prev", { disabled: _ctx.searchParams.offset <= 0 }]), - onClick: _cache[4] || (_cache[4] = Object(external_commonjs_vue_commonjs2_vue_root_Vue_["withModifiers"])(function ($event) { + onClick: _cache[5] || (_cache[5] = Object(external_commonjs_vue_commonjs2_vue_root_Vue_["withModifiers"])(function ($event) { return _ctx.gotoPreviousPage(); }, ["prevent"])) - }, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("span", PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_14, "« " + Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('General_Previous')), 1)], 2), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_15, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("span", { + }, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("span", PagedUsersListvue_type_template_id_4e2f5521_hoisted_15, "« " + Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('General_Previous')), 1)], 2), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", PagedUsersListvue_type_template_id_4e2f5521_hoisted_16, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("span", { class: Object(external_commonjs_vue_commonjs2_vue_root_Vue_["normalizeClass"])({ visibility: _ctx.isLoadingUsers ? 'hidden' : 'visible' }) @@ -2449,10 +2458,10 @@ function PagedUsersListvue_type_template_id_2ff6c088_scoped_true_render(_ctx, _c class: Object(external_commonjs_vue_commonjs2_vue_root_Vue_["normalizeClass"])(["btn next", { disabled: _ctx.searchParams.offset + _ctx.searchParams.limit >= _ctx.totalEntries }]), - onClick: _cache[5] || (_cache[5] = Object(external_commonjs_vue_commonjs2_vue_root_Vue_["withModifiers"])(function ($event) { + onClick: _cache[6] || (_cache[6] = Object(external_commonjs_vue_commonjs2_vue_root_Vue_["withModifiers"])(function ($event) { return _ctx.gotoNextPage(); }, ["prevent"])) - }, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("span", PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_16, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('General_Next')) + " »", 1)], 2)])])) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true)]), _ctx.isRoleHelpToggled ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("div", PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_17, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createVNode"])(_component_Notification, { + }, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("span", PagedUsersListvue_type_template_id_4e2f5521_hoisted_17, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('General_Next')) + " »", 1)], 2)])])) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true)]), _ctx.isRoleHelpToggled ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("div", PagedUsersListvue_type_template_id_4e2f5521_hoisted_18, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createVNode"])(_component_Notification, { context: "info", type: "persistent", noclear: true @@ -2460,7 +2469,7 @@ function PagedUsersListvue_type_template_id_2ff6c088_scoped_true_render(_ctx, _c default: Object(external_commonjs_vue_commonjs2_vue_root_Vue_["withCtx"])(function () { return [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("span", { innerHTML: _ctx.$sanitize(_ctx.rolesHelpText) - }, null, 8, PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_18)]; + }, null, 8, PagedUsersListvue_type_template_id_4e2f5521_hoisted_19)]; }), _: 1 })])) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createVNode"])(_component_ContentBlock, null, { @@ -2470,75 +2479,75 @@ function PagedUsersListvue_type_template_id_2ff6c088_scoped_true_render(_ctx, _c class: Object(external_commonjs_vue_commonjs2_vue_root_Vue_["normalizeClass"])({ loading: _ctx.isLoadingUsers }) - }, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("thead", null, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("tr", null, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("th", PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_19, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("span", PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_20, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("label", null, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["withDirectives"])(Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("input", { + }, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("thead", null, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("tr", null, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("th", PagedUsersListvue_type_template_id_4e2f5521_hoisted_20, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("span", PagedUsersListvue_type_template_id_4e2f5521_hoisted_21, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("label", null, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["withDirectives"])(Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("input", { type: "checkbox", id: "paged_users_select_all", checked: "checked", - "onUpdate:modelValue": _cache[6] || (_cache[6] = function ($event) { + "onUpdate:modelValue": _cache[7] || (_cache[7] = function ($event) { return _ctx.isAllCheckboxSelected = $event; }), - onChange: _cache[7] || (_cache[7] = function ($event) { + onChange: _cache[8] || (_cache[8] = function ($event) { return _ctx.onAllCheckboxChange(); }) - }, null, 544), [[external_commonjs_vue_commonjs2_vue_root_Vue_["vModelCheckbox"], _ctx.isAllCheckboxSelected]]), PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_21])])]), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("th", PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_22, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('UsersManager_Username')), 1), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("th", PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_23, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("span", PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_24, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('UsersManager_RoleFor')), 1), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("a", { + }, null, 544), [[external_commonjs_vue_commonjs2_vue_root_Vue_["vModelCheckbox"], _ctx.isAllCheckboxSelected]]), PagedUsersListvue_type_template_id_4e2f5521_hoisted_22])])]), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("th", PagedUsersListvue_type_template_id_4e2f5521_hoisted_23, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('UsersManager_Username')), 1), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("th", PagedUsersListvue_type_template_id_4e2f5521_hoisted_24, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("span", PagedUsersListvue_type_template_id_4e2f5521_hoisted_25, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('UsersManager_RoleFor')), 1), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("a", { href: "", class: Object(external_commonjs_vue_commonjs2_vue_root_Vue_["normalizeClass"])(["helpIcon", { sticky: _ctx.isRoleHelpToggled }]), - onClick: _cache[8] || (_cache[8] = Object(external_commonjs_vue_commonjs2_vue_root_Vue_["withModifiers"])(function ($event) { + onClick: _cache[9] || (_cache[9] = Object(external_commonjs_vue_commonjs2_vue_root_Vue_["withModifiers"])(function ($event) { return _ctx.isRoleHelpToggled = !_ctx.isRoleHelpToggled; }, ["prevent"])) - }, PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_26, 2), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", null, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createVNode"])(_component_Field, { + }, PagedUsersListvue_type_template_id_4e2f5521_hoisted_27, 2), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", null, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createVNode"])(_component_Field, { class: "permissions-for-selector", "model-value": _ctx.permissionsForSite, - "onUpdate:modelValue": _cache[9] || (_cache[9] = function ($event) { + "onUpdate:modelValue": _cache[10] || (_cache[10] = function ($event) { _ctx.onPermissionsForUpdate($event); }), uicontrol: "site", "ui-control-attributes": { onlySitesWithAdminAccess: _ctx.currentUserRole !== 'superuser' } - }, null, 8, ["model-value", "ui-control-attributes"])])]), _ctx.currentUserRole === 'superuser' ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("th", PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_27, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('UsersManager_Email')), 1)) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true), _ctx.currentUserRole === 'superuser' ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("th", { + }, null, 8, ["model-value", "ui-control-attributes"])])]), _ctx.currentUserRole === 'superuser' ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("th", PagedUsersListvue_type_template_id_4e2f5521_hoisted_28, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('UsersManager_Email')), 1)) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true), _ctx.currentUserRole === 'superuser' ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("th", { key: 1, title: _ctx.translate('UsersManager_UsesTwoFactorAuthentication') - }, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('UsersManager_2FA')), 9, PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_28)) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true), _ctx.currentUserRole === 'superuser' ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("th", PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_29, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('UsersManager_LastSeen')), 1)) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("th", null, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('UsersManager_Status')), 1), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("th", PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_30, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", null, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('General_Actions')), 1)])])]), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("tbody", null, [_ctx.isAllCheckboxSelected && _ctx.users.length && _ctx.users.length < _ctx.totalEntries ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("tr", PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_31, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("td", PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_32, [!_ctx.areAllResultsSelected ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("div", PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_33, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("span", { + }, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('UsersManager_2FA')), 9, PagedUsersListvue_type_template_id_4e2f5521_hoisted_29)) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true), _ctx.currentUserRole === 'superuser' ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("th", PagedUsersListvue_type_template_id_4e2f5521_hoisted_30, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('UsersManager_LastSeen')), 1)) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("th", null, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('UsersManager_Status')), 1), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("th", PagedUsersListvue_type_template_id_4e2f5521_hoisted_31, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", null, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('General_Actions')), 1)])])]), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("tbody", null, [_ctx.isAllCheckboxSelected && _ctx.users.length && _ctx.users.length < _ctx.totalEntries ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("tr", PagedUsersListvue_type_template_id_4e2f5521_hoisted_32, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("td", PagedUsersListvue_type_template_id_4e2f5521_hoisted_33, [!_ctx.areAllResultsSelected ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("div", PagedUsersListvue_type_template_id_4e2f5521_hoisted_34, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("span", { innerHTML: _ctx.$sanitize(_ctx.translate('UsersManager_TheDisplayedUsersAreSelected', "<strong>".concat(_ctx.users.length, "</strong>"))), style: { "margin-right": "3.5px" } - }, null, 8, PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_34), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("a", { + }, null, 8, PagedUsersListvue_type_template_id_4e2f5521_hoisted_35), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("a", { class: "toggle-select-all-in-search", href: "#", - onClick: _cache[10] || (_cache[10] = Object(external_commonjs_vue_commonjs2_vue_root_Vue_["withModifiers"])(function ($event) { + onClick: _cache[11] || (_cache[11] = Object(external_commonjs_vue_commonjs2_vue_root_Vue_["withModifiers"])(function ($event) { return _ctx.areAllResultsSelected = !_ctx.areAllResultsSelected; }, ["prevent"])), innerHTML: _ctx.$sanitize(_ctx.translate('UsersManager_ClickToSelectAll', "<strong>".concat(_ctx.totalEntries, "</strong>"))) - }, null, 8, PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_35)])) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true), _ctx.areAllResultsSelected ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("div", PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_36, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("span", { + }, null, 8, PagedUsersListvue_type_template_id_4e2f5521_hoisted_36)])) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true), _ctx.areAllResultsSelected ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("div", PagedUsersListvue_type_template_id_4e2f5521_hoisted_37, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("span", { innerHTML: _ctx.$sanitize(_ctx.translate('UsersManager_AllUsersAreSelected', "<strong>".concat(_ctx.totalEntries, "</strong>"))), style: { "margin-right": "3.5px" } - }, null, 8, PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_37), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("a", { + }, null, 8, PagedUsersListvue_type_template_id_4e2f5521_hoisted_38), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("a", { class: "toggle-select-all-in-search", href: "#", - onClick: _cache[11] || (_cache[11] = Object(external_commonjs_vue_commonjs2_vue_root_Vue_["withModifiers"])(function ($event) { + onClick: _cache[12] || (_cache[12] = Object(external_commonjs_vue_commonjs2_vue_root_Vue_["withModifiers"])(function ($event) { return _ctx.areAllResultsSelected = !_ctx.areAllResultsSelected; }, ["prevent"])), innerHTML: _ctx.$sanitize(_ctx.translate('UsersManager_ClickToSelectDisplayedUsers', "<strong>".concat(_ctx.users.length, "</strong>"))) - }, null, 8, PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_38)])) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true)])])) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true), (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(true), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])(external_commonjs_vue_commonjs2_vue_root_Vue_["Fragment"], null, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["renderList"])(_ctx.users, function (user, index) { + }, null, 8, PagedUsersListvue_type_template_id_4e2f5521_hoisted_39)])) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true)])])) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true), (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(true), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])(external_commonjs_vue_commonjs2_vue_root_Vue_["Fragment"], null, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["renderList"])(_ctx.users, function (user, index) { return Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("tr", { id: "row".concat(index), key: user.login - }, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("td", PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_40, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("span", PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_41, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("label", null, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["withDirectives"])(Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("input", { + }, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("td", PagedUsersListvue_type_template_id_4e2f5521_hoisted_41, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("span", PagedUsersListvue_type_template_id_4e2f5521_hoisted_42, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("label", null, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["withDirectives"])(Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("input", { type: "checkbox", id: "paged_users_select_row".concat(index), "onUpdate:modelValue": function onUpdateModelValue($event) { return _ctx.selectedRows[index] = $event; }, - onClick: _cache[12] || (_cache[12] = function ($event) { + onClick: _cache[13] || (_cache[13] = function ($event) { return _ctx.onRowSelected(); }) - }, null, 8, PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_42), [[external_commonjs_vue_commonjs2_vue_root_Vue_["vModelCheckbox"], _ctx.selectedRows[index]]]), PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_43])])]), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("td", PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_44, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(user.login), 1), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("td", PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_45, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", null, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createVNode"])(_component_Field, { + }, null, 8, PagedUsersListvue_type_template_id_4e2f5521_hoisted_43), [[external_commonjs_vue_commonjs2_vue_root_Vue_["vModelCheckbox"], _ctx.selectedRows[index]]]), PagedUsersListvue_type_template_id_4e2f5521_hoisted_44])])]), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("td", PagedUsersListvue_type_template_id_4e2f5521_hoisted_45, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(user.login), 1), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("td", PagedUsersListvue_type_template_id_4e2f5521_hoisted_46, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", null, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createVNode"])(_component_Field, { "model-value": user.role, "onUpdate:modelValue": function onUpdateModelValue($event) { _ctx.userToChange = user; @@ -2549,9 +2558,10 @@ function PagedUsersListvue_type_template_id_2ff6c088_scoped_true_render(_ctx, _c disabled: user.role === 'superuser', uicontrol: "select", options: user.login !== 'anonymous' ? _ctx.accessLevels : _ctx.anonymousAccessLevels - }, null, 8, ["model-value", "onUpdate:modelValue", "disabled", "options"])])]), _ctx.currentUserRole === 'superuser' ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("td", PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_46, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(user.email), 1)) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true), _ctx.currentUserRole === 'superuser' ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("td", PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_47, [user.uses_2fa ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("span", PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_48)) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true), !user.uses_2fa ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("span", PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_49)) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true)])) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true), _ctx.currentUserRole === 'superuser' ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("td", PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_50, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(user.last_seen ? "".concat(user.last_seen, " ago") : '-'), 1)) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("td", PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_51, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("span", { - class: Object(external_commonjs_vue_commonjs2_vue_root_Vue_["normalizeClass"])(user.invite_status) - }, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.getInviteStatus(user.invite_status)), 3)]), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("td", PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_52, [user.invite_status !== 'accept' ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("button", { + }, null, 8, ["model-value", "onUpdate:modelValue", "disabled", "options"])])]), _ctx.currentUserRole === 'superuser' ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("td", PagedUsersListvue_type_template_id_4e2f5521_hoisted_47, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(user.email), 1)) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true), _ctx.currentUserRole === 'superuser' ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("td", PagedUsersListvue_type_template_id_4e2f5521_hoisted_48, [user.uses_2fa ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("span", PagedUsersListvue_type_template_id_4e2f5521_hoisted_49)) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true), !user.uses_2fa ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("span", PagedUsersListvue_type_template_id_4e2f5521_hoisted_50)) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true)])) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true), _ctx.currentUserRole === 'superuser' ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("td", PagedUsersListvue_type_template_id_4e2f5521_hoisted_51, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(user.last_seen ? "".concat(user.last_seen, " ago") : '-'), 1)) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("td", PagedUsersListvue_type_template_id_4e2f5521_hoisted_52, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("span", { + class: Object(external_commonjs_vue_commonjs2_vue_root_Vue_["normalizeClass"])(Number.isInteger(user.invite_status) ? 'pending' : user.invite_status), + title: user.invite_status === 'expired' ? _ctx.translate('UsersManager_ExpiredInviteAutomaticallyRemoved', '3') : '' + }, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.getInviteStatus(user.invite_status)), 11, PagedUsersListvue_type_template_id_4e2f5521_hoisted_53)]), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("td", PagedUsersListvue_type_template_id_4e2f5521_hoisted_54, [(_ctx.currentUserRole === 'superuser' || _ctx.currentUserRole === 'admin' && user.invited_by === _ctx.currentUserLogin) && user.invite_status !== 'active' ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("button", { key: 0, class: "resend table-action", title: "Resend Invite", @@ -2560,7 +2570,7 @@ function PagedUsersListvue_type_template_id_2ff6c088_scoped_true_render(_ctx, _c _ctx.showResendConfirm(); } - }, PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_55, 8, PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_53)) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true), user.login !== 'anonymous' ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("button", { + }, PagedUsersListvue_type_template_id_4e2f5521_hoisted_57, 8, PagedUsersListvue_type_template_id_4e2f5521_hoisted_55)) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true), user.login !== 'anonymous' ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("button", { key: 1, class: "edituser table-action", title: "Edit", @@ -2569,7 +2579,7 @@ function PagedUsersListvue_type_template_id_2ff6c088_scoped_true_render(_ctx, _c user: user }); } - }, PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_58, 8, PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_56)) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true), _ctx.currentUserRole === 'superuser' && user.login !== 'anonymous' ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("button", { + }, PagedUsersListvue_type_template_id_4e2f5521_hoisted_60, 8, PagedUsersListvue_type_template_id_4e2f5521_hoisted_58)) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true), (_ctx.currentUserRole === 'superuser' || _ctx.currentUserRole === 'admin' && user.invited_by === _ctx.currentUserLogin) && user.login !== 'anonymous' ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("button", { key: 2, class: "deleteuser table-action", title: "Delete", @@ -2578,20 +2588,20 @@ function PagedUsersListvue_type_template_id_2ff6c088_scoped_true_render(_ctx, _c _ctx.showDeleteConfirm(); } - }, PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_61, 8, PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_59)) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true)])], 8, PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_39); + }, PagedUsersListvue_type_template_id_4e2f5521_hoisted_63, 8, PagedUsersListvue_type_template_id_4e2f5521_hoisted_61)) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true)])], 8, PagedUsersListvue_type_template_id_4e2f5521_hoisted_40); }), 128))])], 2), [[_directive_content_table]])]; }), _: 1 - }), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_62, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", PagedUsersListvue_type_template_id_2ff6c088_scoped_true_hoisted_63, [_ctx.userToChange ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("h3", { + }), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", _hoisted_64, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", _hoisted_65, [_ctx.userToChange ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("h3", { key: 0, innerHTML: _ctx.$sanitize(_ctx.translate('UsersManager_DeleteUserConfirmSingle', "<strong>".concat(_ctx.userToChange.login, "</strong>"))) - }, null, 8, _hoisted_64)) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true), !_ctx.userToChange ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("p", { + }, null, 8, _hoisted_66)) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true), !_ctx.userToChange ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("p", { key: 1, innerHTML: _ctx.$sanitize(_ctx.translate('UsersManager_DeleteUserConfirmMultiple', "<strong>".concat(_ctx.affectedUsersCount, "</strong>"))) - }, null, 8, _hoisted_65)) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true)]), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", _hoisted_66, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("a", { + }, null, 8, _hoisted_67)) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true)]), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", _hoisted_68, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("a", { href: "", class: "modal-action modal-close btn", - onClick: _cache[13] || (_cache[13] = Object(external_commonjs_vue_commonjs2_vue_root_Vue_["withModifiers"])(function ($event) { + onClick: _cache[14] || (_cache[14] = Object(external_commonjs_vue_commonjs2_vue_root_Vue_["withModifiers"])(function ($event) { return _ctx.deleteRequestedUsers(); }, ["prevent"])), style: { @@ -2600,22 +2610,22 @@ function PagedUsersListvue_type_template_id_2ff6c088_scoped_true_render(_ctx, _c }, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('General_Yes')), 1), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("a", { href: "", class: "modal-action modal-close modal-no", - onClick: _cache[14] || (_cache[14] = Object(external_commonjs_vue_commonjs2_vue_root_Vue_["withModifiers"])(function ($event) { + onClick: _cache[15] || (_cache[15] = Object(external_commonjs_vue_commonjs2_vue_root_Vue_["withModifiers"])(function ($event) { _ctx.userToChange = null; _ctx.roleToChangeTo = null; }, ["prevent"])) - }, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('General_No')), 1)])], 512), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", _hoisted_67, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", _hoisted_68, [_ctx.userToChange ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("h3", { + }, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('General_No')), 1)])], 512), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", _hoisted_69, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", _hoisted_70, [_ctx.userToChange ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("h3", { key: 0, innerHTML: _ctx.$sanitize(_ctx.deleteUserPermConfirmSingleText) - }, null, 8, _hoisted_69)) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true), _ctx.userToChange && _ctx.userToChange.login === 'anonymous' && _ctx.roleToChangeTo === 'view' ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("h3", _hoisted_70, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("em", null, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createTextVNode"])(Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('General_Note')) + ": ", 1), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("span", { + }, null, 8, _hoisted_71)) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true), _ctx.userToChange && _ctx.userToChange.login === 'anonymous' && _ctx.roleToChangeTo === 'view' ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("h3", _hoisted_72, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("em", null, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createTextVNode"])(Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('General_Note')) + ": ", 1), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("span", { innerHTML: _ctx.$sanitize(_ctx.translate('UsersManager_AnonymousUserRoleChangeWarning', 'anonymous', _ctx.getRoleDisplay(_ctx.roleToChangeTo))) - }, null, 8, _hoisted_71)])])) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true), !_ctx.userToChange ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("p", { + }, null, 8, _hoisted_73)])])) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true), !_ctx.userToChange ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("p", { key: 2, innerHTML: _ctx.$sanitize(_ctx.deleteUserPermConfirmMultipleText) - }, null, 8, _hoisted_72)) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true)]), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", _hoisted_73, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("a", { + }, null, 8, _hoisted_74)) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true)]), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", _hoisted_75, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("a", { href: "", class: "modal-action modal-close btn", - onClick: _cache[15] || (_cache[15] = Object(external_commonjs_vue_commonjs2_vue_root_Vue_["withModifiers"])(function ($event) { + onClick: _cache[16] || (_cache[16] = Object(external_commonjs_vue_commonjs2_vue_root_Vue_["withModifiers"])(function ($event) { return _ctx.changeUserRole(); }, ["prevent"])), style: { @@ -2624,17 +2634,17 @@ function PagedUsersListvue_type_template_id_2ff6c088_scoped_true_render(_ctx, _c }, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('General_Yes')), 1), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("a", { href: "", class: "modal-action modal-close modal-no", - onClick: _cache[16] || (_cache[16] = Object(external_commonjs_vue_commonjs2_vue_root_Vue_["withModifiers"])(function ($event) { + onClick: _cache[17] || (_cache[17] = Object(external_commonjs_vue_commonjs2_vue_root_Vue_["withModifiers"])(function ($event) { _ctx.userToChange = null; _ctx.roleToChangeTo = null; }, ["prevent"])) - }, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('General_No')), 1)])], 512), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", _hoisted_74, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", _hoisted_75, [_ctx.userToChange ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("h3", { + }, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('General_No')), 1)])], 512), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", _hoisted_76, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", _hoisted_77, [_ctx.userToChange ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("h3", { key: 0, innerHTML: _ctx.$sanitize(_ctx.translate('UsersManager_ResendInviteConfirmSingle', "<strong>".concat(_ctx.userToChange.login, "</strong>"))) - }, null, 8, _hoisted_76)) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true)]), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", _hoisted_77, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("a", { + }, null, 8, _hoisted_78)) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true)]), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", _hoisted_79, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("a", { href: "", class: "modal-action modal-close btn", - onClick: _cache[17] || (_cache[17] = Object(external_commonjs_vue_commonjs2_vue_root_Vue_["withModifiers"])(function ($event) { + onClick: _cache[18] || (_cache[18] = Object(external_commonjs_vue_commonjs2_vue_root_Vue_["withModifiers"])(function ($event) { return _ctx.resendRequestedUser(); }, ["prevent"])), style: { @@ -2643,13 +2653,13 @@ function PagedUsersListvue_type_template_id_2ff6c088_scoped_true_render(_ctx, _c }, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('General_Yes')), 1), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("a", { href: "", class: "modal-action modal-close modal-no", - onClick: _cache[18] || (_cache[18] = Object(external_commonjs_vue_commonjs2_vue_root_Vue_["withModifiers"])(function ($event) { + onClick: _cache[19] || (_cache[19] = Object(external_commonjs_vue_commonjs2_vue_root_Vue_["withModifiers"])(function ($event) { _ctx.userToChange = null; _ctx.roleToChangeTo = null; }, ["prevent"])) }, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('General_No')), 1)])], 512)], 2); } -// CONCATENATED MODULE: ./plugins/UsersManager/vue/src/PagedUsersList/PagedUsersList.vue?vue&type=template&id=2ff6c088&scoped=true +// CONCATENATED MODULE: ./plugins/UsersManager/vue/src/PagedUsersList/PagedUsersList.vue?vue&type=template&id=4e2f5521 // CONCATENATED MODULE: ./node_modules/@vue/cli-plugin-typescript/node_modules/cache-loader/dist/cjs.js??ref--14-0!./node_modules/babel-loader/lib!./node_modules/@vue/cli-plugin-typescript/node_modules/ts-loader??ref--14-2!./node_modules/@vue/cli-service/node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/@vue/cli-service/node_modules/vue-loader-v16/dist??ref--0-1!./plugins/UsersManager/vue/src/PagedUsersList/PagedUsersList.vue?vue&type=script&lang=ts @@ -2677,6 +2687,10 @@ var PagedUsersListvue_type_script_lang_ts_window = window, type: Array, required: true }, + filterStatusLevels: { + type: Array, + required: true + }, totalEntries: Number, users: { type: Array, @@ -2706,6 +2720,7 @@ var PagedUsersListvue_type_script_lang_ts_window = window, userToChange: null, roleToChangeTo: null, accessLevelFilter: null, + statusLevelFilter: null, isRoleHelpToggled: false, userTextFilter: '', permissionsForSite: { @@ -2725,19 +2740,15 @@ var PagedUsersListvue_type_script_lang_ts_window = window, }, methods: { getInviteStatus: function getInviteStatus(inviteStatus) { - if (inviteStatus === 'accept') { - return Object(external_CoreHome_["translate"])('UsersManager_Active'); - } - - if (inviteStatus === 'pending') { - return Object(external_CoreHome_["translate"])('UsersManager_Pending'); + if (Number.isInteger(inviteStatus)) { + return Object(external_CoreHome_["translate"])('UsersManager_InviteDayLeft', inviteStatus); } if (inviteStatus === 'expired') { return Object(external_CoreHome_["translate"])('UsersManager_Expired'); } - return Object(external_CoreHome_["translate"])('UsersManager_Decline'); + return Object(external_CoreHome_["translate"])('UsersManager_Active'); }, onPermissionsForUpdate: function onPermissionsForUpdate(site) { this.permissionsForSite = site; @@ -2844,6 +2855,9 @@ var PagedUsersListvue_type_script_lang_ts_window = window, } }, computed: { + currentUserLogin: function currentUserLogin() { + return external_CoreHome_["Matomo"].userLogin; + }, paginationLowerBound: function paginationLowerBound() { return this.searchParams.offset + 1; }, @@ -2928,17 +2942,11 @@ var PagedUsersListvue_type_script_lang_ts_window = window, })); // CONCATENATED MODULE: ./plugins/UsersManager/vue/src/PagedUsersList/PagedUsersList.vue?vue&type=script&lang=ts -// EXTERNAL MODULE: ./plugins/UsersManager/vue/src/PagedUsersList/PagedUsersList.vue?vue&type=style&index=0&id=2ff6c088&scoped=true&lang=css -var PagedUsersListvue_type_style_index_0_id_2ff6c088_scoped_true_lang_css = __webpack_require__("f2d6"); - // CONCATENATED MODULE: ./plugins/UsersManager/vue/src/PagedUsersList/PagedUsersList.vue - - -PagedUsersListvue_type_script_lang_ts.render = PagedUsersListvue_type_template_id_2ff6c088_scoped_true_render -PagedUsersListvue_type_script_lang_ts.__scopeId = "data-v-2ff6c088" +PagedUsersListvue_type_script_lang_ts.render = PagedUsersListvue_type_template_id_4e2f5521_render /* harmony default export */ var PagedUsersList = (PagedUsersListvue_type_script_lang_ts); // CONCATENATED MODULE: ./plugins/UsersManager/vue/src/PagedUsersList/PagedUsersList.adapter.ts @@ -3004,47 +3012,47 @@ PagedUsersListvue_type_script_lang_ts.__scopeId = "data-v-2ff6c088" directiveName: 'piwikPagedUsersList', restrict: 'E' })); -// CONCATENATED MODULE: ./node_modules/@vue/cli-plugin-babel/node_modules/cache-loader/dist/cjs.js??ref--12-0!./node_modules/@vue/cli-plugin-babel/node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib!./node_modules/@vue/cli-service/node_modules/vue-loader-v16/dist/templateLoader.js??ref--6!./node_modules/@vue/cli-service/node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/@vue/cli-service/node_modules/vue-loader-v16/dist??ref--0-1!./plugins/UsersManager/vue/src/UsersManager/UsersManager.vue?vue&type=template&id=621f5797 +// CONCATENATED MODULE: ./node_modules/@vue/cli-plugin-babel/node_modules/cache-loader/dist/cjs.js??ref--12-0!./node_modules/@vue/cli-plugin-babel/node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib!./node_modules/@vue/cli-service/node_modules/vue-loader-v16/dist/templateLoader.js??ref--6!./node_modules/@vue/cli-service/node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/@vue/cli-service/node_modules/vue-loader-v16/dist??ref--0-1!./plugins/UsersManager/vue/src/UsersManager/UsersManager.vue?vue&type=template&id=4688a5a2 -var UsersManagervue_type_template_id_621f5797_hoisted_1 = { +var UsersManagervue_type_template_id_4688a5a2_hoisted_1 = { class: "usersManager" }; -var UsersManagervue_type_template_id_621f5797_hoisted_2 = { +var UsersManagervue_type_template_id_4688a5a2_hoisted_2 = { key: 0 }; -var UsersManagervue_type_template_id_621f5797_hoisted_3 = { +var UsersManagervue_type_template_id_4688a5a2_hoisted_3 = { key: 1 }; -var UsersManagervue_type_template_id_621f5797_hoisted_4 = { +var UsersManagervue_type_template_id_4688a5a2_hoisted_4 = { class: "row add-user-container" }; -var UsersManagervue_type_template_id_621f5797_hoisted_5 = { +var UsersManagervue_type_template_id_4688a5a2_hoisted_5 = { class: "col s12" }; -var UsersManagervue_type_template_id_621f5797_hoisted_6 = { +var UsersManagervue_type_template_id_4688a5a2_hoisted_6 = { class: "input-field", style: { "margin-right": "3.5px" } }; -var UsersManagervue_type_template_id_621f5797_hoisted_7 = { +var UsersManagervue_type_template_id_4688a5a2_hoisted_7 = { key: 0, class: "input-field" }; -var UsersManagervue_type_template_id_621f5797_hoisted_8 = { +var UsersManagervue_type_template_id_4688a5a2_hoisted_8 = { key: 0 }; -var UsersManagervue_type_template_id_621f5797_hoisted_9 = { +var UsersManagervue_type_template_id_4688a5a2_hoisted_9 = { class: "add-existing-user-modal modal", ref: "addExistingUserModal" }; -var UsersManagervue_type_template_id_621f5797_hoisted_10 = { +var UsersManagervue_type_template_id_4688a5a2_hoisted_10 = { class: "modal-content" }; -var UsersManagervue_type_template_id_621f5797_hoisted_11 = { +var UsersManagervue_type_template_id_4688a5a2_hoisted_11 = { class: "modal-footer" }; -function UsersManagervue_type_template_id_621f5797_render(_ctx, _cache, $props, $setup, $data, $options) { +function UsersManagervue_type_template_id_4688a5a2_render(_ctx, _cache, $props, $setup, $data, $options) { var _component_EnrichedHeadline = Object(external_commonjs_vue_commonjs2_vue_root_Vue_["resolveComponent"])("EnrichedHeadline"); var _component_PagedUsersList = Object(external_commonjs_vue_commonjs2_vue_root_Vue_["resolveComponent"])("PagedUsersList"); @@ -3057,7 +3065,7 @@ function UsersManagervue_type_template_id_621f5797_render(_ctx, _cache, $props, var _directive_tooltips = Object(external_commonjs_vue_commonjs2_vue_root_Vue_["resolveDirective"])("tooltips"); - return Object(external_commonjs_vue_commonjs2_vue_root_Vue_["withDirectives"])((Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("div", UsersManagervue_type_template_id_621f5797_hoisted_1, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["withDirectives"])(Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", null, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["withDirectives"])(Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", null, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("h2", null, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createVNode"])(_component_EnrichedHeadline, { + return Object(external_commonjs_vue_commonjs2_vue_root_Vue_["withDirectives"])((Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("div", UsersManagervue_type_template_id_4688a5a2_hoisted_1, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["withDirectives"])(Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", null, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["withDirectives"])(Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", null, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("h2", null, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createVNode"])(_component_EnrichedHeadline, { "help-url": "https://matomo.org/docs/manage-users/", "feature-name": "Users Management" }, { @@ -3065,12 +3073,12 @@ function UsersManagervue_type_template_id_621f5797_render(_ctx, _cache, $props, return [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createTextVNode"])(Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('UsersManager_ManageUsers')), 1)]; }), _: 1 - })]), _ctx.currentUserRole === 'superuser' ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("p", UsersManagervue_type_template_id_621f5797_hoisted_2, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('UsersManager_ManageUsersDesc')), 1)) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true), _ctx.currentUserRole === 'admin' ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("p", UsersManagervue_type_template_id_621f5797_hoisted_3, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('UsersManager_ManageUsersAdminDesc')), 1)) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", UsersManagervue_type_template_id_621f5797_hoisted_4, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", UsersManagervue_type_template_id_621f5797_hoisted_5, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", UsersManagervue_type_template_id_621f5797_hoisted_6, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("a", { + })]), _ctx.currentUserRole === 'superuser' ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("p", UsersManagervue_type_template_id_4688a5a2_hoisted_2, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('UsersManager_ManageUsersDesc')), 1)) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true), _ctx.currentUserRole === 'admin' ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("p", UsersManagervue_type_template_id_4688a5a2_hoisted_3, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('UsersManager_ManageUsersAdminDesc')), 1)) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", UsersManagervue_type_template_id_4688a5a2_hoisted_4, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", UsersManagervue_type_template_id_4688a5a2_hoisted_5, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", UsersManagervue_type_template_id_4688a5a2_hoisted_6, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("a", { class: "btn add-new-user", onClick: _cache[0] || (_cache[0] = function ($event) { return _ctx.onAddNewUser(); }) - }, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('UsersManager_InviteNewUser')), 1)]), _ctx.currentUserRole !== 'superuser' ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("div", UsersManagervue_type_template_id_621f5797_hoisted_7, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("a", { + }, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('UsersManager_InviteNewUser')), 1)]), _ctx.currentUserRole !== 'superuser' ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("div", UsersManagervue_type_template_id_4688a5a2_hoisted_7, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("a", { class: "btn add-existing-user", onClick: _cache[1] || (_cache[1] = function ($event) { return _ctx.showAddExistingUserModal(); @@ -3099,10 +3107,11 @@ function UsersManagervue_type_template_id_621f5797_render(_ctx, _cache, $props, "current-user-role": _ctx.currentUserRole, "access-levels": _ctx.accessLevels, "filter-access-levels": _ctx.actualFilterAccessLevels, + "filter-status-levels": _ctx.filterStatusLevels, "search-params": _ctx.searchParams, users: _ctx.users, "total-entries": _ctx.totalEntries - }, null, 8, ["initial-site-id", "initial-site-name", "is-loading-users", "current-user-role", "access-levels", "filter-access-levels", "search-params", "users", "total-entries"])], 512), [[_directive_content_intro]])], 512), [[external_commonjs_vue_commonjs2_vue_root_Vue_["vShow"], !_ctx.isEditing]]), _ctx.isEditing ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("div", UsersManagervue_type_template_id_621f5797_hoisted_8, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createVNode"])(_component_UserEditForm, { + }, null, 8, ["initial-site-id", "initial-site-name", "is-loading-users", "current-user-role", "access-levels", "filter-access-levels", "filter-status-levels", "search-params", "users", "total-entries"])], 512), [[_directive_content_intro]])], 512), [[external_commonjs_vue_commonjs2_vue_root_Vue_["vShow"], !_ctx.isEditing]]), _ctx.isEditing ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("div", UsersManagervue_type_template_id_4688a5a2_hoisted_8, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createVNode"])(_component_UserEditForm, { onDone: _cache[7] || (_cache[7] = function ($event) { return _ctx.onDoneEditing($event.isUserModified); }), @@ -3115,14 +3124,14 @@ function UsersManagervue_type_template_id_621f5797_render(_ctx, _cache, $props, onUpdated: _cache[8] || (_cache[8] = function ($event) { return _ctx.userBeingEdited = $event.user; }) - }, null, 8, ["user", "current-user-role", "access-levels", "filter-access-levels", "initial-site-id", "initial-site-name"])])) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", UsersManagervue_type_template_id_621f5797_hoisted_9, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", UsersManagervue_type_template_id_621f5797_hoisted_10, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("h3", null, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('UsersManager_AddExistingUser')), 1), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("p", null, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('UsersManager_EnterUsernameOrEmail')) + ":", 1), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", null, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createVNode"])(_component_Field, { + }, null, 8, ["user", "current-user-role", "access-levels", "filter-access-levels", "initial-site-id", "initial-site-name"])])) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", UsersManagervue_type_template_id_4688a5a2_hoisted_9, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", UsersManagervue_type_template_id_4688a5a2_hoisted_10, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("h3", null, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('UsersManager_AddExistingUser')), 1), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("p", null, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('UsersManager_EnterUsernameOrEmail')) + ":", 1), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", null, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createVNode"])(_component_Field, { modelValue: _ctx.addNewUserLoginEmail, "onUpdate:modelValue": _cache[9] || (_cache[9] = function ($event) { return _ctx.addNewUserLoginEmail = $event; }), name: "add-existing-user-email", uicontrol: "text" - }, null, 8, ["modelValue"])])]), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", UsersManagervue_type_template_id_621f5797_hoisted_11, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("a", { + }, null, 8, ["modelValue"])])]), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", UsersManagervue_type_template_id_4688a5a2_hoisted_11, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("a", { href: "", class: "modal-action modal-close btn", onClick: _cache[10] || (_cache[10] = Object(external_commonjs_vue_commonjs2_vue_root_Vue_["withModifiers"])(function ($event) { @@ -3139,7 +3148,7 @@ function UsersManagervue_type_template_id_621f5797_render(_ctx, _cache, $props, }, ["prevent"])) }, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('General_Cancel')), 1)])], 512)], 512)), [[_directive_tooltips]]); } -// CONCATENATED MODULE: ./plugins/UsersManager/vue/src/UsersManager/UsersManager.vue?vue&type=template&id=621f5797 +// CONCATENATED MODULE: ./plugins/UsersManager/vue/src/UsersManager/UsersManager.vue?vue&type=template&id=4688a5a2 // CONCATENATED MODULE: ./node_modules/@vue/cli-plugin-typescript/node_modules/cache-loader/dist/cjs.js??ref--14-0!./node_modules/babel-loader/lib!./node_modules/@vue/cli-plugin-typescript/node_modules/ts-loader??ref--14-2!./node_modules/@vue/cli-service/node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/@vue/cli-service/node_modules/vue-loader-v16/dist??ref--0-1!./plugins/UsersManager/vue/src/UsersManager/UsersManager.vue?vue&type=script&lang=ts function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); } @@ -3184,6 +3193,10 @@ var UsersManagervue_type_script_lang_ts_window = window, filterAccessLevels: { type: Array, required: true + }, + filterStatusLevels: { + type: Array, + required: true } }, components: { @@ -3207,6 +3220,7 @@ var UsersManagervue_type_script_lang_ts_window = window, limit: NUM_USERS_PER_PAGE, filter_search: '', filter_access: '', + filter_status: '', idSite: this.initialSiteId }, isLoadingUsers: false, @@ -3280,6 +3294,7 @@ var UsersManagervue_type_script_lang_ts_window = window, method: 'UsersManager.getUsersPlusRole', filter_search: this.searchParams.filter_search, filter_access: this.searchParams.filter_access, + filter_status: this.searchParams.filter_status, idSite: this.searchParams.idSite, filter_limit: '-1' }); @@ -3314,16 +3329,25 @@ var UsersManagervue_type_script_lang_ts_window = window, }); }, onResendInvite: function onResendInvite(user) { - console.log(user); + var _this3 = this; + external_CoreHome_["AjaxHelper"].fetch({ method: 'UsersManager.resendInvite', userLogin: user.login - }).then(function (res) { - console.log(res); + }).then(function () { + _this3.fetchUsers(); + + var id = external_CoreHome_["NotificationsStore"].show({ + message: Object(external_CoreHome_["translate"])('UsersManager_ResendInviteSuccess', user.login), + id: 'resendinvite', + context: 'success', + type: 'transient' + }); + external_CoreHome_["NotificationsStore"].scrollToNotification(id); }); }, fetchUsers: function fetchUsers() { - var _this3 = this; + var _this4 = this; this.isLoadingUsers = true; return external_CoreHome_["AjaxHelper"].fetch(Object.assign(Object.assign({}, this.searchParams), {}, { @@ -3332,15 +3356,15 @@ var UsersManagervue_type_script_lang_ts_window = window, returnResponseObject: true }).then(function (helper) { var result = helper.getRequestHandle(); - _this3.totalEntries = parseInt(result.getResponseHeader('x-matomo-total-results') || '0', 10); - _this3.users = result.responseJSON; - _this3.isLoadingUsers = false; + _this4.totalEntries = parseInt(result.getResponseHeader('x-matomo-total-results') || '0', 10); + _this4.users = result.responseJSON; + _this4.isLoadingUsers = false; }).catch(function () { - _this3.isLoadingUsers = false; + _this4.isLoadingUsers = false; }); }, addExistingUser: function addExistingUser() { - var _this4 = this; + var _this5 = this; this.isLoadingUsers = true; return external_CoreHome_["AjaxHelper"].fetch({ @@ -3348,12 +3372,12 @@ var UsersManagervue_type_script_lang_ts_window = window, userLogin: this.addNewUserLoginEmail }).then(function (response) { if (response && response.value) { - return _this4.addNewUserLoginEmail; + return _this5.addNewUserLoginEmail; } return external_CoreHome_["AjaxHelper"].fetch({ method: 'UsersManager.getUserLoginFromUserEmail', - userEmail: _this4.addNewUserLoginEmail + userEmail: _this5.addNewUserLoginEmail }).then(function (r) { return r.value; }); @@ -3363,12 +3387,12 @@ var UsersManagervue_type_script_lang_ts_window = window, }, { userLogin: login, access: 'view', - idSites: _this4.searchParams.idSite + idSites: _this5.searchParams.idSite }); }).then(function () { - return _this4.fetchUsers(); + return _this5.fetchUsers(); }).catch(function () { - _this4.isLoadingUsers = false; + _this5.isLoadingUsers = false; }); }, onAddNewUser: function onAddNewUser() { @@ -3404,7 +3428,7 @@ var UsersManagervue_type_script_lang_ts_window = window, -UsersManagervue_type_script_lang_ts.render = UsersManagervue_type_template_id_621f5797_render +UsersManagervue_type_script_lang_ts.render = UsersManagervue_type_template_id_4688a5a2_render /* harmony default export */ var UsersManager = (UsersManagervue_type_script_lang_ts); // CONCATENATED MODULE: ./plugins/UsersManager/vue/src/UsersManager/UsersManager.adapter.ts @@ -3433,6 +3457,9 @@ UsersManagervue_type_script_lang_ts.render = UsersManagervue_type_template_id_62 }, filterAccessLevels: { angularJsBind: '<' + }, + filterStatusLevels: { + angularJsBind: '<' } }, directiveName: 'piwikUsersManager', diff --git a/plugins/UsersManager/vue/dist/UsersManager.umd.min.js b/plugins/UsersManager/vue/dist/UsersManager.umd.min.js index c3c14a30d0..980b483417 100644 --- a/plugins/UsersManager/vue/dist/UsersManager.umd.min.js +++ b/plugins/UsersManager/vue/dist/UsersManager.umd.min.js @@ -1,56 +1,56 @@ -(function(e,t){"object"===typeof exports&&"object"===typeof module?module.exports=t(require("CoreHome"),require("vue"),require("CorePluginsAdmin")):"function"===typeof define&&define.amd?define(["CoreHome",,"CorePluginsAdmin"],t):"object"===typeof exports?exports["UsersManager"]=t(require("CoreHome"),require("vue"),require("CorePluginsAdmin")):e["UsersManager"]=t(e["CoreHome"],e["Vue"],e["CorePluginsAdmin"])})("undefined"!==typeof self?self:this,(function(e,t,n){return function(e){var t={};function n(s){if(t[s])return t[s].exports;var r=t[s]={i:s,l:!1,exports:{}};return e[s].call(r.exports,r,r.exports,n),r.l=!0,r.exports}return n.m=e,n.c=t,n.d=function(e,t,s){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:s})},n.r=function(e){"undefined"!==typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"===typeof e&&e&&e.__esModule)return e;var s=Object.create(null);if(n.r(s),Object.defineProperty(s,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var r in e)n.d(s,r,function(t){return e[t]}.bind(null,r));return s},n.n=function(e){var t=e&&e.__esModule?function(){return e["default"]}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="plugins/UsersManager/vue/dist/",n(n.s="fae3")}({"19dc":function(t,n){t.exports=e},"8bba":function(e,t,n){},"8bbf":function(e,n){e.exports=t},a5a2:function(e,t){e.exports=n},f2d6:function(e,t,n){"use strict";n("8bba")},fae3:function(e,t,n){"use strict";if(n.r(t),n.d(t,"CapabilitiesEdit",(function(){return E})),n.d(t,"UserPermissionsEdit",(function(){return Fe})),n.d(t,"UserEditForm",(function(){return yt})),n.d(t,"PagedUsersList",(function(){return es})),n.d(t,"UsersManager",(function(){return Ss})),n.d(t,"NewsletterSettings",(function(){return ks})),n.d(t,"AnonymousSettings",(function(){return Ms})),n.d(t,"PersonalSettings",(function(){return $s})),"undefined"!==typeof window){var s=window.document.currentScript,r=s&&s.src.match(/(.+\/)[^/]+\.js(\?.*)?$/);r&&(n.p=r[1])}var i=n("19dc"),a=n("8bbf"),o=["title"],l=["onClick"],c={key:0,class:"addCapability"},d={class:"ui-confirm confirmCapabilityToggle modal",ref:"confirmCapabilityToggleModal"},u={class:"modal-content"},m=["innerHTML"],b=["innerHTML"],p={class:"modal-footer"};function g(e,t,n,s,r,i){var g=Object(a["resolveComponent"])("Field");return Object(a["openBlock"])(),Object(a["createElementBlock"])("div",{class:Object(a["normalizeClass"])(["capabilitiesEdit",{busy:e.isBusy}])},[(Object(a["openBlock"])(!0),Object(a["createElementBlock"])(a["Fragment"],null,Object(a["renderList"])(e.actualCapabilities,(function(t){return Object(a["openBlock"])(),Object(a["createElementBlock"])("div",{key:t.id,class:"chip"},[Object(a["createElementVNode"])("span",{class:"capability-name",title:"".concat(t.description," ").concat(e.isIncludedInRole(t)?"<br/><br/>".concat(e.translate("UsersManager_IncludedInUsersRole")):"")},Object(a["toDisplayString"])(t.category)+": "+Object(a["toDisplayString"])(t.name),9,o),e.isIncludedInRole(t)?Object(a["createCommentVNode"])("",!0):(Object(a["openBlock"])(),Object(a["createElementBlock"])("span",{key:0,class:"icon-close",onClick:function(n){e.capabilityToRemoveId=t.id,e.onToggleCapability(!1)}},null,8,l))])})),128)),e.availableCapabilitiesGrouped.length?(Object(a["openBlock"])(),Object(a["createElementBlock"])("div",c,[Object(a["createVNode"])(g,{"model-value":e.capabilityToAddId,"onUpdate:modelValue":t[0]||(t[0]=function(t){e.capabilityToAddId=t,e.onToggleCapability(!0)}),disabled:e.isBusy,uicontrol:"expandable-select",name:"add_capability","full-width":!0,options:e.availableCapabilitiesGrouped},null,8,["model-value","disabled","options"])])):Object(a["createCommentVNode"])("",!0),Object(a["createElementVNode"])("div",d,[Object(a["createElementVNode"])("div",u,[e.isAddingCapability?(Object(a["openBlock"])(),Object(a["createElementBlock"])("h2",{key:0,innerHTML:e.$sanitize(e.confirmAddCapabilityToggleContent)},null,8,m)):Object(a["createCommentVNode"])("",!0),e.isAddingCapability?Object(a["createCommentVNode"])("",!0):(Object(a["openBlock"])(),Object(a["createElementBlock"])("h2",{key:1,innerHTML:e.$sanitize(e.confirmCapabilityToggleContent)},null,8,b))]),Object(a["createElementVNode"])("div",p,[Object(a["createElementVNode"])("a",{href:"",class:"modal-action modal-close btn",onClick:t[1]||(t[1]=Object(a["withModifiers"])((function(t){return e.toggleCapability()}),["prevent"]))},Object(a["toDisplayString"])(e.translate("General_Yes")),1),Object(a["createElementVNode"])("a",{href:"",class:"modal-action modal-close modal-no",onClick:t[2]||(t[2]=Object(a["withModifiers"])((function(t){e.capabilityToAddOrRemove=null,e.capabilityToAddId=null,e.capabilityToRemoveId=null}),["prevent"]))},Object(a["toDisplayString"])(e.translate("General_No")),1)])],512)],2)}var h=n("a5a2");function f(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function j(e,t){for(var n=0;n<t.length;n++){var s=t[n];s.enumerable=s.enumerable||!1,s.configurable=!0,"value"in s&&(s.writable=!0),Object.defineProperty(e,s.key,s)}}function O(e,t,n){return t&&j(e.prototype,t),n&&j(e,n),e}function v(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e} +(function(e,t){"object"===typeof exports&&"object"===typeof module?module.exports=t(require("CoreHome"),require("vue"),require("CorePluginsAdmin")):"function"===typeof define&&define.amd?define(["CoreHome",,"CorePluginsAdmin"],t):"object"===typeof exports?exports["UsersManager"]=t(require("CoreHome"),require("vue"),require("CorePluginsAdmin")):e["UsersManager"]=t(e["CoreHome"],e["Vue"],e["CorePluginsAdmin"])})("undefined"!==typeof self?self:this,(function(e,t,n){return function(e){var t={};function n(s){if(t[s])return t[s].exports;var r=t[s]={i:s,l:!1,exports:{}};return e[s].call(r.exports,r,r.exports,n),r.l=!0,r.exports}return n.m=e,n.c=t,n.d=function(e,t,s){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:s})},n.r=function(e){"undefined"!==typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"===typeof e&&e&&e.__esModule)return e;var s=Object.create(null);if(n.r(s),Object.defineProperty(s,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var r in e)n.d(s,r,function(t){return e[t]}.bind(null,r));return s},n.n=function(e){var t=e&&e.__esModule?function(){return e["default"]}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="plugins/UsersManager/vue/dist/",n(n.s="fae3")}({"19dc":function(t,n){t.exports=e},"8bbf":function(e,n){e.exports=t},a5a2:function(e,t){e.exports=n},fae3:function(e,t,n){"use strict";if(n.r(t),n.d(t,"CapabilitiesEdit",(function(){return E})),n.d(t,"UserPermissionsEdit",(function(){return He})),n.d(t,"UserEditForm",(function(){return yt})),n.d(t,"PagedUsersList",(function(){return ns})),n.d(t,"UsersManager",(function(){return ys})),n.d(t,"NewsletterSettings",(function(){return ws})),n.d(t,"AnonymousSettings",(function(){return _s})),n.d(t,"PersonalSettings",(function(){return zs})),"undefined"!==typeof window){var s=window.document.currentScript,r=s&&s.src.match(/(.+\/)[^/]+\.js(\?.*)?$/);r&&(n.p=r[1])}var i=n("19dc"),a=n("8bbf"),o=["title"],l=["onClick"],c={key:0,class:"addCapability"},d={class:"ui-confirm confirmCapabilityToggle modal",ref:"confirmCapabilityToggleModal"},u={class:"modal-content"},m=["innerHTML"],b=["innerHTML"],p={class:"modal-footer"};function g(e,t,n,s,r,i){var g=Object(a["resolveComponent"])("Field");return Object(a["openBlock"])(),Object(a["createElementBlock"])("div",{class:Object(a["normalizeClass"])(["capabilitiesEdit",{busy:e.isBusy}])},[(Object(a["openBlock"])(!0),Object(a["createElementBlock"])(a["Fragment"],null,Object(a["renderList"])(e.actualCapabilities,(function(t){return Object(a["openBlock"])(),Object(a["createElementBlock"])("div",{key:t.id,class:"chip"},[Object(a["createElementVNode"])("span",{class:"capability-name",title:"".concat(t.description," ").concat(e.isIncludedInRole(t)?"<br/><br/>".concat(e.translate("UsersManager_IncludedInUsersRole")):"")},Object(a["toDisplayString"])(t.category)+": "+Object(a["toDisplayString"])(t.name),9,o),e.isIncludedInRole(t)?Object(a["createCommentVNode"])("",!0):(Object(a["openBlock"])(),Object(a["createElementBlock"])("span",{key:0,class:"icon-close",onClick:function(n){e.capabilityToRemoveId=t.id,e.onToggleCapability(!1)}},null,8,l))])})),128)),e.availableCapabilitiesGrouped.length?(Object(a["openBlock"])(),Object(a["createElementBlock"])("div",c,[Object(a["createVNode"])(g,{"model-value":e.capabilityToAddId,"onUpdate:modelValue":t[0]||(t[0]=function(t){e.capabilityToAddId=t,e.onToggleCapability(!0)}),disabled:e.isBusy,uicontrol:"expandable-select",name:"add_capability","full-width":!0,options:e.availableCapabilitiesGrouped},null,8,["model-value","disabled","options"])])):Object(a["createCommentVNode"])("",!0),Object(a["createElementVNode"])("div",d,[Object(a["createElementVNode"])("div",u,[e.isAddingCapability?(Object(a["openBlock"])(),Object(a["createElementBlock"])("h2",{key:0,innerHTML:e.$sanitize(e.confirmAddCapabilityToggleContent)},null,8,m)):Object(a["createCommentVNode"])("",!0),e.isAddingCapability?Object(a["createCommentVNode"])("",!0):(Object(a["openBlock"])(),Object(a["createElementBlock"])("h2",{key:1,innerHTML:e.$sanitize(e.confirmCapabilityToggleContent)},null,8,b))]),Object(a["createElementVNode"])("div",p,[Object(a["createElementVNode"])("a",{href:"",class:"modal-action modal-close btn",onClick:t[1]||(t[1]=Object(a["withModifiers"])((function(t){return e.toggleCapability()}),["prevent"]))},Object(a["toDisplayString"])(e.translate("General_Yes")),1),Object(a["createElementVNode"])("a",{href:"",class:"modal-action modal-close modal-no",onClick:t[2]||(t[2]=Object(a["withModifiers"])((function(t){e.capabilityToAddOrRemove=null,e.capabilityToAddId=null,e.capabilityToRemoveId=null}),["prevent"]))},Object(a["toDisplayString"])(e.translate("General_No")),1)])],512)],2)}var f=n("a5a2");function h(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function j(e,t){for(var n=0;n<t.length;n++){var s=t[n];s.enumerable=s.enumerable||!1,s.configurable=!0,"value"in s&&(s.writable=!0),Object.defineProperty(e,s.key,s)}}function O(e,t,n){return t&&j(e.prototype,t),n&&j(e,n),e}function v(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e} /*! * Matomo - free/libre analytics platform * * @link https://matomo.org * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later - */var C=function(){function e(){var t=this;f(this,e),v(this,"privateState",Object(a["reactive"])({isLoading:!1,capabilities:[]})),v(this,"state",Object(a["computed"])((function(){return Object(a["readonly"])(t.privateState)}))),v(this,"capabilities",Object(a["computed"])((function(){return t.state.value.capabilities}))),v(this,"isLoading",Object(a["computed"])((function(){return t.state.value.isLoading}))),v(this,"fetchPromise",void 0)}return O(e,[{key:"init",value:function(){return this.fetchCapabilities()}},{key:"fetchCapabilities",value:function(){var e=this;return this.fetchPromise||(this.privateState.isLoading=!0,this.fetchPromise=i["AjaxHelper"].fetch({method:"UsersManager.getAvailableCapabilities"}).then((function(t){return e.privateState.capabilities=t,e.capabilities.value})).finally((function(){e.privateState.isLoading=!1}))),this.fetchPromise}}]),e}(),N=new C,S=window,U=S.$,y=Object(a["defineComponent"])({props:{idsite:[String,Number],siteName:{type:String,required:!0},userLogin:{type:String,required:!0},userRole:{type:String,required:!0},capabilities:Array},components:{Field:h["Field"]},data:function(){return{theCapabilities:this.capabilities||[],isBusy:!1,isAddingCapability:!1,capabilityToAddId:null,capabilityToRemoveId:null,capabilityToAddOrRemove:null}},emits:["change"],watch:{capabilities:function(e){e&&(this.theCapabilities=e)}},created:function(){var e=this;N.init(),this.capabilities?this.theCapabilities=this.capabilities:(this.isBusy=!0,i["AjaxHelper"].fetch({method:"UsersManager.getUsersPlusRole",limit:"1",filter_search:this.userLogin}).then((function(e){return e&&e.capabilities?e.capabilities:[]})).then((function(t){e.theCapabilities=t})).finally((function(){e.isBusy=!1})))},methods:{onToggleCapability:function(e){var t=this;this.isAddingCapability=e;var n=e?this.capabilityToAddId:this.capabilityToRemoveId;this.capabilityToAddOrRemove=null,this.availableCapabilities.forEach((function(e){e.id===n&&(t.capabilityToAddOrRemove=e)})),this.$refs.confirmCapabilityToggleModal&&U(this.$refs.confirmCapabilityToggleModal).modal({dismissible:!1,yes:function(){return null}}).modal("open")},toggleCapability:function(){this.isAddingCapability?this.addCapability(this.capabilityToAddOrRemove):this.removeCapability(this.capabilityToAddOrRemove)},isIncludedInRole:function(e){return-1!==(e.includedInRoles||[]).indexOf(this.userRole)},getCapabilitiesList:function(){var e=this,t=[];return this.availableCapabilities.forEach((function(n){e.isIncludedInRole(n)||e.capabilitiesSet[n.id]&&t.push(n.id)})),t},addCapability:function(e){var t=this;this.isBusy=!0,i["AjaxHelper"].post({method:"UsersManager.addCapabilities"},{userLogin:this.userLogin,capabilities:e.id,idSites:this.idsite}).then((function(){t.$emit("change",t.getCapabilitiesList())})).finally((function(){t.isBusy=!1,t.capabilityToAddOrRemove=null,t.capabilityToAddId=null,t.capabilityToRemoveId=null}))},removeCapability:function(e){var t=this;this.isBusy=!0,i["AjaxHelper"].post({method:"UsersManager.removeCapabilities"},{userLogin:this.userLogin,capabilities:e.id,idSites:this.idsite}).then((function(){t.$emit("change",t.getCapabilitiesList())})).finally((function(){t.isBusy=!1,t.capabilityToAddOrRemove=null,t.capabilityToAddId=null,t.capabilityToRemoveId=null}))}},computed:{availableCapabilities:function(){return N.capabilities.value},confirmAddCapabilityToggleContent:function(){return Object(i["translate"])("UsersManager_AreYouSureAddCapability","<strong>".concat(this.userLogin,"</strong>"),"<strong>".concat(this.capabilityToAddOrRemove?this.capabilityToAddOrRemove.name:"","</strong>"),"<strong>".concat(this.siteNameText,"</strong>"))},confirmCapabilityToggleContent:function(){return Object(i["translate"])("UsersManager_AreYouSureRemoveCapability","<strong>".concat(this.capabilityToAddOrRemove?this.capabilityToAddOrRemove.name:"","</strong>"),"<strong>".concat(this.userLogin,"</strong>"),"<strong>".concat(this.siteNameText,"</strong>"))},siteNameText:function(){return i["Matomo"].helper.htmlEntities(this.siteName)},availableCapabilitiesGrouped:function(){var e=this,t=this.availableCapabilities.filter((function(t){return!e.capabilitiesSet[t.id]})).map((function(e){return{group:e.category,key:e.id,value:e.name,tooltip:e.description}}));return t.sort((function(e,t){return e.group===t.group?e.value===t.value?0:e.value<t.value?-1:1:e.group<t.group?-1:1})),t},capabilitiesSet:function(){var e=this,t={},n=this.theCapabilities;return(n||[]).forEach((function(e){t[e]=!0})),(this.availableCapabilities||[]).forEach((function(n){e.isIncludedInRole(n)&&(t[n.id]=!0)})),t},actualCapabilities:function(){var e=this.capabilitiesSet;return this.availableCapabilities.filter((function(t){return!!e[t.id]}))}}});y.render=g;var E=y,V=(Object(i["createAngularJsAdapter"])({component:E,scope:{idsite:{angularJsBind:"<"},siteName:{angularJsBind:"<"},userLogin:{angularJsBind:"<"},userRole:{angularJsBind:"<"},capabilities:{angularJsBind:"<"},onCapabilitiesChange:{angularJsBind:"&",vue:"change"}},directiveName:"piwikCapabilitiesEdit",restrict:"E",$inject:["$timeout"],events:{change:function(e,t,n,s,r,i,a){a((function(){n.onCapabilitiesChange&&n.onCapabilitiesChange.call({capabilities:e})}))}}}),{key:0,class:"row"}),k={class:"row to-all-websites"},A={class:"col s12"},w={style:{"margin-right":"3.5px"}},T={id:"all-sites-access-select",style:{"margin-right":"3.5px"}},B={style:{"margin-top":"18px"}},_={class:"filters row"},D={class:"col s12 m12 l8"},L={class:"input-field bulk-actions",style:{"margin-right":"3.5px"}},R={id:"user-permissions-edit-bulk-actions",class:"dropdown-content"},x={class:"dropdown-trigger","data-target":"user-permissions-bulk-set-access"},P={id:"user-permissions-bulk-set-access",class:"dropdown-content"},H=["onClick"],F={class:"input-field site-filter",style:{"margin-right":"3.5px"}},I=["value","placeholder"],J={class:"input-field access-filter",style:{"margin-right":"3.5px"}},q={key:0,class:"col s12 m12 l4 sites-for-permission-pagination-container"},$={class:"sites-for-permission-pagination"},G={class:"counter"},z=["textContent"],W={class:"roles-help-notification"},Y=["innerHTML"],X={class:"capabilities-help-notification"},K={id:"sitesForPermission"},Q={class:"select-cell"},Z={class:"checkbox-container"},ee=["checked"],te=Object(a["createElementVNode"])("span",null,null,-1),ne={class:"role_header"},se=["innerHTML"],re=Object(a["createElementVNode"])("span",{class:"icon-help"},null,-1),ie=[re],ae={class:"capabilities_header"},oe=["innerHTML"],le=Object(a["createElementVNode"])("span",{class:"icon-help"},null,-1),ce=[le],de={key:0,class:"select-all-row"},ue={colspan:"4"},me={key:0},be=["innerHTML"],pe=["innerHTML"],ge={key:1},he=["innerHTML"],fe=["innerHTML"],je={class:"select-cell"},Oe={class:"checkbox-container"},ve=["id","onUpdate:modelValue"],Ce=Object(a["createElementVNode"])("span",null,null,-1),Ne={class:"role-select"},Se={class:"delete-access-confirm-modal modal",ref:"deleteAccessConfirmModal"},Ue={class:"modal-content"},ye=["innerHTML"],Ee=["innerHTML"],Ve={class:"modal-footer"},ke={class:"change-access-confirm-modal modal",ref:"changeAccessConfirmModal"},Ae={class:"modal-content"},we=["innerHTML"],Te=["innerHTML"],Me={class:"modal-footer"},Be={class:"confirm-give-access-all-sites modal",ref:"confirmGiveAccessAllSitesModal"},_e={class:"modal-content"},De=["innerHTML"],Le={class:"modal-footer"}; + */var C=function(){function e(){var t=this;h(this,e),v(this,"privateState",Object(a["reactive"])({isLoading:!1,capabilities:[]})),v(this,"state",Object(a["computed"])((function(){return Object(a["readonly"])(t.privateState)}))),v(this,"capabilities",Object(a["computed"])((function(){return t.state.value.capabilities}))),v(this,"isLoading",Object(a["computed"])((function(){return t.state.value.isLoading}))),v(this,"fetchPromise",void 0)}return O(e,[{key:"init",value:function(){return this.fetchCapabilities()}},{key:"fetchCapabilities",value:function(){var e=this;return this.fetchPromise||(this.privateState.isLoading=!0,this.fetchPromise=i["AjaxHelper"].fetch({method:"UsersManager.getAvailableCapabilities"}).then((function(t){return e.privateState.capabilities=t,e.capabilities.value})).finally((function(){e.privateState.isLoading=!1}))),this.fetchPromise}}]),e}(),N=new C,S=window,U=S.$,y=Object(a["defineComponent"])({props:{idsite:[String,Number],siteName:{type:String,required:!0},userLogin:{type:String,required:!0},userRole:{type:String,required:!0},capabilities:Array},components:{Field:f["Field"]},data:function(){return{theCapabilities:this.capabilities||[],isBusy:!1,isAddingCapability:!1,capabilityToAddId:null,capabilityToRemoveId:null,capabilityToAddOrRemove:null}},emits:["change"],watch:{capabilities:function(e){e&&(this.theCapabilities=e)}},created:function(){var e=this;N.init(),this.capabilities?this.theCapabilities=this.capabilities:(this.isBusy=!0,i["AjaxHelper"].fetch({method:"UsersManager.getUsersPlusRole",limit:"1",filter_search:this.userLogin}).then((function(e){return e&&e.capabilities?e.capabilities:[]})).then((function(t){e.theCapabilities=t})).finally((function(){e.isBusy=!1})))},methods:{onToggleCapability:function(e){var t=this;this.isAddingCapability=e;var n=e?this.capabilityToAddId:this.capabilityToRemoveId;this.capabilityToAddOrRemove=null,this.availableCapabilities.forEach((function(e){e.id===n&&(t.capabilityToAddOrRemove=e)})),this.$refs.confirmCapabilityToggleModal&&U(this.$refs.confirmCapabilityToggleModal).modal({dismissible:!1,yes:function(){return null}}).modal("open")},toggleCapability:function(){this.isAddingCapability?this.addCapability(this.capabilityToAddOrRemove):this.removeCapability(this.capabilityToAddOrRemove)},isIncludedInRole:function(e){return-1!==(e.includedInRoles||[]).indexOf(this.userRole)},getCapabilitiesList:function(){var e=this,t=[];return this.availableCapabilities.forEach((function(n){e.isIncludedInRole(n)||e.capabilitiesSet[n.id]&&t.push(n.id)})),t},addCapability:function(e){var t=this;this.isBusy=!0,i["AjaxHelper"].post({method:"UsersManager.addCapabilities"},{userLogin:this.userLogin,capabilities:e.id,idSites:this.idsite}).then((function(){t.$emit("change",t.getCapabilitiesList())})).finally((function(){t.isBusy=!1,t.capabilityToAddOrRemove=null,t.capabilityToAddId=null,t.capabilityToRemoveId=null}))},removeCapability:function(e){var t=this;this.isBusy=!0,i["AjaxHelper"].post({method:"UsersManager.removeCapabilities"},{userLogin:this.userLogin,capabilities:e.id,idSites:this.idsite}).then((function(){t.$emit("change",t.getCapabilitiesList())})).finally((function(){t.isBusy=!1,t.capabilityToAddOrRemove=null,t.capabilityToAddId=null,t.capabilityToRemoveId=null}))}},computed:{availableCapabilities:function(){return N.capabilities.value},confirmAddCapabilityToggleContent:function(){return Object(i["translate"])("UsersManager_AreYouSureAddCapability","<strong>".concat(this.userLogin,"</strong>"),"<strong>".concat(this.capabilityToAddOrRemove?this.capabilityToAddOrRemove.name:"","</strong>"),"<strong>".concat(this.siteNameText,"</strong>"))},confirmCapabilityToggleContent:function(){return Object(i["translate"])("UsersManager_AreYouSureRemoveCapability","<strong>".concat(this.capabilityToAddOrRemove?this.capabilityToAddOrRemove.name:"","</strong>"),"<strong>".concat(this.userLogin,"</strong>"),"<strong>".concat(this.siteNameText,"</strong>"))},siteNameText:function(){return i["Matomo"].helper.htmlEntities(this.siteName)},availableCapabilitiesGrouped:function(){var e=this,t=this.availableCapabilities.filter((function(t){return!e.capabilitiesSet[t.id]})).map((function(e){return{group:e.category,key:e.id,value:e.name,tooltip:e.description}}));return t.sort((function(e,t){return e.group===t.group?e.value===t.value?0:e.value<t.value?-1:1:e.group<t.group?-1:1})),t},capabilitiesSet:function(){var e=this,t={},n=this.theCapabilities;return(n||[]).forEach((function(e){t[e]=!0})),(this.availableCapabilities||[]).forEach((function(n){e.isIncludedInRole(n)&&(t[n.id]=!0)})),t},actualCapabilities:function(){var e=this.capabilitiesSet;return this.availableCapabilities.filter((function(t){return!!e[t.id]}))}}});y.render=g;var E=y,V=(Object(i["createAngularJsAdapter"])({component:E,scope:{idsite:{angularJsBind:"<"},siteName:{angularJsBind:"<"},userLogin:{angularJsBind:"<"},userRole:{angularJsBind:"<"},capabilities:{angularJsBind:"<"},onCapabilitiesChange:{angularJsBind:"&",vue:"change"}},directiveName:"piwikCapabilitiesEdit",restrict:"E",$inject:["$timeout"],events:{change:function(e,t,n,s,r,i,a){a((function(){n.onCapabilitiesChange&&n.onCapabilitiesChange.call({capabilities:e})}))}}}),{key:0,class:"row"}),k={class:"row to-all-websites"},A={class:"col s12"},w={style:{"margin-right":"3.5px"}},T={id:"all-sites-access-select",style:{"margin-right":"3.5px"}},B={style:{"margin-top":"18px"}},_={class:"filters row"},D={class:"col s12 m12 l8"},L={class:"input-field bulk-actions",style:{"margin-right":"3.5px"}},R={id:"user-permissions-edit-bulk-actions",class:"dropdown-content"},x={class:"dropdown-trigger","data-target":"user-permissions-bulk-set-access"},P={id:"user-permissions-bulk-set-access",class:"dropdown-content"},F=["onClick"],H={class:"input-field site-filter",style:{"margin-right":"3.5px"}},I=["value","placeholder"],J={class:"input-field access-filter",style:{"margin-right":"3.5px"}},q={key:0,class:"col s12 m12 l4 sites-for-permission-pagination-container"},$={class:"sites-for-permission-pagination"},G={class:"counter"},z=["textContent"],W={class:"roles-help-notification"},Y=["innerHTML"],X={class:"capabilities-help-notification"},K={id:"sitesForPermission"},Q={class:"select-cell"},Z={class:"checkbox-container"},ee=["checked"],te=Object(a["createElementVNode"])("span",null,null,-1),ne={class:"role_header"},se=["innerHTML"],re=Object(a["createElementVNode"])("span",{class:"icon-help"},null,-1),ie=[re],ae={class:"capabilities_header"},oe=["innerHTML"],le=Object(a["createElementVNode"])("span",{class:"icon-help"},null,-1),ce=[le],de={key:0,class:"select-all-row"},ue={colspan:"4"},me={key:0},be=["innerHTML"],pe=["innerHTML"],ge={key:1},fe=["innerHTML"],he=["innerHTML"],je={class:"select-cell"},Oe={class:"checkbox-container"},ve=["id","onUpdate:modelValue"],Ce=Object(a["createElementVNode"])("span",null,null,-1),Ne={class:"role-select"},Se={class:"delete-access-confirm-modal modal",ref:"deleteAccessConfirmModal"},Ue={class:"modal-content"},ye=["innerHTML"],Ee=["innerHTML"],Ve={class:"modal-footer"},ke={class:"change-access-confirm-modal modal",ref:"changeAccessConfirmModal"},Ae={class:"modal-content"},we=["innerHTML"],Te=["innerHTML"],Me={class:"modal-footer"},Be={class:"confirm-give-access-all-sites modal",ref:"confirmGiveAccessAllSitesModal"},_e={class:"modal-content"},De=["innerHTML"],Le={class:"modal-footer"}; /*! * Matomo - free/libre analytics platform * * @link https://matomo.org * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later - */function Re(e,t,n,s,r,i){var o=Object(a["resolveComponent"])("Notification"),l=Object(a["resolveComponent"])("Field"),c=Object(a["resolveComponent"])("CapabilitiesEdit"),d=Object(a["resolveDirective"])("dropdown-menu"),u=Object(a["resolveDirective"])("content-table");return Object(a["openBlock"])(),Object(a["createElementBlock"])("div",{class:Object(a["normalizeClass"])(["userPermissionsEdit",{loading:e.isLoadingAccess}])},[e.hasAccessToAtLeastOneSite?Object(a["createCommentVNode"])("",!0):(Object(a["openBlock"])(),Object(a["createElementBlock"])("div",V,[Object(a["createElementVNode"])("div",null,[Object(a["createVNode"])(o,{context:"warning",type:"transient",noclear:!0},{default:Object(a["withCtx"])((function(){return[Object(a["createElementVNode"])("strong",null,Object(a["toDisplayString"])(e.translate("General_Warning"))+":",1),Object(a["createTextVNode"])(" "+Object(a["toDisplayString"])(e.translate("UsersManager_NoAccessWarning")),1)]})),_:1})])])),Object(a["createElementVNode"])("div",k,[Object(a["createElementVNode"])("div",A,[Object(a["createElementVNode"])("div",null,[Object(a["createElementVNode"])("span",w,Object(a["toDisplayString"])(e.translate("UsersManager_GiveAccessToAll"))+":",1),Object(a["createElementVNode"])("div",T,[Object(a["createVNode"])(l,{modelValue:e.allWebsitesAccssLevelSet,"onUpdate:modelValue":t[0]||(t[0]=function(t){return e.allWebsitesAccssLevelSet=t}),uicontrol:"select",options:e.filteredAccessLevels,"full-width":!0},null,8,["modelValue","options"])]),Object(a["createElementVNode"])("a",{href:"",class:Object(a["normalizeClass"])(["btn",{disabled:e.isGivingAccessToAllSites}]),onClick:t[1]||(t[1]=Object(a["withModifiers"])((function(t){return e.showChangeAccessAllSitesModal()}),["prevent"]))},Object(a["toDisplayString"])(e.translate("General_Apply")),3)]),Object(a["createElementVNode"])("p",B,Object(a["toDisplayString"])(e.translate("UsersManager_OrManageIndividually"))+":",1)])]),Object(a["createElementVNode"])("div",_,[Object(a["createElementVNode"])("div",D,[Object(a["createElementVNode"])("div",L,[Object(a["withDirectives"])(Object(a["createElementVNode"])("a",{class:Object(a["normalizeClass"])(["dropdown-trigger btn",{disabled:e.isBulkActionsDisabled}]),href:"","data-target":"user-permissions-edit-bulk-actions"},[Object(a["createTextVNode"])(Object(a["toDisplayString"])(e.translate("UsersManager_BulkActions")),1)],2),[[d,{activates:"#user-permissions-edit-bulk-actions"}]]),Object(a["createElementVNode"])("ul",R,[Object(a["createElementVNode"])("li",null,[Object(a["withDirectives"])(Object(a["createElementVNode"])("a",x,[Object(a["createTextVNode"])(Object(a["toDisplayString"])(e.translate("UsersManager_SetPermission")),1)],512),[[d,{activates:"#user-permissions-bulk-set-access"}]]),Object(a["createElementVNode"])("ul",P,[(Object(a["openBlock"])(!0),Object(a["createElementBlock"])(a["Fragment"],null,Object(a["renderList"])(e.filteredAccessLevels,(function(t){return Object(a["openBlock"])(),Object(a["createElementBlock"])("li",{key:t.key},[Object(a["createElementVNode"])("a",{href:"",onClick:Object(a["withModifiers"])((function(n){e.siteAccessToChange=null,e.roleToChangeTo=t.key,e.showChangeAccessConfirm()}),["prevent"])},Object(a["toDisplayString"])(t.value),9,H)])})),128))])]),Object(a["createElementVNode"])("li",null,[Object(a["createElementVNode"])("a",{href:"",onClick:t[2]||(t[2]=Object(a["withModifiers"])((function(t){e.siteAccessToChange=null,e.roleToChangeTo="noaccess",e.showRemoveAccessConfirm()}),["prevent"]))},Object(a["toDisplayString"])(e.translate("UsersManager_RemovePermissions")),1)])])]),Object(a["createElementVNode"])("div",F,[Object(a["createElementVNode"])("input",{type:"text",value:e.siteNameFilter,onKeydown:t[3]||(t[3]=function(t){e.onChangeSiteFilter(t)}),onChange:t[4]||(t[4]=function(t){e.onChangeSiteFilter(t)}),placeholder:e.translate("UsersManager_FilterByWebsite")},null,40,I)]),Object(a["createElementVNode"])("div",J,[Object(a["createElementVNode"])("div",null,[Object(a["createVNode"])(l,{modelValue:e.accessLevelFilter,"onUpdate:modelValue":t[5]||(t[5]=function(t){return e.accessLevelFilter=t}),uicontrol:"select",options:e.filteredSelectAccessLevels,"full-width":!0,placeholder:e.translate("UsersManager_FilterByAccess")},null,8,["modelValue","options","placeholder"])])])]),e.totalEntries>e.limit?(Object(a["openBlock"])(),Object(a["createElementBlock"])("div",q,[Object(a["createElementVNode"])("div",$,[Object(a["createElementVNode"])("a",{class:Object(a["normalizeClass"])(["prev",{disabled:e.offset<=0}])},[Object(a["createElementVNode"])("span",{class:"pointer",onClick:t[6]||(t[6]=function(t){return e.gotoPreviousPage()})},"« "+Object(a["toDisplayString"])(e.translate("General_Previous")),1)],2),Object(a["createElementVNode"])("span",G,[Object(a["createElementVNode"])("span",{textContent:Object(a["toDisplayString"])(e.paginationText)},null,8,z)]),Object(a["createElementVNode"])("a",{class:Object(a["normalizeClass"])(["next",{disabled:e.offset+e.limit>=e.totalEntries}])},[Object(a["createElementVNode"])("span",{class:"pointer",onClick:t[7]||(t[7]=function(t){return e.gotoNextPage()})},Object(a["toDisplayString"])(e.translate("General_Next"))+" »",1)],2)])])):Object(a["createCommentVNode"])("",!0)]),Object(a["createElementVNode"])("div",W,[e.isRoleHelpToggled?(Object(a["openBlock"])(),Object(a["createBlock"])(o,{key:0,context:"info",type:"persistent",noclear:!0},{default:Object(a["withCtx"])((function(){return[Object(a["createElementVNode"])("span",{innerHTML:e.$sanitize(e.rolesHelpText)},null,8,Y)]})),_:1})):Object(a["createCommentVNode"])("",!0)]),Object(a["createElementVNode"])("div",X,[e.isCapabilitiesHelpToggled?(Object(a["openBlock"])(),Object(a["createBlock"])(o,{key:0,context:"info",type:"persistent",noclear:!0},{default:Object(a["withCtx"])((function(){return[Object(a["createElementVNode"])("span",null,Object(a["toDisplayString"])(e.translate("UsersManager_CapabilitiesHelp")),1)]})),_:1})):Object(a["createCommentVNode"])("",!0)]),Object(a["withDirectives"])(Object(a["createElementVNode"])("table",K,[Object(a["createElementVNode"])("thead",null,[Object(a["createElementVNode"])("tr",null,[Object(a["createElementVNode"])("th",Q,[Object(a["createElementVNode"])("span",Z,[Object(a["createElementVNode"])("label",null,[Object(a["createElementVNode"])("input",{type:"checkbox",id:"perm_edit_select_all",checked:e.isAllCheckboxSelected,onChange:t[8]||(t[8]=function(t){return e.onAllCheckboxChange(t)})},null,40,ee),te])])]),Object(a["createElementVNode"])("th",null,Object(a["toDisplayString"])(e.translate("General_Name")),1),Object(a["createElementVNode"])("th",ne,[Object(a["createElementVNode"])("span",{innerHTML:e.$sanitize("".concat(e.translate("UsersManager_Role")," "))},null,8,se),Object(a["createElementVNode"])("a",{href:"",class:Object(a["normalizeClass"])(["helpIcon",{sticky:e.isRoleHelpToggled}]),onClick:t[9]||(t[9]=Object(a["withModifiers"])((function(t){return e.isRoleHelpToggled=!e.isRoleHelpToggled}),["prevent"]))},ie,2)]),Object(a["createElementVNode"])("th",ae,[Object(a["createElementVNode"])("span",{innerHTML:e.$sanitize("".concat(e.translate("UsersManager_Capabilities")," "))},null,8,oe),Object(a["createElementVNode"])("a",{href:"",class:Object(a["normalizeClass"])(["helpIcon",{sticky:e.isCapabilitiesHelpToggled}]),onClick:t[10]||(t[10]=Object(a["withModifiers"])((function(t){return e.isCapabilitiesHelpToggled=!e.isCapabilitiesHelpToggled}),["prevent"]))},ce,2)])])]),Object(a["createElementVNode"])("tbody",null,[e.isAllCheckboxSelected&&e.siteAccess.length<e.totalEntries?(Object(a["openBlock"])(),Object(a["createElementBlock"])("tr",de,[Object(a["createElementVNode"])("td",ue,[e.areAllResultsSelected?Object(a["createCommentVNode"])("",!0):(Object(a["openBlock"])(),Object(a["createElementBlock"])("div",me,[Object(a["createElementVNode"])("span",{innerHTML:e.$sanitize(e.theDisplayedWebsitesAreSelectedText),style:{"margin-right":"3.5px"}},null,8,be),Object(a["createElementVNode"])("a",{href:"#",onClick:t[11]||(t[11]=Object(a["withModifiers"])((function(t){return e.areAllResultsSelected=!e.areAllResultsSelected}),["prevent"])),innerHTML:e.$sanitize(e.clickToSelectAllText)},null,8,pe)])),e.areAllResultsSelected?(Object(a["openBlock"])(),Object(a["createElementBlock"])("div",ge,[Object(a["createElementVNode"])("span",{innerHTML:e.$sanitize(e.allWebsitesAreSelectedText),style:{"margin-right":"3.5px"}},null,8,he),Object(a["createElementVNode"])("a",{href:"#",onClick:t[12]||(t[12]=Object(a["withModifiers"])((function(t){return e.areAllResultsSelected=!e.areAllResultsSelected}),["prevent"])),innerHTML:e.$sanitize(e.clickToSelectDisplayedWebsitesText)},null,8,fe)])):Object(a["createCommentVNode"])("",!0)])])):Object(a["createCommentVNode"])("",!0),(Object(a["openBlock"])(!0),Object(a["createElementBlock"])(a["Fragment"],null,Object(a["renderList"])(e.siteAccess,(function(n,s){return Object(a["openBlock"])(),Object(a["createElementBlock"])("tr",{key:n.idsite},[Object(a["createElementVNode"])("td",je,[Object(a["createElementVNode"])("span",Oe,[Object(a["createElementVNode"])("label",null,[Object(a["withDirectives"])(Object(a["createElementVNode"])("input",{type:"checkbox",id:"perm_edit_select_row".concat(s),"onUpdate:modelValue":function(t){return e.selectedRows[s]=t},onClick:t[13]||(t[13]=function(t){return e.onRowSelected()})},null,8,ve),[[a["vModelCheckbox"],e.selectedRows[s]]]),Ce])])]),Object(a["createElementVNode"])("td",null,[Object(a["createElementVNode"])("span",null,Object(a["toDisplayString"])(n.site_name),1)]),Object(a["createElementVNode"])("td",null,[Object(a["createElementVNode"])("div",Ne,[Object(a["createVNode"])(l,{"model-value":n.role,"onUpdate:modelValue":function(t){e.onRoleChange(n,t)},uicontrol:"select",options:e.filteredAccessLevels,"full-width":!0},null,8,["model-value","onUpdate:modelValue","options"])])]),Object(a["createElementVNode"])("td",null,[Object(a["createElementVNode"])("div",null,[Object(a["createVNode"])(c,{idsite:n.idsite,"site-name":n.site_name,"user-login":e.userLogin,"user-role":n.role,capabilities:n.capabilities,onChange:t[14]||(t[14]=function(t){return e.fetchAccess()})},null,8,["idsite","site-name","user-login","user-role","capabilities"])])])])})),128))])],512),[[u]]),Object(a["createElementVNode"])("div",Se,[Object(a["createElementVNode"])("div",Ue,[e.siteAccessToChange?(Object(a["openBlock"])(),Object(a["createElementBlock"])("h3",{key:0,innerHTML:e.$sanitize(e.deletePermConfirmSingleText)},null,8,ye)):Object(a["createCommentVNode"])("",!0),e.siteAccessToChange?Object(a["createCommentVNode"])("",!0):(Object(a["openBlock"])(),Object(a["createElementBlock"])("p",{key:1,innerHTML:e.$sanitize(e.deletePermConfirmMultipleText)},null,8,Ee))]),Object(a["createElementVNode"])("div",Ve,[Object(a["createElementVNode"])("a",{href:"",class:"modal-action modal-close btn",onClick:t[15]||(t[15]=Object(a["withModifiers"])((function(t){return e.changeUserRole()}),["prevent"])),style:{"margin-right":"3.5px"}},Object(a["toDisplayString"])(e.translate("General_Yes")),1),Object(a["createElementVNode"])("a",{href:"",class:"modal-action modal-close modal-no",onClick:t[16]||(t[16]=Object(a["withModifiers"])((function(t){e.siteAccessToChange=null,e.roleToChangeTo=null}),["prevent"]))},Object(a["toDisplayString"])(e.translate("General_No")),1)])],512),Object(a["createElementVNode"])("div",ke,[Object(a["createElementVNode"])("div",Ae,[e.siteAccessToChange?(Object(a["openBlock"])(),Object(a["createElementBlock"])("h3",{key:0,innerHTML:e.$sanitize(e.changePermToSiteConfirmSingleText)},null,8,we)):Object(a["createCommentVNode"])("",!0),e.siteAccessToChange?Object(a["createCommentVNode"])("",!0):(Object(a["openBlock"])(),Object(a["createElementBlock"])("p",{key:1,innerHTML:e.$sanitize(e.changePermToSiteConfirmMultipleText)},null,8,Te))]),Object(a["createElementVNode"])("div",Me,[Object(a["createElementVNode"])("a",{href:"",class:"modal-action modal-close btn",onClick:t[17]||(t[17]=Object(a["withModifiers"])((function(t){return e.changeUserRole()}),["prevent"])),style:{"margin-right":"3.5px"}},Object(a["toDisplayString"])(e.translate("General_Yes")),1),Object(a["createElementVNode"])("a",{href:"",class:"modal-action modal-close modal-no",onClick:t[18]||(t[18]=Object(a["withModifiers"])((function(t){e.siteAccessToChange.role=e.previousRole,e.siteAccessToChange=null,e.roleToChangeTo=null}),["prevent"]))},Object(a["toDisplayString"])(e.translate("General_No")),1)])],512),Object(a["createElementVNode"])("div",Be,[Object(a["createElementVNode"])("div",_e,[Object(a["createElementVNode"])("h3",{innerHTML:e.$sanitize(e.changePermToAllSitesConfirmText)},null,8,De),Object(a["createElementVNode"])("p",null,Object(a["toDisplayString"])(e.translate("UsersManager_ChangePermToAllSitesConfirm2")),1)]),Object(a["createElementVNode"])("div",Le,[Object(a["createElementVNode"])("a",{href:"",class:"modal-action modal-close btn",onClick:t[19]||(t[19]=Object(a["withModifiers"])((function(t){return e.giveAccessToAllSites()}),["prevent"])),style:{"margin-right":"3.5px"}},Object(a["toDisplayString"])(e.translate("General_Yes")),1),Object(a["createElementVNode"])("a",{href:"",class:"modal-action modal-close modal-no",onClick:t[20]||(t[20]=function(e){return e.preventDefault()})},Object(a["toDisplayString"])(e.translate("General_No")),1)])],512)],2)}var xe=window,Pe=xe.$,He=Object(a["defineComponent"])({props:{userLogin:{type:String,required:!0},limit:{type:Number,default:10},accessLevels:{type:Array,required:!0},filterAccessLevels:{type:Array,required:!0}},components:{Notification:i["Notification"],Field:h["Field"],CapabilitiesEdit:E},directives:{DropdownMenu:i["DropdownMenu"],ContentTable:i["ContentTable"]},data:function(){return{siteAccess:[],offset:0,totalEntries:null,accessLevelFilter:"",siteNameFilter:"",isLoadingAccess:!1,allWebsitesAccssLevelSet:"view",isAllCheckboxSelected:!1,selectedRows:{},isBulkActionsDisabled:!0,areAllResultsSelected:!1,previousRole:null,hasAccessToAtLeastOneSite:!0,isRoleHelpToggled:!1,isCapabilitiesHelpToggled:!1,isGivingAccessToAllSites:!1,roleToChangeTo:null,siteAccessToChange:null}},emits:["userHasAccessDetected","accessChanged"],created:function(){var e=this;this.onChangeSiteFilter=Object(i["debounce"])(this.onChangeSiteFilter,300),Object(a["watch"])((function(){return e.allPropsWatch}),(function(){e.limit&&e.fetchAccess()})),this.fetchAccess()},watch:{accessLevelFilter:function(){this.offset=0,this.fetchAccess()}},methods:{onAllCheckboxChange:function(e){var t=this;this.isAllCheckboxSelected=e.target.checked,this.isAllCheckboxSelected?(this.siteAccess.forEach((function(e,n){t.selectedRows[n]=!0})),this.isBulkActionsDisabled=!1):this.clearSelection()},clearSelection:function(){this.selectedRows={},this.areAllResultsSelected=!1,this.isBulkActionsDisabled=!0,this.isAllCheckboxSelected=!1,this.siteAccessToChange=null},onRowSelected:function(){var e=this;setTimeout((function(){var t=e.selectedRowsCount;e.isBulkActionsDisabled=0===t,e.isAllCheckboxSelected=t===e.siteAccess.length}))},fetchAccess:function(){var e=this;return this.isLoadingAccess=!0,i["AjaxHelper"].fetch({method:"UsersManager.getSitesAccessForUser",limit:this.limit,offset:this.offset,filter_search:this.siteNameFilter,filter_access:this.accessLevelFilter,userLogin:this.userLogin},{returnResponseObject:!0}).then((function(t){var n=t.getRequestHandle();e.isLoadingAccess=!1,e.siteAccess=n.responseJSON,e.totalEntries=parseInt(n.getResponseHeader("x-matomo-total-results"),10)||0,e.hasAccessToAtLeastOneSite=!!n.getResponseHeader("x-matomo-has-some"),e.$emit("userHasAccessDetected",{hasAccess:e.hasAccessToAtLeastOneSite}),e.clearSelection()})).catch((function(){e.isLoadingAccess=!1,e.clearSelection()}))},gotoPreviousPage:function(){this.offset=Math.max(0,this.offset-this.limit),this.fetchAccess()},gotoNextPage:function(){var e=this.offset+this.limit;e>=(this.totalEntries||0)||(this.offset=e,this.fetchAccess())},showRemoveAccessConfirm:function(){Pe(this.$refs.deleteAccessConfirmModal).modal({dismissible:!1}).modal("open")},changeUserRole:function(){var e=this,t=function(){var t=[];return Object.keys(e.selectedRows).forEach((function(n){e.selectedRows[n]&&e.siteAccess[n]&&t.push(e.siteAccess[n].idsite)})),t},n=function(){return i["AjaxHelper"].fetch({method:"UsersManager.getSitesAccessForUser",filter_search:e.siteNameFilter,filter_access:e.accessLevelFilter,userLogin:e.userLogin,filter_limit:"-1"}).then((function(e){return e.map((function(e){return e.idsite}))}))};return this.isLoadingAccess=!0,Promise.resolve().then((function(){return e.siteAccessToChange?[e.siteAccessToChange.idsite]:e.areAllResultsSelected?n():t()})).then((function(t){return i["AjaxHelper"].post({method:"UsersManager.setUserAccess"},{userLogin:e.userLogin,access:e.roleToChangeTo,idSites:t})})).catch((function(){})).then((function(){return e.$emit("accessChanged"),e.fetchAccess()}))},showChangeAccessConfirm:function(){Pe(this.$refs.changeAccessConfirmModal).modal({dismissible:!1}).modal("open")},getRoleDisplay:function(e){var t=null;return this.filteredAccessLevels.forEach((function(n){n.key===e&&(t=n.value)})),t},giveAccessToAllSites:function(){var e=this;this.isGivingAccessToAllSites=!0,i["AjaxHelper"].fetch({method:"SitesManager.getSitesWithAdminAccess",filter_limit:-1}).then((function(t){var n=t.map((function(e){return e.idsite}));return i["AjaxHelper"].post({method:"UsersManager.setUserAccess"},{userLogin:e.userLogin,access:e.allWebsitesAccssLevelSet,idSites:n})})).then((function(){return e.fetchAccess()})).finally((function(){e.isGivingAccessToAllSites=!1}))},showChangeAccessAllSitesModal:function(){Pe(this.$refs.confirmGiveAccessAllSitesModal).modal({dismissible:!1}).modal("open")},onChangeSiteFilter:function(e){var t=this;setTimeout((function(){var n=e.target.value;t.siteNameFilter!==n&&(t.siteNameFilter=n,t.offset=0,t.fetchAccess())}))},onRoleChange:function(e,t){this.previousRole=e.role,this.roleToChangeTo=t,this.siteAccessToChange=e,this.showChangeAccessConfirm()}},computed:{rolesHelpText:function(){return Object(i["translate"])("UsersManager_RolesHelp",'<a href="https://matomo.org/faq/general/faq_70/" target="_blank" rel="noreferrer noopener">',"</a>",'<a href="https://matomo.org/faq/general/faq_69/" target="_blank" rel="noreferrer noopener">',"</a>")},theDisplayedWebsitesAreSelectedText:function(){var e=Object(i["translate"])("UsersManager_TheDisplayedWebsitesAreSelected","<strong>".concat(this.siteAccess.length,"</strong>"));return"".concat(e," ")},clickToSelectAllText:function(){return Object(i["translate"])("UsersManager_ClickToSelectAll","<strong>".concat(this.totalEntries,"</strong>"))},allWebsitesAreSelectedText:function(){return Object(i["translate"])("UsersManager_AllWebsitesAreSelected","<strong>".concat(this.totalEntries,"</strong>"))},clickToSelectDisplayedWebsitesText:function(){return Object(i["translate"])("UsersManager_ClickToSelectDisplayedWebsites","<strong>".concat(this.siteAccess.length,"</strong>"))},deletePermConfirmSingleText:function(){return Object(i["translate"])("UsersManager_DeletePermConfirmSingle","<strong>".concat(this.userLogin,"</strong>"),"<strong>".concat(this.siteAccessToChangeName,"</strong>"))},deletePermConfirmMultipleText:function(){return Object(i["translate"])("UsersManager_DeletePermConfirmMultiple","<strong>".concat(this.userLogin,"</strong>"),"<strong>".concat(this.affectedSitesCount,"</strong>"))},changePermToSiteConfirmSingleText:function(){return Object(i["translate"])("UsersManager_ChangePermToSiteConfirmSingle","<strong>".concat(this.userLogin,"</strong>"),"<strong>".concat(this.siteAccessToChangeName,"</strong>"),"<strong>".concat(this.getRoleDisplay(this.roleToChangeTo),"</strong>"))},changePermToSiteConfirmMultipleText:function(){return Object(i["translate"])("UsersManager_ChangePermToSiteConfirmMultiple","<strong>".concat(this.userLogin,"</strong>"),"<strong>".concat(this.affectedSitesCount,"</strong>"),"<strong>".concat(this.getRoleDisplay(this.roleToChangeTo),"</strong>"))},changePermToAllSitesConfirmText:function(){return Object(i["translate"])("UsersManager_ChangePermToAllSitesConfirm","<strong>".concat(this.userLogin,"</strong>"),"<strong>".concat(this.getRoleDisplay(this.allWebsitesAccssLevelSet),"</strong>"))},paginationLowerBound:function(){return this.offset+1},paginationUpperBound:function(){return this.totalEntries?Math.min(this.offset+this.limit,this.totalEntries):"?"},filteredAccessLevels:function(){return this.accessLevels.filter((function(e){return"superuser"!==e.key}))},filteredSelectAccessLevels:function(){return this.filterAccessLevels.filter((function(e){return"superuser"!==e.key}))},selectedRowsCount:function(){var e=0;return Object.values(this.selectedRows).forEach((function(t){t&&(e+=1)})),e},affectedSitesCount:function(){return this.areAllResultsSelected?this.totalEntries:this.selectedRowsCount},allPropsWatch:function(){return this.userLogin,this.limit,this.accessLevels,this.filterAccessLevels,Date.now()},siteAccessToChangeName:function(){return this.siteAccessToChange?i["Matomo"].helper.htmlEntities(this.siteAccessToChange.site_name):""},paginationText:function(){var e=Object(i["translate"])("General_Pagination","".concat(this.paginationLowerBound),"".concat(this.paginationUpperBound),"".concat(this.totalEntries));return" ".concat(e," ")}}});He.render=Re;var Fe=He,Ie=(Object(i["createAngularJsAdapter"])({component:Fe,scope:{userLogin:{angularJsBind:"<"},limit:{angularJsBind:"<"},onUserHasAccessDetected:{angularJsBind:"&",vue:"userHasAccessDetected"},onAccessChange:{angularJsBind:"&",vue:"accessChanged"},accessLevels:{angularJsBind:"<"},filterAccessLevels:{angularJsBind:"<"}},directiveName:"piwikUserPermissionsEdit",restrict:"E"}),{class:"row"}),Je={key:0,class:"col m2 entityList"},qe={class:"listCircle"},$e={key:0,class:"icon-warning"},Ge=Object(a["createElementVNode"])("div",{class:"save-button-spacer hide-on-small-only"},null,-1),ze={href:"",class:"entityCancelLink"},We={class:"visibleTab col m10"},Ye={key:0,class:"basic-info-tab"},Xe={class:"form-group row",style:{position:"relative"}},Ke={class:"col s12 m6"},Qe={class:"col s12 m6"},Ze={key:0,class:"form-help"},et=["innerHTML"],tt={key:0,class:"entityCancel"},nt={key:1,class:"user-permissions"},st={key:0},rt={key:1,class:"alert alert-info"},it={key:2,class:"superuser-access"},at={class:"superuser-confirm-modal modal",ref:"superUserConfirmModal"},ot={class:"modal-content"},lt={key:0},ct={key:1},dt={class:"modal-footer"},ut={key:3,class:"twofa-reset"},mt={class:"resetTwoFa"},bt={class:"twofa-confirm-modal modal",ref:"twofaConfirmModal"},pt={class:"modal-content"},gt={class:"modal-footer"},ht={class:"change-password-modal modal",ref:"changePasswordModal"},ft={class:"modal-content"},jt=["innerHTML"],Ot={class:"modal-footer"}; + */function Re(e,t,n,s,r,i){var o=Object(a["resolveComponent"])("Notification"),l=Object(a["resolveComponent"])("Field"),c=Object(a["resolveComponent"])("CapabilitiesEdit"),d=Object(a["resolveDirective"])("dropdown-menu"),u=Object(a["resolveDirective"])("content-table");return Object(a["openBlock"])(),Object(a["createElementBlock"])("div",{class:Object(a["normalizeClass"])(["userPermissionsEdit",{loading:e.isLoadingAccess}])},[e.hasAccessToAtLeastOneSite?Object(a["createCommentVNode"])("",!0):(Object(a["openBlock"])(),Object(a["createElementBlock"])("div",V,[Object(a["createElementVNode"])("div",null,[Object(a["createVNode"])(o,{context:"warning",type:"transient",noclear:!0},{default:Object(a["withCtx"])((function(){return[Object(a["createElementVNode"])("strong",null,Object(a["toDisplayString"])(e.translate("General_Warning"))+":",1),Object(a["createTextVNode"])(" "+Object(a["toDisplayString"])(e.translate("UsersManager_NoAccessWarning")),1)]})),_:1})])])),Object(a["createElementVNode"])("div",k,[Object(a["createElementVNode"])("div",A,[Object(a["createElementVNode"])("div",null,[Object(a["createElementVNode"])("span",w,Object(a["toDisplayString"])(e.translate("UsersManager_GiveAccessToAll"))+":",1),Object(a["createElementVNode"])("div",T,[Object(a["createVNode"])(l,{modelValue:e.allWebsitesAccssLevelSet,"onUpdate:modelValue":t[0]||(t[0]=function(t){return e.allWebsitesAccssLevelSet=t}),uicontrol:"select",options:e.filteredAccessLevels,"full-width":!0},null,8,["modelValue","options"])]),Object(a["createElementVNode"])("a",{href:"",class:Object(a["normalizeClass"])(["btn",{disabled:e.isGivingAccessToAllSites}]),onClick:t[1]||(t[1]=Object(a["withModifiers"])((function(t){return e.showChangeAccessAllSitesModal()}),["prevent"]))},Object(a["toDisplayString"])(e.translate("General_Apply")),3)]),Object(a["createElementVNode"])("p",B,Object(a["toDisplayString"])(e.translate("UsersManager_OrManageIndividually"))+":",1)])]),Object(a["createElementVNode"])("div",_,[Object(a["createElementVNode"])("div",D,[Object(a["createElementVNode"])("div",L,[Object(a["withDirectives"])(Object(a["createElementVNode"])("a",{class:Object(a["normalizeClass"])(["dropdown-trigger btn",{disabled:e.isBulkActionsDisabled}]),href:"","data-target":"user-permissions-edit-bulk-actions"},[Object(a["createTextVNode"])(Object(a["toDisplayString"])(e.translate("UsersManager_BulkActions")),1)],2),[[d,{activates:"#user-permissions-edit-bulk-actions"}]]),Object(a["createElementVNode"])("ul",R,[Object(a["createElementVNode"])("li",null,[Object(a["withDirectives"])(Object(a["createElementVNode"])("a",x,[Object(a["createTextVNode"])(Object(a["toDisplayString"])(e.translate("UsersManager_SetPermission")),1)],512),[[d,{activates:"#user-permissions-bulk-set-access"}]]),Object(a["createElementVNode"])("ul",P,[(Object(a["openBlock"])(!0),Object(a["createElementBlock"])(a["Fragment"],null,Object(a["renderList"])(e.filteredAccessLevels,(function(t){return Object(a["openBlock"])(),Object(a["createElementBlock"])("li",{key:t.key},[Object(a["createElementVNode"])("a",{href:"",onClick:Object(a["withModifiers"])((function(n){e.siteAccessToChange=null,e.roleToChangeTo=t.key,e.showChangeAccessConfirm()}),["prevent"])},Object(a["toDisplayString"])(t.value),9,F)])})),128))])]),Object(a["createElementVNode"])("li",null,[Object(a["createElementVNode"])("a",{href:"",onClick:t[2]||(t[2]=Object(a["withModifiers"])((function(t){e.siteAccessToChange=null,e.roleToChangeTo="noaccess",e.showRemoveAccessConfirm()}),["prevent"]))},Object(a["toDisplayString"])(e.translate("UsersManager_RemovePermissions")),1)])])]),Object(a["createElementVNode"])("div",H,[Object(a["createElementVNode"])("input",{type:"text",value:e.siteNameFilter,onKeydown:t[3]||(t[3]=function(t){e.onChangeSiteFilter(t)}),onChange:t[4]||(t[4]=function(t){e.onChangeSiteFilter(t)}),placeholder:e.translate("UsersManager_FilterByWebsite")},null,40,I)]),Object(a["createElementVNode"])("div",J,[Object(a["createElementVNode"])("div",null,[Object(a["createVNode"])(l,{modelValue:e.accessLevelFilter,"onUpdate:modelValue":t[5]||(t[5]=function(t){return e.accessLevelFilter=t}),uicontrol:"select",options:e.filteredSelectAccessLevels,"full-width":!0,placeholder:e.translate("UsersManager_FilterByAccess")},null,8,["modelValue","options","placeholder"])])])]),e.totalEntries>e.limit?(Object(a["openBlock"])(),Object(a["createElementBlock"])("div",q,[Object(a["createElementVNode"])("div",$,[Object(a["createElementVNode"])("a",{class:Object(a["normalizeClass"])(["prev",{disabled:e.offset<=0}])},[Object(a["createElementVNode"])("span",{class:"pointer",onClick:t[6]||(t[6]=function(t){return e.gotoPreviousPage()})},"« "+Object(a["toDisplayString"])(e.translate("General_Previous")),1)],2),Object(a["createElementVNode"])("span",G,[Object(a["createElementVNode"])("span",{textContent:Object(a["toDisplayString"])(e.paginationText)},null,8,z)]),Object(a["createElementVNode"])("a",{class:Object(a["normalizeClass"])(["next",{disabled:e.offset+e.limit>=e.totalEntries}])},[Object(a["createElementVNode"])("span",{class:"pointer",onClick:t[7]||(t[7]=function(t){return e.gotoNextPage()})},Object(a["toDisplayString"])(e.translate("General_Next"))+" »",1)],2)])])):Object(a["createCommentVNode"])("",!0)]),Object(a["createElementVNode"])("div",W,[e.isRoleHelpToggled?(Object(a["openBlock"])(),Object(a["createBlock"])(o,{key:0,context:"info",type:"persistent",noclear:!0},{default:Object(a["withCtx"])((function(){return[Object(a["createElementVNode"])("span",{innerHTML:e.$sanitize(e.rolesHelpText)},null,8,Y)]})),_:1})):Object(a["createCommentVNode"])("",!0)]),Object(a["createElementVNode"])("div",X,[e.isCapabilitiesHelpToggled?(Object(a["openBlock"])(),Object(a["createBlock"])(o,{key:0,context:"info",type:"persistent",noclear:!0},{default:Object(a["withCtx"])((function(){return[Object(a["createElementVNode"])("span",null,Object(a["toDisplayString"])(e.translate("UsersManager_CapabilitiesHelp")),1)]})),_:1})):Object(a["createCommentVNode"])("",!0)]),Object(a["withDirectives"])(Object(a["createElementVNode"])("table",K,[Object(a["createElementVNode"])("thead",null,[Object(a["createElementVNode"])("tr",null,[Object(a["createElementVNode"])("th",Q,[Object(a["createElementVNode"])("span",Z,[Object(a["createElementVNode"])("label",null,[Object(a["createElementVNode"])("input",{type:"checkbox",id:"perm_edit_select_all",checked:e.isAllCheckboxSelected,onChange:t[8]||(t[8]=function(t){return e.onAllCheckboxChange(t)})},null,40,ee),te])])]),Object(a["createElementVNode"])("th",null,Object(a["toDisplayString"])(e.translate("General_Name")),1),Object(a["createElementVNode"])("th",ne,[Object(a["createElementVNode"])("span",{innerHTML:e.$sanitize("".concat(e.translate("UsersManager_Role")," "))},null,8,se),Object(a["createElementVNode"])("a",{href:"",class:Object(a["normalizeClass"])(["helpIcon",{sticky:e.isRoleHelpToggled}]),onClick:t[9]||(t[9]=Object(a["withModifiers"])((function(t){return e.isRoleHelpToggled=!e.isRoleHelpToggled}),["prevent"]))},ie,2)]),Object(a["createElementVNode"])("th",ae,[Object(a["createElementVNode"])("span",{innerHTML:e.$sanitize("".concat(e.translate("UsersManager_Capabilities")," "))},null,8,oe),Object(a["createElementVNode"])("a",{href:"",class:Object(a["normalizeClass"])(["helpIcon",{sticky:e.isCapabilitiesHelpToggled}]),onClick:t[10]||(t[10]=Object(a["withModifiers"])((function(t){return e.isCapabilitiesHelpToggled=!e.isCapabilitiesHelpToggled}),["prevent"]))},ce,2)])])]),Object(a["createElementVNode"])("tbody",null,[e.isAllCheckboxSelected&&e.siteAccess.length<e.totalEntries?(Object(a["openBlock"])(),Object(a["createElementBlock"])("tr",de,[Object(a["createElementVNode"])("td",ue,[e.areAllResultsSelected?Object(a["createCommentVNode"])("",!0):(Object(a["openBlock"])(),Object(a["createElementBlock"])("div",me,[Object(a["createElementVNode"])("span",{innerHTML:e.$sanitize(e.theDisplayedWebsitesAreSelectedText),style:{"margin-right":"3.5px"}},null,8,be),Object(a["createElementVNode"])("a",{href:"#",onClick:t[11]||(t[11]=Object(a["withModifiers"])((function(t){return e.areAllResultsSelected=!e.areAllResultsSelected}),["prevent"])),innerHTML:e.$sanitize(e.clickToSelectAllText)},null,8,pe)])),e.areAllResultsSelected?(Object(a["openBlock"])(),Object(a["createElementBlock"])("div",ge,[Object(a["createElementVNode"])("span",{innerHTML:e.$sanitize(e.allWebsitesAreSelectedText),style:{"margin-right":"3.5px"}},null,8,fe),Object(a["createElementVNode"])("a",{href:"#",onClick:t[12]||(t[12]=Object(a["withModifiers"])((function(t){return e.areAllResultsSelected=!e.areAllResultsSelected}),["prevent"])),innerHTML:e.$sanitize(e.clickToSelectDisplayedWebsitesText)},null,8,he)])):Object(a["createCommentVNode"])("",!0)])])):Object(a["createCommentVNode"])("",!0),(Object(a["openBlock"])(!0),Object(a["createElementBlock"])(a["Fragment"],null,Object(a["renderList"])(e.siteAccess,(function(n,s){return Object(a["openBlock"])(),Object(a["createElementBlock"])("tr",{key:n.idsite},[Object(a["createElementVNode"])("td",je,[Object(a["createElementVNode"])("span",Oe,[Object(a["createElementVNode"])("label",null,[Object(a["withDirectives"])(Object(a["createElementVNode"])("input",{type:"checkbox",id:"perm_edit_select_row".concat(s),"onUpdate:modelValue":function(t){return e.selectedRows[s]=t},onClick:t[13]||(t[13]=function(t){return e.onRowSelected()})},null,8,ve),[[a["vModelCheckbox"],e.selectedRows[s]]]),Ce])])]),Object(a["createElementVNode"])("td",null,[Object(a["createElementVNode"])("span",null,Object(a["toDisplayString"])(n.site_name),1)]),Object(a["createElementVNode"])("td",null,[Object(a["createElementVNode"])("div",Ne,[Object(a["createVNode"])(l,{"model-value":n.role,"onUpdate:modelValue":function(t){e.onRoleChange(n,t)},uicontrol:"select",options:e.filteredAccessLevels,"full-width":!0},null,8,["model-value","onUpdate:modelValue","options"])])]),Object(a["createElementVNode"])("td",null,[Object(a["createElementVNode"])("div",null,[Object(a["createVNode"])(c,{idsite:n.idsite,"site-name":n.site_name,"user-login":e.userLogin,"user-role":n.role,capabilities:n.capabilities,onChange:t[14]||(t[14]=function(t){return e.fetchAccess()})},null,8,["idsite","site-name","user-login","user-role","capabilities"])])])])})),128))])],512),[[u]]),Object(a["createElementVNode"])("div",Se,[Object(a["createElementVNode"])("div",Ue,[e.siteAccessToChange?(Object(a["openBlock"])(),Object(a["createElementBlock"])("h3",{key:0,innerHTML:e.$sanitize(e.deletePermConfirmSingleText)},null,8,ye)):Object(a["createCommentVNode"])("",!0),e.siteAccessToChange?Object(a["createCommentVNode"])("",!0):(Object(a["openBlock"])(),Object(a["createElementBlock"])("p",{key:1,innerHTML:e.$sanitize(e.deletePermConfirmMultipleText)},null,8,Ee))]),Object(a["createElementVNode"])("div",Ve,[Object(a["createElementVNode"])("a",{href:"",class:"modal-action modal-close btn",onClick:t[15]||(t[15]=Object(a["withModifiers"])((function(t){return e.changeUserRole()}),["prevent"])),style:{"margin-right":"3.5px"}},Object(a["toDisplayString"])(e.translate("General_Yes")),1),Object(a["createElementVNode"])("a",{href:"",class:"modal-action modal-close modal-no",onClick:t[16]||(t[16]=Object(a["withModifiers"])((function(t){e.siteAccessToChange=null,e.roleToChangeTo=null}),["prevent"]))},Object(a["toDisplayString"])(e.translate("General_No")),1)])],512),Object(a["createElementVNode"])("div",ke,[Object(a["createElementVNode"])("div",Ae,[e.siteAccessToChange?(Object(a["openBlock"])(),Object(a["createElementBlock"])("h3",{key:0,innerHTML:e.$sanitize(e.changePermToSiteConfirmSingleText)},null,8,we)):Object(a["createCommentVNode"])("",!0),e.siteAccessToChange?Object(a["createCommentVNode"])("",!0):(Object(a["openBlock"])(),Object(a["createElementBlock"])("p",{key:1,innerHTML:e.$sanitize(e.changePermToSiteConfirmMultipleText)},null,8,Te))]),Object(a["createElementVNode"])("div",Me,[Object(a["createElementVNode"])("a",{href:"",class:"modal-action modal-close btn",onClick:t[17]||(t[17]=Object(a["withModifiers"])((function(t){return e.changeUserRole()}),["prevent"])),style:{"margin-right":"3.5px"}},Object(a["toDisplayString"])(e.translate("General_Yes")),1),Object(a["createElementVNode"])("a",{href:"",class:"modal-action modal-close modal-no",onClick:t[18]||(t[18]=Object(a["withModifiers"])((function(t){e.siteAccessToChange.role=e.previousRole,e.siteAccessToChange=null,e.roleToChangeTo=null}),["prevent"]))},Object(a["toDisplayString"])(e.translate("General_No")),1)])],512),Object(a["createElementVNode"])("div",Be,[Object(a["createElementVNode"])("div",_e,[Object(a["createElementVNode"])("h3",{innerHTML:e.$sanitize(e.changePermToAllSitesConfirmText)},null,8,De),Object(a["createElementVNode"])("p",null,Object(a["toDisplayString"])(e.translate("UsersManager_ChangePermToAllSitesConfirm2")),1)]),Object(a["createElementVNode"])("div",Le,[Object(a["createElementVNode"])("a",{href:"",class:"modal-action modal-close btn",onClick:t[19]||(t[19]=Object(a["withModifiers"])((function(t){return e.giveAccessToAllSites()}),["prevent"])),style:{"margin-right":"3.5px"}},Object(a["toDisplayString"])(e.translate("General_Yes")),1),Object(a["createElementVNode"])("a",{href:"",class:"modal-action modal-close modal-no",onClick:t[20]||(t[20]=function(e){return e.preventDefault()})},Object(a["toDisplayString"])(e.translate("General_No")),1)])],512)],2)}var xe=window,Pe=xe.$,Fe=Object(a["defineComponent"])({props:{userLogin:{type:String,required:!0},limit:{type:Number,default:10},accessLevels:{type:Array,required:!0},filterAccessLevels:{type:Array,required:!0}},components:{Notification:i["Notification"],Field:f["Field"],CapabilitiesEdit:E},directives:{DropdownMenu:i["DropdownMenu"],ContentTable:i["ContentTable"]},data:function(){return{siteAccess:[],offset:0,totalEntries:null,accessLevelFilter:"",siteNameFilter:"",isLoadingAccess:!1,allWebsitesAccssLevelSet:"view",isAllCheckboxSelected:!1,selectedRows:{},isBulkActionsDisabled:!0,areAllResultsSelected:!1,previousRole:null,hasAccessToAtLeastOneSite:!0,isRoleHelpToggled:!1,isCapabilitiesHelpToggled:!1,isGivingAccessToAllSites:!1,roleToChangeTo:null,siteAccessToChange:null}},emits:["userHasAccessDetected","accessChanged"],created:function(){var e=this;this.onChangeSiteFilter=Object(i["debounce"])(this.onChangeSiteFilter,300),Object(a["watch"])((function(){return e.allPropsWatch}),(function(){e.limit&&e.fetchAccess()})),this.fetchAccess()},watch:{accessLevelFilter:function(){this.offset=0,this.fetchAccess()}},methods:{onAllCheckboxChange:function(e){var t=this;this.isAllCheckboxSelected=e.target.checked,this.isAllCheckboxSelected?(this.siteAccess.forEach((function(e,n){t.selectedRows[n]=!0})),this.isBulkActionsDisabled=!1):this.clearSelection()},clearSelection:function(){this.selectedRows={},this.areAllResultsSelected=!1,this.isBulkActionsDisabled=!0,this.isAllCheckboxSelected=!1,this.siteAccessToChange=null},onRowSelected:function(){var e=this;setTimeout((function(){var t=e.selectedRowsCount;e.isBulkActionsDisabled=0===t,e.isAllCheckboxSelected=t===e.siteAccess.length}))},fetchAccess:function(){var e=this;return this.isLoadingAccess=!0,i["AjaxHelper"].fetch({method:"UsersManager.getSitesAccessForUser",limit:this.limit,offset:this.offset,filter_search:this.siteNameFilter,filter_access:this.accessLevelFilter,userLogin:this.userLogin},{returnResponseObject:!0}).then((function(t){var n=t.getRequestHandle();e.isLoadingAccess=!1,e.siteAccess=n.responseJSON,e.totalEntries=parseInt(n.getResponseHeader("x-matomo-total-results"),10)||0,e.hasAccessToAtLeastOneSite=!!n.getResponseHeader("x-matomo-has-some"),e.$emit("userHasAccessDetected",{hasAccess:e.hasAccessToAtLeastOneSite}),e.clearSelection()})).catch((function(){e.isLoadingAccess=!1,e.clearSelection()}))},gotoPreviousPage:function(){this.offset=Math.max(0,this.offset-this.limit),this.fetchAccess()},gotoNextPage:function(){var e=this.offset+this.limit;e>=(this.totalEntries||0)||(this.offset=e,this.fetchAccess())},showRemoveAccessConfirm:function(){Pe(this.$refs.deleteAccessConfirmModal).modal({dismissible:!1}).modal("open")},changeUserRole:function(){var e=this,t=function(){var t=[];return Object.keys(e.selectedRows).forEach((function(n){e.selectedRows[n]&&e.siteAccess[n]&&t.push(e.siteAccess[n].idsite)})),t},n=function(){return i["AjaxHelper"].fetch({method:"UsersManager.getSitesAccessForUser",filter_search:e.siteNameFilter,filter_access:e.accessLevelFilter,userLogin:e.userLogin,filter_limit:"-1"}).then((function(e){return e.map((function(e){return e.idsite}))}))};return this.isLoadingAccess=!0,Promise.resolve().then((function(){return e.siteAccessToChange?[e.siteAccessToChange.idsite]:e.areAllResultsSelected?n():t()})).then((function(t){return i["AjaxHelper"].post({method:"UsersManager.setUserAccess"},{userLogin:e.userLogin,access:e.roleToChangeTo,idSites:t})})).catch((function(){})).then((function(){return e.$emit("accessChanged"),e.fetchAccess()}))},showChangeAccessConfirm:function(){Pe(this.$refs.changeAccessConfirmModal).modal({dismissible:!1}).modal("open")},getRoleDisplay:function(e){var t=null;return this.filteredAccessLevels.forEach((function(n){n.key===e&&(t=n.value)})),t},giveAccessToAllSites:function(){var e=this;this.isGivingAccessToAllSites=!0,i["AjaxHelper"].fetch({method:"SitesManager.getSitesWithAdminAccess",filter_limit:-1}).then((function(t){var n=t.map((function(e){return e.idsite}));return i["AjaxHelper"].post({method:"UsersManager.setUserAccess"},{userLogin:e.userLogin,access:e.allWebsitesAccssLevelSet,idSites:n})})).then((function(){return e.fetchAccess()})).finally((function(){e.isGivingAccessToAllSites=!1}))},showChangeAccessAllSitesModal:function(){Pe(this.$refs.confirmGiveAccessAllSitesModal).modal({dismissible:!1}).modal("open")},onChangeSiteFilter:function(e){var t=this;setTimeout((function(){var n=e.target.value;t.siteNameFilter!==n&&(t.siteNameFilter=n,t.offset=0,t.fetchAccess())}))},onRoleChange:function(e,t){this.previousRole=e.role,this.roleToChangeTo=t,this.siteAccessToChange=e,this.showChangeAccessConfirm()}},computed:{rolesHelpText:function(){return Object(i["translate"])("UsersManager_RolesHelp",'<a href="https://matomo.org/faq/general/faq_70/" target="_blank" rel="noreferrer noopener">',"</a>",'<a href="https://matomo.org/faq/general/faq_69/" target="_blank" rel="noreferrer noopener">',"</a>")},theDisplayedWebsitesAreSelectedText:function(){var e=Object(i["translate"])("UsersManager_TheDisplayedWebsitesAreSelected","<strong>".concat(this.siteAccess.length,"</strong>"));return"".concat(e," ")},clickToSelectAllText:function(){return Object(i["translate"])("UsersManager_ClickToSelectAll","<strong>".concat(this.totalEntries,"</strong>"))},allWebsitesAreSelectedText:function(){return Object(i["translate"])("UsersManager_AllWebsitesAreSelected","<strong>".concat(this.totalEntries,"</strong>"))},clickToSelectDisplayedWebsitesText:function(){return Object(i["translate"])("UsersManager_ClickToSelectDisplayedWebsites","<strong>".concat(this.siteAccess.length,"</strong>"))},deletePermConfirmSingleText:function(){return Object(i["translate"])("UsersManager_DeletePermConfirmSingle","<strong>".concat(this.userLogin,"</strong>"),"<strong>".concat(this.siteAccessToChangeName,"</strong>"))},deletePermConfirmMultipleText:function(){return Object(i["translate"])("UsersManager_DeletePermConfirmMultiple","<strong>".concat(this.userLogin,"</strong>"),"<strong>".concat(this.affectedSitesCount,"</strong>"))},changePermToSiteConfirmSingleText:function(){return Object(i["translate"])("UsersManager_ChangePermToSiteConfirmSingle","<strong>".concat(this.userLogin,"</strong>"),"<strong>".concat(this.siteAccessToChangeName,"</strong>"),"<strong>".concat(this.getRoleDisplay(this.roleToChangeTo),"</strong>"))},changePermToSiteConfirmMultipleText:function(){return Object(i["translate"])("UsersManager_ChangePermToSiteConfirmMultiple","<strong>".concat(this.userLogin,"</strong>"),"<strong>".concat(this.affectedSitesCount,"</strong>"),"<strong>".concat(this.getRoleDisplay(this.roleToChangeTo),"</strong>"))},changePermToAllSitesConfirmText:function(){return Object(i["translate"])("UsersManager_ChangePermToAllSitesConfirm","<strong>".concat(this.userLogin,"</strong>"),"<strong>".concat(this.getRoleDisplay(this.allWebsitesAccssLevelSet),"</strong>"))},paginationLowerBound:function(){return this.offset+1},paginationUpperBound:function(){return this.totalEntries?Math.min(this.offset+this.limit,this.totalEntries):"?"},filteredAccessLevels:function(){return this.accessLevels.filter((function(e){return"superuser"!==e.key}))},filteredSelectAccessLevels:function(){return this.filterAccessLevels.filter((function(e){return"superuser"!==e.key}))},selectedRowsCount:function(){var e=0;return Object.values(this.selectedRows).forEach((function(t){t&&(e+=1)})),e},affectedSitesCount:function(){return this.areAllResultsSelected?this.totalEntries:this.selectedRowsCount},allPropsWatch:function(){return this.userLogin,this.limit,this.accessLevels,this.filterAccessLevels,Date.now()},siteAccessToChangeName:function(){return this.siteAccessToChange?i["Matomo"].helper.htmlEntities(this.siteAccessToChange.site_name):""},paginationText:function(){var e=Object(i["translate"])("General_Pagination","".concat(this.paginationLowerBound),"".concat(this.paginationUpperBound),"".concat(this.totalEntries));return" ".concat(e," ")}}});Fe.render=Re;var He=Fe,Ie=(Object(i["createAngularJsAdapter"])({component:He,scope:{userLogin:{angularJsBind:"<"},limit:{angularJsBind:"<"},onUserHasAccessDetected:{angularJsBind:"&",vue:"userHasAccessDetected"},onAccessChange:{angularJsBind:"&",vue:"accessChanged"},accessLevels:{angularJsBind:"<"},filterAccessLevels:{angularJsBind:"<"}},directiveName:"piwikUserPermissionsEdit",restrict:"E"}),{class:"row"}),Je={key:0,class:"col m2 entityList"},qe={class:"listCircle"},$e={key:0,class:"icon-warning"},Ge=Object(a["createElementVNode"])("div",{class:"save-button-spacer hide-on-small-only"},null,-1),ze={href:"",class:"entityCancelLink"},We={class:"visibleTab col m10"},Ye={key:0,class:"basic-info-tab"},Xe={class:"form-group row",style:{position:"relative"}},Ke={class:"col s12 m6"},Qe={class:"col s12 m6"},Ze={key:0,class:"form-help"},et=["innerHTML"],tt={key:0,class:"entityCancel"},nt={key:1,class:"user-permissions"},st={key:0},rt={key:1,class:"alert alert-info"},it={key:2,class:"superuser-access"},at={class:"superuser-confirm-modal modal",ref:"superUserConfirmModal"},ot={class:"modal-content"},lt={key:0},ct={key:1},dt={class:"modal-footer"},ut={key:3,class:"twofa-reset"},mt={class:"resetTwoFa"},bt={class:"twofa-confirm-modal modal",ref:"twofaConfirmModal"},pt={class:"modal-content"},gt={class:"modal-footer"},ft={class:"change-password-modal modal",ref:"changePasswordModal"},ht={class:"modal-content"},jt=["innerHTML"],Ot={class:"modal-footer"}; /*! * Matomo - free/libre analytics platform * * @link https://matomo.org * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later - */function vt(e,t,n,s,r,i){var o=Object(a["resolveComponent"])("Field"),l=Object(a["resolveComponent"])("SaveButton"),c=Object(a["resolveComponent"])("UserPermissionsEdit"),d=Object(a["resolveComponent"])("ContentBlock"),u=Object(a["resolveDirective"])("form");return Object(a["openBlock"])(),Object(a["createBlock"])(d,{class:Object(a["normalizeClass"])(["userEditForm",{loading:e.isSavingUserInfo}]),"content-title":"".concat(e.formTitle," ").concat(e.isAdd?"":"'".concat(e.theUser.login,"'"))},{default:Object(a["withCtx"])((function(){return[Object(a["withDirectives"])(Object(a["createElementVNode"])("div",Ie,[e.isAdd?Object(a["createCommentVNode"])("",!0):(Object(a["openBlock"])(),Object(a["createElementBlock"])("div",Je,[Object(a["createElementVNode"])("ul",qe,[Object(a["createElementVNode"])("li",{class:Object(a["normalizeClass"])([{active:"basic"===e.activeTab},"menuBasicInfo"])},[Object(a["createElementVNode"])("a",{href:"",onClick:t[0]||(t[0]=Object(a["withModifiers"])((function(t){return e.activeTab="basic"}),["prevent"]))},Object(a["toDisplayString"])(e.translate("UsersManager_BasicInformation")),1)],2),Object(a["createElementVNode"])("li",{class:Object(a["normalizeClass"])([{active:"permissions"===e.activeTab},"menuPermissions"])},[Object(a["createElementVNode"])("a",{href:"",onClick:t[1]||(t[1]=Object(a["withModifiers"])((function(t){return e.activeTab="permissions"}),["prevent"])),style:{"margin-right":"3.5px"}},Object(a["toDisplayString"])(e.translate("UsersManager_Permissions")),1),e.userHasAccess||e.theUser.superuser_access?Object(a["createCommentVNode"])("",!0):(Object(a["openBlock"])(),Object(a["createElementBlock"])("span",$e))],2),"superuser"===e.currentUserRole?(Object(a["openBlock"])(),Object(a["createElementBlock"])("li",{key:0,class:Object(a["normalizeClass"])([{active:"superuser"===e.activeTab},"menuSuperuser"])},[Object(a["createElementVNode"])("a",{href:"",onClick:t[2]||(t[2]=Object(a["withModifiers"])((function(t){return e.activeTab="superuser"}),["prevent"]))},Object(a["toDisplayString"])(e.translate("UsersManager_SuperUserAccess")),1)],2)):Object(a["createCommentVNode"])("",!0),"superuser"===e.currentUserRole&&e.theUser.uses_2fa&&!e.isAdd?(Object(a["openBlock"])(),Object(a["createElementBlock"])("li",{key:1,class:Object(a["normalizeClass"])([{active:"2fa"===e.activeTab},"menuUserTwoFa"])},[Object(a["createElementVNode"])("a",{href:"",onClick:t[3]||(t[3]=Object(a["withModifiers"])((function(t){return e.activeTab="2fa"}),["prevent"]))},Object(a["toDisplayString"])(e.translate("UsersManager_TwoFactorAuthentication")),1)],2)):Object(a["createCommentVNode"])("",!0)]),Ge,Object(a["createElementVNode"])("div",{class:"entityCancel",onClick:t[4]||(t[4]=Object(a["withModifiers"])((function(t){return e.onDoneEditing()}),["prevent"]))},[Object(a["createElementVNode"])("a",ze,Object(a["toDisplayString"])(e.translate("Mobile_NavigationBack")),1)])])),Object(a["createElementVNode"])("div",We,["basic"===e.activeTab?(Object(a["openBlock"])(),Object(a["createElementBlock"])("div",Ye,[Object(a["createElementVNode"])("div",null,[Object(a["createVNode"])(o,{modelValue:e.theUser.login,"onUpdate:modelValue":t[5]||(t[5]=function(t){return e.theUser.login=t}),disabled:e.isSavingUserInfo||!e.isAdd||e.isShowingPasswordConfirm,uicontrol:"text",name:"user_login",maxlength:100,title:e.translate("General_Username")},null,8,["modelValue","disabled","title"])]),Object(a["createElementVNode"])("div",null,[e.isPendingUser?(Object(a["openBlock"])(),Object(a["createBlock"])(o,{key:0,"model-value":e.theUser.password,disabled:e.isSavingUserInfo||"superuser"!==e.currentUserRole&&!e.isAdd||e.isShowingPasswordConfirm,"onUpdate:modelValue":t[6]||(t[6]=function(t){e.theUser.password=t,e.isPasswordModified=!0}),uicontrol:"password",name:"user_password",title:e.translate("General_Password")},null,8,["model-value","disabled","title"])):Object(a["createCommentVNode"])("",!0)]),Object(a["createElementVNode"])("div",null,["superuser"===e.currentUserRole||e.isAdd?(Object(a["openBlock"])(),Object(a["createBlock"])(o,{key:0,modelValue:e.theUser.email,"onUpdate:modelValue":t[7]||(t[7]=function(t){return e.theUser.email=t}),disabled:e.isSavingUserInfo||"superuser"!==e.currentUserRole&&!e.isAdd||e.isShowingPasswordConfirm,uicontrol:"text",name:"user_email",maxlength:100,title:e.translate("UsersManager_Email")},null,8,["modelValue","disabled","title"])):Object(a["createCommentVNode"])("",!0)]),Object(a["createElementVNode"])("div",null,[e.isAdd?(Object(a["openBlock"])(),Object(a["createBlock"])(o,{key:0,modelValue:e.firstSiteAccess,"onUpdate:modelValue":t[8]||(t[8]=function(t){return e.firstSiteAccess=t}),disabled:e.isSavingUserInfo,uicontrol:"site",name:"user_site","ui-control-attributes":{onlySitesWithAdminAccess:!0},title:e.translate("UsersManager_FirstWebsitePermission"),"inline-help":e.translate("UsersManager_FirstSiteInlineHelp")},null,8,["modelValue","disabled","title","inline-help"])):Object(a["createCommentVNode"])("",!0)]),Object(a["createElementVNode"])("div",null,[Object(a["createElementVNode"])("div",Xe,[Object(a["createElementVNode"])("div",Ke,["superuser"===e.currentUserRole||e.isAdd?(Object(a["openBlock"])(),Object(a["createBlock"])(l,{key:0,style:{position:"absolute",bottom:"0"},value:e.saveButtonLabel,disabled:e.isAdd&&(!e.firstSiteAccess||!e.firstSiteAccess.id),saving:e.isSavingUserInfo,onConfirm:t[9]||(t[9]=function(t){return e.saveUserInfo()})},null,8,["value","disabled","saving"])):Object(a["createCommentVNode"])("",!0)]),Object(a["createElementVNode"])("div",Qe,[e.isAdd?(Object(a["openBlock"])(),Object(a["createElementBlock"])("div",Ze,[Object(a["createElementVNode"])("span",{class:"inline-help",innerHTML:e.$sanitize(e.translate("UsersManager_InviteSuccessNotification",[7]))},null,8,et)])):Object(a["createCommentVNode"])("",!0)])])]),e.isAdd?(Object(a["openBlock"])(),Object(a["createElementBlock"])("div",tt,[Object(a["createElementVNode"])("a",{href:"",class:"entityCancelLink",onClick:t[10]||(t[10]=Object(a["withModifiers"])((function(t){return e.onDoneEditing()}),["prevent"]))},Object(a["toDisplayString"])(e.translate("General_Cancel")),1)])):Object(a["createCommentVNode"])("",!0)])):Object(a["createCommentVNode"])("",!0),e.isAdd?Object(a["createCommentVNode"])("",!0):Object(a["withDirectives"])((Object(a["openBlock"])(),Object(a["createElementBlock"])("div",nt,[e.theUser.superuser_access?Object(a["createCommentVNode"])("",!0):(Object(a["openBlock"])(),Object(a["createElementBlock"])("div",st,[Object(a["createVNode"])(c,{"user-login":e.theUser.login,onUserHasAccessDetected:t[11]||(t[11]=function(t){return e.userHasAccess=t.hasAccess}),onAccessChanged:t[12]||(t[12]=function(t){return e.isUserModified=!0}),"access-levels":e.accessLevels,"filter-access-levels":e.filterAccessLevels},null,8,["user-login","access-levels","filter-access-levels"])])),e.theUser.superuser_access?(Object(a["openBlock"])(),Object(a["createElementBlock"])("div",rt,Object(a["toDisplayString"])(e.translate("UsersManager_SuperUsersPermissionsNotice")),1)):Object(a["createCommentVNode"])("",!0)],512)),[[a["vShow"],"permissions"===e.activeTab]]),"superuser"!==e.activeTab||"superuser"!==e.currentUserRole||e.isAdd?Object(a["createCommentVNode"])("",!0):(Object(a["openBlock"])(),Object(a["createElementBlock"])("div",it,[Object(a["createElementVNode"])("p",null,Object(a["toDisplayString"])(e.translate("UsersManager_SuperUserIntro1")),1),Object(a["createElementVNode"])("p",null,[Object(a["createElementVNode"])("strong",null,Object(a["toDisplayString"])(e.translate("UsersManager_SuperUserIntro2")),1)]),Object(a["createElementVNode"])("div",null,[Object(a["createVNode"])(o,{modelValue:e.superUserAccessChecked,"onUpdate:modelValue":t[13]||(t[13]=function(t){return e.superUserAccessChecked=t}),onClick:t[14]||(t[14]=function(t){return e.confirmSuperUserChange()}),disabled:e.isSavingUserInfo,uicontrol:"checkbox",name:"superuser_access",title:e.translate("UsersManager_HasSuperUserAccess")},null,8,["modelValue","disabled","title"])]),Object(a["createElementVNode"])("div",at,[Object(a["createElementVNode"])("div",ot,[Object(a["createElementVNode"])("h2",null,Object(a["toDisplayString"])(e.translate("UsersManager_AreYouSure")),1),e.theUser.superuser_access?(Object(a["openBlock"])(),Object(a["createElementBlock"])("p",lt,Object(a["toDisplayString"])(e.translate("UsersManager_RemoveSuperuserAccessConfirm")),1)):Object(a["createCommentVNode"])("",!0),e.theUser.superuser_access?Object(a["createCommentVNode"])("",!0):(Object(a["openBlock"])(),Object(a["createElementBlock"])("p",ct,Object(a["toDisplayString"])(e.translate("UsersManager_AddSuperuserAccessConfirm")),1)),Object(a["createElementVNode"])("div",null,[Object(a["createVNode"])(o,{modelValue:e.passwordConfirmationForSuperUser,"onUpdate:modelValue":t[15]||(t[15]=function(t){return e.passwordConfirmationForSuperUser=t}),uicontrol:"password",name:"currentUserPasswordForSuperUser",autocomplete:!1,"full-width":!0,title:e.translate("UsersManager_YourCurrentPassword")},null,8,["modelValue","title"])])]),Object(a["createElementVNode"])("div",dt,[Object(a["createElementVNode"])("a",{href:"",class:"modal-action modal-close btn",onClick:t[16]||(t[16]=Object(a["withModifiers"])((function(t){return e.toggleSuperuserAccess()}),["prevent"])),style:{"margin-right":"3.5px"}},Object(a["toDisplayString"])(e.translate("General_Yes")),1),Object(a["createElementVNode"])("a",{href:"",class:"modal-action modal-close modal-no",onClick:t[17]||(t[17]=Object(a["withModifiers"])((function(t){e.setSuperUserAccessChecked(),e.passwordConfirmationForSuperUser=""}),["prevent"]))},Object(a["toDisplayString"])(e.translate("General_No")),1)])],512)])),"superuser"!==e.currentUserRole||e.isAdd?Object(a["createCommentVNode"])("",!0):Object(a["withDirectives"])((Object(a["openBlock"])(),Object(a["createElementBlock"])("div",ut,[Object(a["createElementVNode"])("p",null,Object(a["toDisplayString"])(e.translate("UsersManager_ResetTwoFactorAuthenticationInfo")),1),Object(a["createElementVNode"])("div",mt,[Object(a["createVNode"])(l,{saving:e.isResetting2FA,onConfirm:t[18]||(t[18]=function(t){return e.confirmReset2FA()}),value:e.translate("UsersManager_ResetTwoFactorAuthentication")},null,8,["saving","value"])]),Object(a["createElementVNode"])("div",bt,[Object(a["createElementVNode"])("div",pt,[Object(a["createElementVNode"])("h2",null,Object(a["toDisplayString"])(e.translate("UsersManager_AreYouSure")),1),Object(a["createElementVNode"])("p",null,Object(a["toDisplayString"])(e.translate("UsersManager_ConfirmWithPassword")),1),Object(a["createElementVNode"])("div",null,[Object(a["createVNode"])(o,{modelValue:e.passwordConfirmation,"onUpdate:modelValue":t[19]||(t[19]=function(t){return e.passwordConfirmation=t}),uicontrol:"password",name:"currentUserPasswordTwoFa",autocomplete:!1,"full-width":!0,title:e.translate("UsersManager_YourCurrentPassword")},null,8,["modelValue","title"])])]),Object(a["createElementVNode"])("div",gt,[Object(a["createElementVNode"])("a",{href:"",class:"modal-action modal-close btn",onClick:t[20]||(t[20]=Object(a["withModifiers"])((function(t){return e.reset2FA()}),["prevent"])),style:{"margin-right":"3.5px"}},Object(a["toDisplayString"])(e.translate("General_Yes")),1),Object(a["createElementVNode"])("a",{href:"",class:"modal-action modal-close modal-no",onClick:t[21]||(t[21]=function(t){t.preventDefault(),e.passwordConfirmation=""})},Object(a["toDisplayString"])(e.translate("General_No")),1)])],512)],512)),[[a["vShow"],"2fa"===e.activeTab]])])],512),[[u]]),Object(a["createElementVNode"])("div",ht,[Object(a["createElementVNode"])("div",ft,[Object(a["createElementVNode"])("h2",{innerHTML:e.$sanitize(e.changePasswordTitle)},null,8,jt),Object(a["createElementVNode"])("p",null,Object(a["toDisplayString"])(e.translate("UsersManager_ConfirmWithPassword")),1),Object(a["createElementVNode"])("div",null,[Object(a["createVNode"])(o,{modelValue:e.passwordConfirmation,"onUpdate:modelValue":t[22]||(t[22]=function(t){return e.passwordConfirmation=t}),uicontrol:"password",name:"currentUserPasswordChangePwd",autocomplete:!1,"full-width":!0,title:e.translate("UsersManager_YourCurrentPassword")},null,8,["modelValue","title"])])]),Object(a["createElementVNode"])("div",Ot,[Object(a["createElementVNode"])("a",{href:"",class:"modal-action modal-close btn",onClick:t[23]||(t[23]=Object(a["withModifiers"])((function(t){return e.updateUser()}),["prevent"]))},Object(a["toDisplayString"])(e.translate("General_Yes")),1),Object(a["createElementVNode"])("a",{href:"",class:"modal-action modal-close modal-no",onClick:t[24]||(t[24]=function(t){t.preventDefault(),e.passwordConfirmation=""})},Object(a["toDisplayString"])(e.translate("General_No")),1)])],512)]})),_:1},8,["class","content-title"])}var Ct={login:"",superuser_access:!1,uses_2fa:!1,password:"",email:"",invited_at:""},Nt=window,St=Nt.$,Ut=Object(a["defineComponent"])({props:{user:Object,currentUserRole:{type:String,required:!0},accessLevels:{type:Array,required:!0},filterAccessLevels:{type:Array,required:!0},initialSiteId:{type:[String,Number],required:!0},initialSiteName:{type:String,required:!0}},components:{ContentBlock:i["ContentBlock"],Field:h["Field"],SaveButton:h["SaveButton"],UserPermissionsEdit:Fe},directives:{Form:h["Form"]},data:function(){return{theUser:this.user||Object.assign({},Ct),activeTab:"basic",permissionsForIdSite:1,isSavingUserInfo:!1,userHasAccess:!0,firstSiteAccess:{id:this.initialSiteId,name:this.initialSiteName},isUserModified:!1,passwordConfirmation:"",isPasswordModified:!1,superUserAccessChecked:null,passwordConfirmationForSuperUser:"",isResetting2FA:!1,isShowingPasswordConfirm:!1}},emits:["done","updated"],watch:{user:function(e){this.onUserChange(e)}},created:function(){this.onUserChange(this.user)},methods:{onUserChange:function(e){this.theUser=e||Object.assign({},Ct),this.theUser.password||this.resetPasswordVar(),this.setSuperUserAccessChecked()},confirmSuperUserChange:function(){St(this.$refs.superUserConfirmModal).modal({dismissible:!1}).modal("open")},confirmReset2FA:function(){St(this.$refs.twofaConfirmModal).modal({dismissible:!1}).modal("open")},toggleSuperuserAccess:function(){var e=this;this.isSavingUserInfo=!0,i["AjaxHelper"].post({method:"UsersManager.setSuperUserAccess"},{userLogin:this.theUser.login,hasSuperUserAccess:this.theUser.superuser_access?"0":"1",passwordConfirmation:this.passwordConfirmationForSuperUser}).then((function(){e.theUser.superuser_access=!e.theUser.superuser_access})).catch((function(){})).then((function(){e.isSavingUserInfo=!1,e.isUserModified=!0,e.passwordConfirmationForSuperUser="",e.setSuperUserAccessChecked()}))},saveUserInfo:function(){var e=this;return Promise.resolve().then((function(){return e.isAdd?e.createUser():e.confirmUserChange()})).then((function(){e.$emit("updated",{user:Object(a["readonly"])(e.theUser)})}))},createUser:function(){var e=this;return this.isSavingUserInfo=!0,i["AjaxHelper"].post({method:"UsersManager.inviteUser"},{userLogin:this.theUser.login,email:this.theUser.email,initialIdSite:this.firstSiteAccess?this.firstSiteAccess.id:void 0}).catch((function(t){throw e.isSavingUserInfo=!1,t})).then((function(){e.firstSiteAccess=null,e.isSavingUserInfo=!1,e.isUserModified=!0,e.theUser.invited_at="xx",e.resetPasswordVar(),e.showUserSavedNotification()}))},resetPasswordVar:function(){this.isAdd||(this.theUser.password="XXXXXXXX")},confirmUserChange:function(){var e=this;this.passwordConfirmation="",this.isShowingPasswordConfirm=!0;var t=function(t){var n=t.keyCode?t.keyCode:t.which;13===n&&(St(e.$refs.changePasswordModal).modal("close"),e.updateUser())};St(this.$refs.changePasswordModal).modal({dismissible:!1,onOpenEnd:function(){e.isShowingPasswordConfirm=!1,St(".modal.open #currentUserPasswordChangePwd").focus().off("keypress").keypress(t)}}).modal("open")},showUserSavedNotification:function(){i["NotificationsStore"].show({message:Object(i["translate"])("General_YourChangesHaveBeenSaved"),context:"success",type:"toast"})},reset2FA:function(){var e=this;return this.isResetting2FA=!0,i["AjaxHelper"].post({method:"TwoFactorAuth.resetTwoFactorAuth",userLogin:this.theUser.login,passwordConfirmation:this.passwordConfirmation}).catch((function(t){throw e.isResetting2FA=!1,t})).then((function(){e.isResetting2FA=!1,e.theUser.uses_2fa=!1,e.activeTab="basic",e.showUserSavedNotification()})).finally((function(){e.passwordConfirmation=""}))},updateUser:function(){var e=this;return this.isSavingUserInfo=!0,i["AjaxHelper"].post({method:"UsersManager.updateUser"},{userLogin:this.theUser.login,password:this.isPasswordModified&&this.theUser.password?this.theUser.password:void 0,passwordConfirmation:this.passwordConfirmation?this.passwordConfirmation:void 0,email:this.theUser.email}).then((function(){e.isSavingUserInfo=!1,e.passwordConfirmation="",e.isUserModified=!0,e.isPasswordModified=!1,e.resetPasswordVar(),e.showUserSavedNotification()})).catch((function(){e.isSavingUserInfo=!1,e.passwordConfirmation=""}))},setSuperUserAccessChecked:function(){this.superUserAccessChecked=!!this.theUser.superuser_access},onDoneEditing:function(){this.$emit("done",{isUserModified:this.isUserModified})}},computed:{formTitle:function(){return this.isAdd?Object(i["translate"])("UsersManager_InviteNewUser"):Object(i["translate"])("UsersManager_EditUser")},saveButtonLabel:function(){return this.isAdd?Object(i["translate"])("UsersManager_InviteUser"):Object(i["translate"])("UsersManager_SaveBasicInfo")},isPendingUser:function(){return this.user&&(""===this.theUser.invited_at||!this.theUser.invited_at)},isAdd:function(){return!this.user},changePasswordTitle:function(){return Object(i["translate"])("UsersManager_AreYouSureChangeDetails","<strong>".concat(this.theUser.login,"</strong>"))}}});Ut.render=vt;var yt=Ut; + */function vt(e,t,n,s,r,i){var o=Object(a["resolveComponent"])("Field"),l=Object(a["resolveComponent"])("SaveButton"),c=Object(a["resolveComponent"])("UserPermissionsEdit"),d=Object(a["resolveComponent"])("ContentBlock"),u=Object(a["resolveDirective"])("form");return Object(a["openBlock"])(),Object(a["createBlock"])(d,{class:Object(a["normalizeClass"])(["userEditForm",{loading:e.isSavingUserInfo}]),"content-title":"".concat(e.formTitle," ").concat(e.isAdd?"":"'".concat(e.theUser.login,"'"))},{default:Object(a["withCtx"])((function(){return[Object(a["withDirectives"])(Object(a["createElementVNode"])("div",Ie,[e.isAdd?Object(a["createCommentVNode"])("",!0):(Object(a["openBlock"])(),Object(a["createElementBlock"])("div",Je,[Object(a["createElementVNode"])("ul",qe,[Object(a["createElementVNode"])("li",{class:Object(a["normalizeClass"])([{active:"basic"===e.activeTab},"menuBasicInfo"])},[Object(a["createElementVNode"])("a",{href:"",onClick:t[0]||(t[0]=Object(a["withModifiers"])((function(t){return e.activeTab="basic"}),["prevent"]))},Object(a["toDisplayString"])(e.translate("UsersManager_BasicInformation")),1)],2),Object(a["createElementVNode"])("li",{class:Object(a["normalizeClass"])([{active:"permissions"===e.activeTab},"menuPermissions"])},[Object(a["createElementVNode"])("a",{href:"",onClick:t[1]||(t[1]=Object(a["withModifiers"])((function(t){return e.activeTab="permissions"}),["prevent"])),style:{"margin-right":"3.5px"}},Object(a["toDisplayString"])(e.translate("UsersManager_Permissions")),1),e.userHasAccess||e.theUser.superuser_access?Object(a["createCommentVNode"])("",!0):(Object(a["openBlock"])(),Object(a["createElementBlock"])("span",$e))],2),"superuser"===e.currentUserRole?(Object(a["openBlock"])(),Object(a["createElementBlock"])("li",{key:0,class:Object(a["normalizeClass"])([{active:"superuser"===e.activeTab},"menuSuperuser"])},[Object(a["createElementVNode"])("a",{href:"",onClick:t[2]||(t[2]=Object(a["withModifiers"])((function(t){return e.activeTab="superuser"}),["prevent"]))},Object(a["toDisplayString"])(e.translate("UsersManager_SuperUserAccess")),1)],2)):Object(a["createCommentVNode"])("",!0),"superuser"===e.currentUserRole&&e.theUser.uses_2fa&&!e.isAdd?(Object(a["openBlock"])(),Object(a["createElementBlock"])("li",{key:1,class:Object(a["normalizeClass"])([{active:"2fa"===e.activeTab},"menuUserTwoFa"])},[Object(a["createElementVNode"])("a",{href:"",onClick:t[3]||(t[3]=Object(a["withModifiers"])((function(t){return e.activeTab="2fa"}),["prevent"]))},Object(a["toDisplayString"])(e.translate("UsersManager_TwoFactorAuthentication")),1)],2)):Object(a["createCommentVNode"])("",!0)]),Ge,Object(a["createElementVNode"])("div",{class:"entityCancel",onClick:t[4]||(t[4]=Object(a["withModifiers"])((function(t){return e.onDoneEditing()}),["prevent"]))},[Object(a["createElementVNode"])("a",ze,Object(a["toDisplayString"])(e.translate("Mobile_NavigationBack")),1)])])),Object(a["createElementVNode"])("div",We,["basic"===e.activeTab?(Object(a["openBlock"])(),Object(a["createElementBlock"])("div",Ye,[Object(a["createElementVNode"])("div",null,[Object(a["createVNode"])(o,{modelValue:e.theUser.login,"onUpdate:modelValue":t[5]||(t[5]=function(t){return e.theUser.login=t}),disabled:e.isSavingUserInfo||!e.isAdd||e.isShowingPasswordConfirm,uicontrol:"text",name:"user_login",maxlength:100,title:e.translate("General_Username")},null,8,["modelValue","disabled","title"])]),Object(a["createElementVNode"])("div",null,[e.isPending?Object(a["createCommentVNode"])("",!0):(Object(a["openBlock"])(),Object(a["createBlock"])(o,{key:0,"model-value":e.theUser.password,disabled:e.isSavingUserInfo||"superuser"!==e.currentUserRole&&!e.isAdd||e.isShowingPasswordConfirm,"onUpdate:modelValue":t[6]||(t[6]=function(t){e.theUser.password=t,e.isPasswordModified=!0}),uicontrol:"password",name:"user_password",title:e.translate("General_Password")},null,8,["model-value","disabled","title"]))]),Object(a["createElementVNode"])("div",null,["superuser"===e.currentUserRole||e.isAdd?(Object(a["openBlock"])(),Object(a["createBlock"])(o,{key:0,modelValue:e.theUser.email,"onUpdate:modelValue":t[7]||(t[7]=function(t){return e.theUser.email=t}),disabled:e.isSavingUserInfo||"superuser"!==e.currentUserRole&&!e.isAdd||e.isShowingPasswordConfirm,uicontrol:"text",name:"user_email",maxlength:100,title:e.translate("UsersManager_Email")},null,8,["modelValue","disabled","title"])):Object(a["createCommentVNode"])("",!0)]),Object(a["createElementVNode"])("div",null,[e.isAdd?(Object(a["openBlock"])(),Object(a["createBlock"])(o,{key:0,modelValue:e.firstSiteAccess,"onUpdate:modelValue":t[8]||(t[8]=function(t){return e.firstSiteAccess=t}),disabled:e.isSavingUserInfo,uicontrol:"site",name:"user_site","ui-control-attributes":{onlySitesWithAdminAccess:!0},title:e.translate("UsersManager_FirstWebsitePermission"),"inline-help":e.translate("UsersManager_FirstSiteInlineHelp")},null,8,["modelValue","disabled","title","inline-help"])):Object(a["createCommentVNode"])("",!0)]),Object(a["createElementVNode"])("div",null,[Object(a["createElementVNode"])("div",Xe,[Object(a["createElementVNode"])("div",Ke,["superuser"===e.currentUserRole||e.isAdd?(Object(a["openBlock"])(),Object(a["createBlock"])(l,{key:0,style:{position:"absolute",bottom:"0"},value:e.saveButtonLabel,disabled:e.isAdd&&(!e.firstSiteAccess||!e.firstSiteAccess.id),saving:e.isSavingUserInfo,onConfirm:t[9]||(t[9]=function(t){return e.saveUserInfo()})},null,8,["value","disabled","saving"])):Object(a["createCommentVNode"])("",!0)]),Object(a["createElementVNode"])("div",Qe,[e.isAdd?(Object(a["openBlock"])(),Object(a["createElementBlock"])("div",Ze,[Object(a["createElementVNode"])("span",{class:"inline-help",innerHTML:e.$sanitize(e.translate("UsersManager_InviteSuccessNotification",[7]))},null,8,et)])):Object(a["createCommentVNode"])("",!0)])])]),e.isAdd?(Object(a["openBlock"])(),Object(a["createElementBlock"])("div",tt,[Object(a["createElementVNode"])("a",{href:"",class:"entityCancelLink",onClick:t[10]||(t[10]=Object(a["withModifiers"])((function(t){return e.onDoneEditing()}),["prevent"]))},Object(a["toDisplayString"])(e.translate("General_Cancel")),1)])):Object(a["createCommentVNode"])("",!0)])):Object(a["createCommentVNode"])("",!0),e.isAdd?Object(a["createCommentVNode"])("",!0):Object(a["withDirectives"])((Object(a["openBlock"])(),Object(a["createElementBlock"])("div",nt,[e.theUser.superuser_access?Object(a["createCommentVNode"])("",!0):(Object(a["openBlock"])(),Object(a["createElementBlock"])("div",st,[Object(a["createVNode"])(c,{"user-login":e.theUser.login,onUserHasAccessDetected:t[11]||(t[11]=function(t){return e.userHasAccess=t.hasAccess}),onAccessChanged:t[12]||(t[12]=function(t){return e.isUserModified=!0}),"access-levels":e.accessLevels,"filter-access-levels":e.filterAccessLevels},null,8,["user-login","access-levels","filter-access-levels"])])),e.theUser.superuser_access?(Object(a["openBlock"])(),Object(a["createElementBlock"])("div",rt,Object(a["toDisplayString"])(e.translate("UsersManager_SuperUsersPermissionsNotice")),1)):Object(a["createCommentVNode"])("",!0)],512)),[[a["vShow"],"permissions"===e.activeTab]]),"superuser"!==e.activeTab||"superuser"!==e.currentUserRole||e.isAdd?Object(a["createCommentVNode"])("",!0):(Object(a["openBlock"])(),Object(a["createElementBlock"])("div",it,[Object(a["createElementVNode"])("p",null,Object(a["toDisplayString"])(e.translate("UsersManager_SuperUserIntro1")),1),Object(a["createElementVNode"])("p",null,[Object(a["createElementVNode"])("strong",null,Object(a["toDisplayString"])(e.translate("UsersManager_SuperUserIntro2")),1)]),Object(a["createElementVNode"])("div",null,[Object(a["createVNode"])(o,{modelValue:e.superUserAccessChecked,"onUpdate:modelValue":t[13]||(t[13]=function(t){return e.superUserAccessChecked=t}),onClick:t[14]||(t[14]=function(t){return e.confirmSuperUserChange()}),disabled:e.isSavingUserInfo,uicontrol:"checkbox",name:"superuser_access",title:e.translate("UsersManager_HasSuperUserAccess")},null,8,["modelValue","disabled","title"])]),Object(a["createElementVNode"])("div",at,[Object(a["createElementVNode"])("div",ot,[Object(a["createElementVNode"])("h2",null,Object(a["toDisplayString"])(e.translate("UsersManager_AreYouSure")),1),e.theUser.superuser_access?(Object(a["openBlock"])(),Object(a["createElementBlock"])("p",lt,Object(a["toDisplayString"])(e.translate("UsersManager_RemoveSuperuserAccessConfirm")),1)):Object(a["createCommentVNode"])("",!0),e.theUser.superuser_access?Object(a["createCommentVNode"])("",!0):(Object(a["openBlock"])(),Object(a["createElementBlock"])("p",ct,Object(a["toDisplayString"])(e.translate("UsersManager_AddSuperuserAccessConfirm")),1)),Object(a["createElementVNode"])("div",null,[Object(a["createVNode"])(o,{modelValue:e.passwordConfirmationForSuperUser,"onUpdate:modelValue":t[15]||(t[15]=function(t){return e.passwordConfirmationForSuperUser=t}),uicontrol:"password",name:"currentUserPasswordForSuperUser",autocomplete:!1,"full-width":!0,title:e.translate("UsersManager_YourCurrentPassword")},null,8,["modelValue","title"])])]),Object(a["createElementVNode"])("div",dt,[Object(a["createElementVNode"])("a",{href:"",class:"modal-action modal-close btn",onClick:t[16]||(t[16]=Object(a["withModifiers"])((function(t){return e.toggleSuperuserAccess()}),["prevent"])),style:{"margin-right":"3.5px"}},Object(a["toDisplayString"])(e.translate("General_Yes")),1),Object(a["createElementVNode"])("a",{href:"",class:"modal-action modal-close modal-no",onClick:t[17]||(t[17]=Object(a["withModifiers"])((function(t){e.setSuperUserAccessChecked(),e.passwordConfirmationForSuperUser=""}),["prevent"]))},Object(a["toDisplayString"])(e.translate("General_No")),1)])],512)])),"superuser"!==e.currentUserRole||e.isAdd?Object(a["createCommentVNode"])("",!0):Object(a["withDirectives"])((Object(a["openBlock"])(),Object(a["createElementBlock"])("div",ut,[Object(a["createElementVNode"])("p",null,Object(a["toDisplayString"])(e.translate("UsersManager_ResetTwoFactorAuthenticationInfo")),1),Object(a["createElementVNode"])("div",mt,[Object(a["createVNode"])(l,{saving:e.isResetting2FA,onConfirm:t[18]||(t[18]=function(t){return e.confirmReset2FA()}),value:e.translate("UsersManager_ResetTwoFactorAuthentication")},null,8,["saving","value"])]),Object(a["createElementVNode"])("div",bt,[Object(a["createElementVNode"])("div",pt,[Object(a["createElementVNode"])("h2",null,Object(a["toDisplayString"])(e.translate("UsersManager_AreYouSure")),1),Object(a["createElementVNode"])("p",null,Object(a["toDisplayString"])(e.translate("UsersManager_ConfirmWithPassword")),1),Object(a["createElementVNode"])("div",null,[Object(a["createVNode"])(o,{modelValue:e.passwordConfirmation,"onUpdate:modelValue":t[19]||(t[19]=function(t){return e.passwordConfirmation=t}),uicontrol:"password",name:"currentUserPasswordTwoFa",autocomplete:!1,"full-width":!0,title:e.translate("UsersManager_YourCurrentPassword")},null,8,["modelValue","title"])])]),Object(a["createElementVNode"])("div",gt,[Object(a["createElementVNode"])("a",{href:"",class:"modal-action modal-close btn",onClick:t[20]||(t[20]=Object(a["withModifiers"])((function(t){return e.reset2FA()}),["prevent"])),style:{"margin-right":"3.5px"}},Object(a["toDisplayString"])(e.translate("General_Yes")),1),Object(a["createElementVNode"])("a",{href:"",class:"modal-action modal-close modal-no",onClick:t[21]||(t[21]=function(t){t.preventDefault(),e.passwordConfirmation=""})},Object(a["toDisplayString"])(e.translate("General_No")),1)])],512)],512)),[[a["vShow"],"2fa"===e.activeTab]])])],512),[[u]]),Object(a["createElementVNode"])("div",ft,[Object(a["createElementVNode"])("div",ht,[Object(a["createElementVNode"])("h2",{innerHTML:e.$sanitize(e.changePasswordTitle)},null,8,jt),Object(a["createElementVNode"])("p",null,Object(a["toDisplayString"])(e.translate("UsersManager_ConfirmWithPassword")),1),Object(a["createElementVNode"])("div",null,[Object(a["createVNode"])(o,{modelValue:e.passwordConfirmation,"onUpdate:modelValue":t[22]||(t[22]=function(t){return e.passwordConfirmation=t}),uicontrol:"password",name:"currentUserPasswordChangePwd",autocomplete:!1,"full-width":!0,title:e.translate("UsersManager_YourCurrentPassword")},null,8,["modelValue","title"])])]),Object(a["createElementVNode"])("div",Ot,[Object(a["createElementVNode"])("a",{href:"",class:"modal-action modal-close btn",onClick:t[23]||(t[23]=Object(a["withModifiers"])((function(t){return e.updateUser()}),["prevent"]))},Object(a["toDisplayString"])(e.translate("General_Yes")),1),Object(a["createElementVNode"])("a",{href:"",class:"modal-action modal-close modal-no",onClick:t[24]||(t[24]=function(t){t.preventDefault(),e.passwordConfirmation=""})},Object(a["toDisplayString"])(e.translate("General_No")),1)])],512)]})),_:1},8,["class","content-title"])}var Ct={login:"",superuser_access:!1,uses_2fa:!1,password:"",email:"",invite_status:""},Nt=window,St=Nt.$,Ut=Object(a["defineComponent"])({props:{user:Object,currentUserRole:{type:String,required:!0},accessLevels:{type:Array,required:!0},filterAccessLevels:{type:Array,required:!0},initialSiteId:{type:[String,Number],required:!0},initialSiteName:{type:String,required:!0}},components:{ContentBlock:i["ContentBlock"],Field:f["Field"],SaveButton:f["SaveButton"],UserPermissionsEdit:He},directives:{Form:f["Form"]},data:function(){return{theUser:this.user||Object.assign({},Ct),activeTab:"basic",permissionsForIdSite:1,isSavingUserInfo:!1,userHasAccess:!0,firstSiteAccess:{id:this.initialSiteId,name:this.initialSiteName},isUserModified:!1,passwordConfirmation:"",isPasswordModified:!1,superUserAccessChecked:null,passwordConfirmationForSuperUser:"",isResetting2FA:!1,isShowingPasswordConfirm:!1}},emits:["done","updated"],watch:{user:function(e){this.onUserChange(e)}},created:function(){this.onUserChange(this.user)},methods:{onUserChange:function(e){this.theUser=e||Object.assign({},Ct),this.theUser.password||this.resetPasswordVar(),this.setSuperUserAccessChecked()},confirmSuperUserChange:function(){St(this.$refs.superUserConfirmModal).modal({dismissible:!1}).modal("open")},confirmReset2FA:function(){St(this.$refs.twofaConfirmModal).modal({dismissible:!1}).modal("open")},toggleSuperuserAccess:function(){var e=this;this.isSavingUserInfo=!0,i["AjaxHelper"].post({method:"UsersManager.setSuperUserAccess"},{userLogin:this.theUser.login,hasSuperUserAccess:this.theUser.superuser_access?"0":"1",passwordConfirmation:this.passwordConfirmationForSuperUser}).then((function(){e.theUser.superuser_access=!e.theUser.superuser_access})).catch((function(){})).then((function(){e.isSavingUserInfo=!1,e.isUserModified=!0,e.passwordConfirmationForSuperUser="",e.setSuperUserAccessChecked()}))},saveUserInfo:function(){var e=this;return Promise.resolve().then((function(){return e.isAdd?e.createUser():e.confirmUserChange()})).then((function(){e.$emit("updated",{user:Object(a["readonly"])(e.theUser)})}))},createUser:function(){var e=this;return this.isSavingUserInfo=!0,i["AjaxHelper"].post({method:"UsersManager.inviteUser"},{userLogin:this.theUser.login,email:this.theUser.email,initialIdSite:this.firstSiteAccess?this.firstSiteAccess.id:void 0}).catch((function(t){throw e.isSavingUserInfo=!1,t})).then((function(){e.firstSiteAccess=null,e.isSavingUserInfo=!1,e.isUserModified=!0,e.theUser.invite_status="pending",e.resetPasswordVar(),e.showUserCreatedNotification()}))},resetPasswordVar:function(){this.isAdd||(this.theUser.password="XXXXXXXX")},confirmUserChange:function(){var e=this;this.passwordConfirmation="",this.isShowingPasswordConfirm=!0;var t=function(t){var n=t.keyCode?t.keyCode:t.which;13===n&&(St(e.$refs.changePasswordModal).modal("close"),e.updateUser())};St(this.$refs.changePasswordModal).modal({dismissible:!1,onOpenEnd:function(){e.isShowingPasswordConfirm=!1,St(".modal.open #currentUserPasswordChangePwd").focus().off("keypress").keypress(t)}}).modal("open")},showUserSavedNotification:function(){i["NotificationsStore"].show({message:Object(i["translate"])("General_YourChangesHaveBeenSaved"),context:"success",type:"toast"})},showUserCreatedNotification:function(){i["NotificationsStore"].show({message:Object(i["translate"])("UsersManager_InviteSuccess"),context:"success",type:"toast"})},reset2FA:function(){var e=this;return this.isResetting2FA=!0,i["AjaxHelper"].post({method:"TwoFactorAuth.resetTwoFactorAuth",userLogin:this.theUser.login,passwordConfirmation:this.passwordConfirmation}).catch((function(t){throw e.isResetting2FA=!1,t})).then((function(){e.isResetting2FA=!1,e.theUser.uses_2fa=!1,e.activeTab="basic",e.showUserSavedNotification()})).finally((function(){e.passwordConfirmation=""}))},updateUser:function(){var e=this;return this.isSavingUserInfo=!0,i["AjaxHelper"].post({method:"UsersManager.updateUser"},{userLogin:this.theUser.login,password:this.isPasswordModified&&this.theUser.password?this.theUser.password:void 0,passwordConfirmation:this.passwordConfirmation?this.passwordConfirmation:void 0,email:this.theUser.email}).then((function(){e.isSavingUserInfo=!1,e.passwordConfirmation="",e.isUserModified=!0,e.isPasswordModified=!1,e.resetPasswordVar(),e.showUserSavedNotification()})).catch((function(){e.isSavingUserInfo=!1,e.passwordConfirmation=""}))},setSuperUserAccessChecked:function(){this.superUserAccessChecked=!!this.theUser.superuser_access},onDoneEditing:function(){this.$emit("done",{isUserModified:this.isUserModified})}},computed:{formTitle:function(){return this.isAdd?Object(i["translate"])("UsersManager_InviteNewUser"):Object(i["translate"])("UsersManager_EditUser")},saveButtonLabel:function(){return this.isAdd?Object(i["translate"])("UsersManager_InviteUser"):Object(i["translate"])("UsersManager_SaveBasicInfo")},isPending:function(){return!this.user||!("pending"!==this.user.invite_status&&!Number.isInteger(this.user.invite_status))},isAdd:function(){return!this.user},changePasswordTitle:function(){return Object(i["translate"])("UsersManager_AreYouSureChangeDetails","<strong>".concat(this.theUser.login,"</strong>"))}}});Ut.render=vt;var yt=Ut,Et=(Object(i["createAngularJsAdapter"])({component:yt,scope:{user:{angularJsBind:"<"},onDoneEditing:{angularJsBind:"&",vue:"done"},currentUserRole:{angularJsBind:"<"},accessLevels:{angularJsBind:"<"},filterAccessLevels:{angularJsBind:"<"},initialSiteId:{angularJsBind:"<"},initialSiteName:{angularJsBind:"<"},onUpdated:{angularJsBind:"&",vue:"updated"}},directiveName:"piwikUserEditForm",restrict:"E"}),{class:"userListFilters row"}),Vt={class:"col s12 m12 l8"},kt={class:"input-field col s12 m3 l3"},At={id:"user-list-bulk-actions",class:"dropdown-content"},wt={class:"dropdown-trigger","data-target":"bulk-set-access"},Tt={id:"bulk-set-access",class:"dropdown-content"},Mt=["onClick"],Bt={key:0},_t={class:"input-field col s12 m3 l3"},Dt={class:"permissions-for-selector"},Lt={class:"input-field col s12 m3 l3"},Rt={class:"input-field col s12 m3 l3"},xt={key:0,class:"input-field col s12 m12 l4 users-list-pagination-container"},Pt={class:"usersListPagination"},Ft={class:"pointer"},Ht={class:"counter"},It={class:"pointer"},Jt={key:0,class:"roles-help-notification"},qt=["innerHTML"],$t={class:"select-cell"},Gt={class:"checkbox-container"},zt=Object(a["createElementVNode"])("span",null,null,-1),Wt={class:"first"},Yt={class:"role_header"},Xt={style:{"margin-right":"3.5px"}},Kt=Object(a["createElementVNode"])("span",{class:"icon-help"},null,-1),Qt=[Kt],Zt={key:0},en=["title"],tn={key:2},nn={class:"actions-cell-header"},sn={key:0,class:"select-all-row"},rn={colspan:"8"},an={key:0},on=["innerHTML"],ln=["innerHTML"],cn={key:1},dn=["innerHTML"],un=["innerHTML"],mn=["id"],bn={class:"select-cell"},pn={class:"checkbox-container"},gn=["id","onUpdate:modelValue"],fn=Object(a["createElementVNode"])("span",null,null,-1),hn={id:"userLogin"},jn={class:"access-cell"},On={key:0,id:"email"},vn={key:1,id:"twofa"},Cn={key:0,class:"icon-ok"},Nn={key:1,class:"icon-close"},Sn={key:2,id:"last_seen"},Un={id:"status"},yn=["title"],En={class:"center actions-cell"},Vn=["onClick"],kn=Object(a["createElementVNode"])("span",{class:"icon-email"},null,-1),An=[kn],wn=["onClick"],Tn=Object(a["createElementVNode"])("span",{class:"icon-edit"},null,-1),Mn=[Tn],Bn=["onClick"],_n=Object(a["createElementVNode"])("span",{class:"icon-delete"},null,-1),Dn=[_n],Ln={class:"delete-user-confirm-modal modal",ref:"deleteUserConfirmModal"},Rn={class:"modal-content"},xn=["innerHTML"],Pn=["innerHTML"],Fn={class:"modal-footer"},Hn={class:"change-user-role-confirm-modal modal",ref:"changeUserRoleConfirmModal"},In={class:"modal-content"},Jn=["innerHTML"],qn={key:1},$n=["innerHTML"],Gn=["innerHTML"],zn={class:"modal-footer"},Wn={class:"resend-invite-confirm-modal modal",ref:"resendInviteConfirmModal"},Yn={class:"modal-content"},Xn=["innerHTML"],Kn={class:"modal-footer"}; /*! * Matomo - free/libre analytics platform * * @link https://matomo.org * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later - */Object(i["createAngularJsAdapter"])({component:yt,scope:{user:{angularJsBind:"<"},onDoneEditing:{angularJsBind:"&",vue:"done"},currentUserRole:{angularJsBind:"<"},accessLevels:{angularJsBind:"<"},filterAccessLevels:{angularJsBind:"<"},initialSiteId:{angularJsBind:"<"},initialSiteName:{angularJsBind:"<"},onUpdated:{angularJsBind:"&",vue:"updated"}},directiveName:"piwikUserEditForm",restrict:"E"});Object(a["pushScopeId"])("data-v-2ff6c088");var Et={class:"userListFilters row"},Vt={class:"col s12 m12 l6"},kt={class:"input-field col s12 m4 l4"},At={id:"user-list-bulk-actions",class:"dropdown-content"},wt={class:"dropdown-trigger","data-target":"bulk-set-access"},Tt={id:"bulk-set-access",class:"dropdown-content"},Mt=["onClick"],Bt={key:0},_t={class:"input-field col s12 m4 l4"},Dt={class:"permissions-for-selector"},Lt={class:"input-field col s12 m4 l4"},Rt={key:0,class:"input-field col s12 m12 l6 users-list-pagination-container"},xt={class:"usersListPagination"},Pt={class:"pointer"},Ht={class:"counter"},Ft={class:"pointer"},It={key:0,class:"roles-help-notification"},Jt=["innerHTML"],qt={class:"select-cell"},$t={class:"checkbox-container"},Gt=Object(a["createElementVNode"])("span",null,null,-1),zt={class:"first"},Wt={class:"role_header"},Yt={style:{"margin-right":"3.5px"}},Xt=Object(a["createElementVNode"])("span",{class:"icon-help"},null,-1),Kt=[Xt],Qt={key:0},Zt=["title"],en={key:2},tn={class:"actions-cell-header"},nn={key:0,class:"select-all-row"},sn={colspan:"8"},rn={key:0},an=["innerHTML"],on=["innerHTML"],ln={key:1},cn=["innerHTML"],dn=["innerHTML"],un=["id"],mn={class:"select-cell"},bn={class:"checkbox-container"},pn=["id","onUpdate:modelValue"],gn=Object(a["createElementVNode"])("span",null,null,-1),hn={id:"userLogin"},fn={class:"access-cell"},jn={key:0,id:"email"},On={key:1,id:"twofa"},vn={key:0,class:"icon-ok"},Cn={key:1,class:"icon-close"},Nn={key:2,id:"last_seen"},Sn={id:"status"},Un={class:"center actions-cell"},yn=["onClick"],En=Object(a["createElementVNode"])("span",{class:"icon-email"},null,-1),Vn=[En],kn=["onClick"],An=Object(a["createElementVNode"])("span",{class:"icon-edit"},null,-1),wn=[An],Tn=["onClick"],Mn=Object(a["createElementVNode"])("span",{class:"icon-delete"},null,-1),Bn=[Mn],_n={class:"delete-user-confirm-modal modal",ref:"deleteUserConfirmModal"},Dn={class:"modal-content"},Ln=["innerHTML"],Rn=["innerHTML"],xn={class:"modal-footer"},Pn={class:"change-user-role-confirm-modal modal",ref:"changeUserRoleConfirmModal"},Hn={class:"modal-content"},Fn=["innerHTML"],In={key:1},Jn=["innerHTML"],qn=["innerHTML"],$n={class:"modal-footer"},Gn={class:"resend-invite-confirm-modal modal",ref:"resendInviteConfirmModal"},zn={class:"modal-content"},Wn=["innerHTML"],Yn={class:"modal-footer"};function Xn(e,t,n,s,r,i){var o=Object(a["resolveComponent"])("Field"),l=Object(a["resolveComponent"])("ActivityIndicator"),c=Object(a["resolveComponent"])("Notification"),d=Object(a["resolveComponent"])("ContentBlock"),u=Object(a["resolveDirective"])("dropdown-menu"),m=Object(a["resolveDirective"])("content-table");return Object(a["openBlock"])(),Object(a["createElementBlock"])("div",{class:Object(a["normalizeClass"])(["pagedUsersList",{loading:e.isLoadingUsers}])},[Object(a["createElementVNode"])("div",Et,[Object(a["createElementVNode"])("div",Vt,[Object(a["createElementVNode"])("div",kt,[Object(a["withDirectives"])(Object(a["createElementVNode"])("a",{class:Object(a["normalizeClass"])(["dropdown-trigger btn bulk-actions",{disabled:e.isBulkActionsDisabled}]),href:"","data-target":"user-list-bulk-actions"},[Object(a["createTextVNode"])(Object(a["toDisplayString"])(e.translate("UsersManager_BulkActions")),1)],2),[[u]]),Object(a["createElementVNode"])("ul",At,[Object(a["createElementVNode"])("li",null,[Object(a["withDirectives"])(Object(a["createElementVNode"])("a",wt,[Object(a["createTextVNode"])(Object(a["toDisplayString"])(e.translate("UsersManager_SetPermission")),1)],512),[[u]]),Object(a["createElementVNode"])("ul",Tt,[(Object(a["openBlock"])(!0),Object(a["createElementBlock"])(a["Fragment"],null,Object(a["renderList"])(e.bulkActionAccessLevels,(function(t){return Object(a["openBlock"])(),Object(a["createElementBlock"])("li",{key:t.key},[Object(a["createElementVNode"])("a",{href:"",onClick:Object(a["withModifiers"])((function(n){e.userToChange=null,e.roleToChangeTo=t.key,e.showAccessChangeConfirm()}),["prevent"])},Object(a["toDisplayString"])(t.value),9,Mt)])})),128))])]),Object(a["createElementVNode"])("li",null,[Object(a["createElementVNode"])("a",{href:"",onClick:t[0]||(t[0]=Object(a["withModifiers"])((function(t){e.userToChange=null,e.roleToChangeTo="noaccess",e.showAccessChangeConfirm()}),["prevent"]))},Object(a["toDisplayString"])(e.translate("UsersManager_RemovePermissions")),1)]),"superuser"===e.currentUserRole?(Object(a["openBlock"])(),Object(a["createElementBlock"])("li",Bt,[Object(a["createElementVNode"])("a",{href:"",onClick:t[1]||(t[1]=Object(a["withModifiers"])((function(t){return e.showDeleteConfirm()}),["prevent"]))},Object(a["toDisplayString"])(e.translate("UsersManager_DeleteUsers")),1)])):Object(a["createCommentVNode"])("",!0)])]),Object(a["createElementVNode"])("div",_t,[Object(a["createElementVNode"])("div",Dt,[Object(a["createVNode"])(o,{"model-value":e.userTextFilter,"onUpdate:modelValue":t[2]||(t[2]=function(t){return e.onUserTextFilterChange(t)}),name:"user-text-filter",uicontrol:"text","full-width":!0,placeholder:e.translate("UsersManager_UserSearch")},null,8,["model-value","placeholder"])])]),Object(a["createElementVNode"])("div",Lt,[Object(a["createElementVNode"])("div",null,[Object(a["createVNode"])(o,{"model-value":e.accessLevelFilter,"onUpdate:modelValue":t[3]||(t[3]=function(t){e.accessLevelFilter=t,e.changeSearch({filter_access:e.accessLevelFilter,offset:0})}),name:"access-level-filter",uicontrol:"select",options:e.filterAccessLevels,"full-width":!0,placeholder:e.translate("UsersManager_FilterByAccess")},null,8,["model-value","options","placeholder"])])])]),e.totalEntries>e.searchParams.limit?(Object(a["openBlock"])(),Object(a["createElementBlock"])("div",Rt,[Object(a["createElementVNode"])("div",xt,[Object(a["createElementVNode"])("a",{class:Object(a["normalizeClass"])(["btn prev",{disabled:e.searchParams.offset<=0}]),onClick:t[4]||(t[4]=Object(a["withModifiers"])((function(t){return e.gotoPreviousPage()}),["prevent"]))},[Object(a["createElementVNode"])("span",Pt,"« "+Object(a["toDisplayString"])(e.translate("General_Previous")),1)],2),Object(a["createElementVNode"])("div",Ht,[Object(a["createElementVNode"])("span",{class:Object(a["normalizeClass"])({visibility:e.isLoadingUsers?"hidden":"visible"})},Object(a["toDisplayString"])(e.translate("General_Pagination",e.paginationLowerBound,e.paginationUpperBound,e.totalEntries)),3),Object(a["createVNode"])(l,{loading:e.isLoadingUsers},null,8,["loading"])]),Object(a["createElementVNode"])("a",{class:Object(a["normalizeClass"])(["btn next",{disabled:e.searchParams.offset+e.searchParams.limit>=e.totalEntries}]),onClick:t[5]||(t[5]=Object(a["withModifiers"])((function(t){return e.gotoNextPage()}),["prevent"]))},[Object(a["createElementVNode"])("span",Ft,Object(a["toDisplayString"])(e.translate("General_Next"))+" »",1)],2)])])):Object(a["createCommentVNode"])("",!0)]),e.isRoleHelpToggled?(Object(a["openBlock"])(),Object(a["createElementBlock"])("div",It,[Object(a["createVNode"])(c,{context:"info",type:"persistent",noclear:!0},{default:Object(a["withCtx"])((function(){return[Object(a["createElementVNode"])("span",{innerHTML:e.$sanitize(e.rolesHelpText)},null,8,Jt)]})),_:1})])):Object(a["createCommentVNode"])("",!0),Object(a["createVNode"])(d,null,{default:Object(a["withCtx"])((function(){return[Object(a["withDirectives"])(Object(a["createElementVNode"])("table",{id:"manageUsersTable",class:Object(a["normalizeClass"])({loading:e.isLoadingUsers})},[Object(a["createElementVNode"])("thead",null,[Object(a["createElementVNode"])("tr",null,[Object(a["createElementVNode"])("th",qt,[Object(a["createElementVNode"])("span",$t,[Object(a["createElementVNode"])("label",null,[Object(a["withDirectives"])(Object(a["createElementVNode"])("input",{type:"checkbox",id:"paged_users_select_all",checked:"checked","onUpdate:modelValue":t[6]||(t[6]=function(t){return e.isAllCheckboxSelected=t}),onChange:t[7]||(t[7]=function(t){return e.onAllCheckboxChange()})},null,544),[[a["vModelCheckbox"],e.isAllCheckboxSelected]]),Gt])])]),Object(a["createElementVNode"])("th",zt,Object(a["toDisplayString"])(e.translate("UsersManager_Username")),1),Object(a["createElementVNode"])("th",Wt,[Object(a["createElementVNode"])("span",Yt,Object(a["toDisplayString"])(e.translate("UsersManager_RoleFor")),1),Object(a["createElementVNode"])("a",{href:"",class:Object(a["normalizeClass"])(["helpIcon",{sticky:e.isRoleHelpToggled}]),onClick:t[8]||(t[8]=Object(a["withModifiers"])((function(t){return e.isRoleHelpToggled=!e.isRoleHelpToggled}),["prevent"]))},Kt,2),Object(a["createElementVNode"])("div",null,[Object(a["createVNode"])(o,{class:"permissions-for-selector","model-value":e.permissionsForSite,"onUpdate:modelValue":t[9]||(t[9]=function(t){e.onPermissionsForUpdate(t)}),uicontrol:"site","ui-control-attributes":{onlySitesWithAdminAccess:"superuser"!==e.currentUserRole}},null,8,["model-value","ui-control-attributes"])])]),"superuser"===e.currentUserRole?(Object(a["openBlock"])(),Object(a["createElementBlock"])("th",Qt,Object(a["toDisplayString"])(e.translate("UsersManager_Email")),1)):Object(a["createCommentVNode"])("",!0),"superuser"===e.currentUserRole?(Object(a["openBlock"])(),Object(a["createElementBlock"])("th",{key:1,title:e.translate("UsersManager_UsesTwoFactorAuthentication")},Object(a["toDisplayString"])(e.translate("UsersManager_2FA")),9,Zt)):Object(a["createCommentVNode"])("",!0),"superuser"===e.currentUserRole?(Object(a["openBlock"])(),Object(a["createElementBlock"])("th",en,Object(a["toDisplayString"])(e.translate("UsersManager_LastSeen")),1)):Object(a["createCommentVNode"])("",!0),Object(a["createElementVNode"])("th",null,Object(a["toDisplayString"])(e.translate("UsersManager_Status")),1),Object(a["createElementVNode"])("th",tn,[Object(a["createElementVNode"])("div",null,Object(a["toDisplayString"])(e.translate("General_Actions")),1)])])]),Object(a["createElementVNode"])("tbody",null,[e.isAllCheckboxSelected&&e.users.length&&e.users.length<e.totalEntries?(Object(a["openBlock"])(),Object(a["createElementBlock"])("tr",nn,[Object(a["createElementVNode"])("td",sn,[e.areAllResultsSelected?Object(a["createCommentVNode"])("",!0):(Object(a["openBlock"])(),Object(a["createElementBlock"])("div",rn,[Object(a["createElementVNode"])("span",{innerHTML:e.$sanitize(e.translate("UsersManager_TheDisplayedUsersAreSelected","<strong>".concat(e.users.length,"</strong>"))),style:{"margin-right":"3.5px"}},null,8,an),Object(a["createElementVNode"])("a",{class:"toggle-select-all-in-search",href:"#",onClick:t[10]||(t[10]=Object(a["withModifiers"])((function(t){return e.areAllResultsSelected=!e.areAllResultsSelected}),["prevent"])),innerHTML:e.$sanitize(e.translate("UsersManager_ClickToSelectAll","<strong>".concat(e.totalEntries,"</strong>")))},null,8,on)])),e.areAllResultsSelected?(Object(a["openBlock"])(),Object(a["createElementBlock"])("div",ln,[Object(a["createElementVNode"])("span",{innerHTML:e.$sanitize(e.translate("UsersManager_AllUsersAreSelected","<strong>".concat(e.totalEntries,"</strong>"))),style:{"margin-right":"3.5px"}},null,8,cn),Object(a["createElementVNode"])("a",{class:"toggle-select-all-in-search",href:"#",onClick:t[11]||(t[11]=Object(a["withModifiers"])((function(t){return e.areAllResultsSelected=!e.areAllResultsSelected}),["prevent"])),innerHTML:e.$sanitize(e.translate("UsersManager_ClickToSelectDisplayedUsers","<strong>".concat(e.users.length,"</strong>")))},null,8,dn)])):Object(a["createCommentVNode"])("",!0)])])):Object(a["createCommentVNode"])("",!0),(Object(a["openBlock"])(!0),Object(a["createElementBlock"])(a["Fragment"],null,Object(a["renderList"])(e.users,(function(n,s){return Object(a["openBlock"])(),Object(a["createElementBlock"])("tr",{id:"row".concat(s),key:n.login},[Object(a["createElementVNode"])("td",mn,[Object(a["createElementVNode"])("span",bn,[Object(a["createElementVNode"])("label",null,[Object(a["withDirectives"])(Object(a["createElementVNode"])("input",{type:"checkbox",id:"paged_users_select_row".concat(s),"onUpdate:modelValue":function(t){return e.selectedRows[s]=t},onClick:t[12]||(t[12]=function(t){return e.onRowSelected()})},null,8,pn),[[a["vModelCheckbox"],e.selectedRows[s]]]),gn])])]),Object(a["createElementVNode"])("td",hn,Object(a["toDisplayString"])(n.login),1),Object(a["createElementVNode"])("td",fn,[Object(a["createElementVNode"])("div",null,[Object(a["createVNode"])(o,{"model-value":n.role,"onUpdate:modelValue":function(t){e.userToChange=n,e.roleToChangeTo=t,e.showAccessChangeConfirm()},disabled:"superuser"===n.role,uicontrol:"select",options:"anonymous"!==n.login?e.accessLevels:e.anonymousAccessLevels},null,8,["model-value","onUpdate:modelValue","disabled","options"])])]),"superuser"===e.currentUserRole?(Object(a["openBlock"])(),Object(a["createElementBlock"])("td",jn,Object(a["toDisplayString"])(n.email),1)):Object(a["createCommentVNode"])("",!0),"superuser"===e.currentUserRole?(Object(a["openBlock"])(),Object(a["createElementBlock"])("td",On,[n.uses_2fa?(Object(a["openBlock"])(),Object(a["createElementBlock"])("span",vn)):Object(a["createCommentVNode"])("",!0),n.uses_2fa?Object(a["createCommentVNode"])("",!0):(Object(a["openBlock"])(),Object(a["createElementBlock"])("span",Cn))])):Object(a["createCommentVNode"])("",!0),"superuser"===e.currentUserRole?(Object(a["openBlock"])(),Object(a["createElementBlock"])("td",Nn,Object(a["toDisplayString"])(n.last_seen?"".concat(n.last_seen," ago"):"-"),1)):Object(a["createCommentVNode"])("",!0),Object(a["createElementVNode"])("td",Sn,[Object(a["createElementVNode"])("span",{class:Object(a["normalizeClass"])(n.invite_status)},Object(a["toDisplayString"])(e.getInviteStatus(n.invite_status)),3)]),Object(a["createElementVNode"])("td",Un,["accept"!==n.invite_status?(Object(a["openBlock"])(),Object(a["createElementBlock"])("button",{key:0,class:"resend table-action",title:"Resend Invite",onClick:function(t){e.userToChange=n,e.showResendConfirm()}},Vn,8,yn)):Object(a["createCommentVNode"])("",!0),"anonymous"!==n.login?(Object(a["openBlock"])(),Object(a["createElementBlock"])("button",{key:1,class:"edituser table-action",title:"Edit",onClick:function(t){return e.$emit("editUser",{user:n})}},wn,8,kn)):Object(a["createCommentVNode"])("",!0),"superuser"===e.currentUserRole&&"anonymous"!==n.login?(Object(a["openBlock"])(),Object(a["createElementBlock"])("button",{key:2,class:"deleteuser table-action",title:"Delete",onClick:function(t){e.userToChange=n,e.showDeleteConfirm()}},Bn,8,Tn)):Object(a["createCommentVNode"])("",!0)])],8,un)})),128))])],2),[[m]])]})),_:1}),Object(a["createElementVNode"])("div",_n,[Object(a["createElementVNode"])("div",Dn,[e.userToChange?(Object(a["openBlock"])(),Object(a["createElementBlock"])("h3",{key:0,innerHTML:e.$sanitize(e.translate("UsersManager_DeleteUserConfirmSingle","<strong>".concat(e.userToChange.login,"</strong>")))},null,8,Ln)):Object(a["createCommentVNode"])("",!0),e.userToChange?Object(a["createCommentVNode"])("",!0):(Object(a["openBlock"])(),Object(a["createElementBlock"])("p",{key:1,innerHTML:e.$sanitize(e.translate("UsersManager_DeleteUserConfirmMultiple","<strong>".concat(e.affectedUsersCount,"</strong>")))},null,8,Rn))]),Object(a["createElementVNode"])("div",xn,[Object(a["createElementVNode"])("a",{href:"",class:"modal-action modal-close btn",onClick:t[13]||(t[13]=Object(a["withModifiers"])((function(t){return e.deleteRequestedUsers()}),["prevent"])),style:{"margin-right":"3.5px"}},Object(a["toDisplayString"])(e.translate("General_Yes")),1),Object(a["createElementVNode"])("a",{href:"",class:"modal-action modal-close modal-no",onClick:t[14]||(t[14]=Object(a["withModifiers"])((function(t){e.userToChange=null,e.roleToChangeTo=null}),["prevent"]))},Object(a["toDisplayString"])(e.translate("General_No")),1)])],512),Object(a["createElementVNode"])("div",Pn,[Object(a["createElementVNode"])("div",Hn,[e.userToChange?(Object(a["openBlock"])(),Object(a["createElementBlock"])("h3",{key:0,innerHTML:e.$sanitize(e.deleteUserPermConfirmSingleText)},null,8,Fn)):Object(a["createCommentVNode"])("",!0),e.userToChange&&"anonymous"===e.userToChange.login&&"view"===e.roleToChangeTo?(Object(a["openBlock"])(),Object(a["createElementBlock"])("h3",In,[Object(a["createElementVNode"])("em",null,[Object(a["createTextVNode"])(Object(a["toDisplayString"])(e.translate("General_Note"))+": ",1),Object(a["createElementVNode"])("span",{innerHTML:e.$sanitize(e.translate("UsersManager_AnonymousUserRoleChangeWarning","anonymous",e.getRoleDisplay(e.roleToChangeTo)))},null,8,Jn)])])):Object(a["createCommentVNode"])("",!0),e.userToChange?Object(a["createCommentVNode"])("",!0):(Object(a["openBlock"])(),Object(a["createElementBlock"])("p",{key:2,innerHTML:e.$sanitize(e.deleteUserPermConfirmMultipleText)},null,8,qn))]),Object(a["createElementVNode"])("div",$n,[Object(a["createElementVNode"])("a",{href:"",class:"modal-action modal-close btn",onClick:t[15]||(t[15]=Object(a["withModifiers"])((function(t){return e.changeUserRole()}),["prevent"])),style:{"margin-right":"3.5px"}},Object(a["toDisplayString"])(e.translate("General_Yes")),1),Object(a["createElementVNode"])("a",{href:"",class:"modal-action modal-close modal-no",onClick:t[16]||(t[16]=Object(a["withModifiers"])((function(t){e.userToChange=null,e.roleToChangeTo=null}),["prevent"]))},Object(a["toDisplayString"])(e.translate("General_No")),1)])],512),Object(a["createElementVNode"])("div",Gn,[Object(a["createElementVNode"])("div",zn,[e.userToChange?(Object(a["openBlock"])(),Object(a["createElementBlock"])("h3",{key:0,innerHTML:e.$sanitize(e.translate("UsersManager_ResendInviteConfirmSingle","<strong>".concat(e.userToChange.login,"</strong>")))},null,8,Wn)):Object(a["createCommentVNode"])("",!0)]),Object(a["createElementVNode"])("div",Yn,[Object(a["createElementVNode"])("a",{href:"",class:"modal-action modal-close btn",onClick:t[17]||(t[17]=Object(a["withModifiers"])((function(t){return e.resendRequestedUser()}),["prevent"])),style:{"margin-right":"3.5px"}},Object(a["toDisplayString"])(e.translate("General_Yes")),1),Object(a["createElementVNode"])("a",{href:"",class:"modal-action modal-close modal-no",onClick:t[18]||(t[18]=Object(a["withModifiers"])((function(t){e.userToChange=null,e.roleToChangeTo=null}),["prevent"]))},Object(a["toDisplayString"])(e.translate("General_No")),1)])],512)],2)}Object(a["popScopeId"])();var Kn=window,Qn=Kn.$,Zn=Object(a["defineComponent"])({props:{initialSiteId:{type:[String,Number],required:!0},initialSiteName:{type:String,required:!0},currentUserRole:String,isLoadingUsers:Boolean,accessLevels:{type:Array,required:!0},filterAccessLevels:{type:Array,required:!0},totalEntries:Number,users:{type:Array,required:!0},searchParams:{type:Object,required:!0}},components:{Field:h["Field"],ActivityIndicator:i["ActivityIndicator"],Notification:i["Notification"],ContentBlock:i["ContentBlock"]},directives:{DropdownMenu:i["DropdownMenu"],ContentTable:i["ContentTable"]},data:function(){return{areAllResultsSelected:!1,selectedRows:{},isAllCheckboxSelected:!1,isBulkActionsDisabled:!0,userToChange:null,roleToChangeTo:null,accessLevelFilter:null,isRoleHelpToggled:!1,userTextFilter:"",permissionsForSite:{id:this.initialSiteId,name:this.initialSiteName}}},emits:["editUser","changeUserRole","deleteUser","searchChange","resendInvite"],created:function(){this.onUserTextFilterChange=Object(i["debounce"])(this.onUserTextFilterChange,300)},watch:{users:function(){this.clearSelection()}},methods:{getInviteStatus:function(e){return"accept"===e?Object(i["translate"])("UsersManager_Active"):"pending"===e?Object(i["translate"])("UsersManager_Pending"):"expired"===e?Object(i["translate"])("UsersManager_Expired"):Object(i["translate"])("UsersManager_Decline")},onPermissionsForUpdate:function(e){this.permissionsForSite=e,this.changeSearch({idSite:this.permissionsForSite.id})},clearSelection:function(){this.selectedRows={},this.areAllResultsSelected=!1,this.isBulkActionsDisabled=!0,this.isAllCheckboxSelected=!1,this.userToChange=null},onAllCheckboxChange:function(){if(this.isAllCheckboxSelected){for(var e=0;e!==this.users.length;e+=1)this.selectedRows[e]=!0;this.isBulkActionsDisabled=!1}else this.clearSelection()},changeUserRole:function(){this.$emit("changeUserRole",{users:this.userOperationSubject,role:this.roleToChangeTo})},onRowSelected:function(){var e=this;setTimeout((function(){var t=e.selectedCount;e.isBulkActionsDisabled=0===t,e.isAllCheckboxSelected=t===e.users.length}))},deleteRequestedUsers:function(){this.$emit("deleteUser",{users:this.userOperationSubject})},resendRequestedUser:function(){this.$emit("resendInvite",{user:this.userToChange})},showDeleteConfirm:function(){Qn(this.$refs.deleteUserConfirmModal).modal({dismissible:!1}).modal("open")},showResendConfirm:function(){Qn(this.$refs.resendInviteConfirmModal).modal({dismissible:!1}).modal("open")},showAccessChangeConfirm:function(){Qn(this.$refs.changeUserRoleConfirmModal).modal({dismissible:!1}).modal("open")},getRoleDisplay:function(e){var t=null;return this.accessLevels.forEach((function(n){n.key===e&&(t=n.value)})),t},changeSearch:function(e){var t=Object.assign(Object.assign({},this.searchParams),e);this.$emit("searchChange",{params:t})},gotoPreviousPage:function(){this.changeSearch({offset:Math.max(0,this.searchParams.offset-this.searchParams.limit)})},gotoNextPage:function(){var e=this.searchParams.offset+this.searchParams.limit;e>=this.totalEntries||this.changeSearch({offset:e})},onUserTextFilterChange:function(e){this.userTextFilter=e,this.changeSearch({filter_search:e,offset:0})}},computed:{paginationLowerBound:function(){return this.searchParams.offset+1},paginationUpperBound:function(){if(null===this.totalEntries)return"?";var e=this.searchParams;return Math.min(e.offset+e.limit,this.totalEntries)},userOperationSubject:function(){return this.userToChange?[this.userToChange]:this.areAllResultsSelected?"all":this.selectedUsers},selectedUsers:function(){var e=this,t=this.users,n=[];return Object.keys(this.selectedRows).forEach((function(s){var r=parseInt(s,10);e.selectedRows[s]&&t[r]&&n.push(t[r])})),n},rolesHelpText:function(){var e="https://matomo.org/faq/general/faq_70/",t="https://matomo.org/faq/general/faq_69/";return Object(i["translate"])("UsersManager_RolesHelp",'<a href="'.concat(e,'" target="_blank" rel="noreferrer noopener">'),"</a>",'<a href="'.concat(t,'" target="_blank" rel="noreferrer noopener">'),"</a>")},affectedUsersCount:function(){return this.areAllResultsSelected?this.totalEntries||0:this.selectedCount},selectedCount:function(){var e=this,t=0;return Object.keys(this.selectedRows).forEach((function(n){e.selectedRows[n]&&(t+=1)})),t},deleteUserPermConfirmSingleText:function(){var e,t;return Object(i["translate"])("UsersManager_DeleteUserPermConfirmSingle","<strong>".concat((null===(e=this.userToChange)||void 0===e?void 0:e.login)||"","</strong>"),"<strong>".concat(this.getRoleDisplay(this.roleToChangeTo),"</strong>"),"<strong>".concat(i["Matomo"].helper.htmlEntities((null===(t=this.permissionsForSite)||void 0===t?void 0:t.name)||""),"</strong>"))},deleteUserPermConfirmMultipleText:function(){var e;return Object(i["translate"])("UsersManager_DeleteUserPermConfirmMultiple","<strong>".concat(this.affectedUsersCount,"</strong>"),"<strong>".concat(this.getRoleDisplay(this.roleToChangeTo),"</strong>"),"<strong>".concat(i["Matomo"].helper.htmlEntities((null===(e=this.permissionsForSite)||void 0===e?void 0:e.name)||""),"</strong>"))},bulkActionAccessLevels:function(){return this.accessLevels.filter((function(e){return"noaccess"!==e.key&&"superuser"!==e.key}))},anonymousAccessLevels:function(){return this.accessLevels.filter((function(e){return"noaccess"===e.key||"view"===e.key}))}}});n("f2d6");Zn.render=Xn,Zn.__scopeId="data-v-2ff6c088";var es=Zn,ts=(Object(i["createAngularJsAdapter"])({component:es,scope:{onEditUser:{angularJsBind:"&",vue:"editUser"},onChangeUserRole:{angularJsBind:"&",vue:"changeUserRole"},onDeleteUser:{angularJsBind:"&",vue:"deleteUser"},onSearchChange:{angularJsBind:"&",vue:"searchChange"},onResendInvite:{angularJsBind:"&",vue:"resendInvite"},initialSiteId:{angularJsBind:"<"},initialSiteName:{angularJsBind:"<"},currentUserRole:{angularJsBind:"<"},isLoadingUsers:{angularJsBind:"<"},accessLevels:{angularJsBind:"<"},filterAccessLevels:{angularJsBind:"<"},totalEntries:{angularJsBind:"<"},users:{angularJsBind:"<"},searchParams:{angularJsBind:"<"}},directiveName:"piwikPagedUsersList",restrict:"E"}),{class:"usersManager"}),ns={key:0},ss={key:1},rs={class:"row add-user-container"},is={class:"col s12"},as={class:"input-field",style:{"margin-right":"3.5px"}},os={key:0,class:"input-field"},ls={key:0},cs={class:"add-existing-user-modal modal",ref:"addExistingUserModal"},ds={class:"modal-content"},us={class:"modal-footer"}; + */function Qn(e,t,n,s,r,i){var o=Object(a["resolveComponent"])("Field"),l=Object(a["resolveComponent"])("ActivityIndicator"),c=Object(a["resolveComponent"])("Notification"),d=Object(a["resolveComponent"])("ContentBlock"),u=Object(a["resolveDirective"])("dropdown-menu"),m=Object(a["resolveDirective"])("content-table");return Object(a["openBlock"])(),Object(a["createElementBlock"])("div",{class:Object(a["normalizeClass"])(["pagedUsersList",{loading:e.isLoadingUsers}])},[Object(a["createElementVNode"])("div",Et,[Object(a["createElementVNode"])("div",Vt,[Object(a["createElementVNode"])("div",kt,[Object(a["withDirectives"])(Object(a["createElementVNode"])("a",{class:Object(a["normalizeClass"])(["dropdown-trigger btn bulk-actions",{disabled:e.isBulkActionsDisabled}]),href:"","data-target":"user-list-bulk-actions"},[Object(a["createTextVNode"])(Object(a["toDisplayString"])(e.translate("UsersManager_BulkActions")),1)],2),[[u]]),Object(a["createElementVNode"])("ul",At,[Object(a["createElementVNode"])("li",null,[Object(a["withDirectives"])(Object(a["createElementVNode"])("a",wt,[Object(a["createTextVNode"])(Object(a["toDisplayString"])(e.translate("UsersManager_SetPermission")),1)],512),[[u]]),Object(a["createElementVNode"])("ul",Tt,[(Object(a["openBlock"])(!0),Object(a["createElementBlock"])(a["Fragment"],null,Object(a["renderList"])(e.bulkActionAccessLevels,(function(t){return Object(a["openBlock"])(),Object(a["createElementBlock"])("li",{key:t.key},[Object(a["createElementVNode"])("a",{href:"",onClick:Object(a["withModifiers"])((function(n){e.userToChange=null,e.roleToChangeTo=t.key,e.showAccessChangeConfirm()}),["prevent"])},Object(a["toDisplayString"])(t.value),9,Mt)])})),128))])]),Object(a["createElementVNode"])("li",null,[Object(a["createElementVNode"])("a",{href:"",onClick:t[0]||(t[0]=Object(a["withModifiers"])((function(t){e.userToChange=null,e.roleToChangeTo="noaccess",e.showAccessChangeConfirm()}),["prevent"]))},Object(a["toDisplayString"])(e.translate("UsersManager_RemovePermissions")),1)]),"superuser"===e.currentUserRole?(Object(a["openBlock"])(),Object(a["createElementBlock"])("li",Bt,[Object(a["createElementVNode"])("a",{href:"",onClick:t[1]||(t[1]=Object(a["withModifiers"])((function(t){return e.showDeleteConfirm()}),["prevent"]))},Object(a["toDisplayString"])(e.translate("UsersManager_DeleteUsers")),1)])):Object(a["createCommentVNode"])("",!0)])]),Object(a["createElementVNode"])("div",_t,[Object(a["createElementVNode"])("div",Dt,[Object(a["createVNode"])(o,{"model-value":e.userTextFilter,"onUpdate:modelValue":t[2]||(t[2]=function(t){return e.onUserTextFilterChange(t)}),name:"user-text-filter",uicontrol:"text","full-width":!0,placeholder:e.translate("UsersManager_UserSearch")},null,8,["model-value","placeholder"])])]),Object(a["createElementVNode"])("div",Lt,[Object(a["createElementVNode"])("div",null,[Object(a["createVNode"])(o,{"model-value":e.accessLevelFilter,"onUpdate:modelValue":t[3]||(t[3]=function(t){e.accessLevelFilter=t,e.changeSearch({filter_access:e.accessLevelFilter,offset:0})}),name:"access-level-filter",uicontrol:"select",options:e.filterAccessLevels,"full-width":!0,placeholder:e.translate("UsersManager_FilterByAccess")},null,8,["model-value","options","placeholder"])])]),Object(a["createElementVNode"])("div",Rt,[Object(a["createElementVNode"])("div",null,[Object(a["createVNode"])(o,{"model-value":e.statusLevelFilter,"onUpdate:modelValue":t[4]||(t[4]=function(t){e.statusLevelFilter=t,e.changeSearch({filter_status:e.statusLevelFilter,offset:0})}),name:"status-level-filter",uicontrol:"select",options:e.filterStatusLevels,"full-width":!0,placeholder:e.translate("UsersManager_FilterByStatus")},null,8,["model-value","options","placeholder"])])])]),e.totalEntries>e.searchParams.limit?(Object(a["openBlock"])(),Object(a["createElementBlock"])("div",xt,[Object(a["createElementVNode"])("div",Pt,[Object(a["createElementVNode"])("a",{class:Object(a["normalizeClass"])(["btn prev",{disabled:e.searchParams.offset<=0}]),onClick:t[5]||(t[5]=Object(a["withModifiers"])((function(t){return e.gotoPreviousPage()}),["prevent"]))},[Object(a["createElementVNode"])("span",Ft,"« "+Object(a["toDisplayString"])(e.translate("General_Previous")),1)],2),Object(a["createElementVNode"])("div",Ht,[Object(a["createElementVNode"])("span",{class:Object(a["normalizeClass"])({visibility:e.isLoadingUsers?"hidden":"visible"})},Object(a["toDisplayString"])(e.translate("General_Pagination",e.paginationLowerBound,e.paginationUpperBound,e.totalEntries)),3),Object(a["createVNode"])(l,{loading:e.isLoadingUsers},null,8,["loading"])]),Object(a["createElementVNode"])("a",{class:Object(a["normalizeClass"])(["btn next",{disabled:e.searchParams.offset+e.searchParams.limit>=e.totalEntries}]),onClick:t[6]||(t[6]=Object(a["withModifiers"])((function(t){return e.gotoNextPage()}),["prevent"]))},[Object(a["createElementVNode"])("span",It,Object(a["toDisplayString"])(e.translate("General_Next"))+" »",1)],2)])])):Object(a["createCommentVNode"])("",!0)]),e.isRoleHelpToggled?(Object(a["openBlock"])(),Object(a["createElementBlock"])("div",Jt,[Object(a["createVNode"])(c,{context:"info",type:"persistent",noclear:!0},{default:Object(a["withCtx"])((function(){return[Object(a["createElementVNode"])("span",{innerHTML:e.$sanitize(e.rolesHelpText)},null,8,qt)]})),_:1})])):Object(a["createCommentVNode"])("",!0),Object(a["createVNode"])(d,null,{default:Object(a["withCtx"])((function(){return[Object(a["withDirectives"])(Object(a["createElementVNode"])("table",{id:"manageUsersTable",class:Object(a["normalizeClass"])({loading:e.isLoadingUsers})},[Object(a["createElementVNode"])("thead",null,[Object(a["createElementVNode"])("tr",null,[Object(a["createElementVNode"])("th",$t,[Object(a["createElementVNode"])("span",Gt,[Object(a["createElementVNode"])("label",null,[Object(a["withDirectives"])(Object(a["createElementVNode"])("input",{type:"checkbox",id:"paged_users_select_all",checked:"checked","onUpdate:modelValue":t[7]||(t[7]=function(t){return e.isAllCheckboxSelected=t}),onChange:t[8]||(t[8]=function(t){return e.onAllCheckboxChange()})},null,544),[[a["vModelCheckbox"],e.isAllCheckboxSelected]]),zt])])]),Object(a["createElementVNode"])("th",Wt,Object(a["toDisplayString"])(e.translate("UsersManager_Username")),1),Object(a["createElementVNode"])("th",Yt,[Object(a["createElementVNode"])("span",Xt,Object(a["toDisplayString"])(e.translate("UsersManager_RoleFor")),1),Object(a["createElementVNode"])("a",{href:"",class:Object(a["normalizeClass"])(["helpIcon",{sticky:e.isRoleHelpToggled}]),onClick:t[9]||(t[9]=Object(a["withModifiers"])((function(t){return e.isRoleHelpToggled=!e.isRoleHelpToggled}),["prevent"]))},Qt,2),Object(a["createElementVNode"])("div",null,[Object(a["createVNode"])(o,{class:"permissions-for-selector","model-value":e.permissionsForSite,"onUpdate:modelValue":t[10]||(t[10]=function(t){e.onPermissionsForUpdate(t)}),uicontrol:"site","ui-control-attributes":{onlySitesWithAdminAccess:"superuser"!==e.currentUserRole}},null,8,["model-value","ui-control-attributes"])])]),"superuser"===e.currentUserRole?(Object(a["openBlock"])(),Object(a["createElementBlock"])("th",Zt,Object(a["toDisplayString"])(e.translate("UsersManager_Email")),1)):Object(a["createCommentVNode"])("",!0),"superuser"===e.currentUserRole?(Object(a["openBlock"])(),Object(a["createElementBlock"])("th",{key:1,title:e.translate("UsersManager_UsesTwoFactorAuthentication")},Object(a["toDisplayString"])(e.translate("UsersManager_2FA")),9,en)):Object(a["createCommentVNode"])("",!0),"superuser"===e.currentUserRole?(Object(a["openBlock"])(),Object(a["createElementBlock"])("th",tn,Object(a["toDisplayString"])(e.translate("UsersManager_LastSeen")),1)):Object(a["createCommentVNode"])("",!0),Object(a["createElementVNode"])("th",null,Object(a["toDisplayString"])(e.translate("UsersManager_Status")),1),Object(a["createElementVNode"])("th",nn,[Object(a["createElementVNode"])("div",null,Object(a["toDisplayString"])(e.translate("General_Actions")),1)])])]),Object(a["createElementVNode"])("tbody",null,[e.isAllCheckboxSelected&&e.users.length&&e.users.length<e.totalEntries?(Object(a["openBlock"])(),Object(a["createElementBlock"])("tr",sn,[Object(a["createElementVNode"])("td",rn,[e.areAllResultsSelected?Object(a["createCommentVNode"])("",!0):(Object(a["openBlock"])(),Object(a["createElementBlock"])("div",an,[Object(a["createElementVNode"])("span",{innerHTML:e.$sanitize(e.translate("UsersManager_TheDisplayedUsersAreSelected","<strong>".concat(e.users.length,"</strong>"))),style:{"margin-right":"3.5px"}},null,8,on),Object(a["createElementVNode"])("a",{class:"toggle-select-all-in-search",href:"#",onClick:t[11]||(t[11]=Object(a["withModifiers"])((function(t){return e.areAllResultsSelected=!e.areAllResultsSelected}),["prevent"])),innerHTML:e.$sanitize(e.translate("UsersManager_ClickToSelectAll","<strong>".concat(e.totalEntries,"</strong>")))},null,8,ln)])),e.areAllResultsSelected?(Object(a["openBlock"])(),Object(a["createElementBlock"])("div",cn,[Object(a["createElementVNode"])("span",{innerHTML:e.$sanitize(e.translate("UsersManager_AllUsersAreSelected","<strong>".concat(e.totalEntries,"</strong>"))),style:{"margin-right":"3.5px"}},null,8,dn),Object(a["createElementVNode"])("a",{class:"toggle-select-all-in-search",href:"#",onClick:t[12]||(t[12]=Object(a["withModifiers"])((function(t){return e.areAllResultsSelected=!e.areAllResultsSelected}),["prevent"])),innerHTML:e.$sanitize(e.translate("UsersManager_ClickToSelectDisplayedUsers","<strong>".concat(e.users.length,"</strong>")))},null,8,un)])):Object(a["createCommentVNode"])("",!0)])])):Object(a["createCommentVNode"])("",!0),(Object(a["openBlock"])(!0),Object(a["createElementBlock"])(a["Fragment"],null,Object(a["renderList"])(e.users,(function(n,s){return Object(a["openBlock"])(),Object(a["createElementBlock"])("tr",{id:"row".concat(s),key:n.login},[Object(a["createElementVNode"])("td",bn,[Object(a["createElementVNode"])("span",pn,[Object(a["createElementVNode"])("label",null,[Object(a["withDirectives"])(Object(a["createElementVNode"])("input",{type:"checkbox",id:"paged_users_select_row".concat(s),"onUpdate:modelValue":function(t){return e.selectedRows[s]=t},onClick:t[13]||(t[13]=function(t){return e.onRowSelected()})},null,8,gn),[[a["vModelCheckbox"],e.selectedRows[s]]]),fn])])]),Object(a["createElementVNode"])("td",hn,Object(a["toDisplayString"])(n.login),1),Object(a["createElementVNode"])("td",jn,[Object(a["createElementVNode"])("div",null,[Object(a["createVNode"])(o,{"model-value":n.role,"onUpdate:modelValue":function(t){e.userToChange=n,e.roleToChangeTo=t,e.showAccessChangeConfirm()},disabled:"superuser"===n.role,uicontrol:"select",options:"anonymous"!==n.login?e.accessLevels:e.anonymousAccessLevels},null,8,["model-value","onUpdate:modelValue","disabled","options"])])]),"superuser"===e.currentUserRole?(Object(a["openBlock"])(),Object(a["createElementBlock"])("td",On,Object(a["toDisplayString"])(n.email),1)):Object(a["createCommentVNode"])("",!0),"superuser"===e.currentUserRole?(Object(a["openBlock"])(),Object(a["createElementBlock"])("td",vn,[n.uses_2fa?(Object(a["openBlock"])(),Object(a["createElementBlock"])("span",Cn)):Object(a["createCommentVNode"])("",!0),n.uses_2fa?Object(a["createCommentVNode"])("",!0):(Object(a["openBlock"])(),Object(a["createElementBlock"])("span",Nn))])):Object(a["createCommentVNode"])("",!0),"superuser"===e.currentUserRole?(Object(a["openBlock"])(),Object(a["createElementBlock"])("td",Sn,Object(a["toDisplayString"])(n.last_seen?"".concat(n.last_seen," ago"):"-"),1)):Object(a["createCommentVNode"])("",!0),Object(a["createElementVNode"])("td",Un,[Object(a["createElementVNode"])("span",{class:Object(a["normalizeClass"])(Number.isInteger(n.invite_status)?"pending":n.invite_status),title:"expired"===n.invite_status?e.translate("UsersManager_ExpiredInviteAutomaticallyRemoved","3"):""},Object(a["toDisplayString"])(e.getInviteStatus(n.invite_status)),11,yn)]),Object(a["createElementVNode"])("td",En,[("superuser"===e.currentUserRole||"admin"===e.currentUserRole&&n.invited_by===e.currentUserLogin)&&"active"!==n.invite_status?(Object(a["openBlock"])(),Object(a["createElementBlock"])("button",{key:0,class:"resend table-action",title:"Resend Invite",onClick:function(t){e.userToChange=n,e.showResendConfirm()}},An,8,Vn)):Object(a["createCommentVNode"])("",!0),"anonymous"!==n.login?(Object(a["openBlock"])(),Object(a["createElementBlock"])("button",{key:1,class:"edituser table-action",title:"Edit",onClick:function(t){return e.$emit("editUser",{user:n})}},Mn,8,wn)):Object(a["createCommentVNode"])("",!0),("superuser"===e.currentUserRole||"admin"===e.currentUserRole&&n.invited_by===e.currentUserLogin)&&"anonymous"!==n.login?(Object(a["openBlock"])(),Object(a["createElementBlock"])("button",{key:2,class:"deleteuser table-action",title:"Delete",onClick:function(t){e.userToChange=n,e.showDeleteConfirm()}},Dn,8,Bn)):Object(a["createCommentVNode"])("",!0)])],8,mn)})),128))])],2),[[m]])]})),_:1}),Object(a["createElementVNode"])("div",Ln,[Object(a["createElementVNode"])("div",Rn,[e.userToChange?(Object(a["openBlock"])(),Object(a["createElementBlock"])("h3",{key:0,innerHTML:e.$sanitize(e.translate("UsersManager_DeleteUserConfirmSingle","<strong>".concat(e.userToChange.login,"</strong>")))},null,8,xn)):Object(a["createCommentVNode"])("",!0),e.userToChange?Object(a["createCommentVNode"])("",!0):(Object(a["openBlock"])(),Object(a["createElementBlock"])("p",{key:1,innerHTML:e.$sanitize(e.translate("UsersManager_DeleteUserConfirmMultiple","<strong>".concat(e.affectedUsersCount,"</strong>")))},null,8,Pn))]),Object(a["createElementVNode"])("div",Fn,[Object(a["createElementVNode"])("a",{href:"",class:"modal-action modal-close btn",onClick:t[14]||(t[14]=Object(a["withModifiers"])((function(t){return e.deleteRequestedUsers()}),["prevent"])),style:{"margin-right":"3.5px"}},Object(a["toDisplayString"])(e.translate("General_Yes")),1),Object(a["createElementVNode"])("a",{href:"",class:"modal-action modal-close modal-no",onClick:t[15]||(t[15]=Object(a["withModifiers"])((function(t){e.userToChange=null,e.roleToChangeTo=null}),["prevent"]))},Object(a["toDisplayString"])(e.translate("General_No")),1)])],512),Object(a["createElementVNode"])("div",Hn,[Object(a["createElementVNode"])("div",In,[e.userToChange?(Object(a["openBlock"])(),Object(a["createElementBlock"])("h3",{key:0,innerHTML:e.$sanitize(e.deleteUserPermConfirmSingleText)},null,8,Jn)):Object(a["createCommentVNode"])("",!0),e.userToChange&&"anonymous"===e.userToChange.login&&"view"===e.roleToChangeTo?(Object(a["openBlock"])(),Object(a["createElementBlock"])("h3",qn,[Object(a["createElementVNode"])("em",null,[Object(a["createTextVNode"])(Object(a["toDisplayString"])(e.translate("General_Note"))+": ",1),Object(a["createElementVNode"])("span",{innerHTML:e.$sanitize(e.translate("UsersManager_AnonymousUserRoleChangeWarning","anonymous",e.getRoleDisplay(e.roleToChangeTo)))},null,8,$n)])])):Object(a["createCommentVNode"])("",!0),e.userToChange?Object(a["createCommentVNode"])("",!0):(Object(a["openBlock"])(),Object(a["createElementBlock"])("p",{key:2,innerHTML:e.$sanitize(e.deleteUserPermConfirmMultipleText)},null,8,Gn))]),Object(a["createElementVNode"])("div",zn,[Object(a["createElementVNode"])("a",{href:"",class:"modal-action modal-close btn",onClick:t[16]||(t[16]=Object(a["withModifiers"])((function(t){return e.changeUserRole()}),["prevent"])),style:{"margin-right":"3.5px"}},Object(a["toDisplayString"])(e.translate("General_Yes")),1),Object(a["createElementVNode"])("a",{href:"",class:"modal-action modal-close modal-no",onClick:t[17]||(t[17]=Object(a["withModifiers"])((function(t){e.userToChange=null,e.roleToChangeTo=null}),["prevent"]))},Object(a["toDisplayString"])(e.translate("General_No")),1)])],512),Object(a["createElementVNode"])("div",Wn,[Object(a["createElementVNode"])("div",Yn,[e.userToChange?(Object(a["openBlock"])(),Object(a["createElementBlock"])("h3",{key:0,innerHTML:e.$sanitize(e.translate("UsersManager_ResendInviteConfirmSingle","<strong>".concat(e.userToChange.login,"</strong>")))},null,8,Xn)):Object(a["createCommentVNode"])("",!0)]),Object(a["createElementVNode"])("div",Kn,[Object(a["createElementVNode"])("a",{href:"",class:"modal-action modal-close btn",onClick:t[18]||(t[18]=Object(a["withModifiers"])((function(t){return e.resendRequestedUser()}),["prevent"])),style:{"margin-right":"3.5px"}},Object(a["toDisplayString"])(e.translate("General_Yes")),1),Object(a["createElementVNode"])("a",{href:"",class:"modal-action modal-close modal-no",onClick:t[19]||(t[19]=Object(a["withModifiers"])((function(t){e.userToChange=null,e.roleToChangeTo=null}),["prevent"]))},Object(a["toDisplayString"])(e.translate("General_No")),1)])],512)],2)}var Zn=window,es=Zn.$,ts=Object(a["defineComponent"])({props:{initialSiteId:{type:[String,Number],required:!0},initialSiteName:{type:String,required:!0},currentUserRole:String,isLoadingUsers:Boolean,accessLevels:{type:Array,required:!0},filterAccessLevels:{type:Array,required:!0},filterStatusLevels:{type:Array,required:!0},totalEntries:Number,users:{type:Array,required:!0},searchParams:{type:Object,required:!0}},components:{Field:f["Field"],ActivityIndicator:i["ActivityIndicator"],Notification:i["Notification"],ContentBlock:i["ContentBlock"]},directives:{DropdownMenu:i["DropdownMenu"],ContentTable:i["ContentTable"]},data:function(){return{areAllResultsSelected:!1,selectedRows:{},isAllCheckboxSelected:!1,isBulkActionsDisabled:!0,userToChange:null,roleToChangeTo:null,accessLevelFilter:null,statusLevelFilter:null,isRoleHelpToggled:!1,userTextFilter:"",permissionsForSite:{id:this.initialSiteId,name:this.initialSiteName}}},emits:["editUser","changeUserRole","deleteUser","searchChange","resendInvite"],created:function(){this.onUserTextFilterChange=Object(i["debounce"])(this.onUserTextFilterChange,300)},watch:{users:function(){this.clearSelection()}},methods:{getInviteStatus:function(e){return Number.isInteger(e)?Object(i["translate"])("UsersManager_InviteDayLeft",e):"expired"===e?Object(i["translate"])("UsersManager_Expired"):Object(i["translate"])("UsersManager_Active")},onPermissionsForUpdate:function(e){this.permissionsForSite=e,this.changeSearch({idSite:this.permissionsForSite.id})},clearSelection:function(){this.selectedRows={},this.areAllResultsSelected=!1,this.isBulkActionsDisabled=!0,this.isAllCheckboxSelected=!1,this.userToChange=null},onAllCheckboxChange:function(){if(this.isAllCheckboxSelected){for(var e=0;e!==this.users.length;e+=1)this.selectedRows[e]=!0;this.isBulkActionsDisabled=!1}else this.clearSelection()},changeUserRole:function(){this.$emit("changeUserRole",{users:this.userOperationSubject,role:this.roleToChangeTo})},onRowSelected:function(){var e=this;setTimeout((function(){var t=e.selectedCount;e.isBulkActionsDisabled=0===t,e.isAllCheckboxSelected=t===e.users.length}))},deleteRequestedUsers:function(){this.$emit("deleteUser",{users:this.userOperationSubject})},resendRequestedUser:function(){this.$emit("resendInvite",{user:this.userToChange})},showDeleteConfirm:function(){es(this.$refs.deleteUserConfirmModal).modal({dismissible:!1}).modal("open")},showResendConfirm:function(){es(this.$refs.resendInviteConfirmModal).modal({dismissible:!1}).modal("open")},showAccessChangeConfirm:function(){es(this.$refs.changeUserRoleConfirmModal).modal({dismissible:!1}).modal("open")},getRoleDisplay:function(e){var t=null;return this.accessLevels.forEach((function(n){n.key===e&&(t=n.value)})),t},changeSearch:function(e){var t=Object.assign(Object.assign({},this.searchParams),e);this.$emit("searchChange",{params:t})},gotoPreviousPage:function(){this.changeSearch({offset:Math.max(0,this.searchParams.offset-this.searchParams.limit)})},gotoNextPage:function(){var e=this.searchParams.offset+this.searchParams.limit;e>=this.totalEntries||this.changeSearch({offset:e})},onUserTextFilterChange:function(e){this.userTextFilter=e,this.changeSearch({filter_search:e,offset:0})}},computed:{currentUserLogin:function(){return i["Matomo"].userLogin},paginationLowerBound:function(){return this.searchParams.offset+1},paginationUpperBound:function(){if(null===this.totalEntries)return"?";var e=this.searchParams;return Math.min(e.offset+e.limit,this.totalEntries)},userOperationSubject:function(){return this.userToChange?[this.userToChange]:this.areAllResultsSelected?"all":this.selectedUsers},selectedUsers:function(){var e=this,t=this.users,n=[];return Object.keys(this.selectedRows).forEach((function(s){var r=parseInt(s,10);e.selectedRows[s]&&t[r]&&n.push(t[r])})),n},rolesHelpText:function(){var e="https://matomo.org/faq/general/faq_70/",t="https://matomo.org/faq/general/faq_69/";return Object(i["translate"])("UsersManager_RolesHelp",'<a href="'.concat(e,'" target="_blank" rel="noreferrer noopener">'),"</a>",'<a href="'.concat(t,'" target="_blank" rel="noreferrer noopener">'),"</a>")},affectedUsersCount:function(){return this.areAllResultsSelected?this.totalEntries||0:this.selectedCount},selectedCount:function(){var e=this,t=0;return Object.keys(this.selectedRows).forEach((function(n){e.selectedRows[n]&&(t+=1)})),t},deleteUserPermConfirmSingleText:function(){var e,t;return Object(i["translate"])("UsersManager_DeleteUserPermConfirmSingle","<strong>".concat((null===(e=this.userToChange)||void 0===e?void 0:e.login)||"","</strong>"),"<strong>".concat(this.getRoleDisplay(this.roleToChangeTo),"</strong>"),"<strong>".concat(i["Matomo"].helper.htmlEntities((null===(t=this.permissionsForSite)||void 0===t?void 0:t.name)||""),"</strong>"))},deleteUserPermConfirmMultipleText:function(){var e;return Object(i["translate"])("UsersManager_DeleteUserPermConfirmMultiple","<strong>".concat(this.affectedUsersCount,"</strong>"),"<strong>".concat(this.getRoleDisplay(this.roleToChangeTo),"</strong>"),"<strong>".concat(i["Matomo"].helper.htmlEntities((null===(e=this.permissionsForSite)||void 0===e?void 0:e.name)||""),"</strong>"))},bulkActionAccessLevels:function(){return this.accessLevels.filter((function(e){return"noaccess"!==e.key&&"superuser"!==e.key}))},anonymousAccessLevels:function(){return this.accessLevels.filter((function(e){return"noaccess"===e.key||"view"===e.key}))}}});ts.render=Qn;var ns=ts,ss=(Object(i["createAngularJsAdapter"])({component:ns,scope:{onEditUser:{angularJsBind:"&",vue:"editUser"},onChangeUserRole:{angularJsBind:"&",vue:"changeUserRole"},onDeleteUser:{angularJsBind:"&",vue:"deleteUser"},onSearchChange:{angularJsBind:"&",vue:"searchChange"},onResendInvite:{angularJsBind:"&",vue:"resendInvite"},initialSiteId:{angularJsBind:"<"},initialSiteName:{angularJsBind:"<"},currentUserRole:{angularJsBind:"<"},isLoadingUsers:{angularJsBind:"<"},accessLevels:{angularJsBind:"<"},filterAccessLevels:{angularJsBind:"<"},totalEntries:{angularJsBind:"<"},users:{angularJsBind:"<"},searchParams:{angularJsBind:"<"}},directiveName:"piwikPagedUsersList",restrict:"E"}),{class:"usersManager"}),rs={key:0},is={key:1},as={class:"row add-user-container"},os={class:"col s12"},ls={class:"input-field",style:{"margin-right":"3.5px"}},cs={key:0,class:"input-field"},ds={key:0},us={class:"add-existing-user-modal modal",ref:"addExistingUserModal"},ms={class:"modal-content"},bs={class:"modal-footer"}; /*! * Matomo - free/libre analytics platform * * @link https://matomo.org * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later - */function ms(e,t,n,s,r,i){var o=Object(a["resolveComponent"])("EnrichedHeadline"),l=Object(a["resolveComponent"])("PagedUsersList"),c=Object(a["resolveComponent"])("UserEditForm"),d=Object(a["resolveComponent"])("Field"),u=Object(a["resolveDirective"])("content-intro"),m=Object(a["resolveDirective"])("tooltips");return Object(a["withDirectives"])((Object(a["openBlock"])(),Object(a["createElementBlock"])("div",ts,[Object(a["withDirectives"])(Object(a["createElementVNode"])("div",null,[Object(a["withDirectives"])(Object(a["createElementVNode"])("div",null,[Object(a["createElementVNode"])("h2",null,[Object(a["createVNode"])(o,{"help-url":"https://matomo.org/docs/manage-users/","feature-name":"Users Management"},{default:Object(a["withCtx"])((function(){return[Object(a["createTextVNode"])(Object(a["toDisplayString"])(e.translate("UsersManager_ManageUsers")),1)]})),_:1})]),"superuser"===e.currentUserRole?(Object(a["openBlock"])(),Object(a["createElementBlock"])("p",ns,Object(a["toDisplayString"])(e.translate("UsersManager_ManageUsersDesc")),1)):Object(a["createCommentVNode"])("",!0),"admin"===e.currentUserRole?(Object(a["openBlock"])(),Object(a["createElementBlock"])("p",ss,Object(a["toDisplayString"])(e.translate("UsersManager_ManageUsersAdminDesc")),1)):Object(a["createCommentVNode"])("",!0),Object(a["createElementVNode"])("div",rs,[Object(a["createElementVNode"])("div",is,[Object(a["createElementVNode"])("div",as,[Object(a["createElementVNode"])("a",{class:"btn add-new-user",onClick:t[0]||(t[0]=function(t){return e.onAddNewUser()})},Object(a["toDisplayString"])(e.translate("UsersManager_InviteNewUser")),1)]),"superuser"!==e.currentUserRole?(Object(a["openBlock"])(),Object(a["createElementBlock"])("div",os,[Object(a["createElementVNode"])("a",{class:"btn add-existing-user",onClick:t[1]||(t[1]=function(t){return e.showAddExistingUserModal()})},Object(a["toDisplayString"])(e.translate("UsersManager_AddExistingUser")),1)])):Object(a["createCommentVNode"])("",!0)])]),Object(a["createVNode"])(l,{onEditUser:t[2]||(t[2]=function(t){return e.onEditUser(t.user)}),onChangeUserRole:t[3]||(t[3]=function(t){return e.onChangeUserRole(t.users,t.role)}),onDeleteUser:t[4]||(t[4]=function(t){return e.onDeleteUser(t.users)}),onSearchChange:t[5]||(t[5]=function(t){e.searchParams=t.params,e.fetchUsers()}),onResendInvite:t[6]||(t[6]=function(t){return e.onResendInvite(t.user)}),"initial-site-id":e.initialSiteId,"initial-site-name":e.initialSiteName,"is-loading-users":e.isLoadingUsers,"current-user-role":e.currentUserRole,"access-levels":e.accessLevels,"filter-access-levels":e.actualFilterAccessLevels,"search-params":e.searchParams,users:e.users,"total-entries":e.totalEntries},null,8,["initial-site-id","initial-site-name","is-loading-users","current-user-role","access-levels","filter-access-levels","search-params","users","total-entries"])],512),[[u]])],512),[[a["vShow"],!e.isEditing]]),e.isEditing?(Object(a["openBlock"])(),Object(a["createElementBlock"])("div",ls,[Object(a["createVNode"])(c,{onDone:t[7]||(t[7]=function(t){return e.onDoneEditing(t.isUserModified)}),user:e.userBeingEdited,"current-user-role":e.currentUserRole,"access-levels":e.accessLevels,"filter-access-levels":e.actualFilterAccessLevels,"initial-site-id":e.initialSiteId,"initial-site-name":e.initialSiteName,onUpdated:t[8]||(t[8]=function(t){return e.userBeingEdited=t.user})},null,8,["user","current-user-role","access-levels","filter-access-levels","initial-site-id","initial-site-name"])])):Object(a["createCommentVNode"])("",!0),Object(a["createElementVNode"])("div",cs,[Object(a["createElementVNode"])("div",ds,[Object(a["createElementVNode"])("h3",null,Object(a["toDisplayString"])(e.translate("UsersManager_AddExistingUser")),1),Object(a["createElementVNode"])("p",null,Object(a["toDisplayString"])(e.translate("UsersManager_EnterUsernameOrEmail"))+":",1),Object(a["createElementVNode"])("div",null,[Object(a["createVNode"])(d,{modelValue:e.addNewUserLoginEmail,"onUpdate:modelValue":t[9]||(t[9]=function(t){return e.addNewUserLoginEmail=t}),name:"add-existing-user-email",uicontrol:"text"},null,8,["modelValue"])])]),Object(a["createElementVNode"])("div",us,[Object(a["createElementVNode"])("a",{href:"",class:"modal-action modal-close btn",onClick:t[10]||(t[10]=Object(a["withModifiers"])((function(t){return e.addExistingUser()}),["prevent"])),style:{"margin-right":"3.5px"}},Object(a["toDisplayString"])(e.translate("General_Add")),1),Object(a["createElementVNode"])("a",{href:"",class:"modal-action modal-close modal-no",onClick:t[11]||(t[11]=Object(a["withModifiers"])((function(t){return e.addNewUserLoginEmail=null}),["prevent"]))},Object(a["toDisplayString"])(e.translate("General_Cancel")),1)])],512)],512)),[[m]])}function bs(e){return fs(e)||hs(e)||gs(e)||ps()}function ps(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function gs(e,t){if(e){if("string"===typeof e)return js(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?js(e,t):void 0}}function hs(e){if("undefined"!==typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}function fs(e){if(Array.isArray(e))return js(e)}function js(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,s=new Array(t);n<t;n++)s[n]=e[n];return s}var Os=20,vs=window,Cs=vs.$,Ns=Object(a["defineComponent"])({props:{currentUserRole:{type:String,required:!0},initialSiteName:{type:String,required:!0},initialSiteId:{type:String,required:!0},accessLevels:{type:Array,required:!0},filterAccessLevels:{type:Array,required:!0}},components:{EnrichedHeadline:i["EnrichedHeadline"],PagedUsersList:es,UserEditForm:yt,Field:h["Field"]},directives:{ContentIntro:i["ContentIntro"],Tooltips:i["Tooltips"]},data:function(){return{isEditing:!!i["MatomoUrl"].urlParsed.value.showadduser,isCurrentUserSuperUser:!0,users:[],totalEntries:null,searchParams:{offset:0,limit:Os,filter_search:"",filter_access:"",idSite:this.initialSiteId},isLoadingUsers:!1,userBeingEdited:null,addNewUserLoginEmail:""}},created:function(){this.fetchUsers()},watch:{limit:function(){this.fetchUsers()}},methods:{onEditUser:function(e){i["Matomo"].helper.lazyScrollToContent(),this.isEditing=!0,this.userBeingEdited=e},onDoneEditing:function(e){this.isEditing=!1,e&&this.fetchUsers()},showAddExistingUserModal:function(){Cs(this.$refs.addExistingUserModal).modal({dismissible:!1}).modal("open")},onChangeUserRole:function(e,t){var n=this;this.isLoadingUsers=!0,Promise.resolve().then((function(){return"all"===e?n.getAllUsersInSearch():e})).then((function(e){return e.filter((function(e){return"superuser"!==e.role})).map((function(e){return e.login}))})).then((function(e){var s=e.map((function(e){return{method:"UsersManager.setUserAccess",userLogin:e,access:t,idSites:n.searchParams.idSite,ignoreSuperusers:1}}));return i["AjaxHelper"].fetch(s,{createErrorNotification:!0})})).catch((function(){})).then((function(){return n.fetchUsers()}))},getAllUsersInSearch:function(){return i["AjaxHelper"].fetch({method:"UsersManager.getUsersPlusRole",filter_search:this.searchParams.filter_search,filter_access:this.searchParams.filter_access,idSite:this.searchParams.idSite,filter_limit:"-1"})},onDeleteUser:function(e){var t=this;this.isLoadingUsers=!0,Promise.resolve().then((function(){return"all"===e?t.getAllUsersInSearch():e})).then((function(e){return e.map((function(e){return e.login}))})).then((function(e){var t=e.map((function(e){return{method:"UsersManager.deleteUser",userLogin:e}}));return i["AjaxHelper"].fetch(t,{createErrorNotification:!0})})).catch((function(){})).then((function(){return t.fetchUsers()}))},onResendInvite:function(e){console.log(e),i["AjaxHelper"].fetch({method:"UsersManager.resendInvite",userLogin:e.login}).then((function(e){console.log(e)}))},fetchUsers:function(){var e=this;return this.isLoadingUsers=!0,i["AjaxHelper"].fetch(Object.assign(Object.assign({},this.searchParams),{},{method:"UsersManager.getUsersPlusRole"}),{returnResponseObject:!0}).then((function(t){var n=t.getRequestHandle();e.totalEntries=parseInt(n.getResponseHeader("x-matomo-total-results")||"0",10),e.users=n.responseJSON,e.isLoadingUsers=!1})).catch((function(){e.isLoadingUsers=!1}))},addExistingUser:function(){var e=this;return this.isLoadingUsers=!0,i["AjaxHelper"].fetch({method:"UsersManager.userExists",userLogin:this.addNewUserLoginEmail}).then((function(t){return t&&t.value?e.addNewUserLoginEmail:i["AjaxHelper"].fetch({method:"UsersManager.getUserLoginFromUserEmail",userEmail:e.addNewUserLoginEmail}).then((function(e){return e.value}))})).then((function(t){return i["AjaxHelper"].post({method:"UsersManager.setUserAccess"},{userLogin:t,access:"view",idSites:e.searchParams.idSite})})).then((function(){return e.fetchUsers()})).catch((function(){e.isLoadingUsers=!1}))},onAddNewUser:function(){var e={isAllowed:!0};i["Matomo"].postEvent("UsersManager.initAddUser",e),e&&!e.isAllowed||(this.isEditing=!0,this.userBeingEdited=null)}},computed:{actualFilterAccessLevels:function(){return"superuser"===this.currentUserRole?[].concat(bs(this.filterAccessLevels),[{key:"superuser",value:"Superuser"}]):this.filterAccessLevels}}});Ns.render=ms;var Ss=Ns,Us=(Object(i["createAngularJsAdapter"])({component:Ss,scope:{currentUserRole:{angularJsBind:"<"},initialSiteName:{angularJsBind:"@"},initialSiteId:{angularJsBind:"@"},accessLevels:{angularJsBind:"<"},filterAccessLevels:{angularJsBind:"<"}},directiveName:"piwikUsersManager",restrict:"E"}),{key:0,class:"alert alert-info"}),ys={key:1}; + */function ps(e,t,n,s,r,i){var o=Object(a["resolveComponent"])("EnrichedHeadline"),l=Object(a["resolveComponent"])("PagedUsersList"),c=Object(a["resolveComponent"])("UserEditForm"),d=Object(a["resolveComponent"])("Field"),u=Object(a["resolveDirective"])("content-intro"),m=Object(a["resolveDirective"])("tooltips");return Object(a["withDirectives"])((Object(a["openBlock"])(),Object(a["createElementBlock"])("div",ss,[Object(a["withDirectives"])(Object(a["createElementVNode"])("div",null,[Object(a["withDirectives"])(Object(a["createElementVNode"])("div",null,[Object(a["createElementVNode"])("h2",null,[Object(a["createVNode"])(o,{"help-url":"https://matomo.org/docs/manage-users/","feature-name":"Users Management"},{default:Object(a["withCtx"])((function(){return[Object(a["createTextVNode"])(Object(a["toDisplayString"])(e.translate("UsersManager_ManageUsers")),1)]})),_:1})]),"superuser"===e.currentUserRole?(Object(a["openBlock"])(),Object(a["createElementBlock"])("p",rs,Object(a["toDisplayString"])(e.translate("UsersManager_ManageUsersDesc")),1)):Object(a["createCommentVNode"])("",!0),"admin"===e.currentUserRole?(Object(a["openBlock"])(),Object(a["createElementBlock"])("p",is,Object(a["toDisplayString"])(e.translate("UsersManager_ManageUsersAdminDesc")),1)):Object(a["createCommentVNode"])("",!0),Object(a["createElementVNode"])("div",as,[Object(a["createElementVNode"])("div",os,[Object(a["createElementVNode"])("div",ls,[Object(a["createElementVNode"])("a",{class:"btn add-new-user",onClick:t[0]||(t[0]=function(t){return e.onAddNewUser()})},Object(a["toDisplayString"])(e.translate("UsersManager_InviteNewUser")),1)]),"superuser"!==e.currentUserRole?(Object(a["openBlock"])(),Object(a["createElementBlock"])("div",cs,[Object(a["createElementVNode"])("a",{class:"btn add-existing-user",onClick:t[1]||(t[1]=function(t){return e.showAddExistingUserModal()})},Object(a["toDisplayString"])(e.translate("UsersManager_AddExistingUser")),1)])):Object(a["createCommentVNode"])("",!0)])]),Object(a["createVNode"])(l,{onEditUser:t[2]||(t[2]=function(t){return e.onEditUser(t.user)}),onChangeUserRole:t[3]||(t[3]=function(t){return e.onChangeUserRole(t.users,t.role)}),onDeleteUser:t[4]||(t[4]=function(t){return e.onDeleteUser(t.users)}),onSearchChange:t[5]||(t[5]=function(t){e.searchParams=t.params,e.fetchUsers()}),onResendInvite:t[6]||(t[6]=function(t){return e.onResendInvite(t.user)}),"initial-site-id":e.initialSiteId,"initial-site-name":e.initialSiteName,"is-loading-users":e.isLoadingUsers,"current-user-role":e.currentUserRole,"access-levels":e.accessLevels,"filter-access-levels":e.actualFilterAccessLevels,"filter-status-levels":e.filterStatusLevels,"search-params":e.searchParams,users:e.users,"total-entries":e.totalEntries},null,8,["initial-site-id","initial-site-name","is-loading-users","current-user-role","access-levels","filter-access-levels","filter-status-levels","search-params","users","total-entries"])],512),[[u]])],512),[[a["vShow"],!e.isEditing]]),e.isEditing?(Object(a["openBlock"])(),Object(a["createElementBlock"])("div",ds,[Object(a["createVNode"])(c,{onDone:t[7]||(t[7]=function(t){return e.onDoneEditing(t.isUserModified)}),user:e.userBeingEdited,"current-user-role":e.currentUserRole,"access-levels":e.accessLevels,"filter-access-levels":e.actualFilterAccessLevels,"initial-site-id":e.initialSiteId,"initial-site-name":e.initialSiteName,onUpdated:t[8]||(t[8]=function(t){return e.userBeingEdited=t.user})},null,8,["user","current-user-role","access-levels","filter-access-levels","initial-site-id","initial-site-name"])])):Object(a["createCommentVNode"])("",!0),Object(a["createElementVNode"])("div",us,[Object(a["createElementVNode"])("div",ms,[Object(a["createElementVNode"])("h3",null,Object(a["toDisplayString"])(e.translate("UsersManager_AddExistingUser")),1),Object(a["createElementVNode"])("p",null,Object(a["toDisplayString"])(e.translate("UsersManager_EnterUsernameOrEmail"))+":",1),Object(a["createElementVNode"])("div",null,[Object(a["createVNode"])(d,{modelValue:e.addNewUserLoginEmail,"onUpdate:modelValue":t[9]||(t[9]=function(t){return e.addNewUserLoginEmail=t}),name:"add-existing-user-email",uicontrol:"text"},null,8,["modelValue"])])]),Object(a["createElementVNode"])("div",bs,[Object(a["createElementVNode"])("a",{href:"",class:"modal-action modal-close btn",onClick:t[10]||(t[10]=Object(a["withModifiers"])((function(t){return e.addExistingUser()}),["prevent"])),style:{"margin-right":"3.5px"}},Object(a["toDisplayString"])(e.translate("General_Add")),1),Object(a["createElementVNode"])("a",{href:"",class:"modal-action modal-close modal-no",onClick:t[11]||(t[11]=Object(a["withModifiers"])((function(t){return e.addNewUserLoginEmail=null}),["prevent"]))},Object(a["toDisplayString"])(e.translate("General_Cancel")),1)])],512)],512)),[[m]])}function gs(e){return Os(e)||js(e)||hs(e)||fs()}function fs(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function hs(e,t){if(e){if("string"===typeof e)return vs(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?vs(e,t):void 0}}function js(e){if("undefined"!==typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}function Os(e){if(Array.isArray(e))return vs(e)}function vs(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,s=new Array(t);n<t;n++)s[n]=e[n];return s}var Cs=20,Ns=window,Ss=Ns.$,Us=Object(a["defineComponent"])({props:{currentUserRole:{type:String,required:!0},initialSiteName:{type:String,required:!0},initialSiteId:{type:String,required:!0},accessLevels:{type:Array,required:!0},filterAccessLevels:{type:Array,required:!0},filterStatusLevels:{type:Array,required:!0}},components:{EnrichedHeadline:i["EnrichedHeadline"],PagedUsersList:ns,UserEditForm:yt,Field:f["Field"]},directives:{ContentIntro:i["ContentIntro"],Tooltips:i["Tooltips"]},data:function(){return{isEditing:!!i["MatomoUrl"].urlParsed.value.showadduser,isCurrentUserSuperUser:!0,users:[],totalEntries:null,searchParams:{offset:0,limit:Cs,filter_search:"",filter_access:"",filter_status:"",idSite:this.initialSiteId},isLoadingUsers:!1,userBeingEdited:null,addNewUserLoginEmail:""}},created:function(){this.fetchUsers()},watch:{limit:function(){this.fetchUsers()}},methods:{onEditUser:function(e){i["Matomo"].helper.lazyScrollToContent(),this.isEditing=!0,this.userBeingEdited=e},onDoneEditing:function(e){this.isEditing=!1,e&&this.fetchUsers()},showAddExistingUserModal:function(){Ss(this.$refs.addExistingUserModal).modal({dismissible:!1}).modal("open")},onChangeUserRole:function(e,t){var n=this;this.isLoadingUsers=!0,Promise.resolve().then((function(){return"all"===e?n.getAllUsersInSearch():e})).then((function(e){return e.filter((function(e){return"superuser"!==e.role})).map((function(e){return e.login}))})).then((function(e){var s=e.map((function(e){return{method:"UsersManager.setUserAccess",userLogin:e,access:t,idSites:n.searchParams.idSite,ignoreSuperusers:1}}));return i["AjaxHelper"].fetch(s,{createErrorNotification:!0})})).catch((function(){})).then((function(){return n.fetchUsers()}))},getAllUsersInSearch:function(){return i["AjaxHelper"].fetch({method:"UsersManager.getUsersPlusRole",filter_search:this.searchParams.filter_search,filter_access:this.searchParams.filter_access,filter_status:this.searchParams.filter_status,idSite:this.searchParams.idSite,filter_limit:"-1"})},onDeleteUser:function(e){var t=this;this.isLoadingUsers=!0,Promise.resolve().then((function(){return"all"===e?t.getAllUsersInSearch():e})).then((function(e){return e.map((function(e){return e.login}))})).then((function(e){var t=e.map((function(e){return{method:"UsersManager.deleteUser",userLogin:e}}));return i["AjaxHelper"].fetch(t,{createErrorNotification:!0})})).catch((function(){})).then((function(){return t.fetchUsers()}))},onResendInvite:function(e){var t=this;i["AjaxHelper"].fetch({method:"UsersManager.resendInvite",userLogin:e.login}).then((function(){t.fetchUsers();var n=i["NotificationsStore"].show({message:Object(i["translate"])("UsersManager_ResendInviteSuccess",e.login),id:"resendinvite",context:"success",type:"transient"});i["NotificationsStore"].scrollToNotification(n)}))},fetchUsers:function(){var e=this;return this.isLoadingUsers=!0,i["AjaxHelper"].fetch(Object.assign(Object.assign({},this.searchParams),{},{method:"UsersManager.getUsersPlusRole"}),{returnResponseObject:!0}).then((function(t){var n=t.getRequestHandle();e.totalEntries=parseInt(n.getResponseHeader("x-matomo-total-results")||"0",10),e.users=n.responseJSON,e.isLoadingUsers=!1})).catch((function(){e.isLoadingUsers=!1}))},addExistingUser:function(){var e=this;return this.isLoadingUsers=!0,i["AjaxHelper"].fetch({method:"UsersManager.userExists",userLogin:this.addNewUserLoginEmail}).then((function(t){return t&&t.value?e.addNewUserLoginEmail:i["AjaxHelper"].fetch({method:"UsersManager.getUserLoginFromUserEmail",userEmail:e.addNewUserLoginEmail}).then((function(e){return e.value}))})).then((function(t){return i["AjaxHelper"].post({method:"UsersManager.setUserAccess"},{userLogin:t,access:"view",idSites:e.searchParams.idSite})})).then((function(){return e.fetchUsers()})).catch((function(){e.isLoadingUsers=!1}))},onAddNewUser:function(){var e={isAllowed:!0};i["Matomo"].postEvent("UsersManager.initAddUser",e),e&&!e.isAllowed||(this.isEditing=!0,this.userBeingEdited=null)}},computed:{actualFilterAccessLevels:function(){return"superuser"===this.currentUserRole?[].concat(gs(this.filterAccessLevels),[{key:"superuser",value:"Superuser"}]):this.filterAccessLevels}}});Us.render=ps;var ys=Us,Es=(Object(i["createAngularJsAdapter"])({component:ys,scope:{currentUserRole:{angularJsBind:"<"},initialSiteName:{angularJsBind:"@"},initialSiteId:{angularJsBind:"@"},accessLevels:{angularJsBind:"<"},filterAccessLevels:{angularJsBind:"<"},filterStatusLevels:{angularJsBind:"<"}},directiveName:"piwikUsersManager",restrict:"E"}),{key:0,class:"alert alert-info"}),Vs={key:1}; /*! * Matomo - free/libre analytics platform * * @link https://matomo.org * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later - */function Es(e,t,n,s,r,i){var o=Object(a["resolveComponent"])("Field"),l=Object(a["resolveComponent"])("SaveButton"),c=Object(a["resolveComponent"])("ContentBlock"),d=Object(a["resolveDirective"])("form");return Object(a["openBlock"])(),Object(a["createBlock"])(c,{"content-title":e.title},{default:Object(a["withCtx"])((function(){return[0===e.anonymousSites.length?(Object(a["openBlock"])(),Object(a["createElementBlock"])("div",Us,Object(a["toDisplayString"])(e.translate("UsersManager_NoteNoAnonymousUserAccessSettingsWontBeUsed2")),1)):Object(a["createCommentVNode"])("",!0),e.anonymousSites.length>0?Object(a["withDirectives"])((Object(a["openBlock"])(),Object(a["createElementBlock"])("div",ys,[Object(a["createElementVNode"])("div",null,[Object(a["createVNode"])(o,{uicontrol:"radio",name:"anonymousDefaultReport",modelValue:e.defaultReport,"onUpdate:modelValue":t[0]||(t[0]=function(t){return e.defaultReport=t}),introduction:e.translate("UsersManager_WhenUsersAreNotLoggedInAndVisitPiwikTheyShouldAccess"),options:e.defaultReportOptions},null,8,["modelValue","introduction","options"])]),Object(a["createElementVNode"])("div",null,[Object(a["createVNode"])(o,{uicontrol:"select",name:"anonymousDefaultReportWebsite",modelValue:e.defaultReportWebsite,"onUpdate:modelValue":t[1]||(t[1]=function(t){return e.defaultReportWebsite=t}),options:e.anonymousSites},null,8,["modelValue","options"])]),Object(a["createElementVNode"])("div",null,[Object(a["createVNode"])(o,{uicontrol:"radio",name:"anonymousDefaultDate",modelValue:e.defaultDate,"onUpdate:modelValue":t[2]||(t[2]=function(t){return e.defaultDate=t}),introduction:e.translate("UsersManager_ForAnonymousUsersReportDateToLoadByDefault"),options:e.availableDefaultDates},null,8,["modelValue","introduction","options"])]),Object(a["createVNode"])(l,{saving:e.loading,onConfirm:t[3]||(t[3]=function(t){return e.save()})},null,8,["saving"])],512)),[[d]]):Object(a["createCommentVNode"])("",!0)]})),_:1},8,["content-title"])}var Vs=Object(a["defineComponent"])({props:{title:{type:String,required:!0},anonymousSites:{type:Array,required:!0},anonymousDefaultReport:{type:[String,Number],required:!0},anonymousDefaultSite:{type:String,required:!0},anonymousDefaultDate:{type:String,required:!0},availableDefaultDates:{type:Object,required:!0},defaultReportOptions:{type:Object,required:!0}},components:{ContentBlock:i["ContentBlock"],SaveButton:h["SaveButton"],Field:h["Field"]},directives:{Form:h["Form"]},data:function(){return{loading:!1,defaultReport:"".concat(this.anonymousDefaultReport),defaultReportWebsite:this.anonymousDefaultSite,defaultDate:this.anonymousDefaultDate}},methods:{save:function(){var e=this,t={anonymousDefaultReport:"1"===this.defaultReport?this.defaultReportWebsite:this.defaultReport,anonymousDefaultDate:this.defaultDate};this.loading=!0,i["AjaxHelper"].post({module:"UsersManager",action:"recordAnonymousUserSettings",format:"json"},t,{withTokenInUrl:!0}).then((function(){var e=i["NotificationsStore"].show({message:Object(i["translate"])("CoreAdminHome_SettingsSaveSuccess"),id:"anonymousUserSettings",context:"success",type:"transient"});i["NotificationsStore"].scrollToNotification(e)})).finally((function(){e.loading=!1}))}}});Vs.render=Es;var ks=Vs,As=(Object(i["createAngularJsAdapter"])({component:ks,scope:{title:{angularJsBind:"<"},anonymousSites:{angularJsBind:"<"},anonymousDefaultReport:{angularJsBind:"<"},anonymousDefaultSite:{angularJsBind:"<"},anonymousDefaultDate:{angularJsBind:"<"},availableDefaultDates:{angularJsBind:"<"},defaultReportOptions:{angularJsBind:"<"}},directiveName:"matomoAnonymousSettings"}),{id:"newsletterSignup"}); + */function ks(e,t,n,s,r,i){var o=Object(a["resolveComponent"])("Field"),l=Object(a["resolveComponent"])("SaveButton"),c=Object(a["resolveComponent"])("ContentBlock"),d=Object(a["resolveDirective"])("form");return Object(a["openBlock"])(),Object(a["createBlock"])(c,{"content-title":e.title},{default:Object(a["withCtx"])((function(){return[0===e.anonymousSites.length?(Object(a["openBlock"])(),Object(a["createElementBlock"])("div",Es,Object(a["toDisplayString"])(e.translate("UsersManager_NoteNoAnonymousUserAccessSettingsWontBeUsed2")),1)):Object(a["createCommentVNode"])("",!0),e.anonymousSites.length>0?Object(a["withDirectives"])((Object(a["openBlock"])(),Object(a["createElementBlock"])("div",Vs,[Object(a["createElementVNode"])("div",null,[Object(a["createVNode"])(o,{uicontrol:"radio",name:"anonymousDefaultReport",modelValue:e.defaultReport,"onUpdate:modelValue":t[0]||(t[0]=function(t){return e.defaultReport=t}),introduction:e.translate("UsersManager_WhenUsersAreNotLoggedInAndVisitPiwikTheyShouldAccess"),options:e.defaultReportOptions},null,8,["modelValue","introduction","options"])]),Object(a["createElementVNode"])("div",null,[Object(a["createVNode"])(o,{uicontrol:"select",name:"anonymousDefaultReportWebsite",modelValue:e.defaultReportWebsite,"onUpdate:modelValue":t[1]||(t[1]=function(t){return e.defaultReportWebsite=t}),options:e.anonymousSites},null,8,["modelValue","options"])]),Object(a["createElementVNode"])("div",null,[Object(a["createVNode"])(o,{uicontrol:"radio",name:"anonymousDefaultDate",modelValue:e.defaultDate,"onUpdate:modelValue":t[2]||(t[2]=function(t){return e.defaultDate=t}),introduction:e.translate("UsersManager_ForAnonymousUsersReportDateToLoadByDefault"),options:e.availableDefaultDates},null,8,["modelValue","introduction","options"])]),Object(a["createVNode"])(l,{saving:e.loading,onConfirm:t[3]||(t[3]=function(t){return e.save()})},null,8,["saving"])],512)),[[d]]):Object(a["createCommentVNode"])("",!0)]})),_:1},8,["content-title"])}var As=Object(a["defineComponent"])({props:{title:{type:String,required:!0},anonymousSites:{type:Array,required:!0},anonymousDefaultReport:{type:[String,Number],required:!0},anonymousDefaultSite:{type:String,required:!0},anonymousDefaultDate:{type:String,required:!0},availableDefaultDates:{type:Object,required:!0},defaultReportOptions:{type:Object,required:!0}},components:{ContentBlock:i["ContentBlock"],SaveButton:f["SaveButton"],Field:f["Field"]},directives:{Form:f["Form"]},data:function(){return{loading:!1,defaultReport:"".concat(this.anonymousDefaultReport),defaultReportWebsite:this.anonymousDefaultSite,defaultDate:this.anonymousDefaultDate}},methods:{save:function(){var e=this,t={anonymousDefaultReport:"1"===this.defaultReport?this.defaultReportWebsite:this.defaultReport,anonymousDefaultDate:this.defaultDate};this.loading=!0,i["AjaxHelper"].post({module:"UsersManager",action:"recordAnonymousUserSettings",format:"json"},t,{withTokenInUrl:!0}).then((function(){var e=i["NotificationsStore"].show({message:Object(i["translate"])("CoreAdminHome_SettingsSaveSuccess"),id:"anonymousUserSettings",context:"success",type:"transient"});i["NotificationsStore"].scrollToNotification(e)})).finally((function(){e.loading=!1}))}}});As.render=ks;var ws=As,Ts=(Object(i["createAngularJsAdapter"])({component:ws,scope:{title:{angularJsBind:"<"},anonymousSites:{angularJsBind:"<"},anonymousDefaultReport:{angularJsBind:"<"},anonymousDefaultSite:{angularJsBind:"<"},anonymousDefaultDate:{angularJsBind:"<"},availableDefaultDates:{angularJsBind:"<"},defaultReportOptions:{angularJsBind:"<"}},directiveName:"matomoAnonymousSettings"}),{id:"newsletterSignup"}); /*! * Matomo - free/libre analytics platform * * @link https://matomo.org * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later - */function ws(e,t,n,s,r,i){var o=Object(a["resolveComponent"])("Field"),l=Object(a["resolveComponent"])("SaveButton"),c=Object(a["resolveComponent"])("ContentBlock");return Object(a["withDirectives"])((Object(a["openBlock"])(),Object(a["createElementBlock"])("div",As,[Object(a["createVNode"])(c,{"content-title":e.translate("UsersManager_NewsletterSignupTitle")},{default:Object(a["withCtx"])((function(){return[Object(a["createElementVNode"])("div",null,[Object(a["createVNode"])(o,{uicontrol:"checkbox",name:"newsletterSignupCheckbox",id:"newsletterSignupCheckbox",modelValue:e.newsletterSignupCheckbox,"onUpdate:modelValue":t[0]||(t[0]=function(t){return e.newsletterSignupCheckbox=t}),"full-width":!0,title:e.signupTitleText},null,8,["modelValue","title"])]),Object(a["createVNode"])(l,{id:"newsletterSignupBtn",onConfirm:t[1]||(t[1]=function(t){return e.signupForNewsletter()}),disabled:!e.newsletterSignupCheckbox,value:e.newsletterSignupButtonTitle,saving:e.isProcessingNewsletterSignup},null,8,["disabled","value","saving"])]})),_:1},8,["content-title"])],512)),[[a["vShow"],e.showNewsletterSignup]])}var Ts=Object(a["defineComponent"])({data:function(){return{showNewsletterSignup:!0,newsletterSignupCheckbox:!1,isProcessingNewsletterSignup:!1,newsletterSignupButtonTitle:Object(i["translate"])("General_Save")}},components:{ContentBlock:i["ContentBlock"],SaveButton:h["SaveButton"],Field:h["Field"]},computed:{signupTitleText:function(){return Object(i["translate"])("UsersManager_NewsletterSignupMessage",'<a href="https://matomo.org/privacy-policy/" target="_blank">',"</a>")}},methods:{signupForNewsletter:function(){var e=this;this.newsletterSignupButtonTitle=Object(i["translate"])("General_Loading"),this.isProcessingNewsletterSignup=!0,i["AjaxHelper"].fetch({module:"API",method:"UsersManager.newsletterSignup"},{withTokenInUrl:!0}).then((function(){e.isProcessingNewsletterSignup=!1,e.showNewsletterSignup=!1;var t=i["NotificationsStore"].show({message:Object(i["translate"])("UsersManager_NewsletterSignupSuccessMessage"),id:"newslettersignup",context:"success",type:"transient"});i["NotificationsStore"].scrollToNotification(t)})).catch((function(){e.isProcessingNewsletterSignup=!1;var t=i["NotificationsStore"].show({message:Object(i["translate"])("UsersManager_NewsletterSignupFailureMessage"),id:"newslettersignup",context:"error",type:"transient"});i["NotificationsStore"].scrollToNotification(t),e.newsletterSignupButtonTitle=Object(i["translate"])("General_PleaseTryAgain")}))}}});Ts.render=ws;var Ms=Ts,Bs=(Object(i["createAngularJsAdapter"])({component:Ms,scope:{},directiveName:"matomoNewsletterSettings"}),{id:"userSettingsTable"}),_s={key:0},Ds={id:"languageHelp",class:"inline-help-node"},Ls={target:"_blank",rel:"noreferrer noopener",href:"https://matomo.org/translations/"},Rs={class:"sites_autocomplete"},xs={class:"modal",id:"confirmChangesWithPassword",ref:"confirmChangesWithPasswordModal"},Ps={class:"modal-content"},Hs={class:"modal-footer"}; + */function Ms(e,t,n,s,r,i){var o=Object(a["resolveComponent"])("Field"),l=Object(a["resolveComponent"])("SaveButton"),c=Object(a["resolveComponent"])("ContentBlock");return Object(a["withDirectives"])((Object(a["openBlock"])(),Object(a["createElementBlock"])("div",Ts,[Object(a["createVNode"])(c,{"content-title":e.translate("UsersManager_NewsletterSignupTitle")},{default:Object(a["withCtx"])((function(){return[Object(a["createElementVNode"])("div",null,[Object(a["createVNode"])(o,{uicontrol:"checkbox",name:"newsletterSignupCheckbox",id:"newsletterSignupCheckbox",modelValue:e.newsletterSignupCheckbox,"onUpdate:modelValue":t[0]||(t[0]=function(t){return e.newsletterSignupCheckbox=t}),"full-width":!0,title:e.signupTitleText},null,8,["modelValue","title"])]),Object(a["createVNode"])(l,{id:"newsletterSignupBtn",onConfirm:t[1]||(t[1]=function(t){return e.signupForNewsletter()}),disabled:!e.newsletterSignupCheckbox,value:e.newsletterSignupButtonTitle,saving:e.isProcessingNewsletterSignup},null,8,["disabled","value","saving"])]})),_:1},8,["content-title"])],512)),[[a["vShow"],e.showNewsletterSignup]])}var Bs=Object(a["defineComponent"])({data:function(){return{showNewsletterSignup:!0,newsletterSignupCheckbox:!1,isProcessingNewsletterSignup:!1,newsletterSignupButtonTitle:Object(i["translate"])("General_Save")}},components:{ContentBlock:i["ContentBlock"],SaveButton:f["SaveButton"],Field:f["Field"]},computed:{signupTitleText:function(){return Object(i["translate"])("UsersManager_NewsletterSignupMessage",'<a href="https://matomo.org/privacy-policy/" target="_blank">',"</a>")}},methods:{signupForNewsletter:function(){var e=this;this.newsletterSignupButtonTitle=Object(i["translate"])("General_Loading"),this.isProcessingNewsletterSignup=!0,i["AjaxHelper"].fetch({module:"API",method:"UsersManager.newsletterSignup"},{withTokenInUrl:!0}).then((function(){e.isProcessingNewsletterSignup=!1,e.showNewsletterSignup=!1;var t=i["NotificationsStore"].show({message:Object(i["translate"])("UsersManager_NewsletterSignupSuccessMessage"),id:"newslettersignup",context:"success",type:"transient"});i["NotificationsStore"].scrollToNotification(t)})).catch((function(){e.isProcessingNewsletterSignup=!1;var t=i["NotificationsStore"].show({message:Object(i["translate"])("UsersManager_NewsletterSignupFailureMessage"),id:"newslettersignup",context:"error",type:"transient"});i["NotificationsStore"].scrollToNotification(t),e.newsletterSignupButtonTitle=Object(i["translate"])("General_PleaseTryAgain")}))}}});Bs.render=Ms;var _s=Bs,Ds=(Object(i["createAngularJsAdapter"])({component:_s,scope:{},directiveName:"matomoNewsletterSettings"}),{id:"userSettingsTable"}),Ls={key:0},Rs={id:"languageHelp",class:"inline-help-node"},xs={target:"_blank",rel:"noreferrer noopener",href:"https://matomo.org/translations/"},Ps={class:"sites_autocomplete"},Fs={class:"modal",id:"confirmChangesWithPassword",ref:"confirmChangesWithPasswordModal"},Hs={class:"modal-content"},Is={class:"modal-footer"}; /*! * Matomo - free/libre analytics platform * * @link https://matomo.org * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later - */function Fs(e,t,n,s,r,i){var o=Object(a["resolveComponent"])("Field"),l=Object(a["resolveComponent"])("SiteSelector"),c=Object(a["resolveComponent"])("SaveButton"),d=Object(a["resolveComponent"])("ContentBlock"),u=Object(a["resolveDirective"])("form");return Object(a["openBlock"])(),Object(a["createBlock"])(d,{"content-title":e.title,feature:"true"},{default:Object(a["withCtx"])((function(){return[Object(a["withDirectives"])(Object(a["createElementVNode"])("form",Bs,[Object(a["createElementVNode"])("div",null,[Object(a["createVNode"])(o,{uicontrol:"text",name:"username",title:e.translate("General_Username"),disabled:!0,modelValue:e.username,"onUpdate:modelValue":t[0]||(t[0]=function(t){return e.username=t}),"inline-help":e.translate("UsersManager_YourUsernameCannotBeChanged")},null,8,["title","modelValue","inline-help"])]),e.isUsersAdminEnabled?(Object(a["openBlock"])(),Object(a["createElementBlock"])("div",_s,[Object(a["createVNode"])(o,{uicontrol:"text",name:"email","model-value":e.email,"onUpdate:modelValue":t[1]||(t[1]=function(t){e.email=t,e.doesRequirePasswordConfirmation=!0}),maxlength:100,title:e.translate("UsersManager_Email")},null,8,["model-value","title"])])):Object(a["createCommentVNode"])("",!0),Object(a["createElementVNode"])("div",Ds,[Object(a["createElementVNode"])("a",Ls,Object(a["toDisplayString"])(e.translate("LanguagesManager_AboutPiwikTranslations")),1)]),Object(a["createElementVNode"])("div",null,[Object(a["createVNode"])(o,{uicontrol:"select",name:"language",modelValue:e.language,"onUpdate:modelValue":t[2]||(t[2]=function(t){return e.language=t}),title:e.translate("General_Language"),options:e.languageOptions,"inline-help":"#languageHelp"},null,8,["modelValue","title","options"])]),Object(a["createElementVNode"])("div",null,[Object(a["createVNode"])(o,{uicontrol:"select",name:"timeformat",modelValue:e.timeformat,"onUpdate:modelValue":t[3]||(t[3]=function(t){return e.timeformat=t}),title:e.translate("General_TimeFormat"),options:e.timeFormats},null,8,["modelValue","title","options"])]),Object(a["createElementVNode"])("div",null,[Object(a["createVNode"])(o,{uicontrol:"radio",name:"defaultReport",modelValue:e.theDefaultReport,"onUpdate:modelValue":t[4]||(t[4]=function(t){return e.theDefaultReport=t}),introduction:e.translate("UsersManager_ReportToLoadByDefault"),title:e.translate("General_AllWebsitesDashboard"),options:e.defaultReportOptions},null,8,["modelValue","introduction","title","options"])]),Object(a["createElementVNode"])("div",Rs,[Object(a["createVNode"])(l,{modelValue:e.site,"onUpdate:modelValue":t[5]||(t[5]=function(t){return e.site=t}),"show-selected-site":!0,"switch-site-on-select":!1,"show-all-sites-item":!1,showselectedsite:!0,id:"defaultReportSiteSelector"},null,8,["modelValue"])]),Object(a["createElementVNode"])("div",null,[Object(a["createVNode"])(o,{uicontrol:"radio",name:"defaultDate",modelValue:e.theDefaultDate,"onUpdate:modelValue":t[6]||(t[6]=function(t){return e.theDefaultDate=t}),introduction:e.translate("UsersManager_ReportDateToLoadByDefault"),options:e.availableDefaultDates},null,8,["modelValue","introduction","options"])]),Object(a["createVNode"])(c,{onConfirm:t[7]||(t[7]=function(t){return e.save()}),saving:e.loading},null,8,["saving"]),Object(a["createElementVNode"])("div",xs,[Object(a["createElementVNode"])("div",Ps,[Object(a["createElementVNode"])("h2",null,Object(a["toDisplayString"])(e.translate("UsersManager_ConfirmWithPassword")),1),Object(a["createElementVNode"])("div",null,[Object(a["createVNode"])(o,{uicontrol:"password",name:"currentPassword",autocomplete:!1,modelValue:e.passwordCurrent,"onUpdate:modelValue":t[8]||(t[8]=function(t){return e.passwordCurrent=t}),"full-width":!0,title:e.translate("UsersManager_YourCurrentPassword")},null,8,["modelValue","title"])])]),Object(a["createElementVNode"])("div",Hs,[Object(a["createElementVNode"])("a",{href:"",class:"modal-action btn",onClick:t[9]||(t[9]=Object(a["withModifiers"])((function(t){return e.save()}),["prevent"])),style:{"margin-right":"3.5px"}},Object(a["toDisplayString"])(e.translate("General_Ok")),1),Object(a["createElementVNode"])("a",{href:"",class:"modal-action modal-close modal-no",onClick:t[10]||(t[10]=Object(a["withModifiers"])((function(t){return e.passwordCurrent=""}),["prevent"]))},Object(a["toDisplayString"])(e.translate("General_Cancel")),1)])],512)],512),[[u]])]})),_:1},8,["content-title"])}var Is=window,Js=Is.$,qs=Object(a["defineComponent"])({props:{isUsersAdminEnabled:{type:Boolean,required:!0},title:{type:String,required:!0},userLogin:{type:String,required:!0},userEmail:{type:String,required:!0},currentLanguageCode:{type:String,required:!0},languageOptions:{type:Object,required:!0},currentTimeformat:{type:Number,required:!0},timeFormats:{type:Object,required:!0},defaultReport:{type:[String,Number],required:!0},defaultReportOptions:{type:Object,required:!0},defaultReportIdSite:{type:[String,Number],required:!0},defaultReportSiteName:{type:String,required:!0},defaultDate:{type:String,required:!0},availableDefaultDates:{type:Object,required:!0}},components:{ContentBlock:i["ContentBlock"],SaveButton:h["SaveButton"],Field:h["Field"],SiteSelector:i["SiteSelector"]},directives:{Form:h["Form"]},data:function(){return{doesRequirePasswordConfirmation:!1,username:this.userLogin,email:this.userEmail,language:this.currentLanguageCode,timeformat:this.currentTimeformat,theDefaultReport:this.defaultReport,site:{id:this.defaultReportIdSite,name:i["Matomo"].helper.htmlDecode(this.defaultReportSiteName)},theDefaultDate:this.defaultDate,loading:!1,passwordCurrent:""}},methods:{save:function(){var e=this;if(!this.doesRequirePasswordConfirmation||this.passwordCurrent){var t=M.Modal.getInstance(this.$refs.confirmChangesWithPasswordModal);t&&t.close();var n={email:this.email,defaultReport:"MultiSites"===this.theDefaultReport?this.theDefaultReport:this.site.id,defaultDate:this.theDefaultDate,language:this.language,timeformat:this.timeformat};this.passwordCurrent&&(n.passwordConfirmation=this.passwordCurrent),this.loading=!0,i["AjaxHelper"].post({module:"UsersManager",action:"recordUserSettings",format:"json"},n,{withTokenInUrl:!0}).then((function(){var t=i["NotificationsStore"].show({message:Object(i["translate"])("CoreAdminHome_SettingsSaveSuccess"),id:"PersonalSettingsSuccess",context:"success",type:"transient"});i["NotificationsStore"].scrollToNotification(t),e.doesRequirePasswordConfirmation=!1,e.passwordCurrent="",e.loading=!1})).catch((function(){e.loading=!1,e.passwordCurrent=""}))}else Js(this.$refs.confirmChangesWithPasswordModal).modal({dismissible:!1,ready:function(){Js(".modal.open #currentPassword").focus()}}).modal("open")}}});qs.render=Fs;var $s=qs; + */function Js(e,t,n,s,r,i){var o=Object(a["resolveComponent"])("Field"),l=Object(a["resolveComponent"])("SiteSelector"),c=Object(a["resolveComponent"])("SaveButton"),d=Object(a["resolveComponent"])("ContentBlock"),u=Object(a["resolveDirective"])("form");return Object(a["openBlock"])(),Object(a["createBlock"])(d,{"content-title":e.title,feature:"true"},{default:Object(a["withCtx"])((function(){return[Object(a["withDirectives"])(Object(a["createElementVNode"])("form",Ds,[Object(a["createElementVNode"])("div",null,[Object(a["createVNode"])(o,{uicontrol:"text",name:"username",title:e.translate("General_Username"),disabled:!0,modelValue:e.username,"onUpdate:modelValue":t[0]||(t[0]=function(t){return e.username=t}),"inline-help":e.translate("UsersManager_YourUsernameCannotBeChanged")},null,8,["title","modelValue","inline-help"])]),e.isUsersAdminEnabled?(Object(a["openBlock"])(),Object(a["createElementBlock"])("div",Ls,[Object(a["createVNode"])(o,{uicontrol:"text",name:"email","model-value":e.email,"onUpdate:modelValue":t[1]||(t[1]=function(t){e.email=t,e.doesRequirePasswordConfirmation=!0}),maxlength:100,title:e.translate("UsersManager_Email")},null,8,["model-value","title"])])):Object(a["createCommentVNode"])("",!0),Object(a["createElementVNode"])("div",Rs,[Object(a["createElementVNode"])("a",xs,Object(a["toDisplayString"])(e.translate("LanguagesManager_AboutPiwikTranslations")),1)]),Object(a["createElementVNode"])("div",null,[Object(a["createVNode"])(o,{uicontrol:"select",name:"language",modelValue:e.language,"onUpdate:modelValue":t[2]||(t[2]=function(t){return e.language=t}),title:e.translate("General_Language"),options:e.languageOptions,"inline-help":"#languageHelp"},null,8,["modelValue","title","options"])]),Object(a["createElementVNode"])("div",null,[Object(a["createVNode"])(o,{uicontrol:"select",name:"timeformat",modelValue:e.timeformat,"onUpdate:modelValue":t[3]||(t[3]=function(t){return e.timeformat=t}),title:e.translate("General_TimeFormat"),options:e.timeFormats},null,8,["modelValue","title","options"])]),Object(a["createElementVNode"])("div",null,[Object(a["createVNode"])(o,{uicontrol:"radio",name:"defaultReport",modelValue:e.theDefaultReport,"onUpdate:modelValue":t[4]||(t[4]=function(t){return e.theDefaultReport=t}),introduction:e.translate("UsersManager_ReportToLoadByDefault"),title:e.translate("General_AllWebsitesDashboard"),options:e.defaultReportOptions},null,8,["modelValue","introduction","title","options"])]),Object(a["createElementVNode"])("div",Ps,[Object(a["createVNode"])(l,{modelValue:e.site,"onUpdate:modelValue":t[5]||(t[5]=function(t){return e.site=t}),"show-selected-site":!0,"switch-site-on-select":!1,"show-all-sites-item":!1,showselectedsite:!0,id:"defaultReportSiteSelector"},null,8,["modelValue"])]),Object(a["createElementVNode"])("div",null,[Object(a["createVNode"])(o,{uicontrol:"radio",name:"defaultDate",modelValue:e.theDefaultDate,"onUpdate:modelValue":t[6]||(t[6]=function(t){return e.theDefaultDate=t}),introduction:e.translate("UsersManager_ReportDateToLoadByDefault"),options:e.availableDefaultDates},null,8,["modelValue","introduction","options"])]),Object(a["createVNode"])(c,{onConfirm:t[7]||(t[7]=function(t){return e.save()}),saving:e.loading},null,8,["saving"]),Object(a["createElementVNode"])("div",Fs,[Object(a["createElementVNode"])("div",Hs,[Object(a["createElementVNode"])("h2",null,Object(a["toDisplayString"])(e.translate("UsersManager_ConfirmWithPassword")),1),Object(a["createElementVNode"])("div",null,[Object(a["createVNode"])(o,{uicontrol:"password",name:"currentPassword",autocomplete:!1,modelValue:e.passwordCurrent,"onUpdate:modelValue":t[8]||(t[8]=function(t){return e.passwordCurrent=t}),"full-width":!0,title:e.translate("UsersManager_YourCurrentPassword")},null,8,["modelValue","title"])])]),Object(a["createElementVNode"])("div",Is,[Object(a["createElementVNode"])("a",{href:"",class:"modal-action btn",onClick:t[9]||(t[9]=Object(a["withModifiers"])((function(t){return e.save()}),["prevent"])),style:{"margin-right":"3.5px"}},Object(a["toDisplayString"])(e.translate("General_Ok")),1),Object(a["createElementVNode"])("a",{href:"",class:"modal-action modal-close modal-no",onClick:t[10]||(t[10]=Object(a["withModifiers"])((function(t){return e.passwordCurrent=""}),["prevent"]))},Object(a["toDisplayString"])(e.translate("General_Cancel")),1)])],512)],512),[[u]])]})),_:1},8,["content-title"])}var qs=window,$s=qs.$,Gs=Object(a["defineComponent"])({props:{isUsersAdminEnabled:{type:Boolean,required:!0},title:{type:String,required:!0},userLogin:{type:String,required:!0},userEmail:{type:String,required:!0},currentLanguageCode:{type:String,required:!0},languageOptions:{type:Object,required:!0},currentTimeformat:{type:Number,required:!0},timeFormats:{type:Object,required:!0},defaultReport:{type:[String,Number],required:!0},defaultReportOptions:{type:Object,required:!0},defaultReportIdSite:{type:[String,Number],required:!0},defaultReportSiteName:{type:String,required:!0},defaultDate:{type:String,required:!0},availableDefaultDates:{type:Object,required:!0}},components:{ContentBlock:i["ContentBlock"],SaveButton:f["SaveButton"],Field:f["Field"],SiteSelector:i["SiteSelector"]},directives:{Form:f["Form"]},data:function(){return{doesRequirePasswordConfirmation:!1,username:this.userLogin,email:this.userEmail,language:this.currentLanguageCode,timeformat:this.currentTimeformat,theDefaultReport:this.defaultReport,site:{id:this.defaultReportIdSite,name:i["Matomo"].helper.htmlDecode(this.defaultReportSiteName)},theDefaultDate:this.defaultDate,loading:!1,passwordCurrent:""}},methods:{save:function(){var e=this;if(!this.doesRequirePasswordConfirmation||this.passwordCurrent){var t=M.Modal.getInstance(this.$refs.confirmChangesWithPasswordModal);t&&t.close();var n={email:this.email,defaultReport:"MultiSites"===this.theDefaultReport?this.theDefaultReport:this.site.id,defaultDate:this.theDefaultDate,language:this.language,timeformat:this.timeformat};this.passwordCurrent&&(n.passwordConfirmation=this.passwordCurrent),this.loading=!0,i["AjaxHelper"].post({module:"UsersManager",action:"recordUserSettings",format:"json"},n,{withTokenInUrl:!0}).then((function(){var t=i["NotificationsStore"].show({message:Object(i["translate"])("CoreAdminHome_SettingsSaveSuccess"),id:"PersonalSettingsSuccess",context:"success",type:"transient"});i["NotificationsStore"].scrollToNotification(t),e.doesRequirePasswordConfirmation=!1,e.passwordCurrent="",e.loading=!1})).catch((function(){e.loading=!1,e.passwordCurrent=""}))}else $s(this.$refs.confirmChangesWithPasswordModal).modal({dismissible:!1,ready:function(){$s(".modal.open #currentPassword").focus()}}).modal("open")}}});Gs.render=Js;var zs=Gs; /*! * Matomo - free/libre analytics platform * * @link https://matomo.org * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later - */Object(i["createAngularJsAdapter"])({component:$s,scope:{isUsersAdminEnabled:{angularJsBind:"<"},title:{angularJsBind:"<"},userLogin:{angularJsBind:"<"},userEmail:{angularJsBind:"<"},currentLanguageCode:{angularJsBind:"<"},languageOptions:{angularJsBind:"<"},currentTimeformat:{angularJsBind:"<"},timeFormats:{angularJsBind:"<"},defaultReport:{angularJsBind:"<"},defaultReportOptions:{angularJsBind:"<"},defaultReportIdSite:{angularJsBind:"<"},defaultReportSiteName:{angularJsBind:"<"},defaultDate:{angularJsBind:"<"},availableDefaultDates:{angularJsBind:"<"}},directiveName:"matomoPersonalSettings"})}})})); + */Object(i["createAngularJsAdapter"])({component:zs,scope:{isUsersAdminEnabled:{angularJsBind:"<"},title:{angularJsBind:"<"},userLogin:{angularJsBind:"<"},userEmail:{angularJsBind:"<"},currentLanguageCode:{angularJsBind:"<"},languageOptions:{angularJsBind:"<"},currentTimeformat:{angularJsBind:"<"},timeFormats:{angularJsBind:"<"},defaultReport:{angularJsBind:"<"},defaultReportOptions:{angularJsBind:"<"},defaultReportIdSite:{angularJsBind:"<"},defaultReportSiteName:{angularJsBind:"<"},defaultDate:{angularJsBind:"<"},availableDefaultDates:{angularJsBind:"<"}},directiveName:"matomoPersonalSettings"})}})})); //# sourceMappingURL=UsersManager.umd.min.js.map
\ No newline at end of file diff --git a/plugins/UsersManager/vue/src/PagedUsersList/PagedUsersList.less b/plugins/UsersManager/vue/src/PagedUsersList/PagedUsersList.less index bc52e87ce3..f1a7d66783 100644 --- a/plugins/UsersManager/vue/src/PagedUsersList/PagedUsersList.less +++ b/plugins/UsersManager/vue/src/PagedUsersList/PagedUsersList.less @@ -37,7 +37,7 @@ table.entityTable tbody tr td.actions-cell { width: 140px; padding: 0; - text-align: center; + text-align: left; } table.entityTable th.actions-cell-header > div { @@ -124,6 +124,7 @@ .input-field > .btn { margin-top: .7rem; + white-space: nowrap; } &.row { @@ -133,6 +134,11 @@ } } + .users-list-pagination-container { + float: right; + min-width: 350px; + } + .usersListPagination { display: flex; flex-direction: row; @@ -140,6 +146,7 @@ justify-content: space-between; margin-top: .7rem; float: right; + white-space: nowrap; .pointer { cursor: pointer; @@ -165,11 +172,11 @@ } #status { - .accept { + .active { color: green; } - .expired, .decline { + .expired { color: red; } diff --git a/plugins/UsersManager/vue/src/PagedUsersList/PagedUsersList.vue b/plugins/UsersManager/vue/src/PagedUsersList/PagedUsersList.vue index 6af4687037..f0e5121354 100644 --- a/plugins/UsersManager/vue/src/PagedUsersList/PagedUsersList.vue +++ b/plugins/UsersManager/vue/src/PagedUsersList/PagedUsersList.vue @@ -6,41 +6,41 @@ <template> <div - class="pagedUsersList" - :class="{loading: isLoadingUsers}" + class="pagedUsersList" + :class="{loading: isLoadingUsers}" > <div class="userListFilters row"> - <div class="col s12 m12 l6"> - <div class="input-field col s12 m4 l4"> + <div class="col s12 m12 l8"> + <div class="input-field col s12 m3 l3"> <a - class="dropdown-trigger btn bulk-actions" - href="" - data-target="user-list-bulk-actions" - :class="{ disabled: isBulkActionsDisabled }" - v-dropdown-menu + class="dropdown-trigger btn bulk-actions" + href="" + data-target="user-list-bulk-actions" + :class="{ disabled: isBulkActionsDisabled }" + v-dropdown-menu > {{ translate('UsersManager_BulkActions') }} </a> <ul - id="user-list-bulk-actions" - class="dropdown-content" + id="user-list-bulk-actions" + class="dropdown-content" > <li> <a - class="dropdown-trigger" - data-target="bulk-set-access" - v-dropdown-menu + class="dropdown-trigger" + data-target="bulk-set-access" + v-dropdown-menu > {{ translate('UsersManager_SetPermission') }} </a> <ul - id="bulk-set-access" - class="dropdown-content" + id="bulk-set-access" + class="dropdown-content" > <li v-for="access in bulkActionAccessLevels" :key="access.key"> <a - href="" - @click.prevent=" + href="" + @click.prevent=" userToChange = null; roleToChangeTo = access.key; showAccessChangeConfirm(); " > @@ -51,8 +51,8 @@ </li> <li> <a - href="" - @click.prevent=" + href="" + @click.prevent=" userToChange = null; roleToChangeTo = 'noaccess'; showAccessChangeConfirm(); " > @@ -61,74 +61,90 @@ </li> <li v-if="currentUserRole === 'superuser'"> <a - href="" - @click.prevent="showDeleteConfirm()" + href="" + @click.prevent="showDeleteConfirm()" >{{ translate('UsersManager_DeleteUsers') }}</a> </li> </ul> </div> - <div class="input-field col s12 m4 l4"> + <div class="input-field col s12 m3 l3"> <div - class="permissions-for-selector" + class="permissions-for-selector" > <Field - :model-value="userTextFilter" - @update:model-value="onUserTextFilterChange($event)" - name="user-text-filter" - uicontrol="text" - :full-width="true" - :placeholder="translate('UsersManager_UserSearch')" + :model-value="userTextFilter" + @update:model-value="onUserTextFilterChange($event)" + name="user-text-filter" + uicontrol="text" + :full-width="true" + :placeholder="translate('UsersManager_UserSearch')" /> </div> </div> - <div class="input-field col s12 m4 l4"> + <div class="input-field col s12 m3 l3"> <div> <Field - :model-value="accessLevelFilter" - @update:model-value="accessLevelFilter = $event; changeSearch({ + :model-value="accessLevelFilter" + @update:model-value="accessLevelFilter = $event; changeSearch({ filter_access: accessLevelFilter, offset: 0, })" - name="access-level-filter" - uicontrol="select" - :options="filterAccessLevels" - :full-width="true" - :placeholder="translate('UsersManager_FilterByAccess')" + name="access-level-filter" + uicontrol="select" + :options="filterAccessLevels" + :full-width="true" + :placeholder="translate('UsersManager_FilterByAccess')" + /> + </div> + </div> + <div class="input-field col s12 m3 l3"> + <div> + <Field + :model-value="statusLevelFilter" + @update:model-value="statusLevelFilter = $event; changeSearch({ + filter_status: statusLevelFilter, + offset: 0, + })" + name="status-level-filter" + uicontrol="select" + :options="filterStatusLevels" + :full-width="true" + :placeholder="translate('UsersManager_FilterByStatus')" /> </div> </div> </div> <div - class="input-field col s12 m12 l6 users-list-pagination-container" - v-if="totalEntries > searchParams.limit" + class="input-field col s12 m12 l4 users-list-pagination-container" + v-if="totalEntries > searchParams.limit" > <div class="usersListPagination"> <a - class="btn prev" - :class="{ disabled: searchParams.offset <= 0 }" - @click.prevent="gotoPreviousPage()" + class="btn prev" + :class="{ disabled: searchParams.offset <= 0 }" + @click.prevent="gotoPreviousPage()" > <span class="pointer">« {{ translate('General_Previous') }}</span> </a> <div class="counter"> <span - :class="{ visibility: isLoadingUsers ? 'hidden' : 'visible' }" + :class="{ visibility: isLoadingUsers ? 'hidden' : 'visible' }" > {{ translate( - 'General_Pagination', - paginationLowerBound, - paginationUpperBound, - totalEntries - ) }} + 'General_Pagination', + paginationLowerBound, + paginationUpperBound, + totalEntries + ) }} </span> <ActivityIndicator - :loading="isLoadingUsers" + :loading="isLoadingUsers" /> </div> <a - class="btn next" - :class="{ disabled: searchParams.offset + searchParams.limit >= totalEntries }" - @click.prevent="gotoNextPage()" + class="btn next" + :class="{ disabled: searchParams.offset + searchParams.limit >= totalEntries }" + @click.prevent="gotoNextPage()" > <span class="pointer">{{ translate('General_Next') }} »</span> </a> @@ -136,52 +152,52 @@ </div> </div> <div - class="roles-help-notification" - v-if="isRoleHelpToggled" + class="roles-help-notification" + v-if="isRoleHelpToggled" > <Notification - context="info" - type="persistent" - :noclear="true" + context="info" + type="persistent" + :noclear="true" > <span v-html="$sanitize(rolesHelpText)"></span> </Notification> </div> <ContentBlock> <table - id="manageUsersTable" - :class="{ loading: isLoadingUsers }" - v-content-table + id="manageUsersTable" + :class="{ loading: isLoadingUsers }" + v-content-table > <thead> - <tr> - <th class="select-cell"> + <tr> + <th class="select-cell"> <span class="checkbox-container"> <label> <input - type="checkbox" - id="paged_users_select_all" - checked="checked" - v-model="isAllCheckboxSelected" - @change="onAllCheckboxChange()" + type="checkbox" + id="paged_users_select_all" + checked="checked" + v-model="isAllCheckboxSelected" + @change="onAllCheckboxChange()" /> - <span /> + <span/> </label> </span> - </th> - <th class="first">{{ translate('UsersManager_Username') }}</th> - <th class="role_header"> - <span style="margin-right: 3.5px">{{ translate('UsersManager_RoleFor') }}</span> - <a + </th> + <th class="first">{{ translate('UsersManager_Username') }}</th> + <th class="role_header"> + <span style="margin-right: 3.5px">{{ translate('UsersManager_RoleFor') }}</span> + <a href="" class="helpIcon" @click.prevent="isRoleHelpToggled = !isRoleHelpToggled" :class="{ sticky: isRoleHelpToggled }" - > - <span class="icon-help" /> - </a> - <div> - <Field + > + <span class="icon-help"/> + </a> + <div> + <Field class="permissions-for-selector" :model-value="permissionsForSite" @update:model-value="onPermissionsForUpdate($event);" @@ -189,36 +205,37 @@ :ui-control-attributes="{ onlySitesWithAdminAccess: currentUserRole !== 'superuser', }" - /> - </div> - </th> - <th v-if="currentUserRole === 'superuser'">{{ translate('UsersManager_Email') }}</th> - <th + /> + </div> + </th> + <th v-if="currentUserRole === 'superuser'">{{ translate('UsersManager_Email') }}</th> + <th v-if="currentUserRole === 'superuser'" :title="translate('UsersManager_UsesTwoFactorAuthentication')" - >{{ translate('UsersManager_2FA') }}</th> - <th v-if="currentUserRole === 'superuser'">{{ translate('UsersManager_LastSeen') }}</th> - <th>{{ translate('UsersManager_Status') }}</th> - <th class="actions-cell-header"> - <div>{{ translate('General_Actions') }}</div> - </th> - </tr> + >{{ translate('UsersManager_2FA') }} + </th> + <th v-if="currentUserRole === 'superuser'">{{ translate('UsersManager_LastSeen') }}</th> + <th>{{ translate('UsersManager_Status') }}</th> + <th class="actions-cell-header"> + <div>{{ translate('General_Actions') }}</div> + </th> + </tr> </thead> <tbody> - <tr + <tr class="select-all-row" v-if="isAllCheckboxSelected && users.length && users.length < totalEntries" - > - <td colspan="8"> - <div v-if="!areAllResultsSelected"> + > + <td colspan="8"> + <div v-if="!areAllResultsSelected"> <span - v-html="$sanitize(translate( + v-html="$sanitize(translate( 'UsersManager_TheDisplayedUsersAreSelected', `<strong>${users.length}</strong>`, ))" - style="margin-right:3.5px" + style="margin-right:3.5px" ></span> - <a + <a class="toggle-select-all-in-search" href="#" @click.prevent="areAllResultsSelected = !areAllResultsSelected" @@ -226,16 +243,16 @@ 'UsersManager_ClickToSelectAll', `<strong>${totalEntries}</strong>`, ))" - ></a> - </div> - <div v-if="areAllResultsSelected"> + ></a> + </div> + <div v-if="areAllResultsSelected"> <span v-html="$sanitize(translate( 'UsersManager_AllUsersAreSelected', `<strong>${totalEntries}</strong>`, ))" - style="margin-right:3.5px" + style="margin-right:3.5px" ></span> - <a + <a class="toggle-select-all-in-search" href="#" @click.prevent="areAllResultsSelected = !areAllResultsSelected" @@ -243,32 +260,32 @@ 'UsersManager_ClickToSelectDisplayedUsers', `<strong>${users.length}</strong>`, ))" - ></a> - </div> - </td> - </tr> - <tr + ></a> + </div> + </td> + </tr> + <tr v-for="(user, index) in users" :id="`row${index}`" :key="user.login" - > - <td class="select-cell"> + > + <td class="select-cell"> <span class="checkbox-container"> <label> <input - type="checkbox" - :id="`paged_users_select_row${index}`" - v-model="selectedRows[index]" - @click="onRowSelected()" + type="checkbox" + :id="`paged_users_select_row${index}`" + v-model="selectedRows[index]" + @click="onRowSelected()" /> - <span /> + <span/> </label> </span> - </td> - <td id="userLogin">{{ user.login }}</td> - <td class="access-cell"> - <div> - <Field + </td> + <td id="userLogin">{{ user.login }}</td> + <td class="access-cell"> + <div> + <Field :model-value="user.role" @update:model-value=" userToChange = user; @@ -277,80 +294,89 @@ :disabled="user.role === 'superuser'" uicontrol="select" :options="user.login !== 'anonymous' ? accessLevels : anonymousAccessLevels" - /> - </div> - </td> - <td + /> + </div> + </td> + <td id="email" v-if="currentUserRole === 'superuser'" - >{{ user.email }}</td> - <td + >{{ user.email }} + </td> + <td id="twofa" v-if="currentUserRole === 'superuser'" - > + > <span - class="icon-ok" - v-if="user.uses_2fa" + class="icon-ok" + v-if="user.uses_2fa" /> - <span + <span class="icon-close" v-if="!user.uses_2fa" - /> - </td> - <td + /> + </td> + <td id="last_seen" v-if="currentUserRole === 'superuser'" + > + {{ user.last_seen ? `${user.last_seen} ago`:'-' }} + </td> + <td id="status"> + <span :class="Number.isInteger(user.invite_status)? 'pending':user.invite_status" + :title="user.invite_status === 'expired' ? + translate('UsersManager_ExpiredInviteAutomaticallyRemoved', '3') : + ''" + >{{ getInviteStatus(user.invite_status) }}</span> + </td> + <td class="center actions-cell"> + <button + class="resend table-action" + title="Resend Invite" + @click="userToChange = user; showResendConfirm()" + v-if="( + currentUserRole === 'superuser' + || (currentUserRole === 'admin' && user.invited_by === currentUserLogin) + ) && user.invite_status!=='active'" > - {{ user.last_seen ? `${user.last_seen} ago` : '-' }} - </td> - <td id="status"> - <span :class="user.invite_status"> - {{ getInviteStatus(user.invite_status) }} - </span> - </td> - <td class="center actions-cell"> - <button - class="resend table-action" - title="Resend Invite" - @click="userToChange = user; showResendConfirm()" - v-if="user.invite_status!=='accept'" - > - <span class="icon-email" /> - </button> + <span class="icon-email"/> + </button> - <button + <button class="edituser table-action" title="Edit" @click="$emit('editUser', { user: user })" v-if="user.login !== 'anonymous'" - > - <span class="icon-edit" /> - </button> - <button + > + <span class="icon-edit"/> + </button> + <button class="deleteuser table-action" title="Delete" @click="userToChange = user; showDeleteConfirm()" - v-if="currentUserRole === 'superuser' && user.login !== 'anonymous'" - > - <span class="icon-delete" /> - </button> - </td> - </tr> + v-if="( + currentUserRole === 'superuser' + || (currentUserRole === 'admin' && user.invited_by === currentUserLogin) + ) && user.login !== 'anonymous'" + > + <span class="icon-delete"/> + </button> + </td> + </tr> </tbody> </table> </ContentBlock> <div class="delete-user-confirm-modal modal" ref="deleteUserConfirmModal"> <div class="modal-content"> <h3 - v-if="userToChange" - v-html="$sanitize(translate( + v-if="userToChange" + v-html="$sanitize(translate( 'UsersManager_DeleteUserConfirmSingle', `<strong>${userToChange.login}</strong>`, ))" ></h3> <p - v-if="!userToChange" - v-html="$sanitize(translate( + v-if="!userToChange" + v-html="$sanitize(translate( 'UsersManager_DeleteUserConfirmMultiple', `<strong>${affectedUsersCount}</strong>`, ))" @@ -358,23 +384,23 @@ </div> <div class="modal-footer"> <a - href="" - class="modal-action modal-close btn" - @click.prevent="deleteRequestedUsers()" - style="margin-right:3.5px" + href="" + class="modal-action modal-close btn" + @click.prevent="deleteRequestedUsers()" + style="margin-right:3.5px" >{{ translate('General_Yes') }}</a> <a - href="" - class="modal-action modal-close modal-no" - @click.prevent="userToChange = null; roleToChangeTo = null;" + href="" + class="modal-action modal-close modal-no" + @click.prevent="userToChange = null; roleToChangeTo = null;" >{{ translate('General_No') }}</a> </div> </div> <div class="change-user-role-confirm-modal modal" ref="changeUserRoleConfirmModal"> <div class="modal-content"> <h3 - v-if="userToChange" - v-html="$sanitize(deleteUserPermConfirmSingleText)" + v-if="userToChange" + v-html="$sanitize(deleteUserPermConfirmSingleText)" ></h3> <h3 v-if="userToChange && userToChange.login === 'anonymous' && roleToChangeTo === 'view'"> <em>{{ translate('General_Note') }}: @@ -387,21 +413,21 @@ </em> </h3> <p - v-if="!userToChange" - v-html="$sanitize(deleteUserPermConfirmMultipleText)" + v-if="!userToChange" + v-html="$sanitize(deleteUserPermConfirmMultipleText)" ></p> </div> <div class="modal-footer"> <a - href="" - class="modal-action modal-close btn" - @click.prevent="changeUserRole()" - style="margin-right:3.5px" + href="" + class="modal-action modal-close btn" + @click.prevent="changeUserRole()" + style="margin-right:3.5px" >{{ translate('General_Yes') }}</a> <a - href="" - class="modal-action modal-close modal-no" - @click.prevent=" + href="" + class="modal-action modal-close modal-no" + @click.prevent=" userToChange = null; roleToChangeTo = null;" >{{ translate('General_No') }}</a> @@ -461,9 +487,10 @@ interface PagedUsersListState { selectedRows: Record<string, boolean>; isAllCheckboxSelected: boolean; isBulkActionsDisabled: boolean; - userToChange: User|null; - roleToChangeTo: string|null; - accessLevelFilter: string|null; + userToChange: User | null; + roleToChangeTo: string | null; + accessLevelFilter: string | null; + statusLevelFilter: string | null; isRoleHelpToggled: boolean; userTextFilter: string; permissionsForSite: SiteRef; @@ -491,6 +518,10 @@ export default defineComponent({ type: Array, required: true, }, + filterStatusLevels: { + type: Array, + required: true, + }, totalEntries: Number, users: { type: Array, @@ -520,6 +551,7 @@ export default defineComponent({ userToChange: null, roleToChangeTo: null, accessLevelFilter: null, + statusLevelFilter: null, isRoleHelpToggled: false, userTextFilter: '', permissionsForSite: { @@ -538,17 +570,14 @@ export default defineComponent({ }, }, methods: { - getInviteStatus(inviteStatus: string|null) { - if (inviteStatus === 'accept') { - return translate('UsersManager_Active'); - } - if (inviteStatus === 'pending') { - return translate('UsersManager_Pending'); + getInviteStatus(inviteStatus: string | number) { + if (Number.isInteger(inviteStatus)) { + return translate('UsersManager_InviteDayLeft', inviteStatus); } if (inviteStatus === 'expired') { return translate('UsersManager_Expired'); } - return translate('UsersManager_Decline'); + return translate('UsersManager_Active'); }, onPermissionsForUpdate(site: SiteRef) { this.permissionsForSite = site; @@ -596,21 +625,27 @@ export default defineComponent({ }); }, showDeleteConfirm() { - $(this.$refs.deleteUserConfirmModal as HTMLElement).modal({ - dismissible: false, - }).modal('open'); + $(this.$refs.deleteUserConfirmModal as HTMLElement) + .modal({ + dismissible: false, + }) + .modal('open'); }, showResendConfirm() { - $(this.$refs.resendInviteConfirmModal as HTMLElement).modal({ - dismissible: false, - }).modal('open'); + $(this.$refs.resendInviteConfirmModal as HTMLElement) + .modal({ + dismissible: false, + }) + .modal('open'); }, showAccessChangeConfirm() { - $(this.$refs.changeUserRoleConfirmModal as HTMLElement).modal({ - dismissible: false, - }).modal('open'); + $(this.$refs.changeUserRoleConfirmModal as HTMLElement) + .modal({ + dismissible: false, + }) + .modal('open'); }, - getRoleDisplay(role: string|null) { + getRoleDisplay(role: string | null) { let result = null; (this.accessLevels as AccessLevel[]).forEach((entry) => { if (entry.key === role) { @@ -640,10 +675,16 @@ export default defineComponent({ }, onUserTextFilterChange(filter: string) { this.userTextFilter = filter; - this.changeSearch({ filter_search: filter, offset: 0 }); + this.changeSearch({ + filter_search: filter, + offset: 0, + }); }, }, computed: { + currentUserLogin() { + return Matomo.userLogin; + }, paginationLowerBound() { return this.searchParams.offset + 1; }, @@ -671,14 +712,15 @@ export default defineComponent({ const users = this.users as User[]; const result: User[] = []; - Object.keys(this.selectedRows).forEach((index) => { - const indexN = parseInt(index, 10); - if (this.selectedRows[index] - && users[indexN] // sanity check - ) { - result.push(users[indexN]); - } - }); + Object.keys(this.selectedRows) + .forEach((index) => { + const indexN = parseInt(index, 10); + if (this.selectedRows[index] + && users[indexN] // sanity check + ) { + result.push(users[indexN]); + } + }); return result; }, rolesHelpText() { @@ -701,11 +743,12 @@ export default defineComponent({ }, selectedCount() { let selectedRowKeyCount = 0; - Object.keys(this.selectedRows).forEach((key) => { - if (this.selectedRows[key]) { - selectedRowKeyCount += 1; - } - }); + Object.keys(this.selectedRows) + .forEach((key) => { + if (this.selectedRows[key]) { + selectedRowKeyCount += 1; + } + }); return selectedRowKeyCount; }, deleteUserPermConfirmSingleText() { @@ -737,8 +780,3 @@ export default defineComponent({ }, }); </script> -<style scoped> -.actions-cell { - text-align: left!important; -} -</style> diff --git a/plugins/UsersManager/vue/src/PagedUsersList/SearchParams.ts b/plugins/UsersManager/vue/src/PagedUsersList/SearchParams.ts index 9fd4b7f657..5109a2fd10 100644 --- a/plugins/UsersManager/vue/src/PagedUsersList/SearchParams.ts +++ b/plugins/UsersManager/vue/src/PagedUsersList/SearchParams.ts @@ -11,6 +11,7 @@ interface SearchParams { offset: number; filter_search: string; filter_access: string; + filter_status: string; } export default SearchParams; diff --git a/plugins/UsersManager/vue/src/User.ts b/plugins/UsersManager/vue/src/User.ts index 88fc0be970..eff29d9595 100644 --- a/plugins/UsersManager/vue/src/User.ts +++ b/plugins/UsersManager/vue/src/User.ts @@ -12,7 +12,7 @@ interface User { password?: string; email: string; role?: string; - invited_at?: string; + invite_status?: string; } export default User; diff --git a/plugins/UsersManager/vue/src/UserEditForm/UserEditForm.vue b/plugins/UsersManager/vue/src/UserEditForm/UserEditForm.vue index 6df10c52fd..c9d7c95c4d 100644 --- a/plugins/UsersManager/vue/src/UserEditForm/UserEditForm.vue +++ b/plugins/UsersManager/vue/src/UserEditForm/UserEditForm.vue @@ -94,7 +94,7 @@ </div> <div> <Field - v-if="isPendingUser" + v-if="!isPending" :model-value="theUser.password" :disabled="isSavingUserInfo || (currentUserRole !== 'superuser' && !isAdd) || isShowingPasswordConfirm" @@ -332,7 +332,7 @@ const DEFAULT_USER: User = { uses_2fa: false, password: '', email: '', - invited_at: '', + invite_status: '', }; interface UserEditFormState { @@ -484,10 +484,10 @@ export default defineComponent({ this.firstSiteAccess = null; this.isSavingUserInfo = false; this.isUserModified = true; - this.theUser.invited_at = 'xx'; + this.theUser.invite_status = 'pending'; this.resetPasswordVar(); - this.showUserSavedNotification(); + this.showUserCreatedNotification(); }); }, resetPasswordVar() { @@ -523,6 +523,13 @@ export default defineComponent({ type: 'toast', }); }, + showUserCreatedNotification() { + NotificationsStore.show({ + message: translate('UsersManager_InviteSuccess'), + context: 'success', + type: 'toast', + }); + }, reset2FA() { this.isResetting2FA = true; return AjaxHelper.post({ @@ -585,12 +592,17 @@ export default defineComponent({ ? translate('UsersManager_InviteUser') : translate('UsersManager_SaveBasicInfo'); }, - isPendingUser() { - // eslint-disable-next-line eqeqeq - return this.user && (this.theUser.invited_at === '' || !this.theUser.invited_at); + isPending() { + if (!this.user) { + return true; + } + if (this.user.invite_status === 'pending' || Number.isInteger(this.user.invite_status)) { + return true; + } + return false; }, isAdd() { - return !this.user; // purposefully checking input property not theUser state + return !this.user; }, changePasswordTitle() { return translate( diff --git a/plugins/UsersManager/vue/src/UsersManager/UsersManager.adapter.ts b/plugins/UsersManager/vue/src/UsersManager/UsersManager.adapter.ts index 2bfae741ff..b3bd967d9b 100644 --- a/plugins/UsersManager/vue/src/UsersManager/UsersManager.adapter.ts +++ b/plugins/UsersManager/vue/src/UsersManager/UsersManager.adapter.ts @@ -26,6 +26,9 @@ export default createAngularJsAdapter({ filterAccessLevels: { angularJsBind: '<', }, + filterStatusLevels: { + angularJsBind: '<', + }, }, directiveName: 'piwikUsersManager', restrict: 'E', diff --git a/plugins/UsersManager/vue/src/UsersManager/UsersManager.vue b/plugins/UsersManager/vue/src/UsersManager/UsersManager.vue index ac510ef3b1..b9cfcdc462 100644 --- a/plugins/UsersManager/vue/src/UsersManager/UsersManager.vue +++ b/plugins/UsersManager/vue/src/UsersManager/UsersManager.vue @@ -10,8 +10,8 @@ <div v-content-intro> <h2> <EnrichedHeadline - help-url="https://matomo.org/docs/manage-users/" - feature-name="Users Management" + help-url="https://matomo.org/docs/manage-users/" + feature-name="Users Management" > {{ translate('UsersManager_ManageUsers') }} </EnrichedHeadline> @@ -26,19 +26,19 @@ <div class="col s12"> <div class="input-field" style="margin-right:3.5px"> <a - class="btn add-new-user" - @click="onAddNewUser()" + class="btn add-new-user" + @click="onAddNewUser()" > {{ translate('UsersManager_InviteNewUser') }} </a> </div> <div - class="input-field" - v-if="currentUserRole !== 'superuser'" + class="input-field" + v-if="currentUserRole !== 'superuser'" > <a - class="btn add-existing-user" - @click="showAddExistingUserModal()" + class="btn add-existing-user" + @click="showAddExistingUserModal()" > {{ translate('UsersManager_AddExistingUser') }} </a> @@ -46,34 +46,35 @@ </div> </div> <PagedUsersList - @edit-user="onEditUser($event.user)" - @change-user-role="onChangeUserRole($event.users, $event.role)" - @delete-user="onDeleteUser($event.users)" - @search-change="searchParams = $event.params; fetchUsers()" - @resend-invite="onResendInvite($event.user)" - :initial-site-id="initialSiteId" - :initial-site-name="initialSiteName" - :is-loading-users="isLoadingUsers" - :current-user-role="currentUserRole" - :access-levels="accessLevels" - :filter-access-levels="actualFilterAccessLevels" - :search-params="searchParams" - :users="users" - :total-entries="totalEntries" + @edit-user="onEditUser($event.user)" + @change-user-role="onChangeUserRole($event.users, $event.role)" + @delete-user="onDeleteUser($event.users)" + @search-change="searchParams = $event.params; fetchUsers()" + @resend-invite="onResendInvite($event.user)" + :initial-site-id="initialSiteId" + :initial-site-name="initialSiteName" + :is-loading-users="isLoadingUsers" + :current-user-role="currentUserRole" + :access-levels="accessLevels" + :filter-access-levels="actualFilterAccessLevels" + :filter-status-levels="filterStatusLevels" + :search-params="searchParams" + :users="users" + :total-entries="totalEntries" /> </div> </div> <!-- TODO: whether a user is being edited should be part of the URL --> <div v-if="isEditing"> <UserEditForm - @done="onDoneEditing($event.isUserModified)" - :user="userBeingEdited" - :current-user-role="currentUserRole" - :access-levels="accessLevels" - :filter-access-levels="actualFilterAccessLevels" - :initial-site-id="initialSiteId" - :initial-site-name="initialSiteName" - @updated="userBeingEdited = $event.user" + @done="onDoneEditing($event.isUserModified)" + :user="userBeingEdited" + :current-user-role="currentUserRole" + :access-levels="accessLevels" + :filter-access-levels="actualFilterAccessLevels" + :initial-site-id="initialSiteId" + :initial-site-name="initialSiteName" + @updated="userBeingEdited = $event.user" /> </div> <div class="add-existing-user-modal modal" ref="addExistingUserModal"> @@ -82,23 +83,23 @@ <p>{{ translate('UsersManager_EnterUsernameOrEmail') }}:</p> <div> <Field - v-model="addNewUserLoginEmail" - name="add-existing-user-email" - uicontrol="text" + v-model="addNewUserLoginEmail" + name="add-existing-user-email" + uicontrol="text" /> </div> </div> <div class="modal-footer"> <a - href - class="modal-action modal-close btn" - @click.prevent="addExistingUser()" - style="margin-right:3.5px" + href + class="modal-action modal-close btn" + @click.prevent="addExistingUser()" + style="margin-right:3.5px" >{{ translate('General_Add') }}</a> <a - href - class="modal-action modal-close modal-no" - @click.prevent="addNewUserLoginEmail = null" + href + class="modal-action modal-close modal-no" + @click.prevent="addNewUserLoginEmail = null" >{{ translate('General_Cancel') }}</a> </div> </div> @@ -116,6 +117,8 @@ import { Matomo, MatomoUrl, AjaxHelper, + translate, + NotificationsStore, } from 'CoreHome'; import { Field } from 'CorePluginsAdmin'; import PagedUsersList from '../PagedUsersList/PagedUsersList.vue'; @@ -127,8 +130,8 @@ interface UsersManagerState { isEditing: boolean; isCurrentUserSuperUser: boolean; users: User[]; - userBeingEdited: User|null; - totalEntries: null|number; + userBeingEdited: User | null; + totalEntries: null | number; searchParams: SearchParams; isLoadingUsers: boolean; addNewUserLoginEmail: string; @@ -160,6 +163,10 @@ export default defineComponent({ type: Array, required: true, }, + filterStatusLevels: { + type: Array, + required: true, + }, }, components: { EnrichedHeadline, @@ -182,6 +189,7 @@ export default defineComponent({ limit: NUM_USERS_PER_PAGE, filter_search: '', filter_access: '', + filter_status: '', idSite: this.initialSiteId, }, isLoadingUsers: false, @@ -210,69 +218,90 @@ export default defineComponent({ } }, showAddExistingUserModal() { - $(this.$refs.addExistingUserModal as HTMLElement).modal({ dismissible: false }).modal('open'); + $(this.$refs.addExistingUserModal as HTMLElement) + .modal({ dismissible: false }) + .modal('open'); }, - onChangeUserRole(users: User[]|string, role: string) { + onChangeUserRole(users: User[] | string, role: string) { this.isLoadingUsers = true; - Promise.resolve().then(() => { - if (users === 'all') { - return this.getAllUsersInSearch(); - } - return users as User[]; - }).then((usersResolved) => ( - usersResolved.filter((u) => u.role !== 'superuser').map((u) => u.login) - )).then((userLogins) => { - const requests = userLogins.map((login) => ({ - method: 'UsersManager.setUserAccess', - userLogin: login, - access: role, - idSites: this.searchParams.idSite, - ignoreSuperusers: 1, - })); + Promise.resolve() + .then(() => { + if (users === 'all') { + return this.getAllUsersInSearch(); + } + return users as User[]; + }) + .then((usersResolved) => ( + usersResolved.filter((u) => u.role !== 'superuser') + .map((u) => u.login) + )) + .then((userLogins) => { + const requests = userLogins.map((login) => ({ + method: 'UsersManager.setUserAccess', + userLogin: login, + access: role, + idSites: this.searchParams.idSite, + ignoreSuperusers: 1, + })); - return AjaxHelper.fetch(requests, { createErrorNotification: true }); - }).catch(() => { - // ignore (errors will still be displayed to the user) - }).then(() => this.fetchUsers()); + return AjaxHelper.fetch(requests, { createErrorNotification: true }); + }) + .catch(() => { + // ignore (errors will still be displayed to the user) + }) + .then(() => this.fetchUsers()); }, getAllUsersInSearch() { return AjaxHelper.fetch<User[]>({ method: 'UsersManager.getUsersPlusRole', filter_search: this.searchParams.filter_search, filter_access: this.searchParams.filter_access, + filter_status: this.searchParams.filter_status, idSite: this.searchParams.idSite, filter_limit: '-1', }); }, - onDeleteUser(users: User[]|string) { + onDeleteUser(users: User[] | string) { this.isLoadingUsers = true; - Promise.resolve().then(() => { - if (users === 'all') { - return this.getAllUsersInSearch(); - } - return users as User[]; - }).then((usersResolved) => usersResolved.map((u) => u.login)).then((userLogins) => { - const requests = userLogins.map((login) => ({ - method: 'UsersManager.deleteUser', - userLogin: login, - })); - return AjaxHelper.fetch(requests, { createErrorNotification: true }); - }).catch(() => { - // ignore (errors will still be displayed to the user) - }).then(() => this.fetchUsers()); + Promise.resolve() + .then(() => { + if (users === 'all') { + return this.getAllUsersInSearch(); + } + return users as User[]; + }) + .then((usersResolved) => usersResolved.map((u) => u.login)) + .then((userLogins) => { + const requests = userLogins.map((login) => ({ + method: 'UsersManager.deleteUser', + userLogin: login, + })); + return AjaxHelper.fetch(requests, { createErrorNotification: true }); + }) + .catch(() => { + // ignore (errors will still be displayed to the user) + }) + .then(() => this.fetchUsers()); }, onResendInvite(user: User) { - console.log(user); AjaxHelper.fetch<AjaxHelper>( { method: 'UsersManager.resendInvite', userLogin: user.login, }, - ).then((res) => { - console.log(res); - }); + ) + .then(() => { + this.fetchUsers(); + const id = NotificationsStore.show({ + message: translate('UsersManager_ResendInviteSuccess', user.login), + id: 'resendinvite', + context: 'success', + type: 'transient', + }); + NotificationsStore.scrollToNotification(id); + }); }, fetchUsers() { this.isLoadingUsers = true; @@ -282,50 +311,57 @@ export default defineComponent({ method: 'UsersManager.getUsersPlusRole', }, { returnResponseObject: true }, - ).then((helper) => { - const result = helper.getRequestHandle()!; + ) + .then((helper) => { + const result = helper.getRequestHandle()!; - this.totalEntries = parseInt( - result.getResponseHeader('x-matomo-total-results') || '0', - 10, - ); - this.users = result.responseJSON as User[]; + this.totalEntries = parseInt( + result.getResponseHeader('x-matomo-total-results') || '0', + 10, + ); + this.users = result.responseJSON as User[]; - this.isLoadingUsers = false; - }).catch(() => { - this.isLoadingUsers = false; - }); + this.isLoadingUsers = false; + }) + .catch(() => { + this.isLoadingUsers = false; + }); }, addExistingUser() { this.isLoadingUsers = true; return AjaxHelper.fetch<{ value: boolean }>({ method: 'UsersManager.userExists', userLogin: this.addNewUserLoginEmail, - }).then((response) => { - if (response && response.value) { - return this.addNewUserLoginEmail; - } + }) + .then((response) => { + if (response && response.value) { + return this.addNewUserLoginEmail; + } - return AjaxHelper.fetch<{ value: string }>({ - method: 'UsersManager.getUserLoginFromUserEmail', - userEmail: this.addNewUserLoginEmail, - }).then((r) => r.value); - }).then((login) => ( - AjaxHelper.post( - { - method: 'UsersManager.setUserAccess', - }, - { - userLogin: login, - access: 'view', - idSites: this.searchParams.idSite, - }, + return AjaxHelper.fetch<{ value: string }>({ + method: 'UsersManager.getUserLoginFromUserEmail', + userEmail: this.addNewUserLoginEmail, + }) + .then((r) => r.value); + }) + .then((login) => ( + AjaxHelper.post( + { + method: 'UsersManager.setUserAccess', + }, + { + userLogin: login, + access: 'view', + idSites: this.searchParams.idSite, + }, + ) + )) + .then( + () => this.fetchUsers(), ) - )).then( - () => this.fetchUsers(), - ).catch(() => { - this.isLoadingUsers = false; - }); + .catch(() => { + this.isLoadingUsers = false; + }); }, onAddNewUser() { const parameters = { isAllowed: true }; @@ -341,7 +377,10 @@ export default defineComponent({ computed: { actualFilterAccessLevels() { if (this.currentUserRole === 'superuser') { - return [...this.filterAccessLevels, { key: 'superuser', value: 'Superuser' }]; + return [...this.filterAccessLevels, { + key: 'superuser', + value: 'Superuser', + }]; } return this.filterAccessLevels; }, diff --git a/tests/UI/expected-screenshots/UIIntegrationTest_admin_diagnostics_configfile.png b/tests/UI/expected-screenshots/UIIntegrationTest_admin_diagnostics_configfile.png index f9724156e1..80832365fe 100644 --- a/tests/UI/expected-screenshots/UIIntegrationTest_admin_diagnostics_configfile.png +++ b/tests/UI/expected-screenshots/UIIntegrationTest_admin_diagnostics_configfile.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5352bb565d46cc2a592f0159393bb05057c249d3d07b9d87fea7ec838cae2b26 -size 5275447 +oid sha256:e12b1595e130c0209e7aa4ef1443e68f3ef7293bd894418461727106434b7bf7 +size 5281597 diff --git a/tests/UI/expected-screenshots/UIIntegrationTest_api_listing.png b/tests/UI/expected-screenshots/UIIntegrationTest_api_listing.png index 59e8f53d21..bc8b7b0a7c 100644 --- a/tests/UI/expected-screenshots/UIIntegrationTest_api_listing.png +++ b/tests/UI/expected-screenshots/UIIntegrationTest_api_listing.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e6291f3e7475eef0fe07443cd97cb383bf1275316cd8fccc03060cb695f71be0 -size 5047076 +oid sha256:27bb59b71f59488156451d7084ad57da7b16568ba22c47c8b886ad927bf3526a +size 5047584 diff --git a/tests/resources/OmniFixture-dump.sql b/tests/resources/OmniFixture-dump.sql index 840d99ca7e..c49ddce62c 100644 --- a/tests/resources/OmniFixture-dump.sql +++ b/tests/resources/OmniFixture-dump.sql @@ -1256,7 +1256,6 @@ CREATE TABLE `user` ( `superuser_access` tinyint(2) unsigned NOT NULL DEFAULT '0', `date_registered` timestamp NULL DEFAULT NULL, `ts_password_modified` timestamp NULL DEFAULT NULL, - `invite_status` enum('accept','pending','decline','expired'), PRIMARY KEY (`login`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; @@ -1267,7 +1266,7 @@ CREATE TABLE `user` ( LOCK TABLES `user` WRITE; /*!40000 ALTER TABLE `user` DISABLE KEYS */; -INSERT INTO `user` VALUES ('superUserLogin','$2y$10$mbMrIm8ZN82gFoNsV76Z3.avOWosOlT.D/6Pz4EZzhmxbedUeOyzm','hello@example.org','',1,'2020-04-15 14:02:31','2020-04-15 14:02:31',null); +INSERT INTO `user` VALUES ('superUserLogin','$2y$10$mbMrIm8ZN82gFoNsV76Z3.avOWosOlT.D/6Pz4EZzhmxbedUeOyzm','hello@example.org','',1,'2020-04-15 14:02:31','2020-04-15 14:02:31'); /*!40000 ALTER TABLE `user` ENABLE KEYS */; UNLOCK TABLES; |