change to named tab param

This commit is contained in:
Moriz Wahl 2023-02-17 11:15:19 +01:00
parent 86742d0158
commit df468b9b1d
8 changed files with 370 additions and 366 deletions

View File

@ -23,22 +23,24 @@
</div> </div>
</template> </template>
<script> <script>
export default { export const COMMUNITY_TABS = ['contribute', 'contributions', 'community']
name: 'NavCommunity',
methods: { export default {
handleClick(tab) { name: 'NavCommunity',
console.log('handleClick', tab) methods: {
if (this.$route.params && this.$route.params.tab && Number(this.$route.params.tab) !== tab) { handleClick(tab) {
this.$router.push({ params: { tab } }) if (this.$route.params.tab !== COMMUNITY_TABS[tab]) {
} this.$router.push({ params: { tab: COMMUNITY_TABS[tab] } })
}, }
}, },
},
/*
watch: { watch: {
'$route.params.tab'(tab) { '$route.params.tab'() {
this.handleClick(tab)
}, },
}, },
} */
}
</script> </script>
<style scoped> <style scoped>
.nav-row { .nav-row {

View File

@ -1,82 +1,10 @@
<template> <template>
<div class="contribution-info d-none d-lg-block"> <div class="contribution-info d-none d-lg-block">
<div v-if="hash === '#my'"> <slot :name="$route.params.tab" />
<h4 class="alert-heading">{{ $t('community.myContributions') }}</h4>
<p>
{{ $t('contribution.alert.myContributionNoteList') }}
</p>
<ul>
<li>
<b-icon icon="bell-fill" variant="primary"></b-icon>
{{ $t('contribution.alert.pending') }}
</li>
<li>
<b-icon icon="question-square" variant="warning"></b-icon>
{{ $t('contribution.alert.in_progress') }}
</li>
<li>
<b-icon icon="check" variant="success"></b-icon>
{{ $t('contribution.alert.confirm') }}
</li>
<li>
<b-icon icon="x-circle" variant="warning"></b-icon>
{{ $t('contribution.alert.denied') }}
</li>
<li>
<b-icon icon="trash" variant="danger"></b-icon>
{{ $t('contribution.alert.deleted') }}
</li>
</ul>
</div>
<div v-if="hash === '#all'" show fade variant="secondary" class="text-dark">
<h4 class="alert-heading">{{ $t('navigation.community') }}</h4>
<p>
{{ $t('contribution.alert.communityNoteList') }}
</p>
<ul>
<li>
<b-icon icon="bell-fill" variant="primary"></b-icon>
{{ $t('contribution.alert.pending') }}
</li>
<li>
<b-icon icon="question-square" variant="warning"></b-icon>
{{ $t('contribution.alert.in_progress') }}
</li>
<li>
<b-icon icon="check" variant="success"></b-icon>
{{ $t('contribution.alert.confirm') }}
</li>
<li>
<b-icon icon="x-circle" variant="warning"></b-icon>
{{ $t('contribution.alert.denied') }}
</li>
</ul>
</div>
<div v-if="hash === '#edit'" show fade variant="secondary" class="text-dark">
<div>
<h3>{{ $t('contribution.formText.yourContribution') }}</h3>
{{ $t('contribution.formText.bringYourTalentsTo') }}
<div class="my-3">
<b>{{ $t('contribution.formText.describeYourCommunity') }}</b>
</div>
</div>
</div>
</div> </div>
</template> </template>
<script> <script>
export default { export default {
name: 'ContributionInfo', name: 'ContributionInfo',
computed: { }
hash() {
return this.$route.hash
},
currentTab() {
console.log('ROUTE', this.$route)
if (this.$route.from && this.$route.from.params && this.$route.from.params.tab)
return this.$route.from.params.tab
return 0
},
},
}
</script> </script>

View File

@ -121,11 +121,7 @@
</b-col> </b-col>
<!-- Right Side Mobil --> <!-- Right Side Mobil -->
<b-col class="d-block d-lg-none"> <b-col class="d-block d-lg-none">
<right-side <right-side>
:transactions="transactions"
:transactionCount="transactionCount"
:transactionLinkCount="transactionLinkCount"
>
<template #transactions> <template #transactions>
<last-transactions <last-transactions
:transactions="transactions" :transactions="transactions"
@ -135,7 +131,7 @@
/> />
</template> </template>
<template #community> <template #community>
<contribution-info /> <community-template />
</template> </template>
<template #empty /> <template #empty />
</right-side> </right-side>
@ -162,11 +158,7 @@
</b-col> </b-col>
<!-- RightSide Desktop --> <!-- RightSide Desktop -->
<b-col cols="3" class="d-none d-lg-block"> <b-col cols="3" class="d-none d-lg-block">
<right-side <right-side>
:transactions="transactions"
:transactionCount="transactionCount"
:transactionLinkCount="transactionLinkCount"
>
<template #transactions> <template #transactions>
<last-transactions <last-transactions
:transactions="transactions" :transactions="transactions"
@ -175,10 +167,10 @@
@set-tunneled-email="setTunneledEmail" @set-tunneled-email="setTunneledEmail"
/> />
</template> </template>
<template #community>
<contribution-info />
</template>
<template #empty /> <template #empty />
<template #community>
<community-template />
</template>
</right-side> </right-side>
</b-col> </b-col>
</b-row> </b-row>
@ -194,6 +186,7 @@
</template> </template>
<script> <script>
import ContentHeader from '@/layouts/templates/ContentHeader.vue' import ContentHeader from '@/layouts/templates/ContentHeader.vue'
import CommunityTemplate from '@/layouts/templates/CommunityTemplate.vue'
import Breadcrumb from '@/components/Breadcrumb/breadcrumb.vue' import Breadcrumb from '@/components/Breadcrumb/breadcrumb.vue'
import RightSide from '@/layouts/templates/RightSide.vue' import RightSide from '@/layouts/templates/RightSide.vue'
import SkeletonOverview from '@/components/skeleton/Overview.vue' import SkeletonOverview from '@/components/skeleton/Overview.vue'
@ -211,7 +204,6 @@ import GdtAmount from '@/components/Template/ContentHeader/GdtAmount.vue'
import CommunityMember from '@/components/Template/ContentHeader/CommunityMember.vue' import CommunityMember from '@/components/Template/ContentHeader/CommunityMember.vue'
import NavCommunity from '@/components/Template/ContentHeader/NavCommunity.vue' import NavCommunity from '@/components/Template/ContentHeader/NavCommunity.vue'
import LastTransactions from '@/components/Template/RightSide/LastTransactions.vue' import LastTransactions from '@/components/Template/RightSide/LastTransactions.vue'
import ContributionInfo from '@/components/Template/RightSide/ContributionInfo.vue'
export default { export default {
name: 'DashboardLayout', name: 'DashboardLayout',
@ -231,7 +223,7 @@ export default {
CommunityMember, CommunityMember,
NavCommunity, NavCommunity,
LastTransactions, LastTransactions,
ContributionInfo, CommunityTemplate,
}, },
data() { data() {
return { return {

View File

@ -0,0 +1,82 @@
<template>
<contribution-info>
<template #contribute>
<div show fade variant="secondary" class="text-dark">
<div>
<h3>{{ $t('contribution.formText.yourContribution') }}</h3>
{{ $t('contribution.formText.bringYourTalentsTo') }}
<div class="my-3">
<b>{{ $t('contribution.formText.describeYourCommunity') }}</b>
</div>
</div>
</div>
</template>
<template #contributions>
<div show fade variant="secondary" class="text-dark">
<h4 class="alert-heading">{{ $t('community.myContributions') }}</h4>
<p>
{{ $t('contribution.alert.myContributionNoteList') }}
</p>
<ul>
<li>
<b-icon icon="bell-fill" variant="primary"></b-icon>
{{ $t('contribution.alert.pending') }}
</li>
<li>
<b-icon icon="question-square" variant="warning"></b-icon>
{{ $t('contribution.alert.in_progress') }}
</li>
<li>
<b-icon icon="check" variant="success"></b-icon>
{{ $t('contribution.alert.confirm') }}
</li>
<li>
<b-icon icon="x-circle" variant="warning"></b-icon>
{{ $t('contribution.alert.denied') }}
</li>
<li>
<b-icon icon="trash" variant="danger"></b-icon>
{{ $t('contribution.alert.deleted') }}
</li>
</ul>
</div>
</template>
<template #community>
<div show fade variant="secondary" class="text-dark">
<h4 class="alert-heading">{{ $t('navigation.community') }}</h4>
<p>
{{ $t('contribution.alert.communityNoteList') }}
</p>
<ul>
<li>
<b-icon icon="bell-fill" variant="primary"></b-icon>
{{ $t('contribution.alert.pending') }}
</li>
<li>
<b-icon icon="question-square" variant="warning"></b-icon>
{{ $t('contribution.alert.in_progress') }}
</li>
<li>
<b-icon icon="check" variant="success"></b-icon>
{{ $t('contribution.alert.confirm') }}
</li>
<li>
<b-icon icon="x-circle" variant="warning"></b-icon>
{{ $t('contribution.alert.denied') }}
</li>
</ul>
</div>
</template>
</contribution-info>
</template>
<script>
import ContributionInfo from '@/components/Template/RightSide/ContributionInfo.vue'
export default {
name: 'CommunityTemplate',
components: {
ContributionInfo,
},
}
</script>

View File

@ -5,13 +5,12 @@
</template> </template>
<script> <script>
export default { export default {
name: 'ContentHeader', name: 'ContentHeader',
computed: { computed: {
path() { path() {
console.log('ContentHeader', this.$route.path.replace(/^\/(.+?)(\/.+)?$/, '$1')) return this.$route.path.replace(/^\/(.+?)(\/.+)?$/, '$1')
return this.$route.path.replace(/^\/(.+?)(\/.+)?$/, '$1') },
}, },
}, }
}
</script> </script>

View File

@ -6,21 +6,19 @@
</div> </div>
</template> </template>
<script> <script>
export default { export default {
name: 'RightSide', name: 'RightSide',
computed: { computed: {
name() { name() {
console.log('RightSide', this.$route.path.replace(/^\/(.+?)(\/.+)?$/, '$1')) switch (this.$route.path.replace(/^\/(.+?)(\/.+)?$/, '$1')) {
switch (this.$route.path.replace(/^\/(.+?)(\/.+)?$/, '$1')) { case 'settings':
case 'settings': return 'empty'
return 'empty' case 'community':
case 'community': return 'community'
console.log('-----------') default:
return 'community' return 'transactions'
default: }
return 'transactions' },
} },
}, }
},
}
</script> </script>

View File

@ -58,241 +58,244 @@
</div> </div>
</template> </template>
<script> <script>
import OpenCreationsAmount from '@/components/Contributions/OpenCreationsAmount.vue' import OpenCreationsAmount from '@/components/Contributions/OpenCreationsAmount.vue'
import ContributionForm from '@/components/Contributions/ContributionForm.vue' import ContributionForm from '@/components/Contributions/ContributionForm.vue'
import ContributionList from '@/components/Contributions/ContributionList.vue' import ContributionList from '@/components/Contributions/ContributionList.vue'
import { createContribution, updateContribution, deleteContribution } from '@/graphql/mutations' import { createContribution, updateContribution, deleteContribution } from '@/graphql/mutations'
import { listContributions, listAllContributions, openCreations } from '@/graphql/queries' import { listContributions, listAllContributions, openCreations } from '@/graphql/queries'
import { COMMUNITY_TABS } from '@/components/Template/ContentHeader/NavCommunity'
export default { export default {
name: 'Community', name: 'Community',
components: { components: {
ContributionForm, ContributionForm,
ContributionList, ContributionList,
OpenCreationsAmount, OpenCreationsAmount,
}, },
data() { data() {
return { return {
tabIndex: 1, tabIndex: 0,
items: [], items: [],
itemsAll: [], itemsAll: [],
currentPage: 1, currentPage: 1,
pageSize: 25, pageSize: 25,
currentPageAll: 1, currentPageAll: 1,
pageSizeAll: 25, pageSizeAll: 25,
contributionCount: 0, contributionCount: 0,
contributionCountAll: 0, contributionCountAll: 0,
form: { form: {
id: null, id: null,
date: '', date: '',
memo: '', memo: '',
hours: 0, hours: 0,
amount: '', amount: '',
}, },
updateAmount: '', updateAmount: '',
maximalDate: new Date(), maximalDate: new Date(),
openCreations: [], openCreations: [],
} }
}, },
mounted() { mounted() {
this.updateTabIndex(Number(this.$route.params.tab)) this.updateTabIndex()
}, },
apollo: { apollo: {
OpenCreations: { OpenCreations: {
query() { query() {
return openCreations return openCreations
}, },
fetchPolicy: 'network-only', fetchPolicy: 'network-only',
variables() { variables() {
return {} return {}
}, },
update({ openCreations }) { update({ openCreations }) {
this.openCreations = openCreations this.openCreations = openCreations
}, },
error({ message }) { error({ message }) {
this.toastError(message) this.toastError(message)
}, },
}, },
ListAllContributions: { ListAllContributions: {
query() { query() {
return listAllContributions return listAllContributions
}, },
fetchPolicy: 'network-only', fetchPolicy: 'network-only',
variables() { variables() {
return { return {
currentPage: this.currentPageAll, currentPage: this.currentPageAll,
pageSize: this.pageSizeAll, pageSize: this.pageSizeAll,
} }
}, },
update({ listAllContributions }) { update({ listAllContributions }) {
this.contributionCountAll = listAllContributions.contributionCount this.contributionCountAll = listAllContributions.contributionCount
this.itemsAll = listAllContributions.contributionList this.itemsAll = listAllContributions.contributionList
}, },
error({ message }) { error({ message }) {
this.toastError(message) this.toastError(message)
}, },
}, },
ListContributions: { ListContributions: {
query() { query() {
return listContributions return listContributions
}, },
fetchPolicy: 'network-only', fetchPolicy: 'network-only',
variables() { variables() {
return { return {
currentPage: this.currentPage, currentPage: this.currentPage,
pageSize: this.pageSize, pageSize: this.pageSize,
} }
}, },
update({ listContributions }) { update({ listContributions }) {
this.contributionCount = listContributions.contributionCount this.contributionCount = listContributions.contributionCount
this.items = listContributions.contributionList this.items = listContributions.contributionList
if (this.items.find((item) => item.state === 'IN_PROGRESS')) { if (this.items.find((item) => item.state === 'IN_PROGRESS')) {
this.tabIndex = 1 this.$router.push({ params: { tab: 'contributions' } })
this.toastInfo(this.$t('contribution.alert.answerQuestionToast')) this.toastInfo(this.$t('contribution.alert.answerQuestionToast'))
} }
}, },
error({ message }) { error({ message }) {
this.toastError(message) this.toastError(message)
}, },
}, },
}, },
watch: { watch: {
'$route.params.tab'(tab) { '$route.params.tab'(tab) {
this.updateTabIndex(tab) this.updateTabIndex()
}, },
}, },
computed: { computed: {
minimalDate() { minimalDate() {
const date = new Date(this.maximalDate) const date = new Date(this.maximalDate)
return new Date(date.setMonth(date.getMonth() - 1, 1)) return new Date(date.setMonth(date.getMonth() - 1, 1))
}, },
isThisMonth() { isThisMonth() {
const formDate = new Date(this.form.date) const formDate = new Date(this.form.date)
return ( return (
formDate.getFullYear() === this.maximalDate.getFullYear() && formDate.getFullYear() === this.maximalDate.getFullYear() &&
formDate.getMonth() === this.maximalDate.getMonth() formDate.getMonth() === this.maximalDate.getMonth()
) )
}, },
amountToAdd() { amountToAdd() {
// when existing contribution is edited, the amount is added back on top of the amount // when existing contribution is edited, the amount is added back on top of the amount
if (this.form.id) return parseInt(this.updateAmount) if (this.form.id) return parseInt(this.updateAmount)
return 0 return 0
}, },
maxForMonths() { maxForMonths() {
const formDate = new Date(this.form.date) const formDate = new Date(this.form.date)
if (this.openCreations && this.openCreations.length) if (this.openCreations && this.openCreations.length)
return this.openCreations.slice(1).map((creation) => { return this.openCreations.slice(1).map((creation) => {
if (creation.year === formDate.getFullYear() && creation.month === formDate.getMonth()) if (creation.year === formDate.getFullYear() && creation.month === formDate.getMonth())
return parseInt(creation.amount) + this.amountToAdd return parseInt(creation.amount) + this.amountToAdd
return parseInt(creation.amount) return parseInt(creation.amount)
}) })
return [0, 0] return [0, 0]
}, },
}, },
methods: { methods: {
updateTabIndex(tab) { updateTabIndex() {
console.log('updateTabIndex', tab) const index = COMMUNITY_TABS.indexOf(this.$route.params.tab)
if (Number(tab) !== this.tabIndex) { if (index > -1) {
this.tabIndex = Number(tab) this.tabIndex = index
this.closeAllOpenCollapse() } else {
} this.tabIndex = 0
}, }
closeAllOpenCollapse() { this.closeAllOpenCollapse()
this.$el.querySelectorAll('.collapse.show').forEach((value) => { },
this.$root.$emit('bv::toggle::collapse', value.id) closeAllOpenCollapse() {
}) this.$el.querySelectorAll('.collapse.show').forEach((value) => {
}, this.$root.$emit('bv::toggle::collapse', value.id)
refetchData() { })
this.$apollo.queries.ListAllContributions.refetch() },
this.$apollo.queries.ListContributions.refetch() refetchData() {
this.$apollo.queries.OpenCreations.refetch() this.$apollo.queries.ListAllContributions.refetch()
}, this.$apollo.queries.ListContributions.refetch()
saveContribution(data) { this.$apollo.queries.OpenCreations.refetch()
this.$apollo },
.mutate({ saveContribution(data) {
fetchPolicy: 'no-cache', this.$apollo
mutation: createContribution, .mutate({
variables: { fetchPolicy: 'no-cache',
creationDate: data.date, mutation: createContribution,
memo: data.memo, variables: {
amount: data.amount, creationDate: data.date,
}, memo: data.memo,
}) amount: data.amount,
.then((result) => { },
this.toastSuccess(this.$t('contribution.submitted')) })
this.refetchData() .then((result) => {
}) this.toastSuccess(this.$t('contribution.submitted'))
.catch((err) => { this.refetchData()
this.toastError(err.message) })
}) .catch((err) => {
}, this.toastError(err.message)
updateContribution(data) { })
this.$apollo },
.mutate({ updateContribution(data) {
fetchPolicy: 'no-cache', this.$apollo
mutation: updateContribution, .mutate({
variables: { fetchPolicy: 'no-cache',
contributionId: data.id, mutation: updateContribution,
creationDate: data.date, variables: {
memo: data.memo, contributionId: data.id,
amount: data.amount, creationDate: data.date,
}, memo: data.memo,
}) amount: data.amount,
.then((result) => { },
this.toastSuccess(this.$t('contribution.updated')) })
this.refetchData() .then((result) => {
}) this.toastSuccess(this.$t('contribution.updated'))
.catch((err) => { this.refetchData()
this.toastError(err.message) })
}) .catch((err) => {
}, this.toastError(err.message)
deleteContribution(data) { })
this.$apollo },
.mutate({ deleteContribution(data) {
fetchPolicy: 'no-cache', this.$apollo
mutation: deleteContribution, .mutate({
variables: { fetchPolicy: 'no-cache',
id: data.id, mutation: deleteContribution,
}, variables: {
}) id: data.id,
.then((result) => { },
this.toastSuccess(this.$t('contribution.deleted')) })
this.refetchData() .then((result) => {
}) this.toastSuccess(this.$t('contribution.deleted'))
.catch((err) => { this.refetchData()
this.toastError(err.message) })
}) .catch((err) => {
}, this.toastError(err.message)
updateListAllContributions(pagination) { })
this.currentPageAll = pagination.currentPage },
this.pageSizeAll = pagination.pageSize updateListAllContributions(pagination) {
this.$apollo.queries.ListAllContributions.refetch() this.currentPageAll = pagination.currentPage
}, this.pageSizeAll = pagination.pageSize
updateListContributions(pagination) { this.$apollo.queries.ListAllContributions.refetch()
this.currentPage = pagination.currentPage },
this.pageSize = pagination.pageSize updateListContributions(pagination) {
this.$apollo.queries.ListContributions.refetch() this.currentPage = pagination.currentPage
}, this.pageSize = pagination.pageSize
updateContributionForm(item) { this.$apollo.queries.ListContributions.refetch()
this.form.id = item.id },
this.form.date = item.contributionDate updateContributionForm(item) {
this.form.memo = item.memo this.form.id = item.id
this.form.amount = item.amount this.form.date = item.contributionDate
this.form.hours = item.amount / 20 this.form.memo = item.memo
this.updateAmount = item.amount this.form.amount = item.amount
this.tabIndex = 0 this.form.hours = item.amount / 20
}, this.updateAmount = item.amount
updateTransactions(pagination) { this.$router.push({ params: { tab: 'contribute' } })
this.$emit('update-transactions', pagination) },
}, updateTransactions(pagination) {
updateState(id) { this.$emit('update-transactions', pagination)
this.items.find((item) => item.id === id).state = 'PENDING' },
}, updateState(id) {
}, this.items.find((item) => item.id === id).state = 'PENDING'
created() { },
this.updateTransactions(0) },
}, created() {
} this.updateTransactions(0)
},
}
</script> </script>
<style scoped> <style scoped>
.tab-content { .tab-content {

View File

@ -59,7 +59,7 @@ const routes = [
pageTitle: 'community', pageTitle: 'community',
}, },
redirect: (to) => { redirect: (to) => {
return { path: '/community/1' } return { path: '/community/contribute' }
}, },
}, },
{ {