diff --git a/aleksis/core/assets/components/person/PersonOverview.vue b/aleksis/core/assets/components/person/PersonOverview.vue index 416ebbf5b1c5c9909e043db167702e304ecc085b..bcffce11948dc15f2dc16ab8545a096b9a93bf2a 100644 --- a/aleksis/core/assets/components/person/PersonOverview.vue +++ b/aleksis/core/assets/components/person/PersonOverview.vue @@ -1,5 +1,144 @@ <template> + <ApolloQuery + :query="require('./personOverview.graphql')" + :variables="{'id': id}" + > + <template #default="{ result: { error, data, loading } }"> + <template v-if="loading"> + <v-skeleton-loader type="article"/> + <v-row> + <v-col + cols="12" + lg="4" + v-for="_ in 3"> + <v-skeleton-loader type="card"/> + </v-col> + </v-row> + </template> + <template v-else-if="data && data.person"> + <h1>{{ data.person.firstName }} {{ data.person.lastName }} + <span v-if="data.person.username" class="text-h5 grey--text text--darken-2"> + {{ data.person.username }} + </span> + </h1> + + <v-row> + <v-col + cols="12" + lg="4" + > + <v-card> + <v-card-title>{{ $t("person.details") }}</v-card-title> + + <v-list two-line> + <v-list-item> + <v-list-item-icon> + <v-icon> + mdi-account-outline + </v-icon> + </v-list-item-icon> + + <v-list-item-content> + <v-list-item-title> + {{ data.person.firstName }} {{ data.person.additionalName }} {{ data.person.lastName }} + </v-list-item-title> + </v-list-item-content> + </v-list-item> + <v-divider inset/> + + <v-list-item> + <v-list-item-icon> + <v-icon> + mdi-human-non-binary + </v-icon> + </v-list-item-icon> + + <v-list-item-content> + <v-list-item-title> + {{ data.person.sex }} + </v-list-item-title> + </v-list-item-content> + </v-list-item> + <v-divider inset/> + + <v-list-item> + <v-list-item-icon> + <v-icon> + mdi-map-marker-outline + </v-icon> + </v-list-item-icon> + + <v-list-item-content> + <v-list-item-title>{{ data.person.street }} {{ data.person.housenumber }}</v-list-item-title> + <v-list-item-subtitle>{{ data.person.postalCode }} {{ data.person.place }}</v-list-item-subtitle> + </v-list-item-content> + </v-list-item> + <v-divider inset/> + + <v-list-item + :href="'tel:' + data.person.phoneNumber" + > + <v-list-item-icon> + <v-icon> + mdi-phone-outline + </v-icon> + </v-list-item-icon> + + <v-list-item-content> + <v-list-item-title>{{ data.person.phoneNumber }}</v-list-item-title> + <v-list-item-subtitle>{{ $t("person.home")}}</v-list-item-subtitle> + </v-list-item-content> + </v-list-item> + + <v-list-item + :href="'tel:' + data.person.mobileNumber" + > + <v-list-item-action></v-list-item-action> + + <v-list-item-content> + <v-list-item-title>{{ data.person.mobileNumber }}</v-list-item-title> + <v-list-item-subtitle>{{ $t("person.mobile")}}</v-list-item-subtitle> + </v-list-item-content> + </v-list-item> + <v-divider inset/> + + <v-list-item + :href="'mailto:' + data.person.email" + > + <v-list-item-icon> + <v-icon> + mdi-email-outline + </v-icon> + </v-list-item-icon> + + <v-list-item-content> + <v-list-item-title> + {{ data.person.email }} + </v-list-item-title> + </v-list-item-content> + </v-list-item> + <v-divider inset/> + + <v-list-item> + <v-list-item-icon> + <v-icon> + mdi-cake-variant-outline + </v-icon> + </v-list-item-icon> + + <v-list-item-content> + <v-list-item-title>{{ $d(new Date(data.person.dateOfBirth), "short") }}</v-list-item-title> + <v-list-item-subtitle>{{ data.person.placeOfBirth }}</v-list-item-subtitle> + </v-list-item-content> + </v-list-item> + </v-list> + </v-card> + </v-col> + </v-row> + </template> + </template> + </ApolloQuery> </template> <script> diff --git a/aleksis/core/assets/components/person/personOverview.graphql b/aleksis/core/assets/components/person/personOverview.graphql new file mode 100644 index 0000000000000000000000000000000000000000..94eab6cd46bc75557ab90974997fbe9c778070d7 --- /dev/null +++ b/aleksis/core/assets/components/person/personOverview.graphql @@ -0,0 +1,31 @@ +query person($id: ID) { + person: personByIdOrMe(id:$id) { + id + username + firstName + additionalName + lastName + sex + street + housenumber + postalCode + place + phoneNumber + mobileNumber + email + dateOfBirth + placeOfBirth + + photo { + url + } + avatar { + url + } + + guardians { + id + fullName + } + } +} diff --git a/aleksis/core/assets/messages.json b/aleksis/core/assets/messages.json index 312ce282bc27fbf7e46857a29dca39315607f675..2033d76d70703970eacbeb4b33d99d76554d179c 100644 --- a/aleksis/core/assets/messages.json +++ b/aleksis/core/assets/messages.json @@ -196,7 +196,10 @@ "logged_in_as": "Logged in as", "menu_title": "Persons", "title": "Person", - "title_plural": "Persons" + "title_plural": "Persons", + "mobile": "mobile phone", + "home": "home phone", + "details": "Contact details" }, "preferences": { "person": { diff --git a/aleksis/core/schema/__init__.py b/aleksis/core/schema/__init__.py index 55a217ea986dcbe451c537dfb1e9ad569fa8d05c..f74db7e43383c857f06d3afe73e75b92270d3aec 100644 --- a/aleksis/core/schema/__init__.py +++ b/aleksis/core/schema/__init__.py @@ -34,6 +34,7 @@ class Query(graphene.ObjectType): persons = graphene.List(PersonType) person_by_id = graphene.Field(PersonType, id=graphene.ID()) + person_by_id_or_me = graphene.Field(PersonType, id=graphene.ID()) who_am_i = graphene.Field(PersonType) system_properties = graphene.Field(SystemPropertiesType) @@ -73,6 +74,16 @@ class Query(graphene.ObjectType): raise PermissionDenied() return person + def resolve_person_by_id_or_me(root, info, id): # noqa + # Returns current user if id is None, else the person with the id + if id is None: + return info.context.user.person if has_person(info.context.user) else None + + person = Person.objects.get(pk=id) + if not info.context.user.has_perm("core.view_person_rule", person): + raise PermissionDenied() + return person + def resolve_who_am_i(root, info, **kwargs): if has_person(info.context.user): return info.context.user.person diff --git a/aleksis/core/schema/person.py b/aleksis/core/schema/person.py index 48f468e348b5efed9084319fc26c9802aefc95ed..d8ca1c474f36e444f7901e6d5b216af259903216 100644 --- a/aleksis/core/schema/person.py +++ b/aleksis/core/schema/person.py @@ -30,6 +30,7 @@ class PersonType(DjangoObjectType): model = Person full_name = graphene.String() + username = graphene.String() unread_notifications_count = graphene.Int() photo = graphene.Field(FieldFileType) avatar = graphene.Field(FieldFileType) @@ -38,6 +39,9 @@ class PersonType(DjangoObjectType): is_dummy = graphene.Boolean() preferences = graphene.Field(PersonPreferencesType) + def resolve_username(root, info, **kwargs): # noqa + return root.user.username if root.user else None + def resolve_photo(root, info, **kwargs): if info.context.user.has_perm("core.view_photo_rule", root): return root.photo