Skip to content
This repository was archived by the owner on Apr 19, 2023. It is now read-only.

Commit cfb0e38

Browse files
✨ Update membership
1 parent 1b661cd commit cfb0e38

File tree

4 files changed

+140
-10
lines changed

4 files changed

+140
-10
lines changed

layouts/default.vue

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -248,6 +248,9 @@ a {
248248
margin-left: 0.5rem;
249249
}
250250
}
251+
th {
252+
border-bottom: 2px solid rgba(180, 0, 240, 0.04);
253+
}
251254
tr:nth-child(even) {
252255
background-color: rgba(180, 0, 240, 0.04);
253256
}

pages/manage/members/_id.vue

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
<template>
2+
<main>
3+
<Manage>
4+
<h1>Edit Membership</h1>
5+
<div v-if="membership">
6+
<h2>{{ membership.user.name }}</h2>
7+
</div>
8+
<Loading v-if="inviting" />
9+
<form v-else @submit.prevent="inviteMember">
10+
<Select
11+
:value="newUserRole"
12+
label="Role"
13+
:options="membershipRoles"
14+
required
15+
@input="val => (newUserRole = val)"
16+
/>
17+
<button class="button">Update membership</button>
18+
</form>
19+
</Manage>
20+
</main>
21+
</template>
22+
23+
<script lang="ts">
24+
import { Component, Vue, Watch } from "vue-property-decorator";
25+
import { mapGetters } from "vuex";
26+
import Manage from "@/components/Manage.vue";
27+
import Loading from "@/components/Loading.vue";
28+
import TimeAgo from "@/components/TimeAgo.vue";
29+
import Input from "@/components/form/Input.vue";
30+
import Select from "@/components/form/Select.vue";
31+
import Checkbox from "@/components/form/Checkbox.vue";
32+
import { getAllCountries } from "countries-and-timezones";
33+
import locale from "@/locales/en";
34+
import { FontAwesomeIcon } from "@fortawesome/vue-fontawesome";
35+
import { library } from "@fortawesome/fontawesome-svg-core";
36+
import { faTrash, faPencilAlt } from "@fortawesome/free-solid-svg-icons";
37+
import { Membership } from "../../../types/manage";
38+
library.add(faTrash, faPencilAlt);
39+
40+
@Component({
41+
components: {
42+
Manage,
43+
TimeAgo,
44+
Loading,
45+
Input,
46+
Select,
47+
Checkbox,
48+
FontAwesomeIcon
49+
},
50+
computed: mapGetters({
51+
members: "manage/members"
52+
})
53+
})
54+
export default class ManageMembers extends Vue {
55+
members!: any;
56+
membership: Membership | null = null;
57+
inviting = "";
58+
membershipRoles = locale.membershipRoles;
59+
newUserRole = 3;
60+
61+
private mounted() {
62+
this.inviting = "Loading member details";
63+
this.$store
64+
.dispatch("manage/getMembership", this.$route.params.id)
65+
.then(membership => {
66+
this.membership = membership;
67+
this.newUserRole = membership.role;
68+
})
69+
.catch(() => {})
70+
.finally(() => (this.inviting = ""));
71+
}
72+
73+
private inviteMember() {
74+
this.inviting = "Updating member details";
75+
this.$store
76+
.dispatch("manage/updateMembership", {
77+
id: this.$route.params.id,
78+
role: this.newUserRole
79+
})
80+
.then(() => {})
81+
.catch(() => {})
82+
.finally(() => (this.inviting = ""));
83+
}
84+
}
85+
</script>
86+
87+
<style lang="scss" scoped>
88+
.user-image {
89+
height: 2rem;
90+
border-radius: 100%;
91+
width: 2rem;
92+
vertical-align: middle;
93+
margin-right: 0.5rem;
94+
}
95+
</style>

pages/manage/members.vue renamed to pages/manage/members/index.vue

Lines changed: 29 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -24,21 +24,31 @@
2424
<td>{{ membershipRoles[member.role] || member.role }}</td>
2525
<td class="text text--align-right">
2626
<button
27-
data-balloon="Remove from organization"
27+
data-balloon="Remove"
2828
data-balloon-pos="up"
2929
class="button button--color-danger button--type-icon"
30-
@click="deleteMembership(membership.id)"
30+
@click="deleteMembership(member.id)"
3131
>
3232
<font-awesome-icon
33-
title="Remove from organization"
33+
title="Remove"
3434
class="icon icon--color-danger"
3535
icon="trash"
3636
fixed-width
3737
/>
3838
</button>
39-
<button class="button">
40-
Visit &rarr;
41-
</button>
39+
<router-link
40+
:to="`/manage/members/${member.id}`"
41+
data-balloon="Edit"
42+
data-balloon-pos="up"
43+
class="button button--type-icon"
44+
>
45+
<font-awesome-icon
46+
title="Edit"
47+
class="icon"
48+
icon="pencil-alt"
49+
fixed-width
50+
/>
51+
</router-link>
4252
</td>
4353
</tr>
4454
</tbody>
@@ -91,10 +101,10 @@ import { getAllCountries } from "countries-and-timezones";
91101
import locale from "@/locales/en";
92102
import { FontAwesomeIcon } from "@fortawesome/vue-fontawesome";
93103
import { library } from "@fortawesome/fontawesome-svg-core";
94-
import { faTrash } from "@fortawesome/free-solid-svg-icons";
95-
import { User } from "../../types/auth";
96-
import { Email } from "../../types/settings";
97-
library.add(faTrash);
104+
import { faTrash, faPencilAlt } from "@fortawesome/free-solid-svg-icons";
105+
import { User } from "@/types/auth";
106+
import { Email } from "@/types/settings";
107+
library.add(faTrash, faPencilAlt);
98108
99109
@Component({
100110
components: {
@@ -141,6 +151,15 @@ export default class ManageMembers extends Vue {
141151
.catch(() => {})
142152
.finally(() => (this.inviting = false));
143153
}
154+
155+
private deleteMembership(id: number) {
156+
this.loading = "Deleting membership";
157+
this.$store
158+
.dispatch("manage/deleteMembership", id)
159+
.then(() => {})
160+
.catch(() => {})
161+
.finally(() => (this.loading = ""));
162+
}
144163
}
145164
</script>
146165

store/manage.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,19 @@ export const actions: ActionTree<RootState, RootState> = {
4444
context
4545
);
4646
return dispatch("getMembers");
47+
},
48+
async deleteMembership({ dispatch }, context) {
49+
await this.$axios.delete(`/memberships/${context}`);
50+
return dispatch("getMembers");
51+
},
52+
async getMembership(actions, context) {
53+
return (await this.$axios.get(`/memberships/${context}`)).data;
54+
},
55+
async updateMembership({ dispatch }, context) {
56+
const data = JSON.parse(JSON.stringify(context));
57+
delete data.id;
58+
await this.$axios.patch(`/memberships/${context.id}`, data);
59+
return dispatch("getMembership", context.id);
4760
}
4861
};
4962

0 commit comments

Comments
 (0)