diff options
author | dizzy <diosmosis@users.noreply.github.com> | 2022-02-09 20:30:36 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-02-09 20:30:36 +0300 |
commit | c0a1767561ddc7fa85b11b713febdb027c3323cf (patch) | |
tree | ee8a2137a0ae1ed45ef264a255185d204dfd4531 | |
parent | 3dde24427e41e384fdb478a8e047e8cbb3fa4d51 (diff) |
[Vue] migrate user-permissions-edit component to vue (#18572)
* fix couple tests
* fix several test failures
* fix string concat
* fix test failure
* extra change
* fix last change and random failure
* styling fix
* fix last fix
* real fix this time
* fix stray request
* proper fix
* update build files
* try to fix random failure
* do not submit form
* check for api errors in promise chain in ajaxhelper.ts
* force a digest after a location change
* use proper abortcontroller method instead of promise hack, have to add new polyfill + try to fix random test failure
* some UI test fixes
* fix some report export issues
* several save button fixes + make replace approximation in createAngularJsAdapter better
* fix sparkline
* apply after manual click triggering in savebutton
* css fixes and piwik-content-table was never applied by angularjs in installtion
* rebuild vue
* add names to divs so they can still be queried as they were in angularjs
* rebuild vue
* rebuild vue
* now that format_metrics checkbox works, need to check it
* small delay before processing first popover
* fix dropdown class/directive name
* fix overlay test
* remove unintended changes
* remove unintended changes
* migrate archiving controller
* do not do a passthrough transpile of vue typescript, and fix many typescript errors in existing code
* more typescript fixes
* even more fixes
* workarounds to fix recursive typing issues
* get corehome to build w/ full typescript build and output type definitions to local dir
* get outputted typings to be used when compiling other plugins and fix typescript issues in CorePluginsAdmin
* readd corehome umd
* fix typescript errors in ExampleVue plugin
* fix feedback typescript errors
* rebuild
* migrate branding controller and get to build
* fix issues and get to work
* rebuild
* fix notification scroll
* migrate smtp settings controller in coreadminhome
* get to work
* migrate js tracking code generator and get to build
* migrate image tracking code generator and get to build
* get to work in UI
* get UI tests to pass locally
* forgot to add files + rebuild vue
* update screenshots
* Show a summary of new features (#18065)
* Added "What is new" notification display, populated by a new event
* Removed test example event hook
* Added support for applying a link attribute to menu items, fixes layout issue for mobile with html menu items
* Updated UI test screenshots
* Revert accidental edit
* Hide the "What's new" icon if there are no new features to show
* Changed to use changes.json, track user last viewed, added ui test
* Fix UserManager unit tests broken by new ts_changes_viewed user field
* Moved getChanges to separate helper class, added unit test, added user view access check
* Updated to add new changes table and populate only on plugin update/install
* Added missing fixture class, updated UI screenshots
* Updated matomo font to add ringing bell and new releases icons
* Fix for integration test
* Reworked class structure, removed unnecessary angular directive, merged templates, other tidy ups
* built vue files
* built vue files
* Added null user check, missing table exception handling, show plugin name in change title, better handling of missing change fields
* Added sample changes file, moved UserChanges db code to changes model, added return type hints, better db error code handling, various other improvements
* Revert accidental UI screenshot commit
* Fix for incorrect link name parameter in sample changes, switched back to using $db->query for INSERT IGNORE
* Integration test fix, UI screenshot updates
* Test fix
* Added link styling, show CoreHome changes without plugin prefix in title
* Update UI test screenshot
* Added styles to the popover, added event for filtering changes
* Test fix
* UI test screenshot updates
Co-authored-by: sgiehl <stefan@matomo.org>
Co-authored-by: bx80 <bx80@users.noreply.github.com>
* Update test translation (#18531)
update a test failed XML
* updates all submodules (#18541)
Co-authored-by: diosmosis <diosmosis@users.noreply.github.com>
* Translations update from Hosted Weblate (#18529)
* Translated using Weblate (Greek)
Currently translated at 100.0% (162 of 162 strings)
Translation: Matomo/Plugin CoreAdminHome
Translate-URL: https://hosted.weblate.org/projects/matomo/plugin-coreadminhome/el/
[ci skip]
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Vasilis Lourdas <dev@lourdas.eu>
* Translated using Weblate (Chinese (Simplified))
Currently translated at 83.9% (136 of 162 strings)
Translation: Matomo/Plugin CoreAdminHome
Translate-URL: https://hosted.weblate.org/projects/matomo/plugin-coreadminhome/zh_Hans/
[ci skip]
Translated using Weblate (Chinese (Simplified))
Currently translated at 99.6% (620 of 622 strings)
Translation: Matomo/Matomo Base
Translate-URL: https://hosted.weblate.org/projects/matomo/matomo-base/zh_Hans/
[ci skip]
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: 刘韬 <lyuutau@outlook.com>
* Update translation files
Updated by "Squash Git commits" hook in Weblate.
Translation: Matomo/Plugin CoreAdminHome
Translate-URL: https://hosted.weblate.org/projects/matomo/plugin-coreadminhome/
[ci skip]
Co-authored-by: Vasilis Lourdas <dev@lourdas.eu>
Co-authored-by: 刘韬 <lyuutau@outlook.com>
* [Vue] migrate report export directive and popover (#18440)
* update files
* sidenav start
* make getRef a utility method
* tweak
* add return type
* finish converting side-nav directive
* starting on reporting menu conversion
* remove unused properties
* convert reporting pages service
* migrate report metadata store
* remove angularjs files
* migrating reporting pages store
* make store adapters more immutable
* get service adapters to work
* fix a UI test
* another html fix
* migrate most of reporting menu directive and model
* Use themed font family for input forms to override materialize.css styling
* rebuild vue
* add a missing div
* ui test fixes
* update styling
* get to build
* get to load in the UI w/o error
* clone result of functions
* fix compile issue
* migrate widget loader and get to load in UI
* rebuild vue
* migrate widgetcontainer
* migrate widget bydimension container
* migrate widget + add tooltips directive
* quick fix
* Updating version to 4.6.0
* loading in page
* update expected screenshot
* add wait just in case travis is slow
* fix ordering bug
* add another wait
* rebuild vue
* css tweak
* fix some bugs and tests
* undo screenshot changes
* Menus test passing locally
* [Vue] date picker viewDate property is not kept up to date (#18385)
* viewDate ref is not kept up to date
* rebuild corehome
* reporting menu subcategory items are meant to be normal links
* update some screenshots
* use innerText instead of text() since angularjs maintains newlines in HTML that vue does not add
* trigger angularjs digest after ajaxhelper request
* rebuild vue
* update screenshots, fix bug in link generation in reporting menu and allow syncing multiple screenshot regexes at a time
* undo box-shadow change for UI tests
* fix more issues & update more tests
* update some screenshots
* fix some tests
* rebuild CoreHome
* quick fix
* built vue files
* fix angularjs issue
* add comment
* update umd files
* 4.6.1-rc1
* 4.6.1
* fix field array title
* apply some pr feedback
* apply more pr feedback
* another fix
* tweak
* fix ng-change not executed before ng-model
* fix another set of issues
* fix another issue
* rebuild vue
* better ng-change/ng-model fix
* update some screenshots
* rebuild vue
* remove some TODOs
* initiate initial ng-change ONLY for site selectors where this behavior applies
* emit/broadcast on correct scope in wrapper
* rebuild vue
* fix some issues
* couple more fixes
* fix another title issue
* rebuild vue
* do not report on ajax errors in notifications if not logged in
* migrate reporting page and model
* rebuild vue
* create sites selector model adapter
* fix siteselector vue bug, initial site is only set if there is just one site available
* rebuild vue
* migrate plugin settings directive
* remove TODO
* migrate plugin filter directive
* migrate two more plugins directives
* migrate save button
* fix a bunch of bugs
* fix another widget bug
* allow change event name between angularjs and vue
* rebuild vue
* migrate plugin form directive
* get to work
* migrate select-on-focus directive and start migrating report-export directive
* finish migrating report export directive & popover component + create reusable function to create vue app and add globals to it
* rebuild vue
* remove angularjs files and move less contents to vue dir
* built vue files
* fix function signature
* fix vue warning
* fix ajax request race condition
* rebuild vue
* add new notification type "help" so the help notification is not cleared when clearing transient notifications
* fix some bugs and tests
* update screenshot
* update screenshot & fix a test
* allow using unminified jquery ui + fix bug in last fix
* fix error when enrichedheadline is used in modal
* add polyfill min.js
* remove two todos
* fix widget url logic
* update some screenshots and fix sanitization/escape issue
* update screenshots
* rebuild vue
* fix url location updating regression in MatomoUrl.updateLocation use
* submodule
* update screenshots and fix possible error in json parse
* built vue files
* Merge branch 'vue-period-selector-regression' into vue-reporting-menu
* rebuild vue
* use correct variable
* rebuild vue
* fix widget url logic
* segment parameter can be undefined now for some reason
* fix ngmodel binding in siteselector adapter (for last time hopefully)
* the original site selector only set the first site to the first site in the initial sites query if there was only one site in the entire matomo instance
* fix sitesmanager ui test failure
* fix usersettings test failure
* rebuild vue
* more siteselector tweaks.
* build CoreHome
* more siteselector tweaks.
* another siteselector issue
* update screenshots
* update screenshot and try to fix random failure
* fix some issues in widget.vue when containerid is specified
* fix couple tests
* fix several test failures
* fix string concat
* fix test failure
* extra change
* fix last change and random failure
* styling fix
* fix last fix
* real fix this time
* fix stray request
* proper fix
* update build files
* try to fix random failure
* do not submit form
* check for api errors in promise chain in ajaxhelper.ts
* force a digest after a location change
* use proper abortcontroller method instead of promise hack, have to add new polyfill + try to fix random test failure
* some UI test fixes
* fix some report export issues
* several save button fixes + make replace approximation in createAngularJsAdapter better
* apply after manual click triggering in savebutton
* add names to divs so they can still be queried as they were in angularjs
* rebuild vue
* now that format_metrics checkbox works, need to check it
* fix unintended changes
* updated expected screenshots
* update two more
* go back to previous format_metrics behavior in popover
Co-authored-by: Justin Velluppillai <justin@innocraft.com>
Co-authored-by: justinvelluppillai <justinvelluppillai@users.noreply.github.com>
Co-authored-by: Matthieu Aubry <mattab@users.noreply.github.com>
* [Vue] remove support in vue for FormField.allSettings (#18542)
* deprecate support in vue for FormField.allSettings since deep watching the property doesnt quite work
* built vue files
* update screenshots
* update screenshot
* Show a summary of new features (#18065)
* Added "What is new" notification display, populated by a new event
* Removed test example event hook
* Added support for applying a link attribute to menu items, fixes layout issue for mobile with html menu items
* Updated UI test screenshots
* Revert accidental edit
* Hide the "What's new" icon if there are no new features to show
* Changed to use changes.json, track user last viewed, added ui test
* Fix UserManager unit tests broken by new ts_changes_viewed user field
* Moved getChanges to separate helper class, added unit test, added user view access check
* Updated to add new changes table and populate only on plugin update/install
* Added missing fixture class, updated UI screenshots
* Updated matomo font to add ringing bell and new releases icons
* Fix for integration test
* Reworked class structure, removed unnecessary angular directive, merged templates, other tidy ups
* built vue files
* built vue files
* Added null user check, missing table exception handling, show plugin name in change title, better handling of missing change fields
* Added sample changes file, moved UserChanges db code to changes model, added return type hints, better db error code handling, various other improvements
* Revert accidental UI screenshot commit
* Fix for incorrect link name parameter in sample changes, switched back to using $db->query for INSERT IGNORE
* Integration test fix, UI screenshot updates
* Test fix
* Added link styling, show CoreHome changes without plugin prefix in title
* Update UI test screenshot
* Added styles to the popover, added event for filtering changes
* Test fix
* UI test screenshot updates
Co-authored-by: sgiehl <stefan@matomo.org>
Co-authored-by: bx80 <bx80@users.noreply.github.com>
* Update test translation (#18531)
update a test failed XML
* updates all submodules (#18541)
Co-authored-by: diosmosis <diosmosis@users.noreply.github.com>
* Translations update from Hosted Weblate (#18529)
* Translated using Weblate (Greek)
Currently translated at 100.0% (162 of 162 strings)
Translation: Matomo/Plugin CoreAdminHome
Translate-URL: https://hosted.weblate.org/projects/matomo/plugin-coreadminhome/el/
[ci skip]
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Vasilis Lourdas <dev@lourdas.eu>
* Translated using Weblate (Chinese (Simplified))
Currently translated at 83.9% (136 of 162 strings)
Translation: Matomo/Plugin CoreAdminHome
Translate-URL: https://hosted.weblate.org/projects/matomo/plugin-coreadminhome/zh_Hans/
[ci skip]
Translated using Weblate (Chinese (Simplified))
Currently translated at 99.6% (620 of 622 strings)
Translation: Matomo/Matomo Base
Translate-URL: https://hosted.weblate.org/projects/matomo/matomo-base/zh_Hans/
[ci skip]
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: 刘韬 <lyuutau@outlook.com>
* Update translation files
Updated by "Squash Git commits" hook in Weblate.
Translation: Matomo/Plugin CoreAdminHome
Translate-URL: https://hosted.weblate.org/projects/matomo/plugin-coreadminhome/
[ci skip]
Co-authored-by: Vasilis Lourdas <dev@lourdas.eu>
Co-authored-by: 刘韬 <lyuutau@outlook.com>
* [Vue] migrate report export directive and popover (#18440)
* update files
* sidenav start
* make getRef a utility method
* tweak
* add return type
* finish converting side-nav directive
* starting on reporting menu conversion
* remove unused properties
* convert reporting pages service
* migrate report metadata store
* remove angularjs files
* migrating reporting pages store
* make store adapters more immutable
* get service adapters to work
* fix a UI test
* another html fix
* migrate most of reporting menu directive and model
* Use themed font family for input forms to override materialize.css styling
* rebuild vue
* add a missing div
* ui test fixes
* update styling
* get to build
* get to load in the UI w/o error
* clone result of functions
* fix compile issue
* migrate widget loader and get to load in UI
* rebuild vue
* migrate widgetcontainer
* migrate widget bydimension container
* migrate widget + add tooltips directive
* quick fix
* Updating version to 4.6.0
* loading in page
* update expected screenshot
* add wait just in case travis is slow
* fix ordering bug
* add another wait
* rebuild vue
* css tweak
* fix some bugs and tests
* undo screenshot changes
* Menus test passing locally
* [Vue] date picker viewDate property is not kept up to date (#18385)
* viewDate ref is not kept up to date
* rebuild corehome
* reporting menu subcategory items are meant to be normal links
* update some screenshots
* use innerText instead of text() since angularjs maintains newlines in HTML that vue does not add
* trigger angularjs digest after ajaxhelper request
* rebuild vue
* update screenshots, fix bug in link generation in reporting menu and allow syncing multiple screenshot regexes at a time
* undo box-shadow change for UI tests
* fix more issues & update more tests
* update some screenshots
* fix some tests
* rebuild CoreHome
* quick fix
* built vue files
* fix angularjs issue
* add comment
* update umd files
* 4.6.1-rc1
* 4.6.1
* fix field array title
* apply some pr feedback
* apply more pr feedback
* another fix
* tweak
* fix ng-change not executed before ng-model
* fix another set of issues
* fix another issue
* rebuild vue
* better ng-change/ng-model fix
* update some screenshots
* rebuild vue
* remove some TODOs
* initiate initial ng-change ONLY for site selectors where this behavior applies
* emit/broadcast on correct scope in wrapper
* rebuild vue
* fix some issues
* couple more fixes
* fix another title issue
* rebuild vue
* do not report on ajax errors in notifications if not logged in
* migrate reporting page and model
* rebuild vue
* create sites selector model adapter
* fix siteselector vue bug, initial site is only set if there is just one site available
* rebuild vue
* migrate plugin settings directive
* remove TODO
* migrate plugin filter directive
* migrate two more plugins directives
* migrate save button
* fix a bunch of bugs
* fix another widget bug
* allow change event name between angularjs and vue
* rebuild vue
* migrate plugin form directive
* get to work
* migrate select-on-focus directive and start migrating report-export directive
* finish migrating report export directive & popover component + create reusable function to create vue app and add globals to it
* rebuild vue
* remove angularjs files and move less contents to vue dir
* built vue files
* fix function signature
* fix vue warning
* fix ajax request race condition
* rebuild vue
* add new notification type "help" so the help notification is not cleared when clearing transient notifications
* fix some bugs and tests
* update screenshot
* update screenshot & fix a test
* allow using unminified jquery ui + fix bug in last fix
* fix error when enrichedheadline is used in modal
* add polyfill min.js
* remove two todos
* fix widget url logic
* update some screenshots and fix sanitization/escape issue
* update screenshots
* rebuild vue
* fix url location updating regression in MatomoUrl.updateLocation use
* submodule
* update screenshots and fix possible error in json parse
* built vue files
* Merge branch 'vue-period-selector-regression' into vue-reporting-menu
* rebuild vue
* use correct variable
* rebuild vue
* fix widget url logic
* segment parameter can be undefined now for some reason
* fix ngmodel binding in siteselector adapter (for last time hopefully)
* the original site selector only set the first site to the first site in the initial sites query if there was only one site in the entire matomo instance
* fix sitesmanager ui test failure
* fix usersettings test failure
* rebuild vue
* more siteselector tweaks.
* build CoreHome
* more siteselector tweaks.
* another siteselector issue
* update screenshots
* update screenshot and try to fix random failure
* fix some issues in widget.vue when containerid is specified
* fix couple tests
* fix several test failures
* fix string concat
* fix test failure
* extra change
* fix last change and random failure
* styling fix
* fix last fix
* real fix this time
* fix stray request
* proper fix
* update build files
* try to fix random failure
* do not submit form
* check for api errors in promise chain in ajaxhelper.ts
* force a digest after a location change
* use proper abortcontroller method instead of promise hack, have to add new polyfill + try to fix random test failure
* some UI test fixes
* fix some report export issues
* several save button fixes + make replace approximation in createAngularJsAdapter better
* apply after manual click triggering in savebutton
* add names to divs so they can still be queried as they were in angularjs
* rebuild vue
* now that format_metrics checkbox works, need to check it
* fix unintended changes
* updated expected screenshots
* update two more
* go back to previous format_metrics behavior in popover
Co-authored-by: Justin Velluppillai <justin@innocraft.com>
Co-authored-by: justinvelluppillai <justinvelluppillai@users.noreply.github.com>
Co-authored-by: Matthieu Aubry <mattab@users.noreply.github.com>
* [Vue] remove support in vue for FormField.allSettings (#18542)
* deprecate support in vue for FormField.allSettings since deep watching the property doesnt quite work
* built vue files
* update screenshots
* update screenshot
* fix tests
* rebuild
* rebuild
* order plugins by dependencies in vue:build and fix warning in corehome build
* built vue files
* built vue files
* remove unused imports
* built vue files
* remove multilinefield component, fieldtextareaarray does the same thing
* edit-trigger is not used anywhere
* migrate sitetypes model to store
* do not load nonexistant files
* remove reference nonexistant files
* start converting sitefields component
* more work on sitefields component
* undo submodule change
* rebuild
* get sitesmanager to build
* get SiteFields component to work in UI
* datepicker does not format times
* export other stores
* fix some typing issues and rebuild
* start on site management conversion
* add more comma delimited props to list + remove controller JS
* rebuild
* convert sites manager controller to sitesmanagement component
* remove TODOs
* finish migrating sitesmanager
* remove some TODO
* get to build
* fixes from testing
* rebuild
* rebuild and fix issue w/ globalsettings hash detection
* migrate capabilities-edit component.
* some fixes and get to build
* get to work
* built vue files
* get to work and rebuild
* fixes
* another fix
* more fixes
* update file
* fix ref
* rebuild vue
* fix bug and rebuild
* fix bug and rebuild
* fix issue
* fix issues and rebuild
* fix ui test
* fix UI test failure
* fixing some issues
* complete fixes
* fix some more issues
* fix ui test failures
* another fix
* several more fixes
* fix delete dialog
* more fixes
* fix styling issue
* more fixes
* fix another ui test + update other UI tests
* fixing edisiteid handling
* update screenshots
* fix UI tests somre more
* fix random failure
* fixes
* reference css class not attribute (since that is what is added in vue)
* fixing more ui tests
* try to fix vue css class in directive issue
* tweak
* in groupedsetting handle templateFile property for angularjs BC
* rebuild vue
* fix view tracking code link
* fixing UI tests
* fix selector in test for this branch only
* Update screenshot.
* update screenshot
* update screenshots
* fix styling
* built vue files
Co-authored-by: Ben Burgess <88810029+bx80@users.noreply.github.com>
Co-authored-by: sgiehl <stefan@matomo.org>
Co-authored-by: bx80 <bx80@users.noreply.github.com>
Co-authored-by: Peter Zhang <peter@innocraft.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Weblate (bot) <hosted@weblate.org>
Co-authored-by: Vasilis Lourdas <dev@lourdas.eu>
Co-authored-by: 刘韬 <lyuutau@outlook.com>
Co-authored-by: Justin Velluppillai <justin@innocraft.com>
Co-authored-by: justinvelluppillai <justinvelluppillai@users.noreply.github.com>
Co-authored-by: Matthieu Aubry <mattab@users.noreply.github.com>
28 files changed, 1795 insertions, 566 deletions
diff --git a/plugins/CoreHome/vue/dist/CoreHome.umd.js b/plugins/CoreHome/vue/dist/CoreHome.umd.js index c519d5dd6c..240359edbd 100644 --- a/plugins/CoreHome/vue/dist/CoreHome.umd.js +++ b/plugins/CoreHome/vue/dist/CoreHome.umd.js @@ -159,7 +159,7 @@ __webpack_require__.d(__webpack_exports__, "format", function() { return /* reex __webpack_require__.d(__webpack_exports__, "getToday", function() { return /* reexport */ getToday; }); __webpack_require__.d(__webpack_exports__, "parseDate", function() { return /* reexport */ parseDate; }); __webpack_require__.d(__webpack_exports__, "todayIsInRange", function() { return /* reexport */ todayIsInRange; }); -__webpack_require__.d(__webpack_exports__, "Dropdown", function() { return /* reexport */ DropdownMenu; }); +__webpack_require__.d(__webpack_exports__, "DropdownMenu", function() { return /* reexport */ DropdownMenu; }); __webpack_require__.d(__webpack_exports__, "FocusAnywhereButHere", function() { return /* reexport */ FocusAnywhereButHere; }); __webpack_require__.d(__webpack_exports__, "FocusIf", function() { return /* reexport */ FocusIf; }); __webpack_require__.d(__webpack_exports__, "MatomoDialog", function() { return /* reexport */ MatomoDialog; }); @@ -1489,6 +1489,8 @@ var AjaxHelper_AjaxHelper = /*#__PURE__*/function () { AjaxHelper_defineProperty(this, "defaultParams", ['idSite', 'period', 'date', 'segment']); + AjaxHelper_defineProperty(this, "resolveWithHelper", false); + this.errorCallback = defaultErrorCallback; } /** @@ -1735,7 +1737,13 @@ var AjaxHelper_AjaxHelper = /*#__PURE__*/function () { var result = new Promise(function (resolve, reject) { _this2.requestHandle.then(function (data) { - resolve(data); // ignoring textStatus/jqXHR + if (_this2.resolveWithHelper) { + // NOTE: we can't resolve w/ the jquery xhr, because it's a promise, and will + // just result in following the promise chain back to 'data' + resolve(_this2); // casting hack here + } else { + resolve(data); // ignoring textStatus/jqXHR + } }).fail(function (xhr) { if (xhr.statusText !== 'abort') { console.log("Warning: the ".concat($.param(_this2.getParams), " request failed!")); @@ -1926,6 +1934,11 @@ var AjaxHelper_AjaxHelper = /*#__PURE__*/function () { return params; } + }, { + key: "getRequestHandle", + value: function getRequestHandle() { + return this.requestHandle; + } }], [{ key: "fetch", value: @@ -2025,13 +2038,18 @@ var AjaxHelper_AjaxHelper = /*#__PURE__*/function () { helper.abortController = options.abortController; } - return helper.send().then(function (data) { - // check for error if not using default notification behavior + if (options.returnResponseObject) { + helper.resolveWithHelper = true; + } + + return helper.send().then(function (result) { + var data = result instanceof AjaxHelper ? result.requestHandle.responseJSON : result; // check for error if not using default notification behavior + if (data.result === 'error') { throw new ApiResponseError(data.message); } - return data; + return result; }); } // eslint-disable-next-line @typescript-eslint/no-explicit-any @@ -2557,6 +2575,7 @@ function cloneThenApply(p) { * </li> * </ul> */ + /* harmony default export */ var DropdownMenu = ({ mounted: function mounted(element, binding) { var options = {}; @@ -2576,6 +2595,14 @@ function cloneThenApply(p) { } $(element).dropdown(options); + }, + updated: function updated(element) { + // classes can be overwritten when elements bind to :class, nextTick + using + // updated avoids this problem (and doing in both mounted and updated avoids a temporary + // state where the classes aren't added) + Object(external_commonjs_vue_commonjs2_vue_root_Vue_["nextTick"])(function () { + $(element).addClass('matomo-dropdown-menu'); + }); } }); // CONCATENATED MODULE: ./plugins/CoreHome/vue/src/DropdownMenu/DropdownMenu.adapter.ts diff --git a/plugins/CoreHome/vue/dist/CoreHome.umd.min.js b/plugins/CoreHome/vue/dist/CoreHome.umd.min.js index 7b4e9b841f..2ee8996aef 100644 --- a/plugins/CoreHome/vue/dist/CoreHome.umd.min.js +++ b/plugins/CoreHome/vue/dist/CoreHome.umd.min.js @@ -4,7 +4,7 @@ * * @link https://matomo.org * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later - */window.hasBlockedContent=!1},"8bbf":function(t,n){t.exports=e},fae3:function(e,t,n){"use strict";if(n.r(t),n.d(t,"createVueApp",(function(){return it})),n.d(t,"useExternalPluginComponent",(function(){return An})),n.d(t,"DirectiveUtilities",(function(){return It})),n.d(t,"debounce",(function(){return Bi})),n.d(t,"lazyInitSingleton",(function(){return yu})),n.d(t,"createAngularJsAdapter",(function(){return gt})),n.d(t,"transformAngularJsBoolAttr",(function(){return vt})),n.d(t,"transformAngularJsIntAttr",(function(){return bt})),n.d(t,"removeAngularJsSpecificProperties",(function(){return ht})),n.d(t,"clone",(function(){return yt})),n.d(t,"cloneThenApply",(function(){return wt})),n.d(t,"activityIndicatorAdapter",(function(){return wu})),n.d(t,"ActivityIndicator",(function(){return ro})),n.d(t,"translate",(function(){return C})),n.d(t,"Alert",(function(){return rt})),n.d(t,"AjaxHelper",(function(){return Je})),n.d(t,"setCookie",(function(){return Ou})),n.d(t,"getCookie",(function(){return ju})),n.d(t,"deleteCookie",(function(){return ku})),n.d(t,"MatomoUrl",(function(){return Ce})),n.d(t,"Matomo",(function(){return S})),n.d(t,"Periods",(function(){return p})),n.d(t,"Day",(function(){return G})),n.d(t,"Week",(function(){return X})),n.d(t,"Month",(function(){return re})),n.d(t,"Year",(function(){return ce})),n.d(t,"Range",(function(){return _})),n.d(t,"format",(function(){return E})),n.d(t,"getToday",(function(){return D})),n.d(t,"parseDate",(function(){return P})),n.d(t,"todayIsInRange",(function(){return V})),n.d(t,"Dropdown",(function(){return Ot})),n.d(t,"FocusAnywhereButHere",(function(){return Pt})),n.d(t,"FocusIf",(function(){return Tt})),n.d(t,"MatomoDialog",(function(){return gn})),n.d(t,"ExpandOnClick",(function(){return $t})),n.d(t,"ExpandOnHover",(function(){return zt})),n.d(t,"ShowSensitiveData",(function(){return Xt})),n.d(t,"DropdownButton",(function(){return nn})),n.d(t,"SelectOnFocus",(function(){return cn})),n.d(t,"SideNav",(function(){return dn})),n.d(t,"EnrichedHeadline",(function(){return Bn})),n.d(t,"ContentBlock",(function(){return Jn})),n.d(t,"Comparisons",(function(){return Pr})),n.d(t,"MenuDropdown",(function(){return Ur})),n.d(t,"DatePicker",(function(){return Qr})),n.d(t,"DateRangePicker",(function(){return ni})),n.d(t,"PeriodDatePicker",(function(){return li})),n.d(t,"Notification",(function(){return zo})),n.d(t,"NotificationGroup",(function(){return cl})),n.d(t,"NotificationsStore",(function(){return rl})),n.d(t,"SitesStore",(function(){return xi})),n.d(t,"SiteSelector",(function(){return Mi})),n.d(t,"QuickAccess",(function(){return ea})),n.d(t,"FieldArray",(function(){return fa})),n.d(t,"MultiPairField",(function(){return Ta})),n.d(t,"PeriodSelector",(function(){return bo})),n.d(t,"ReportingMenu",(function(){return $l})),n.d(t,"ReportingPagesStore",(function(){return fl})),n.d(t,"ReportMetadataStore",(function(){return Ql})),n.d(t,"WidgetsStore",(function(){return Fl})),n.d(t,"WidgetLoader",(function(){return rc})),n.d(t,"WidgetContainer",(function(){return vc})),n.d(t,"WidgetByDimensionContainer",(function(){return xc})),n.d(t,"Widget",(function(){return _c})),n.d(t,"ReportingPage",(function(){return us})),n.d(t,"ReportExport",(function(){return Hs})),n.d(t,"Sparkline",(function(){return Gs})),n.d(t,"Progressbar",(function(){return eu})),n.d(t,"ContentIntro",(function(){return tu})),n.d(t,"ContentTable",(function(){return ru})),n.d(t,"AjaxForm",(function(){return uu})),"undefined"!==typeof window){var r=window.document.currentScript,i=r&&r.src.match(/(.+\/)[^/]+\.js(\?.*)?$/);i&&(n.p=i[1])}n("2342");var a=n("8bbf");function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function l(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}function c(e,t,n){return t&&l(e.prototype,t),n&&l(e,n),e}function s(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e} + */window.hasBlockedContent=!1},"8bbf":function(t,n){t.exports=e},fae3:function(e,t,n){"use strict";if(n.r(t),n.d(t,"createVueApp",(function(){return it})),n.d(t,"useExternalPluginComponent",(function(){return An})),n.d(t,"DirectiveUtilities",(function(){return It})),n.d(t,"debounce",(function(){return Bi})),n.d(t,"lazyInitSingleton",(function(){return yu})),n.d(t,"createAngularJsAdapter",(function(){return gt})),n.d(t,"transformAngularJsBoolAttr",(function(){return vt})),n.d(t,"transformAngularJsIntAttr",(function(){return bt})),n.d(t,"removeAngularJsSpecificProperties",(function(){return ht})),n.d(t,"clone",(function(){return yt})),n.d(t,"cloneThenApply",(function(){return wt})),n.d(t,"activityIndicatorAdapter",(function(){return wu})),n.d(t,"ActivityIndicator",(function(){return ro})),n.d(t,"translate",(function(){return C})),n.d(t,"Alert",(function(){return rt})),n.d(t,"AjaxHelper",(function(){return Je})),n.d(t,"setCookie",(function(){return Ou})),n.d(t,"getCookie",(function(){return ju})),n.d(t,"deleteCookie",(function(){return ku})),n.d(t,"MatomoUrl",(function(){return Ce})),n.d(t,"Matomo",(function(){return S})),n.d(t,"Periods",(function(){return p})),n.d(t,"Day",(function(){return G})),n.d(t,"Week",(function(){return X})),n.d(t,"Month",(function(){return re})),n.d(t,"Year",(function(){return ce})),n.d(t,"Range",(function(){return _})),n.d(t,"format",(function(){return E})),n.d(t,"getToday",(function(){return D})),n.d(t,"parseDate",(function(){return P})),n.d(t,"todayIsInRange",(function(){return V})),n.d(t,"DropdownMenu",(function(){return Ot})),n.d(t,"FocusAnywhereButHere",(function(){return Pt})),n.d(t,"FocusIf",(function(){return Tt})),n.d(t,"MatomoDialog",(function(){return gn})),n.d(t,"ExpandOnClick",(function(){return $t})),n.d(t,"ExpandOnHover",(function(){return zt})),n.d(t,"ShowSensitiveData",(function(){return Xt})),n.d(t,"DropdownButton",(function(){return nn})),n.d(t,"SelectOnFocus",(function(){return cn})),n.d(t,"SideNav",(function(){return dn})),n.d(t,"EnrichedHeadline",(function(){return Bn})),n.d(t,"ContentBlock",(function(){return Jn})),n.d(t,"Comparisons",(function(){return Pr})),n.d(t,"MenuDropdown",(function(){return Ur})),n.d(t,"DatePicker",(function(){return Qr})),n.d(t,"DateRangePicker",(function(){return ni})),n.d(t,"PeriodDatePicker",(function(){return li})),n.d(t,"Notification",(function(){return zo})),n.d(t,"NotificationGroup",(function(){return cl})),n.d(t,"NotificationsStore",(function(){return rl})),n.d(t,"SitesStore",(function(){return xi})),n.d(t,"SiteSelector",(function(){return Mi})),n.d(t,"QuickAccess",(function(){return ea})),n.d(t,"FieldArray",(function(){return fa})),n.d(t,"MultiPairField",(function(){return Ta})),n.d(t,"PeriodSelector",(function(){return bo})),n.d(t,"ReportingMenu",(function(){return $l})),n.d(t,"ReportingPagesStore",(function(){return fl})),n.d(t,"ReportMetadataStore",(function(){return Ql})),n.d(t,"WidgetsStore",(function(){return Fl})),n.d(t,"WidgetLoader",(function(){return rc})),n.d(t,"WidgetContainer",(function(){return vc})),n.d(t,"WidgetByDimensionContainer",(function(){return xc})),n.d(t,"Widget",(function(){return _c})),n.d(t,"ReportingPage",(function(){return us})),n.d(t,"ReportExport",(function(){return Hs})),n.d(t,"Sparkline",(function(){return Gs})),n.d(t,"Progressbar",(function(){return eu})),n.d(t,"ContentIntro",(function(){return tu})),n.d(t,"ContentTable",(function(){return ru})),n.d(t,"AjaxForm",(function(){return uu})),"undefined"!==typeof window){var r=window.document.currentScript,i=r&&r.src.match(/(.+\/)[^/]+\.js(\?.*)?$/);i&&(n.p=i[1])}n("2342");var a=n("8bbf");function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function l(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}function c(e,t,n){return t&&l(e.prototype,t),n&&l(e,n),e}function s(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 * @@ -99,7 +99,7 @@ function De(){return S}function Pe(e,t){t.$oldEmit=t.$emit,t.$emit=function(e){f * * @link https://matomo.org * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later - */function qe(e,t){if("abort"!==t)if("undefined"!==typeof Piwik_Popover){var n=$("#loadingError");Piwik_Popover.isOpen()&&e&&500===e.status?e&&500===e.status&&$(document.body).html(piwikHelper.escape(e.responseText)):n.show()}else console.log("Request failed: ".concat(e.responseText))}we.updatePeriodParamsFromUrl=Se.updatePeriodParamsFromUrl.bind(Se),window.angular.module("piwikApp.service").service("piwikUrl",Ee),window.angular.module("piwikApp.service").run(["$location",function(){return null}]),window.angular.module("piwikApp.service").service("piwik",De),Pe.$inject=["piwik","$rootScope"],window.angular.module("piwikApp.service").run(Pe),window.globalAjaxQueue=[],window.globalAjaxQueue.active=0,window.globalAjaxQueue.clean=function(){for(var e=this.length;e>=0;e-=1)this[e]&&4!==this[e].readyState||this.splice(e,1)},window.globalAjaxQueue.push=function(){for(var e,t=arguments.length,n=new Array(t),r=0;r<t;r++)n[r]=arguments[r];return this.active+=n.length,this.clean(),(e=Array.prototype.push).call.apply(e,[this].concat(n))},window.globalAjaxQueue.abort=function(){this.forEach((function(e){return e&&e.abort&&e.abort()})),this.splice(0,this.length),this.active=0};var We=function(e){Ie(n,e);var t=Be(n);function n(){return xe(this,n),t.apply(this,arguments)}return n}(Fe(Error)),Je=function(){function e(){xe(this,e),Ae(this,"format","json"),Ae(this,"timeout",null),Ae(this,"callback",null),Ae(this,"useRegularCallbackInCaseOfError",!1),Ae(this,"errorCallback",void 0),Ae(this,"withToken",!1),Ae(this,"completeCallback",void 0),Ae(this,"getParams",{}),Ae(this,"getUrl","?"),Ae(this,"postParams",{}),Ae(this,"loadingElement",null),Ae(this,"errorElement","#ajaxError"),Ae(this,"headers",void 0),Ae(this,"requestHandle",null),Ae(this,"abortController",null),Ae(this,"defaultParams",["idSite","period","date","segment"]),this.errorCallback=qe}return Te(e,[{key:"addParams",value:function(e,t){var n=this,r="string"===typeof e?window.broadcast.getValuesFromUrl(e):e,i=["compareSegments","comparePeriods","compareDates"];Object.keys(r).forEach((function(e){var a=r[e];(-1===i.indexOf(e)||a)&&("get"===t.toLowerCase()?n.getParams[e]=a:"post"===t.toLowerCase()&&(n.postParams[e]=a))}))}},{key:"withTokenInUrl",value:function(){this.withToken=!0}},{key:"setUrl",value:function(e){this.addParams(broadcast.getValuesFromUrl(e),"GET")}},{key:"setBulkRequests",value:function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];var r=t.map((function(e){return"string"===typeof e?e:$.param(e)}));this.addParams({module:"API",method:"API.getBulkRequest",urls:r,format:"json"},"post")}},{key:"setTimeout",value:function(e){this.timeout=e}},{key:"setCallback",value:function(e){this.callback=e}},{key:"useCallbackInCaseOfError",value:function(){this.useRegularCallbackInCaseOfError=!0}},{key:"redirectOnSuccess",value:function(e){this.setCallback((function(){piwikHelper.redirect(e)}))}},{key:"setErrorCallback",value:function(e){this.errorCallback=e}},{key:"setCompleteCallback",value:function(e){this.completeCallback=e}},{key:"setFormat",value:function(e){this.format=e}},{key:"setLoadingElement",value:function(e){this.loadingElement=e||"#ajaxLoadingDiv"}},{key:"setErrorElement",value:function(e){e&&(this.errorElement=e)}},{key:"useGETDefaultParameter",value:function(e){if(e&&this.defaultParams)for(var t=0;t<this.defaultParams.length;t+=1)if(this.defaultParams[t]===e)return!0;return!1}},{key:"removeDefaultParameter",value:function(e){if(e&&this.defaultParams)for(var t=0;t<this.defaultParams.length;t+=1)this.defaultParams[t]===e&&this.defaultParams.splice(t,1)}},{key:"send",value:function(){var e=this;$(this.errorElement).length&&$(this.errorElement).hide(),this.loadingElement&&$(this.loadingElement).fadeIn(),this.requestHandle=this.buildAjaxCall(),window.globalAjaxQueue.push(this.requestHandle);var t=null;try{t=S.helper.getAngularDependency("$timeout")}catch(r){}this.abortController&&this.abortController.signal.addEventListener("abort",(function(){e.requestHandle&&e.requestHandle.abort()}));var n=new Promise((function(n,r){e.requestHandle.then((function(e){n(e)})).fail((function(t){"abort"!==t.statusText&&(console.log("Warning: the ".concat($.param(e.getParams)," request failed!")),r(t))})).done((function(){t&&t()}))}));return n}},{key:"abort",value:function(){this.requestHandle&&"function"===typeof this.requestHandle.abort&&(this.requestHandle.abort(),this.requestHandle=null)}},{key:"buildAjaxCall",value:function(){var e=this,t=this,n=this.mixinDefaultGetParams(this.getParams),r=this.getUrl;"?"!==r[r.length-1]&&(r+="&"),n.segment&&(r="".concat(r,"segment=").concat(n.segment,"&"),delete n.segment),n.date&&(r="".concat(r,"date=").concat(decodeURIComponent(n.date.toString()),"&"),delete n.date),r+=$.param(n);var i={type:"POST",async:!0,url:r,dataType:this.format||"json",complete:this.completeCallback,headers:this.headers?this.headers:void 0,error:function(){if(window.globalAjaxQueue.active-=1,t.errorCallback){for(var e=arguments.length,n=new Array(e),r=0;r<e;r++)n[r]=arguments[r];t.errorCallback.apply(this,n)}},success:function(t,n,r){if(e.loadingElement&&$(e.loadingElement).hide(),t&&"error"===t.result&&!e.useRegularCallbackInCaseOfError){var i=null,a="toast";$(e.errorElement).length&&t.message&&($(e.errorElement).show(),i=e.errorElement,a=null);var o=!document.querySelector("#login_form");if(t.message&&o){var l=window["require"]("piwik/UI"),c=new l.Notification;c.show(t.message,{placeat:i,context:"error",type:a,id:"ajaxHelper"}),c.scrollToNotification()}}else e.callback&&e.callback(t,n,r);window.globalAjaxQueue.active-=1,S.ajaxRequestFinished&&S.ajaxRequestFinished()},data:this.mixinDefaultPostParams(this.postParams),timeout:null!==this.timeout?this.timeout:void 0};return $.ajax(i)}},{key:"isRequestToApiMethod",value:function(){return this.getParams&&"API"===this.getParams.module&&this.getParams.method||this.postParams&&"API"===this.postParams.module&&this.postParams.method}},{key:"isWidgetizedRequest",value:function(){return"Widgetize"===broadcast.getValueFromUrl("module")}},{key:"getDefaultPostParams",value:function(){return this.withToken||this.isRequestToApiMethod()||S.shouldPropagateTokenAuth?{token_auth:S.token_auth,force_api_session:broadcast.isWidgetizeRequestWithoutSession()?0:1}:{}}},{key:"mixinDefaultPostParams",value:function(e){var t=this.getDefaultPostParams(),n=Object.assign(Object.assign({},t),e);return n}},{key:"mixinDefaultGetParams",value:function(e){var t=this,n=Ce.getSearchParam("segment"),r={idSite:S.idSite?S.idSite.toString():broadcast.getValueFromUrl("idSite"),period:S.period||broadcast.getValueFromUrl("period"),segment:n},i=e;return i.token_auth&&(i.token_auth=null,delete i.token_auth),Object.keys(r).forEach((function(e){t.useGETDefaultParameter(e)&&!i[e]&&!t.postParams[e]&&r[e]&&(i[e]=r[e])})),!this.useGETDefaultParameter("date")||i.date||this.postParams.date||(i.date=S.currentDateString),i}}],[{key:"fetch",value:function(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=new e;return n.withTokenInUrl&&r.withTokenInUrl(),r.setFormat(n.format||"json"),r.addParams(Object.assign({module:"API",format:n.format||"json"},t),"get"),n.postParams&&r.addParams(n.postParams,"post"),n.headers&&(r.headers=n.headers),"undefined"===typeof n.createErrorNotification||n.createErrorNotification||r.useCallbackInCaseOfError(),n.abortController&&(r.abortController=n.abortController),r.send().then((function(e){if("error"===e.result)throw new We(e.message);return e}))}},{key:"post",value:function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return this.fetch(e,Object.assign(Object.assign({},n),{},{postParams:t}))}}]),e}();function Ge(){return window.globalAjaxQueue}function ze(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function Ye(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}function Qe(e,t,n){return t&&Ye(e.prototype,t),n&&Ye(e,n),e} + */function qe(e,t){if("abort"!==t)if("undefined"!==typeof Piwik_Popover){var n=$("#loadingError");Piwik_Popover.isOpen()&&e&&500===e.status?e&&500===e.status&&$(document.body).html(piwikHelper.escape(e.responseText)):n.show()}else console.log("Request failed: ".concat(e.responseText))}we.updatePeriodParamsFromUrl=Se.updatePeriodParamsFromUrl.bind(Se),window.angular.module("piwikApp.service").service("piwikUrl",Ee),window.angular.module("piwikApp.service").run(["$location",function(){return null}]),window.angular.module("piwikApp.service").service("piwik",De),Pe.$inject=["piwik","$rootScope"],window.angular.module("piwikApp.service").run(Pe),window.globalAjaxQueue=[],window.globalAjaxQueue.active=0,window.globalAjaxQueue.clean=function(){for(var e=this.length;e>=0;e-=1)this[e]&&4!==this[e].readyState||this.splice(e,1)},window.globalAjaxQueue.push=function(){for(var e,t=arguments.length,n=new Array(t),r=0;r<t;r++)n[r]=arguments[r];return this.active+=n.length,this.clean(),(e=Array.prototype.push).call.apply(e,[this].concat(n))},window.globalAjaxQueue.abort=function(){this.forEach((function(e){return e&&e.abort&&e.abort()})),this.splice(0,this.length),this.active=0};var We=function(e){Ie(n,e);var t=Be(n);function n(){return xe(this,n),t.apply(this,arguments)}return n}(Fe(Error)),Je=function(){function e(){xe(this,e),Ae(this,"format","json"),Ae(this,"timeout",null),Ae(this,"callback",null),Ae(this,"useRegularCallbackInCaseOfError",!1),Ae(this,"errorCallback",void 0),Ae(this,"withToken",!1),Ae(this,"completeCallback",void 0),Ae(this,"getParams",{}),Ae(this,"getUrl","?"),Ae(this,"postParams",{}),Ae(this,"loadingElement",null),Ae(this,"errorElement","#ajaxError"),Ae(this,"headers",void 0),Ae(this,"requestHandle",null),Ae(this,"abortController",null),Ae(this,"defaultParams",["idSite","period","date","segment"]),Ae(this,"resolveWithHelper",!1),this.errorCallback=qe}return Te(e,[{key:"addParams",value:function(e,t){var n=this,r="string"===typeof e?window.broadcast.getValuesFromUrl(e):e,i=["compareSegments","comparePeriods","compareDates"];Object.keys(r).forEach((function(e){var a=r[e];(-1===i.indexOf(e)||a)&&("get"===t.toLowerCase()?n.getParams[e]=a:"post"===t.toLowerCase()&&(n.postParams[e]=a))}))}},{key:"withTokenInUrl",value:function(){this.withToken=!0}},{key:"setUrl",value:function(e){this.addParams(broadcast.getValuesFromUrl(e),"GET")}},{key:"setBulkRequests",value:function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];var r=t.map((function(e){return"string"===typeof e?e:$.param(e)}));this.addParams({module:"API",method:"API.getBulkRequest",urls:r,format:"json"},"post")}},{key:"setTimeout",value:function(e){this.timeout=e}},{key:"setCallback",value:function(e){this.callback=e}},{key:"useCallbackInCaseOfError",value:function(){this.useRegularCallbackInCaseOfError=!0}},{key:"redirectOnSuccess",value:function(e){this.setCallback((function(){piwikHelper.redirect(e)}))}},{key:"setErrorCallback",value:function(e){this.errorCallback=e}},{key:"setCompleteCallback",value:function(e){this.completeCallback=e}},{key:"setFormat",value:function(e){this.format=e}},{key:"setLoadingElement",value:function(e){this.loadingElement=e||"#ajaxLoadingDiv"}},{key:"setErrorElement",value:function(e){e&&(this.errorElement=e)}},{key:"useGETDefaultParameter",value:function(e){if(e&&this.defaultParams)for(var t=0;t<this.defaultParams.length;t+=1)if(this.defaultParams[t]===e)return!0;return!1}},{key:"removeDefaultParameter",value:function(e){if(e&&this.defaultParams)for(var t=0;t<this.defaultParams.length;t+=1)this.defaultParams[t]===e&&this.defaultParams.splice(t,1)}},{key:"send",value:function(){var e=this;$(this.errorElement).length&&$(this.errorElement).hide(),this.loadingElement&&$(this.loadingElement).fadeIn(),this.requestHandle=this.buildAjaxCall(),window.globalAjaxQueue.push(this.requestHandle);var t=null;try{t=S.helper.getAngularDependency("$timeout")}catch(r){}this.abortController&&this.abortController.signal.addEventListener("abort",(function(){e.requestHandle&&e.requestHandle.abort()}));var n=new Promise((function(n,r){e.requestHandle.then((function(t){e.resolveWithHelper?n(e):n(t)})).fail((function(t){"abort"!==t.statusText&&(console.log("Warning: the ".concat($.param(e.getParams)," request failed!")),r(t))})).done((function(){t&&t()}))}));return n}},{key:"abort",value:function(){this.requestHandle&&"function"===typeof this.requestHandle.abort&&(this.requestHandle.abort(),this.requestHandle=null)}},{key:"buildAjaxCall",value:function(){var e=this,t=this,n=this.mixinDefaultGetParams(this.getParams),r=this.getUrl;"?"!==r[r.length-1]&&(r+="&"),n.segment&&(r="".concat(r,"segment=").concat(n.segment,"&"),delete n.segment),n.date&&(r="".concat(r,"date=").concat(decodeURIComponent(n.date.toString()),"&"),delete n.date),r+=$.param(n);var i={type:"POST",async:!0,url:r,dataType:this.format||"json",complete:this.completeCallback,headers:this.headers?this.headers:void 0,error:function(){if(window.globalAjaxQueue.active-=1,t.errorCallback){for(var e=arguments.length,n=new Array(e),r=0;r<e;r++)n[r]=arguments[r];t.errorCallback.apply(this,n)}},success:function(t,n,r){if(e.loadingElement&&$(e.loadingElement).hide(),t&&"error"===t.result&&!e.useRegularCallbackInCaseOfError){var i=null,a="toast";$(e.errorElement).length&&t.message&&($(e.errorElement).show(),i=e.errorElement,a=null);var o=!document.querySelector("#login_form");if(t.message&&o){var l=window["require"]("piwik/UI"),c=new l.Notification;c.show(t.message,{placeat:i,context:"error",type:a,id:"ajaxHelper"}),c.scrollToNotification()}}else e.callback&&e.callback(t,n,r);window.globalAjaxQueue.active-=1,S.ajaxRequestFinished&&S.ajaxRequestFinished()},data:this.mixinDefaultPostParams(this.postParams),timeout:null!==this.timeout?this.timeout:void 0};return $.ajax(i)}},{key:"isRequestToApiMethod",value:function(){return this.getParams&&"API"===this.getParams.module&&this.getParams.method||this.postParams&&"API"===this.postParams.module&&this.postParams.method}},{key:"isWidgetizedRequest",value:function(){return"Widgetize"===broadcast.getValueFromUrl("module")}},{key:"getDefaultPostParams",value:function(){return this.withToken||this.isRequestToApiMethod()||S.shouldPropagateTokenAuth?{token_auth:S.token_auth,force_api_session:broadcast.isWidgetizeRequestWithoutSession()?0:1}:{}}},{key:"mixinDefaultPostParams",value:function(e){var t=this.getDefaultPostParams(),n=Object.assign(Object.assign({},t),e);return n}},{key:"mixinDefaultGetParams",value:function(e){var t=this,n=Ce.getSearchParam("segment"),r={idSite:S.idSite?S.idSite.toString():broadcast.getValueFromUrl("idSite"),period:S.period||broadcast.getValueFromUrl("period"),segment:n},i=e;return i.token_auth&&(i.token_auth=null,delete i.token_auth),Object.keys(r).forEach((function(e){t.useGETDefaultParameter(e)&&!i[e]&&!t.postParams[e]&&r[e]&&(i[e]=r[e])})),!this.useGETDefaultParameter("date")||i.date||this.postParams.date||(i.date=S.currentDateString),i}},{key:"getRequestHandle",value:function(){return this.requestHandle}}],[{key:"fetch",value:function(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=new e;return n.withTokenInUrl&&r.withTokenInUrl(),r.setFormat(n.format||"json"),r.addParams(Object.assign({module:"API",format:n.format||"json"},t),"get"),n.postParams&&r.addParams(n.postParams,"post"),n.headers&&(r.headers=n.headers),"undefined"===typeof n.createErrorNotification||n.createErrorNotification||r.useCallbackInCaseOfError(),n.abortController&&(r.abortController=n.abortController),n.returnResponseObject&&(r.resolveWithHelper=!0),r.send().then((function(t){var n=t instanceof e?t.requestHandle.responseJSON:t;if("error"===n.result)throw new We(n.message);return t}))}},{key:"post",value:function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return this.fetch(e,Object.assign(Object.assign({},n),{},{postParams:t}))}}]),e}();function Ge(){return window.globalAjaxQueue}function ze(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function Ye(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}function Qe(e,t,n){return t&&Ye(e.prototype,t),n&&Ye(e,n),e} /*! * Matomo - free/libre analytics platform * @@ -129,7 +129,7 @@ function De(){return S}function Pe(e,t){t.$oldEmit=t.$emit,t.$emit=function(e){f * * @link https://matomo.org * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later - */var Ot={mounted:function(e,t){var n={};$(e).addClass("matomo-dropdown-menu");var r,i=!!$(e).parent().closest(".dropdown-content").length;i&&(n={hover:!0},$(e).addClass("submenu"),$((null===(r=t.value)||void 0===r?void 0:r.activates)||$(e).data("target")).addClass("submenu-dropdown-content"),$(e).parents(".dropdown-content").addClass("submenu-container"));$(e).dropdown(n)}}; + */var Ot={mounted:function(e,t){var n={};$(e).addClass("matomo-dropdown-menu");var r,i=!!$(e).parent().closest(".dropdown-content").length;i&&(n={hover:!0},$(e).addClass("submenu"),$((null===(r=t.value)||void 0===r?void 0:r.activates)||$(e).data("target")).addClass("submenu-dropdown-content"),$(e).parents(".dropdown-content").addClass("submenu-container"));$(e).dropdown(n)},updated:function(e){Object(a["nextTick"])((function(){$(e).addClass("matomo-dropdown-menu")}))}}; /*! * Matomo - free/libre analytics platform * diff --git a/plugins/CoreHome/vue/src/AjaxHelper/AjaxHelper.ts b/plugins/CoreHome/vue/src/AjaxHelper/AjaxHelper.ts index 09ec644d81..fee659fc9b 100644 --- a/plugins/CoreHome/vue/src/AjaxHelper/AjaxHelper.ts +++ b/plugins/CoreHome/vue/src/AjaxHelper/AjaxHelper.ts @@ -19,6 +19,7 @@ interface AjaxOptions { format?: string; createErrorNotification?: boolean; abortController?: AbortController; + returnResponseObject?: boolean; } interface ErrorResponse { @@ -173,6 +174,8 @@ export default class AjaxHelper<T = any> { // eslint-disable-line defaultParams = ['idSite', 'period', 'date', 'segment']; + resolveWithHelper = false; + // helper method entry point static fetch<R = any>( // eslint-disable-line params: QueryParameters, @@ -205,13 +208,19 @@ export default class AjaxHelper<T = any> { // eslint-disable-line helper.abortController = options.abortController; } - return helper.send().then((data: R | ErrorResponse) => { + if (options.returnResponseObject) { + helper.resolveWithHelper = true; + } + + return helper.send().then((result: R | ErrorResponse | AjaxHelper) => { + const data = result instanceof AjaxHelper ? result.requestHandle!.responseJSON : result; + // check for error if not using default notification behavior if ((data as ErrorResponse).result === 'error') { throw new ApiResponseError((data as ErrorResponse).message); } - return data as R; + return result as R; }); } @@ -434,7 +443,13 @@ export default class AjaxHelper<T = any> { // eslint-disable-line const result = new Promise<T | ErrorResponse>((resolve, reject) => { this.requestHandle!.then((data: unknown) => { - resolve(data as (T | ErrorResponse)); // ignoring textStatus/jqXHR + if (this.resolveWithHelper) { + // NOTE: we can't resolve w/ the jquery xhr, because it's a promise, and will + // just result in following the promise chain back to 'data' + resolve(this as unknown as (T | ErrorResponse)); // casting hack here + } else { + resolve(data as (T | ErrorResponse)); // ignoring textStatus/jqXHR + } }).fail((xhr: jqXHR) => { if (xhr.statusText !== 'abort') { console.log(`Warning: the ${$.param(this.getParams)} request failed!`); @@ -617,4 +632,8 @@ export default class AjaxHelper<T = any> { // eslint-disable-line return params; } + + getRequestHandle(): jqXHR|null { + return this.requestHandle; + } } diff --git a/plugins/CoreHome/vue/src/DropdownMenu/DropdownMenu.ts b/plugins/CoreHome/vue/src/DropdownMenu/DropdownMenu.ts index 035c4614c6..177ce4c357 100644 --- a/plugins/CoreHome/vue/src/DropdownMenu/DropdownMenu.ts +++ b/plugins/CoreHome/vue/src/DropdownMenu/DropdownMenu.ts @@ -5,10 +5,10 @@ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later */ -import { DirectiveBinding } from 'vue'; +import { DirectiveBinding, nextTick } from 'vue'; interface DropdownArgs { - activates: HTMLElement, + activates: HTMLElement|string, } /** @@ -51,4 +51,12 @@ export default { $(element).dropdown(options); }, + updated(element: HTMLElement): void { + // classes can be overwritten when elements bind to :class, nextTick + using + // updated avoids this problem (and doing in both mounted and updated avoids a temporary + // state where the classes aren't added) + nextTick(() => { + $(element).addClass('matomo-dropdown-menu'); + }); + }, }; diff --git a/plugins/CoreHome/vue/src/index.ts b/plugins/CoreHome/vue/src/index.ts index 7684f6ff2b..1cf58e4d72 100644 --- a/plugins/CoreHome/vue/src/index.ts +++ b/plugins/CoreHome/vue/src/index.ts @@ -78,7 +78,7 @@ export { setCookie, getCookie, deleteCookie } from './CookieHelper/CookieHelper' export { default as MatomoUrl } from './MatomoUrl/MatomoUrl'; export { default as Matomo } from './Matomo/Matomo'; export * from './Periods'; -export { default as Dropdown } from './DropdownMenu/DropdownMenu'; +export { default as DropdownMenu } from './DropdownMenu/DropdownMenu'; export { default as FocusAnywhereButHere } from './FocusAnywhereButHere/FocusAnywhereButHere'; export { default as FocusIf } from './FocusIf/FocusIf'; export { default as MatomoDialog } from './MatomoDialog/MatomoDialog.vue'; diff --git a/plugins/Morpheus/javascripts/piwikHelper.js b/plugins/Morpheus/javascripts/piwikHelper.js index 548a5a2fb2..e14d6c1985 100644 --- a/plugins/Morpheus/javascripts/piwikHelper.js +++ b/plugins/Morpheus/javascripts/piwikHelper.js @@ -109,6 +109,9 @@ window.piwikHelper = { return value; }, + /** + * @deprecated use window.vueSanitize instead + */ escape: function (value) { var escape = angular.element(document).injector().get('$sanitize'); diff --git a/plugins/UsersManager/UsersManager.php b/plugins/UsersManager/UsersManager.php index d45083b1f2..b47b20f592 100644 --- a/plugins/UsersManager/UsersManager.php +++ b/plugins/UsersManager/UsersManager.php @@ -131,7 +131,6 @@ class UsersManager extends \Piwik\Plugin $jsFiles[] = "plugins/UsersManager/angularjs/users-manager/users-manager.component.js"; $jsFiles[] = "plugins/UsersManager/angularjs/paged-users-list/paged-users-list.component.js"; $jsFiles[] = "plugins/UsersManager/angularjs/user-edit-form/user-edit-form.component.js"; - $jsFiles[] = "plugins/UsersManager/angularjs/user-permissions-edit/user-permissions-edit.component.js"; $jsFiles[] = "plugins/UsersManager/angularjs/personal-settings/personal-settings.controller.js"; $jsFiles[] = "plugins/UsersManager/angularjs/personal-settings/anonymous-settings.controller.js"; } @@ -146,7 +145,7 @@ class UsersManager extends \Piwik\Plugin $stylesheets[] = "plugins/UsersManager/angularjs/users-manager/users-manager.component.less"; $stylesheets[] = "plugins/UsersManager/angularjs/paged-users-list/paged-users-list.component.less"; $stylesheets[] = "plugins/UsersManager/angularjs/user-edit-form/user-edit-form.component.less"; - $stylesheets[] = "plugins/UsersManager/angularjs/user-permissions-edit/user-permissions-edit.component.less"; + $stylesheets[] = "plugins/UsersManager/vue/src/UserPermissionsEdit/UserPermissionsEdit.less"; $stylesheets[] = "plugins/UsersManager/vue/src/CapabilitiesEdit/CapabilitiesEdit.less"; } diff --git a/plugins/UsersManager/angularjs/user-permissions-edit/user-permissions-edit.component.html b/plugins/UsersManager/angularjs/user-permissions-edit/user-permissions-edit.component.html deleted file mode 100644 index 10cba274a5..0000000000 --- a/plugins/UsersManager/angularjs/user-permissions-edit/user-permissions-edit.component.html +++ /dev/null @@ -1,222 +0,0 @@ -<div class="userPermissionsEdit" ng-class="{ loading: $ctrl.isLoadingAccess }"> - <div class="row" ng-if="!$ctrl.hasAccessToAtLeastOneSite"> - <div piwik-notification context="warning" type="transient" noclear="true"> - <strong>{{:: 'General_Warning'|translate }}:</strong> - - {{:: 'UsersManager_NoAccessWarning'|translate }} - </div> - </div> - <div class="row to-all-websites"> - <div class="col s12"> - <div> - <span>{{ 'UsersManager_GiveAccessToAll'|translate }}:</span> - - <div - id="all-sites-access-select" - piwik-field - uicontrol="select" - ng-model="$ctrl.allWebsitesAccssLevelSet" - options="$ctrl.accessLevels" - full-width="true" - ></div> - - <a href="" class="btn" ng-class="{ disabled: $ctrl.isGivingAccessToAllSites }" ng-click="$ctrl.showChangeAccessAllSitesModal()"> - {{:: 'General_Apply'|translate }} - </a> - </div> - <p> </p> - <p>{{ 'UsersManager_OrManageIndividually'|translate }}:</p> - </div> - </div> - <div class="filters row"> - <div class="col s12 m12 l8"> - <div class="input-field bulk-actions"> - <a - class='dropdown-trigger btn' - href='' - data-target='user-permissions-edit-bulk-actions' - piwik-dropdown-menu - ng-class="{ disabled: $ctrl.isBulkActionsDisabled }" - > - {{:: 'UsersManager_BulkActions'|translate }} - </a> - <ul id='user-permissions-edit-bulk-actions' class='dropdown-content'> - <li> - <a class='dropdown-trigger' data-target="user-permissions-bulk-set-access" piwik-dropdown-menu>{{:: 'UsersManager_SetPermission'|translate }}</a> - <ul id="user-permissions-bulk-set-access" class="dropdown-content"> - <li ng-repeat="access in $ctrl.accessLevels"> - <a href="" ng-click="$ctrl.siteAccessToChange = null; $ctrl.roleToChangeTo = access.key; $ctrl.showChangeAccessConfirm();">{{ access.value }}</a> - </li> - </ul> - </li> - <li> - <a href="" ng-click="$ctrl.siteAccessToChange = null; $ctrl.roleToChangeTo = 'noaccess'; $ctrl.showRemoveAccessConfirm();">{{:: 'UsersManager_RemovePermissions'|translate }}</a> - </li> - </ul> - </div> - - <div class="input-field site-filter"> - <input - type="text" - placeholder="{{:: 'UsersManager_FilterByWebsite'|translate }}" - ng-model="$ctrl.siteNameFilter" - ng-model-options="{debounce: 300}" - ng-change="$ctrl.offset = 0; $ctrl.fetchAccess()" - /> - </div> - - <div class="input-field access-filter"> - <div - piwik-field - uicontrol="select" - ng-model="$ctrl.accessLevelFilter" - options="$ctrl.filterAccessLevels" - full-width="true" - ng-change="$ctrl.offset = 0; $ctrl.fetchAccess()" - placeholder="{{ 'UsersManager_FilterByAccess'|translate }}" - ></div> - </div> - </div> - - <div class="col s12 m12 l4 sites-for-permission-pagination-container" ng-if="$ctrl.totalEntries > $ctrl.limit"> - <div class="sites-for-permission-pagination"> - <a class="prev" ng-class="{ disabled: $ctrl.offset <= 0 }"> - <span class="pointer" ng-click="$ctrl.gotoPreviousPage()">« {{:: 'General_Previous'|translate }}</span> - </a> - - <span class="counter"> - <span> - {{ 'General_Pagination'|translate:$ctrl.getPaginationLowerBound():$ctrl.getPaginationUpperBound():$ctrl.totalEntries }} - </span> - </span> - - <a class="next" ng-class="{ disabled: $ctrl.offset + $ctrl.limit >= $ctrl.totalEntries }"> - <span class="pointer" ng-click="$ctrl.gotoNextPage()">{{:: 'General_Next'|translate }} »</span> - </a> - </div> - </div> - </div> - - <div piwik-notification context="info" type="persistent" noclear="true" ng-if="$ctrl.isRoleHelpToggled" class="roles-help-notification"> - <span piwik-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> - </span> - </div> - - <div piwik-notification context="info" type="persistent" noclear="true" ng-if="$ctrl.isCapabilitiesHelpToggled" class="capabilities-help-notification"> - <span piwik-translate="UsersManager_CapabilitiesHelp"> - TODO - </span> - </div> - - <table piwik-content-table id="sitesForPermission"> - <thead> - <tr> - <th class="select-cell"> - <span class="checkbox-container"> - <label> - <input type="checkbox" id="perm_edit_select_all" ng-model="$ctrl.isAllCheckboxSelected" ng-change="$ctrl.onAllCheckboxChange()" /> - <span></span> - </label> - </span> - </th> - <th>{{:: 'General_Name'|translate }}</th> - <th class="role_header"> - <span>{{:: 'UsersManager_Role'|translate }}</span> - <a href="" class="helpIcon" ng-click="$ctrl.isRoleHelpToggled = !$ctrl.isRoleHelpToggled" ng-class="{ sticky: $ctrl.isRoleHelpToggled }"> - <span class="icon-help"></span> - </a> - </th> - <th class="capabilities_header"> - <span>{{:: 'UsersManager_Capabilities'|translate }}</span> - <a href="" class="helpIcon" ng-click="$ctrl.isCapabilitiesHelpToggled = !$ctrl.isCapabilitiesHelpToggled" ng-class="{ sticky: $ctrl.isCapabilitiesHelpToggled }"> - <span class="icon-help"></span> - </a> - </th> - </tr> - </thead> - <tbody> - <tr class="select-all-row" ng-if="$ctrl.isAllCheckboxSelected && $ctrl.siteAccess.length < $ctrl.totalEntries"> - <td colspan="4"> - <div ng-if="!$ctrl.areAllResultsSelected"> - <span piwik-translate="UsersManager_TheDisplayedWebsitesAreSelected"><strong>{{ $ctrl.siteAccess.length }}</strong></span> - <a href="#" ng-click="$ctrl.areAllResultsSelected = !$ctrl.areAllResultsSelected" piwik-translate="UsersManager_ClickToSelectAll"><strong>{{ $ctrl.totalEntries }}</strong></a> - </div> - - <div ng-if="$ctrl.areAllResultsSelected"> - <span piwik-translate="UsersManager_AllWebsitesAreSelected"><strong>{{ $ctrl.totalEntries }}</strong></span> - <a href="#" ng-click="$ctrl.areAllResultsSelected = !$ctrl.areAllResultsSelected" piwik-translate="UsersManager_ClickToSelectDisplayedWebsites"><strong>{{ $ctrl.siteAccess.length }}</strong></a> - </div> - </td> - </tr> - <tr ng-repeat="entry in $ctrl.siteAccess"> - <td class="select-cell"> - <span class="checkbox-container"> - <label> - <input type="checkbox" ng-attr-id="perm_edit_select_row{{ $index }}" ng-model="$ctrl.selectedRows[$index]" ng-click="$ctrl.onRowSelected()" /> - <span></span> - </label> - </span> - </td> - <td> - <span>{{ entry.site_name }}</span> - </td> - <td> - <div - piwik-field - uicontrol="select" - ng-model="entry.role" - options="$ctrl.accessLevels" - ng-change="$ctrl.previousRole = '{{ entry.role }}'; $ctrl.roleToChangeTo = entry.role; $ctrl.siteAccessToChange = entry; $ctrl.showChangeAccessConfirm();" - full-width="true" - class="role-select" - ></div> - </td> - <td> - <piwik-capabilities-edit - idsite="entry.idsite" - site-name="entry.site_name" - user-login="$ctrl.userLogin" - user-role="entry.role" - capabilities="entry.capabilities" - on-capabilities-change="$ctrl.fetchAccess()" - > - </piwik-capabilities-edit> - </td> - </tr> - </tbody> - </table> - - <div class="delete-access-confirm-modal modal"> - <div class="modal-content"> - <h3 ng-if="$ctrl.siteAccessToChange" piwik-translate="UsersManager_DeletePermConfirmSingle"><strong>{{ $ctrl.userLogin }}</strong>::<strong>{{ $ctrl.siteAccessToChange.site_name }}</strong></h3> - <p ng-if="!$ctrl.siteAccessToChange" piwik-translate="UsersManager_DeletePermConfirmMultiple"><strong>{{ $ctrl.userLogin }}</strong>::<strong>{{ $ctrl.getAffectedSitesCount() }}</strong></p> - </div> - <div class="modal-footer"> - <a href="" class="modal-action modal-close btn" ng-click="$ctrl.changeUserRole()">{{:: 'General_Yes'|translate }}</a> - <a href="" class="modal-action modal-close modal-no" ng-click="$ctrl.siteAccessToChange = null; $ctrl.roleToChangeTo = null;">{{:: 'General_No'|translate }}</a> - </div> - </div> - - <div class="change-access-confirm-modal modal"> - <div class="modal-content"> - <h3 ng-if="$ctrl.siteAccessToChange" piwik-translate="UsersManager_ChangePermToSiteConfirmSingle"><strong>{{ $ctrl.userLogin }}</strong>::<strong>{{ $ctrl.siteAccessToChange.site_name }}</strong>::<strong>{{ $ctrl.getRoleDisplay($ctrl.roleToChangeTo) }}</strong></h3> - <p ng-if="!$ctrl.siteAccessToChange" piwik-translate="UsersManager_ChangePermToSiteConfirmMultiple"><strong>{{ $ctrl.userLogin }}</strong>::<strong>{{ $ctrl.getAffectedSitesCount() }}</strong>::<strong>{{ $ctrl.getRoleDisplay($ctrl.roleToChangeTo) }}</strong></p> - </div> - <div class="modal-footer"> - <a href="" class="modal-action modal-close btn" ng-click="$ctrl.changeUserRole()">{{:: 'General_Yes'|translate }}</a> - <a href="" class="modal-action modal-close modal-no" ng-click="$ctrl.siteAccessToChange.role = $ctrl.previousRole; $ctrl.siteAccessToChange = null; $ctrl.roleToChangeTo = null;">{{:: 'General_No'|translate }}</a> - </div> - </div> - - <div class="confirm-give-access-all-sites modal"> - <div class="modal-content"> - <h3 piwik-translate="UsersManager_ChangePermToAllSitesConfirm"><strong>{{ $ctrl.userLogin }}</strong>::<strong>{{ $ctrl.getRoleDisplay($ctrl.allWebsitesAccssLevelSet) }}</strong></h3> - <p>{{ 'UsersManager_ChangePermToAllSitesConfirm2'|translate }}</p> - </div> - <div class="modal-footer"> - <a href="" class="modal-action modal-close btn" ng-click="$ctrl.giveAccessToAllSites()">{{:: 'General_Yes'|translate }}</a> - <a href="" class="modal-action modal-close modal-no">{{:: 'General_No'|translate }}</a> - </div> - </div> -</div> diff --git a/plugins/UsersManager/angularjs/user-permissions-edit/user-permissions-edit.component.js b/plugins/UsersManager/angularjs/user-permissions-edit/user-permissions-edit.component.js deleted file mode 100644 index 7b86f6aef3..0000000000 --- a/plugins/UsersManager/angularjs/user-permissions-edit/user-permissions-edit.component.js +++ /dev/null @@ -1,300 +0,0 @@ -/*! - * Matomo - free/libre analytics platform - * - * @link https://matomo.org - * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later - */ - -/** - * Usage: - * <piwik-user-permissions-edit> - */ -(function () { - angular.module('piwikApp').component('piwikUserPermissionsEdit', { - templateUrl: 'plugins/UsersManager/angularjs/user-permissions-edit/user-permissions-edit.component.html?cb=' + piwik.cacheBuster, - bindings: { - userLogin: '<', - limit: '<', - onUserHasAccessDetected: '&', - onAccessChange: '&', - accessLevels: '<', - filterAccessLevels: '<' - }, - controller: UserPermissionsEditController - }); - - UserPermissionsEditController.$inject = ['piwikApi', '$element', '$q', '$timeout']; - - function UserPermissionsEditController(piwikApi, $element, $q, $timeout) { - var vm = this; - - // search/pagination state - vm.siteAccess = []; - vm.offset = 0; - vm.totalEntries = null; - vm.accessLevelFilter = ''; - vm.siteNameFilter = ''; - vm.isLoadingAccess = false; - vm.allWebsitesAccssLevelSet = 'view'; - - // row selection state - vm.isAllCheckboxSelected = false; - vm.selectedRows = {}; - vm.isBulkActionsDisabled = true; - vm.areAllResultsSelected = false; - vm.previousRole = null; - - // other state - vm.hasAccessToAtLeastOneSite = true; - vm.isRoleHelpToggled = false; - vm.isCapabilitiesHelpToggled = false; - vm.isGivingAccessToAllSites = false; - - // intermediate state - vm.roleToChangeTo = null; - vm.siteAccessToChange = null; - - vm.$onInit = $onInit; - vm.$onChanges = $onChanges; - vm.onAllCheckboxChange = onAllCheckboxChange; - vm.onRowSelected = onRowSelected; - vm.getPaginationLowerBound = getPaginationLowerBound; - vm.getPaginationUpperBound = getPaginationUpperBound; - vm.fetchAccess = fetchAccess; - vm.gotoPreviousPage = gotoPreviousPage; - vm.gotoNextPage = gotoNextPage; - vm.showRemoveAccessConfirm = showRemoveAccessConfirm; - vm.getSelectedRowsCount = getSelectedRowsCount; - vm.getAffectedSitesCount = getAffectedSitesCount; - vm.changeUserRole = changeUserRole; - vm.showChangeAccessConfirm = showChangeAccessConfirm; - vm.getRoleDisplay = getRoleDisplay; - vm.showAddExistingUserModal = showAddExistingUserModal; - vm.giveAccessToAllSites = giveAccessToAllSites; - vm.showChangeAccessAllSitesModal = showChangeAccessAllSitesModal; - - function giveAccessToAllSites() { - vm.isGivingAccessToAllSites = true; - piwikApi.fetch({ - method: 'SitesManager.getSitesWithAdminAccess', - }).then(function (allSites) { - var idSites = allSites.map(function (s) { return s.idsite; }); - return piwikApi.post({ - method: 'UsersManager.setUserAccess' - }, { - userLogin: vm.userLogin, - access: vm.allWebsitesAccssLevelSet, - 'idSites[]': idSites, - }); - }).then(function () { - return vm.fetchAccess(); - })['finally'](function () { - vm.isGivingAccessToAllSites = false; - }); - } - - function showChangeAccessAllSitesModal() { - $element.find('.confirm-give-access-all-sites').modal({ dismissible: false }).modal('open'); - } - - function $onInit() { - vm.limit = vm.limit || 10; - - resetSiteToAdd(); - fetchAccess(); - } - - function $onChanges() { - vm.accessLevels = vm.accessLevels.filter(shouldShowAccessLevel); - vm.filterAccessLevels = vm.filterAccessLevels.filter(shouldShowAccessLevel); - - if (vm.limit) { - fetchAccess(); - } - - function shouldShowAccessLevel(entry) { - return entry.key !== 'superuser'; - } - } - - function fetchAccess() { - vm.isLoadingAccess = true; - piwikApi.fetch({ - method: 'UsersManager.getSitesAccessForUser', - limit: vm.limit, - offset: vm.offset, - filter_search: vm.siteNameFilter, - filter_access: vm.accessLevelFilter, - userLogin: vm.userLogin - }, { includeHeaders: true }).then(function (result) { - vm.isLoadingAccess = false; - vm.siteAccess = result.response; - vm.totalEntries = parseInt(result.headers('x-matomo-total-results')) || 0; - vm.hasAccessToAtLeastOneSite = !! result.headers('x-matomo-has-some'); - - if (vm.onUserHasAccessDetected) { - vm.onUserHasAccessDetected({ hasAccess: vm.hasAccessToAtLeastOneSite }); - } - - clearSelection(); - }).catch(function () { - vm.isLoadingAccess = false; - - clearSelection(); - }); - } - - function getAllSitesInSearch() { - return piwikApi.fetch({ - method: 'UsersManager.getSitesAccessForUser', - filter_search: vm.siteNameFilter, - filter_access: vm.accessLevelFilter, - userLogin: vm.userLogin, - filter_limit: '-1' - }).then(function (access) { - return access.map(function (a) { return a.idsite; }); - }); - } - - function clearSelection() { - vm.selectedRows = {}; - vm.areAllResultsSelected = false; - vm.isBulkActionsDisabled = true; - vm.isAllCheckboxSelected = false; - vm.siteAccessToChange = null; - } - - function onAllCheckboxChange() { - if (!vm.isAllCheckboxSelected) { - clearSelection(); - } else { - for (var i = 0; i !== vm.siteAccess.length; ++i) { - vm.selectedRows[i] = true; - } - vm.isBulkActionsDisabled = false; - } - } - - function onRowSelected() { - $timeout(function () { - var selectedRowKeyCount = getSelectedRowsCount(); - vm.isBulkActionsDisabled = selectedRowKeyCount === 0; - vm.isAllCheckboxSelected = selectedRowKeyCount === vm.siteAccess.length; - }); - } - - function getPaginationLowerBound() { - return vm.offset + 1; - } - - function getPaginationUpperBound() { - return Math.min(vm.offset + vm.limit, vm.totalEntries); - } - - function resetSiteToAdd() { - vm.siteToAdd = { - id: null, - name: '' - }; - } - - function changeUserRole() { - vm.isLoadingAccess = true; - - return $q.resolve().then(function () { - if (vm.siteAccessToChange) { - return [vm.siteAccessToChange.idsite]; - } - - if (vm.areAllResultsSelected) { - return getAllSitesInSearch(); - } - - return getSelectedSites(); - }).then(function (idSites) { - return piwikApi.post({ - method: 'UsersManager.setUserAccess' - }, { - userLogin: vm.userLogin, - access: vm.roleToChangeTo, - 'idSites[]': idSites - }); - }).catch(function () { - // ignore (errors will still be displayed to the user) - }).then(function () { - vm.onAccessChange(); - - return fetchAccess(); - }); - } - - function getSelectedSites() { - var result = []; - Object.keys(vm.selectedRows).forEach(function (index) { - if (vm.selectedRows[index] - && vm.siteAccess[index] // safety check - ) { - result.push(vm.siteAccess[index].idsite); - } - }); - return result; - } - - function gotoPreviousPage() { - vm.offset = Math.max(0, vm.offset - vm.limit); - - fetchAccess(); - } - - function gotoNextPage() { - var newOffset = vm.offset + vm.limit; - if (newOffset >= vm.totalEntries) { - return; - } - - vm.offset = newOffset; - fetchAccess(); - } - - function showRemoveAccessConfirm() { - $element.find('.delete-access-confirm-modal').modal({ dismissible: false }).modal('open'); - } - - function showChangeAccessConfirm() { - $element.find('.change-access-confirm-modal').modal({ dismissible: false }).modal('open'); - } - - function showAddExistingUserModal() { - $element.find('.add-existing-user-modal').modal({ dismissible: false }).modal('open'); - } - - function getSelectedRowsCount() { - var selectedRowKeyCount = 0; - Object.keys(vm.selectedRows).forEach(function (key) { - if (vm.selectedRows[key]) { - ++selectedRowKeyCount; - } - }); - return selectedRowKeyCount; - } - - function getAffectedSitesCount() { - if (vm.areAllResultsSelected) { - return vm.totalEntries; - } - - return getSelectedRowsCount(); - } - - function getRoleDisplay(role) { - var result = null; - vm.accessLevels.forEach(function (entry) { - if (entry.key === role) { - result = entry.value; - } - }); - return result; - } - } - -})(); diff --git a/plugins/UsersManager/tests/UI/UsersManager_spec.js b/plugins/UsersManager/tests/UI/UsersManager_spec.js index 475bba3d8c..e1c06bce75 100644 --- a/plugins/UsersManager/tests/UI/UsersManager_spec.js +++ b/plugins/UsersManager/tests/UI/UsersManager_spec.js @@ -331,7 +331,7 @@ describe("UsersManager", function () { it('should select all displayed rows when the select all checkbox is clicked', async function () { await page.click('.userPermissionsEdit th.select-cell input + span'); - await page.waitForTimeout(250); // for checkbox animations + await page.waitForTimeout(400); // for checkbox animations await page.mouse.move(-10, -10); expect(await page.screenshotSelector('.usersManager')).to.matchImage({ diff --git a/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_admin_view_admin_edit_permissions.png b/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_admin_view_admin_edit_permissions.png index 2bea700701..5a134db55c 100644 --- a/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_admin_view_admin_edit_permissions.png +++ b/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_admin_view_admin_edit_permissions.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:8355571b0804e59efbe22334c97e798510f6791314630ad591446204f2e0cea5 -size 81574 +oid sha256:3346b885e52e6a1eba7713264051248faaaaf3f3f45d99ed3e1fa73a35128f92 +size 81607 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 0e1ea76c0b..da6f81d0cd 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:7f8e3168bfd55b755751e9cfae27b3dd60674019de38c338970b4a22cb2cde57 -size 93240 +oid sha256:ccdd00490fc3007eba85e4885878c055adbb780e498818738325abda97ab401b +size 93431 diff --git a/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_permissions_all_sites_access.png b/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_permissions_all_sites_access.png index 3ce1307b10..814cc1bfdf 100644 --- a/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_permissions_all_sites_access.png +++ b/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_permissions_all_sites_access.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:1187cff49198d1ec7784bcf8ef9c57813b4325c0e6778117dd32b30d777c4594 -size 100480 +oid sha256:d5dab1176dddeb53bcc1240c1fd0be6b4e5adf346044b54ce9954e0e4c8d1dab +size 100457 diff --git a/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_permissions_capability_single_site.png b/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_permissions_capability_single_site.png index 9365527f47..4493dccfc7 100644 --- a/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_permissions_capability_single_site.png +++ b/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_permissions_capability_single_site.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:7245e5f4269836c8e2cde0c44de8ddb12423eb63f2e36d1ddb72c2926225ea5d -size 92457 +oid sha256:d046b81c450841dabd11d6aee75e551f58da0dd6bf2eb6105954eeb27d623712 +size 92643 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 cbf99243ba..8a5d1d2fff 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:82b0987e271f10a015994227a82c733313da191d5abda6dea80a50c66cca44d9 -size 82163 +oid sha256:3a22f31407a292e25abd22086b520440e44c4ab49b283a150ac5eae8ef2233d9 +size 82154 diff --git a/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_permissions_filters.png b/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_permissions_filters.png index a8ef38d934..b06125805a 100644 --- a/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_permissions_filters.png +++ b/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_permissions_filters.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:0da4043873fd4a03586344399e4d230cbf49bcfb3a21258af02fb86c283855a2 -size 66659 +oid sha256:792553c87314cfd1c5f6115d4aa8a8e02705b08cad97697d36ac4aa371e51d4a +size 66603 diff --git a/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_permissions_next.png b/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_permissions_next.png index f22b6b6284..c2328e9c47 100644 --- a/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_permissions_next.png +++ b/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_permissions_next.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:2ec58a4d3d51a8b13bad20f858453cba578e68b5a946ecede4d2b0174a76d83f -size 92466 +oid sha256:908f27b2e116530f1ef60b305bc9e4417c7f5a0999eff4ec9ba9923cb1fe3e04 +size 92304 diff --git a/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_permissions_remove_access.png b/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_permissions_remove_access.png index 32b43b0cc2..8843e2ac5e 100644 --- a/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_permissions_remove_access.png +++ b/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_permissions_remove_access.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:2db1d07ee054bb937ddaa3544f447920b01d1ba5dbd9d0371d31d076ec3718d2 -size 47993 +oid sha256:b2c360c4cc4b1d0ecf49efbf71cd444cf451b841bf1ff9640a66831b3efb79d1 +size 48046 diff --git a/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_permissions_remove_single.png b/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_permissions_remove_single.png index 367f2c5b10..eec6d9c49d 100644 --- a/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_permissions_remove_single.png +++ b/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_permissions_remove_single.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:86efc969c58f87ddfe9df3451d585cfe3710d851354e71f4d45b52225b03c320 -size 90565 +oid sha256:cf8b4d58b4d51af043a6c9e6bd71e58921d22b56e6b35f7e0986452527c5392b +size 90402 diff --git a/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_permissions_select_all.png b/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_permissions_select_all.png index 5c553934b1..0c18eb70d9 100644 --- a/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_permissions_select_all.png +++ b/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_permissions_select_all.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:0775b9728bcc5c1ccd4497df6e77ad686ce380c1215d4f79fd8e284f831f0d0c -size 69078 +oid sha256:0df07e4f847d726c31258787973dcc65b319df3900a5d736226fdcc8de25ef14 +size 68958 diff --git a/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_permissions_select_multiple.png b/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_permissions_select_multiple.png index 69215c0e74..d5a3219e39 100644 --- a/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_permissions_select_multiple.png +++ b/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_permissions_select_multiple.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:bb5d14dcd6075e80cdbf488ad9e03dc6a830dbfb8b31b3f0a172c9396697c82b -size 92579 +oid sha256:02de73538753bf94f25be31031defbe8a096b3cbd266b28902fab4535bde38aa +size 92435 diff --git a/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_permissions_single_site_access.png b/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_permissions_single_site_access.png index ab419ee5f9..bfd451cd99 100644 --- a/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_permissions_single_site_access.png +++ b/plugins/UsersManager/tests/UI/expected-screenshots/UsersManager_permissions_single_site_access.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:cec452b68a9801e37be4050f2454d5656844c5ccdd31af643d1e0583dbf8df08 -size 89100 +oid sha256:11b17e734653fdd890a0e0a6a052a604e18552e1367f5f663d4030fbcf571dd2 +size 89272 diff --git a/plugins/UsersManager/vue/dist/UsersManager.umd.js b/plugins/UsersManager/vue/dist/UsersManager.umd.js index ae145d094b..36b9629aab 100644 --- a/plugins/UsersManager/vue/dist/UsersManager.umd.js +++ b/plugins/UsersManager/vue/dist/UsersManager.umd.js @@ -126,6 +126,7 @@ __webpack_require__.r(__webpack_exports__); // EXPORTS __webpack_require__.d(__webpack_exports__, "CapabilitiesEdit", function() { return /* reexport */ CapabilitiesEdit; }); +__webpack_require__.d(__webpack_exports__, "UserPermissionsEdit", function() { return /* reexport */ UserPermissionsEdit; }); // CONCATENATED MODULE: ./node_modules/@vue/cli-service/lib/commands/build/setPublicPath.js // This file is imported into lib/wc client bundles. @@ -575,6 +576,855 @@ CapabilitiesEditvue_type_script_lang_ts.render = render } } })); +// 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/UserPermissionsEdit/UserPermissionsEdit.vue?vue&type=template&id=b8ef996c + +var UserPermissionsEditvue_type_template_id_b8ef996c_hoisted_1 = { + key: 0, + class: "row" +}; +var UserPermissionsEditvue_type_template_id_b8ef996c_hoisted_2 = { + class: "row to-all-websites" +}; +var UserPermissionsEditvue_type_template_id_b8ef996c_hoisted_3 = { + class: "col s12" +}; +var UserPermissionsEditvue_type_template_id_b8ef996c_hoisted_4 = { + style: { + "margin-right": "3.5px" + } +}; +var UserPermissionsEditvue_type_template_id_b8ef996c_hoisted_5 = { + id: "all-sites-access-select", + style: { + "margin-right": "3.5px" + } +}; + +var UserPermissionsEditvue_type_template_id_b8ef996c_hoisted_6 = /*#__PURE__*/Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("p", null, " ", -1); + +var UserPermissionsEditvue_type_template_id_b8ef996c_hoisted_7 = { + class: "filters row" +}; +var UserPermissionsEditvue_type_template_id_b8ef996c_hoisted_8 = { + class: "col s12 m12 l8" +}; +var _hoisted_9 = { + class: "input-field bulk-actions", + style: { + "margin-right": "3.5px" + } +}; +var _hoisted_10 = { + id: "user-permissions-edit-bulk-actions", + class: "dropdown-content" +}; +var _hoisted_11 = { + class: "dropdown-trigger", + "data-target": "user-permissions-bulk-set-access" +}; +var _hoisted_12 = { + id: "user-permissions-bulk-set-access", + class: "dropdown-content" +}; +var _hoisted_13 = ["onClick"]; +var _hoisted_14 = { + class: "input-field site-filter", + style: { + "margin-right": "3.5px" + } +}; +var _hoisted_15 = ["value", "placeholder"]; +var _hoisted_16 = { + class: "input-field access-filter", + style: { + "margin-right": "3.5px" + } +}; +var _hoisted_17 = { + key: 0, + class: "col s12 m12 l4 sites-for-permission-pagination-container" +}; +var _hoisted_18 = { + class: "sites-for-permission-pagination" +}; +var _hoisted_19 = { + class: "counter" +}; +var _hoisted_20 = ["textContent"]; +var _hoisted_21 = { + class: "roles-help-notification" +}; +var _hoisted_22 = ["innerHTML"]; +var _hoisted_23 = { + class: "capabilities-help-notification" +}; +var _hoisted_24 = { + id: "sitesForPermission" +}; +var _hoisted_25 = { + class: "select-cell" +}; +var _hoisted_26 = { + class: "checkbox-container" +}; +var _hoisted_27 = ["checked"]; + +var _hoisted_28 = /*#__PURE__*/Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("span", null, null, -1); + +var _hoisted_29 = { + class: "role_header" +}; +var _hoisted_30 = ["innerHTML"]; + +var _hoisted_31 = /*#__PURE__*/Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("span", { + class: "icon-help" +}, null, -1); + +var _hoisted_32 = [_hoisted_31]; +var _hoisted_33 = { + class: "capabilities_header" +}; +var _hoisted_34 = ["innerHTML"]; + +var _hoisted_35 = /*#__PURE__*/Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("span", { + class: "icon-help" +}, null, -1); + +var _hoisted_36 = [_hoisted_35]; +var _hoisted_37 = { + key: 0, + class: "select-all-row" +}; +var _hoisted_38 = { + colspan: "4" +}; +var _hoisted_39 = { + key: 0 +}; +var _hoisted_40 = ["innerHTML"]; +var _hoisted_41 = ["innerHTML"]; +var _hoisted_42 = { + key: 1 +}; +var _hoisted_43 = ["innerHTML"]; +var _hoisted_44 = ["innerHTML"]; +var _hoisted_45 = { + class: "select-cell" +}; +var _hoisted_46 = { + class: "checkbox-container" +}; +var _hoisted_47 = ["id", "onUpdate:modelValue"]; + +var _hoisted_48 = /*#__PURE__*/Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("span", null, null, -1); + +var _hoisted_49 = { + class: "role-select" +}; +var _hoisted_50 = { + class: "delete-access-confirm-modal modal", + ref: "deleteAccessConfirmModal" +}; +var _hoisted_51 = { + class: "modal-content" +}; +var _hoisted_52 = ["innerHTML"]; +var _hoisted_53 = ["innerHTML"]; +var _hoisted_54 = { + class: "modal-footer" +}; +var _hoisted_55 = { + class: "change-access-confirm-modal modal", + ref: "changeAccessConfirmModal" +}; +var _hoisted_56 = { + class: "modal-content" +}; +var _hoisted_57 = ["innerHTML"]; +var _hoisted_58 = ["innerHTML"]; +var _hoisted_59 = { + class: "modal-footer" +}; +var _hoisted_60 = { + class: "confirm-give-access-all-sites modal", + ref: "confirmGiveAccessAllSitesModal" +}; +var _hoisted_61 = { + class: "modal-content" +}; +var _hoisted_62 = ["innerHTML"]; +var _hoisted_63 = { + class: "modal-footer" +}; +function UserPermissionsEditvue_type_template_id_b8ef996c_render(_ctx, _cache, $props, $setup, $data, $options) { + var _component_Notification = Object(external_commonjs_vue_commonjs2_vue_root_Vue_["resolveComponent"])("Notification"); + + var _component_Field = Object(external_commonjs_vue_commonjs2_vue_root_Vue_["resolveComponent"])("Field"); + + var _component_CapabilitiesEdit = Object(external_commonjs_vue_commonjs2_vue_root_Vue_["resolveComponent"])("CapabilitiesEdit"); + + var _directive_dropdown_menu = Object(external_commonjs_vue_commonjs2_vue_root_Vue_["resolveDirective"])("dropdown-menu"); + + var _directive_content_table = Object(external_commonjs_vue_commonjs2_vue_root_Vue_["resolveDirective"])("content-table"); + + return Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("div", { + class: Object(external_commonjs_vue_commonjs2_vue_root_Vue_["normalizeClass"])(["userPermissionsEdit", { + loading: _ctx.isLoadingAccess + }]) + }, [!_ctx.hasAccessToAtLeastOneSite ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("div", UserPermissionsEditvue_type_template_id_b8ef996c_hoisted_1, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", null, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createVNode"])(_component_Notification, { + context: "warning", + type: "transient", + noclear: true + }, { + default: Object(external_commonjs_vue_commonjs2_vue_root_Vue_["withCtx"])(function () { + return [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("strong", null, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('General_Warning')) + ":", 1), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createTextVNode"])(" " + Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('UsersManager_NoAccessWarning')), 1)]; + }), + _: 1 + })])])) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", UserPermissionsEditvue_type_template_id_b8ef996c_hoisted_2, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", UserPermissionsEditvue_type_template_id_b8ef996c_hoisted_3, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", null, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("span", UserPermissionsEditvue_type_template_id_b8ef996c_hoisted_4, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('UsersManager_GiveAccessToAll')) + ":", 1), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", UserPermissionsEditvue_type_template_id_b8ef996c_hoisted_5, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createVNode"])(_component_Field, { + modelValue: _ctx.allWebsitesAccssLevelSet, + "onUpdate:modelValue": _cache[0] || (_cache[0] = function ($event) { + return _ctx.allWebsitesAccssLevelSet = $event; + }), + uicontrol: "select", + options: _ctx.filteredAccessLevels, + "full-width": true + }, null, 8, ["modelValue", "options"])]), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("a", { + href: "", + class: Object(external_commonjs_vue_commonjs2_vue_root_Vue_["normalizeClass"])(["btn", { + disabled: _ctx.isGivingAccessToAllSites + }]), + onClick: _cache[1] || (_cache[1] = Object(external_commonjs_vue_commonjs2_vue_root_Vue_["withModifiers"])(function ($event) { + return _ctx.showChangeAccessAllSitesModal(); + }, ["prevent"])) + }, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('General_Apply')), 3)]), UserPermissionsEditvue_type_template_id_b8ef996c_hoisted_6, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("p", null, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('UsersManager_OrManageIndividually')) + ":", 1)])]), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", UserPermissionsEditvue_type_template_id_b8ef996c_hoisted_7, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", UserPermissionsEditvue_type_template_id_b8ef996c_hoisted_8, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", _hoisted_9, [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", { + disabled: _ctx.isBulkActionsDisabled + }]), + href: "", + "data-target": "user-permissions-edit-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, { + activates: '#user-permissions-edit-bulk-actions' + }]]), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("ul", _hoisted_10, [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", _hoisted_11, [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, { + activates: '#user-permissions-bulk-set-access' + }]]), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("ul", _hoisted_12, [(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.filteredAccessLevels, 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", { + href: "", + onClick: Object(external_commonjs_vue_commonjs2_vue_root_Vue_["withModifiers"])(function ($event) { + _ctx.siteAccessToChange = null; + _ctx.roleToChangeTo = access.key; + + _ctx.showChangeAccessConfirm(); + }, ["prevent"]) + }, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(access.value), 9, _hoisted_13)]); + }), 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[2] || (_cache[2] = Object(external_commonjs_vue_commonjs2_vue_root_Vue_["withModifiers"])(function ($event) { + _ctx.siteAccessToChange = null; + _ctx.roleToChangeTo = 'noaccess'; + + _ctx.showRemoveAccessConfirm(); + }, ["prevent"])) + }, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('UsersManager_RemovePermissions')), 1)])])]), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", _hoisted_14, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("input", { + type: "text", + value: _ctx.siteNameFilter, + onKeydown: _cache[3] || (_cache[3] = function ($event) { + _ctx.onChangeSiteFilter($event); + }), + onChange: _cache[4] || (_cache[4] = function ($event) { + _ctx.onChangeSiteFilter($event); + }), + placeholder: _ctx.translate('UsersManager_FilterByWebsite') + }, null, 40, _hoisted_15)]), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", _hoisted_16, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", null, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createVNode"])(_component_Field, { + modelValue: _ctx.accessLevelFilter, + "onUpdate:modelValue": _cache[5] || (_cache[5] = function ($event) { + return _ctx.accessLevelFilter = $event; + }), + uicontrol: "select", + options: _ctx.filteredSelectAccessLevels, + "full-width": true, + placeholder: _ctx.translate('UsersManager_FilterByAccess') + }, null, 8, ["modelValue", "options", "placeholder"])])])]), _ctx.totalEntries > _ctx.limit ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("div", _hoisted_17, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", _hoisted_18, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("a", { + class: Object(external_commonjs_vue_commonjs2_vue_root_Vue_["normalizeClass"])(["prev", { + disabled: _ctx.offset <= 0 + }]) + }, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("span", { + class: "pointer", + onClick: _cache[6] || (_cache[6] = function ($event) { + return _ctx.gotoPreviousPage(); + }) + }, "« " + Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('General_Previous')), 1)], 2), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("span", _hoisted_19, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("span", { + textContent: Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.paginationText) + }, null, 8, _hoisted_20)]), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("a", { + class: Object(external_commonjs_vue_commonjs2_vue_root_Vue_["normalizeClass"])(["next", { + disabled: _ctx.offset + _ctx.limit >= _ctx.totalEntries + }]) + }, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("span", { + class: "pointer", + onClick: _cache[7] || (_cache[7] = function ($event) { + return _ctx.gotoNextPage(); + }) + }, 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)]), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", _hoisted_21, [_ctx.isRoleHelpToggled ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createBlock"])(_component_Notification, { + key: 0, + context: "info", + type: "persistent", + noclear: true + }, { + 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, _hoisted_22)]; + }), + _: 1 + })) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true)]), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", _hoisted_23, [_ctx.isCapabilitiesHelpToggled ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createBlock"])(_component_Notification, { + key: 0, + context: "info", + type: "persistent", + noclear: true + }, { + default: Object(external_commonjs_vue_commonjs2_vue_root_Vue_["withCtx"])(function () { + return [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("span", null, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('UsersManager_CapabilitiesHelp')), 1)]; + }), + _: 1 + })) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true)]), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["withDirectives"])(Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("table", _hoisted_24, [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", _hoisted_25, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("span", _hoisted_26, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("label", null, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("input", { + type: "checkbox", + id: "perm_edit_select_all", + checked: _ctx.isAllCheckboxSelected, + onChange: _cache[8] || (_cache[8] = function ($event) { + return _ctx.onAllCheckboxChange($event); + }) + }, null, 40, _hoisted_27), _hoisted_28])])]), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("th", null, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('General_Name')), 1), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("th", _hoisted_29, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("span", { + innerHTML: "".concat(_ctx.translate('UsersManager_Role'), " ") + }, null, 8, _hoisted_30), 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[9] || (_cache[9] = Object(external_commonjs_vue_commonjs2_vue_root_Vue_["withModifiers"])(function ($event) { + return _ctx.isRoleHelpToggled = !_ctx.isRoleHelpToggled; + }, ["prevent"])) + }, _hoisted_32, 2)]), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("th", _hoisted_33, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("span", { + innerHTML: "".concat(_ctx.translate('UsersManager_Capabilities'), " ") + }, null, 8, _hoisted_34), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("a", { + href: "", + class: Object(external_commonjs_vue_commonjs2_vue_root_Vue_["normalizeClass"])(["helpIcon", { + sticky: _ctx.isCapabilitiesHelpToggled + }]), + onClick: _cache[10] || (_cache[10] = Object(external_commonjs_vue_commonjs2_vue_root_Vue_["withModifiers"])(function ($event) { + return _ctx.isCapabilitiesHelpToggled = !_ctx.isCapabilitiesHelpToggled; + }, ["prevent"])) + }, _hoisted_36, 2)])])]), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("tbody", null, [_ctx.isAllCheckboxSelected && _ctx.siteAccess.length < _ctx.totalEntries ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("tr", _hoisted_37, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("td", _hoisted_38, [!_ctx.areAllResultsSelected ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("div", _hoisted_39, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("span", { + innerHTML: _ctx.$sanitize(_ctx.theDisplayedWebsitesAreSelectedText), + style: { + "margin-right": "3.5px" + } + }, null, 8, _hoisted_40), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("a", { + href: "#", + 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.clickToSelectAllText) + }, null, 8, _hoisted_41)])) : 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", _hoisted_42, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("span", { + innerHTML: _ctx.$sanitize(_ctx.allWebsitesAreSelectedText), + style: { + "margin-right": "3.5px" + } + }, null, 8, _hoisted_43), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("a", { + href: "#", + 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.clickToSelectDisplayedWebsitesText) + }, null, 8, _hoisted_44)])) : 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.siteAccess, function (entry, index) { + return Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("tr", { + key: entry.idsite + }, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("td", _hoisted_45, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("span", _hoisted_46, [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: "perm_edit_select_row".concat(index), + "onUpdate:modelValue": function onUpdateModelValue($event) { + return _ctx.selectedRows[index] = $event; + }, + onClick: _cache[13] || (_cache[13] = function ($event) { + return _ctx.onRowSelected(); + }) + }, null, 8, _hoisted_47), [[external_commonjs_vue_commonjs2_vue_root_Vue_["vModelCheckbox"], _ctx.selectedRows[index]]]), _hoisted_48])])]), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("td", null, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("span", null, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(entry.site_name), 1)]), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("td", null, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", _hoisted_49, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createVNode"])(_component_Field, { + "model-value": entry.role, + "onUpdate:modelValue": function onUpdateModelValue($event) { + _ctx.onRoleChange(entry, $event); + }, + uicontrol: "select", + options: _ctx.filteredAccessLevels, + "full-width": true + }, null, 8, ["model-value", "onUpdate:modelValue", "options"])])]), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("td", null, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", null, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createVNode"])(_component_CapabilitiesEdit, { + idsite: entry.idsite, + "site-name": entry.site_name, + "user-login": _ctx.userLogin, + "user-role": entry.role, + capabilities: entry.capabilities, + onChange: _cache[14] || (_cache[14] = function ($event) { + return _ctx.fetchAccess(); + }) + }, null, 8, ["idsite", "site-name", "user-login", "user-role", "capabilities"])])])]); + }), 128))])], 512), [[_directive_content_table]]), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", _hoisted_50, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", _hoisted_51, [_ctx.siteAccessToChange ? (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.deletePermConfirmSingleText) + }, null, 8, _hoisted_52)) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true), !_ctx.siteAccessToChange ? (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.deletePermConfirmMultipleText) + }, null, 8, _hoisted_53)) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true)]), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", _hoisted_54, [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) { + return _ctx.changeUserRole(); + }, ["prevent"])) + }, 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) { + _ctx.siteAccessToChange = 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_55, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", _hoisted_56, [_ctx.siteAccessToChange ? (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.changePermToSiteConfirmSingleText) + }, null, 8, _hoisted_57)) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true), !_ctx.siteAccessToChange ? (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.changePermToSiteConfirmMultipleText) + }, null, 8, _hoisted_58)) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true)]), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", _hoisted_59, [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) { + return _ctx.changeUserRole(); + }, ["prevent"])) + }, 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) { + _ctx.siteAccessToChange.role = _ctx.previousRole; + _ctx.siteAccessToChange = 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_60, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", _hoisted_61, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("h3", { + innerHTML: _ctx.$sanitize(_ctx.changePermToAllSitesConfirmText) + }, null, 8, _hoisted_62), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("p", null, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('UsersManager_ChangePermToAllSitesConfirm2')), 1)]), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", _hoisted_63, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("a", { + href: "", + class: "modal-action modal-close btn", + onClick: _cache[19] || (_cache[19] = Object(external_commonjs_vue_commonjs2_vue_root_Vue_["withModifiers"])(function ($event) { + return _ctx.giveAccessToAllSites(); + }, ["prevent"])) + }, 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[20] || (_cache[20] = function ($event) { + return $event.preventDefault(); + }) + }, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('General_No')), 1)])], 512)], 2); +} +// CONCATENATED MODULE: ./plugins/UsersManager/vue/src/UserPermissionsEdit/UserPermissionsEdit.vue?vue&type=template&id=b8ef996c + +// 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/UserPermissionsEdit/UserPermissionsEdit.vue?vue&type=script&lang=ts + + + + +var UserPermissionsEditvue_type_script_lang_ts_window = window, + UserPermissionsEditvue_type_script_lang_ts_$ = UserPermissionsEditvue_type_script_lang_ts_window.$; +/* harmony default export */ var UserPermissionsEditvue_type_script_lang_ts = (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["defineComponent"])({ + props: { + userLogin: { + type: String, + required: true + }, + limit: { + type: Number, + default: 10 + }, + accessLevels: { + type: Array, + required: true + }, + filterAccessLevels: { + type: Array, + required: true + } + }, + components: { + Notification: external_CoreHome_["Notification"], + Field: external_CorePluginsAdmin_["Field"], + CapabilitiesEdit: CapabilitiesEdit + }, + directives: { + DropdownMenu: external_CoreHome_["DropdownMenu"], + ContentTable: external_CoreHome_["ContentTable"] + }, + data: function data() { + return { + siteAccess: [], + offset: 0, + totalEntries: null, + accessLevelFilter: '', + siteNameFilter: '', + isLoadingAccess: false, + allWebsitesAccssLevelSet: 'view', + isAllCheckboxSelected: false, + selectedRows: {}, + isBulkActionsDisabled: true, + areAllResultsSelected: false, + previousRole: null, + hasAccessToAtLeastOneSite: true, + isRoleHelpToggled: false, + isCapabilitiesHelpToggled: false, + isGivingAccessToAllSites: false, + roleToChangeTo: null, + siteAccessToChange: null + }; + }, + emits: ['userHasAccessDetected', 'accessChanged'], + created: function created() { + var _this = this; + + this.onChangeSiteFilter = Object(external_CoreHome_["debounce"])(this.onChangeSiteFilter, 300); + Object(external_commonjs_vue_commonjs2_vue_root_Vue_["watch"])(function () { + return _this.allPropsWatch; + }, function () { + if (_this.limit) { + _this.fetchAccess(); + } + }); + this.fetchAccess(); + }, + watch: { + accessLevelFilter: function accessLevelFilter() { + this.offset = 0; + this.fetchAccess(); + } + }, + methods: { + onAllCheckboxChange: function onAllCheckboxChange(event) { + var _this2 = this; + + this.isAllCheckboxSelected = event.target.checked; + + if (!this.isAllCheckboxSelected) { + this.clearSelection(); + } else { + this.siteAccess.forEach(function (e, i) { + _this2.selectedRows[i] = true; + }); + this.isBulkActionsDisabled = false; + } + }, + clearSelection: function clearSelection() { + this.selectedRows = {}; + this.areAllResultsSelected = false; + this.isBulkActionsDisabled = true; + this.isAllCheckboxSelected = false; + this.siteAccessToChange = null; + }, + onRowSelected: function onRowSelected() { + var _this3 = this; + + setTimeout(function () { + var selectedRowKeyCount = _this3.selectedRowsCount; + _this3.isBulkActionsDisabled = selectedRowKeyCount === 0; + _this3.isAllCheckboxSelected = selectedRowKeyCount === _this3.siteAccess.length; + }); + }, + fetchAccess: function fetchAccess() { + var _this4 = this; + + this.isLoadingAccess = true; + return external_CoreHome_["AjaxHelper"].fetch({ + method: 'UsersManager.getSitesAccessForUser', + limit: this.limit, + offset: this.offset, + filter_search: this.siteNameFilter, + filter_access: this.accessLevelFilter, + userLogin: this.userLogin + }, { + returnResponseObject: true + }).then(function (helper) { + var result = helper.getRequestHandle(); + _this4.isLoadingAccess = false; + _this4.siteAccess = result.responseJSON; + _this4.totalEntries = parseInt(result.getResponseHeader('x-matomo-total-results'), 10) || 0; + _this4.hasAccessToAtLeastOneSite = !!result.getResponseHeader('x-matomo-has-some'); + + _this4.$emit('userHasAccessDetected', { + hasAccess: _this4.hasAccessToAtLeastOneSite + }); + + _this4.clearSelection(); + }).catch(function () { + _this4.isLoadingAccess = false; + + _this4.clearSelection(); + }); + }, + gotoPreviousPage: function gotoPreviousPage() { + this.offset = Math.max(0, this.offset - this.limit); + this.fetchAccess(); + }, + gotoNextPage: function gotoNextPage() { + var newOffset = this.offset + this.limit; + + if (newOffset >= (this.totalEntries || 0)) { + return; + } + + this.offset = newOffset; + this.fetchAccess(); + }, + showRemoveAccessConfirm: function showRemoveAccessConfirm() { + UserPermissionsEditvue_type_script_lang_ts_$(this.$refs.deleteAccessConfirmModal).modal({ + dismissible: false + }).modal('open'); + }, + changeUserRole: function changeUserRole() { + var _this5 = this; + + var getSelectedSites = function getSelectedSites() { + var result = []; + Object.keys(_this5.selectedRows).forEach(function (index) { + if (_this5.selectedRows[index] && _this5.siteAccess[index] // safety check + ) { + result.push(_this5.siteAccess[index].idsite); + } + }); + return result; + }; + + var getAllSitesInSearch = function getAllSitesInSearch() { + return external_CoreHome_["AjaxHelper"].fetch({ + method: 'UsersManager.getSitesAccessForUser', + filter_search: _this5.siteNameFilter, + filter_access: _this5.accessLevelFilter, + userLogin: _this5.userLogin, + filter_limit: '-1' + }).then(function (access) { + return access.map(function (a) { + return a.idsite; + }); + }); + }; + + this.isLoadingAccess = true; + return Promise.resolve().then(function () { + if (_this5.siteAccessToChange) { + return [_this5.siteAccessToChange.idsite]; + } + + if (_this5.areAllResultsSelected) { + return getAllSitesInSearch(); + } + + return getSelectedSites(); + }).then(function (idSites) { + return external_CoreHome_["AjaxHelper"].post({ + method: 'UsersManager.setUserAccess' + }, { + userLogin: _this5.userLogin, + access: _this5.roleToChangeTo, + idSites: idSites + }); + }).catch(function () {// ignore (errors will still be displayed to the user) + }).then(function () { + _this5.$emit('accessChanged'); + + return _this5.fetchAccess(); + }); + }, + showChangeAccessConfirm: function showChangeAccessConfirm() { + UserPermissionsEditvue_type_script_lang_ts_$(this.$refs.changeAccessConfirmModal).modal({ + dismissible: false + }).modal('open'); + }, + getRoleDisplay: function getRoleDisplay(role) { + var result = null; + this.filteredAccessLevels.forEach(function (entry) { + if (entry.key === role) { + result = entry.value; + } + }); + return result; + }, + giveAccessToAllSites: function giveAccessToAllSites() { + var _this6 = this; + + this.isGivingAccessToAllSites = true; + external_CoreHome_["AjaxHelper"].fetch({ + method: 'SitesManager.getSitesWithAdminAccess' + }).then(function (allSites) { + var idSites = allSites.map(function (s) { + return s.idsite; + }); + return external_CoreHome_["AjaxHelper"].post({ + method: 'UsersManager.setUserAccess' + }, { + userLogin: _this6.userLogin, + access: _this6.allWebsitesAccssLevelSet, + idSites: idSites + }); + }).then(function () { + return _this6.fetchAccess(); + }).finally(function () { + _this6.isGivingAccessToAllSites = false; + }); + }, + showChangeAccessAllSitesModal: function showChangeAccessAllSitesModal() { + UserPermissionsEditvue_type_script_lang_ts_$(this.$refs.confirmGiveAccessAllSitesModal).modal({ + dismissible: false + }).modal('open'); + }, + onChangeSiteFilter: function onChangeSiteFilter(event) { + var _this7 = this; + + setTimeout(function () { + var inputValue = event.target.value; + + if (_this7.siteNameFilter !== inputValue) { + _this7.siteNameFilter = inputValue; + _this7.offset = 0; + + _this7.fetchAccess(); + } + }); + }, + onRoleChange: function onRoleChange(entry, newRole) { + this.previousRole = entry.role; + this.roleToChangeTo = newRole; + this.siteAccessToChange = entry; + this.showChangeAccessConfirm(); + } + }, + computed: { + rolesHelpText: function rolesHelpText() { + return Object(external_CoreHome_["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 theDisplayedWebsitesAreSelectedText() { + var text = Object(external_CoreHome_["translate"])('UsersManager_TheDisplayedWebsitesAreSelected', "<strong>".concat(this.siteAccess.length, "</strong>")); + return "".concat(text, " "); + }, + clickToSelectAllText: function clickToSelectAllText() { + return Object(external_CoreHome_["translate"])('UsersManager_ClickToSelectAll', "<strong>".concat(this.totalEntries, "</strong>")); + }, + allWebsitesAreSelectedText: function allWebsitesAreSelectedText() { + return Object(external_CoreHome_["translate"])('UsersManager_AllWebsitesAreSelected', "<strong>".concat(this.totalEntries, "</strong>")); + }, + clickToSelectDisplayedWebsitesText: function clickToSelectDisplayedWebsitesText() { + return Object(external_CoreHome_["translate"])('UsersManager_ClickToSelectDisplayedWebsites', "<strong>".concat(this.siteAccess.length, "</strong>")); + }, + deletePermConfirmSingleText: function deletePermConfirmSingleText() { + return Object(external_CoreHome_["translate"])('UsersManager_DeletePermConfirmSingle', "<strong>".concat(this.userLogin, "</strong>"), "<strong>".concat(this.siteAccessToChangeName, "</strong>")); + }, + deletePermConfirmMultipleText: function deletePermConfirmMultipleText() { + return Object(external_CoreHome_["translate"])('UsersManager_DeletePermConfirmMultiple', "<strong>".concat(this.userLogin, "</strong>"), "<strong>".concat(this.affectedSitesCount, "</strong>")); + }, + changePermToSiteConfirmSingleText: function changePermToSiteConfirmSingleText() { + return Object(external_CoreHome_["translate"])('UsersManager_ChangePermToSiteConfirmSingle', "<strong>".concat(this.userLogin, "</strong>"), "<strong>".concat(this.siteAccessToChangeName, "</strong>"), "<strong>".concat(this.getRoleDisplay(this.roleToChangeTo), "</strong>")); + }, + changePermToSiteConfirmMultipleText: function changePermToSiteConfirmMultipleText() { + return Object(external_CoreHome_["translate"])('UsersManager_ChangePermToSiteConfirmMultiple', "<strong>".concat(this.userLogin, "</strong>"), "<strong>".concat(this.affectedSitesCount, "</strong>"), "<strong>".concat(this.getRoleDisplay(this.roleToChangeTo), "</strong>")); + }, + changePermToAllSitesConfirmText: function changePermToAllSitesConfirmText() { + return Object(external_CoreHome_["translate"])('UsersManager_ChangePermToAllSitesConfirm', "<strong>".concat(this.userLogin, "</strong>"), "<strong>".concat(this.getRoleDisplay(this.allWebsitesAccssLevelSet), "</strong>")); + }, + paginationLowerBound: function paginationLowerBound() { + return this.offset + 1; + }, + paginationUpperBound: function paginationUpperBound() { + if (!this.totalEntries) { + return '?'; + } + + return Math.min(this.offset + this.limit, this.totalEntries); + }, + filteredAccessLevels: function filteredAccessLevels() { + return this.accessLevels.filter(function (entry) { + return entry.key !== 'superuser'; + }); + }, + filteredSelectAccessLevels: function filteredSelectAccessLevels() { + return this.filterAccessLevels.filter(function (entry) { + return entry.key !== 'superuser'; + }); + }, + selectedRowsCount: function selectedRowsCount() { + var selectedRowKeyCount = 0; + Object.values(this.selectedRows).forEach(function (v) { + if (v) { + selectedRowKeyCount += 1; + } + }); + return selectedRowKeyCount; + }, + affectedSitesCount: function affectedSitesCount() { + if (this.areAllResultsSelected) { + return this.totalEntries; + } + + return this.selectedRowsCount; + }, + allPropsWatch: function allPropsWatch() { + // see https://github.com/vuejs/vue/issues/844#issuecomment-390500758 + // eslint-disable-next-line no-sequences + return this.userLogin, this.limit, this.accessLevels, this.filterAccessLevels, Date.now(); + }, + siteAccessToChangeName: function siteAccessToChangeName() { + return this.siteAccessToChange ? external_CoreHome_["Matomo"].helper.htmlEntities(this.siteAccessToChange.site_name) : ''; + }, + paginationText: function paginationText() { + var text = Object(external_CoreHome_["translate"])('General_Pagination', "".concat(this.paginationLowerBound), "".concat(this.paginationUpperBound), "".concat(this.totalEntries)); + return " ".concat(text, " "); + } + } +})); +// CONCATENATED MODULE: ./plugins/UsersManager/vue/src/UserPermissionsEdit/UserPermissionsEdit.vue?vue&type=script&lang=ts + +// CONCATENATED MODULE: ./plugins/UsersManager/vue/src/UserPermissionsEdit/UserPermissionsEdit.vue + + + +UserPermissionsEditvue_type_script_lang_ts.render = UserPermissionsEditvue_type_template_id_b8ef996c_render + +/* harmony default export */ var UserPermissionsEdit = (UserPermissionsEditvue_type_script_lang_ts); +// CONCATENATED MODULE: ./plugins/UsersManager/vue/src/UserPermissionsEdit/UserPermissionsEdit.adapter.ts +/*! + * Matomo - free/libre analytics platform + * + * @link https://matomo.org + * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later + */ + + +/* harmony default export */ var UserPermissionsEdit_adapter = (Object(external_CoreHome_["createAngularJsAdapter"])({ + component: UserPermissionsEdit, + scope: { + userLogin: { + angularJsBind: '<' + }, + limit: { + angularJsBind: '<' + }, + onUserHasAccessDetected: { + angularJsBind: '&', + vue: 'userHasAccessDetected' + }, + onAccessChange: { + angularJsBind: '&', + vue: 'accessChanged' + }, + accessLevels: { + angularJsBind: '<' + }, + filterAccessLevels: { + angularJsBind: '<' + } + }, + directiveName: 'piwikUserPermissionsEdit', + restrict: 'E' +})); // CONCATENATED MODULE: ./plugins/UsersManager/vue/src/index.ts /*! * Matomo - free/libre analytics platform @@ -584,6 +1434,8 @@ CapabilitiesEditvue_type_script_lang_ts.render = render */ + + // CONCATENATED MODULE: ./node_modules/@vue/cli-service/lib/commands/build/entry-lib-no-default.js diff --git a/plugins/UsersManager/vue/dist/UsersManager.umd.min.js b/plugins/UsersManager/vue/dist/UsersManager.umd.min.js index 2a1f272e0c..64e638b725 100644 --- a/plugins/UsersManager/vue/dist/UsersManager.umd.min.js +++ b/plugins/UsersManager/vue/dist/UsersManager.umd.min.js @@ -1,14 +1,20 @@ -(function(e,i){"object"===typeof exports&&"object"===typeof module?module.exports=i(require("CoreHome"),require("vue"),require("CorePluginsAdmin")):"function"===typeof define&&define.amd?define(["CoreHome",,"CorePluginsAdmin"],i):"object"===typeof exports?exports["UsersManager"]=i(require("CoreHome"),require("vue"),require("CorePluginsAdmin")):e["UsersManager"]=i(e["CoreHome"],e["Vue"],e["CorePluginsAdmin"])})("undefined"!==typeof self?self:this,(function(e,i,t){return function(e){var i={};function t(a){if(i[a])return i[a].exports;var n=i[a]={i:a,l:!1,exports:{}};return e[a].call(n.exports,n,n.exports,t),n.l=!0,n.exports}return t.m=e,t.c=i,t.d=function(e,i,a){t.o(e,i)||Object.defineProperty(e,i,{enumerable:!0,get:a})},t.r=function(e){"undefined"!==typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},t.t=function(e,i){if(1&i&&(e=t(e)),8&i)return e;if(4&i&&"object"===typeof e&&e&&e.__esModule)return e;var a=Object.create(null);if(t.r(a),Object.defineProperty(a,"default",{enumerable:!0,value:e}),2&i&&"string"!=typeof e)for(var n in e)t.d(a,n,function(i){return e[i]}.bind(null,n));return a},t.n=function(e){var i=e&&e.__esModule?function(){return e["default"]}:function(){return e};return t.d(i,"a",i),i},t.o=function(e,i){return Object.prototype.hasOwnProperty.call(e,i)},t.p="plugins/UsersManager/vue/dist/",t(t.s="fae3")}({"19dc":function(i,t){i.exports=e},"8bbf":function(e,t){e.exports=i},a5a2:function(e,i){e.exports=t},fae3:function(e,i,t){"use strict";if(t.r(i),t.d(i,"CapabilitiesEdit",(function(){return B})),"undefined"!==typeof window){var a=window.document.currentScript,n=a&&a.src.match(/(.+\/)[^/]+\.js(\?.*)?$/);n&&(t.p=n[1])}var o=t("19dc"),l=t("8bbf"),r=["title"],s=["onClick"],c={key:0,class:"addCapability"},u={class:"ui-confirm confirmCapabilityToggle modal",ref:"confirmCapabilityToggleModal"},d={class:"modal-content"},p=["innerHTML"],b=["innerHTML"],f={class:"modal-footer"};function m(e,i,t,a,n,o){var m=Object(l["resolveComponent"])("Field");return Object(l["openBlock"])(),Object(l["createElementBlock"])("div",{class:Object(l["normalizeClass"])(["capabilitiesEdit",{busy:e.isBusy}])},[(Object(l["openBlock"])(!0),Object(l["createElementBlock"])(l["Fragment"],null,Object(l["renderList"])(e.actualCapabilities,(function(i){return Object(l["openBlock"])(),Object(l["createElementBlock"])("div",{key:i.id,class:"chip"},[Object(l["createElementVNode"])("span",{class:"capability-name",title:"".concat(i.description," ").concat(e.isIncludedInRole(i)?"<br/><br/>".concat(e.translate("UsersManager_IncludedInUsersRole")):"")},Object(l["toDisplayString"])(i.category)+": "+Object(l["toDisplayString"])(i.name),9,r),e.isIncludedInRole(i)?Object(l["createCommentVNode"])("",!0):(Object(l["openBlock"])(),Object(l["createElementBlock"])("span",{key:0,class:"icon-close",onClick:function(t){e.capabilityToRemoveId=i.id,e.onToggleCapability(!1)}},null,8,s))])})),128)),e.availableCapabilitiesGrouped.length?(Object(l["openBlock"])(),Object(l["createElementBlock"])("div",c,[Object(l["createVNode"])(m,{"model-value":e.capabilityToAddId,"onUpdate:modelValue":i[0]||(i[0]=function(i){e.capabilityToAddId=i,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(l["createCommentVNode"])("",!0),Object(l["createElementVNode"])("div",u,[Object(l["createElementVNode"])("div",d,[e.isAddingCapability?(Object(l["openBlock"])(),Object(l["createElementBlock"])("h2",{key:0,innerHTML:e.$sanitize(e.confirmAddCapabilityToggleContent)},null,8,p)):Object(l["createCommentVNode"])("",!0),e.isAddingCapability?Object(l["createCommentVNode"])("",!0):(Object(l["openBlock"])(),Object(l["createElementBlock"])("h2",{key:1,innerHTML:e.$sanitize(e.confirmCapabilityToggleContent)},null,8,b))]),Object(l["createElementVNode"])("div",f,[Object(l["createElementVNode"])("a",{href:"",class:"modal-action modal-close btn",onClick:i[1]||(i[1]=Object(l["withModifiers"])((function(i){return e.toggleCapability()}),["prevent"]))},Object(l["toDisplayString"])(e.translate("General_Yes")),1),Object(l["createElementVNode"])("a",{href:"",class:"modal-action modal-close modal-no",onClick:i[2]||(i[2]=Object(l["withModifiers"])((function(i){e.capabilityToAddOrRemove=null,e.capabilityToAddId=null,e.capabilityToRemoveId=null}),["prevent"]))},Object(l["toDisplayString"])(e.translate("General_No")),1)])],512)],2)}var g=t("a5a2");function h(e,i){if(!(e instanceof i))throw new TypeError("Cannot call a class as a function")}function y(e,i){for(var t=0;t<i.length;t++){var a=i[t];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(e,a.key,a)}}function v(e,i,t){return i&&y(e.prototype,i),t&&y(e,t),e}function C(e,i,t){return i in e?Object.defineProperty(e,i,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[i]=t,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,i){return function(e){var t={};function i(n){if(t[n])return t[n].exports;var s=t[n]={i:n,l:!1,exports:{}};return e[n].call(s.exports,s,s.exports,i),s.l=!0,s.exports}return i.m=e,i.c=t,i.d=function(e,t,n){i.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},i.r=function(e){"undefined"!==typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},i.t=function(e,t){if(1&t&&(e=i(e)),8&t)return e;if(4&t&&"object"===typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(i.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var s in e)i.d(n,s,function(t){return e[t]}.bind(null,s));return n},i.n=function(e){var t=e&&e.__esModule?function(){return e["default"]}:function(){return e};return i.d(t,"a",t),t},i.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},i.p="plugins/UsersManager/vue/dist/",i(i.s="fae3")}({"19dc":function(t,i){t.exports=e},"8bbf":function(e,i){e.exports=t},a5a2:function(e,t){e.exports=i},fae3:function(e,t,i){"use strict";if(i.r(t),i.d(t,"CapabilitiesEdit",(function(){return E})),i.d(t,"UserPermissionsEdit",(function(){return Pe})),"undefined"!==typeof window){var n=window.document.currentScript,s=n&&n.src.match(/(.+\/)[^/]+\.js(\?.*)?$/);s&&(i.p=s[1])}var c=i("19dc"),l=i("8bbf"),a=["title"],o=["onClick"],r={key:0,class:"addCapability"},d={class:"ui-confirm confirmCapabilityToggle modal",ref:"confirmCapabilityToggleModal"},u={class:"modal-content"},b=["innerHTML"],m=["innerHTML"],p={class:"modal-footer"};function h(e,t,i,n,s,c){var h=Object(l["resolveComponent"])("Field");return Object(l["openBlock"])(),Object(l["createElementBlock"])("div",{class:Object(l["normalizeClass"])(["capabilitiesEdit",{busy:e.isBusy}])},[(Object(l["openBlock"])(!0),Object(l["createElementBlock"])(l["Fragment"],null,Object(l["renderList"])(e.actualCapabilities,(function(t){return Object(l["openBlock"])(),Object(l["createElementBlock"])("div",{key:t.id,class:"chip"},[Object(l["createElementVNode"])("span",{class:"capability-name",title:"".concat(t.description," ").concat(e.isIncludedInRole(t)?"<br/><br/>".concat(e.translate("UsersManager_IncludedInUsersRole")):"")},Object(l["toDisplayString"])(t.category)+": "+Object(l["toDisplayString"])(t.name),9,a),e.isIncludedInRole(t)?Object(l["createCommentVNode"])("",!0):(Object(l["openBlock"])(),Object(l["createElementBlock"])("span",{key:0,class:"icon-close",onClick:function(i){e.capabilityToRemoveId=t.id,e.onToggleCapability(!1)}},null,8,o))])})),128)),e.availableCapabilitiesGrouped.length?(Object(l["openBlock"])(),Object(l["createElementBlock"])("div",r,[Object(l["createVNode"])(h,{"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(l["createCommentVNode"])("",!0),Object(l["createElementVNode"])("div",d,[Object(l["createElementVNode"])("div",u,[e.isAddingCapability?(Object(l["openBlock"])(),Object(l["createElementBlock"])("h2",{key:0,innerHTML:e.$sanitize(e.confirmAddCapabilityToggleContent)},null,8,b)):Object(l["createCommentVNode"])("",!0),e.isAddingCapability?Object(l["createCommentVNode"])("",!0):(Object(l["openBlock"])(),Object(l["createElementBlock"])("h2",{key:1,innerHTML:e.$sanitize(e.confirmCapabilityToggleContent)},null,8,m))]),Object(l["createElementVNode"])("div",p,[Object(l["createElementVNode"])("a",{href:"",class:"modal-action modal-close btn",onClick:t[1]||(t[1]=Object(l["withModifiers"])((function(t){return e.toggleCapability()}),["prevent"]))},Object(l["toDisplayString"])(e.translate("General_Yes")),1),Object(l["createElementVNode"])("a",{href:"",class:"modal-action modal-close modal-no",onClick:t[2]||(t[2]=Object(l["withModifiers"])((function(t){e.capabilityToAddOrRemove=null,e.capabilityToAddId=null,e.capabilityToRemoveId=null}),["prevent"]))},Object(l["toDisplayString"])(e.translate("General_No")),1)])],512)],2)}var f=i("a5a2");function g(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function O(e,t){for(var i=0;i<t.length;i++){var n=t[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function j(e,t,i){return t&&O(e.prototype,t),i&&O(e,i),e}function v(e,t,i){return t in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,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 O=function(){function e(){var i=this;h(this,e),C(this,"privateState",Object(l["reactive"])({isLoading:!1,capabilities:[]})),C(this,"state",Object(l["computed"])((function(){return Object(l["readonly"])(i.privateState)}))),C(this,"capabilities",Object(l["computed"])((function(){return i.state.value.capabilities}))),C(this,"isLoading",Object(l["computed"])((function(){return i.state.value.isLoading}))),C(this,"fetchPromise",void 0),this.fetchCapabilities()}return v(e,[{key:"fetchCapabilities",value:function(){var e=this;return this.fetchPromise||(this.privateState.isLoading=!0,this.fetchPromise=o["AjaxHelper"].fetch({method:"UsersManager.getAvailableCapabilities"}).then((function(i){return e.privateState.capabilities=i,e.capabilities.value})).finally((function(){e.privateState.isLoading=!1}))),this.fetchPromise}}]),e}(),j=Object(o["lazyInitSingleton"])(O),T=window,A=T.$,R=Object(l["defineComponent"])({props:{idsite:[String,Number],siteName:{type:String,required:!0},userLogin:{type:String,required:!0},userRole:{type:String,required:!0},capabilities:Array},components:{Field:g["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;this.capabilities?this.theCapabilities=this.capabilities:(this.isBusy=!0,o["AjaxHelper"].fetch({method:"UsersManager.getUsersPlusRole",limit:"1",filter_search:this.userLogin}).then((function(e){return e&&e.capabilities?e.capabilities:[]})).then((function(i){e.theCapabilities=i})).finally((function(){e.isBusy=!1})))},methods:{onToggleCapability:function(e){var i=this;this.isAddingCapability=e;var t=e?this.capabilityToAddId:this.capabilityToRemoveId;this.capabilityToAddOrRemove=null,this.availableCapabilities.forEach((function(e){e.id===t&&(i.capabilityToAddOrRemove=e)})),this.$refs.confirmCapabilityToggleModal&&A(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,i=[];return this.availableCapabilities.forEach((function(t){e.isIncludedInRole(t)||e.capabilitiesSet[t.id]&&i.push(t.id)})),i},addCapability:function(e){var i=this;this.isBusy=!0,o["AjaxHelper"].post({method:"UsersManager.addCapabilities"},{userLogin:this.userLogin,capabilities:e.id,idSites:this.idsite}).then((function(){i.$emit("change",i.getCapabilitiesList())})).finally((function(){i.isBusy=!1,i.capabilityToAddOrRemove=null,i.capabilityToAddId=null,i.capabilityToRemoveId=null}))},removeCapability:function(e){var i=this;this.isBusy=!0,o["AjaxHelper"].post({method:"UsersManager.removeCapabilities"},{userLogin:this.userLogin,capabilities:e.id,idSites:this.idsite}).then((function(){i.$emit("change",i.getCapabilitiesList())})).finally((function(){i.isBusy=!1,i.capabilityToAddOrRemove=null,i.capabilityToAddId=null,i.capabilityToRemoveId=null}))}},computed:{availableCapabilities:function(){return j.capabilities.value},confirmAddCapabilityToggleContent:function(){return Object(o["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(o["translate"])("UsersManager_AreYouSureRemoveCapability","<strong>".concat(this.capabilityToAddOrRemove?this.capabilityToAddOrRemove.name:"","</strong>"),"<strong>".concat(this.userLogin,"</strong>"),"<strong>".concat(this.siteNameText,"</strong>"))},siteNameText:function(){return o["Matomo"].helper.htmlEntities(this.siteName)},availableCapabilitiesGrouped:function(){var e=this,i=this.availableCapabilities.filter((function(i){return!e.capabilitiesSet[i.id]})).map((function(e){return{group:e.category,key:e.id,value:e.name,tooltip:e.description}}));return i.sort((function(e,i){return e.group===i.group?e.value===i.value?0:e.value<i.value?-1:1:e.group<i.group?-1:1})),i},capabilitiesSet:function(){var e=this,i={},t=this.theCapabilities;return(t||[]).forEach((function(e){i[e]=!0})),(this.availableCapabilities||[]).forEach((function(t){e.isIncludedInRole(t)&&(i[t.id]=!0)})),i},actualCapabilities:function(){var e=this.capabilitiesSet;return this.availableCapabilities.filter((function(i){return!!e[i.id]}))}}});R.render=m;var B=R; + */var C=function(){function e(){var t=this;g(this,e),v(this,"privateState",Object(l["reactive"])({isLoading:!1,capabilities:[]})),v(this,"state",Object(l["computed"])((function(){return Object(l["readonly"])(t.privateState)}))),v(this,"capabilities",Object(l["computed"])((function(){return t.state.value.capabilities}))),v(this,"isLoading",Object(l["computed"])((function(){return t.state.value.isLoading}))),v(this,"fetchPromise",void 0),this.fetchCapabilities()}return j(e,[{key:"fetchCapabilities",value:function(){var e=this;return this.fetchPromise||(this.privateState.isLoading=!0,this.fetchPromise=c["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}(),A=Object(c["lazyInitSingleton"])(C),y=window,T=y.$,N=Object(l["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;this.capabilities?this.theCapabilities=this.capabilities:(this.isBusy=!0,c["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 i=e?this.capabilityToAddId:this.capabilityToRemoveId;this.capabilityToAddOrRemove=null,this.availableCapabilities.forEach((function(e){e.id===i&&(t.capabilityToAddOrRemove=e)})),this.$refs.confirmCapabilityToggleModal&&T(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(i){e.isIncludedInRole(i)||e.capabilitiesSet[i.id]&&t.push(i.id)})),t},addCapability:function(e){var t=this;this.isBusy=!0,c["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,c["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 A.capabilities.value},confirmAddCapabilityToggleContent:function(){return Object(c["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(c["translate"])("UsersManager_AreYouSureRemoveCapability","<strong>".concat(this.capabilityToAddOrRemove?this.capabilityToAddOrRemove.name:"","</strong>"),"<strong>".concat(this.userLogin,"</strong>"),"<strong>".concat(this.siteNameText,"</strong>"))},siteNameText:function(){return c["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={},i=this.theCapabilities;return(i||[]).forEach((function(e){t[e]=!0})),(this.availableCapabilities||[]).forEach((function(i){e.isIncludedInRole(i)&&(t[i.id]=!0)})),t},actualCapabilities:function(){var e=this.capabilitiesSet;return this.availableCapabilities.filter((function(t){return!!e[t.id]}))}}});N.render=h;var E=N,S=(Object(c["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,i,n,s,c,l){l((function(){i.onCapabilitiesChange&&i.onCapabilitiesChange.call({capabilities:e})}))}}}),{key:0,class:"row"}),k={class:"row to-all-websites"},V={class:"col s12"},M={style:{"margin-right":"3.5px"}},L={id:"all-sites-access-select",style:{"margin-right":"3.5px"}},x=Object(l["createElementVNode"])("p",null," ",-1),w={class:"filters row"},B={class:"col s12 m12 l8"},R={class:"input-field bulk-actions",style:{"margin-right":"3.5px"}},_={id:"user-permissions-edit-bulk-actions",class:"dropdown-content"},H={class:"dropdown-trigger","data-target":"user-permissions-bulk-set-access"},D={id:"user-permissions-bulk-set-access",class:"dropdown-content"},U=["onClick"],P={class:"input-field site-filter",style:{"margin-right":"3.5px"}},F=["value","placeholder"],I={class:"input-field access-filter",style:{"margin-right":"3.5px"}},$={key:0,class:"col s12 m12 l4 sites-for-permission-pagination-container"},G={class:"sites-for-permission-pagination"},z={class:"counter"},W=["textContent"],q={class:"roles-help-notification"},J=["innerHTML"],Y={class:"capabilities-help-notification"},K={id:"sitesForPermission"},Q={class:"select-cell"},X={class:"checkbox-container"},Z=["checked"],ee=Object(l["createElementVNode"])("span",null,null,-1),te={class:"role_header"},ie=["innerHTML"],ne=Object(l["createElementVNode"])("span",{class:"icon-help"},null,-1),se=[ne],ce={class:"capabilities_header"},le=["innerHTML"],ae=Object(l["createElementVNode"])("span",{class:"icon-help"},null,-1),oe=[ae],re={key:0,class:"select-all-row"},de={colspan:"4"},ue={key:0},be=["innerHTML"],me=["innerHTML"],pe={key:1},he=["innerHTML"],fe=["innerHTML"],ge={class:"select-cell"},Oe={class:"checkbox-container"},je=["id","onUpdate:modelValue"],ve=Object(l["createElementVNode"])("span",null,null,-1),Ce={class:"role-select"},Ae={class:"delete-access-confirm-modal modal",ref:"deleteAccessConfirmModal"},ye={class:"modal-content"},Te=["innerHTML"],Ne=["innerHTML"],Ee={class:"modal-footer"},Se={class:"change-access-confirm-modal modal",ref:"changeAccessConfirmModal"},ke={class:"modal-content"},Ve=["innerHTML"],Me=["innerHTML"],Le={class:"modal-footer"},xe={class:"confirm-give-access-all-sites modal",ref:"confirmGiveAccessAllSitesModal"},we={class:"modal-content"},Be=["innerHTML"],Re={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(o["createAngularJsAdapter"])({component:B,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,i,t,a,n,o,l){l((function(){t.onCapabilitiesChange&&t.onCapabilitiesChange.call({capabilities:e})}))}}})}})})); + */function _e(e,t,i,n,s,c){var a=Object(l["resolveComponent"])("Notification"),o=Object(l["resolveComponent"])("Field"),r=Object(l["resolveComponent"])("CapabilitiesEdit"),d=Object(l["resolveDirective"])("dropdown-menu"),u=Object(l["resolveDirective"])("content-table");return Object(l["openBlock"])(),Object(l["createElementBlock"])("div",{class:Object(l["normalizeClass"])(["userPermissionsEdit",{loading:e.isLoadingAccess}])},[e.hasAccessToAtLeastOneSite?Object(l["createCommentVNode"])("",!0):(Object(l["openBlock"])(),Object(l["createElementBlock"])("div",S,[Object(l["createElementVNode"])("div",null,[Object(l["createVNode"])(a,{context:"warning",type:"transient",noclear:!0},{default:Object(l["withCtx"])((function(){return[Object(l["createElementVNode"])("strong",null,Object(l["toDisplayString"])(e.translate("General_Warning"))+":",1),Object(l["createTextVNode"])(" "+Object(l["toDisplayString"])(e.translate("UsersManager_NoAccessWarning")),1)]})),_:1})])])),Object(l["createElementVNode"])("div",k,[Object(l["createElementVNode"])("div",V,[Object(l["createElementVNode"])("div",null,[Object(l["createElementVNode"])("span",M,Object(l["toDisplayString"])(e.translate("UsersManager_GiveAccessToAll"))+":",1),Object(l["createElementVNode"])("div",L,[Object(l["createVNode"])(o,{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(l["createElementVNode"])("a",{href:"",class:Object(l["normalizeClass"])(["btn",{disabled:e.isGivingAccessToAllSites}]),onClick:t[1]||(t[1]=Object(l["withModifiers"])((function(t){return e.showChangeAccessAllSitesModal()}),["prevent"]))},Object(l["toDisplayString"])(e.translate("General_Apply")),3)]),x,Object(l["createElementVNode"])("p",null,Object(l["toDisplayString"])(e.translate("UsersManager_OrManageIndividually"))+":",1)])]),Object(l["createElementVNode"])("div",w,[Object(l["createElementVNode"])("div",B,[Object(l["createElementVNode"])("div",R,[Object(l["withDirectives"])(Object(l["createElementVNode"])("a",{class:Object(l["normalizeClass"])(["dropdown-trigger btn",{disabled:e.isBulkActionsDisabled}]),href:"","data-target":"user-permissions-edit-bulk-actions"},[Object(l["createTextVNode"])(Object(l["toDisplayString"])(e.translate("UsersManager_BulkActions")),1)],2),[[d,{activates:"#user-permissions-edit-bulk-actions"}]]),Object(l["createElementVNode"])("ul",_,[Object(l["createElementVNode"])("li",null,[Object(l["withDirectives"])(Object(l["createElementVNode"])("a",H,[Object(l["createTextVNode"])(Object(l["toDisplayString"])(e.translate("UsersManager_SetPermission")),1)],512),[[d,{activates:"#user-permissions-bulk-set-access"}]]),Object(l["createElementVNode"])("ul",D,[(Object(l["openBlock"])(!0),Object(l["createElementBlock"])(l["Fragment"],null,Object(l["renderList"])(e.filteredAccessLevels,(function(t){return Object(l["openBlock"])(),Object(l["createElementBlock"])("li",{key:t.key},[Object(l["createElementVNode"])("a",{href:"",onClick:Object(l["withModifiers"])((function(i){e.siteAccessToChange=null,e.roleToChangeTo=t.key,e.showChangeAccessConfirm()}),["prevent"])},Object(l["toDisplayString"])(t.value),9,U)])})),128))])]),Object(l["createElementVNode"])("li",null,[Object(l["createElementVNode"])("a",{href:"",onClick:t[2]||(t[2]=Object(l["withModifiers"])((function(t){e.siteAccessToChange=null,e.roleToChangeTo="noaccess",e.showRemoveAccessConfirm()}),["prevent"]))},Object(l["toDisplayString"])(e.translate("UsersManager_RemovePermissions")),1)])])]),Object(l["createElementVNode"])("div",P,[Object(l["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,F)]),Object(l["createElementVNode"])("div",I,[Object(l["createElementVNode"])("div",null,[Object(l["createVNode"])(o,{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(l["openBlock"])(),Object(l["createElementBlock"])("div",$,[Object(l["createElementVNode"])("div",G,[Object(l["createElementVNode"])("a",{class:Object(l["normalizeClass"])(["prev",{disabled:e.offset<=0}])},[Object(l["createElementVNode"])("span",{class:"pointer",onClick:t[6]||(t[6]=function(t){return e.gotoPreviousPage()})},"« "+Object(l["toDisplayString"])(e.translate("General_Previous")),1)],2),Object(l["createElementVNode"])("span",z,[Object(l["createElementVNode"])("span",{textContent:Object(l["toDisplayString"])(e.paginationText)},null,8,W)]),Object(l["createElementVNode"])("a",{class:Object(l["normalizeClass"])(["next",{disabled:e.offset+e.limit>=e.totalEntries}])},[Object(l["createElementVNode"])("span",{class:"pointer",onClick:t[7]||(t[7]=function(t){return e.gotoNextPage()})},Object(l["toDisplayString"])(e.translate("General_Next"))+" »",1)],2)])])):Object(l["createCommentVNode"])("",!0)]),Object(l["createElementVNode"])("div",q,[e.isRoleHelpToggled?(Object(l["openBlock"])(),Object(l["createBlock"])(a,{key:0,context:"info",type:"persistent",noclear:!0},{default:Object(l["withCtx"])((function(){return[Object(l["createElementVNode"])("span",{innerHTML:e.$sanitize(e.rolesHelpText)},null,8,J)]})),_:1})):Object(l["createCommentVNode"])("",!0)]),Object(l["createElementVNode"])("div",Y,[e.isCapabilitiesHelpToggled?(Object(l["openBlock"])(),Object(l["createBlock"])(a,{key:0,context:"info",type:"persistent",noclear:!0},{default:Object(l["withCtx"])((function(){return[Object(l["createElementVNode"])("span",null,Object(l["toDisplayString"])(e.translate("UsersManager_CapabilitiesHelp")),1)]})),_:1})):Object(l["createCommentVNode"])("",!0)]),Object(l["withDirectives"])(Object(l["createElementVNode"])("table",K,[Object(l["createElementVNode"])("thead",null,[Object(l["createElementVNode"])("tr",null,[Object(l["createElementVNode"])("th",Q,[Object(l["createElementVNode"])("span",X,[Object(l["createElementVNode"])("label",null,[Object(l["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,Z),ee])])]),Object(l["createElementVNode"])("th",null,Object(l["toDisplayString"])(e.translate("General_Name")),1),Object(l["createElementVNode"])("th",te,[Object(l["createElementVNode"])("span",{innerHTML:"".concat(e.translate("UsersManager_Role")," ")},null,8,ie),Object(l["createElementVNode"])("a",{href:"",class:Object(l["normalizeClass"])(["helpIcon",{sticky:e.isRoleHelpToggled}]),onClick:t[9]||(t[9]=Object(l["withModifiers"])((function(t){return e.isRoleHelpToggled=!e.isRoleHelpToggled}),["prevent"]))},se,2)]),Object(l["createElementVNode"])("th",ce,[Object(l["createElementVNode"])("span",{innerHTML:"".concat(e.translate("UsersManager_Capabilities")," ")},null,8,le),Object(l["createElementVNode"])("a",{href:"",class:Object(l["normalizeClass"])(["helpIcon",{sticky:e.isCapabilitiesHelpToggled}]),onClick:t[10]||(t[10]=Object(l["withModifiers"])((function(t){return e.isCapabilitiesHelpToggled=!e.isCapabilitiesHelpToggled}),["prevent"]))},oe,2)])])]),Object(l["createElementVNode"])("tbody",null,[e.isAllCheckboxSelected&&e.siteAccess.length<e.totalEntries?(Object(l["openBlock"])(),Object(l["createElementBlock"])("tr",re,[Object(l["createElementVNode"])("td",de,[e.areAllResultsSelected?Object(l["createCommentVNode"])("",!0):(Object(l["openBlock"])(),Object(l["createElementBlock"])("div",ue,[Object(l["createElementVNode"])("span",{innerHTML:e.$sanitize(e.theDisplayedWebsitesAreSelectedText),style:{"margin-right":"3.5px"}},null,8,be),Object(l["createElementVNode"])("a",{href:"#",onClick:t[11]||(t[11]=Object(l["withModifiers"])((function(t){return e.areAllResultsSelected=!e.areAllResultsSelected}),["prevent"])),innerHTML:e.$sanitize(e.clickToSelectAllText)},null,8,me)])),e.areAllResultsSelected?(Object(l["openBlock"])(),Object(l["createElementBlock"])("div",pe,[Object(l["createElementVNode"])("span",{innerHTML:e.$sanitize(e.allWebsitesAreSelectedText),style:{"margin-right":"3.5px"}},null,8,he),Object(l["createElementVNode"])("a",{href:"#",onClick:t[12]||(t[12]=Object(l["withModifiers"])((function(t){return e.areAllResultsSelected=!e.areAllResultsSelected}),["prevent"])),innerHTML:e.$sanitize(e.clickToSelectDisplayedWebsitesText)},null,8,fe)])):Object(l["createCommentVNode"])("",!0)])])):Object(l["createCommentVNode"])("",!0),(Object(l["openBlock"])(!0),Object(l["createElementBlock"])(l["Fragment"],null,Object(l["renderList"])(e.siteAccess,(function(i,n){return Object(l["openBlock"])(),Object(l["createElementBlock"])("tr",{key:i.idsite},[Object(l["createElementVNode"])("td",ge,[Object(l["createElementVNode"])("span",Oe,[Object(l["createElementVNode"])("label",null,[Object(l["withDirectives"])(Object(l["createElementVNode"])("input",{type:"checkbox",id:"perm_edit_select_row".concat(n),"onUpdate:modelValue":function(t){return e.selectedRows[n]=t},onClick:t[13]||(t[13]=function(t){return e.onRowSelected()})},null,8,je),[[l["vModelCheckbox"],e.selectedRows[n]]]),ve])])]),Object(l["createElementVNode"])("td",null,[Object(l["createElementVNode"])("span",null,Object(l["toDisplayString"])(i.site_name),1)]),Object(l["createElementVNode"])("td",null,[Object(l["createElementVNode"])("div",Ce,[Object(l["createVNode"])(o,{"model-value":i.role,"onUpdate:modelValue":function(t){e.onRoleChange(i,t)},uicontrol:"select",options:e.filteredAccessLevels,"full-width":!0},null,8,["model-value","onUpdate:modelValue","options"])])]),Object(l["createElementVNode"])("td",null,[Object(l["createElementVNode"])("div",null,[Object(l["createVNode"])(r,{idsite:i.idsite,"site-name":i.site_name,"user-login":e.userLogin,"user-role":i.role,capabilities:i.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(l["createElementVNode"])("div",Ae,[Object(l["createElementVNode"])("div",ye,[e.siteAccessToChange?(Object(l["openBlock"])(),Object(l["createElementBlock"])("h3",{key:0,innerHTML:e.$sanitize(e.deletePermConfirmSingleText)},null,8,Te)):Object(l["createCommentVNode"])("",!0),e.siteAccessToChange?Object(l["createCommentVNode"])("",!0):(Object(l["openBlock"])(),Object(l["createElementBlock"])("p",{key:1,innerHTML:e.$sanitize(e.deletePermConfirmMultipleText)},null,8,Ne))]),Object(l["createElementVNode"])("div",Ee,[Object(l["createElementVNode"])("a",{href:"",class:"modal-action modal-close btn",onClick:t[15]||(t[15]=Object(l["withModifiers"])((function(t){return e.changeUserRole()}),["prevent"]))},Object(l["toDisplayString"])(e.translate("General_Yes")),1),Object(l["createElementVNode"])("a",{href:"",class:"modal-action modal-close modal-no",onClick:t[16]||(t[16]=Object(l["withModifiers"])((function(t){e.siteAccessToChange=null,e.roleToChangeTo=null}),["prevent"]))},Object(l["toDisplayString"])(e.translate("General_No")),1)])],512),Object(l["createElementVNode"])("div",Se,[Object(l["createElementVNode"])("div",ke,[e.siteAccessToChange?(Object(l["openBlock"])(),Object(l["createElementBlock"])("h3",{key:0,innerHTML:e.$sanitize(e.changePermToSiteConfirmSingleText)},null,8,Ve)):Object(l["createCommentVNode"])("",!0),e.siteAccessToChange?Object(l["createCommentVNode"])("",!0):(Object(l["openBlock"])(),Object(l["createElementBlock"])("p",{key:1,innerHTML:e.$sanitize(e.changePermToSiteConfirmMultipleText)},null,8,Me))]),Object(l["createElementVNode"])("div",Le,[Object(l["createElementVNode"])("a",{href:"",class:"modal-action modal-close btn",onClick:t[17]||(t[17]=Object(l["withModifiers"])((function(t){return e.changeUserRole()}),["prevent"]))},Object(l["toDisplayString"])(e.translate("General_Yes")),1),Object(l["createElementVNode"])("a",{href:"",class:"modal-action modal-close modal-no",onClick:t[18]||(t[18]=Object(l["withModifiers"])((function(t){e.siteAccessToChange.role=e.previousRole,e.siteAccessToChange=null,e.roleToChangeTo=null}),["prevent"]))},Object(l["toDisplayString"])(e.translate("General_No")),1)])],512),Object(l["createElementVNode"])("div",xe,[Object(l["createElementVNode"])("div",we,[Object(l["createElementVNode"])("h3",{innerHTML:e.$sanitize(e.changePermToAllSitesConfirmText)},null,8,Be),Object(l["createElementVNode"])("p",null,Object(l["toDisplayString"])(e.translate("UsersManager_ChangePermToAllSitesConfirm2")),1)]),Object(l["createElementVNode"])("div",Re,[Object(l["createElementVNode"])("a",{href:"",class:"modal-action modal-close btn",onClick:t[19]||(t[19]=Object(l["withModifiers"])((function(t){return e.giveAccessToAllSites()}),["prevent"]))},Object(l["toDisplayString"])(e.translate("General_Yes")),1),Object(l["createElementVNode"])("a",{href:"",class:"modal-action modal-close modal-no",onClick:t[20]||(t[20]=function(e){return e.preventDefault()})},Object(l["toDisplayString"])(e.translate("General_No")),1)])],512)],2)}var He=window,De=He.$,Ue=Object(l["defineComponent"])({props:{userLogin:{type:String,required:!0},limit:{type:Number,default:10},accessLevels:{type:Array,required:!0},filterAccessLevels:{type:Array,required:!0}},components:{Notification:c["Notification"],Field:f["Field"],CapabilitiesEdit:E},directives:{DropdownMenu:c["DropdownMenu"],ContentTable:c["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(c["debounce"])(this.onChangeSiteFilter,300),Object(l["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,i){t.selectedRows[i]=!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,c["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 i=t.getRequestHandle();e.isLoadingAccess=!1,e.siteAccess=i.responseJSON,e.totalEntries=parseInt(i.getResponseHeader("x-matomo-total-results"),10)||0,e.hasAccessToAtLeastOneSite=!!i.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(){De(this.$refs.deleteAccessConfirmModal).modal({dismissible:!1}).modal("open")},changeUserRole:function(){var e=this,t=function(){var t=[];return Object.keys(e.selectedRows).forEach((function(i){e.selectedRows[i]&&e.siteAccess[i]&&t.push(e.siteAccess[i].idsite)})),t},i=function(){return c["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?i():t()})).then((function(t){return c["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(){De(this.$refs.changeAccessConfirmModal).modal({dismissible:!1}).modal("open")},getRoleDisplay:function(e){var t=null;return this.filteredAccessLevels.forEach((function(i){i.key===e&&(t=i.value)})),t},giveAccessToAllSites:function(){var e=this;this.isGivingAccessToAllSites=!0,c["AjaxHelper"].fetch({method:"SitesManager.getSitesWithAdminAccess"}).then((function(t){var i=t.map((function(e){return e.idsite}));return c["AjaxHelper"].post({method:"UsersManager.setUserAccess"},{userLogin:e.userLogin,access:e.allWebsitesAccssLevelSet,idSites:i})})).then((function(){return e.fetchAccess()})).finally((function(){e.isGivingAccessToAllSites=!1}))},showChangeAccessAllSitesModal:function(){De(this.$refs.confirmGiveAccessAllSitesModal).modal({dismissible:!1}).modal("open")},onChangeSiteFilter:function(e){var t=this;setTimeout((function(){var i=e.target.value;t.siteNameFilter!==i&&(t.siteNameFilter=i,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(c["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(c["translate"])("UsersManager_TheDisplayedWebsitesAreSelected","<strong>".concat(this.siteAccess.length,"</strong>"));return"".concat(e," ")},clickToSelectAllText:function(){return Object(c["translate"])("UsersManager_ClickToSelectAll","<strong>".concat(this.totalEntries,"</strong>"))},allWebsitesAreSelectedText:function(){return Object(c["translate"])("UsersManager_AllWebsitesAreSelected","<strong>".concat(this.totalEntries,"</strong>"))},clickToSelectDisplayedWebsitesText:function(){return Object(c["translate"])("UsersManager_ClickToSelectDisplayedWebsites","<strong>".concat(this.siteAccess.length,"</strong>"))},deletePermConfirmSingleText:function(){return Object(c["translate"])("UsersManager_DeletePermConfirmSingle","<strong>".concat(this.userLogin,"</strong>"),"<strong>".concat(this.siteAccessToChangeName,"</strong>"))},deletePermConfirmMultipleText:function(){return Object(c["translate"])("UsersManager_DeletePermConfirmMultiple","<strong>".concat(this.userLogin,"</strong>"),"<strong>".concat(this.affectedSitesCount,"</strong>"))},changePermToSiteConfirmSingleText:function(){return Object(c["translate"])("UsersManager_ChangePermToSiteConfirmSingle","<strong>".concat(this.userLogin,"</strong>"),"<strong>".concat(this.siteAccessToChangeName,"</strong>"),"<strong>".concat(this.getRoleDisplay(this.roleToChangeTo),"</strong>"))},changePermToSiteConfirmMultipleText:function(){return Object(c["translate"])("UsersManager_ChangePermToSiteConfirmMultiple","<strong>".concat(this.userLogin,"</strong>"),"<strong>".concat(this.affectedSitesCount,"</strong>"),"<strong>".concat(this.getRoleDisplay(this.roleToChangeTo),"</strong>"))},changePermToAllSitesConfirmText:function(){return Object(c["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?c["Matomo"].helper.htmlEntities(this.siteAccessToChange.site_name):""},paginationText:function(){var e=Object(c["translate"])("General_Pagination","".concat(this.paginationLowerBound),"".concat(this.paginationUpperBound),"".concat(this.totalEntries));return" ".concat(e," ")}}});Ue.render=_e;var Pe=Ue; +/*! + * Matomo - free/libre analytics platform + * + * @link https://matomo.org + * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later + */Object(c["createAngularJsAdapter"])({component:Pe,scope:{userLogin:{angularJsBind:"<"},limit:{angularJsBind:"<"},onUserHasAccessDetected:{angularJsBind:"&",vue:"userHasAccessDetected"},onAccessChange:{angularJsBind:"&",vue:"accessChanged"},accessLevels:{angularJsBind:"<"},filterAccessLevels:{angularJsBind:"<"}},directiveName:"piwikUserPermissionsEdit",restrict:"E"})}})})); //# sourceMappingURL=UsersManager.umd.min.js.map
\ No newline at end of file diff --git a/plugins/UsersManager/vue/src/UserPermissionsEdit/UserPermissionsEdit.adapter.ts b/plugins/UsersManager/vue/src/UserPermissionsEdit/UserPermissionsEdit.adapter.ts new file mode 100644 index 0000000000..c4599b80b6 --- /dev/null +++ b/plugins/UsersManager/vue/src/UserPermissionsEdit/UserPermissionsEdit.adapter.ts @@ -0,0 +1,37 @@ +/*! + * Matomo - free/libre analytics platform + * + * @link https://matomo.org + * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later + */ + +import { createAngularJsAdapter } from 'CoreHome'; +import UserPermissionsEdit from './UserPermissionsEdit.vue'; + +export default createAngularJsAdapter({ + component: UserPermissionsEdit, + scope: { + userLogin: { + angularJsBind: '<', + }, + limit: { + angularJsBind: '<', + }, + onUserHasAccessDetected: { + angularJsBind: '&', + vue: 'userHasAccessDetected', + }, + onAccessChange: { + angularJsBind: '&', + vue: 'accessChanged', + }, + accessLevels: { + angularJsBind: '<', + }, + filterAccessLevels: { + angularJsBind: '<', + }, + }, + directiveName: 'piwikUserPermissionsEdit', + restrict: 'E', +}); diff --git a/plugins/UsersManager/angularjs/user-permissions-edit/user-permissions-edit.component.less b/plugins/UsersManager/vue/src/UserPermissionsEdit/UserPermissionsEdit.less index 16760f4ade..16760f4ade 100644 --- a/plugins/UsersManager/angularjs/user-permissions-edit/user-permissions-edit.component.less +++ b/plugins/UsersManager/vue/src/UserPermissionsEdit/UserPermissionsEdit.less diff --git a/plugins/UsersManager/vue/src/UserPermissionsEdit/UserPermissionsEdit.vue b/plugins/UsersManager/vue/src/UserPermissionsEdit/UserPermissionsEdit.vue new file mode 100644 index 0000000000..7dc293186d --- /dev/null +++ b/plugins/UsersManager/vue/src/UserPermissionsEdit/UserPermissionsEdit.vue @@ -0,0 +1,798 @@ +<!-- + Matomo - free/libre analytics platform + @link https://matomo.org + @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later +--> + +<template> + <div + class="userPermissionsEdit" + :class="{ loading: isLoadingAccess }" + > + <div + class="row" + v-if="!hasAccessToAtLeastOneSite" + > + <div> + <Notification + context="warning" + type="transient" + :noclear="true" + > + <strong>{{ translate('General_Warning') }}:</strong> + {{ translate('UsersManager_NoAccessWarning') }} + </Notification> + </div> + </div> + <div class="row to-all-websites"> + <div class="col s12"> + <div> + <span style="margin-right:3.5px">{{ translate('UsersManager_GiveAccessToAll') }}:</span> + <div + id="all-sites-access-select" + style="margin-right:3.5px" + > + <Field + v-model="allWebsitesAccssLevelSet" + uicontrol="select" + :options="filteredAccessLevels" + :full-width="true" + /> + </div> + <a + href="" + class="btn" + :class="{ disabled: isGivingAccessToAllSites }" + @click.prevent="showChangeAccessAllSitesModal()" + > + {{ translate('General_Apply') }} + </a> + </div> + <p> </p> + <p>{{ translate('UsersManager_OrManageIndividually') }}:</p> + </div> + </div> + <div class="filters row"> + <div class="col s12 m12 l8"> + <div class="input-field bulk-actions" style="margin-right:3.5px"> + <a + class="dropdown-trigger btn" + href="" + :class="{ disabled: isBulkActionsDisabled }" + data-target="user-permissions-edit-bulk-actions" + v-dropdown-menu="{ activates: '#user-permissions-edit-bulk-actions' }" + > + {{ translate('UsersManager_BulkActions') }} + </a> + <ul + id="user-permissions-edit-bulk-actions" + class="dropdown-content" + > + <li> + <a + class="dropdown-trigger" + data-target="user-permissions-bulk-set-access" + v-dropdown-menu="{ activates: '#user-permissions-bulk-set-access' }" + >{{ translate('UsersManager_SetPermission') }}</a> + <ul + id="user-permissions-bulk-set-access" + class="dropdown-content" + > + <li v-for="access in filteredAccessLevels" :key="access.key"> + <a + href="" + @click.prevent=" + siteAccessToChange = null; + roleToChangeTo = access.key; + showChangeAccessConfirm();" + >{{ access.value }}</a> + </li> + </ul> + </li> + <li> + <a + href="" + @click.prevent=" + siteAccessToChange = null; + roleToChangeTo = 'noaccess'; + showRemoveAccessConfirm();" + >{{ translate('UsersManager_RemovePermissions') }}</a> + </li> + </ul> + </div> + <div class="input-field site-filter" style="margin-right:3.5px"> + <input + type="text" + :value="siteNameFilter" + @keydown="onChangeSiteFilter($event);" + @change="onChangeSiteFilter($event);" + :placeholder="translate('UsersManager_FilterByWebsite')" + /> + </div> + <div class="input-field access-filter" style="margin-right:3.5px"> + <div> + <Field + v-model="accessLevelFilter" + uicontrol="select" + :options="filteredSelectAccessLevels" + :full-width="true" + :placeholder="translate('UsersManager_FilterByAccess')" + /> + </div> + </div> + </div> + <div + class="col s12 m12 l4 sites-for-permission-pagination-container" + v-if="totalEntries > limit" + > + <div class="sites-for-permission-pagination"> + <a + class="prev" + :class="{ disabled: offset <= 0 }" + > + <span + class="pointer" + @click="gotoPreviousPage()" + >« {{ translate('General_Previous') }}</span> + </a> + <span class="counter"> + <span v-text="paginationText"></span> + </span> + <a + class="next" + :class="{ disabled: offset + limit >= totalEntries }" + > + <span + class="pointer" + @click="gotoNextPage()" + >{{ translate('General_Next') }} »</span> + </a> + </div> + </div> + </div> + <div + class="roles-help-notification" + > + <Notification + v-if="isRoleHelpToggled" + context="info" + type="persistent" + :noclear="true" + > + <span v-html="$sanitize(rolesHelpText)"></span> + </Notification> + </div> + <div + class="capabilities-help-notification" + > + <Notification + v-if="isCapabilitiesHelpToggled" + context="info" + type="persistent" + :noclear="true" + > + <span> + {{ translate('UsersManager_CapabilitiesHelp') }} + </span> + </Notification> + </div> + <table + id="sitesForPermission" + v-content-table + > + <thead> + <tr> + <th class="select-cell"> + <span class="checkbox-container"> + <label> + <input + type="checkbox" + id="perm_edit_select_all" + :checked="isAllCheckboxSelected" + @change="onAllCheckboxChange($event)" + /> + <span /> + </label> + </span> + </th> + <th>{{ translate('General_Name') }}</th> + <th class="role_header"> + <span v-html="`${translate('UsersManager_Role')} `"></span> + <a + href="" + class="helpIcon" + @click.prevent="isRoleHelpToggled = !isRoleHelpToggled" + :class="{ sticky: isRoleHelpToggled }" + > + <span class="icon-help" /> + </a> + </th> + <th class="capabilities_header"> + <span v-html="`${translate('UsersManager_Capabilities')} `"></span> + <a + href="" + class="helpIcon" + @click.prevent="isCapabilitiesHelpToggled = !isCapabilitiesHelpToggled" + :class="{ sticky: isCapabilitiesHelpToggled }" + > + <span class="icon-help" /> + </a> + </th> + </tr> + </thead> + <tbody> + <tr + class="select-all-row" + v-if="isAllCheckboxSelected && siteAccess.length < totalEntries" + > + <td colspan="4"> + <div v-if="!areAllResultsSelected"> + <span + v-html="$sanitize(theDisplayedWebsitesAreSelectedText)" + style="margin-right:3.5px" + ></span> + <a + href="#" + @click.prevent="areAllResultsSelected = !areAllResultsSelected" + v-html="$sanitize(clickToSelectAllText)" + ></a> + </div> + <div v-if="areAllResultsSelected"> + <span + v-html="$sanitize(allWebsitesAreSelectedText)" + style="margin-right:3.5px" + ></span> + <a + href="#" + @click.prevent="areAllResultsSelected = !areAllResultsSelected" + v-html="$sanitize(clickToSelectDisplayedWebsitesText)" + ></a> + </div> + </td> + </tr> + <tr v-for="(entry, index) in siteAccess" :key="entry.idsite"> + <td class="select-cell"> + <span class="checkbox-container"> + <label> + <input + type="checkbox" + :id="`perm_edit_select_row${index}`" + v-model="selectedRows[index]" + @click="onRowSelected()" + /> + <span /> + </label> + </span> + </td> + <td> + <span>{{ entry.site_name }}</span> + </td> + <td> + <div + class="role-select" + > + <Field + :model-value="entry.role" + @update:model-value="onRoleChange(entry, $event);" + uicontrol="select" + :options="filteredAccessLevels" + :full-width="true" + /> + </div> + </td> + <td> + <div> + <CapabilitiesEdit + :idsite="entry.idsite" + :site-name="entry.site_name" + :user-login="userLogin" + :user-role="entry.role" + :capabilities="entry.capabilities" + @change="fetchAccess()" + > + </CapabilitiesEdit> + </div> + </td> + </tr> + </tbody> + </table> + <div class="delete-access-confirm-modal modal" ref="deleteAccessConfirmModal"> + <div class="modal-content"> + <h3 + v-if="siteAccessToChange" + v-html="$sanitize(deletePermConfirmSingleText)" + ></h3> + <p + v-if="!siteAccessToChange" + v-html="$sanitize(deletePermConfirmMultipleText)" + ></p> + </div> + <div class="modal-footer"> + <a + href="" + class="modal-action modal-close btn" + @click.prevent="changeUserRole()" + >{{ translate('General_Yes') }}</a> + <a + href="" + class="modal-action modal-close modal-no" + @click.prevent="siteAccessToChange = null; roleToChangeTo = null;" + >{{ translate('General_No') }}</a> + </div> + </div> + <div class="change-access-confirm-modal modal" ref="changeAccessConfirmModal"> + <div class="modal-content"> + <h3 + v-if="siteAccessToChange" + v-html="$sanitize(changePermToSiteConfirmSingleText)" + ></h3> + <p + v-if="!siteAccessToChange" + v-html="$sanitize(changePermToSiteConfirmMultipleText)" + ></p> + </div> + <div class="modal-footer"> + <a + href="" + class="modal-action modal-close btn" + @click.prevent="changeUserRole()" + >{{ translate('General_Yes') }}</a> + <a + href="" + class="modal-action modal-close modal-no" + @click.prevent=" + siteAccessToChange.role = previousRole; + siteAccessToChange = null; + roleToChangeTo = null;" + >{{ translate('General_No') }}</a> + </div> + </div> + <div class="confirm-give-access-all-sites modal" ref="confirmGiveAccessAllSitesModal"> + <div class="modal-content"> + <h3 v-html="$sanitize(changePermToAllSitesConfirmText)"></h3> + <p>{{ translate('UsersManager_ChangePermToAllSitesConfirm2') }}</p> + </div> + <div class="modal-footer"> + <a + href="" + class="modal-action modal-close btn" + @click.prevent="giveAccessToAllSites()" + >{{ translate('General_Yes') }}</a> + <a + href="" + class="modal-action modal-close modal-no" + @click="$event.preventDefault()" + >{{ translate('General_No') }}</a> + </div> + </div> + </div> +</template> + +<script lang="ts"> +import { defineComponent, watch } from 'vue'; +import { + Notification, + DropdownMenu, + ContentTable, + debounce, + translate, + AjaxHelper, + Site, + Matomo, +} from 'CoreHome'; +import { Field } from 'CorePluginsAdmin'; +import CapabilitiesEdit from '../CapabilitiesEdit/CapabilitiesEdit.vue'; +import Capability from '../CapabilitiesStore/Capability'; + +interface SiteAccess { + idsite: string|number; + site_name: string; + role: string; + capabilities: Capability[]; +} + +interface AccessLevel { + key: string|number; + value: unknown; +} + +interface UserPermissionsEditState { + siteAccess: SiteAccess[]; + offset: number; + totalEntries: number|null; + accessLevelFilter: string; + siteNameFilter: string; + isLoadingAccess: boolean; + allWebsitesAccssLevelSet: string; + isAllCheckboxSelected: boolean; + selectedRows: Record<string, boolean>; + isBulkActionsDisabled: boolean; + areAllResultsSelected: boolean; + previousRole: string|null; + hasAccessToAtLeastOneSite: boolean; + isRoleHelpToggled: boolean; + isCapabilitiesHelpToggled: boolean; + isGivingAccessToAllSites: boolean; + roleToChangeTo: string|null; + siteAccessToChange: SiteAccess|null; +} + +const { $ } = window; + +export default defineComponent({ + props: { + userLogin: { + type: String, + required: true, + }, + limit: { + type: Number, + default: 10, + }, + accessLevels: { + type: Array, + required: true, + }, + filterAccessLevels: { + type: Array, + required: true, + }, + }, + components: { + Notification, + Field, + CapabilitiesEdit, + }, + directives: { + DropdownMenu, + ContentTable, + }, + data(): UserPermissionsEditState { + return { + siteAccess: [], + offset: 0, + totalEntries: null, + accessLevelFilter: '', + siteNameFilter: '', + isLoadingAccess: false, + allWebsitesAccssLevelSet: 'view', + isAllCheckboxSelected: false, + selectedRows: {}, + isBulkActionsDisabled: true, + areAllResultsSelected: false, + previousRole: null, + hasAccessToAtLeastOneSite: true, + isRoleHelpToggled: false, + isCapabilitiesHelpToggled: false, + isGivingAccessToAllSites: false, + roleToChangeTo: null, + siteAccessToChange: null, + }; + }, + emits: ['userHasAccessDetected', 'accessChanged'], + created() { + this.onChangeSiteFilter = debounce(this.onChangeSiteFilter, 300); + + watch( + () => this.allPropsWatch, + () => { + if (this.limit) { + this.fetchAccess(); + } + }, + ); + + this.fetchAccess(); + }, + watch: { + accessLevelFilter() { + this.offset = 0; + this.fetchAccess(); + }, + }, + methods: { + onAllCheckboxChange(event: Event) { + this.isAllCheckboxSelected = (event.target as HTMLInputElement).checked; + if (!this.isAllCheckboxSelected) { + this.clearSelection(); + } else { + this.siteAccess.forEach((e, i) => { + this.selectedRows[i] = true; + }); + this.isBulkActionsDisabled = false; + } + }, + clearSelection() { + this.selectedRows = {}; + this.areAllResultsSelected = false; + this.isBulkActionsDisabled = true; + this.isAllCheckboxSelected = false; + this.siteAccessToChange = null; + }, + onRowSelected() { + setTimeout(() => { + const selectedRowKeyCount = this.selectedRowsCount; + this.isBulkActionsDisabled = selectedRowKeyCount === 0; + this.isAllCheckboxSelected = selectedRowKeyCount === this.siteAccess.length; + }); + }, + fetchAccess() { + this.isLoadingAccess = true; + return AjaxHelper.fetch<AjaxHelper>( + { + method: 'UsersManager.getSitesAccessForUser', + limit: this.limit, + offset: this.offset, + filter_search: this.siteNameFilter, + filter_access: this.accessLevelFilter, + userLogin: this.userLogin, + }, + { returnResponseObject: true }, + ).then((helper) => { + const result = helper.getRequestHandle()!; + + this.isLoadingAccess = false; + this.siteAccess = result.responseJSON as SiteAccess[]; + this.totalEntries = parseInt(result.getResponseHeader('x-matomo-total-results')!, 10) || 0; + this.hasAccessToAtLeastOneSite = !!result.getResponseHeader('x-matomo-has-some'); + + this.$emit('userHasAccessDetected', { hasAccess: this.hasAccessToAtLeastOneSite }); + + this.clearSelection(); + }).catch(() => { + this.isLoadingAccess = false; + + this.clearSelection(); + }); + }, + gotoPreviousPage() { + this.offset = Math.max(0, this.offset - this.limit); + + this.fetchAccess(); + }, + gotoNextPage() { + const newOffset = this.offset + this.limit; + if (newOffset >= (this.totalEntries || 0)) { + return; + } + + this.offset = newOffset; + this.fetchAccess(); + }, + showRemoveAccessConfirm() { + $(this.$refs.deleteAccessConfirmModal as HTMLElement).modal({ + dismissible: false, + }).modal('open'); + }, + changeUserRole() { + const getSelectedSites = () => { + const result: (string|number)[] = []; + Object.keys(this.selectedRows).forEach((index) => { + if (this.selectedRows[index] + && this.siteAccess[index as unknown as number] // safety check + ) { + result.push(this.siteAccess[index as unknown as number].idsite); + } + }); + return result; + }; + + const getAllSitesInSearch = () => ( + AjaxHelper.fetch<{ idsite: string }[]>( + { + method: 'UsersManager.getSitesAccessForUser', + filter_search: this.siteNameFilter, + filter_access: this.accessLevelFilter, + userLogin: this.userLogin, + filter_limit: '-1', + }, + ).then((access) => access.map((a) => a.idsite)) + ); + + this.isLoadingAccess = true; + + return Promise.resolve().then(() => { + if (this.siteAccessToChange) { + return [this.siteAccessToChange.idsite]; + } + + if (this.areAllResultsSelected) { + return getAllSitesInSearch(); + } + + return getSelectedSites(); + }).then((idSites) => AjaxHelper.post( + { + method: 'UsersManager.setUserAccess', + }, { + userLogin: this.userLogin, + access: this.roleToChangeTo, + idSites, + }, + )).catch(() => { + // ignore (errors will still be displayed to the user) + }).then(() => { // eslint-disable-line + this.$emit('accessChanged'); + + return this.fetchAccess(); + }); + }, + showChangeAccessConfirm() { + $(this.$refs.changeAccessConfirmModal as HTMLElement).modal({ + dismissible: false, + }).modal('open'); + }, + getRoleDisplay(role: string|null) { + let result = null; + (this.filteredAccessLevels as AccessLevel[]).forEach((entry) => { + if (entry.key === role) { + result = entry.value; + } + }); + return result; + }, + giveAccessToAllSites() { + this.isGivingAccessToAllSites = true; + AjaxHelper.fetch<Site[]>({ + method: 'SitesManager.getSitesWithAdminAccess', + }).then((allSites) => { + const idSites = allSites.map((s) => s.idsite); + return AjaxHelper.post( + { + method: 'UsersManager.setUserAccess', + }, { + userLogin: this.userLogin, + access: this.allWebsitesAccssLevelSet, + idSites, + }, + ); + }).then(() => this.fetchAccess()).finally(() => { + this.isGivingAccessToAllSites = false; + }); + }, + showChangeAccessAllSitesModal() { + $(this.$refs.confirmGiveAccessAllSitesModal as HTMLElement).modal({ + dismissible: false, + }).modal('open'); + }, + onChangeSiteFilter(event: KeyboardEvent) { + setTimeout(() => { + const inputValue = (event.target as HTMLInputElement).value; + if (this.siteNameFilter !== inputValue) { + this.siteNameFilter = inputValue; + this.offset = 0; + this.fetchAccess(); + } + }); + }, + onRoleChange(entry: SiteAccess, newRole: string) { + this.previousRole = entry.role; + this.roleToChangeTo = newRole; + this.siteAccessToChange = entry; + this.showChangeAccessConfirm(); + }, + }, + computed: { + rolesHelpText() { + return 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() { + const text = translate( + 'UsersManager_TheDisplayedWebsitesAreSelected', + `<strong>${this.siteAccess.length}</strong>`, + ); + return `${text} `; + }, + clickToSelectAllText() { + return translate('UsersManager_ClickToSelectAll', `<strong>${this.totalEntries}</strong>`); + }, + allWebsitesAreSelectedText() { + return translate( + 'UsersManager_AllWebsitesAreSelected', + `<strong>${this.totalEntries}</strong>`, + ); + }, + clickToSelectDisplayedWebsitesText() { + return translate( + 'UsersManager_ClickToSelectDisplayedWebsites', + `<strong>${this.siteAccess.length}</strong>`, + ); + }, + deletePermConfirmSingleText() { + return translate( + 'UsersManager_DeletePermConfirmSingle', + `<strong>${this.userLogin}</strong>`, + `<strong>${this.siteAccessToChangeName}</strong>`, + ); + }, + deletePermConfirmMultipleText() { + return translate( + 'UsersManager_DeletePermConfirmMultiple', + `<strong>${this.userLogin}</strong>`, + `<strong>${this.affectedSitesCount}</strong>`, + ); + }, + changePermToSiteConfirmSingleText() { + return translate( + 'UsersManager_ChangePermToSiteConfirmSingle', + `<strong>${this.userLogin}</strong>`, + `<strong>${this.siteAccessToChangeName}</strong>`, + `<strong>${this.getRoleDisplay(this.roleToChangeTo)}</strong>`, + ); + }, + changePermToSiteConfirmMultipleText() { + return translate( + 'UsersManager_ChangePermToSiteConfirmMultiple', + `<strong>${this.userLogin}</strong>`, + `<strong>${this.affectedSitesCount}</strong>`, + `<strong>${this.getRoleDisplay(this.roleToChangeTo)}</strong>`, + ); + }, + changePermToAllSitesConfirmText() { + return translate( + 'UsersManager_ChangePermToAllSitesConfirm', + `<strong>${this.userLogin}</strong>`, + `<strong>${this.getRoleDisplay(this.allWebsitesAccssLevelSet)}</strong>`, + ); + }, + paginationLowerBound() { + return this.offset + 1; + }, + paginationUpperBound() { + if (!this.totalEntries) { + return '?'; + } + return Math.min(this.offset + this.limit, this.totalEntries); + }, + filteredAccessLevels() { + return (this.accessLevels as AccessLevel[]).filter((entry) => entry.key !== 'superuser'); + }, + filteredSelectAccessLevels() { + return (this.filterAccessLevels as AccessLevel[]).filter( + (entry) => entry.key !== 'superuser', + ); + }, + selectedRowsCount() { + let selectedRowKeyCount = 0; + Object.values(this.selectedRows).forEach((v) => { + if (v) { + selectedRowKeyCount += 1; + } + }); + return selectedRowKeyCount; + }, + affectedSitesCount() { + if (this.areAllResultsSelected) { + return this.totalEntries; + } + + return this.selectedRowsCount; + }, + allPropsWatch() { + // see https://github.com/vuejs/vue/issues/844#issuecomment-390500758 + // eslint-disable-next-line no-sequences + return (this.userLogin, this.limit, this.accessLevels, this.filterAccessLevels, Date.now()); + }, + siteAccessToChangeName() { + return this.siteAccessToChange + ? Matomo.helper.htmlEntities(this.siteAccessToChange.site_name) + : ''; + }, + paginationText() { + const text = translate( + 'General_Pagination', + `${this.paginationLowerBound}`, + `${this.paginationUpperBound}`, + `${this.totalEntries}`, + ); + return ` ${text} `; + }, + }, +}); +</script> diff --git a/plugins/UsersManager/vue/src/index.ts b/plugins/UsersManager/vue/src/index.ts index 7411497560..bac1eaf08d 100644 --- a/plugins/UsersManager/vue/src/index.ts +++ b/plugins/UsersManager/vue/src/index.ts @@ -5,6 +5,8 @@ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later */ import './CapabilitiesEdit/CapabilitiesEdit.adapter'; +import './UserPermissionsEdit/UserPermissionsEdit.adapter'; export { default as CapabilitiesEdit } from './CapabilitiesEdit/CapabilitiesEdit.vue'; export { default as Capability } from './CapabilitiesStore/Capability'; +export { default as UserPermissionsEdit } from './UserPermissionsEdit/UserPermissionsEdit.vue'; |