Skip to content

Commit e8f40b9

Browse files
User management interface (#60)
Co-authored-by: Diogo Correia <[email protected]>
1 parent ae46e3e commit e8f40b9

File tree

6 files changed

+60
-60
lines changed

6 files changed

+60
-60
lines changed

backend/src/api/members/models.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ const memberCreate = Joi.object({
99
.regex(/^ist\d+$/)
1010
.required(),
1111
active: Joi.boolean().default(true),
12-
role: Joi.string().equal('admin', 'admin').default('user'),
12+
role: Joi.string().equal('admin', 'user').default('user'),
1313
})
1414
.rename('istId', 'ist_id')
1515
.required();
@@ -20,7 +20,7 @@ const memberUpdate = Joi.object({
2020
.max(12)
2121
.regex(/^ist\d+$/),
2222
active: Joi.boolean(),
23-
role: Joi.string().equal('admin', 'admin'),
23+
role: Joi.string().equal('admin', 'user'),
2424
})
2525
.rename('istId', 'ist_id')
2626
.required()

frontend/src/api/members.api.js

+9-3
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,13 @@
11
import httpClient from './httpClient';
22

3-
const END_POINT = '/members';
3+
const ENDPOINT = '/member';
44

5-
const getAllMembers = () => httpClient.get(END_POINT);
5+
export const getAllMembers = () => httpClient.get(`${ENDPOINT}s`);
66

7-
export { getAllMembers };
7+
export const getMember = (id) => httpClient.get(`${ENDPOINT}/${id}`);
8+
9+
export const addMember = (data) => httpClient.post(ENDPOINT, data);
10+
11+
export const deleteMember = (id) => httpClient.delete(`${ENDPOINT}/${id}`);
12+
13+
export const updateMember = (id, data) => httpClient.post(`${ENDPOINT}/${id}`, data);

frontend/src/components/members/MembersTable.vue

+15-10
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
<v-spacer></v-spacer>
88
<v-dialog v-model="dialog" max-width="600px">
99
<template #activator="{ on, attrs }">
10-
<v-btn color="secondary" dark class="mb-2" v-bind="attrs" v-on="on"> New Item </v-btn>
10+
<v-btn color="secondary" dark class="mb-2" v-bind="attrs" v-on="on"> New Member </v-btn>
1111
</template>
1212
<v-card>
1313
<v-form ref="form" lazy-validation @submit.prevent="save">
@@ -45,7 +45,7 @@
4545
</v-col>
4646
<v-col cols="4">
4747
<v-select
48-
v-model="editedItem.state"
48+
v-model="editedItem.active"
4949
label="State"
5050
:items="states"
5151
filled
@@ -84,11 +84,11 @@
8484
{{ item.role }}
8585
</v-chip>
8686
</template>
87-
<!--<template #[`item.type`]="{ item }">
88-
<v-chip :color="typeColors[item.type]" dark class="capitalized">
89-
{{ item.type }}
87+
<template #[`item.active`]="{ item }">
88+
<v-chip :color="stateColors[item.active]" dark class="capitalized">
89+
{{ (states.find((v) => v.value == item.active) || {}).text }}
9090
</v-chip>
91-
</template>-->
91+
</template>
9292
</v-data-table>
9393
</template>
9494

@@ -103,6 +103,7 @@ export default {
103103
{ text: 'Member', value: 'name' },
104104
{ text: 'IST Id', value: 'istId' },
105105
{ text: 'Role', value: 'role' },
106+
{ text: 'State', value: 'active' },
106107
{ text: 'Actions', value: 'actions', sortable: false },
107108
],
108109
editedIndex: -1,
@@ -113,19 +114,23 @@ export default {
113114
name: '',
114115
istId: '',
115116
role: '',
116-
state: '',
117+
active: '',
117118
},
118119
roleColors: {
119120
admin: 'blue',
120-
user: 'grey',
121+
user: 'yellow darken-4',
122+
},
123+
stateColors: {
124+
true: 'green',
125+
false: 'grey',
121126
},
122127
roles: [
123128
{ text: 'Admin', value: 'admin' },
124129
{ text: 'User', value: 'user' },
125130
],
126131
states: [
127-
{ text: 'Active', value: 'active' },
128-
{ text: 'Inactive', value: 'inactive' },
132+
{ text: 'Active', value: true },
133+
{ text: 'Inactive', value: false },
129134
],
130135
}),
131136

frontend/src/components/membersTest/MembersTest.vue

-39
This file was deleted.

frontend/src/components/pages/MyRequests.vue

-3
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
<template>
22
<div>
33
<v-row justify="center">{{ hello }}</v-row>
4-
<MembersTest />
54
<v-row justify="center"> Lista de itens que podes requesitar </v-row>
65
<v-row justify="center">
76
<v-col cols="11" lg="8" md="10">
@@ -17,14 +16,12 @@
1716

1817
<script>
1918
import RequestItemList from '@/components/elements/RequestItemList.vue';
20-
import MembersTest from '@/components/membersTest/MembersTest.vue';
2119
2220
export default {
2321
name: 'MyRequestsComponent',
2422
2523
components: {
2624
RequestItemList,
27-
MembersTest,
2825
},
2926
3027
data: function () {

frontend/src/store/members.js

+34-3
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,54 @@
11
// import the api endpoints
2-
import { getAllMembers } from '@/api/members.api';
2+
import * as memberApi from '@/api/members.api';
33

44
const state = {
55
members: [],
66
};
77

8-
const getters = {};
8+
const getters = {
9+
getMember(id) {
10+
return state.members.find((member) => member.id == id);
11+
},
12+
};
913

1014
const actions = {
1115
async fetchMembers({ commit }) {
12-
const response = await getAllMembers();
16+
const response = await memberApi.getAllMembers();
1317
commit('SET_MEMBERS', response.data);
1418
},
19+
async fetchMember({ commit }, id) {
20+
const response = await memberApi.getMember(id);
21+
commit('SET_MEMBER', response.data);
22+
},
23+
async createMember({ commit }, data) {
24+
const response = await memberApi.addMember(data);
25+
commit('SET_MEMBER', response.data);
26+
},
27+
async deleteMember({ commit }, id) {
28+
await memberApi.deleteMember(id);
29+
commit('REMOVE_MEMBER', id);
30+
},
31+
async updateMember({ commit }, { id, data }) {
32+
const response = await memberApi.updateMember(id, data);
33+
commit('SET_MEMBER', { ...response.data, id });
34+
},
1535
};
1636

1737
const mutations = {
1838
SET_MEMBERS(state, data) {
1939
state.members = data;
2040
},
41+
SET_MEMBER(state, data) {
42+
const index = state.members.findIndex((member) => member.id == data.id);
43+
44+
if (index === -1) state.members.push(data);
45+
// editing the array doesn't trigger DOM refresh, but splice does
46+
else state.members.splice(index, 1, data);
47+
},
48+
REMOVE_MEMBER(state, id) {
49+
const index = state.members.findIndex((member) => member.id == id);
50+
state.members.splice(index, 1); // removes element from array and shifts the others
51+
},
2152
};
2253

2354
export default {

0 commit comments

Comments
 (0)