rework data store and add FETCH_ALL, also reflect changes to views

This commit is contained in:
Axolotle 2020-07-29 14:46:16 +02:00
parent a48a2cdb38
commit 1eadf1354a
6 changed files with 88 additions and 81 deletions

View file

@ -17,12 +17,12 @@ export default {
state.users = Object.keys(users).length === 0 ? null : users
},
'ADD_USER' (state, user) {
'ADD_USERS' (state, user) {
// FIXME will trigger an error if first created user
Vue.set(state.users, user.username, user)
},
'SET_USERS_PARAM' (state, [username, userData]) {
'SET_USERS_DETAILS' (state, [username, userData]) {
Vue.set(state.users_details, username, userData)
if (!state.users) return
const user = state.users[username]
@ -34,7 +34,7 @@ export default {
Vue.set(user, 'fullname', `${userData.firstname} ${userData.lastname}`)
},
'DEL_USERS_PARAM' (state, username) {
'DEL_USERS_DETAILS' (state, username) {
Vue.delete(state.users_details, username)
if (state.users) {
Vue.delete(state.users, username)
@ -49,39 +49,47 @@ export default {
if (currentState !== undefined && !force) return currentState
return api.get(param ? `${uri}/${param}` : uri).then(responseData => {
const data = responseData[uri] ? responseData[uri] : responseData
if (param) {
commit(`SET_${uri.toUpperCase()}_PARAM`, [param, data])
} else {
commit('SET_' + uri.toUpperCase(), data)
}
return param ? state[storeKey][param] : state[storeKey]
const data = responseData[storeKey] ? responseData[storeKey] : responseData
commit('SET_' + storeKey.toUpperCase(), param ? [param, data] : data)
return data
})
},
'POST' ({ state, commit }, { uri, data }) {
return api.post(uri, data)
'FETCH_ALL' ({ state, commit }, queries) {
// TODO do not get if data is already present
return Promise.all(queries.map(({ uri, param, storeKey = uri, force = false }) => {
return api.get(param ? `${uri}/${param}` : uri)
})).then(responsesData => {
return responsesData.map((responseData, i) => {
const storeKey = queries[i].storeKey || queries[i].uri
const param = queries[i].param
const data = responseData[storeKey] ? responseData[storeKey] : responseData
commit('SET_' + storeKey.toUpperCase(), param ? [param, data] : data)
return data
})
})
},
'POST' ({ state, commit }, { uri, data, storeKey = uri }) {
return api.post(uri, data).then(responseData => {
console.log(responseData)
const data = responseData[storeKey] ? responseData[storeKey] : responseData
commit('ADD_' + storeKey.toUpperCase(), data)
return data
})
},
'PUT' ({ state, commit }, { uri, param, data, storeKey = uri }) {
return api.put(param ? `${uri}/${param}` : uri, data).then(responseData => {
const data = responseData[uri] ? responseData[uri] : responseData
if (param) {
commit(`SET_${uri.toUpperCase()}_PARAM`, [param, data])
} else {
commit('SET_' + uri.toUpperCase(), data)
}
return param ? state[storeKey][param] : state[storeKey]
const data = responseData[storeKey] ? responseData[storeKey] : responseData
commit('SET_' + storeKey.toUpperCase(), param ? [param, data] : data)
return data
})
},
'DELETE' ({ state, commit }, { uri, param, data }) {
'DELETE' ({ state, commit }, { uri, param, data, storeKey = uri }) {
return api.delete(param ? `${uri}/${param}` : uri, data).then(() => {
if (param) {
commit(`DEL_${uri.toUpperCase()}_PARAM`, param)
} else {
commit('DEL_' + uri.toUpperCase())
}
commit('DEL_' + storeKey.toUpperCase(), param)
})
}
},

View file

@ -34,7 +34,7 @@ body {
.input-group-append ~ .input-group-append {
min-width: 40%;
}
select {
border-top-left-radius: 0;
border-bottom-left-radius: 0;
@ -63,8 +63,56 @@ body {
}
}
.card-header h2 {
margin: 0;
}
// Fork-awesome overrides
.fa-fw {
width: 1.25em !important;
}
// custom css
.actions {
margin-bottom: 1.5rem;
display: flex;
justify-content: space-between;
@include media-breakpoint-down(xs) {
.buttons {
flex-direction: column;
justify-content: space-between;
}
}
@include media-breakpoint-down(sm) {
flex-direction: column-reverse;
margin-bottom: 2rem;
.buttons {
display: flex;
justify-content: space-between;
.btn {
margin-bottom: .5rem;
}
}
}
@include media-breakpoint-up(md) {
.btn-success {
margin-left: .5rem;
}
}
.input-group {
@include media-breakpoint-up(md) {
width: 25%;
}
@include media-breakpoint-up(lg) {
width: 35%;
}
}
}

View file

@ -173,9 +173,7 @@ export default {
this.$store.dispatch(
'POST', { uri: 'users', data }
).then(responseData => {
// FIXME API doesn't return the same data as '/users'
this.$store.commit('ADD_USER', responseData)
).then(() => {
this.$router.push({ name: 'user-list' })
}).catch(error => {
this.server.error = error.message
@ -217,8 +215,7 @@ export default {
},
created () {
this.$store.dispatch('FETCH', { uri: 'domains' })
this.$store.dispatch('FETCH', { uri: 'users' })
this.$store.dispatch('FETCH_ALL', [{ uri: 'domains' }, { uri: 'users' }])
},
components: {
SplittedMailInput

View file

@ -234,10 +234,10 @@ export default {
},
created () {
this.$store.dispatch('FETCH', { uri: 'domains' })
this.$store.dispatch('FETCH',
this.$store.dispatch('FETCH_ALL', [
{ uri: 'domains' },
{ uri: 'users', param: this.name, storeKey: 'users_details' }
).then(userData => {
]).then(([domainsData, userData]) => {
this.form.firstname = userData.firstname
this.form.lastname = userData.lastname
this.form.mail = userData.mail

View file

@ -122,7 +122,7 @@ export default {
deleteUser () {
const data = this.purge ? { purge: '' } : {}
this.$store.dispatch('DELETE',
{ uri: 'users', data, param: this.name }
{ uri: 'users', param: this.name, data, storeKey: 'users_details' }
).then(() => {
this.$router.push({ name: 'user-list' })
})
@ -144,10 +144,6 @@ export default {
}
}
h2 {
margin: 0;
}
.icon.fa-user {
font-size: 10rem;
padding-right: 3rem;

View file

@ -83,48 +83,6 @@ p {
margin: 0
}
.actions {
margin-bottom: 1.5rem;
display: flex;
justify-content: space-between;
@include media-breakpoint-down(xs) {
.buttons {
flex-direction: column;
justify-content: space-between;
}
}
@include media-breakpoint-down(sm) {
flex-direction: column-reverse;
margin-bottom: 2rem;
.buttons {
display: flex;
justify-content: space-between;
.btn {
margin-bottom: .5rem;
}
}
}
@include media-breakpoint-up(md) {
.btn-success {
margin-left: .5rem;
}
}
.input-group {
@include media-breakpoint-up(md) {
width: 25%;
}
@include media-breakpoint-up(lg) {
width: 35%;
}
}
}
.skeleton {
@each $i, $opacity in 1 .75, 2 .5, 3 .25 {
.list-group-item:nth-child(#{$i}) { opacity: $opacity; }