]> source.dussan.org Git - nextcloud-server.git/commitdiff
fix new user table
authorGretaD <gretadoci@gmail.com>
Mon, 6 Jan 2020 12:42:25 +0000 (13:42 +0100)
committerJulius Härtl <jus@bitgrid.net>
Thu, 16 Jan 2020 19:12:00 +0000 (20:12 +0100)
Signed-off-by: GretaD <gretadoci@gmail.com>
apps/settings/css/settings.scss
apps/settings/js/vue-2.js [new file with mode: 0644]
apps/settings/js/vue-2.js.map [new file with mode: 0644]
apps/settings/src/components/UserList.vue

index a818d1f5d1492d9660a0edc53e7586fccbd57216..b201ff1821cf4ac353ca4cd1ed8c9205c5be293f 100644 (file)
@@ -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 (file)
index 0000000..5256cff
--- /dev/null
@@ -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æ <skjnldsv@protonmail.com>
+ *
+ * @author John Molakvoæ <skjnldsv@protonmail.com>
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+/* 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 (file)
index 0000000..08af45f
--- /dev/null
@@ -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æ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @license GNU AGPL version 3 or any later version\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\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
index 40d88007f8578c47da78966c3bf8bbb76ad647ec..4d8070787acd4b88c90aab0527d0dc4656188e78 100644 (file)
 
 <template>
        <div id="app-content" class="user-list-grid" @scroll.passive="onScroll">
-               <div id="grid-header"
-                       :class="{'sticky': scrolled && !showConfig.showNewUserForm}"
-                       class="row">
-                       <div id="headerAvatar" class="avatar" />
-                       <div id="headerName" class="name">
-                               {{ t('settings', 'Username') }}
-
-                               <div class="subtitle">
-                                       {{ t('settings', 'Display name') }}
-                               </div>
-                       </div>
-                       <div id="headerPassword" class="password">
-                               {{ t('settings', 'Password') }}
-                       </div>
-                       <div id="headerAddress" class="mailAddress">
-                               {{ t('settings', 'Email') }}
-                       </div>
-                       <div id="headerGroups" class="groups">
-                               {{ t('settings', 'Groups') }}
-                       </div>
-                       <div v-if="subAdminsGroups.length>0 && settings.isAdmin"
-                               id="headerSubAdmins"
-                               class="subadmins">
-                               {{ t('settings', 'Group admin for') }}
-                       </div>
-                       <div id="headerQuota" class="quota">
-                               {{ t('settings', 'Quota') }}
-                       </div>
-                       <div v-if="showConfig.showLanguages"
-                               id="headerLanguages"
-                               class="languages">
-                               {{ t('settings', 'Language') }}
-                       </div>
-
-                       <div v-if="showConfig.showUserBackend || showConfig.showStoragePath"
-                               class="headerUserBackend userBackend">
-                               <div v-if="showConfig.showUserBackend" class="userBackend">
-                                       {{ t('settings', 'User backend') }}
-                               </div>
-                               <div v-if="showConfig.showStoragePath"
-                                       class="subtitle storageLocation">
-                                       {{ t('settings', 'Storage location') }}
-                               </div>
-                       </div>
-                       <div v-if="showConfig.showLastLogin"
-                               class="headerLastLogin lastLogin">
-                               {{ t('settings', 'Last login') }}
-                       </div>
-
-                       <div class="userActions" />
-               </div>
-
                <form v-show="showConfig.showNewUserForm"
                        id="new-user"
                        :class="{'sticky': scrolled && showConfig.showNewUserForm}"
                                        value="">
                        </div>
                </form>
+               <div id="grid-header"
+                       :class="{'sticky': scrolled && !showConfig.showNewUserForm}"
+                       class="row">
+                       <div id="headerAvatar" class="avatar" />
+                       <div id="headerName" class="name">
+                               {{ t('settings', 'Username') }}
+
+                               <div class="subtitle">
+                                       {{ t('settings', 'Display name') }}
+                               </div>
+                       </div>
+                       <div id="headerPassword" class="password">
+                               {{ t('settings', 'Password') }}
+                       </div>
+                       <div id="headerAddress" class="mailAddress">
+                               {{ t('settings', 'Email') }}
+                       </div>
+                       <div id="headerGroups" class="groups">
+                               {{ t('settings', 'Groups') }}
+                       </div>
+                       <div v-if="subAdminsGroups.length>0 && settings.isAdmin"
+                               id="headerSubAdmins"
+                               class="subadmins">
+                               {{ t('settings', 'Group admin for') }}
+                       </div>
+                       <div id="headerQuota" class="quota">
+                               {{ t('settings', 'Quota') }}
+                       </div>
+                       <div v-if="showConfig.showLanguages"
+                               id="headerLanguages"
+                               class="languages">
+                               {{ t('settings', 'Language') }}
+                       </div>
+
+                       <div v-if="showConfig.showUserBackend || showConfig.showStoragePath"
+                               class="headerUserBackend userBackend">
+                               <div v-if="showConfig.showUserBackend" class="userBackend">
+                                       {{ t('settings', 'User backend') }}
+                               </div>
+                               <div v-if="showConfig.showStoragePath"
+                                       class="subtitle storageLocation">
+                                       {{ t('settings', 'Storage location') }}
+                               </div>
+                       </div>
+                       <div v-if="showConfig.showLastLogin"
+                               class="headerLastLogin lastLogin">
+                               {{ t('settings', 'Last login') }}
+                       </div>
+
+                       <div class="userActions" />
+               </div>
 
                <user-row v-for="(user, key) in filteredUsers"
                        :key="key"