Skip to content
Snippets Groups Projects
Commit 98d1e4ec authored by Julian's avatar Julian
Browse files

Create component and schemas for person actions

parent d6f82e15
No related branches found
No related tags found
2 merge requests!1123Resolve "Finalise Vuetify app as SPA",!1066Translations update from Weblate
<template>
<ApolloQuery
:query="require('./personActions.graphql')"
:variables="{'id': id}"
>
<template #default="{ result: { error, data, loading } }">
<div
class="d-flex gap justify-md-end flex-column-reverse flex-md-row align-end align-md-center"
>
<v-skeleton-loader
v-if="loading"
type="actions"
/>
<template
v-else-if="data && data.person && data.person.id"
>
<v-btn
v-if="data.person.canEditPerson"
color="primary"
:to="{ name: 'core.editPerson', params: { id: data.person.id }}"
>
<v-icon left>$edit</v-icon>
{{ $t("actions.edit") }}
</v-btn>
<v-btn
v-if="data.person.canChangePersonPreferences"
color="secondary"
outlined
text
:to="{ name: 'core.preferencesPersonByPk', params: { pk: data.person.id }}"
>
<v-icon left>$preferences</v-icon>
{{ $t("preferences.person.change_preferences") }}
</v-btn>
<v-menu>
<template v-slot:activator="{ on, attrs }">
<v-btn
outlined
text
v-bind="attrs"
v-on="on"
>
<v-icon center>mdi-dots-horizontal</v-icon>
</v-btn>
</template>
<v-list>
<v-list-item
v-if="data.person.canImpersonatePerson"
>
<!-- FIXME: no URL-->
<v-list-item-icon>
<v-icon>mdi-account-box-outline</v-icon>
</v-list-item-icon>
<v-list-item-content>
<v-list-item-title>{{ $t("person.impersonate") }}</v-list-item-title>
</v-list-item-content>
</v-list-item>
<v-list-item
v-if="data.person.canInvitePerson"
:to="{ name: 'core.invitePerson', params: { id: data.person.id }}"
>
<v-list-item-icon>
<v-icon>mdi-account-plus-outline</v-icon>
</v-list-item-icon>
<v-list-item-content>
<v-list-item-title>{{ $t("person.invite") }}</v-list-item-title>
</v-list-item-content>
</v-list-item>
<v-list-item
v-if="data.person.canDeletePerson"
:to="{ name: 'core.deletePerson', params: { id: data.person.id }}"
class="error--text"
>
<v-list-item-icon>
<v-icon color="error">mdi-delete</v-icon>
</v-list-item-icon>
<v-list-item-content>
<v-list-item-title>{{ $t("person.delete") }}</v-list-item-title>
</v-list-item-content>
</v-list-item>
</v-list>
</v-menu>
</template>
</div>
</template>
</ApolloQuery>
</template>
<script>
export default {
name: "PersonActions",
props: {
id: {
type: String,
required: true,
}
}
}
</script>
<style scoped>
.gap {
gap: .5rem;
}
</style>
query actions($id: ID!) {
person: personById(id: $id) {
id
canEditPerson
canDeletePerson
canChangePersonPreferences
canInvitePerson
canImpersonatePerson
}
}
......@@ -107,7 +107,8 @@
},
"actions": {
"back": "Back",
"search": "Search"
"search": "Search",
"edit": "Edit"
},
"administration": {
"backend_admin": {
......@@ -207,11 +208,15 @@
"details": "Contact details",
"children": "Children",
"guardians": "Guardians / Parents",
"no_persons": "No Persons"
"no_persons": "No Persons",
"delete": "Delete",
"impersonate": "Impersonate",
"invite": "Invite"
},
"preferences": {
"person": {
"menu_title": "Preferences"
"menu_title": "Preferences",
"change_preferences": "Preferences"
},
"site": {
"menu_title": "Configuration"
......
......@@ -42,6 +42,12 @@ class PersonType(DjangoObjectType):
is_dummy = graphene.Boolean()
preferences = graphene.Field(PersonPreferencesType)
can_edit_person = graphene.Boolean()
can_delete_person = graphene.Boolean()
can_change_person_preferences = graphene.Boolean()
can_impersonate_person = graphene.Boolean()
can_invite_person = graphene.Boolean()
def resolve_username(root, info, **kwargs): # noqa
return root.user.username if root.user else None
......@@ -96,6 +102,22 @@ class PersonType(DjangoObjectType):
return root.notifications.filter(send_at__lte=timezone.now()).order_by("read", "-created")
def resolve_can_edit_person(root, info, **kwargs): # noqa
return info.context.user.has_perm("core.edit_person_rule", root)
def resolve_can_delete_person(root, info, **kwargs): # noqa
return info.context.user.has_perm("core.delete_person_rule", root)
def resolve_can_change_person_preferences(root, info, **kwargs): # noqa
return info.context.user.has_perm("core.change_person_preferences_rule", root)
def resolve_can_impersonate_person(root, info, **kwargs): # noqa
return root.user and info.context.user.has_perm("core.impersonate_rule", root)
def resolve_can_invite_person(root, info, **kwargs): # noqa
return (not root.user) and info.context.user.has_perm("core.can_invite_rule", root)
class PersonMutation(DjangoModelFormMutation):
person = graphene.Field(PersonType)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment