mirror of
https://github.com/Ocelot-Social-Community/Ocelot-Social.git
synced 2025-12-13 07:46:06 +00:00
193 lines
4.5 KiB
Vue
193 lines
4.5 KiB
Vue
<template>
|
|
<div>
|
|
<ds-space margin="small">
|
|
<tab-navigation :tabs="tabOptions" :activeTab="tabActive" @switch-tab="handleTab" />
|
|
</ds-space>
|
|
<ds-space margin="large" />
|
|
<ds-space>
|
|
<!-- create group -->
|
|
<ds-space centered>
|
|
<nuxt-link :to="{ name: 'groups-create' }">
|
|
<base-button
|
|
class="group-add-button"
|
|
icon="plus"
|
|
size="large"
|
|
circle
|
|
filled
|
|
v-tooltip="{
|
|
content: $t('group.createNewGroup.tooltip'),
|
|
placement: 'left',
|
|
}"
|
|
/>
|
|
</nuxt-link>
|
|
</ds-space>
|
|
<!-- group list -->
|
|
<ds-space centered v-if="showPagination">
|
|
<pagination-buttons
|
|
:hasNext="hasNext"
|
|
:showPageCounter="true"
|
|
:hasPrevious="hasPrevious"
|
|
:activePage="activePage"
|
|
:activeResourceCount="activeTab.count"
|
|
:key="'Top'"
|
|
:pageSize="pageSize"
|
|
@back="previousResults"
|
|
@next="nextResults"
|
|
/>
|
|
</ds-space>
|
|
<group-list :groups="myGroups" />
|
|
<ds-space centered v-if="showPagination">
|
|
<pagination-buttons
|
|
:hasNext="hasNext"
|
|
:showPageCounter="true"
|
|
:hasPrevious="hasPrevious"
|
|
:activePage="activePage"
|
|
:activeResourceCount="activeTab.count"
|
|
:key="'Bottom'"
|
|
:pageSize="pageSize"
|
|
@back="previousResults"
|
|
@next="nextResults"
|
|
/>
|
|
</ds-space>
|
|
</ds-space>
|
|
</div>
|
|
</template>
|
|
|
|
<script>
|
|
import GroupList from '~/components/Group/GroupList'
|
|
import { groupQuery, groupCountQuery } from '~/graphql/groups.js'
|
|
import TabNavigation from '~/components/_new/generic/TabNavigation/TabNavigation'
|
|
import PaginationButtons from '~/components/_new/generic/PaginationButtons/PaginationButtons'
|
|
|
|
const tabToFilterMapping = (tab) => {
|
|
return {
|
|
myGroups: { isMember: true },
|
|
allGroups: {},
|
|
}[tab]
|
|
}
|
|
|
|
export default {
|
|
name: 'Groups',
|
|
components: {
|
|
GroupList,
|
|
TabNavigation,
|
|
PaginationButtons,
|
|
},
|
|
data() {
|
|
return {
|
|
Group: [],
|
|
groupFilter: { isMember: true },
|
|
tabActive: 'myGroups',
|
|
pageSize: 6,
|
|
activePage: 0,
|
|
myGroupsCount: 0,
|
|
allGroupsCount: 0,
|
|
}
|
|
},
|
|
methods: {
|
|
handleTab(tab) {
|
|
if (this.tabActive !== tab) {
|
|
this.tabActive = tab
|
|
this.activePage = 0
|
|
this.groupFilter = tabToFilterMapping(tab)
|
|
this.$apollo.queries.Group.refetch()
|
|
}
|
|
},
|
|
previousResults() {
|
|
this.activePage--
|
|
this.$apollo.queries.Group.refetch()
|
|
},
|
|
nextResults() {
|
|
this.activePage++
|
|
this.$apollo.queries.Group.refetch()
|
|
},
|
|
},
|
|
computed: {
|
|
activeTab() {
|
|
return this.tabOptions.find((tab) => tab.type === this.tabActive)
|
|
},
|
|
showPagination() {
|
|
return this.activeTab.count > this.pageSize
|
|
},
|
|
hasNext() {
|
|
return (this.activePage + 1) * this.pageSize < this.activeTab.count
|
|
},
|
|
hasPrevious() {
|
|
return this.activePage > 0
|
|
},
|
|
pagination() {
|
|
return {
|
|
first: this.pageSize,
|
|
offset: this.activePage * this.pageSize,
|
|
}
|
|
},
|
|
myGroups() {
|
|
return this.Group ? this.Group : []
|
|
},
|
|
tabOptions() {
|
|
return [
|
|
{
|
|
type: 'myGroups',
|
|
title: this.$t('group.myGroups'),
|
|
count: this.myGroupsCount,
|
|
disabled: this.myGroupsCount === 0,
|
|
},
|
|
{
|
|
type: 'allGroups',
|
|
title: this.$t('group.allGroups'),
|
|
count: this.allGroupsCount,
|
|
disabled: this.allGroupsCount === 0,
|
|
},
|
|
]
|
|
},
|
|
},
|
|
apollo: {
|
|
Group: {
|
|
query() {
|
|
return groupQuery(this.$i18n)
|
|
},
|
|
variables() {
|
|
return {
|
|
...this.groupFilter,
|
|
...this.pagination,
|
|
}
|
|
},
|
|
error(error) {
|
|
this.Group = []
|
|
this.$toast.error(error.message)
|
|
},
|
|
fetchPolicy: 'cache-and-network',
|
|
},
|
|
MyGroupsCount: {
|
|
query() {
|
|
return groupCountQuery()
|
|
},
|
|
variables() {
|
|
return {
|
|
isMember: true,
|
|
}
|
|
},
|
|
update({ GroupCount }) {
|
|
this.myGroupsCount = GroupCount
|
|
},
|
|
fetchPolicy: 'cache-and-network',
|
|
},
|
|
AllGroupsCount: {
|
|
query() {
|
|
return groupCountQuery()
|
|
},
|
|
update({ GroupCount }) {
|
|
this.allGroupsCount = GroupCount
|
|
},
|
|
fetchPolicy: 'cache-and-network',
|
|
},
|
|
},
|
|
}
|
|
</script>
|
|
|
|
<style lang="scss">
|
|
.group-add-button {
|
|
box-shadow: $box-shadow-x-large;
|
|
}
|
|
</style>
|