diff options
Diffstat (limited to 'apps/settings/src/views/Users.vue')
-rw-r--r-- | apps/settings/src/views/Users.vue | 485 |
1 files changed, 0 insertions, 485 deletions
diff --git a/apps/settings/src/views/Users.vue b/apps/settings/src/views/Users.vue deleted file mode 100644 index c3d3d9f3c72..00000000000 --- a/apps/settings/src/views/Users.vue +++ /dev/null @@ -1,485 +0,0 @@ -<!-- - - @copyright Copyright (c) 2018 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/>. - - - --> - -<template> - <Content app-name="settings" :navigation-class="{ 'icon-loading': loadingAddGroup }"> - <AppNavigation> - <AppNavigationNew button-id="new-user-button" - :text="t('settings','New user')" - button-class="icon-add" - @click="showNewUserMenu" - @keyup.enter="showNewUserMenu" - @keyup.space="showNewUserMenu" /> - <template #list> - <AppNavigationItem id="addgroup" - ref="addGroup" - :edit-placeholder="t('settings', 'Enter group name')" - :editable="true" - :loading="loadingAddGroup" - :title="t('settings', 'Add group')" - icon="icon-add" - @click="showAddGroupForm" - @update:title="createGroup" /> - <AppNavigationItem id="everyone" - :exact="true" - :title="t('settings', 'Active users')" - :to="{ name: 'users' }" - icon="icon-contacts-dark"> - <AppNavigationCounter v-if="userCount > 0" slot="counter"> - {{ userCount }} - </AppNavigationCounter> - </AppNavigationItem> - <AppNavigationItem v-if="settings.isAdmin" - id="admin" - :exact="true" - :title="t('settings', 'Admins')" - :to="{ name: 'group', params: { selectedGroup: 'admin' } }" - icon="icon-user-admin"> - <AppNavigationCounter v-if="adminGroupMenu.count" slot="counter"> - {{ adminGroupMenu.count }} - </AppNavigationCounter> - </AppNavigationItem> - - <!-- Hide the disabled if none, if we don't have the data (-1) show it --> - <AppNavigationItem v-if="disabledGroupMenu.usercount > 0 || disabledGroupMenu.usercount === -1" - id="disabled" - :exact="true" - :title="t('settings', 'Disabled users')" - :to="{ name: 'group', params: { selectedGroup: 'disabled' } }" - icon="icon-disabled-users"> - <AppNavigationCounter v-if="disabledGroupMenu.usercount > 0" slot="counter"> - {{ disabledGroupMenu.usercount }} - </AppNavigationCounter> - </AppNavigationItem> - - <AppNavigationCaption v-if="groupList.length > 0" :title="t('settings', 'Groups')" /> - <GroupListItem v-for="group in groupList" - :id="group.id" - :key="group.id" - :title="group.title" - :count="group.count" /> - </template> - <template #footer> - <AppNavigationSettings> - <div> - <p>{{ t('settings', 'Default quota:') }}</p> - <Multiselect :value="defaultQuota" - :options="quotaOptions" - tag-placeholder="create" - :placeholder="t('settings', 'Select default quota')" - label="label" - track-by="id" - :allow-empty="false" - :taggable="true" - @tag="validateQuota" - @input="setDefaultQuota" /> - </div> - <div> - <input id="showLanguages" - v-model="showLanguages" - type="checkbox" - class="checkbox"> - <label for="showLanguages">{{ t('settings', 'Show Languages') }}</label> - </div> - <div> - <input id="showLastLogin" - v-model="showLastLogin" - type="checkbox" - class="checkbox"> - <label for="showLastLogin">{{ t('settings', 'Show last login') }}</label> - </div> - <div> - <input id="showUserBackend" - v-model="showUserBackend" - type="checkbox" - class="checkbox"> - <label for="showUserBackend">{{ t('settings', 'Show user backend') }}</label> - </div> - <div> - <input id="showStoragePath" - v-model="showStoragePath" - type="checkbox" - class="checkbox"> - <label for="showStoragePath">{{ t('settings', 'Show storage path') }}</label> - </div> - <div> - <input id="sendWelcomeMail" - v-model="sendWelcomeMail" - :disabled="loadingSendMail" - type="checkbox" - class="checkbox"> - <label for="sendWelcomeMail">{{ t('settings', 'Send email to new user') }}</label> - </div> - </AppNavigationSettings> - </template> - </AppNavigation> - <AppContent> - <UserList :users="users" - :show-config="showConfig" - :selected-group="selectedGroupDecoded" - :external-actions="externalActions" /> - </AppContent> - </Content> -</template> - -<script> -import AppContent from '@nextcloud/vue/dist/Components/AppContent' -import AppNavigation from '@nextcloud/vue/dist/Components/AppNavigation' -import AppNavigationCaption from '@nextcloud/vue/dist/Components/AppNavigationCaption' -import AppNavigationCounter from '@nextcloud/vue/dist/Components/AppNavigationCounter' -import AppNavigationItem from '@nextcloud/vue/dist/Components/AppNavigationItem' -import AppNavigationNew from '@nextcloud/vue/dist/Components/AppNavigationNew' -import AppNavigationSettings from '@nextcloud/vue/dist/Components/AppNavigationSettings' -import axios from '@nextcloud/axios' -import Content from '@nextcloud/vue/dist/Components/Content' -import { generateUrl } from '@nextcloud/router' -import Multiselect from '@nextcloud/vue/dist/Components/Multiselect' -import Vue from 'vue' -import VueLocalStorage from 'vue-localstorage' - -import GroupListItem from '../components/GroupListItem' -import UserList from '../components/UserList' - -Vue.use(VueLocalStorage) - -export default { - name: 'Users', - components: { - AppContent, - AppNavigation, - AppNavigationCaption, - AppNavigationCounter, - AppNavigationItem, - AppNavigationNew, - AppNavigationSettings, - Content, - GroupListItem, - Multiselect, - UserList, - }, - props: { - selectedGroup: { - type: String, - default: null, - }, - }, - data() { - return { - // default quota is set to unlimited - unlimitedQuota: { id: 'none', label: t('settings', 'Unlimited') }, - // temporary value used for multiselect change - selectedQuota: false, - externalActions: [], - loadingAddGroup: false, - loadingSendMail: false, - showConfig: { - showStoragePath: false, - showUserBackend: false, - showLastLogin: false, - showNewUserForm: false, - showLanguages: false, - }, - } - }, - computed: { - selectedGroupDecoded() { - return this.selectedGroup ? decodeURIComponent(this.selectedGroup) : null - }, - users() { - return this.$store.getters.getUsers - }, - groups() { - return this.$store.getters.getGroups - }, - usersOffset() { - return this.$store.getters.getUsersOffset - }, - usersLimit() { - return this.$store.getters.getUsersLimit - }, - - // Local settings - showLanguages: { - get() { return this.getLocalstorage('showLanguages') }, - set(status) { - this.setLocalStorage('showLanguages', status) - }, - }, - showLastLogin: { - get() { return this.getLocalstorage('showLastLogin') }, - set(status) { - this.setLocalStorage('showLastLogin', status) - }, - }, - showUserBackend: { - get() { return this.getLocalstorage('showUserBackend') }, - set(status) { - this.setLocalStorage('showUserBackend', status) - }, - }, - showStoragePath: { - get() { return this.getLocalstorage('showStoragePath') }, - set(status) { - this.setLocalStorage('showStoragePath', status) - }, - }, - - userCount() { - return this.$store.getters.getUserCount - }, - settings() { - return this.$store.getters.getServerData - }, - - // default quota - quotaOptions() { - // convert the preset array into objects - const quotaPreset = this.settings.quotaPreset.reduce((acc, cur) => acc.concat({ id: cur, label: cur }), []) - // add default presets - if (this.settings.allowUnlimitedQuota) { - quotaPreset.unshift(this.unlimitedQuota) - } - return quotaPreset - }, - // mapping saved values to objects - defaultQuota: { - 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(quota) { - this.selectedQuota = quota - }, - - }, - - sendWelcomeMail: { - get() { - return this.settings.newUserSendEmail - }, - async set(value) { - try { - this.loadingSendMail = true - this.$store.commit('setServerData', { - ...this.settings, - newUserSendEmail: value, - }) - await axios.post(generateUrl('/settings/users/preferences/newUser.sendEmail'), { value: value ? 'yes' : 'no' }) - } catch (e) { - console.error('could not update newUser.sendEmail preference: ' + e.message, e) - } finally { - this.loadingSendMail = false - } - }, - }, - - groupList() { - const groups = Array.isArray(this.groups) ? this.groups : [] - - return groups - // filter out disabled and admin - .filter(group => group.id !== 'disabled' && group.id !== 'admin') - .map(group => this.formatGroupMenu(group)) - }, - - adminGroupMenu() { - return this.formatGroupMenu(this.groups.find(group => group.id === 'admin')) - }, - disabledGroupMenu() { - return this.formatGroupMenu(this.groups.find(group => group.id === 'disabled')) - }, - }, - 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() { - // init the OCA.Settings.UserList object - // and add the registerAction method - Object.assign(OCA, { - Settings: { - UserList: { - registerAction: this.registerAction, - }, - }, - }) - }, - methods: { - showNewUserMenu() { - this.showConfig.showNewUserForm = true - if (this.showConfig.showNewUserForm) { - Vue.nextTick(() => { - window.newusername.focus() - }) - } - }, - getLocalstorage(key) { - // force initialization - const 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(key, status) { - this.showConfig[key] = status - this.$localStorage.set(key, status) - return status - }, - - /** - * Dispatch default quota set request - * - * @param {string | object} quota Quota in readable format '5 GB' or Object {id: '5 GB', label: '5GB'} - */ - setDefaultQuota(quota = 'none') { - this.$store.dispatch('setAppConfig', { - app: 'files', - key: 'default_quota', - // ensure we only send the preset id - value: quota.id ? quota.id : quota, - }).then(() => { - if (typeof quota !== 'object') { - quota = { id: quota, label: quota } - } - this.defaultQuota = quota - }) - }, - - /** - * Validate quota string to make sure it's a valid human file size - * - * @param {string} quota Quota in readable format '5 GB' - * @return {Promise|boolean} - */ - validateQuota(quota) { - // only used for new presets sent through @Tag - const 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 - * @return {Array} - */ - registerAction(icon, text, action) { - this.externalActions.push({ - icon, - text, - action, - }) - return this.externalActions - }, - - /** - * Create a new group - * - * @param {string} gid The group id - */ - async createGroup(gid) { - // group is not valid - if (gid.trim() === '') { - return - } - - try { - this.loadingAddGroup = true - await this.$store.dispatch('addGroup', gid.trim()) - - this.hideAddGroupForm() - await this.$router.push({ - name: 'group', - params: { - selectedGroup: encodeURIComponent(gid.trim()), - }, - }) - } catch { - this.showAddGroupForm() - } finally { - this.loadingAddGroup = false - } - }, - - showAddGroupForm() { - this.$refs.addGroup.editingActive = true - this.$refs.addGroup.onMenuToggle(false) - this.$nextTick(() => { - this.$refs.addGroup.$refs.editingInput.focusInput() - }) - }, - - hideAddGroupForm() { - this.$refs.addGroup.editingActive = false - this.$refs.addGroup.editingValue = '' - }, - - /** - * Format a group to a menu entry - * - * @param {object} group the group - * @return {object} - */ - formatGroupMenu(group) { - const item = {} - if (typeof group === 'undefined') { - return {} - } - - item.id = group.id - item.title = group.name - item.usercount = group.usercount - - // users count for all groups - if (group.usercount - group.disabled > 0) { - item.count = group.usercount - group.disabled - } - - return item - }, - }, -} -</script> - -<style lang="scss" scoped> -// force hiding the editing action for the add group entry -.app-navigation__list #addgroup::v-deep .app-navigation-entry__utils { - display: none; -} -</style> |