From 99a64e70033e898760df32286dff9a51e4382086 Mon Sep 17 00:00:00 2001 From: GretaD Date: Tue, 17 Dec 2019 23:22:00 +0100 Subject: [PATCH 1/9] fix userlist alignment Signed-off-by: GretaD --- apps/settings/css/settings.scss | 6 +++++- apps/settings/src/components/UserList.vue | 20 ++++++++++---------- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/apps/settings/css/settings.scss b/apps/settings/css/settings.scss index 47a035016add0..a818d1f5d1492 100644 --- a/apps/settings/css/settings.scss +++ b/apps/settings/css/settings.scss @@ -1430,7 +1430,11 @@ doesnotexist:-o-prefocus, .strengthify-wrapper { } // separate prop to set initial value to top: 50px &#new-user { - top: $header-height + $grid-row-height; + top: $header-height + $grid-row-height; + height: 90px; + .row { + padding-top: 50px; + } } &#grid-header { color: var(--color-text-maxcontrast); diff --git a/apps/settings/src/components/UserList.vue b/apps/settings/src/components/UserList.vue index 0fb1d09fbf723..40d88007f8578 100644 --- a/apps/settings/src/components/UserList.vue +++ b/apps/settings/src/components/UserList.vue @@ -96,16 +96,16 @@ pattern="[a-zA-Z0-9 _\.@\-']+" required type="text"> - -
- +
+ +
Date: Mon, 6 Jan 2020 13:42:25 +0100 Subject: [PATCH 2/9] fix new user table Signed-off-by: GretaD --- apps/settings/css/settings.scss | 5 +- apps/settings/js/vue-2.js | 4212 +++++++++++++++++++++ apps/settings/js/vue-2.js.map | 1 + apps/settings/src/components/UserList.vue | 103 +- 4 files changed, 4266 insertions(+), 55 deletions(-) create mode 100644 apps/settings/js/vue-2.js create mode 100644 apps/settings/js/vue-2.js.map diff --git a/apps/settings/css/settings.scss b/apps/settings/css/settings.scss index a818d1f5d1492..b201ff1821cf4 100644 --- a/apps/settings/css/settings.scss +++ b/apps/settings/css/settings.scss @@ -1414,7 +1414,7 @@ doesnotexist:-o-prefocus, .strengthify-wrapper { @include position('sticky'); align-self: normal; background-color: var(--color-main-background); - z-index: 55; /* above multiselect */ + z-index: 100; /* above multiselect */ top: $header-height; &.sticky { box-shadow: 0 -2px 10px 1px var(--color-box-shadow); @@ -1430,8 +1430,7 @@ doesnotexist:-o-prefocus, .strengthify-wrapper { } // separate prop to set initial value to top: 50px &#new-user { - top: $header-height + $grid-row-height; - height: 90px; + height: 120px; .row { padding-top: 50px; } diff --git a/apps/settings/js/vue-2.js b/apps/settings/js/vue-2.js new file mode 100644 index 0000000000000..5256cff103337 --- /dev/null +++ b/apps/settings/js/vue-2.js @@ -0,0 +1,4212 @@ +(window["webpackJsonpSettings"] = window["webpackJsonpSettings"] || []).push([[2],{ + +/***/ "./apps/settings/src/components/UserList.vue": +/*!***************************************************!*\ + !*** ./apps/settings/src/components/UserList.vue ***! + \***************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _UserList_vue_vue_type_template_id_6cba3aca___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./UserList.vue?vue&type=template&id=6cba3aca& */ "./apps/settings/src/components/UserList.vue?vue&type=template&id=6cba3aca&"); +/* harmony import */ var _UserList_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./UserList.vue?vue&type=script&lang=js& */ "./apps/settings/src/components/UserList.vue?vue&type=script&lang=js&"); +/* empty/unused harmony star reexport *//* harmony import */ var _node_modules_vue_loader_lib_runtime_componentNormalizer_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js */ "./node_modules/vue-loader/lib/runtime/componentNormalizer.js"); + + + + + +/* normalize component */ + +var component = Object(_node_modules_vue_loader_lib_runtime_componentNormalizer_js__WEBPACK_IMPORTED_MODULE_2__["default"])( + _UserList_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__["default"], + _UserList_vue_vue_type_template_id_6cba3aca___WEBPACK_IMPORTED_MODULE_0__["render"], + _UserList_vue_vue_type_template_id_6cba3aca___WEBPACK_IMPORTED_MODULE_0__["staticRenderFns"], + false, + null, + null, + null + +) + +/* hot reload */ +if (false) { var api; } +component.options.__file = "apps/settings/src/components/UserList.vue" +/* harmony default export */ __webpack_exports__["default"] = (component.exports); + +/***/ }), + +/***/ "./apps/settings/src/components/UserList.vue?vue&type=script&lang=js&": +/*!****************************************************************************!*\ + !*** ./apps/settings/src/components/UserList.vue?vue&type=script&lang=js& ***! + \****************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _node_modules_babel_loader_lib_index_js_node_modules_vue_loader_lib_index_js_vue_loader_options_UserList_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../../node_modules/babel-loader/lib!../../../../node_modules/vue-loader/lib??vue-loader-options!./UserList.vue?vue&type=script&lang=js& */ "./node_modules/babel-loader/lib/index.js!./node_modules/vue-loader/lib/index.js?!./apps/settings/src/components/UserList.vue?vue&type=script&lang=js&"); +/* empty/unused harmony star reexport */ /* harmony default export */ __webpack_exports__["default"] = (_node_modules_babel_loader_lib_index_js_node_modules_vue_loader_lib_index_js_vue_loader_options_UserList_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__["default"]); + +/***/ }), + +/***/ "./apps/settings/src/components/UserList.vue?vue&type=template&id=6cba3aca&": +/*!**********************************************************************************!*\ + !*** ./apps/settings/src/components/UserList.vue?vue&type=template&id=6cba3aca& ***! + \**********************************************************************************/ +/*! exports provided: render, staticRenderFns */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_vue_loader_lib_index_js_vue_loader_options_UserList_vue_vue_type_template_id_6cba3aca___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../../node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!../../../../node_modules/vue-loader/lib??vue-loader-options!./UserList.vue?vue&type=template&id=6cba3aca& */ "./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/vue-loader/lib/index.js?!./apps/settings/src/components/UserList.vue?vue&type=template&id=6cba3aca&"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "render", function() { return _node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_vue_loader_lib_index_js_vue_loader_options_UserList_vue_vue_type_template_id_6cba3aca___WEBPACK_IMPORTED_MODULE_0__["render"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "staticRenderFns", function() { return _node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_vue_loader_lib_index_js_vue_loader_options_UserList_vue_vue_type_template_id_6cba3aca___WEBPACK_IMPORTED_MODULE_0__["staticRenderFns"]; }); + + + +/***/ }), + +/***/ "./apps/settings/src/components/UserList/UserRow.vue": +/*!***********************************************************!*\ + !*** ./apps/settings/src/components/UserList/UserRow.vue ***! + \***********************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _UserRow_vue_vue_type_template_id_77960baa___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./UserRow.vue?vue&type=template&id=77960baa& */ "./apps/settings/src/components/UserList/UserRow.vue?vue&type=template&id=77960baa&"); +/* harmony import */ var _UserRow_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./UserRow.vue?vue&type=script&lang=js& */ "./apps/settings/src/components/UserList/UserRow.vue?vue&type=script&lang=js&"); +/* empty/unused harmony star reexport *//* harmony import */ var _node_modules_vue_loader_lib_runtime_componentNormalizer_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js */ "./node_modules/vue-loader/lib/runtime/componentNormalizer.js"); + + + + + +/* normalize component */ + +var component = Object(_node_modules_vue_loader_lib_runtime_componentNormalizer_js__WEBPACK_IMPORTED_MODULE_2__["default"])( + _UserRow_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__["default"], + _UserRow_vue_vue_type_template_id_77960baa___WEBPACK_IMPORTED_MODULE_0__["render"], + _UserRow_vue_vue_type_template_id_77960baa___WEBPACK_IMPORTED_MODULE_0__["staticRenderFns"], + false, + null, + null, + null + +) + +/* hot reload */ +if (false) { var api; } +component.options.__file = "apps/settings/src/components/UserList/UserRow.vue" +/* harmony default export */ __webpack_exports__["default"] = (component.exports); + +/***/ }), + +/***/ "./apps/settings/src/components/UserList/UserRow.vue?vue&type=script&lang=js&": +/*!************************************************************************************!*\ + !*** ./apps/settings/src/components/UserList/UserRow.vue?vue&type=script&lang=js& ***! + \************************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _node_modules_babel_loader_lib_index_js_node_modules_vue_loader_lib_index_js_vue_loader_options_UserRow_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../../../node_modules/babel-loader/lib!../../../../../node_modules/vue-loader/lib??vue-loader-options!./UserRow.vue?vue&type=script&lang=js& */ "./node_modules/babel-loader/lib/index.js!./node_modules/vue-loader/lib/index.js?!./apps/settings/src/components/UserList/UserRow.vue?vue&type=script&lang=js&"); +/* empty/unused harmony star reexport */ /* harmony default export */ __webpack_exports__["default"] = (_node_modules_babel_loader_lib_index_js_node_modules_vue_loader_lib_index_js_vue_loader_options_UserRow_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__["default"]); + +/***/ }), + +/***/ "./apps/settings/src/components/UserList/UserRow.vue?vue&type=template&id=77960baa&": +/*!******************************************************************************************!*\ + !*** ./apps/settings/src/components/UserList/UserRow.vue?vue&type=template&id=77960baa& ***! + \******************************************************************************************/ +/*! exports provided: render, staticRenderFns */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_vue_loader_lib_index_js_vue_loader_options_UserRow_vue_vue_type_template_id_77960baa___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../../../node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!../../../../../node_modules/vue-loader/lib??vue-loader-options!./UserRow.vue?vue&type=template&id=77960baa& */ "./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/vue-loader/lib/index.js?!./apps/settings/src/components/UserList/UserRow.vue?vue&type=template&id=77960baa&"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "render", function() { return _node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_vue_loader_lib_index_js_vue_loader_options_UserRow_vue_vue_type_template_id_77960baa___WEBPACK_IMPORTED_MODULE_0__["render"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "staticRenderFns", function() { return _node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_vue_loader_lib_index_js_vue_loader_options_UserRow_vue_vue_type_template_id_77960baa___WEBPACK_IMPORTED_MODULE_0__["staticRenderFns"]; }); + + + +/***/ }), + +/***/ "./apps/settings/src/components/UserList/UserRowSimple.vue": +/*!*****************************************************************!*\ + !*** ./apps/settings/src/components/UserList/UserRowSimple.vue ***! + \*****************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _UserRowSimple_vue_vue_type_template_id_ff154a08_scoped_true___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./UserRowSimple.vue?vue&type=template&id=ff154a08&scoped=true& */ "./apps/settings/src/components/UserList/UserRowSimple.vue?vue&type=template&id=ff154a08&scoped=true&"); +/* harmony import */ var _UserRowSimple_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./UserRowSimple.vue?vue&type=script&lang=js& */ "./apps/settings/src/components/UserList/UserRowSimple.vue?vue&type=script&lang=js&"); +/* empty/unused harmony star reexport *//* harmony import */ var _node_modules_vue_loader_lib_runtime_componentNormalizer_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js */ "./node_modules/vue-loader/lib/runtime/componentNormalizer.js"); + + + + + +/* normalize component */ + +var component = Object(_node_modules_vue_loader_lib_runtime_componentNormalizer_js__WEBPACK_IMPORTED_MODULE_2__["default"])( + _UserRowSimple_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__["default"], + _UserRowSimple_vue_vue_type_template_id_ff154a08_scoped_true___WEBPACK_IMPORTED_MODULE_0__["render"], + _UserRowSimple_vue_vue_type_template_id_ff154a08_scoped_true___WEBPACK_IMPORTED_MODULE_0__["staticRenderFns"], + false, + null, + "ff154a08", + null + +) + +/* hot reload */ +if (false) { var api; } +component.options.__file = "apps/settings/src/components/UserList/UserRowSimple.vue" +/* harmony default export */ __webpack_exports__["default"] = (component.exports); + +/***/ }), + +/***/ "./apps/settings/src/components/UserList/UserRowSimple.vue?vue&type=script&lang=js&": +/*!******************************************************************************************!*\ + !*** ./apps/settings/src/components/UserList/UserRowSimple.vue?vue&type=script&lang=js& ***! + \******************************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _node_modules_babel_loader_lib_index_js_node_modules_vue_loader_lib_index_js_vue_loader_options_UserRowSimple_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../../../node_modules/babel-loader/lib!../../../../../node_modules/vue-loader/lib??vue-loader-options!./UserRowSimple.vue?vue&type=script&lang=js& */ "./node_modules/babel-loader/lib/index.js!./node_modules/vue-loader/lib/index.js?!./apps/settings/src/components/UserList/UserRowSimple.vue?vue&type=script&lang=js&"); +/* empty/unused harmony star reexport */ /* harmony default export */ __webpack_exports__["default"] = (_node_modules_babel_loader_lib_index_js_node_modules_vue_loader_lib_index_js_vue_loader_options_UserRowSimple_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__["default"]); + +/***/ }), + +/***/ "./apps/settings/src/components/UserList/UserRowSimple.vue?vue&type=template&id=ff154a08&scoped=true&": +/*!************************************************************************************************************!*\ + !*** ./apps/settings/src/components/UserList/UserRowSimple.vue?vue&type=template&id=ff154a08&scoped=true& ***! + \************************************************************************************************************/ +/*! exports provided: render, staticRenderFns */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_vue_loader_lib_index_js_vue_loader_options_UserRowSimple_vue_vue_type_template_id_ff154a08_scoped_true___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../../../node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!../../../../../node_modules/vue-loader/lib??vue-loader-options!./UserRowSimple.vue?vue&type=template&id=ff154a08&scoped=true& */ "./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/vue-loader/lib/index.js?!./apps/settings/src/components/UserList/UserRowSimple.vue?vue&type=template&id=ff154a08&scoped=true&"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "render", function() { return _node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_vue_loader_lib_index_js_vue_loader_options_UserRowSimple_vue_vue_type_template_id_ff154a08_scoped_true___WEBPACK_IMPORTED_MODULE_0__["render"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "staticRenderFns", function() { return _node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_vue_loader_lib_index_js_vue_loader_options_UserRowSimple_vue_vue_type_template_id_ff154a08_scoped_true___WEBPACK_IMPORTED_MODULE_0__["staticRenderFns"]; }); + + + +/***/ }), + +/***/ "./apps/settings/src/mixins/UserRowMixin.js": +/*!**************************************************!*\ + !*** ./apps/settings/src/mixins/UserRowMixin.js ***! + \**************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } + +/** + * @copyright Copyright (c) 2019 John Molakvoæ + * + * @author John Molakvoæ + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + */ +/* harmony default export */ __webpack_exports__["default"] = ({ + props: { + user: { + type: Object, + required: true + }, + settings: { + type: Object, + default: function _default() { + return {}; + } + }, + groups: { + type: Array, + default: function _default() { + return []; + } + }, + subAdminsGroups: { + type: Array, + default: function _default() { + return []; + } + }, + quotaOptions: { + type: Array, + default: function _default() { + return []; + } + }, + showConfig: { + type: Object, + default: function _default() { + return {}; + } + }, + languages: { + type: Array, + required: true + }, + externalActions: { + type: Array, + default: function _default() { + return []; + } + } + }, + computed: { + /* GROUPS MANAGEMENT */ + userGroups: function userGroups() { + var _this = this; + + var userGroups = this.groups.filter(function (group) { + return _this.user.groups.includes(group.id); + }); + return userGroups; + }, + userSubAdminsGroups: function userSubAdminsGroups() { + var _this2 = this; + + var userSubAdminsGroups = this.subAdminsGroups.filter(function (group) { + return _this2.user.subadmin.includes(group.id); + }); + return userSubAdminsGroups; + }, + availableGroups: function availableGroups() { + var _this3 = this; + + return this.groups.map(function (group) { + // clone object because we don't want + // to edit the original groups + var groupClone = Object.assign({}, group); // two settings here: + // 1. user NOT in group but no permission to add + // 2. user is in group but no permission to remove + + groupClone.$isDisabled = group.canAdd === false && !_this3.user.groups.includes(group.id) || group.canRemove === false && _this3.user.groups.includes(group.id); + return groupClone; + }); + }, + + /* QUOTA MANAGEMENT */ + usedSpace: function usedSpace() { + if (this.user.quota.used) { + return t('settings', '{size} used', { + size: OC.Util.humanFileSize(this.user.quota.used) + }); + } + + return t('settings', '{size} used', { + size: OC.Util.humanFileSize(0) + }); + }, + usedQuota: function usedQuota() { + var quota = this.user.quota.quota; + + if (quota > 0) { + quota = Math.min(100, Math.round(this.user.quota.used / quota * 100)); + } else { + var usedInGB = this.user.quota.used / (10 * Math.pow(2, 30)); // asymptotic curve approaching 50% at 10GB to visualize used stace with infinite quota + + quota = 95 * (1 - 1 / (usedInGB + 1)); + } + + return isNaN(quota) ? 0 : quota; + }, + // Mapping saved values to objects + userQuota: function userQuota() { + if (this.user.quota.quota >= 0) { + // if value is valid, let's map the quotaOptions or return custom quota + var humanQuota = OC.Util.humanFileSize(this.user.quota.quota); + var userQuota = this.quotaOptions.find(function (quota) { + return quota.id === humanQuota; + }); + return userQuota || { + id: humanQuota, + label: humanQuota + }; + } else if (this.user.quota.quota === 'default') { + // default quota is replaced by the proper value on load + return this.quotaOptions[0]; + } + + return this.quotaOptions[1]; // unlimited + }, + + /* PASSWORD POLICY? */ + minPasswordLength: function minPasswordLength() { + return this.$store.getters.getPasswordPolicyMinLength; + }, + + /* LANGUAGE */ + userLanguage: function userLanguage() { + var _this4 = this; + + var availableLanguages = this.languages[0].languages.concat(this.languages[1].languages); + var userLang = availableLanguages.find(function (lang) { + return lang.code === _this4.user.language; + }); + + if (_typeof(userLang) !== 'object' && this.user.language !== '') { + return { + code: this.user.language, + name: this.user.language + }; + } else if (this.user.language === '') { + return false; + } + + return userLang; + }, + + /* LAST LOGIN */ + userLastLoginTooltip: function userLastLoginTooltip() { + if (this.user.lastLogin > 0) { + return OC.Util.formatDate(this.user.lastLogin); + } + + return ''; + }, + userLastLogin: function userLastLogin() { + if (this.user.lastLogin > 0) { + return OC.Util.relativeModifiedDate(this.user.lastLogin); + } + + return t('settings', 'Never'); + } + }, + methods: { + /** + * Generate avatar url + * + * @param {string} user The user name + * @param {int} size Size integer, default 32 + * @returns {string} + */ + generateAvatar: function generateAvatar(user) { + var size = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 32; + return OC.generateUrl('/avatar/{user}/{size}?v={version}', { + user: user, + size: size, + version: oc_userconfig.avatar.version + }); + } + } +}); + +/***/ }), + +/***/ "./apps/settings/src/views/Users.vue": +/*!*******************************************!*\ + !*** ./apps/settings/src/views/Users.vue ***! + \*******************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _Users_vue_vue_type_template_id_889b7562___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Users.vue?vue&type=template&id=889b7562& */ "./apps/settings/src/views/Users.vue?vue&type=template&id=889b7562&"); +/* harmony import */ var _Users_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Users.vue?vue&type=script&lang=js& */ "./apps/settings/src/views/Users.vue?vue&type=script&lang=js&"); +/* empty/unused harmony star reexport *//* harmony import */ var _node_modules_vue_loader_lib_runtime_componentNormalizer_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js */ "./node_modules/vue-loader/lib/runtime/componentNormalizer.js"); + + + + + +/* normalize component */ + +var component = Object(_node_modules_vue_loader_lib_runtime_componentNormalizer_js__WEBPACK_IMPORTED_MODULE_2__["default"])( + _Users_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__["default"], + _Users_vue_vue_type_template_id_889b7562___WEBPACK_IMPORTED_MODULE_0__["render"], + _Users_vue_vue_type_template_id_889b7562___WEBPACK_IMPORTED_MODULE_0__["staticRenderFns"], + false, + null, + null, + null + +) + +/* hot reload */ +if (false) { var api; } +component.options.__file = "apps/settings/src/views/Users.vue" +/* harmony default export */ __webpack_exports__["default"] = (component.exports); + +/***/ }), + +/***/ "./apps/settings/src/views/Users.vue?vue&type=script&lang=js&": +/*!********************************************************************!*\ + !*** ./apps/settings/src/views/Users.vue?vue&type=script&lang=js& ***! + \********************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _node_modules_babel_loader_lib_index_js_node_modules_vue_loader_lib_index_js_vue_loader_options_Users_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../../node_modules/babel-loader/lib!../../../../node_modules/vue-loader/lib??vue-loader-options!./Users.vue?vue&type=script&lang=js& */ "./node_modules/babel-loader/lib/index.js!./node_modules/vue-loader/lib/index.js?!./apps/settings/src/views/Users.vue?vue&type=script&lang=js&"); +/* empty/unused harmony star reexport */ /* harmony default export */ __webpack_exports__["default"] = (_node_modules_babel_loader_lib_index_js_node_modules_vue_loader_lib_index_js_vue_loader_options_Users_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__["default"]); + +/***/ }), + +/***/ "./apps/settings/src/views/Users.vue?vue&type=template&id=889b7562&": +/*!**************************************************************************!*\ + !*** ./apps/settings/src/views/Users.vue?vue&type=template&id=889b7562& ***! + \**************************************************************************/ +/*! exports provided: render, staticRenderFns */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_vue_loader_lib_index_js_vue_loader_options_Users_vue_vue_type_template_id_889b7562___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../../node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!../../../../node_modules/vue-loader/lib??vue-loader-options!./Users.vue?vue&type=template&id=889b7562& */ "./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/vue-loader/lib/index.js?!./apps/settings/src/views/Users.vue?vue&type=template&id=889b7562&"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "render", function() { return _node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_vue_loader_lib_index_js_vue_loader_options_Users_vue_vue_type_template_id_889b7562___WEBPACK_IMPORTED_MODULE_0__["render"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "staticRenderFns", function() { return _node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_vue_loader_lib_index_js_vue_loader_options_Users_vue_vue_type_template_id_889b7562___WEBPACK_IMPORTED_MODULE_0__["staticRenderFns"]; }); + + + +/***/ }), + +/***/ "./node_modules/babel-loader/lib/index.js!./node_modules/vue-loader/lib/index.js?!./apps/settings/src/components/UserList.vue?vue&type=script&lang=js&": +/*!**************************************************************************************************************************************************************!*\ + !*** ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./apps/settings/src/components/UserList.vue?vue&type=script&lang=js& ***! + \**************************************************************************************************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _UserList_UserRow__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./UserList/UserRow */ "./apps/settings/src/components/UserList/UserRow.vue"); +/* harmony import */ var nextcloud_vue__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! nextcloud-vue */ "./node_modules/nextcloud-vue/dist/ncvuecomponents.js"); +/* harmony import */ var nextcloud_vue__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(nextcloud_vue__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var vue_infinite_loading__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! vue-infinite-loading */ "./node_modules/vue-infinite-loading/dist/vue-infinite-loading.js"); +/* harmony import */ var vue_infinite_loading__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(vue_infinite_loading__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! vue */ "./node_modules/vue/dist/vue.runtime.esm.js"); +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// + + + + +var unlimitedQuota = { + id: 'none', + label: t('settings', 'Unlimited') +}; +var defaultQuota = { + id: 'default', + label: t('settings', 'Default quota') +}; +var newUser = { + id: '', + displayName: '', + password: '', + mailAddress: '', + groups: [], + subAdminsGroups: [], + quota: defaultQuota, + language: { + code: 'en', + name: t('settings', 'Default language') + } +}; +/* harmony default export */ __webpack_exports__["default"] = ({ + name: 'UserList', + components: { + userRow: _UserList_UserRow__WEBPACK_IMPORTED_MODULE_0__["default"], + Multiselect: nextcloud_vue__WEBPACK_IMPORTED_MODULE_1__["Multiselect"], + InfiniteLoading: vue_infinite_loading__WEBPACK_IMPORTED_MODULE_2___default.a + }, + props: { + users: { + type: Array, + default: function _default() { + return []; + } + }, + showConfig: { + type: Object, + required: true + }, + selectedGroup: { + type: String, + default: null + }, + externalActions: { + type: Array, + default: function _default() { + return []; + } + } + }, + data: function data() { + return { + unlimitedQuota: unlimitedQuota, + defaultQuota: defaultQuota, + loading: { + all: false, + groups: false + }, + scrolled: false, + searchQuery: '', + newUser: Object.assign({}, newUser) + }; + }, + computed: { + settings: function settings() { + return this.$store.getters.getServerData; + }, + filteredUsers: function filteredUsers() { + if (this.selectedGroup === 'disabled') { + return this.users.filter(function (user) { + return user.enabled === false; + }); + } + + if (!this.settings.isAdmin) { + // we don't want subadmins to edit themselves + return this.users.filter(function (user) { + return user.enabled !== false && user.id !== OC.getCurrentUser().uid; + }); + } + + return this.users.filter(function (user) { + return user.enabled !== false; + }); + }, + groups: function groups() { + // data provided php side + remove the disabled group + return this.$store.getters.getGroups.filter(function (group) { + return group.id !== 'disabled'; + }).sort(function (a, b) { + return a.name.localeCompare(b.name); + }); + }, + canAddGroups: function canAddGroups() { + // disabled if no permission to add new users to group + return this.groups.map(function (group) { + // clone object because we don't want + // to edit the original groups + group = Object.assign({}, group); + group.$isDisabled = group.canAdd === false; + return group; + }); + }, + subAdminsGroups: function subAdminsGroups() { + // data provided php side + return this.$store.getters.getSubadminGroups; + }, + quotaOptions: function quotaOptions() { + // convert the preset array into objects + var quotaPreset = this.settings.quotaPreset.reduce(function (acc, cur) { + return acc.concat({ + id: cur, + label: cur + }); + }, []); // add default presets + + quotaPreset.unshift(this.unlimitedQuota); + quotaPreset.unshift(this.defaultQuota); + return quotaPreset; + }, + minPasswordLength: function minPasswordLength() { + return this.$store.getters.getPasswordPolicyMinLength; + }, + usersOffset: function usersOffset() { + return this.$store.getters.getUsersOffset; + }, + usersLimit: function usersLimit() { + return this.$store.getters.getUsersLimit; + }, + usersCount: function usersCount() { + return this.users.length; + }, + + /* LANGUAGES */ + languages: function languages() { + return [{ + label: t('settings', 'Common languages'), + languages: this.settings.languages.commonlanguages + }, { + label: t('settings', 'All languages'), + languages: this.settings.languages.languages + }]; + } + }, + watch: { + // watch url change and group select + selectedGroup: function selectedGroup(val, old) { + // if selected is the disabled group but it's empty + this.redirectIfDisabled(); + this.$store.commit('resetUsers'); + this.$refs.infiniteLoading.stateChanger.reset(); + this.setNewUserDefaultGroup(val); + }, + // make sure the infiniteLoading state is changed if we manually + // add/remove data from the store + usersCount: function usersCount(val, old) { + // deleting the last user, reset the list + if (val === 0 && old === 1) { + this.$refs.infiniteLoading.stateChanger.reset(); // adding the first user, warn the infiniteLoader that + // the list is not empty anymore (we don't fetch the newly + // added user as we already have all the info we need) + } else if (val === 1 && old === 0) { + this.$refs.infiniteLoading.stateChanger.loaded(); + } + } + }, + mounted: function mounted() { + if (!this.settings.canChangePassword) { + OC.Notification.showTemporary(t('settings', 'Password change is disabled because the master key is disabled')); + } + /** + * Reset and init new user form + */ + + + this.resetForm(); + /** + * Register search + */ + + this.userSearch = new OCA.Search(this.search, this.resetSearch); + /** + * If disabled group but empty, redirect + */ + + this.redirectIfDisabled(); + }, + methods: { + onScroll: function onScroll(event) { + this.scrolled = event.target.scrollTo > 0; + }, + + /** + * Validate quota string to make sure it's a valid human file size + * + * @param {string} quota Quota in readable format '5 GB' + * @returns {Object} + */ + validateQuota: function validateQuota(quota) { + // only used for new presets sent through @Tag + var validQuota = OC.Util.computerFileSize(quota); + + if (validQuota !== null && validQuota >= 0) { + // unify format output + quota = OC.Util.humanFileSize(OC.Util.computerFileSize(quota)); + this.newUser.quota = { + id: quota, + label: quota + }; + return this.newUser.quota; + } // Default is unlimited + + + this.newUser.quota = this.quotaOptions[0]; + return this.quotaOptions[0]; + }, + infiniteHandler: function infiniteHandler($state) { + this.$store.dispatch('getUsers', { + offset: this.usersOffset, + limit: this.usersLimit, + group: this.selectedGroup !== 'disabled' ? this.selectedGroup : '', + search: this.searchQuery + }).then(function (response) { + response ? $state.loaded() : $state.complete(); + }); + }, + + /* SEARCH */ + search: function search(query) { + this.searchQuery = query; + this.$store.commit('resetUsers'); + this.$refs.infiniteLoading.stateChanger.reset(); + }, + resetSearch: function resetSearch() { + this.search(''); + }, + resetForm: function resetForm() { + // revert form to original state + this.newUser = Object.assign({}, newUser); + /** + * Init default language from server data. The use of this.settings + * requires a computed variable, which break the v-model binding of the form, + * this is a much easier solution than getter and setter on a computed var + */ + + if (this.settings.defaultLanguage) { + vue__WEBPACK_IMPORTED_MODULE_3__["default"].set(this.newUser.language, 'code', this.settings.defaultLanguage); + } + /** + * In case the user directly loaded the user list within a group + * the watch won't be triggered. We need to initialize it. + */ + + + this.setNewUserDefaultGroup(this.selectedGroup); + this.loading.all = false; + }, + createUser: function createUser() { + var _this = this; + + this.loading.all = true; + this.$store.dispatch('addUser', { + userid: this.newUser.id, + password: this.newUser.password, + displayName: this.newUser.displayName, + email: this.newUser.mailAddress, + groups: this.newUser.groups.map(function (group) { + return group.id; + }), + subadmin: this.newUser.subAdminsGroups.map(function (group) { + return group.id; + }), + quota: this.newUser.quota.id, + language: this.newUser.language.code + }).then(function () { + _this.resetForm(); + + _this.$refs.newusername.focus(); + }).catch(function (error) { + _this.loading.all = false; + + if (error.response && error.response.data && error.response.data.ocs && error.response.data.ocs.meta) { + var statuscode = error.response.data.ocs.meta.statuscode; + + if (statuscode === 102) { + // wrong username + _this.$refs.newusername.focus(); + } else if (statuscode === 107) { + // wrong password + _this.$refs.newuserpassword.focus(); + } + } + }); + }, + setNewUserDefaultGroup: function setNewUserDefaultGroup(value) { + if (value && value.length > 0) { + // setting new user default group to the current selected one + var currentGroup = this.groups.find(function (group) { + return group.id === value; + }); + + if (currentGroup) { + this.newUser.groups = [currentGroup]; + return; + } + } // fallback, empty selected group + + + this.newUser.groups = []; + }, + + /** + * Create a new group + * + * @param {string} gid Group id + * @returns {Promise} + */ + createGroup: function createGroup(gid) { + var _this2 = this; + + this.loading.groups = true; + this.$store.dispatch('addGroup', gid).then(function (group) { + _this2.newUser.groups.push(_this2.groups.find(function (group) { + return group.id === gid; + })); + + _this2.loading.groups = false; + }).catch(function () { + _this2.loading.groups = false; + }); + return this.$store.getters.getGroups[this.groups.length]; + }, + + /** + * If the selected group is the disabled group but the count is 0 + * redirect to the all users page. + * * we only check for 0 because we don't have the count on ldap + * * and we therefore set the usercount to -1 in this specific case + */ + redirectIfDisabled: function redirectIfDisabled() { + var allGroups = this.$store.getters.getGroups; + + if (this.selectedGroup === 'disabled' && allGroups.findIndex(function (group) { + return group.id === 'disabled' && group.usercount === 0; + }) > -1) { + // disabled group is empty, redirection to all users + this.$router.push({ + name: 'users' + }); + this.$refs.infiniteLoading.stateChanger.reset(); + } + } + } +}); + +/***/ }), + +/***/ "./node_modules/babel-loader/lib/index.js!./node_modules/vue-loader/lib/index.js?!./apps/settings/src/components/UserList/UserRow.vue?vue&type=script&lang=js&": +/*!**********************************************************************************************************************************************************************!*\ + !*** ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./apps/settings/src/components/UserList/UserRow.vue?vue&type=script&lang=js& ***! + \**********************************************************************************************************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var vue_click_outside__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue-click-outside */ "./node_modules/vue-click-outside/index.js"); +/* harmony import */ var vue_click_outside__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(vue_click_outside__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! vue */ "./node_modules/vue/dist/vue.runtime.esm.js"); +/* harmony import */ var v_tooltip__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! v-tooltip */ "./node_modules/v-tooltip/dist/v-tooltip.esm.js"); +/* harmony import */ var nextcloud_vue__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! nextcloud-vue */ "./node_modules/nextcloud-vue/dist/ncvuecomponents.js"); +/* harmony import */ var nextcloud_vue__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(nextcloud_vue__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var _UserRowSimple__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./UserRowSimple */ "./apps/settings/src/components/UserList/UserRowSimple.vue"); +/* harmony import */ var _mixins_UserRowMixin__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../mixins/UserRowMixin */ "./apps/settings/src/mixins/UserRowMixin.js"); +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// + + + + + + +vue__WEBPACK_IMPORTED_MODULE_1__["default"].use(v_tooltip__WEBPACK_IMPORTED_MODULE_2__["default"]); +/* harmony default export */ __webpack_exports__["default"] = ({ + name: 'UserRow', + components: { + UserRowSimple: _UserRowSimple__WEBPACK_IMPORTED_MODULE_4__["default"], + PopoverMenu: nextcloud_vue__WEBPACK_IMPORTED_MODULE_3__["PopoverMenu"], + Actions: nextcloud_vue__WEBPACK_IMPORTED_MODULE_3__["Actions"], + ActionButton: nextcloud_vue__WEBPACK_IMPORTED_MODULE_3__["ActionButton"], + Multiselect: nextcloud_vue__WEBPACK_IMPORTED_MODULE_3__["Multiselect"] + }, + directives: { + ClickOutside: vue_click_outside__WEBPACK_IMPORTED_MODULE_0___default.a + }, + mixins: [_mixins_UserRowMixin__WEBPACK_IMPORTED_MODULE_5__["default"]], + props: { + user: { + type: Object, + required: true + }, + settings: { + type: Object, + default: function _default() { + return {}; + } + }, + groups: { + type: Array, + default: function _default() { + return []; + } + }, + subAdminsGroups: { + type: Array, + default: function _default() { + return []; + } + }, + quotaOptions: { + type: Array, + default: function _default() { + return []; + } + }, + showConfig: { + type: Object, + default: function _default() { + return {}; + } + }, + languages: { + type: Array, + required: true + }, + externalActions: { + type: Array, + default: function _default() { + return []; + } + } + }, + data: function data() { + return { + rand: parseInt(Math.random() * 1000), + openedMenu: false, + feedbackMessage: '', + editing: false, + loading: { + all: false, + displayName: false, + password: false, + mailAddress: false, + groups: false, + subadmins: false, + quota: false, + delete: false, + disable: false, + languages: false, + wipe: false + } + }; + }, + computed: { + /* USER POPOVERMENU ACTIONS */ + userActions: function userActions() { + var actions = [{ + icon: 'icon-delete', + text: t('settings', 'Delete user'), + action: this.deleteUser + }, { + icon: 'icon-delete', + text: t('settings', 'Wipe all devices'), + action: this.wipeUserDevices + }, { + icon: this.user.enabled ? 'icon-close' : 'icon-add', + text: this.user.enabled ? t('settings', 'Disable user') : t('settings', 'Enable user'), + action: this.enableDisableUser + }]; + + if (this.user.email !== null && this.user.email !== '') { + actions.push({ + icon: 'icon-mail', + text: t('settings', 'Resend welcome email'), + action: this.sendWelcomeMail + }); + } + + return actions.concat(this.externalActions); + } + }, + methods: { + /* MENU HANDLING */ + toggleMenu: function toggleMenu() { + this.openedMenu = !this.openedMenu; + }, + hideMenu: function hideMenu() { + this.openedMenu = false; + }, + wipeUserDevices: function wipeUserDevices() { + var _this = this; + + var userid = this.user.id; + OC.dialogs.confirmDestructive(t('settings', 'In case of lost device or exiting the organization, this can remotely wipe the Nextcloud data from all devices associated with {userid}. Only works if the devices are connected to the internet.', { + userid: userid + }), t('settings', 'Remote wipe of devices'), { + type: OC.dialogs.YES_NO_BUTTONS, + confirm: t('settings', 'Wipe {userid}\'s devices', { + userid: userid + }), + confirmClasses: 'error', + cancel: t('settings', 'Cancel') + }, function (result) { + if (result) { + _this.loading.wipe = true; + _this.loading.all = true; + + _this.$store.dispatch('wipeUserDevices', userid).then(function () { + _this.loading.wipe = false; + _this.loading.all = false; + }); + } + }, true); + }, + deleteUser: function deleteUser() { + var _this2 = this; + + var userid = this.user.id; + OC.dialogs.confirmDestructive(t('settings', 'Fully delete {userid}\'s account including all their personal files, app data, etc.', { + userid: userid + }), t('settings', 'Account deletion'), { + type: OC.dialogs.YES_NO_BUTTONS, + confirm: t('settings', 'Delete {userid}\'s account', { + userid: userid + }), + confirmClasses: 'error', + cancel: t('settings', 'Cancel') + }, function (result) { + if (result) { + _this2.loading.delete = true; + _this2.loading.all = true; + return _this2.$store.dispatch('deleteUser', userid).then(function () { + _this2.loading.delete = false; + _this2.loading.all = false; + }); + } + }, true); + }, + enableDisableUser: function enableDisableUser() { + var _this3 = this; + + this.loading.delete = true; + this.loading.all = true; + var userid = this.user.id; + var enabled = !this.user.enabled; + return this.$store.dispatch('enableDisableUser', { + userid: userid, + enabled: enabled + }).then(function () { + _this3.loading.delete = false; + _this3.loading.all = false; + }); + }, + + /** + * Set user displayName + * + * @param {string} displayName The display name + */ + updateDisplayName: function updateDisplayName() { + var _this4 = this; + + var displayName = this.$refs.displayName.value; + this.loading.displayName = true; + this.$store.dispatch('setUserData', { + userid: this.user.id, + key: 'displayname', + value: displayName + }).then(function () { + _this4.loading.displayName = false; + _this4.$refs.displayName.value = displayName; + }); + }, + + /** + * Set user password + * + * @param {string} password The email adress + */ + updatePassword: function updatePassword() { + var _this5 = this; + + var password = this.$refs.password.value; + this.loading.password = true; + this.$store.dispatch('setUserData', { + userid: this.user.id, + key: 'password', + value: password + }).then(function () { + _this5.loading.password = false; + _this5.$refs.password.value = ''; // empty & show placeholder + }); + }, + + /** + * Set user mailAddress + * + * @param {string} mailAddress The email adress + */ + updateEmail: function updateEmail() { + var _this6 = this; + + var mailAddress = this.$refs.mailAddress.value; + this.loading.mailAddress = true; + this.$store.dispatch('setUserData', { + userid: this.user.id, + key: 'email', + value: mailAddress + }).then(function () { + _this6.loading.mailAddress = false; + _this6.$refs.mailAddress.value = mailAddress; + }); + }, + + /** + * Create a new group and add user to it + * + * @param {string} gid Group id + */ + createGroup: function createGroup(gid) { + var userid; + return regeneratorRuntime.async(function createGroup$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + this.loading = { + groups: true, + subadmins: true + }; + _context.prev = 1; + _context.next = 4; + return regeneratorRuntime.awrap(this.$store.dispatch('addGroup', gid)); + + case 4: + userid = this.user.id; + _context.next = 7; + return regeneratorRuntime.awrap(this.$store.dispatch('addUserGroup', { + userid: userid, + gid: gid + })); + + case 7: + _context.next = 12; + break; + + case 9: + _context.prev = 9; + _context.t0 = _context["catch"](1); + console.error(_context.t0); + + case 12: + _context.prev = 12; + this.loading = { + groups: false, + subadmins: false + }; + return _context.finish(12); + + case 15: + return _context.abrupt("return", this.$store.getters.getGroups[this.groups.length]); + + case 16: + case "end": + return _context.stop(); + } + } + }, null, this, [[1, 9, 12, 15]]); + }, + + /** + * Add user to group + * + * @param {object} group Group object + */ + addUserGroup: function addUserGroup(group) { + var userid, gid; + return regeneratorRuntime.async(function addUserGroup$(_context2) { + while (1) { + switch (_context2.prev = _context2.next) { + case 0: + if (!(group.canAdd === false)) { + _context2.next = 2; + break; + } + + return _context2.abrupt("return", false); + + case 2: + this.loading.groups = true; + userid = this.user.id; + gid = group.id; + _context2.prev = 5; + _context2.next = 8; + return regeneratorRuntime.awrap(this.$store.dispatch('addUserGroup', { + userid: userid, + gid: gid + })); + + case 8: + _context2.next = 13; + break; + + case 10: + _context2.prev = 10; + _context2.t0 = _context2["catch"](5); + console.error(_context2.t0); + + case 13: + _context2.prev = 13; + this.loading.groups = false; + return _context2.finish(13); + + case 16: + case "end": + return _context2.stop(); + } + } + }, null, this, [[5, 10, 13, 16]]); + }, + + /** + * Remove user from group + * + * @param {object} group Group object + */ + removeUserGroup: function removeUserGroup(group) { + var userid, gid; + return regeneratorRuntime.async(function removeUserGroup$(_context3) { + while (1) { + switch (_context3.prev = _context3.next) { + case 0: + if (!(group.canRemove === false)) { + _context3.next = 2; + break; + } + + return _context3.abrupt("return", false); + + case 2: + this.loading.groups = true; + userid = this.user.id; + gid = group.id; + _context3.prev = 5; + _context3.next = 8; + return regeneratorRuntime.awrap(this.$store.dispatch('removeUserGroup', { + userid: userid, + gid: gid + })); + + case 8: + this.loading.groups = false; // remove user from current list if current list is the removed group + + if (this.$route.params.selectedGroup === gid) { + this.$store.commit('deleteUser', userid); + } + + _context3.next = 15; + break; + + case 12: + _context3.prev = 12; + _context3.t0 = _context3["catch"](5); + this.loading.groups = false; + + case 15: + case "end": + return _context3.stop(); + } + } + }, null, this, [[5, 12]]); + }, + + /** + * Add user to group + * + * @param {object} group Group object + */ + addUserSubAdmin: function addUserSubAdmin(group) { + var userid, gid; + return regeneratorRuntime.async(function addUserSubAdmin$(_context4) { + while (1) { + switch (_context4.prev = _context4.next) { + case 0: + this.loading.subadmins = true; + userid = this.user.id; + gid = group.id; + _context4.prev = 3; + _context4.next = 6; + return regeneratorRuntime.awrap(this.$store.dispatch('addUserSubAdmin', { + userid: userid, + gid: gid + })); + + case 6: + this.loading.subadmins = false; + _context4.next = 12; + break; + + case 9: + _context4.prev = 9; + _context4.t0 = _context4["catch"](3); + console.error(_context4.t0); + + case 12: + case "end": + return _context4.stop(); + } + } + }, null, this, [[3, 9]]); + }, + + /** + * Remove user from group + * + * @param {object} group Group object + */ + removeUserSubAdmin: function removeUserSubAdmin(group) { + var userid, gid; + return regeneratorRuntime.async(function removeUserSubAdmin$(_context5) { + while (1) { + switch (_context5.prev = _context5.next) { + case 0: + this.loading.subadmins = true; + userid = this.user.id; + gid = group.id; + _context5.prev = 3; + _context5.next = 6; + return regeneratorRuntime.awrap(this.$store.dispatch('removeUserSubAdmin', { + userid: userid, + gid: gid + })); + + case 6: + _context5.next = 11; + break; + + case 8: + _context5.prev = 8; + _context5.t0 = _context5["catch"](3); + console.error(_context5.t0); + + case 11: + _context5.prev = 11; + this.loading.subadmins = false; + return _context5.finish(11); + + case 14: + case "end": + return _context5.stop(); + } + } + }, null, this, [[3, 8, 11, 14]]); + }, + + /** + * Dispatch quota set request + * + * @param {string|Object} quota Quota in readable format '5 GB' or Object {id: '5 GB', label: '5GB'} + * @returns {string} + */ + setUserQuota: function setUserQuota() { + var quota, + _args6 = arguments; + return regeneratorRuntime.async(function setUserQuota$(_context6) { + while (1) { + switch (_context6.prev = _context6.next) { + case 0: + quota = _args6.length > 0 && _args6[0] !== undefined ? _args6[0] : 'none'; + this.loading.quota = true; // ensure we only send the preset id + + quota = quota.id ? quota.id : quota; + _context6.prev = 3; + _context6.next = 6; + return regeneratorRuntime.awrap(this.$store.dispatch('setUserData', { + userid: this.user.id, + key: 'quota', + value: quota + })); + + case 6: + _context6.next = 11; + break; + + case 8: + _context6.prev = 8; + _context6.t0 = _context6["catch"](3); + console.error(_context6.t0); + + case 11: + _context6.prev = 11; + this.loading.quota = false; + return _context6.finish(11); + + case 14: + return _context6.abrupt("return", quota); + + case 15: + case "end": + return _context6.stop(); + } + } + }, null, this, [[3, 8, 11, 14]]); + }, + + /** + * Validate quota string to make sure it's a valid human file size + * + * @param {string} quota Quota in readable format '5 GB' + * @returns {Promise|boolean} + */ + validateQuota: function validateQuota(quota) { + // only used for new presets sent through @Tag + var validQuota = OC.Util.computerFileSize(quota); + + if (validQuota !== null && validQuota >= 0) { + // unify format output + return this.setUserQuota(OC.Util.humanFileSize(OC.Util.computerFileSize(quota))); + } // if no valid do not change + + + return false; + }, + + /** + * Dispatch language set request + * + * @param {Object} lang language object {code:'en', name:'English'} + * @returns {Object} + */ + setUserLanguage: function setUserLanguage(lang) { + return regeneratorRuntime.async(function setUserLanguage$(_context7) { + while (1) { + switch (_context7.prev = _context7.next) { + case 0: + this.loading.languages = true; // ensure we only send the preset id + + _context7.prev = 1; + _context7.next = 4; + return regeneratorRuntime.awrap(this.$store.dispatch('setUserData', { + userid: this.user.id, + key: 'language', + value: lang.code + })); + + case 4: + _context7.next = 9; + break; + + case 6: + _context7.prev = 6; + _context7.t0 = _context7["catch"](1); + console.error(_context7.t0); + + case 9: + _context7.prev = 9; + this.loading.languages = false; + return _context7.finish(9); + + case 12: + return _context7.abrupt("return", lang); + + case 13: + case "end": + return _context7.stop(); + } + } + }, null, this, [[1, 6, 9, 12]]); + }, + + /** + * Dispatch new welcome mail request + */ + sendWelcomeMail: function sendWelcomeMail() { + var _this7 = this; + + this.loading.all = true; + this.$store.dispatch('sendWelcomeMail', this.user.id).then(function (success) { + if (success) { + // Show feedback to indicate the success + _this7.feedbackMessage = t('setting', 'Welcome mail sent!'); + setTimeout(function () { + _this7.feedbackMessage = ''; + }, 2000); + } + + _this7.loading.all = false; + }); + } + } +}); + +/***/ }), + +/***/ "./node_modules/babel-loader/lib/index.js!./node_modules/vue-loader/lib/index.js?!./apps/settings/src/components/UserList/UserRowSimple.vue?vue&type=script&lang=js&": +/*!****************************************************************************************************************************************************************************!*\ + !*** ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./apps/settings/src/components/UserList/UserRowSimple.vue?vue&type=script&lang=js& ***! + \****************************************************************************************************************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var nextcloud_vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! nextcloud-vue */ "./node_modules/nextcloud-vue/dist/ncvuecomponents.js"); +/* harmony import */ var nextcloud_vue__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(nextcloud_vue__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var vue_click_outside__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! vue-click-outside */ "./node_modules/vue-click-outside/index.js"); +/* harmony import */ var vue_click_outside__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(vue_click_outside__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var _nextcloud_auth__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @nextcloud/auth */ "./node_modules/@nextcloud/auth/dist/index.js"); +/* harmony import */ var _nextcloud_auth__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_nextcloud_auth__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var _mixins_UserRowMixin__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../mixins/UserRowMixin */ "./apps/settings/src/mixins/UserRowMixin.js"); +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// + + + + +/* harmony default export */ __webpack_exports__["default"] = ({ + name: 'UserRowSimple', + components: { + PopoverMenu: nextcloud_vue__WEBPACK_IMPORTED_MODULE_0__["PopoverMenu"], + ActionButton: nextcloud_vue__WEBPACK_IMPORTED_MODULE_0__["ActionButton"], + Actions: nextcloud_vue__WEBPACK_IMPORTED_MODULE_0__["Actions"] + }, + directives: { + ClickOutside: vue_click_outside__WEBPACK_IMPORTED_MODULE_1___default.a + }, + mixins: [_mixins_UserRowMixin__WEBPACK_IMPORTED_MODULE_3__["default"]], + props: { + user: { + type: Object, + required: true + }, + loading: { + type: Object, + required: true + }, + showConfig: { + type: Object, + required: true + }, + userActions: { + type: Array, + required: true + }, + openedMenu: { + type: Boolean, + required: true + }, + feedbackMessage: { + type: String, + required: true + }, + subAdminsGroups: { + type: Array, + required: true + }, + settings: { + type: Object, + required: true + } + }, + computed: { + userGroupsLabels: function userGroupsLabels() { + return this.userGroups.map(function (group) { + return group.name; + }).join(', '); + }, + userSubAdminsGroupsLabels: function userSubAdminsGroupsLabels() { + return this.userSubAdminsGroups.map(function (group) { + return group.name; + }).join(', '); + }, + usedSpace: function usedSpace() { + if (this.user.quota.used) { + return t('settings', '{size} used', { + size: OC.Util.humanFileSize(this.user.quota.used) + }); + } + + return t('settings', '{size} used', { + size: OC.Util.humanFileSize(0) + }); + }, + canEdit: function canEdit() { + return Object(_nextcloud_auth__WEBPACK_IMPORTED_MODULE_2__["getCurrentUser"])().uid !== this.user.id && this.user.id !== 'admin'; + } + }, + methods: { + hideMenu: function hideMenu() { + this.$emit('hideMenu'); + }, + toggleEdit: function toggleEdit() { + this.$emit('update:editing', true); + } + } +}); + +/***/ }), + +/***/ "./node_modules/babel-loader/lib/index.js!./node_modules/vue-loader/lib/index.js?!./apps/settings/src/views/Users.vue?vue&type=script&lang=js&": +/*!******************************************************************************************************************************************************!*\ + !*** ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./apps/settings/src/views/Users.vue?vue&type=script&lang=js& ***! + \******************************************************************************************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue */ "./node_modules/vue/dist/vue.runtime.esm.js"); +/* harmony import */ var vue_localstorage__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! vue-localstorage */ "./node_modules/vue-localstorage/dist/vue-local-storage.js"); +/* harmony import */ var vue_localstorage__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(vue_localstorage__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var nextcloud_vue__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! nextcloud-vue */ "./node_modules/nextcloud-vue/dist/ncvuecomponents.js"); +/* harmony import */ var nextcloud_vue__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(nextcloud_vue__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var _components_UserList__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../components/UserList */ "./apps/settings/src/components/UserList.vue"); +function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } + +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// + + + + +vue__WEBPACK_IMPORTED_MODULE_0__["default"].use(vue_localstorage__WEBPACK_IMPORTED_MODULE_1___default.a); +/* harmony default export */ __webpack_exports__["default"] = ({ + name: 'Users', + components: { + AppContent: nextcloud_vue__WEBPACK_IMPORTED_MODULE_2__["AppContent"], + AppNavigation: nextcloud_vue__WEBPACK_IMPORTED_MODULE_2__["AppNavigation"], + AppNavigationItem: nextcloud_vue__WEBPACK_IMPORTED_MODULE_2__["AppNavigationItem"], + AppNavigationNew: nextcloud_vue__WEBPACK_IMPORTED_MODULE_2__["AppNavigationNew"], + AppNavigationSettings: nextcloud_vue__WEBPACK_IMPORTED_MODULE_2__["AppNavigationSettings"], + Content: nextcloud_vue__WEBPACK_IMPORTED_MODULE_2__["Content"], + UserList: _components_UserList__WEBPACK_IMPORTED_MODULE_3__["default"], + Multiselect: nextcloud_vue__WEBPACK_IMPORTED_MODULE_2__["Multiselect"] + }, + props: { + selectedGroup: { + type: String, + default: null + } + }, + data: function data() { + return { + // default quota is set to unlimited + unlimitedQuota: { + id: 'none', + label: t('settings', 'Unlimited') + }, + // temporary value used for multiselect change + selectedQuota: false, + externalActions: [], + showAddGroupEntry: false, + loadingAddGroup: false, + showConfig: { + showStoragePath: false, + showUserBackend: false, + showLastLogin: false, + showNewUserForm: false, + showLanguages: false + } + }; + }, + computed: { + users: function users() { + return this.$store.getters.getUsers; + }, + usersOffset: function usersOffset() { + return this.$store.getters.getUsersOffset; + }, + usersLimit: function usersLimit() { + return this.$store.getters.getUsersLimit; + }, + // Local settings + showLanguages: { + get: function get() { + return this.getLocalstorage('showLanguages'); + }, + set: function set(status) { + this.setLocalStorage('showLanguages', status); + } + }, + showLastLogin: { + get: function get() { + return this.getLocalstorage('showLastLogin'); + }, + set: function set(status) { + this.setLocalStorage('showLastLogin', status); + } + }, + showUserBackend: { + get: function get() { + return this.getLocalstorage('showUserBackend'); + }, + set: function set(status) { + this.setLocalStorage('showUserBackend', status); + } + }, + showStoragePath: { + get: function get() { + return this.getLocalstorage('showStoragePath'); + }, + set: function set(status) { + this.setLocalStorage('showStoragePath', status); + } + }, + userCount: function userCount() { + return this.$store.getters.getUserCount; + }, + settings: function settings() { + return this.$store.getters.getServerData; + }, + // default quota + quotaOptions: function quotaOptions() { + // convert the preset array into objects + var quotaPreset = this.settings.quotaPreset.reduce(function (acc, cur) { + return acc.concat({ + id: cur, + label: cur + }); + }, []); // add default presets + + quotaPreset.unshift(this.unlimitedQuota); + return quotaPreset; + }, + // mapping saved values to objects + defaultQuota: { + get: function get() { + if (this.selectedQuota !== false) { + return this.selectedQuota; + } + + if (this.settings.defaultQuota !== this.unlimitedQuota.id && OC.Util.computerFileSize(this.settings.defaultQuota) >= 0) { + // if value is valid, let's map the quotaOptions or return custom quota + return { + id: this.settings.defaultQuota, + label: this.settings.defaultQuota + }; + } + + return this.unlimitedQuota; // unlimited + }, + set: function set(quota) { + this.selectedQuota = quota; + } + }, + // BUILD APP NAVIGATION MENU OBJECT + menu: function menu() { + var _this = this; + + // Data provided php side + var self = this; + var groups = this.$store.getters.getGroups; + groups = Array.isArray(groups) ? groups : []; // Map groups + + groups = groups.map(function (group) { + var item = {}; + item.id = group.id.replace(' ', '_'); + item.key = item.id; + item.utils = {}; // router link to + + item.router = { + name: 'group', + params: { + selectedGroup: group.id + } + }; // group name + + item.text = group.name; + item.title = group.name; // users count for all groups + + if (group.usercount - group.disabled > 0 || group.usercount === -1) { + item.utils.counter = group.usercount - group.disabled; + } + + if (item.id !== 'admin' && item.id !== 'disabled' && _this.settings.isAdmin) { + // add delete button on real groups + item.utils.actions = [{ + icon: 'icon-delete', + text: t('settings', 'Remove group'), + action: function action() { + self.removeGroup(group.id); + } + }]; + } + + return item; + }); // Every item is added on top of the array, so we're going backward + // Groups, separator, disabled, admin, everyone + // Add separator + + var realGroups = groups.find(function (group) { + return group.id !== 'disabled' && group.id !== 'admin'; + }); + realGroups = typeof realGroups === 'undefined' ? [] : realGroups; + realGroups = Array.isArray(realGroups) ? realGroups : [realGroups]; + + if (realGroups.length > 0) { + var separator = { + caption: true, + text: t('settings', 'Groups') + }; + groups.unshift(separator); + } // Adjust admin and disabled groups + + + var adminGroup = groups.find(function (group) { + return group.id === 'admin'; + }); + var disabledGroup = groups.find(function (group) { + return group.id === 'disabled'; + }); // filter out admin and disabled + + groups = groups.filter(function (group) { + return ['admin', 'disabled'].indexOf(group.id) === -1; + }); + + if (adminGroup && adminGroup.text) { + adminGroup.text = t('settings', 'Admins'); // rename admin group + + adminGroup.icon = 'icon-user-admin'; // set icon + + groups.unshift(adminGroup); // add admin group if present + } + + if (disabledGroup && disabledGroup.text) { + disabledGroup.text = t('settings', 'Disabled users'); // rename disabled group + + disabledGroup.icon = 'icon-disabled-users'; // set icon + + if (disabledGroup.utils && (disabledGroup.utils.counter > 0 // add disabled if not empty + || disabledGroup.utils.counter === -1) // add disabled if ldap enabled + ) { + groups.unshift(disabledGroup); + + if (disabledGroup.utils.counter === -1) { + // hides the counter instead of showing -1 + delete disabledGroup.utils.counter; + } + } + } // Add everyone group + + + var everyoneGroup = { + id: 'everyone', + key: 'everyone', + icon: 'icon-contacts-dark', + router: { + name: 'users' + }, + text: t('settings', 'Everyone') + }; // users count + + if (this.userCount > 0) { + vue__WEBPACK_IMPORTED_MODULE_0__["default"].set(everyoneGroup, 'utils', { + counter: this.userCount + }); + } + + groups.unshift(everyoneGroup); + var addGroup = { + id: 'addgroup', + key: 'addgroup', + icon: 'icon-add', + text: t('settings', 'Add group'), + classes: this.loadingAddGroup ? 'icon-loading-small' : '' + }; + + if (this.showAddGroupEntry) { + vue__WEBPACK_IMPORTED_MODULE_0__["default"].set(addGroup, 'edit', { + text: t('settings', 'Add group'), + action: this.createGroup, + reset: function reset() { + self.showAddGroupEntry = false; + } + }); + addGroup.classes = 'editing'; + } else { + vue__WEBPACK_IMPORTED_MODULE_0__["default"].set(addGroup, 'action', function () { + self.showAddGroupEntry = true; // focus input + + vue__WEBPACK_IMPORTED_MODULE_0__["default"].nextTick(function () { + window.addgroup.querySelector('form > input[type="text"]').focus(); + }); + }); + } + + groups.unshift(addGroup); + return groups; + } + }, + beforeMount: function beforeMount() { + this.$store.commit('initGroups', { + groups: this.$store.getters.getServerData.groups, + orderBy: this.$store.getters.getServerData.sortGroups, + userCount: this.$store.getters.getServerData.userCount + }); + this.$store.dispatch('getPasswordPolicyMinLength'); + }, + created: function created() { + // init the OCA.Settings.UserList object + // and add the registerAction method + Object.assign(OCA, { + Settings: { + UserList: { + registerAction: this.registerAction + } + } + }); + }, + methods: { + toggleNewUserMenu: function toggleNewUserMenu() { + this.showConfig.showNewUserForm = !this.showConfig.showNewUserForm; + + if (this.showConfig.showNewUserForm) { + vue__WEBPACK_IMPORTED_MODULE_0__["default"].nextTick(function () { + window.newusername.focus(); + }); + } + }, + getLocalstorage: function getLocalstorage(key) { + // force initialization + var localConfig = this.$localStorage.get(key); // if localstorage is null, fallback to original values + + this.showConfig[key] = localConfig !== null ? localConfig === 'true' : this.showConfig[key]; + return this.showConfig[key]; + }, + setLocalStorage: function setLocalStorage(key, status) { + this.showConfig[key] = status; + this.$localStorage.set(key, status); + return status; + }, + removeGroup: function removeGroup(groupid) { + var self = this; // TODO migrate to a vue js confirm dialog component + + OC.dialogs.confirm(t('settings', 'You are about to remove the group {group}. The users will NOT be deleted.', { + group: groupid + }), t('settings', 'Please confirm the group removal '), function (success) { + if (success) { + self.$store.dispatch('removeGroup', groupid); + } + }); + }, + + /** + * Dispatch default quota set request + * + * @param {string|Object} quota Quota in readable format '5 GB' or Object {id: '5 GB', label: '5GB'} + */ + setDefaultQuota: function setDefaultQuota() { + var _this2 = this; + + var quota = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'none'; + this.$store.dispatch('setAppConfig', { + app: 'files', + key: 'default_quota', + // ensure we only send the preset id + value: quota.id ? quota.id : quota + }).then(function () { + if (_typeof(quota) !== 'object') { + quota = { + id: quota, + label: quota + }; + } + + _this2.defaultQuota = quota; + }); + }, + + /** + * Validate quota string to make sure it's a valid human file size + * + * @param {string} quota Quota in readable format '5 GB' + * @returns {Promise|boolean} + */ + validateQuota: function validateQuota(quota) { + // only used for new presets sent through @Tag + var validQuota = OC.Util.computerFileSize(quota); + + if (validQuota === null) { + return this.setDefaultQuota('none'); + } else { + // unify format output + return this.setDefaultQuota(OC.Util.humanFileSize(OC.Util.computerFileSize(quota))); + } + }, + + /** + * Register a new action for the user menu + * + * @param {string} icon the icon class + * @param {string} text the text to display + * @param {Function} action the function to run + * @returns {Array} + */ + registerAction: function registerAction(icon, text, action) { + this.externalActions.push({ + icon: icon, + text: text, + action: action + }); + return this.externalActions; + }, + + /** + * Create a new group + * + * @param {Object} event The form submit event + */ + createGroup: function createGroup(event) { + var _this3 = this; + + var gid = event.target[0].value; + this.loadingAddGroup = true; + this.$store.dispatch('addGroup', gid).then(function () { + _this3.showAddGroupEntry = false; + _this3.loadingAddGroup = false; + + _this3.$router.push({ + name: 'group', + params: { + selectedGroup: gid + } + }); + }).catch(function () { + _this3.loadingAddGroup = false; + }); + } + } +}); + +/***/ }), + +/***/ "./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/vue-loader/lib/index.js?!./apps/settings/src/components/UserList.vue?vue&type=template&id=6cba3aca&": +/*!****************************************************************************************************************************************************************************************************************!*\ + !*** ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./apps/settings/src/components/UserList.vue?vue&type=template&id=6cba3aca& ***! + \****************************************************************************************************************************************************************************************************************/ +/*! exports provided: render, staticRenderFns */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "render", function() { return render; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "staticRenderFns", function() { return staticRenderFns; }); +var render = function() { + var _vm = this + var _h = _vm.$createElement + var _c = _vm._self._c || _h + return _c( + "div", + { + staticClass: "user-list-grid", + attrs: { id: "app-content" }, + on: { + "&scroll": function($event) { + return _vm.onScroll($event) + } + } + }, + [ + _c( + "div", + { + staticClass: "row", + class: { sticky: _vm.scrolled && !_vm.showConfig.showNewUserForm }, + attrs: { id: "grid-header" } + }, + [ + _c("div", { staticClass: "avatar", attrs: { id: "headerAvatar" } }), + _vm._v(" "), + _c("div", { staticClass: "name", attrs: { id: "headerName" } }, [ + _vm._v( + "\n\t\t\t" + _vm._s(_vm.t("settings", "Username")) + "\n\n\t\t\t" + ), + _c("div", { staticClass: "subtitle" }, [ + _vm._v( + "\n\t\t\t\t" + + _vm._s(_vm.t("settings", "Display name")) + + "\n\t\t\t" + ) + ]) + ]), + _vm._v(" "), + _c( + "div", + { staticClass: "password", attrs: { id: "headerPassword" } }, + [ + _vm._v( + "\n\t\t\t" + _vm._s(_vm.t("settings", "Password")) + "\n\t\t" + ) + ] + ), + _vm._v(" "), + _c( + "div", + { staticClass: "mailAddress", attrs: { id: "headerAddress" } }, + [_vm._v("\n\t\t\t" + _vm._s(_vm.t("settings", "Email")) + "\n\t\t")] + ), + _vm._v(" "), + _c("div", { staticClass: "groups", attrs: { id: "headerGroups" } }, [ + _vm._v("\n\t\t\t" + _vm._s(_vm.t("settings", "Groups")) + "\n\t\t") + ]), + _vm._v(" "), + _vm.subAdminsGroups.length > 0 && _vm.settings.isAdmin + ? _c( + "div", + { staticClass: "subadmins", attrs: { id: "headerSubAdmins" } }, + [ + _vm._v( + "\n\t\t\t" + + _vm._s(_vm.t("settings", "Group admin for")) + + "\n\t\t" + ) + ] + ) + : _vm._e(), + _vm._v(" "), + _c("div", { staticClass: "quota", attrs: { id: "headerQuota" } }, [ + _vm._v("\n\t\t\t" + _vm._s(_vm.t("settings", "Quota")) + "\n\t\t") + ]), + _vm._v(" "), + _vm.showConfig.showLanguages + ? _c( + "div", + { staticClass: "languages", attrs: { id: "headerLanguages" } }, + [ + _vm._v( + "\n\t\t\t" + + _vm._s(_vm.t("settings", "Language")) + + "\n\t\t" + ) + ] + ) + : _vm._e(), + _vm._v(" "), + _vm.showConfig.showUserBackend || _vm.showConfig.showStoragePath + ? _c("div", { staticClass: "headerUserBackend userBackend" }, [ + _vm.showConfig.showUserBackend + ? _c("div", { staticClass: "userBackend" }, [ + _vm._v( + "\n\t\t\t\t" + + _vm._s(_vm.t("settings", "User backend")) + + "\n\t\t\t" + ) + ]) + : _vm._e(), + _vm._v(" "), + _vm.showConfig.showStoragePath + ? _c("div", { staticClass: "subtitle storageLocation" }, [ + _vm._v( + "\n\t\t\t\t" + + _vm._s(_vm.t("settings", "Storage location")) + + "\n\t\t\t" + ) + ]) + : _vm._e() + ]) + : _vm._e(), + _vm._v(" "), + _vm.showConfig.showLastLogin + ? _c("div", { staticClass: "headerLastLogin lastLogin" }, [ + _vm._v( + "\n\t\t\t" + + _vm._s(_vm.t("settings", "Last login")) + + "\n\t\t" + ) + ]) + : _vm._e(), + _vm._v(" "), + _c("div", { staticClass: "userActions" }) + ] + ), + _vm._v(" "), + _c( + "form", + { + directives: [ + { + name: "show", + rawName: "v-show", + value: _vm.showConfig.showNewUserForm, + expression: "showConfig.showNewUserForm" + } + ], + staticClass: "row", + class: { sticky: _vm.scrolled && _vm.showConfig.showNewUserForm }, + attrs: { id: "new-user", disabled: _vm.loading.all }, + on: { + submit: function($event) { + $event.preventDefault() + return _vm.createUser($event) + } + } + }, + [ + _c("div", { + class: _vm.loading.all ? "icon-loading-small" : "icon-add" + }), + _vm._v(" "), + _c("div", { staticClass: "name" }, [ + _c("input", { + directives: [ + { + name: "model", + rawName: "v-model", + value: _vm.newUser.id, + expression: "newUser.id" + } + ], + ref: "newusername", + attrs: { + id: "newusername", + disabled: _vm.settings.newUserGenerateUserID, + placeholder: _vm.settings.newUserGenerateUserID + ? _vm.t("settings", "Will be autogenerated") + : _vm.t("settings", "Username"), + autocapitalize: "none", + autocomplete: "off", + autocorrect: "off", + name: "username", + pattern: "[a-zA-Z0-9 _\\.@\\-']+", + required: "", + type: "text" + }, + domProps: { value: _vm.newUser.id }, + on: { + input: function($event) { + if ($event.target.composing) { + return + } + _vm.$set(_vm.newUser, "id", $event.target.value) + } + } + }) + ]), + _vm._v(" "), + _c("div", { staticClass: "displayName" }, [ + _c("input", { + directives: [ + { + name: "model", + rawName: "v-model", + value: _vm.newUser.displayName, + expression: "newUser.displayName" + } + ], + attrs: { + id: "newdisplayname", + placeholder: _vm.t("settings", "Display name"), + autocapitalize: "none", + autocomplete: "off", + autocorrect: "off", + name: "displayname", + type: "text" + }, + domProps: { value: _vm.newUser.displayName }, + on: { + input: function($event) { + if ($event.target.composing) { + return + } + _vm.$set(_vm.newUser, "displayName", $event.target.value) + } + } + }) + ]), + _vm._v(" "), + _c("div", { staticClass: "password" }, [ + _c("input", { + directives: [ + { + name: "model", + rawName: "v-model", + value: _vm.newUser.password, + expression: "newUser.password" + } + ], + ref: "newuserpassword", + attrs: { + id: "newuserpassword", + minlength: _vm.minPasswordLength, + placeholder: _vm.t("settings", "Password"), + required: _vm.newUser.mailAddress === "", + autocapitalize: "none", + autocomplete: "new-password", + autocorrect: "off", + name: "password", + type: "password" + }, + domProps: { value: _vm.newUser.password }, + on: { + input: function($event) { + if ($event.target.composing) { + return + } + _vm.$set(_vm.newUser, "password", $event.target.value) + } + } + }) + ]), + _vm._v(" "), + _c("div", { staticClass: "mailAddress" }, [ + _c("input", { + directives: [ + { + name: "model", + rawName: "v-model", + value: _vm.newUser.mailAddress, + expression: "newUser.mailAddress" + } + ], + attrs: { + id: "newemail", + placeholder: _vm.t("settings", "Email"), + required: + _vm.newUser.password === "" || + _vm.settings.newUserRequireEmail, + autocapitalize: "none", + autocomplete: "off", + autocorrect: "off", + name: "email", + type: "email" + }, + domProps: { value: _vm.newUser.mailAddress }, + on: { + input: function($event) { + if ($event.target.composing) { + return + } + _vm.$set(_vm.newUser, "mailAddress", $event.target.value) + } + } + }) + ]), + _vm._v(" "), + _c( + "div", + { staticClass: "groups" }, + [ + !_vm.settings.isAdmin + ? _c("input", { + class: { "icon-loading-small": _vm.loading.groups }, + attrs: { + id: "newgroups", + required: !_vm.settings.isAdmin, + tabindex: "-1", + type: "text" + }, + domProps: { value: _vm.newUser.groups } + }) + : _vm._e(), + _vm._v(" "), + _c( + "Multiselect", + { + staticClass: "multiselect-vue", + attrs: { + "close-on-select": false, + disabled: _vm.loading.groups || _vm.loading.all, + multiple: true, + options: _vm.canAddGroups, + placeholder: _vm.t("settings", "Add user in group"), + "tag-width": 60, + taggable: true, + label: "name", + "tag-placeholder": "create", + "track-by": "id" + }, + on: { tag: _vm.createGroup }, + model: { + value: _vm.newUser.groups, + callback: function($$v) { + _vm.$set(_vm.newUser, "groups", $$v) + }, + expression: "newUser.groups" + } + }, + [ + _c( + "span", + { attrs: { slot: "noResult" }, slot: "noResult" }, + [_vm._v(_vm._s(_vm.t("settings", "No results")))] + ) + ] + ) + ], + 1 + ), + _vm._v(" "), + _vm.subAdminsGroups.length > 0 && _vm.settings.isAdmin + ? _c( + "div", + { staticClass: "subadmins" }, + [ + _c( + "Multiselect", + { + staticClass: "multiselect-vue", + attrs: { + "close-on-select": false, + multiple: true, + options: _vm.subAdminsGroups, + placeholder: _vm.t("settings", "Set user as admin for"), + "tag-width": 60, + label: "name", + "track-by": "id" + }, + model: { + value: _vm.newUser.subAdminsGroups, + callback: function($$v) { + _vm.$set(_vm.newUser, "subAdminsGroups", $$v) + }, + expression: "newUser.subAdminsGroups" + } + }, + [ + _c( + "span", + { attrs: { slot: "noResult" }, slot: "noResult" }, + [_vm._v(_vm._s(_vm.t("settings", "No results")))] + ) + ] + ) + ], + 1 + ) + : _vm._e(), + _vm._v(" "), + _c( + "div", + { staticClass: "quota" }, + [ + _c("Multiselect", { + staticClass: "multiselect-vue", + attrs: { + "allow-empty": false, + options: _vm.quotaOptions, + placeholder: _vm.t("settings", "Select user quota"), + taggable: true, + label: "label", + "track-by": "id" + }, + on: { tag: _vm.validateQuota }, + model: { + value: _vm.newUser.quota, + callback: function($$v) { + _vm.$set(_vm.newUser, "quota", $$v) + }, + expression: "newUser.quota" + } + }) + ], + 1 + ), + _vm._v(" "), + _vm.showConfig.showLanguages + ? _c( + "div", + { staticClass: "languages" }, + [ + _c("Multiselect", { + staticClass: "multiselect-vue", + attrs: { + "allow-empty": false, + options: _vm.languages, + placeholder: _vm.t("settings", "Default language"), + "group-label": "label", + "group-values": "languages", + label: "name", + "track-by": "code" + }, + model: { + value: _vm.newUser.language, + callback: function($$v) { + _vm.$set(_vm.newUser, "language", $$v) + }, + expression: "newUser.language" + } + }) + ], + 1 + ) + : _vm._e(), + _vm._v(" "), + _vm.showConfig.showStoragePath + ? _c("div", { staticClass: "storageLocation" }) + : _vm._e(), + _vm._v(" "), + _vm.showConfig.showUserBackend + ? _c("div", { staticClass: "userBackend" }) + : _vm._e(), + _vm._v(" "), + _vm.showConfig.showLastLogin + ? _c("div", { staticClass: "lastLogin" }) + : _vm._e(), + _vm._v(" "), + _c("div", { staticClass: "userActions" }, [ + _c("input", { + staticClass: "button primary icon-checkmark-white has-tooltip", + attrs: { + id: "newsubmit", + title: _vm.t("settings", "Add a new user"), + type: "submit", + value: "" + } + }) + ]) + ] + ), + _vm._v(" "), + _vm._l(_vm.filteredUsers, function(user, key) { + return _c("user-row", { + key: key, + attrs: { + "external-actions": _vm.externalActions, + groups: _vm.groups, + languages: _vm.languages, + "quota-options": _vm.quotaOptions, + settings: _vm.settings, + "show-config": _vm.showConfig, + "sub-admins-groups": _vm.subAdminsGroups, + user: user + } + }) + }), + _vm._v(" "), + _c( + "InfiniteLoading", + { ref: "infiniteLoading", on: { infinite: _vm.infiniteHandler } }, + [ + _c("div", { attrs: { slot: "spinner" }, slot: "spinner" }, [ + _c("div", { staticClass: "users-icon-loading icon-loading" }) + ]), + _vm._v(" "), + _c("div", { attrs: { slot: "no-more" }, slot: "no-more" }, [ + _c("div", { staticClass: "users-list-end" }) + ]), + _vm._v(" "), + _c("div", { attrs: { slot: "no-results" }, slot: "no-results" }, [ + _c("div", { attrs: { id: "emptycontent" } }, [ + _c("div", { staticClass: "icon-contacts-dark" }), + _vm._v(" "), + _c("h2", [_vm._v(_vm._s(_vm.t("settings", "No users in here")))]) + ]) + ]) + ] + ) + ], + 2 + ) +} +var staticRenderFns = [] +render._withStripped = true + + + +/***/ }), + +/***/ "./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/vue-loader/lib/index.js?!./apps/settings/src/components/UserList/UserRow.vue?vue&type=template&id=77960baa&": +/*!************************************************************************************************************************************************************************************************************************!*\ + !*** ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./apps/settings/src/components/UserList/UserRow.vue?vue&type=template&id=77960baa& ***! + \************************************************************************************************************************************************************************************************************************/ +/*! exports provided: render, staticRenderFns */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "render", function() { return render; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "staticRenderFns", function() { return staticRenderFns; }); +var render = function() { + var _vm = this + var _h = _vm.$createElement + var _c = _vm._self._c || _h + return Object.keys(_vm.user).length === 1 + ? _c("div", { staticClass: "row", attrs: { "data-id": _vm.user.id } }, [ + _c( + "div", + { + staticClass: "avatar", + class: { + "icon-loading-small": + _vm.loading.delete || _vm.loading.disable || _vm.loading.wipe + } + }, + [ + !_vm.loading.delete && !_vm.loading.disable && !_vm.loading.wipe + ? _c("img", { + attrs: { + src: _vm.generateAvatar(_vm.user.id, 32), + srcset: + _vm.generateAvatar(_vm.user.id, 64) + + " 2x, " + + _vm.generateAvatar(_vm.user.id, 128) + + " 4x", + alt: "", + height: "32", + width: "32" + } + }) + : _vm._e() + ] + ), + _vm._v(" "), + _c("div", { staticClass: "name" }, [ + _vm._v("\n\t\t" + _vm._s(_vm.user.id) + "\n\t") + ]), + _vm._v(" "), + _c("div", { staticClass: "obfuscated" }, [ + _vm._v( + "\n\t\t" + + _vm._s( + _vm.t( + "settings", + "You do not have permissions to see the details of this user" + ) + ) + + "\n\t" + ) + ]) + ]) + : !_vm.editing + ? _c("UserRowSimple", { + attrs: { + editing: _vm.editing, + "feedback-message": _vm.feedbackMessage, + groups: _vm.groups, + languages: _vm.languages, + loading: _vm.loading, + "opened-menu": _vm.openedMenu, + settings: _vm.settings, + "show-config": _vm.showConfig, + "sub-admins-groups": _vm.subAdminsGroups, + "user-actions": _vm.userActions, + user: _vm.user + }, + on: { + "update:editing": function($event) { + _vm.editing = $event + }, + hideMenu: _vm.hideMenu, + toggleMenu: _vm.toggleMenu + } + }) + : _c( + "div", + { + staticClass: "row row--editable", + class: { disabled: _vm.loading.delete || _vm.loading.disable }, + attrs: { "data-id": _vm.user.id } + }, + [ + _c( + "div", + { + staticClass: "avatar", + class: { + "icon-loading-small": + _vm.loading.delete || _vm.loading.disable || _vm.loading.wipe + } + }, + [ + !_vm.loading.delete && !_vm.loading.disable && !_vm.loading.wipe + ? _c("img", { + attrs: { + src: _vm.generateAvatar(_vm.user.id, 32), + srcset: + _vm.generateAvatar(_vm.user.id, 64) + + " 2x, " + + _vm.generateAvatar(_vm.user.id, 128) + + " 4x", + alt: "", + height: "32", + width: "32" + } + }) + : _vm._e() + ] + ), + _vm._v(" "), + _c("div", { staticClass: "displayName" }, [ + _c( + "form", + { + staticClass: "displayName", + class: { "icon-loading-small": _vm.loading.displayName }, + on: { + submit: function($event) { + $event.preventDefault() + return _vm.updateDisplayName($event) + } + } + }, + [ + _vm.user.backendCapabilities.setDisplayName + ? [ + _vm.user.backendCapabilities.setDisplayName + ? _c("input", { + ref: "displayName", + attrs: { + id: "displayName" + _vm.user.id + _vm.rand, + disabled: + _vm.loading.displayName || _vm.loading.all, + autocapitalize: "off", + autocomplete: "new-password", + autocorrect: "off", + spellcheck: "false", + type: "text" + }, + domProps: { value: _vm.user.displayname } + }) + : _vm._e(), + _vm._v(" "), + _vm.user.backendCapabilities.setDisplayName + ? _c("input", { + staticClass: "icon-confirm", + attrs: { type: "submit", value: "" } + }) + : _vm._e() + ] + : _c("div", { + directives: [ + { + name: "tooltip", + rawName: "v-tooltip.auto", + value: _vm.t( + "settings", + "The backend does not support changing the display name" + ), + expression: + "t('settings', 'The backend does not support changing the display name')", + modifiers: { auto: true } + } + ], + staticClass: "name" + }) + ], + 2 + ) + ]), + _vm._v(" "), + _vm.settings.canChangePassword && + _vm.user.backendCapabilities.setPassword + ? _c( + "form", + { + staticClass: "password", + class: { "icon-loading-small": _vm.loading.password }, + on: { + submit: function($event) { + $event.preventDefault() + return _vm.updatePassword($event) + } + } + }, + [ + _c("input", { + ref: "password", + attrs: { + id: "password" + _vm.user.id + _vm.rand, + disabled: _vm.loading.password || _vm.loading.all, + minlength: _vm.minPasswordLength, + placeholder: _vm.t("settings", "Add new password"), + autocapitalize: "off", + autocomplete: "new-password", + autocorrect: "off", + required: "", + spellcheck: "false", + type: "password", + value: "" + } + }), + _vm._v(" "), + _c("input", { + staticClass: "icon-confirm", + attrs: { type: "submit", value: "" } + }) + ] + ) + : _c("div"), + _vm._v(" "), + _c( + "form", + { + staticClass: "mailAddress", + class: { "icon-loading-small": _vm.loading.mailAddress }, + on: { + submit: function($event) { + $event.preventDefault() + return _vm.updateEmail($event) + } + } + }, + [ + _c("input", { + ref: "mailAddress", + attrs: { + id: "mailAddress" + _vm.user.id + _vm.rand, + disabled: _vm.loading.mailAddress || _vm.loading.all, + placeholder: _vm.t("settings", "Add new email address"), + autocapitalize: "off", + autocomplete: "new-password", + autocorrect: "off", + spellcheck: "false", + type: "email" + }, + domProps: { value: _vm.user.email } + }), + _vm._v(" "), + _c("input", { + staticClass: "icon-confirm", + attrs: { type: "submit", value: "" } + }) + ] + ), + _vm._v(" "), + _c( + "div", + { + staticClass: "groups", + class: { "icon-loading-small": _vm.loading.groups } + }, + [ + _c( + "Multiselect", + { + staticClass: "multiselect-vue", + attrs: { + "close-on-select": false, + disabled: _vm.loading.groups || _vm.loading.all, + limit: 2, + multiple: true, + options: _vm.availableGroups, + placeholder: _vm.t("settings", "Add user in group"), + "tag-width": 60, + taggable: _vm.settings.isAdmin, + value: _vm.userGroups, + label: "name", + "tag-placeholder": "create", + "track-by": "id" + }, + on: { + remove: _vm.removeUserGroup, + select: _vm.addUserGroup, + tag: _vm.createGroup + } + }, + [ + _c( + "span", + { attrs: { slot: "noResult" }, slot: "noResult" }, + [_vm._v(_vm._s(_vm.t("settings", "No results")))] + ) + ] + ) + ], + 1 + ), + _vm._v(" "), + _vm.subAdminsGroups.length > 0 && _vm.settings.isAdmin + ? _c( + "div", + { + staticClass: "subadmins", + class: { "icon-loading-small": _vm.loading.subadmins } + }, + [ + _c( + "Multiselect", + { + staticClass: "multiselect-vue", + attrs: { + "close-on-select": false, + disabled: _vm.loading.subadmins || _vm.loading.all, + limit: 2, + multiple: true, + options: _vm.subAdminsGroups, + placeholder: _vm.t("settings", "Set user as admin for"), + "tag-width": 60, + value: _vm.userSubAdminsGroups, + label: "name", + "track-by": "id" + }, + on: { + remove: _vm.removeUserSubAdmin, + select: _vm.addUserSubAdmin + } + }, + [ + _c( + "span", + { attrs: { slot: "noResult" }, slot: "noResult" }, + [_vm._v(_vm._s(_vm.t("settings", "No results")))] + ) + ] + ) + ], + 1 + ) + : _vm._e(), + _vm._v(" "), + _c( + "div", + { + directives: [ + { + name: "tooltip", + rawName: "v-tooltip.auto", + value: _vm.usedSpace, + expression: "usedSpace", + modifiers: { auto: true } + } + ], + staticClass: "quota", + class: { "icon-loading-small": _vm.loading.quota } + }, + [ + _c("Multiselect", { + staticClass: "multiselect-vue", + attrs: { + "allow-empty": false, + disabled: _vm.loading.quota || _vm.loading.all, + options: _vm.quotaOptions, + placeholder: _vm.t("settings", "Select user quota"), + taggable: true, + value: _vm.userQuota, + label: "label", + "tag-placeholder": "create", + "track-by": "id" + }, + on: { input: _vm.setUserQuota, tag: _vm.validateQuota } + }) + ], + 1 + ), + _vm._v(" "), + _vm.showConfig.showLanguages + ? _c( + "div", + { + staticClass: "languages", + class: { "icon-loading-small": _vm.loading.languages } + }, + [ + _c("Multiselect", { + staticClass: "multiselect-vue", + attrs: { + "allow-empty": false, + disabled: _vm.loading.languages || _vm.loading.all, + options: _vm.languages, + placeholder: _vm.t("settings", "No language set"), + value: _vm.userLanguage, + "group-label": "label", + "group-values": "languages", + label: "name", + "track-by": "code" + }, + on: { input: _vm.setUserLanguage } + }) + ], + 1 + ) + : _vm._e(), + _vm._v(" "), + _vm.showConfig.showStoragePath || _vm.showConfig.showUserBackend + ? _c("div", { staticClass: "storageLocation" }) + : _vm._e(), + _vm._v(" "), + _vm.showConfig.showLastLogin ? _c("div") : _vm._e(), + _vm._v(" "), + _c("div", { staticClass: "userActions" }, [ + _vm.OC.currentUser !== _vm.user.id && + _vm.user.id !== "admin" && + !_vm.loading.all + ? _c( + "div", + { staticClass: "toggleUserActions" }, + [ + _c( + "Actions", + [ + _c( + "ActionButton", + { + attrs: { icon: "icon-checkmark" }, + on: { + click: function($event) { + _vm.editing = false + } + } + }, + [ + _vm._v( + "\n\t\t\t\t\t" + + _vm._s(_vm.t("settings", "Done")) + + "\n\t\t\t\t" + ) + ] + ) + ], + 1 + ), + _vm._v(" "), + _c("div", { + directives: [ + { + name: "click-outside", + rawName: "v-click-outside", + value: _vm.hideMenu, + expression: "hideMenu" + } + ], + staticClass: "icon-more", + on: { click: _vm.toggleMenu } + }), + _vm._v(" "), + _c( + "div", + { + staticClass: "popovermenu", + class: { open: _vm.openedMenu } + }, + [_c("PopoverMenu", { attrs: { menu: _vm.userActions } })], + 1 + ) + ], + 1 + ) + : _vm._e(), + _vm._v(" "), + _c( + "div", + { + staticClass: "feedback", + style: { opacity: _vm.feedbackMessage !== "" ? 1 : 0 } + }, + [ + _c("div", { staticClass: "icon-checkmark" }), + _vm._v("\n\t\t\t" + _vm._s(_vm.feedbackMessage) + "\n\t\t") + ] + ) + ]) + ] + ) +} +var staticRenderFns = [] +render._withStripped = true + + + +/***/ }), + +/***/ "./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/vue-loader/lib/index.js?!./apps/settings/src/components/UserList/UserRowSimple.vue?vue&type=template&id=ff154a08&scoped=true&": +/*!******************************************************************************************************************************************************************************************************************************************!*\ + !*** ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./apps/settings/src/components/UserList/UserRowSimple.vue?vue&type=template&id=ff154a08&scoped=true& ***! + \******************************************************************************************************************************************************************************************************************************************/ +/*! exports provided: render, staticRenderFns */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "render", function() { return render; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "staticRenderFns", function() { return staticRenderFns; }); +var render = function() { + var _vm = this + var _h = _vm.$createElement + var _c = _vm._self._c || _h + return _c( + "div", + { + staticClass: "row", + class: { disabled: _vm.loading.delete || _vm.loading.disable }, + attrs: { "data-id": _vm.user.id } + }, + [ + _c( + "div", + { + staticClass: "avatar", + class: { + "icon-loading-small": + _vm.loading.delete || _vm.loading.disable || _vm.loading.wipe + } + }, + [ + !_vm.loading.delete && !_vm.loading.disable && !_vm.loading.wipe + ? _c("img", { + attrs: { + alt: "", + width: "32", + height: "32", + src: _vm.generateAvatar(_vm.user.id, 32), + srcset: + _vm.generateAvatar(_vm.user.id, 64) + + " 2x, " + + _vm.generateAvatar(_vm.user.id, 128) + + " 4x" + } + }) + : _vm._e() + ] + ), + _vm._v(" "), + _c("div", { staticClass: "name" }, [ + _vm._v("\n\t\t" + _vm._s(_vm.user.id) + "\n\t\t"), + _c("div", { staticClass: "displayName subtitle" }, [ + _vm._v("\n\t\t\t" + _vm._s(_vm.user.displayname) + "\n\t\t") + ]) + ]), + _vm._v(" "), + _c("div"), + _vm._v(" "), + _c("div", { staticClass: "mailAddress" }, [ + _vm._v("\n\t\t" + _vm._s(_vm.user.email) + "\n\t") + ]), + _vm._v(" "), + _c("div", { staticClass: "groups" }, [ + _vm._v("\n\t\t" + _vm._s(_vm.userGroupsLabels) + "\n\t") + ]), + _vm._v(" "), + _vm.subAdminsGroups.length > 0 && _vm.settings.isAdmin + ? _c("div", { staticClass: "subAdminsGroups" }, [ + _vm._v("\n\t\t" + _vm._s(_vm.userSubAdminsGroupsLabels) + "\n\t") + ]) + : _vm._e(), + _vm._v(" "), + _c( + "div", + { + directives: [ + { + name: "tooltip", + rawName: "v-tooltip.auto", + value: _vm.usedSpace, + expression: "usedSpace", + modifiers: { auto: true } + } + ], + staticClass: "quota" + }, + [ + _c("progress", { + staticClass: "quota-user-progress", + class: { warn: _vm.usedQuota > 80 }, + attrs: { max: "100" }, + domProps: { value: _vm.usedQuota } + }) + ] + ), + _vm._v(" "), + _vm.showConfig.showLanguages + ? _c("div", { staticClass: "languages" }, [ + _vm._v("\n\t\t" + _vm._s(_vm.userLanguage.name) + "\n\t") + ]) + : _vm._e(), + _vm._v(" "), + _vm.showConfig.showUserBackend || _vm.showConfig.showStoragePath + ? _c("div", { staticClass: "userBackend" }, [ + _vm.showConfig.showUserBackend + ? _c("div", { staticClass: "userBackend" }, [ + _vm._v("\n\t\t\t" + _vm._s(_vm.user.backend) + "\n\t\t") + ]) + : _vm._e(), + _vm._v(" "), + _vm.showConfig.showStoragePath + ? _c("div", { staticClass: "storageLocation subtitle" }, [ + _vm._v( + "\n\t\t\t" + _vm._s(_vm.user.storageLocation) + "\n\t\t" + ) + ]) + : _vm._e() + ]) + : _vm._e(), + _vm._v(" "), + _vm.showConfig.showLastLogin + ? _c( + "div", + { + directives: [ + { + name: "tooltip", + rawName: "v-tooltip.auto", + value: _vm.userLastLoginTooltip, + expression: "userLastLoginTooltip", + modifiers: { auto: true } + } + ], + staticClass: "lastLogin" + }, + [_vm._v("\n\t\t" + _vm._s(_vm.userLastLogin) + "\n\t")] + ) + : _vm._e(), + _vm._v(" "), + _c("div", { staticClass: "userActions" }, [ + _vm.canEdit && !_vm.loading.all + ? _c( + "div", + { staticClass: "toggleUserActions" }, + [ + _c( + "Actions", + [ + _c( + "ActionButton", + { + attrs: { icon: "icon-rename" }, + on: { click: _vm.toggleEdit } + }, + [ + _vm._v( + "\n\t\t\t\t\t" + + _vm._s(_vm.t("settings", "Edit User")) + + "\n\t\t\t\t" + ) + ] + ) + ], + 1 + ), + _vm._v(" "), + _c("div", { + directives: [ + { + name: "click-outside", + rawName: "v-click-outside", + value: _vm.hideMenu, + expression: "hideMenu" + } + ], + staticClass: "icon-more", + on: { + click: function($event) { + return _vm.$emit("toggleMenu") + } + } + }), + _vm._v(" "), + _c( + "div", + { + staticClass: "popovermenu", + class: { open: _vm.openedMenu } + }, + [_c("PopoverMenu", { attrs: { menu: _vm.userActions } })], + 1 + ) + ], + 1 + ) + : _vm._e(), + _vm._v(" "), + _c( + "div", + { + staticClass: "feedback", + style: { opacity: _vm.feedbackMessage !== "" ? 1 : 0 } + }, + [ + _c("div", { staticClass: "icon-checkmark" }), + _vm._v("\n\t\t\t" + _vm._s(_vm.feedbackMessage) + "\n\t\t") + ] + ) + ]) + ] + ) +} +var staticRenderFns = [] +render._withStripped = true + + + +/***/ }), + +/***/ "./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/vue-loader/lib/index.js?!./apps/settings/src/views/Users.vue?vue&type=template&id=889b7562&": +/*!********************************************************************************************************************************************************************************************************!*\ + !*** ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./apps/settings/src/views/Users.vue?vue&type=template&id=889b7562& ***! + \********************************************************************************************************************************************************************************************************/ +/*! exports provided: render, staticRenderFns */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "render", function() { return render; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "staticRenderFns", function() { return staticRenderFns; }); +var render = function() { + var _vm = this + var _h = _vm.$createElement + var _c = _vm._self._c || _h + return _c( + "Content", + { + attrs: { + "app-name": "settings", + "navigation-class": { "icon-loading": _vm.loadingAddGroup } + } + }, + [ + _c( + "AppNavigation", + [ + _c("AppNavigationNew", { + attrs: { + "button-id": "new-user-button", + text: _vm.t("settings", "New user"), + "button-class": "icon-add" + }, + on: { click: _vm.toggleNewUserMenu } + }), + _vm._v(" "), + _c( + "ul", + { attrs: { id: "usergrouplist" } }, + _vm._l(_vm.menu, function(item) { + return _c("AppNavigationItem", { + key: item.key, + attrs: { item: item } + }) + }), + 1 + ), + _vm._v(" "), + _c("AppNavigationSettings", [ + _c( + "div", + [ + _c("p", [_vm._v(_vm._s(_vm.t("settings", "Default quota:")))]), + _vm._v(" "), + _c("Multiselect", { + attrs: { + value: _vm.defaultQuota, + options: _vm.quotaOptions, + "tag-placeholder": "create", + placeholder: _vm.t("settings", "Select default quota"), + label: "label", + "track-by": "id", + "allow-empty": false, + taggable: true + }, + on: { tag: _vm.validateQuota, input: _vm.setDefaultQuota } + }) + ], + 1 + ), + _vm._v(" "), + _c("div", [ + _c("input", { + directives: [ + { + name: "model", + rawName: "v-model", + value: _vm.showLanguages, + expression: "showLanguages" + } + ], + staticClass: "checkbox", + attrs: { id: "showLanguages", type: "checkbox" }, + domProps: { + checked: Array.isArray(_vm.showLanguages) + ? _vm._i(_vm.showLanguages, null) > -1 + : _vm.showLanguages + }, + on: { + change: function($event) { + var $$a = _vm.showLanguages, + $$el = $event.target, + $$c = $$el.checked ? true : false + if (Array.isArray($$a)) { + var $$v = null, + $$i = _vm._i($$a, $$v) + if ($$el.checked) { + $$i < 0 && (_vm.showLanguages = $$a.concat([$$v])) + } else { + $$i > -1 && + (_vm.showLanguages = $$a + .slice(0, $$i) + .concat($$a.slice($$i + 1))) + } + } else { + _vm.showLanguages = $$c + } + } + } + }), + _vm._v(" "), + _c("label", { attrs: { for: "showLanguages" } }, [ + _vm._v(_vm._s(_vm.t("settings", "Show Languages"))) + ]) + ]), + _vm._v(" "), + _c("div", [ + _c("input", { + directives: [ + { + name: "model", + rawName: "v-model", + value: _vm.showLastLogin, + expression: "showLastLogin" + } + ], + staticClass: "checkbox", + attrs: { id: "showLastLogin", type: "checkbox" }, + domProps: { + checked: Array.isArray(_vm.showLastLogin) + ? _vm._i(_vm.showLastLogin, null) > -1 + : _vm.showLastLogin + }, + on: { + change: function($event) { + var $$a = _vm.showLastLogin, + $$el = $event.target, + $$c = $$el.checked ? true : false + if (Array.isArray($$a)) { + var $$v = null, + $$i = _vm._i($$a, $$v) + if ($$el.checked) { + $$i < 0 && (_vm.showLastLogin = $$a.concat([$$v])) + } else { + $$i > -1 && + (_vm.showLastLogin = $$a + .slice(0, $$i) + .concat($$a.slice($$i + 1))) + } + } else { + _vm.showLastLogin = $$c + } + } + } + }), + _vm._v(" "), + _c("label", { attrs: { for: "showLastLogin" } }, [ + _vm._v(_vm._s(_vm.t("settings", "Show last login"))) + ]) + ]), + _vm._v(" "), + _c("div", [ + _c("input", { + directives: [ + { + name: "model", + rawName: "v-model", + value: _vm.showUserBackend, + expression: "showUserBackend" + } + ], + staticClass: "checkbox", + attrs: { id: "showUserBackend", type: "checkbox" }, + domProps: { + checked: Array.isArray(_vm.showUserBackend) + ? _vm._i(_vm.showUserBackend, null) > -1 + : _vm.showUserBackend + }, + on: { + change: function($event) { + var $$a = _vm.showUserBackend, + $$el = $event.target, + $$c = $$el.checked ? true : false + if (Array.isArray($$a)) { + var $$v = null, + $$i = _vm._i($$a, $$v) + if ($$el.checked) { + $$i < 0 && (_vm.showUserBackend = $$a.concat([$$v])) + } else { + $$i > -1 && + (_vm.showUserBackend = $$a + .slice(0, $$i) + .concat($$a.slice($$i + 1))) + } + } else { + _vm.showUserBackend = $$c + } + } + } + }), + _vm._v(" "), + _c("label", { attrs: { for: "showUserBackend" } }, [ + _vm._v(_vm._s(_vm.t("settings", "Show user backend"))) + ]) + ]), + _vm._v(" "), + _c("div", [ + _c("input", { + directives: [ + { + name: "model", + rawName: "v-model", + value: _vm.showStoragePath, + expression: "showStoragePath" + } + ], + staticClass: "checkbox", + attrs: { id: "showStoragePath", type: "checkbox" }, + domProps: { + checked: Array.isArray(_vm.showStoragePath) + ? _vm._i(_vm.showStoragePath, null) > -1 + : _vm.showStoragePath + }, + on: { + change: function($event) { + var $$a = _vm.showStoragePath, + $$el = $event.target, + $$c = $$el.checked ? true : false + if (Array.isArray($$a)) { + var $$v = null, + $$i = _vm._i($$a, $$v) + if ($$el.checked) { + $$i < 0 && (_vm.showStoragePath = $$a.concat([$$v])) + } else { + $$i > -1 && + (_vm.showStoragePath = $$a + .slice(0, $$i) + .concat($$a.slice($$i + 1))) + } + } else { + _vm.showStoragePath = $$c + } + } + } + }), + _vm._v(" "), + _c("label", { attrs: { for: "showStoragePath" } }, [ + _vm._v(_vm._s(_vm.t("settings", "Show storage path"))) + ]) + ]) + ]) + ], + 1 + ), + _vm._v(" "), + _c( + "AppContent", + [ + _c("UserList", { + attrs: { + users: _vm.users, + "show-config": _vm.showConfig, + "selected-group": _vm.selectedGroup, + "external-actions": _vm.externalActions + }, + scopedSlots: _vm._u([ + { + key: "content", + fn: function() { + return undefined + }, + proxy: true + } + ]) + }) + ], + 1 + ) + ], + 1 + ) +} +var staticRenderFns = [] +render._withStripped = true + + + +/***/ }) + +}]); +//# sourceMappingURL=vue-2.js.map?v=1f67c05b89d62d76974e \ No newline at end of file diff --git a/apps/settings/js/vue-2.js.map b/apps/settings/js/vue-2.js.map new file mode 100644 index 0000000000000..08af45fd4c64b --- /dev/null +++ b/apps/settings/js/vue-2.js.map @@ -0,0 +1 @@ +{"version":3,"file":"vue-2.js?v=1f67c05b89d62d76974e","sources":["webpack:///./apps/settings/src/components/UserList.vue","webpack:///./apps/settings/src/components/UserList.vue?69dd","webpack:///./apps/settings/src/components/UserList.vue?bf93","webpack:///./apps/settings/src/components/UserList/UserRow.vue","webpack:///./apps/settings/src/components/UserList/UserRow.vue?4147","webpack:///./apps/settings/src/components/UserList/UserRow.vue?9742","webpack:///./apps/settings/src/components/UserList/UserRowSimple.vue","webpack:///./apps/settings/src/components/UserList/UserRowSimple.vue?6483","webpack:///./apps/settings/src/components/UserList/UserRowSimple.vue?2ff0","webpack:///./apps/settings/src/mixins/UserRowMixin.js","webpack:///./apps/settings/src/views/Users.vue","webpack:///./apps/settings/src/views/Users.vue?83c0","webpack:///./apps/settings/src/views/Users.vue?cc08","webpack:///./apps/settings/src/components/UserList.vue?1138","webpack:///./apps/settings/src/components/UserList/UserRow.vue?68e3","webpack:///./apps/settings/src/components/UserList/UserRowSimple.vue?4ab0","webpack:///./apps/settings/src/views/Users.vue?0f11","webpack:///./apps/settings/src/components/UserList.vue?6b70","webpack:///./apps/settings/src/components/UserList/UserRow.vue?ad6a","webpack:///./apps/settings/src/components/UserList/UserRowSimple.vue?d051","webpack:///./apps/settings/src/views/Users.vue?d4fd"],"sourcesContent":["import { render, staticRenderFns } from \"./UserList.vue?vue&type=template&id=6cba3aca&\"\nimport script from \"./UserList.vue?vue&type=script&lang=js&\"\nexport * from \"./UserList.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (module.hot) {\n var api = require(\"/home/user/nextcloud/node_modules/vue-hot-reload-api/dist/index.js\")\n api.install(require('vue'))\n if (api.compatible) {\n module.hot.accept()\n if (!api.isRecorded('6cba3aca')) {\n api.createRecord('6cba3aca', component.options)\n } else {\n api.reload('6cba3aca', component.options)\n }\n module.hot.accept(\"./UserList.vue?vue&type=template&id=6cba3aca&\", function () {\n api.rerender('6cba3aca', {\n render: render,\n staticRenderFns: staticRenderFns\n })\n })\n }\n}\ncomponent.options.__file = \"apps/settings/src/components/UserList.vue\"\nexport default component.exports","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./UserList.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./UserList.vue?vue&type=script&lang=js&\"","export * from \"-!../../../../node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./UserList.vue?vue&type=template&id=6cba3aca&\"","import { render, staticRenderFns } from \"./UserRow.vue?vue&type=template&id=77960baa&\"\nimport script from \"./UserRow.vue?vue&type=script&lang=js&\"\nexport * from \"./UserRow.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (module.hot) {\n var api = require(\"/home/user/nextcloud/node_modules/vue-hot-reload-api/dist/index.js\")\n api.install(require('vue'))\n if (api.compatible) {\n module.hot.accept()\n if (!api.isRecorded('77960baa')) {\n api.createRecord('77960baa', component.options)\n } else {\n api.reload('77960baa', component.options)\n }\n module.hot.accept(\"./UserRow.vue?vue&type=template&id=77960baa&\", function () {\n api.rerender('77960baa', {\n render: render,\n staticRenderFns: staticRenderFns\n })\n })\n }\n}\ncomponent.options.__file = \"apps/settings/src/components/UserList/UserRow.vue\"\nexport default component.exports","import mod from \"-!../../../../../node_modules/babel-loader/lib/index.js!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./UserRow.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../node_modules/babel-loader/lib/index.js!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./UserRow.vue?vue&type=script&lang=js&\"","export * from \"-!../../../../../node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./UserRow.vue?vue&type=template&id=77960baa&\"","import { render, staticRenderFns } from \"./UserRowSimple.vue?vue&type=template&id=ff154a08&scoped=true&\"\nimport script from \"./UserRowSimple.vue?vue&type=script&lang=js&\"\nexport * from \"./UserRowSimple.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"ff154a08\",\n null\n \n)\n\n/* hot reload */\nif (module.hot) {\n var api = require(\"/home/user/nextcloud/node_modules/vue-hot-reload-api/dist/index.js\")\n api.install(require('vue'))\n if (api.compatible) {\n module.hot.accept()\n if (!api.isRecorded('ff154a08')) {\n api.createRecord('ff154a08', component.options)\n } else {\n api.reload('ff154a08', component.options)\n }\n module.hot.accept(\"./UserRowSimple.vue?vue&type=template&id=ff154a08&scoped=true&\", function () {\n api.rerender('ff154a08', {\n render: render,\n staticRenderFns: staticRenderFns\n })\n })\n }\n}\ncomponent.options.__file = \"apps/settings/src/components/UserList/UserRowSimple.vue\"\nexport default component.exports","import mod from \"-!../../../../../node_modules/babel-loader/lib/index.js!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./UserRowSimple.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../node_modules/babel-loader/lib/index.js!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./UserRowSimple.vue?vue&type=script&lang=js&\"","export * from \"-!../../../../../node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./UserRowSimple.vue?vue&type=template&id=ff154a08&scoped=true&\"","function _typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\n/**\n * @copyright Copyright (c) 2019 John Molakvoæ \n *\n * @author John Molakvoæ \n *\n * @license GNU AGPL version 3 or any later version\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n */\nexport default {\n props: {\n user: {\n type: Object,\n required: true\n },\n settings: {\n type: Object,\n default: function _default() {\n return {};\n }\n },\n groups: {\n type: Array,\n default: function _default() {\n return [];\n }\n },\n subAdminsGroups: {\n type: Array,\n default: function _default() {\n return [];\n }\n },\n quotaOptions: {\n type: Array,\n default: function _default() {\n return [];\n }\n },\n showConfig: {\n type: Object,\n default: function _default() {\n return {};\n }\n },\n languages: {\n type: Array,\n required: true\n },\n externalActions: {\n type: Array,\n default: function _default() {\n return [];\n }\n }\n },\n computed: {\n /* GROUPS MANAGEMENT */\n userGroups: function userGroups() {\n var _this = this;\n\n var userGroups = this.groups.filter(function (group) {\n return _this.user.groups.includes(group.id);\n });\n return userGroups;\n },\n userSubAdminsGroups: function userSubAdminsGroups() {\n var _this2 = this;\n\n var userSubAdminsGroups = this.subAdminsGroups.filter(function (group) {\n return _this2.user.subadmin.includes(group.id);\n });\n return userSubAdminsGroups;\n },\n availableGroups: function availableGroups() {\n var _this3 = this;\n\n return this.groups.map(function (group) {\n // clone object because we don't want\n // to edit the original groups\n var groupClone = Object.assign({}, group); // two settings here:\n // 1. user NOT in group but no permission to add\n // 2. user is in group but no permission to remove\n\n groupClone.$isDisabled = group.canAdd === false && !_this3.user.groups.includes(group.id) || group.canRemove === false && _this3.user.groups.includes(group.id);\n return groupClone;\n });\n },\n\n /* QUOTA MANAGEMENT */\n usedSpace: function usedSpace() {\n if (this.user.quota.used) {\n return t('settings', '{size} used', {\n size: OC.Util.humanFileSize(this.user.quota.used)\n });\n }\n\n return t('settings', '{size} used', {\n size: OC.Util.humanFileSize(0)\n });\n },\n usedQuota: function usedQuota() {\n var quota = this.user.quota.quota;\n\n if (quota > 0) {\n quota = Math.min(100, Math.round(this.user.quota.used / quota * 100));\n } else {\n var usedInGB = this.user.quota.used / (10 * Math.pow(2, 30)); // asymptotic curve approaching 50% at 10GB to visualize used stace with infinite quota\n\n quota = 95 * (1 - 1 / (usedInGB + 1));\n }\n\n return isNaN(quota) ? 0 : quota;\n },\n // Mapping saved values to objects\n userQuota: function userQuota() {\n if (this.user.quota.quota >= 0) {\n // if value is valid, let's map the quotaOptions or return custom quota\n var humanQuota = OC.Util.humanFileSize(this.user.quota.quota);\n var userQuota = this.quotaOptions.find(function (quota) {\n return quota.id === humanQuota;\n });\n return userQuota || {\n id: humanQuota,\n label: humanQuota\n };\n } else if (this.user.quota.quota === 'default') {\n // default quota is replaced by the proper value on load\n return this.quotaOptions[0];\n }\n\n return this.quotaOptions[1]; // unlimited\n },\n\n /* PASSWORD POLICY? */\n minPasswordLength: function minPasswordLength() {\n return this.$store.getters.getPasswordPolicyMinLength;\n },\n\n /* LANGUAGE */\n userLanguage: function userLanguage() {\n var _this4 = this;\n\n var availableLanguages = this.languages[0].languages.concat(this.languages[1].languages);\n var userLang = availableLanguages.find(function (lang) {\n return lang.code === _this4.user.language;\n });\n\n if (_typeof(userLang) !== 'object' && this.user.language !== '') {\n return {\n code: this.user.language,\n name: this.user.language\n };\n } else if (this.user.language === '') {\n return false;\n }\n\n return userLang;\n },\n\n /* LAST LOGIN */\n userLastLoginTooltip: function userLastLoginTooltip() {\n if (this.user.lastLogin > 0) {\n return OC.Util.formatDate(this.user.lastLogin);\n }\n\n return '';\n },\n userLastLogin: function userLastLogin() {\n if (this.user.lastLogin > 0) {\n return OC.Util.relativeModifiedDate(this.user.lastLogin);\n }\n\n return t('settings', 'Never');\n }\n },\n methods: {\n /**\n * Generate avatar url\n *\n * @param {string} user The user name\n * @param {int} size Size integer, default 32\n * @returns {string}\n */\n generateAvatar: function generateAvatar(user) {\n var size = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 32;\n return OC.generateUrl('/avatar/{user}/{size}?v={version}', {\n user: user,\n size: size,\n version: oc_userconfig.avatar.version\n });\n }\n }\n};","import { render, staticRenderFns } from \"./Users.vue?vue&type=template&id=889b7562&\"\nimport script from \"./Users.vue?vue&type=script&lang=js&\"\nexport * from \"./Users.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (module.hot) {\n var api = require(\"/home/user/nextcloud/node_modules/vue-hot-reload-api/dist/index.js\")\n api.install(require('vue'))\n if (api.compatible) {\n module.hot.accept()\n if (!api.isRecorded('889b7562')) {\n api.createRecord('889b7562', component.options)\n } else {\n api.reload('889b7562', component.options)\n }\n module.hot.accept(\"./Users.vue?vue&type=template&id=889b7562&\", function () {\n api.rerender('889b7562', {\n render: render,\n staticRenderFns: staticRenderFns\n })\n })\n }\n}\ncomponent.options.__file = \"apps/settings/src/views/Users.vue\"\nexport default component.exports","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Users.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Users.vue?vue&type=script&lang=js&\"","export * from \"-!../../../../node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Users.vue?vue&type=template&id=889b7562&\"","//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\nimport userRow from './UserList/UserRow';\nimport { Multiselect } from 'nextcloud-vue';\nimport InfiniteLoading from 'vue-infinite-loading';\nimport Vue from 'vue';\nvar unlimitedQuota = {\n id: 'none',\n label: t('settings', 'Unlimited')\n};\nvar defaultQuota = {\n id: 'default',\n label: t('settings', 'Default quota')\n};\nvar newUser = {\n id: '',\n displayName: '',\n password: '',\n mailAddress: '',\n groups: [],\n subAdminsGroups: [],\n quota: defaultQuota,\n language: {\n code: 'en',\n name: t('settings', 'Default language')\n }\n};\nexport default {\n name: 'UserList',\n components: {\n userRow: userRow,\n Multiselect: Multiselect,\n InfiniteLoading: InfiniteLoading\n },\n props: {\n users: {\n type: Array,\n default: function _default() {\n return [];\n }\n },\n showConfig: {\n type: Object,\n required: true\n },\n selectedGroup: {\n type: String,\n default: null\n },\n externalActions: {\n type: Array,\n default: function _default() {\n return [];\n }\n }\n },\n data: function data() {\n return {\n unlimitedQuota: unlimitedQuota,\n defaultQuota: defaultQuota,\n loading: {\n all: false,\n groups: false\n },\n scrolled: false,\n searchQuery: '',\n newUser: Object.assign({}, newUser)\n };\n },\n computed: {\n settings: function settings() {\n return this.$store.getters.getServerData;\n },\n filteredUsers: function filteredUsers() {\n if (this.selectedGroup === 'disabled') {\n return this.users.filter(function (user) {\n return user.enabled === false;\n });\n }\n\n if (!this.settings.isAdmin) {\n // we don't want subadmins to edit themselves\n return this.users.filter(function (user) {\n return user.enabled !== false && user.id !== OC.getCurrentUser().uid;\n });\n }\n\n return this.users.filter(function (user) {\n return user.enabled !== false;\n });\n },\n groups: function groups() {\n // data provided php side + remove the disabled group\n return this.$store.getters.getGroups.filter(function (group) {\n return group.id !== 'disabled';\n }).sort(function (a, b) {\n return a.name.localeCompare(b.name);\n });\n },\n canAddGroups: function canAddGroups() {\n // disabled if no permission to add new users to group\n return this.groups.map(function (group) {\n // clone object because we don't want\n // to edit the original groups\n group = Object.assign({}, group);\n group.$isDisabled = group.canAdd === false;\n return group;\n });\n },\n subAdminsGroups: function subAdminsGroups() {\n // data provided php side\n return this.$store.getters.getSubadminGroups;\n },\n quotaOptions: function quotaOptions() {\n // convert the preset array into objects\n var quotaPreset = this.settings.quotaPreset.reduce(function (acc, cur) {\n return acc.concat({\n id: cur,\n label: cur\n });\n }, []); // add default presets\n\n quotaPreset.unshift(this.unlimitedQuota);\n quotaPreset.unshift(this.defaultQuota);\n return quotaPreset;\n },\n minPasswordLength: function minPasswordLength() {\n return this.$store.getters.getPasswordPolicyMinLength;\n },\n usersOffset: function usersOffset() {\n return this.$store.getters.getUsersOffset;\n },\n usersLimit: function usersLimit() {\n return this.$store.getters.getUsersLimit;\n },\n usersCount: function usersCount() {\n return this.users.length;\n },\n\n /* LANGUAGES */\n languages: function languages() {\n return [{\n label: t('settings', 'Common languages'),\n languages: this.settings.languages.commonlanguages\n }, {\n label: t('settings', 'All languages'),\n languages: this.settings.languages.languages\n }];\n }\n },\n watch: {\n // watch url change and group select\n selectedGroup: function selectedGroup(val, old) {\n // if selected is the disabled group but it's empty\n this.redirectIfDisabled();\n this.$store.commit('resetUsers');\n this.$refs.infiniteLoading.stateChanger.reset();\n this.setNewUserDefaultGroup(val);\n },\n // make sure the infiniteLoading state is changed if we manually\n // add/remove data from the store\n usersCount: function usersCount(val, old) {\n // deleting the last user, reset the list\n if (val === 0 && old === 1) {\n this.$refs.infiniteLoading.stateChanger.reset(); // adding the first user, warn the infiniteLoader that\n // the list is not empty anymore (we don't fetch the newly\n // added user as we already have all the info we need)\n } else if (val === 1 && old === 0) {\n this.$refs.infiniteLoading.stateChanger.loaded();\n }\n }\n },\n mounted: function mounted() {\n if (!this.settings.canChangePassword) {\n OC.Notification.showTemporary(t('settings', 'Password change is disabled because the master key is disabled'));\n }\n /**\n * Reset and init new user form\n */\n\n\n this.resetForm();\n /**\n * Register search\n */\n\n this.userSearch = new OCA.Search(this.search, this.resetSearch);\n /**\n * If disabled group but empty, redirect\n */\n\n this.redirectIfDisabled();\n },\n methods: {\n onScroll: function onScroll(event) {\n this.scrolled = event.target.scrollTo > 0;\n },\n\n /**\n * Validate quota string to make sure it's a valid human file size\n *\n * @param {string} quota Quota in readable format '5 GB'\n * @returns {Object}\n */\n validateQuota: function validateQuota(quota) {\n // only used for new presets sent through @Tag\n var validQuota = OC.Util.computerFileSize(quota);\n\n if (validQuota !== null && validQuota >= 0) {\n // unify format output\n quota = OC.Util.humanFileSize(OC.Util.computerFileSize(quota));\n this.newUser.quota = {\n id: quota,\n label: quota\n };\n return this.newUser.quota;\n } // Default is unlimited\n\n\n this.newUser.quota = this.quotaOptions[0];\n return this.quotaOptions[0];\n },\n infiniteHandler: function infiniteHandler($state) {\n this.$store.dispatch('getUsers', {\n offset: this.usersOffset,\n limit: this.usersLimit,\n group: this.selectedGroup !== 'disabled' ? this.selectedGroup : '',\n search: this.searchQuery\n }).then(function (response) {\n response ? $state.loaded() : $state.complete();\n });\n },\n\n /* SEARCH */\n search: function search(query) {\n this.searchQuery = query;\n this.$store.commit('resetUsers');\n this.$refs.infiniteLoading.stateChanger.reset();\n },\n resetSearch: function resetSearch() {\n this.search('');\n },\n resetForm: function resetForm() {\n // revert form to original state\n this.newUser = Object.assign({}, newUser);\n /**\n * Init default language from server data. The use of this.settings\n * requires a computed variable, which break the v-model binding of the form,\n * this is a much easier solution than getter and setter on a computed var\n */\n\n if (this.settings.defaultLanguage) {\n Vue.set(this.newUser.language, 'code', this.settings.defaultLanguage);\n }\n /**\n * In case the user directly loaded the user list within a group\n * the watch won't be triggered. We need to initialize it.\n */\n\n\n this.setNewUserDefaultGroup(this.selectedGroup);\n this.loading.all = false;\n },\n createUser: function createUser() {\n var _this = this;\n\n this.loading.all = true;\n this.$store.dispatch('addUser', {\n userid: this.newUser.id,\n password: this.newUser.password,\n displayName: this.newUser.displayName,\n email: this.newUser.mailAddress,\n groups: this.newUser.groups.map(function (group) {\n return group.id;\n }),\n subadmin: this.newUser.subAdminsGroups.map(function (group) {\n return group.id;\n }),\n quota: this.newUser.quota.id,\n language: this.newUser.language.code\n }).then(function () {\n _this.resetForm();\n\n _this.$refs.newusername.focus();\n }).catch(function (error) {\n _this.loading.all = false;\n\n if (error.response && error.response.data && error.response.data.ocs && error.response.data.ocs.meta) {\n var statuscode = error.response.data.ocs.meta.statuscode;\n\n if (statuscode === 102) {\n // wrong username\n _this.$refs.newusername.focus();\n } else if (statuscode === 107) {\n // wrong password\n _this.$refs.newuserpassword.focus();\n }\n }\n });\n },\n setNewUserDefaultGroup: function setNewUserDefaultGroup(value) {\n if (value && value.length > 0) {\n // setting new user default group to the current selected one\n var currentGroup = this.groups.find(function (group) {\n return group.id === value;\n });\n\n if (currentGroup) {\n this.newUser.groups = [currentGroup];\n return;\n }\n } // fallback, empty selected group\n\n\n this.newUser.groups = [];\n },\n\n /**\n * Create a new group\n *\n * @param {string} gid Group id\n * @returns {Promise}\n */\n createGroup: function createGroup(gid) {\n var _this2 = this;\n\n this.loading.groups = true;\n this.$store.dispatch('addGroup', gid).then(function (group) {\n _this2.newUser.groups.push(_this2.groups.find(function (group) {\n return group.id === gid;\n }));\n\n _this2.loading.groups = false;\n }).catch(function () {\n _this2.loading.groups = false;\n });\n return this.$store.getters.getGroups[this.groups.length];\n },\n\n /**\n * If the selected group is the disabled group but the count is 0\n * redirect to the all users page.\n * * we only check for 0 because we don't have the count on ldap\n * * and we therefore set the usercount to -1 in this specific case\n */\n redirectIfDisabled: function redirectIfDisabled() {\n var allGroups = this.$store.getters.getGroups;\n\n if (this.selectedGroup === 'disabled' && allGroups.findIndex(function (group) {\n return group.id === 'disabled' && group.usercount === 0;\n }) > -1) {\n // disabled group is empty, redirection to all users\n this.$router.push({\n name: 'users'\n });\n this.$refs.infiniteLoading.stateChanger.reset();\n }\n }\n }\n};","//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\nimport ClickOutside from 'vue-click-outside';\nimport Vue from 'vue';\nimport VTooltip from 'v-tooltip';\nimport { PopoverMenu, Multiselect, Actions, ActionButton } from 'nextcloud-vue';\nimport UserRowSimple from './UserRowSimple';\nimport UserRowMixin from '../../mixins/UserRowMixin';\nVue.use(VTooltip);\nexport default {\n name: 'UserRow',\n components: {\n UserRowSimple: UserRowSimple,\n PopoverMenu: PopoverMenu,\n Actions: Actions,\n ActionButton: ActionButton,\n Multiselect: Multiselect\n },\n directives: {\n ClickOutside: ClickOutside\n },\n mixins: [UserRowMixin],\n props: {\n user: {\n type: Object,\n required: true\n },\n settings: {\n type: Object,\n default: function _default() {\n return {};\n }\n },\n groups: {\n type: Array,\n default: function _default() {\n return [];\n }\n },\n subAdminsGroups: {\n type: Array,\n default: function _default() {\n return [];\n }\n },\n quotaOptions: {\n type: Array,\n default: function _default() {\n return [];\n }\n },\n showConfig: {\n type: Object,\n default: function _default() {\n return {};\n }\n },\n languages: {\n type: Array,\n required: true\n },\n externalActions: {\n type: Array,\n default: function _default() {\n return [];\n }\n }\n },\n data: function data() {\n return {\n rand: parseInt(Math.random() * 1000),\n openedMenu: false,\n feedbackMessage: '',\n editing: false,\n loading: {\n all: false,\n displayName: false,\n password: false,\n mailAddress: false,\n groups: false,\n subadmins: false,\n quota: false,\n delete: false,\n disable: false,\n languages: false,\n wipe: false\n }\n };\n },\n computed: {\n /* USER POPOVERMENU ACTIONS */\n userActions: function userActions() {\n var actions = [{\n icon: 'icon-delete',\n text: t('settings', 'Delete user'),\n action: this.deleteUser\n }, {\n icon: 'icon-delete',\n text: t('settings', 'Wipe all devices'),\n action: this.wipeUserDevices\n }, {\n icon: this.user.enabled ? 'icon-close' : 'icon-add',\n text: this.user.enabled ? t('settings', 'Disable user') : t('settings', 'Enable user'),\n action: this.enableDisableUser\n }];\n\n if (this.user.email !== null && this.user.email !== '') {\n actions.push({\n icon: 'icon-mail',\n text: t('settings', 'Resend welcome email'),\n action: this.sendWelcomeMail\n });\n }\n\n return actions.concat(this.externalActions);\n }\n },\n methods: {\n /* MENU HANDLING */\n toggleMenu: function toggleMenu() {\n this.openedMenu = !this.openedMenu;\n },\n hideMenu: function hideMenu() {\n this.openedMenu = false;\n },\n wipeUserDevices: function wipeUserDevices() {\n var _this = this;\n\n var userid = this.user.id;\n OC.dialogs.confirmDestructive(t('settings', 'In case of lost device or exiting the organization, this can remotely wipe the Nextcloud data from all devices associated with {userid}. Only works if the devices are connected to the internet.', {\n userid: userid\n }), t('settings', 'Remote wipe of devices'), {\n type: OC.dialogs.YES_NO_BUTTONS,\n confirm: t('settings', 'Wipe {userid}\\'s devices', {\n userid: userid\n }),\n confirmClasses: 'error',\n cancel: t('settings', 'Cancel')\n }, function (result) {\n if (result) {\n _this.loading.wipe = true;\n _this.loading.all = true;\n\n _this.$store.dispatch('wipeUserDevices', userid).then(function () {\n _this.loading.wipe = false;\n _this.loading.all = false;\n });\n }\n }, true);\n },\n deleteUser: function deleteUser() {\n var _this2 = this;\n\n var userid = this.user.id;\n OC.dialogs.confirmDestructive(t('settings', 'Fully delete {userid}\\'s account including all their personal files, app data, etc.', {\n userid: userid\n }), t('settings', 'Account deletion'), {\n type: OC.dialogs.YES_NO_BUTTONS,\n confirm: t('settings', 'Delete {userid}\\'s account', {\n userid: userid\n }),\n confirmClasses: 'error',\n cancel: t('settings', 'Cancel')\n }, function (result) {\n if (result) {\n _this2.loading.delete = true;\n _this2.loading.all = true;\n return _this2.$store.dispatch('deleteUser', userid).then(function () {\n _this2.loading.delete = false;\n _this2.loading.all = false;\n });\n }\n }, true);\n },\n enableDisableUser: function enableDisableUser() {\n var _this3 = this;\n\n this.loading.delete = true;\n this.loading.all = true;\n var userid = this.user.id;\n var enabled = !this.user.enabled;\n return this.$store.dispatch('enableDisableUser', {\n userid: userid,\n enabled: enabled\n }).then(function () {\n _this3.loading.delete = false;\n _this3.loading.all = false;\n });\n },\n\n /**\n \t * Set user displayName\n \t *\n \t * @param {string} displayName The display name\n \t */\n updateDisplayName: function updateDisplayName() {\n var _this4 = this;\n\n var displayName = this.$refs.displayName.value;\n this.loading.displayName = true;\n this.$store.dispatch('setUserData', {\n userid: this.user.id,\n key: 'displayname',\n value: displayName\n }).then(function () {\n _this4.loading.displayName = false;\n _this4.$refs.displayName.value = displayName;\n });\n },\n\n /**\n \t * Set user password\n \t *\n \t * @param {string} password The email adress\n \t */\n updatePassword: function updatePassword() {\n var _this5 = this;\n\n var password = this.$refs.password.value;\n this.loading.password = true;\n this.$store.dispatch('setUserData', {\n userid: this.user.id,\n key: 'password',\n value: password\n }).then(function () {\n _this5.loading.password = false;\n _this5.$refs.password.value = ''; // empty & show placeholder\n });\n },\n\n /**\n \t * Set user mailAddress\n \t *\n \t * @param {string} mailAddress The email adress\n \t */\n updateEmail: function updateEmail() {\n var _this6 = this;\n\n var mailAddress = this.$refs.mailAddress.value;\n this.loading.mailAddress = true;\n this.$store.dispatch('setUserData', {\n userid: this.user.id,\n key: 'email',\n value: mailAddress\n }).then(function () {\n _this6.loading.mailAddress = false;\n _this6.$refs.mailAddress.value = mailAddress;\n });\n },\n\n /**\n \t * Create a new group and add user to it\n \t *\n \t * @param {string} gid Group id\n \t */\n createGroup: function createGroup(gid) {\n var userid;\n return regeneratorRuntime.async(function createGroup$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n this.loading = {\n groups: true,\n subadmins: true\n };\n _context.prev = 1;\n _context.next = 4;\n return regeneratorRuntime.awrap(this.$store.dispatch('addGroup', gid));\n\n case 4:\n userid = this.user.id;\n _context.next = 7;\n return regeneratorRuntime.awrap(this.$store.dispatch('addUserGroup', {\n userid: userid,\n gid: gid\n }));\n\n case 7:\n _context.next = 12;\n break;\n\n case 9:\n _context.prev = 9;\n _context.t0 = _context[\"catch\"](1);\n console.error(_context.t0);\n\n case 12:\n _context.prev = 12;\n this.loading = {\n groups: false,\n subadmins: false\n };\n return _context.finish(12);\n\n case 15:\n return _context.abrupt(\"return\", this.$store.getters.getGroups[this.groups.length]);\n\n case 16:\n case \"end\":\n return _context.stop();\n }\n }\n }, null, this, [[1, 9, 12, 15]]);\n },\n\n /**\n \t * Add user to group\n \t *\n \t * @param {object} group Group object\n \t */\n addUserGroup: function addUserGroup(group) {\n var userid, gid;\n return regeneratorRuntime.async(function addUserGroup$(_context2) {\n while (1) {\n switch (_context2.prev = _context2.next) {\n case 0:\n if (!(group.canAdd === false)) {\n _context2.next = 2;\n break;\n }\n\n return _context2.abrupt(\"return\", false);\n\n case 2:\n this.loading.groups = true;\n userid = this.user.id;\n gid = group.id;\n _context2.prev = 5;\n _context2.next = 8;\n return regeneratorRuntime.awrap(this.$store.dispatch('addUserGroup', {\n userid: userid,\n gid: gid\n }));\n\n case 8:\n _context2.next = 13;\n break;\n\n case 10:\n _context2.prev = 10;\n _context2.t0 = _context2[\"catch\"](5);\n console.error(_context2.t0);\n\n case 13:\n _context2.prev = 13;\n this.loading.groups = false;\n return _context2.finish(13);\n\n case 16:\n case \"end\":\n return _context2.stop();\n }\n }\n }, null, this, [[5, 10, 13, 16]]);\n },\n\n /**\n \t * Remove user from group\n \t *\n \t * @param {object} group Group object\n \t */\n removeUserGroup: function removeUserGroup(group) {\n var userid, gid;\n return regeneratorRuntime.async(function removeUserGroup$(_context3) {\n while (1) {\n switch (_context3.prev = _context3.next) {\n case 0:\n if (!(group.canRemove === false)) {\n _context3.next = 2;\n break;\n }\n\n return _context3.abrupt(\"return\", false);\n\n case 2:\n this.loading.groups = true;\n userid = this.user.id;\n gid = group.id;\n _context3.prev = 5;\n _context3.next = 8;\n return regeneratorRuntime.awrap(this.$store.dispatch('removeUserGroup', {\n userid: userid,\n gid: gid\n }));\n\n case 8:\n this.loading.groups = false; // remove user from current list if current list is the removed group\n\n if (this.$route.params.selectedGroup === gid) {\n this.$store.commit('deleteUser', userid);\n }\n\n _context3.next = 15;\n break;\n\n case 12:\n _context3.prev = 12;\n _context3.t0 = _context3[\"catch\"](5);\n this.loading.groups = false;\n\n case 15:\n case \"end\":\n return _context3.stop();\n }\n }\n }, null, this, [[5, 12]]);\n },\n\n /**\n \t * Add user to group\n \t *\n \t * @param {object} group Group object\n \t */\n addUserSubAdmin: function addUserSubAdmin(group) {\n var userid, gid;\n return regeneratorRuntime.async(function addUserSubAdmin$(_context4) {\n while (1) {\n switch (_context4.prev = _context4.next) {\n case 0:\n this.loading.subadmins = true;\n userid = this.user.id;\n gid = group.id;\n _context4.prev = 3;\n _context4.next = 6;\n return regeneratorRuntime.awrap(this.$store.dispatch('addUserSubAdmin', {\n userid: userid,\n gid: gid\n }));\n\n case 6:\n this.loading.subadmins = false;\n _context4.next = 12;\n break;\n\n case 9:\n _context4.prev = 9;\n _context4.t0 = _context4[\"catch\"](3);\n console.error(_context4.t0);\n\n case 12:\n case \"end\":\n return _context4.stop();\n }\n }\n }, null, this, [[3, 9]]);\n },\n\n /**\n \t * Remove user from group\n \t *\n \t * @param {object} group Group object\n \t */\n removeUserSubAdmin: function removeUserSubAdmin(group) {\n var userid, gid;\n return regeneratorRuntime.async(function removeUserSubAdmin$(_context5) {\n while (1) {\n switch (_context5.prev = _context5.next) {\n case 0:\n this.loading.subadmins = true;\n userid = this.user.id;\n gid = group.id;\n _context5.prev = 3;\n _context5.next = 6;\n return regeneratorRuntime.awrap(this.$store.dispatch('removeUserSubAdmin', {\n userid: userid,\n gid: gid\n }));\n\n case 6:\n _context5.next = 11;\n break;\n\n case 8:\n _context5.prev = 8;\n _context5.t0 = _context5[\"catch\"](3);\n console.error(_context5.t0);\n\n case 11:\n _context5.prev = 11;\n this.loading.subadmins = false;\n return _context5.finish(11);\n\n case 14:\n case \"end\":\n return _context5.stop();\n }\n }\n }, null, this, [[3, 8, 11, 14]]);\n },\n\n /**\n \t * Dispatch quota set request\n \t *\n \t * @param {string|Object} quota Quota in readable format '5 GB' or Object {id: '5 GB', label: '5GB'}\n \t * @returns {string}\n \t */\n setUserQuota: function setUserQuota() {\n var quota,\n _args6 = arguments;\n return regeneratorRuntime.async(function setUserQuota$(_context6) {\n while (1) {\n switch (_context6.prev = _context6.next) {\n case 0:\n quota = _args6.length > 0 && _args6[0] !== undefined ? _args6[0] : 'none';\n this.loading.quota = true; // ensure we only send the preset id\n\n quota = quota.id ? quota.id : quota;\n _context6.prev = 3;\n _context6.next = 6;\n return regeneratorRuntime.awrap(this.$store.dispatch('setUserData', {\n userid: this.user.id,\n key: 'quota',\n value: quota\n }));\n\n case 6:\n _context6.next = 11;\n break;\n\n case 8:\n _context6.prev = 8;\n _context6.t0 = _context6[\"catch\"](3);\n console.error(_context6.t0);\n\n case 11:\n _context6.prev = 11;\n this.loading.quota = false;\n return _context6.finish(11);\n\n case 14:\n return _context6.abrupt(\"return\", quota);\n\n case 15:\n case \"end\":\n return _context6.stop();\n }\n }\n }, null, this, [[3, 8, 11, 14]]);\n },\n\n /**\n \t * Validate quota string to make sure it's a valid human file size\n \t *\n \t * @param {string} quota Quota in readable format '5 GB'\n \t * @returns {Promise|boolean}\n \t */\n validateQuota: function validateQuota(quota) {\n // only used for new presets sent through @Tag\n var validQuota = OC.Util.computerFileSize(quota);\n\n if (validQuota !== null && validQuota >= 0) {\n // unify format output\n return this.setUserQuota(OC.Util.humanFileSize(OC.Util.computerFileSize(quota)));\n } // if no valid do not change\n\n\n return false;\n },\n\n /**\n \t * Dispatch language set request\n \t *\n \t * @param {Object} lang language object {code:'en', name:'English'}\n \t * @returns {Object}\n \t */\n setUserLanguage: function setUserLanguage(lang) {\n return regeneratorRuntime.async(function setUserLanguage$(_context7) {\n while (1) {\n switch (_context7.prev = _context7.next) {\n case 0:\n this.loading.languages = true; // ensure we only send the preset id\n\n _context7.prev = 1;\n _context7.next = 4;\n return regeneratorRuntime.awrap(this.$store.dispatch('setUserData', {\n userid: this.user.id,\n key: 'language',\n value: lang.code\n }));\n\n case 4:\n _context7.next = 9;\n break;\n\n case 6:\n _context7.prev = 6;\n _context7.t0 = _context7[\"catch\"](1);\n console.error(_context7.t0);\n\n case 9:\n _context7.prev = 9;\n this.loading.languages = false;\n return _context7.finish(9);\n\n case 12:\n return _context7.abrupt(\"return\", lang);\n\n case 13:\n case \"end\":\n return _context7.stop();\n }\n }\n }, null, this, [[1, 6, 9, 12]]);\n },\n\n /**\n \t * Dispatch new welcome mail request\n \t */\n sendWelcomeMail: function sendWelcomeMail() {\n var _this7 = this;\n\n this.loading.all = true;\n this.$store.dispatch('sendWelcomeMail', this.user.id).then(function (success) {\n if (success) {\n // Show feedback to indicate the success\n _this7.feedbackMessage = t('setting', 'Welcome mail sent!');\n setTimeout(function () {\n _this7.feedbackMessage = '';\n }, 2000);\n }\n\n _this7.loading.all = false;\n });\n }\n }\n};","//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\nimport { PopoverMenu, Actions, ActionButton } from 'nextcloud-vue';\nimport ClickOutside from 'vue-click-outside';\nimport { getCurrentUser } from '@nextcloud/auth';\nimport UserRowMixin from '../../mixins/UserRowMixin';\nexport default {\n name: 'UserRowSimple',\n components: {\n PopoverMenu: PopoverMenu,\n ActionButton: ActionButton,\n Actions: Actions\n },\n directives: {\n ClickOutside: ClickOutside\n },\n mixins: [UserRowMixin],\n props: {\n user: {\n type: Object,\n required: true\n },\n loading: {\n type: Object,\n required: true\n },\n showConfig: {\n type: Object,\n required: true\n },\n userActions: {\n type: Array,\n required: true\n },\n openedMenu: {\n type: Boolean,\n required: true\n },\n feedbackMessage: {\n type: String,\n required: true\n },\n subAdminsGroups: {\n type: Array,\n required: true\n },\n settings: {\n type: Object,\n required: true\n }\n },\n computed: {\n userGroupsLabels: function userGroupsLabels() {\n return this.userGroups.map(function (group) {\n return group.name;\n }).join(', ');\n },\n userSubAdminsGroupsLabels: function userSubAdminsGroupsLabels() {\n return this.userSubAdminsGroups.map(function (group) {\n return group.name;\n }).join(', ');\n },\n usedSpace: function usedSpace() {\n if (this.user.quota.used) {\n return t('settings', '{size} used', {\n size: OC.Util.humanFileSize(this.user.quota.used)\n });\n }\n\n return t('settings', '{size} used', {\n size: OC.Util.humanFileSize(0)\n });\n },\n canEdit: function canEdit() {\n return getCurrentUser().uid !== this.user.id && this.user.id !== 'admin';\n }\n },\n methods: {\n hideMenu: function hideMenu() {\n this.$emit('hideMenu');\n },\n toggleEdit: function toggleEdit() {\n this.$emit('update:editing', true);\n }\n }\n};","function _typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\nimport Vue from 'vue';\nimport VueLocalStorage from 'vue-localstorage';\nimport { AppContent, AppNavigation, AppNavigationItem, AppNavigationNew, AppNavigationSettings, Content, Multiselect } from 'nextcloud-vue';\nimport UserList from '../components/UserList';\nVue.use(VueLocalStorage);\nexport default {\n name: 'Users',\n components: {\n AppContent: AppContent,\n AppNavigation: AppNavigation,\n AppNavigationItem: AppNavigationItem,\n AppNavigationNew: AppNavigationNew,\n AppNavigationSettings: AppNavigationSettings,\n Content: Content,\n UserList: UserList,\n Multiselect: Multiselect\n },\n props: {\n selectedGroup: {\n type: String,\n default: null\n }\n },\n data: function data() {\n return {\n // default quota is set to unlimited\n unlimitedQuota: {\n id: 'none',\n label: t('settings', 'Unlimited')\n },\n // temporary value used for multiselect change\n selectedQuota: false,\n externalActions: [],\n showAddGroupEntry: false,\n loadingAddGroup: false,\n showConfig: {\n showStoragePath: false,\n showUserBackend: false,\n showLastLogin: false,\n showNewUserForm: false,\n showLanguages: false\n }\n };\n },\n computed: {\n users: function users() {\n return this.$store.getters.getUsers;\n },\n usersOffset: function usersOffset() {\n return this.$store.getters.getUsersOffset;\n },\n usersLimit: function usersLimit() {\n return this.$store.getters.getUsersLimit;\n },\n // Local settings\n showLanguages: {\n get: function get() {\n return this.getLocalstorage('showLanguages');\n },\n set: function set(status) {\n this.setLocalStorage('showLanguages', status);\n }\n },\n showLastLogin: {\n get: function get() {\n return this.getLocalstorage('showLastLogin');\n },\n set: function set(status) {\n this.setLocalStorage('showLastLogin', status);\n }\n },\n showUserBackend: {\n get: function get() {\n return this.getLocalstorage('showUserBackend');\n },\n set: function set(status) {\n this.setLocalStorage('showUserBackend', status);\n }\n },\n showStoragePath: {\n get: function get() {\n return this.getLocalstorage('showStoragePath');\n },\n set: function set(status) {\n this.setLocalStorage('showStoragePath', status);\n }\n },\n userCount: function userCount() {\n return this.$store.getters.getUserCount;\n },\n settings: function settings() {\n return this.$store.getters.getServerData;\n },\n // default quota\n quotaOptions: function quotaOptions() {\n // convert the preset array into objects\n var quotaPreset = this.settings.quotaPreset.reduce(function (acc, cur) {\n return acc.concat({\n id: cur,\n label: cur\n });\n }, []); // add default presets\n\n quotaPreset.unshift(this.unlimitedQuota);\n return quotaPreset;\n },\n // mapping saved values to objects\n defaultQuota: {\n get: function get() {\n if (this.selectedQuota !== false) {\n return this.selectedQuota;\n }\n\n if (this.settings.defaultQuota !== this.unlimitedQuota.id && OC.Util.computerFileSize(this.settings.defaultQuota) >= 0) {\n // if value is valid, let's map the quotaOptions or return custom quota\n return {\n id: this.settings.defaultQuota,\n label: this.settings.defaultQuota\n };\n }\n\n return this.unlimitedQuota; // unlimited\n },\n set: function set(quota) {\n this.selectedQuota = quota;\n }\n },\n // BUILD APP NAVIGATION MENU OBJECT\n menu: function menu() {\n var _this = this;\n\n // Data provided php side\n var self = this;\n var groups = this.$store.getters.getGroups;\n groups = Array.isArray(groups) ? groups : []; // Map groups\n\n groups = groups.map(function (group) {\n var item = {};\n item.id = group.id.replace(' ', '_');\n item.key = item.id;\n item.utils = {}; // router link to\n\n item.router = {\n name: 'group',\n params: {\n selectedGroup: group.id\n }\n }; // group name\n\n item.text = group.name;\n item.title = group.name; // users count for all groups\n\n if (group.usercount - group.disabled > 0 || group.usercount === -1) {\n item.utils.counter = group.usercount - group.disabled;\n }\n\n if (item.id !== 'admin' && item.id !== 'disabled' && _this.settings.isAdmin) {\n // add delete button on real groups\n item.utils.actions = [{\n icon: 'icon-delete',\n text: t('settings', 'Remove group'),\n action: function action() {\n self.removeGroup(group.id);\n }\n }];\n }\n\n return item;\n }); // Every item is added on top of the array, so we're going backward\n // Groups, separator, disabled, admin, everyone\n // Add separator\n\n var realGroups = groups.find(function (group) {\n return group.id !== 'disabled' && group.id !== 'admin';\n });\n realGroups = typeof realGroups === 'undefined' ? [] : realGroups;\n realGroups = Array.isArray(realGroups) ? realGroups : [realGroups];\n\n if (realGroups.length > 0) {\n var separator = {\n caption: true,\n text: t('settings', 'Groups')\n };\n groups.unshift(separator);\n } // Adjust admin and disabled groups\n\n\n var adminGroup = groups.find(function (group) {\n return group.id === 'admin';\n });\n var disabledGroup = groups.find(function (group) {\n return group.id === 'disabled';\n }); // filter out admin and disabled\n\n groups = groups.filter(function (group) {\n return ['admin', 'disabled'].indexOf(group.id) === -1;\n });\n\n if (adminGroup && adminGroup.text) {\n adminGroup.text = t('settings', 'Admins'); // rename admin group\n\n adminGroup.icon = 'icon-user-admin'; // set icon\n\n groups.unshift(adminGroup); // add admin group if present\n }\n\n if (disabledGroup && disabledGroup.text) {\n disabledGroup.text = t('settings', 'Disabled users'); // rename disabled group\n\n disabledGroup.icon = 'icon-disabled-users'; // set icon\n\n if (disabledGroup.utils && (disabledGroup.utils.counter > 0 // add disabled if not empty\n || disabledGroup.utils.counter === -1) // add disabled if ldap enabled\n ) {\n groups.unshift(disabledGroup);\n\n if (disabledGroup.utils.counter === -1) {\n // hides the counter instead of showing -1\n delete disabledGroup.utils.counter;\n }\n }\n } // Add everyone group\n\n\n var everyoneGroup = {\n id: 'everyone',\n key: 'everyone',\n icon: 'icon-contacts-dark',\n router: {\n name: 'users'\n },\n text: t('settings', 'Everyone')\n }; // users count\n\n if (this.userCount > 0) {\n Vue.set(everyoneGroup, 'utils', {\n counter: this.userCount\n });\n }\n\n groups.unshift(everyoneGroup);\n var addGroup = {\n id: 'addgroup',\n key: 'addgroup',\n icon: 'icon-add',\n text: t('settings', 'Add group'),\n classes: this.loadingAddGroup ? 'icon-loading-small' : ''\n };\n\n if (this.showAddGroupEntry) {\n Vue.set(addGroup, 'edit', {\n text: t('settings', 'Add group'),\n action: this.createGroup,\n reset: function reset() {\n self.showAddGroupEntry = false;\n }\n });\n addGroup.classes = 'editing';\n } else {\n Vue.set(addGroup, 'action', function () {\n self.showAddGroupEntry = true; // focus input\n\n Vue.nextTick(function () {\n window.addgroup.querySelector('form > input[type=\"text\"]').focus();\n });\n });\n }\n\n groups.unshift(addGroup);\n return groups;\n }\n },\n beforeMount: function beforeMount() {\n this.$store.commit('initGroups', {\n groups: this.$store.getters.getServerData.groups,\n orderBy: this.$store.getters.getServerData.sortGroups,\n userCount: this.$store.getters.getServerData.userCount\n });\n this.$store.dispatch('getPasswordPolicyMinLength');\n },\n created: function created() {\n // init the OCA.Settings.UserList object\n // and add the registerAction method\n Object.assign(OCA, {\n Settings: {\n UserList: {\n registerAction: this.registerAction\n }\n }\n });\n },\n methods: {\n toggleNewUserMenu: function toggleNewUserMenu() {\n this.showConfig.showNewUserForm = !this.showConfig.showNewUserForm;\n\n if (this.showConfig.showNewUserForm) {\n Vue.nextTick(function () {\n window.newusername.focus();\n });\n }\n },\n getLocalstorage: function getLocalstorage(key) {\n // force initialization\n var localConfig = this.$localStorage.get(key); // if localstorage is null, fallback to original values\n\n this.showConfig[key] = localConfig !== null ? localConfig === 'true' : this.showConfig[key];\n return this.showConfig[key];\n },\n setLocalStorage: function setLocalStorage(key, status) {\n this.showConfig[key] = status;\n this.$localStorage.set(key, status);\n return status;\n },\n removeGroup: function removeGroup(groupid) {\n var self = this; // TODO migrate to a vue js confirm dialog component\n\n OC.dialogs.confirm(t('settings', 'You are about to remove the group {group}. The users will NOT be deleted.', {\n group: groupid\n }), t('settings', 'Please confirm the group removal '), function (success) {\n if (success) {\n self.$store.dispatch('removeGroup', groupid);\n }\n });\n },\n\n /**\n * Dispatch default quota set request\n *\n * @param {string|Object} quota Quota in readable format '5 GB' or Object {id: '5 GB', label: '5GB'}\n */\n setDefaultQuota: function setDefaultQuota() {\n var _this2 = this;\n\n var quota = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'none';\n this.$store.dispatch('setAppConfig', {\n app: 'files',\n key: 'default_quota',\n // ensure we only send the preset id\n value: quota.id ? quota.id : quota\n }).then(function () {\n if (_typeof(quota) !== 'object') {\n quota = {\n id: quota,\n label: quota\n };\n }\n\n _this2.defaultQuota = quota;\n });\n },\n\n /**\n * Validate quota string to make sure it's a valid human file size\n *\n * @param {string} quota Quota in readable format '5 GB'\n * @returns {Promise|boolean}\n */\n validateQuota: function validateQuota(quota) {\n // only used for new presets sent through @Tag\n var validQuota = OC.Util.computerFileSize(quota);\n\n if (validQuota === null) {\n return this.setDefaultQuota('none');\n } else {\n // unify format output\n return this.setDefaultQuota(OC.Util.humanFileSize(OC.Util.computerFileSize(quota)));\n }\n },\n\n /**\n * Register a new action for the user menu\n *\n * @param {string} icon the icon class\n * @param {string} text the text to display\n * @param {Function} action the function to run\n * @returns {Array}\n */\n registerAction: function registerAction(icon, text, action) {\n this.externalActions.push({\n icon: icon,\n text: text,\n action: action\n });\n return this.externalActions;\n },\n\n /**\n * Create a new group\n *\n * @param {Object} event The form submit event\n */\n createGroup: function createGroup(event) {\n var _this3 = this;\n\n var gid = event.target[0].value;\n this.loadingAddGroup = true;\n this.$store.dispatch('addGroup', gid).then(function () {\n _this3.showAddGroupEntry = false;\n _this3.loadingAddGroup = false;\n\n _this3.$router.push({\n name: 'group',\n params: {\n selectedGroup: gid\n }\n });\n }).catch(function () {\n _this3.loadingAddGroup = false;\n });\n }\n }\n};","var render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"div\",\n {\n staticClass: \"user-list-grid\",\n attrs: { id: \"app-content\" },\n on: {\n \"&scroll\": function($event) {\n return _vm.onScroll($event)\n }\n }\n },\n [\n _c(\n \"div\",\n {\n staticClass: \"row\",\n class: { sticky: _vm.scrolled && !_vm.showConfig.showNewUserForm },\n attrs: { id: \"grid-header\" }\n },\n [\n _c(\"div\", { staticClass: \"avatar\", attrs: { id: \"headerAvatar\" } }),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"name\", attrs: { id: \"headerName\" } }, [\n _vm._v(\n \"\\n\\t\\t\\t\" + _vm._s(_vm.t(\"settings\", \"Username\")) + \"\\n\\n\\t\\t\\t\"\n ),\n _c(\"div\", { staticClass: \"subtitle\" }, [\n _vm._v(\n \"\\n\\t\\t\\t\\t\" +\n _vm._s(_vm.t(\"settings\", \"Display name\")) +\n \"\\n\\t\\t\\t\"\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\n \"div\",\n { staticClass: \"password\", attrs: { id: \"headerPassword\" } },\n [\n _vm._v(\n \"\\n\\t\\t\\t\" + _vm._s(_vm.t(\"settings\", \"Password\")) + \"\\n\\t\\t\"\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"div\",\n { staticClass: \"mailAddress\", attrs: { id: \"headerAddress\" } },\n [_vm._v(\"\\n\\t\\t\\t\" + _vm._s(_vm.t(\"settings\", \"Email\")) + \"\\n\\t\\t\")]\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"groups\", attrs: { id: \"headerGroups\" } }, [\n _vm._v(\"\\n\\t\\t\\t\" + _vm._s(_vm.t(\"settings\", \"Groups\")) + \"\\n\\t\\t\")\n ]),\n _vm._v(\" \"),\n _vm.subAdminsGroups.length > 0 && _vm.settings.isAdmin\n ? _c(\n \"div\",\n { staticClass: \"subadmins\", attrs: { id: \"headerSubAdmins\" } },\n [\n _vm._v(\n \"\\n\\t\\t\\t\" +\n _vm._s(_vm.t(\"settings\", \"Group admin for\")) +\n \"\\n\\t\\t\"\n )\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"quota\", attrs: { id: \"headerQuota\" } }, [\n _vm._v(\"\\n\\t\\t\\t\" + _vm._s(_vm.t(\"settings\", \"Quota\")) + \"\\n\\t\\t\")\n ]),\n _vm._v(\" \"),\n _vm.showConfig.showLanguages\n ? _c(\n \"div\",\n { staticClass: \"languages\", attrs: { id: \"headerLanguages\" } },\n [\n _vm._v(\n \"\\n\\t\\t\\t\" +\n _vm._s(_vm.t(\"settings\", \"Language\")) +\n \"\\n\\t\\t\"\n )\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _vm.showConfig.showUserBackend || _vm.showConfig.showStoragePath\n ? _c(\"div\", { staticClass: \"headerUserBackend userBackend\" }, [\n _vm.showConfig.showUserBackend\n ? _c(\"div\", { staticClass: \"userBackend\" }, [\n _vm._v(\n \"\\n\\t\\t\\t\\t\" +\n _vm._s(_vm.t(\"settings\", \"User backend\")) +\n \"\\n\\t\\t\\t\"\n )\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.showConfig.showStoragePath\n ? _c(\"div\", { staticClass: \"subtitle storageLocation\" }, [\n _vm._v(\n \"\\n\\t\\t\\t\\t\" +\n _vm._s(_vm.t(\"settings\", \"Storage location\")) +\n \"\\n\\t\\t\\t\"\n )\n ])\n : _vm._e()\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.showConfig.showLastLogin\n ? _c(\"div\", { staticClass: \"headerLastLogin lastLogin\" }, [\n _vm._v(\n \"\\n\\t\\t\\t\" +\n _vm._s(_vm.t(\"settings\", \"Last login\")) +\n \"\\n\\t\\t\"\n )\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"userActions\" })\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"form\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.showConfig.showNewUserForm,\n expression: \"showConfig.showNewUserForm\"\n }\n ],\n staticClass: \"row\",\n class: { sticky: _vm.scrolled && _vm.showConfig.showNewUserForm },\n attrs: { id: \"new-user\", disabled: _vm.loading.all },\n on: {\n submit: function($event) {\n $event.preventDefault()\n return _vm.createUser($event)\n }\n }\n },\n [\n _c(\"div\", {\n class: _vm.loading.all ? \"icon-loading-small\" : \"icon-add\"\n }),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"name\" }, [\n _c(\"input\", {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.newUser.id,\n expression: \"newUser.id\"\n }\n ],\n ref: \"newusername\",\n attrs: {\n id: \"newusername\",\n disabled: _vm.settings.newUserGenerateUserID,\n placeholder: _vm.settings.newUserGenerateUserID\n ? _vm.t(\"settings\", \"Will be autogenerated\")\n : _vm.t(\"settings\", \"Username\"),\n autocapitalize: \"none\",\n autocomplete: \"off\",\n autocorrect: \"off\",\n name: \"username\",\n pattern: \"[a-zA-Z0-9 _\\\\.@\\\\-']+\",\n required: \"\",\n type: \"text\"\n },\n domProps: { value: _vm.newUser.id },\n on: {\n input: function($event) {\n if ($event.target.composing) {\n return\n }\n _vm.$set(_vm.newUser, \"id\", $event.target.value)\n }\n }\n })\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"displayName\" }, [\n _c(\"input\", {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.newUser.displayName,\n expression: \"newUser.displayName\"\n }\n ],\n attrs: {\n id: \"newdisplayname\",\n placeholder: _vm.t(\"settings\", \"Display name\"),\n autocapitalize: \"none\",\n autocomplete: \"off\",\n autocorrect: \"off\",\n name: \"displayname\",\n type: \"text\"\n },\n domProps: { value: _vm.newUser.displayName },\n on: {\n input: function($event) {\n if ($event.target.composing) {\n return\n }\n _vm.$set(_vm.newUser, \"displayName\", $event.target.value)\n }\n }\n })\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"password\" }, [\n _c(\"input\", {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.newUser.password,\n expression: \"newUser.password\"\n }\n ],\n ref: \"newuserpassword\",\n attrs: {\n id: \"newuserpassword\",\n minlength: _vm.minPasswordLength,\n placeholder: _vm.t(\"settings\", \"Password\"),\n required: _vm.newUser.mailAddress === \"\",\n autocapitalize: \"none\",\n autocomplete: \"new-password\",\n autocorrect: \"off\",\n name: \"password\",\n type: \"password\"\n },\n domProps: { value: _vm.newUser.password },\n on: {\n input: function($event) {\n if ($event.target.composing) {\n return\n }\n _vm.$set(_vm.newUser, \"password\", $event.target.value)\n }\n }\n })\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"mailAddress\" }, [\n _c(\"input\", {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.newUser.mailAddress,\n expression: \"newUser.mailAddress\"\n }\n ],\n attrs: {\n id: \"newemail\",\n placeholder: _vm.t(\"settings\", \"Email\"),\n required:\n _vm.newUser.password === \"\" ||\n _vm.settings.newUserRequireEmail,\n autocapitalize: \"none\",\n autocomplete: \"off\",\n autocorrect: \"off\",\n name: \"email\",\n type: \"email\"\n },\n domProps: { value: _vm.newUser.mailAddress },\n on: {\n input: function($event) {\n if ($event.target.composing) {\n return\n }\n _vm.$set(_vm.newUser, \"mailAddress\", $event.target.value)\n }\n }\n })\n ]),\n _vm._v(\" \"),\n _c(\n \"div\",\n { staticClass: \"groups\" },\n [\n !_vm.settings.isAdmin\n ? _c(\"input\", {\n class: { \"icon-loading-small\": _vm.loading.groups },\n attrs: {\n id: \"newgroups\",\n required: !_vm.settings.isAdmin,\n tabindex: \"-1\",\n type: \"text\"\n },\n domProps: { value: _vm.newUser.groups }\n })\n : _vm._e(),\n _vm._v(\" \"),\n _c(\n \"Multiselect\",\n {\n staticClass: \"multiselect-vue\",\n attrs: {\n \"close-on-select\": false,\n disabled: _vm.loading.groups || _vm.loading.all,\n multiple: true,\n options: _vm.canAddGroups,\n placeholder: _vm.t(\"settings\", \"Add user in group\"),\n \"tag-width\": 60,\n taggable: true,\n label: \"name\",\n \"tag-placeholder\": \"create\",\n \"track-by\": \"id\"\n },\n on: { tag: _vm.createGroup },\n model: {\n value: _vm.newUser.groups,\n callback: function($$v) {\n _vm.$set(_vm.newUser, \"groups\", $$v)\n },\n expression: \"newUser.groups\"\n }\n },\n [\n _c(\n \"span\",\n { attrs: { slot: \"noResult\" }, slot: \"noResult\" },\n [_vm._v(_vm._s(_vm.t(\"settings\", \"No results\")))]\n )\n ]\n )\n ],\n 1\n ),\n _vm._v(\" \"),\n _vm.subAdminsGroups.length > 0 && _vm.settings.isAdmin\n ? _c(\n \"div\",\n { staticClass: \"subadmins\" },\n [\n _c(\n \"Multiselect\",\n {\n staticClass: \"multiselect-vue\",\n attrs: {\n \"close-on-select\": false,\n multiple: true,\n options: _vm.subAdminsGroups,\n placeholder: _vm.t(\"settings\", \"Set user as admin for\"),\n \"tag-width\": 60,\n label: \"name\",\n \"track-by\": \"id\"\n },\n model: {\n value: _vm.newUser.subAdminsGroups,\n callback: function($$v) {\n _vm.$set(_vm.newUser, \"subAdminsGroups\", $$v)\n },\n expression: \"newUser.subAdminsGroups\"\n }\n },\n [\n _c(\n \"span\",\n { attrs: { slot: \"noResult\" }, slot: \"noResult\" },\n [_vm._v(_vm._s(_vm.t(\"settings\", \"No results\")))]\n )\n ]\n )\n ],\n 1\n )\n : _vm._e(),\n _vm._v(\" \"),\n _c(\n \"div\",\n { staticClass: \"quota\" },\n [\n _c(\"Multiselect\", {\n staticClass: \"multiselect-vue\",\n attrs: {\n \"allow-empty\": false,\n options: _vm.quotaOptions,\n placeholder: _vm.t(\"settings\", \"Select user quota\"),\n taggable: true,\n label: \"label\",\n \"track-by\": \"id\"\n },\n on: { tag: _vm.validateQuota },\n model: {\n value: _vm.newUser.quota,\n callback: function($$v) {\n _vm.$set(_vm.newUser, \"quota\", $$v)\n },\n expression: \"newUser.quota\"\n }\n })\n ],\n 1\n ),\n _vm._v(\" \"),\n _vm.showConfig.showLanguages\n ? _c(\n \"div\",\n { staticClass: \"languages\" },\n [\n _c(\"Multiselect\", {\n staticClass: \"multiselect-vue\",\n attrs: {\n \"allow-empty\": false,\n options: _vm.languages,\n placeholder: _vm.t(\"settings\", \"Default language\"),\n \"group-label\": \"label\",\n \"group-values\": \"languages\",\n label: \"name\",\n \"track-by\": \"code\"\n },\n model: {\n value: _vm.newUser.language,\n callback: function($$v) {\n _vm.$set(_vm.newUser, \"language\", $$v)\n },\n expression: \"newUser.language\"\n }\n })\n ],\n 1\n )\n : _vm._e(),\n _vm._v(\" \"),\n _vm.showConfig.showStoragePath\n ? _c(\"div\", { staticClass: \"storageLocation\" })\n : _vm._e(),\n _vm._v(\" \"),\n _vm.showConfig.showUserBackend\n ? _c(\"div\", { staticClass: \"userBackend\" })\n : _vm._e(),\n _vm._v(\" \"),\n _vm.showConfig.showLastLogin\n ? _c(\"div\", { staticClass: \"lastLogin\" })\n : _vm._e(),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"userActions\" }, [\n _c(\"input\", {\n staticClass: \"button primary icon-checkmark-white has-tooltip\",\n attrs: {\n id: \"newsubmit\",\n title: _vm.t(\"settings\", \"Add a new user\"),\n type: \"submit\",\n value: \"\"\n }\n })\n ])\n ]\n ),\n _vm._v(\" \"),\n _vm._l(_vm.filteredUsers, function(user, key) {\n return _c(\"user-row\", {\n key: key,\n attrs: {\n \"external-actions\": _vm.externalActions,\n groups: _vm.groups,\n languages: _vm.languages,\n \"quota-options\": _vm.quotaOptions,\n settings: _vm.settings,\n \"show-config\": _vm.showConfig,\n \"sub-admins-groups\": _vm.subAdminsGroups,\n user: user\n }\n })\n }),\n _vm._v(\" \"),\n _c(\n \"InfiniteLoading\",\n { ref: \"infiniteLoading\", on: { infinite: _vm.infiniteHandler } },\n [\n _c(\"div\", { attrs: { slot: \"spinner\" }, slot: \"spinner\" }, [\n _c(\"div\", { staticClass: \"users-icon-loading icon-loading\" })\n ]),\n _vm._v(\" \"),\n _c(\"div\", { attrs: { slot: \"no-more\" }, slot: \"no-more\" }, [\n _c(\"div\", { staticClass: \"users-list-end\" })\n ]),\n _vm._v(\" \"),\n _c(\"div\", { attrs: { slot: \"no-results\" }, slot: \"no-results\" }, [\n _c(\"div\", { attrs: { id: \"emptycontent\" } }, [\n _c(\"div\", { staticClass: \"icon-contacts-dark\" }),\n _vm._v(\" \"),\n _c(\"h2\", [_vm._v(_vm._s(_vm.t(\"settings\", \"No users in here\")))])\n ])\n ])\n ]\n )\n ],\n 2\n )\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\nexport { render, staticRenderFns }","var render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return Object.keys(_vm.user).length === 1\n ? _c(\"div\", { staticClass: \"row\", attrs: { \"data-id\": _vm.user.id } }, [\n _c(\n \"div\",\n {\n staticClass: \"avatar\",\n class: {\n \"icon-loading-small\":\n _vm.loading.delete || _vm.loading.disable || _vm.loading.wipe\n }\n },\n [\n !_vm.loading.delete && !_vm.loading.disable && !_vm.loading.wipe\n ? _c(\"img\", {\n attrs: {\n src: _vm.generateAvatar(_vm.user.id, 32),\n srcset:\n _vm.generateAvatar(_vm.user.id, 64) +\n \" 2x, \" +\n _vm.generateAvatar(_vm.user.id, 128) +\n \" 4x\",\n alt: \"\",\n height: \"32\",\n width: \"32\"\n }\n })\n : _vm._e()\n ]\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"name\" }, [\n _vm._v(\"\\n\\t\\t\" + _vm._s(_vm.user.id) + \"\\n\\t\")\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"obfuscated\" }, [\n _vm._v(\n \"\\n\\t\\t\" +\n _vm._s(\n _vm.t(\n \"settings\",\n \"You do not have permissions to see the details of this user\"\n )\n ) +\n \"\\n\\t\"\n )\n ])\n ])\n : !_vm.editing\n ? _c(\"UserRowSimple\", {\n attrs: {\n editing: _vm.editing,\n \"feedback-message\": _vm.feedbackMessage,\n groups: _vm.groups,\n languages: _vm.languages,\n loading: _vm.loading,\n \"opened-menu\": _vm.openedMenu,\n settings: _vm.settings,\n \"show-config\": _vm.showConfig,\n \"sub-admins-groups\": _vm.subAdminsGroups,\n \"user-actions\": _vm.userActions,\n user: _vm.user\n },\n on: {\n \"update:editing\": function($event) {\n _vm.editing = $event\n },\n hideMenu: _vm.hideMenu,\n toggleMenu: _vm.toggleMenu\n }\n })\n : _c(\n \"div\",\n {\n staticClass: \"row row--editable\",\n class: { disabled: _vm.loading.delete || _vm.loading.disable },\n attrs: { \"data-id\": _vm.user.id }\n },\n [\n _c(\n \"div\",\n {\n staticClass: \"avatar\",\n class: {\n \"icon-loading-small\":\n _vm.loading.delete || _vm.loading.disable || _vm.loading.wipe\n }\n },\n [\n !_vm.loading.delete && !_vm.loading.disable && !_vm.loading.wipe\n ? _c(\"img\", {\n attrs: {\n src: _vm.generateAvatar(_vm.user.id, 32),\n srcset:\n _vm.generateAvatar(_vm.user.id, 64) +\n \" 2x, \" +\n _vm.generateAvatar(_vm.user.id, 128) +\n \" 4x\",\n alt: \"\",\n height: \"32\",\n width: \"32\"\n }\n })\n : _vm._e()\n ]\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"displayName\" }, [\n _c(\n \"form\",\n {\n staticClass: \"displayName\",\n class: { \"icon-loading-small\": _vm.loading.displayName },\n on: {\n submit: function($event) {\n $event.preventDefault()\n return _vm.updateDisplayName($event)\n }\n }\n },\n [\n _vm.user.backendCapabilities.setDisplayName\n ? [\n _vm.user.backendCapabilities.setDisplayName\n ? _c(\"input\", {\n ref: \"displayName\",\n attrs: {\n id: \"displayName\" + _vm.user.id + _vm.rand,\n disabled:\n _vm.loading.displayName || _vm.loading.all,\n autocapitalize: \"off\",\n autocomplete: \"new-password\",\n autocorrect: \"off\",\n spellcheck: \"false\",\n type: \"text\"\n },\n domProps: { value: _vm.user.displayname }\n })\n : _vm._e(),\n _vm._v(\" \"),\n _vm.user.backendCapabilities.setDisplayName\n ? _c(\"input\", {\n staticClass: \"icon-confirm\",\n attrs: { type: \"submit\", value: \"\" }\n })\n : _vm._e()\n ]\n : _c(\"div\", {\n directives: [\n {\n name: \"tooltip\",\n rawName: \"v-tooltip.auto\",\n value: _vm.t(\n \"settings\",\n \"The backend does not support changing the display name\"\n ),\n expression:\n \"t('settings', 'The backend does not support changing the display name')\",\n modifiers: { auto: true }\n }\n ],\n staticClass: \"name\"\n })\n ],\n 2\n )\n ]),\n _vm._v(\" \"),\n _vm.settings.canChangePassword &&\n _vm.user.backendCapabilities.setPassword\n ? _c(\n \"form\",\n {\n staticClass: \"password\",\n class: { \"icon-loading-small\": _vm.loading.password },\n on: {\n submit: function($event) {\n $event.preventDefault()\n return _vm.updatePassword($event)\n }\n }\n },\n [\n _c(\"input\", {\n ref: \"password\",\n attrs: {\n id: \"password\" + _vm.user.id + _vm.rand,\n disabled: _vm.loading.password || _vm.loading.all,\n minlength: _vm.minPasswordLength,\n placeholder: _vm.t(\"settings\", \"Add new password\"),\n autocapitalize: \"off\",\n autocomplete: \"new-password\",\n autocorrect: \"off\",\n required: \"\",\n spellcheck: \"false\",\n type: \"password\",\n value: \"\"\n }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"icon-confirm\",\n attrs: { type: \"submit\", value: \"\" }\n })\n ]\n )\n : _c(\"div\"),\n _vm._v(\" \"),\n _c(\n \"form\",\n {\n staticClass: \"mailAddress\",\n class: { \"icon-loading-small\": _vm.loading.mailAddress },\n on: {\n submit: function($event) {\n $event.preventDefault()\n return _vm.updateEmail($event)\n }\n }\n },\n [\n _c(\"input\", {\n ref: \"mailAddress\",\n attrs: {\n id: \"mailAddress\" + _vm.user.id + _vm.rand,\n disabled: _vm.loading.mailAddress || _vm.loading.all,\n placeholder: _vm.t(\"settings\", \"Add new email address\"),\n autocapitalize: \"off\",\n autocomplete: \"new-password\",\n autocorrect: \"off\",\n spellcheck: \"false\",\n type: \"email\"\n },\n domProps: { value: _vm.user.email }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"icon-confirm\",\n attrs: { type: \"submit\", value: \"\" }\n })\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass: \"groups\",\n class: { \"icon-loading-small\": _vm.loading.groups }\n },\n [\n _c(\n \"Multiselect\",\n {\n staticClass: \"multiselect-vue\",\n attrs: {\n \"close-on-select\": false,\n disabled: _vm.loading.groups || _vm.loading.all,\n limit: 2,\n multiple: true,\n options: _vm.availableGroups,\n placeholder: _vm.t(\"settings\", \"Add user in group\"),\n \"tag-width\": 60,\n taggable: _vm.settings.isAdmin,\n value: _vm.userGroups,\n label: \"name\",\n \"tag-placeholder\": \"create\",\n \"track-by\": \"id\"\n },\n on: {\n remove: _vm.removeUserGroup,\n select: _vm.addUserGroup,\n tag: _vm.createGroup\n }\n },\n [\n _c(\n \"span\",\n { attrs: { slot: \"noResult\" }, slot: \"noResult\" },\n [_vm._v(_vm._s(_vm.t(\"settings\", \"No results\")))]\n )\n ]\n )\n ],\n 1\n ),\n _vm._v(\" \"),\n _vm.subAdminsGroups.length > 0 && _vm.settings.isAdmin\n ? _c(\n \"div\",\n {\n staticClass: \"subadmins\",\n class: { \"icon-loading-small\": _vm.loading.subadmins }\n },\n [\n _c(\n \"Multiselect\",\n {\n staticClass: \"multiselect-vue\",\n attrs: {\n \"close-on-select\": false,\n disabled: _vm.loading.subadmins || _vm.loading.all,\n limit: 2,\n multiple: true,\n options: _vm.subAdminsGroups,\n placeholder: _vm.t(\"settings\", \"Set user as admin for\"),\n \"tag-width\": 60,\n value: _vm.userSubAdminsGroups,\n label: \"name\",\n \"track-by\": \"id\"\n },\n on: {\n remove: _vm.removeUserSubAdmin,\n select: _vm.addUserSubAdmin\n }\n },\n [\n _c(\n \"span\",\n { attrs: { slot: \"noResult\" }, slot: \"noResult\" },\n [_vm._v(_vm._s(_vm.t(\"settings\", \"No results\")))]\n )\n ]\n )\n ],\n 1\n )\n : _vm._e(),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"tooltip\",\n rawName: \"v-tooltip.auto\",\n value: _vm.usedSpace,\n expression: \"usedSpace\",\n modifiers: { auto: true }\n }\n ],\n staticClass: \"quota\",\n class: { \"icon-loading-small\": _vm.loading.quota }\n },\n [\n _c(\"Multiselect\", {\n staticClass: \"multiselect-vue\",\n attrs: {\n \"allow-empty\": false,\n disabled: _vm.loading.quota || _vm.loading.all,\n options: _vm.quotaOptions,\n placeholder: _vm.t(\"settings\", \"Select user quota\"),\n taggable: true,\n value: _vm.userQuota,\n label: \"label\",\n \"tag-placeholder\": \"create\",\n \"track-by\": \"id\"\n },\n on: { input: _vm.setUserQuota, tag: _vm.validateQuota }\n })\n ],\n 1\n ),\n _vm._v(\" \"),\n _vm.showConfig.showLanguages\n ? _c(\n \"div\",\n {\n staticClass: \"languages\",\n class: { \"icon-loading-small\": _vm.loading.languages }\n },\n [\n _c(\"Multiselect\", {\n staticClass: \"multiselect-vue\",\n attrs: {\n \"allow-empty\": false,\n disabled: _vm.loading.languages || _vm.loading.all,\n options: _vm.languages,\n placeholder: _vm.t(\"settings\", \"No language set\"),\n value: _vm.userLanguage,\n \"group-label\": \"label\",\n \"group-values\": \"languages\",\n label: \"name\",\n \"track-by\": \"code\"\n },\n on: { input: _vm.setUserLanguage }\n })\n ],\n 1\n )\n : _vm._e(),\n _vm._v(\" \"),\n _vm.showConfig.showStoragePath || _vm.showConfig.showUserBackend\n ? _c(\"div\", { staticClass: \"storageLocation\" })\n : _vm._e(),\n _vm._v(\" \"),\n _vm.showConfig.showLastLogin ? _c(\"div\") : _vm._e(),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"userActions\" }, [\n _vm.OC.currentUser !== _vm.user.id &&\n _vm.user.id !== \"admin\" &&\n !_vm.loading.all\n ? _c(\n \"div\",\n { staticClass: \"toggleUserActions\" },\n [\n _c(\n \"Actions\",\n [\n _c(\n \"ActionButton\",\n {\n attrs: { icon: \"icon-checkmark\" },\n on: {\n click: function($event) {\n _vm.editing = false\n }\n }\n },\n [\n _vm._v(\n \"\\n\\t\\t\\t\\t\\t\" +\n _vm._s(_vm.t(\"settings\", \"Done\")) +\n \"\\n\\t\\t\\t\\t\"\n )\n ]\n )\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"div\", {\n directives: [\n {\n name: \"click-outside\",\n rawName: \"v-click-outside\",\n value: _vm.hideMenu,\n expression: \"hideMenu\"\n }\n ],\n staticClass: \"icon-more\",\n on: { click: _vm.toggleMenu }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass: \"popovermenu\",\n class: { open: _vm.openedMenu }\n },\n [_c(\"PopoverMenu\", { attrs: { menu: _vm.userActions } })],\n 1\n )\n ],\n 1\n )\n : _vm._e(),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass: \"feedback\",\n style: { opacity: _vm.feedbackMessage !== \"\" ? 1 : 0 }\n },\n [\n _c(\"div\", { staticClass: \"icon-checkmark\" }),\n _vm._v(\"\\n\\t\\t\\t\" + _vm._s(_vm.feedbackMessage) + \"\\n\\t\\t\")\n ]\n )\n ])\n ]\n )\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\nexport { render, staticRenderFns }","var render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"div\",\n {\n staticClass: \"row\",\n class: { disabled: _vm.loading.delete || _vm.loading.disable },\n attrs: { \"data-id\": _vm.user.id }\n },\n [\n _c(\n \"div\",\n {\n staticClass: \"avatar\",\n class: {\n \"icon-loading-small\":\n _vm.loading.delete || _vm.loading.disable || _vm.loading.wipe\n }\n },\n [\n !_vm.loading.delete && !_vm.loading.disable && !_vm.loading.wipe\n ? _c(\"img\", {\n attrs: {\n alt: \"\",\n width: \"32\",\n height: \"32\",\n src: _vm.generateAvatar(_vm.user.id, 32),\n srcset:\n _vm.generateAvatar(_vm.user.id, 64) +\n \" 2x, \" +\n _vm.generateAvatar(_vm.user.id, 128) +\n \" 4x\"\n }\n })\n : _vm._e()\n ]\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"name\" }, [\n _vm._v(\"\\n\\t\\t\" + _vm._s(_vm.user.id) + \"\\n\\t\\t\"),\n _c(\"div\", { staticClass: \"displayName subtitle\" }, [\n _vm._v(\"\\n\\t\\t\\t\" + _vm._s(_vm.user.displayname) + \"\\n\\t\\t\")\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\"),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"mailAddress\" }, [\n _vm._v(\"\\n\\t\\t\" + _vm._s(_vm.user.email) + \"\\n\\t\")\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"groups\" }, [\n _vm._v(\"\\n\\t\\t\" + _vm._s(_vm.userGroupsLabels) + \"\\n\\t\")\n ]),\n _vm._v(\" \"),\n _vm.subAdminsGroups.length > 0 && _vm.settings.isAdmin\n ? _c(\"div\", { staticClass: \"subAdminsGroups\" }, [\n _vm._v(\"\\n\\t\\t\" + _vm._s(_vm.userSubAdminsGroupsLabels) + \"\\n\\t\")\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"tooltip\",\n rawName: \"v-tooltip.auto\",\n value: _vm.usedSpace,\n expression: \"usedSpace\",\n modifiers: { auto: true }\n }\n ],\n staticClass: \"quota\"\n },\n [\n _c(\"progress\", {\n staticClass: \"quota-user-progress\",\n class: { warn: _vm.usedQuota > 80 },\n attrs: { max: \"100\" },\n domProps: { value: _vm.usedQuota }\n })\n ]\n ),\n _vm._v(\" \"),\n _vm.showConfig.showLanguages\n ? _c(\"div\", { staticClass: \"languages\" }, [\n _vm._v(\"\\n\\t\\t\" + _vm._s(_vm.userLanguage.name) + \"\\n\\t\")\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.showConfig.showUserBackend || _vm.showConfig.showStoragePath\n ? _c(\"div\", { staticClass: \"userBackend\" }, [\n _vm.showConfig.showUserBackend\n ? _c(\"div\", { staticClass: \"userBackend\" }, [\n _vm._v(\"\\n\\t\\t\\t\" + _vm._s(_vm.user.backend) + \"\\n\\t\\t\")\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.showConfig.showStoragePath\n ? _c(\"div\", { staticClass: \"storageLocation subtitle\" }, [\n _vm._v(\n \"\\n\\t\\t\\t\" + _vm._s(_vm.user.storageLocation) + \"\\n\\t\\t\"\n )\n ])\n : _vm._e()\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.showConfig.showLastLogin\n ? _c(\n \"div\",\n {\n directives: [\n {\n name: \"tooltip\",\n rawName: \"v-tooltip.auto\",\n value: _vm.userLastLoginTooltip,\n expression: \"userLastLoginTooltip\",\n modifiers: { auto: true }\n }\n ],\n staticClass: \"lastLogin\"\n },\n [_vm._v(\"\\n\\t\\t\" + _vm._s(_vm.userLastLogin) + \"\\n\\t\")]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"userActions\" }, [\n _vm.canEdit && !_vm.loading.all\n ? _c(\n \"div\",\n { staticClass: \"toggleUserActions\" },\n [\n _c(\n \"Actions\",\n [\n _c(\n \"ActionButton\",\n {\n attrs: { icon: \"icon-rename\" },\n on: { click: _vm.toggleEdit }\n },\n [\n _vm._v(\n \"\\n\\t\\t\\t\\t\\t\" +\n _vm._s(_vm.t(\"settings\", \"Edit User\")) +\n \"\\n\\t\\t\\t\\t\"\n )\n ]\n )\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"div\", {\n directives: [\n {\n name: \"click-outside\",\n rawName: \"v-click-outside\",\n value: _vm.hideMenu,\n expression: \"hideMenu\"\n }\n ],\n staticClass: \"icon-more\",\n on: {\n click: function($event) {\n return _vm.$emit(\"toggleMenu\")\n }\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass: \"popovermenu\",\n class: { open: _vm.openedMenu }\n },\n [_c(\"PopoverMenu\", { attrs: { menu: _vm.userActions } })],\n 1\n )\n ],\n 1\n )\n : _vm._e(),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass: \"feedback\",\n style: { opacity: _vm.feedbackMessage !== \"\" ? 1 : 0 }\n },\n [\n _c(\"div\", { staticClass: \"icon-checkmark\" }),\n _vm._v(\"\\n\\t\\t\\t\" + _vm._s(_vm.feedbackMessage) + \"\\n\\t\\t\")\n ]\n )\n ])\n ]\n )\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\nexport { render, staticRenderFns }","var render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"Content\",\n {\n attrs: {\n \"app-name\": \"settings\",\n \"navigation-class\": { \"icon-loading\": _vm.loadingAddGroup }\n }\n },\n [\n _c(\n \"AppNavigation\",\n [\n _c(\"AppNavigationNew\", {\n attrs: {\n \"button-id\": \"new-user-button\",\n text: _vm.t(\"settings\", \"New user\"),\n \"button-class\": \"icon-add\"\n },\n on: { click: _vm.toggleNewUserMenu }\n }),\n _vm._v(\" \"),\n _c(\n \"ul\",\n { attrs: { id: \"usergrouplist\" } },\n _vm._l(_vm.menu, function(item) {\n return _c(\"AppNavigationItem\", {\n key: item.key,\n attrs: { item: item }\n })\n }),\n 1\n ),\n _vm._v(\" \"),\n _c(\"AppNavigationSettings\", [\n _c(\n \"div\",\n [\n _c(\"p\", [_vm._v(_vm._s(_vm.t(\"settings\", \"Default quota:\")))]),\n _vm._v(\" \"),\n _c(\"Multiselect\", {\n attrs: {\n value: _vm.defaultQuota,\n options: _vm.quotaOptions,\n \"tag-placeholder\": \"create\",\n placeholder: _vm.t(\"settings\", \"Select default quota\"),\n label: \"label\",\n \"track-by\": \"id\",\n \"allow-empty\": false,\n taggable: true\n },\n on: { tag: _vm.validateQuota, input: _vm.setDefaultQuota }\n })\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"div\", [\n _c(\"input\", {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.showLanguages,\n expression: \"showLanguages\"\n }\n ],\n staticClass: \"checkbox\",\n attrs: { id: \"showLanguages\", type: \"checkbox\" },\n domProps: {\n checked: Array.isArray(_vm.showLanguages)\n ? _vm._i(_vm.showLanguages, null) > -1\n : _vm.showLanguages\n },\n on: {\n change: function($event) {\n var $$a = _vm.showLanguages,\n $$el = $event.target,\n $$c = $$el.checked ? true : false\n if (Array.isArray($$a)) {\n var $$v = null,\n $$i = _vm._i($$a, $$v)\n if ($$el.checked) {\n $$i < 0 && (_vm.showLanguages = $$a.concat([$$v]))\n } else {\n $$i > -1 &&\n (_vm.showLanguages = $$a\n .slice(0, $$i)\n .concat($$a.slice($$i + 1)))\n }\n } else {\n _vm.showLanguages = $$c\n }\n }\n }\n }),\n _vm._v(\" \"),\n _c(\"label\", { attrs: { for: \"showLanguages\" } }, [\n _vm._v(_vm._s(_vm.t(\"settings\", \"Show Languages\")))\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", [\n _c(\"input\", {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.showLastLogin,\n expression: \"showLastLogin\"\n }\n ],\n staticClass: \"checkbox\",\n attrs: { id: \"showLastLogin\", type: \"checkbox\" },\n domProps: {\n checked: Array.isArray(_vm.showLastLogin)\n ? _vm._i(_vm.showLastLogin, null) > -1\n : _vm.showLastLogin\n },\n on: {\n change: function($event) {\n var $$a = _vm.showLastLogin,\n $$el = $event.target,\n $$c = $$el.checked ? true : false\n if (Array.isArray($$a)) {\n var $$v = null,\n $$i = _vm._i($$a, $$v)\n if ($$el.checked) {\n $$i < 0 && (_vm.showLastLogin = $$a.concat([$$v]))\n } else {\n $$i > -1 &&\n (_vm.showLastLogin = $$a\n .slice(0, $$i)\n .concat($$a.slice($$i + 1)))\n }\n } else {\n _vm.showLastLogin = $$c\n }\n }\n }\n }),\n _vm._v(\" \"),\n _c(\"label\", { attrs: { for: \"showLastLogin\" } }, [\n _vm._v(_vm._s(_vm.t(\"settings\", \"Show last login\")))\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", [\n _c(\"input\", {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.showUserBackend,\n expression: \"showUserBackend\"\n }\n ],\n staticClass: \"checkbox\",\n attrs: { id: \"showUserBackend\", type: \"checkbox\" },\n domProps: {\n checked: Array.isArray(_vm.showUserBackend)\n ? _vm._i(_vm.showUserBackend, null) > -1\n : _vm.showUserBackend\n },\n on: {\n change: function($event) {\n var $$a = _vm.showUserBackend,\n $$el = $event.target,\n $$c = $$el.checked ? true : false\n if (Array.isArray($$a)) {\n var $$v = null,\n $$i = _vm._i($$a, $$v)\n if ($$el.checked) {\n $$i < 0 && (_vm.showUserBackend = $$a.concat([$$v]))\n } else {\n $$i > -1 &&\n (_vm.showUserBackend = $$a\n .slice(0, $$i)\n .concat($$a.slice($$i + 1)))\n }\n } else {\n _vm.showUserBackend = $$c\n }\n }\n }\n }),\n _vm._v(\" \"),\n _c(\"label\", { attrs: { for: \"showUserBackend\" } }, [\n _vm._v(_vm._s(_vm.t(\"settings\", \"Show user backend\")))\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", [\n _c(\"input\", {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.showStoragePath,\n expression: \"showStoragePath\"\n }\n ],\n staticClass: \"checkbox\",\n attrs: { id: \"showStoragePath\", type: \"checkbox\" },\n domProps: {\n checked: Array.isArray(_vm.showStoragePath)\n ? _vm._i(_vm.showStoragePath, null) > -1\n : _vm.showStoragePath\n },\n on: {\n change: function($event) {\n var $$a = _vm.showStoragePath,\n $$el = $event.target,\n $$c = $$el.checked ? true : false\n if (Array.isArray($$a)) {\n var $$v = null,\n $$i = _vm._i($$a, $$v)\n if ($$el.checked) {\n $$i < 0 && (_vm.showStoragePath = $$a.concat([$$v]))\n } else {\n $$i > -1 &&\n (_vm.showStoragePath = $$a\n .slice(0, $$i)\n .concat($$a.slice($$i + 1)))\n }\n } else {\n _vm.showStoragePath = $$c\n }\n }\n }\n }),\n _vm._v(\" \"),\n _c(\"label\", { attrs: { for: \"showStoragePath\" } }, [\n _vm._v(_vm._s(_vm.t(\"settings\", \"Show storage path\")))\n ])\n ])\n ])\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\n \"AppContent\",\n [\n _c(\"UserList\", {\n attrs: {\n users: _vm.users,\n \"show-config\": _vm.showConfig,\n \"selected-group\": _vm.selectedGroup,\n \"external-actions\": _vm.externalActions\n },\n scopedSlots: _vm._u([\n {\n key: \"content\",\n fn: function() {\n return undefined\n },\n proxy: true\n }\n ])\n })\n ],\n 1\n )\n ],\n 1\n )\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\nexport { render, staticRenderFns }"],"mappings":";;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAiBA;AACA;AACA;;;;;;;;;;;;ACtCA;AAAA;AAAA;;;;;;;;;;;;ACAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;;;;;;;;;;;ACAA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAiBA;AACA;AACA;;;;;;;;;;;;ACtCA;AAAA;AAAA;;;;;;;;;;;;ACAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;;;;;;;;;;;ACAA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAiBA;AACA;AACA;;;;;;;;;;;;ACtCA;AAAA;AAAA;;;;;;;;;;;;ACAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;;;;;;;;;;;ACAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;AC/MA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAiBA;AACA;AACA;;;;;;;;;;;;ACtCA;AAAA;AAAA;;;;;;;;;;;;ACAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;;;;;;;;;;;ACAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;ACjlBA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;AC11BA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;AC3JA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;ACnfA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;AC7fA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;AC7dA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;AC7MA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;A","sourceRoot":""} \ No newline at end of file diff --git a/apps/settings/src/components/UserList.vue b/apps/settings/src/components/UserList.vue index 40d88007f8578..4d8070787acd4 100644 --- a/apps/settings/src/components/UserList.vue +++ b/apps/settings/src/components/UserList.vue @@ -22,58 +22,6 @@