Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/matomo-org/matomo.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Zhang <peter@innocraft.com>2022-07-08 14:24:54 +0300
committerGitHub <noreply@github.com>2022-07-08 14:24:54 +0300
commit5df7397b4276a8f23e5537b7ba84394f4238dbed (patch)
treef38e8706090a4fb6d687415a89b29377d9bfda11
parent49adc21534740eeb62a700562cdde095c7fa9589 (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>
-rw-r--r--CHANGELOG.md15
-rw-r--r--composer.json5
-rw-r--r--config/global.ini.php3
-rw-r--r--core/Db/Schema/Mysql.php9
-rw-r--r--core/Updates/4.11.0-rc2.php104
-rw-r--r--core/Validators/Login.php59
-rw-r--r--core/Version.php2
-rw-r--r--plugins/CoreAdminHome/lang/en.json2
-rw-r--r--plugins/Login/Controller.php257
-rw-r--r--plugins/Login/PasswordResetter.php9
-rw-r--r--plugins/Login/lang/en.json16
-rw-r--r--plugins/Login/templates/invitation.twig136
-rw-r--r--plugins/Login/templates/invitationDecline.twig23
-rw-r--r--plugins/Login/templates/invitationDeclineSuccess.twig11
-rw-r--r--plugins/Login/templates/inviteLayout.twig46
-rw-r--r--plugins/Login/tests/Fixtures/PendingUsers.php38
-rw-r--r--plugins/Login/tests/Integration/LoginTest.php14
-rw-r--r--plugins/Login/tests/Integration/PasswordResetterTest.php21
-rw-r--r--plugins/Login/tests/UI/Decline_spec.js18
-rw-r--r--plugins/Login/tests/UI/Invite_spec.js21
-rw-r--r--plugins/Login/tests/UI/expected-screenshots/Decline_default.png4
-rw-r--r--plugins/Login/tests/UI/expected-screenshots/Decline_success.png3
-rw-r--r--plugins/Login/tests/UI/expected-screenshots/Invite_error.png4
-rw-r--r--plugins/Login/tests/UI/expected-screenshots/Invite_set_password.png4
-rw-r--r--plugins/Login/tests/UI/expected-screenshots/Invite_wrong_password.png4
-rw-r--r--plugins/SegmentEditor/SegmentEditor.php50
-rw-r--r--plugins/Transitions/tests/UI/expected-screenshots/Transitions_transitions_popup_urls.png4
-rw-r--r--plugins/TwoFactorAuth/tests/UI/expected-screenshots/TwoFactorAuthUsersManager_list.png4
-rw-r--r--plugins/UsersManager/API.php316
-rw-r--r--plugins/UsersManager/Controller.php7
-rw-r--r--plugins/UsersManager/Emails/UserInviteEmail.php44
-rw-r--r--plugins/UsersManager/Model.php100
-rw-r--r--plugins/UsersManager/Repository/UserRepository.php197
-rw-r--r--plugins/UsersManager/Sql/UserTableFilter.php32
-rw-r--r--plugins/UsersManager/Tasks.php23
-rw-r--r--plugins/UsersManager/UserAccessFilter.php3
-rw-r--r--plugins/UsersManager/UsersManager.php34
-rw-r--r--plugins/UsersManager/Validators/Email.php26
-rw-r--r--plugins/UsersManager/Validators/Login.php22
-rw-r--r--plugins/UsersManager/lang/en.json12
-rw-r--r--plugins/UsersManager/templates/index.twig1
-rw-r--r--plugins/UsersManager/tests/Fixtures/ManyUsers.php90
-rw-r--r--plugins/UsersManager/tests/Integration/APITest.php747
-rw-r--r--plugins/UsersManager/tests/Integration/UserInviteTest.php102
-rw-r--r--plugins/UsersManager/tests/Integration/UsersManagerTest.php273
-rw-r--r--plugins/UsersManager/tests/System/ApiTest.php13
-rw-r--r--plugins/UsersManager/tests/System/expected/test___UsersManager.getUser_login1_when_superuseraccess.xml4
-rw-r--r--plugins/UsersManager/tests/System/expected/test___UsersManager.getUser_login2_when_adminaccess.xml1
-rw-r--r--plugins/UsersManager/tests/System/expected/test___UsersManager.getUser_login2_when_superuseraccess.xml4
-rw-r--r--plugins/UsersManager/tests/System/expected/test___UsersManager.getUser_login4_when_superuseraccess.xml4
-rw-r--r--plugins/UsersManager/tests/System/expected/test___UsersManager.getUser_login4_when_viewaccess.xml1
-rw-r--r--plugins/UsersManager/tests/System/expected/test___UsersManager.getUser_login6_when_superuseraccess.xml4
-rw-r--r--plugins/UsersManager/tests/System/expected/test___UsersManager.getUsersLogin__when_adminaccess.xml1
-rw-r--r--plugins/UsersManager/tests/System/expected/test___UsersManager.getUsersLogin__when_superuseraccess.xml1
-rw-r--r--plugins/UsersManager/tests/System/expected/test___UsersManager.getUsersWithSiteAccess_3_admin_when_superuseraccess.xml8
-rw-r--r--plugins/UsersManager/tests/System/expected/test___UsersManager.getUsers__when_adminaccess.xml16
-rw-r--r--plugins/UsersManager/tests/System/expected/test___UsersManager.getUsers__when_superuseraccess.xml84
-rw-r--r--plugins/UsersManager/tests/UI/UsersManager_spec.js32
-rw-r--r--plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_add_new_user_form.png4
-rw-r--r--plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_admin_view_admin_add_user.png4
-rw-r--r--plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_admin_view_admin_add_user_by_email.png4
-rw-r--r--plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_admin_view_admin_add_user_by_login.png4
-rw-r--r--plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_admin_view_admin_add_user_not_exists.png4
-rw-r--r--plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_admin_view_admin_load.png4
-rw-r--r--plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_all_rows_deselected.png4
-rw-r--r--plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_all_rows_in_search.png4
-rw-r--r--plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_all_rows_selected.png4
-rw-r--r--plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_bulk_remove_access.png4
-rw-r--r--plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_bulk_set_access.png4
-rw-r--r--plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_bulk_set_access_confirm.png4
-rw-r--r--plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_delete_bulk_access.png4
-rw-r--r--plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_delete_single.png4
-rw-r--r--plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_edit_user_basic_asks_confirmation.png4
-rw-r--r--plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_edit_user_basic_confirmed_wrong_password.png4
-rw-r--r--plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_edit_user_form.png4
-rw-r--r--plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_filters.png4
-rw-r--r--plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_load.png4
-rw-r--r--plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_manage_users_back.png4
-rw-r--r--plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_next_click.png4
-rw-r--r--plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_permissions_all_rows_in_search.png4
-rw-r--r--plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_permissions_edit.png4
-rw-r--r--plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_previous.png4
-rw-r--r--plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_resend_popup.png4
-rw-r--r--plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_resend_success.png3
-rw-r--r--plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_role_for.png4
-rw-r--r--plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_rows_selected.png4
-rw-r--r--plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_user_created.png4
-rw-r--r--plugins/UsersManager/vue/dist/UsersManager.umd.js567
-rw-r--r--plugins/UsersManager/vue/dist/UsersManager.umd.min.js20
-rw-r--r--plugins/UsersManager/vue/src/PagedUsersList/PagedUsersList.less13
-rw-r--r--plugins/UsersManager/vue/src/PagedUsersList/PagedUsersList.vue480
-rw-r--r--plugins/UsersManager/vue/src/PagedUsersList/SearchParams.ts1
-rw-r--r--plugins/UsersManager/vue/src/User.ts2
-rw-r--r--plugins/UsersManager/vue/src/UserEditForm/UserEditForm.vue28
-rw-r--r--plugins/UsersManager/vue/src/UsersManager/UsersManager.adapter.ts3
-rw-r--r--plugins/UsersManager/vue/src/UsersManager/UsersManager.vue273
-rw-r--r--tests/UI/expected-screenshots/UIIntegrationTest_admin_diagnostics_configfile.png4
-rw-r--r--tests/UI/expected-screenshots/UIIntegrationTest_api_listing.png4
-rw-r--r--tests/resources/OmniFixture-dump.sql3
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 &amp; conditions%2$s",
+ "BySigningUpPrivacyPolicyAndTermsAndCondition": "By signing up, I accept the %1$sprivacy policy%2$s and the %3$sterms &amp; conditions%4$s",
+ "AcceptPrivacyPolicy": "You need to accept the privacy policy.",
+ "AcceptTermsAndCondition": "You need to accept the terms &amp; conditions.",
+ "AcceptPrivacyPolicyAndTermsAndCondition": "You need to accept the privacy policy and the terms &amp; 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">&#xAB; {{ 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') }} &#xBB;</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;