diff --git a/app/src/helpers/api.js b/app/src/helpers/api.js index e212e75d..5c679db7 100644 --- a/app/src/helpers/api.js +++ b/app/src/helpers/api.js @@ -50,6 +50,14 @@ export default { }).then(response => handleResponse(response)) }, + put (uri, data) { + return fetch('/api/' + uri, { + ...this.options, + method: 'PUT', + body: objectToParams(data) + }).then(response => handleResponse(response)) + }, + login (password) { return fetch('/api/login', { ...this.options, diff --git a/app/src/helpers/dataStore.js b/app/src/helpers/dataStore.js index 4cc2ce4c..20a9d5c0 100644 --- a/app/src/helpers/dataStore.js +++ b/app/src/helpers/dataStore.js @@ -7,21 +7,34 @@ export default { users: undefined, // basic user data: Object {username: {data}} users_details: {} // precise user data: Object {username: {data}} }), + mutations: { 'SET_DOMAINS' (state, domains) { state.domains = domains }, + 'SET_USERS' (state, users) { state.users = Object.keys(users).length === 0 ? null : users }, + 'ADD_USER' (state, user) { // FIXME will trigger an error if first created user Vue.set(state.users, user.username, user) }, + 'SET_USERS_PARAM' (state, [username, userData]) { Vue.set(state.users_details, username, userData) + if (!state.users) return + const user = state.users[username] + for (const key of ['firstname', 'lastname', 'mail']) { + if (user[key] !== userData[key]) { + Vue.set(user, key, userData[key]) + } + } + Vue.set(user, 'fullname', `${userData.firstname} ${userData.lastname}`) } }, + actions: { 'FETCH' ({ state, commit }, { uri, param, storeKey = uri, force = false }) { const currentState = param ? state[storeKey][param] : state[storeKey] @@ -39,10 +52,23 @@ export default { }) }, - 'POST' ({ state, commit }, { uri, param, data, storeKey }) { + 'POST' ({ state, commit }, { uri, data }) { return api.post(uri, data) + }, + + 'PUT' ({ state, commit }, { uri, param, data, storeKey = uri }) { + return api.put(param ? `${uri}/${param}` : uri, data).then(async 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] + }) } }, + getters: { } diff --git a/app/src/routes.js b/app/src/routes.js index f3cbf058..ebf86946 100644 --- a/app/src/routes.js +++ b/app/src/routes.js @@ -1,6 +1,6 @@ import Home from './views/Home' import Login from './views/Login' -import { UserList, UserCreate, User } from './views/user' +import { UserList, UserCreate, User, UserEdit } from './views/user' const routes = [ { name: 'home', path: '/', component: Home }, @@ -35,6 +35,19 @@ const routes = [ { name: 'user-info', param: 'name' } ] } + }, + { + name: 'user-edit', + path: '/users/:name/edit', + component: UserEdit, + props: true, + meta: { + breadcrumb: [ + { name: 'user-list', trad: 'users' }, + { name: 'user-info', param: 'name' }, + { name: 'user-edit', param: 'name', trad: 'user_username_edit' } + ] + } } ] diff --git a/app/src/views/user/UserCreate.vue b/app/src/views/user/UserCreate.vue index 8ee57850..6b78390f 100644 --- a/app/src/views/user/UserCreate.vue +++ b/app/src/views/user/UserCreate.vue @@ -165,8 +165,8 @@ export default { const quota = data.mailbox_quota data.mailbox_quota = parseInt(quota) ? quota + 'M' : 0 - this.$store.dispatch('POST', - { uri: 'users', data, param: data.username, storeKey: '' } + 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) diff --git a/app/src/views/user/UserEdit.vue b/app/src/views/user/UserEdit.vue new file mode 100644 index 00000000..77b39849 --- /dev/null +++ b/app/src/views/user/UserEdit.vue @@ -0,0 +1,285 @@ + + + + + diff --git a/app/src/views/user/index.js b/app/src/views/user/index.js index 31a7644b..a6e773a5 100644 --- a/app/src/views/user/index.js +++ b/app/src/views/user/index.js @@ -1,3 +1,4 @@ export { default as UserList } from './UserList' export { default as UserCreate } from './UserCreate' export { default as User } from './User' +export { default as UserEdit } from './UserEdit'