Added default quota selector

Signed-off-by: John Molakvoæ (skjnldsv) <skjnldsv@protonmail.com>
This commit is contained in:
John Molakvoæ (skjnldsv) 2018-04-15 16:00:44 +02:00
parent 45f1efe953
commit ff2c23d9e2
No known key found for this signature in database
GPG Key ID: 60C25B8C072916CF
9 changed files with 172 additions and 74 deletions

File diff suppressed because one or more lines are too long

View File

@ -5,7 +5,7 @@
<script>
export default {
name: 'App',
beforeMount: function () {
beforeMount: function() {
// importing server data into the store
const serverDataElmt = document.getElementById('serverData');
if (serverDataElmt !== null) {

View File

@ -92,18 +92,18 @@ export default {
}
},
methods: {
showMenu () {
showMen() {
this.openedMenu = true;
},
hideMenu () {
hideMenu() {
this.openedMenu = false;
},
toggleCollapse () {
toggleCollapse() {
// if item.opened isn't set, Vue won't trigger view updates https://vuejs.org/v2/api/#Vue-set
// ternary is here to detect the undefined state of item.opened
Vue.set(this.item, 'opened', this.item.opened ? !this.item.opened : true);
},
cancelEdit () {
cancelEdit() {
// remove the editing class
if (Array.isArray(this.item.classes))
this.item.classes = this.item.classes.filter(item => item !== 'editing');

View File

@ -238,11 +238,14 @@ export default {
},
infiniteHandler($state) {
this.$store.dispatch('getUsers', {offset:this.usersOffset, limit:this.usersLimit, group:this.selectedGroup})
this.$store.dispatch('getUsers', {
offset: this.usersOffset,
limit: this.usersLimit,
group: this.selectedGroup !== 'disabled' ? this.selectedGroup : ''})
.then((response) => {response?$state.loaded():$state.complete()});
},
resetForm () {
resetForm() {
// revert form to original state
Object.assign(this.newUser, this.$options.data.call(this).newUser);
this.loading = false;

View File

@ -413,7 +413,7 @@ export default {
// unify format output
return this.setUserQuota(OC.Util.humanFileSize(OC.Util.computerFileSize(quota)));
}
// if no valid doo not change
// if no valid do not change
return false;
},

View File

@ -4,7 +4,7 @@ const requestToken = document.getElementsByTagName('head')[0].getAttribute('data
const tokenHeaders = { headers: { requesttoken: requestToken } };
const sanitize = function(url) {
return url.replace(/\/$/, ''); // Remove last slash of url
return url.replace(/\/$/, ''); // Remove last url slash
};
export default {
@ -95,5 +95,19 @@ export default {
return axios.delete(sanitize(url), { data: data, headers: tokenHeaders.headers })
.then((response) => Promise.resolve(response))
.catch((error) => Promise.reject(error));
},
// OCS API entry points
/**
*
* @param {string} app Application name
* @param {string} key Config key
* @param {string} [value=''] Value to set
* @returns{Promise}
*/
setAppConfig(app, key, value = '') {
return this.requireAdmin().then((response) => {
return this.post(OC.linkToOCS(`apps/provisioning_api/api/v1/config/apps/${app}/${key}`, 2), {value: value});
});
}
};

View File

@ -12,7 +12,7 @@ const getters = {
getServerData(state) {
return state.serverData;
}
}
const actions = {}
};
const actions = {};
export default {state, mutations, getters, actions};

View File

@ -38,11 +38,11 @@ const mutations = {
state.userCount = userCount;
state.groups = orderGroups(state.groups, state.orderBy);
},
addGroup(state, groupid) {
addGroup(state, gid) {
try {
state.groups.push({
id: groupid,
name: groupid,
id: gid,
name: gid,
usercount: 0 // user will be added after the creation
});
state.groups = orderGroups(state.groups, state.orderBy);
@ -50,6 +50,12 @@ const mutations = {
console.log('Can\'t create group', e);
}
},
removeGroup(state, gid) {
let groupIndex = state.groups.findIndex(groupSearch => groupSearch.id == gid);
if (groupIndex >= 0) {
state.groups.splice(groupIndex, 1);
}
},
addUserGroup(state, { userid, gid }) {
// this should not be needed as it would means the user contains a group
// the server database doesn't have.
@ -144,7 +150,7 @@ const actions = {
* @param {int} options.limit List number to return from offset
* @param {string} options.search Search amongst users
* @param {string} options.group Get users from group
* @returns Promise
* @returns {Promise}
*/
getUsers(context, { offset, limit, search, group }) {
search = typeof search === 'string' ? search : '';
@ -179,7 +185,7 @@ const actions = {
* @param {Object} options
* @param {int} options.offset List offset to request
* @param {int} options.limit List number to return from offset
* @returns Promise
* @returns {Promise}
*/
getUsersFromList(context, { offset, limit, search }) {
search = typeof search === 'string' ? search : '';
@ -201,7 +207,7 @@ const actions = {
* @param {Object} options
* @param {int} options.offset List offset to request
* @param {int} options.limit List number to return from offset
* @returns Promise
* @returns {Promise}
*/
getUsersFromGroup(context, { groupid, offset, limit }) {
return api.get(OC.linkToOCS(`cloud/users/${groupid}/details?offset=${offset}&limit=${limit}`, 2))
@ -221,7 +227,7 @@ const actions = {
*
* @param {Object} context
* @param {string} gid Group id
* @returns Promise
* @returns {Promise}
*/
addGroup(context, gid) {
return api.requireAdmin().then((response) => {
@ -236,14 +242,14 @@ const actions = {
*
* @param {Object} context
* @param {string} gid Group id
* @returns Promise
* @returns {Promise}
*/
removeGroup(context, gid) {
return api.requireAdmin().then((response) => {
return api.post(OC.linkToOCS(`cloud/groups`, 2), {groupid: gid})
return api.delete(OC.linkToOCS(`cloud/groups/${gid}`, 2))
.then((response) => context.commit('removeGroup', gid))
.catch((error) => {throw error;});
}).catch((error) => context.commit('API_FAILURE', { userid, error }));
}).catch((error) => context.commit('API_FAILURE', { gid, error }));
},
/**
@ -253,7 +259,7 @@ const actions = {
* @param {Object} options
* @param {string} options.userid User id
* @param {string} options.gid Group id
* @returns Promise
* @returns {Promise}
*/
addUserGroup(context, { userid, gid }) {
return api.requireAdmin().then((response) => {
@ -270,7 +276,7 @@ const actions = {
* @param {Object} options
* @param {string} options.userid User id
* @param {string} options.gid Group id
* @returns Promise
* @returns {Promise}
*/
removeUserGroup(context, { userid, gid }) {
return api.requireAdmin().then((response) => {
@ -287,7 +293,7 @@ const actions = {
* @param {Object} options
* @param {string} options.userid User id
* @param {string} options.gid Group id
* @returns Promise
* @returns {Promise}
*/
addUserSubAdmin(context, { userid, gid }) {
return api.requireAdmin().then((response) => {
@ -304,7 +310,7 @@ const actions = {
* @param {Object} options
* @param {string} options.userid User id
* @param {string} options.gid Group id
* @returns Promise
* @returns {Promise}
*/
removeUserSubAdmin(context, { userid, gid }) {
return api.requireAdmin().then((response) => {
@ -319,7 +325,7 @@ const actions = {
*
* @param {Object} context
* @param {string} userid User id
* @returns Promise
* @returns {Promise}
*/
deleteUser(context, { userid }) {
return api.requireAdmin().then((response) => {
@ -340,7 +346,7 @@ const actions = {
* @param {string} options.groups User groups
* @param {string} options.subadmin User subadmin groups
* @param {string} options.quota User email
* @returns Promise
* @returns {Promise}
*/
addUser({context, dispatch}, { userid, password, email, groups, subadmin, quota, language }) {
return api.requireAdmin().then((response) => {
@ -355,7 +361,7 @@ const actions = {
*
* @param {Object} context
* @param {string} userid User id
* @returns Promise
* @returns {Promise}
*/
addUserData(context, userid) {
return api.requireAdmin().then((response) => {
@ -371,7 +377,7 @@ const actions = {
* @param {Object} options
* @param {string} options.userid User id
* @param {boolean} options.enabled User enablement status
* @returns Promise
* @returns {Promise}
*/
enableDisableUser(context, { userid, enabled = true }) {
let userStatus = enabled ? 'enable' : 'disable';
@ -390,7 +396,7 @@ const actions = {
* @param {string} options.userid User id
* @param {string} options.key User field to edit
* @param {string} options.value Value of the change
* @returns Promise
* @returns {Promise}
*/
setUserData(context, { userid, key, value }) {
let allowedEmpty = ['email', 'displayname'];

View File

@ -2,6 +2,16 @@
<div id="app">
<app-navigation :menu="menu">
<template slot="settings-content">
<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" class="multiselect-vue"
:allowEmpty="false" :taggable="true"
@tag="validateQuota" @input="setDefaultQuota">
</multiselect>
</div>
<div>
<input type="checkbox" id="showLanguages" class="checkbox"
:checked="showLanguages" v-model="showLanguages">
@ -33,6 +43,10 @@ import appNavigation from '../components/appNavigation';
import userList from '../components/userList';
import Vue from 'vue';
import VueLocalStorage from 'vue-localstorage'
import Multiselect from 'vue-multiselect';
import api from '../store/api';
Vue.use(VueLocalStorage)
Vue.use(VueLocalStorage)
export default {
@ -40,7 +54,8 @@ export default {
props: ['selectedGroup'],
components: {
appNavigation,
userList
userList,
Multiselect
},
beforeMount() {
this.$store.commit('initGroups', {
@ -52,6 +67,8 @@ export default {
},
data() {
return {
// default quota is unlimited
unlimitedQuota: {id:'default', label:t('settings', 'Unlimited')},
showConfig: {
showStoragePath: false,
showUserBackend: false,
@ -71,12 +88,53 @@ export default {
this.showConfig[key] = status;
this.$localStorage.set(key, status);
return status;
}
},
removeGroup(groupid) {
let 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'}
* @returns {string}
*/
setDefaultQuota(quota = 'none') {
// ensure we only send the preset id
quota = quota.id ? quota.id : quota;
api.setAppConfig('files', 'default_quota', 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(quota) {
// only used for new presets sent through @Tag
let validQuota = OC.Util.computerFileSize(quota);
if (validQuota === 0) {
return this.setDefaultQuota('none');
} else if (validQuota !== null) {
// unify format output
return this.setDefaultQuota(OC.Util.humanFileSize(OC.Util.computerFileSize(quota)));
}
// if no valid do not change
return false;
},
},
computed: {
route() {
return this.$store.getters.getRoute;
},
users() {
return this.$store.getters.getUsers;
},
@ -119,7 +177,28 @@ export default {
userCount() {
return this.$store.getters.getUserCount;
},
settings() {
return this.$store.getters.getServerData;
},
// default quota
quotaOptions() {
// convert the preset array into objects
let quotaPreset = this.settings.quotaPreset.reduce((acc, cur) => acc.concat({id:cur, label:cur}), []);
// add default presets
quotaPreset.unshift(this.unlimitedQuota);
return quotaPreset;
},
// mapping saved values to objects
defaultQuota() {
if (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
},
// BUILD APP NAVIGATION MENU OBJECT
menu() {
// Data provided php side
let groups = this.$store.getters.getGroups;
@ -143,7 +222,7 @@ export default {
item.utils.actions = [{
icon: 'icon-delete',
text: t('settings', 'Remove group'),
action: () => {}
action: function() {self.removeGroup(item.id)}
}];
};
return item;
@ -192,10 +271,6 @@ export default {
items: groups
}
},
removeGroup(groupid) {
console.trace(this);
return this.$store.dispatch('removeGroup', groupid);
}
}
}
</script>