mirror of
https://github.com/IT4Change/gradido.git
synced 2026-02-06 09:56:05 +00:00
* frontend - moved to vue 2.7 and vite * frontend - moved to vue 3 * frontend - login page updates * fix(frontend): WiP migration * fix(frontend): WiP migration * fix(frontend): WiP migration * fix(frontend): WiP migration * fix(frontend): WiP migration * fix(frontend): fix eslint/stylelint issues * fix(frontend): fix eslint/stylelint issues * feature(frontend): update node in docker frontend * feature(frontend): move send types out of Send file * feature(frontend): add entry in package json to fix eslint issue * feature(frontend): eslint fix * replace docker-compose with docker compose * update docker-compose test file * feature(frontend): Creation fixes * feature(frontend): Add missing updates for apollo scripts. --------- Co-authored-by: einhornimmond <silas@einhornimmond.de>
345 lines
12 KiB
Vue
Executable File
345 lines
12 KiB
Vue
Executable File
<template>
|
|
<div class="main-page">
|
|
<div v-if="skeleton">
|
|
<skeleton-overview />
|
|
</div>
|
|
<div v-else class="mx-lg-0">
|
|
<!-- navbar -->
|
|
<BRow>
|
|
<BCol>
|
|
<navbar class="main-navbar" :balance="balance"></navbar>
|
|
</BCol>
|
|
</BRow>
|
|
<!-- TODO mobile sidebar needs new component to be fixed-->
|
|
<mobile-sidebar @admin="admin" @logout="logout" />
|
|
|
|
<!-- Breadcrumb -->
|
|
<BRow class="breadcrumb">
|
|
<BCol cols="10" offset-lg="2">
|
|
<breadcrumb />
|
|
</BCol>
|
|
</BRow>
|
|
|
|
<BRow fluid class="d-flex">
|
|
<!-- Sidebar left -->
|
|
<BCol cols="2" class="d-none d-lg-block">
|
|
<sidebar class="main-sidebar" @admin="admin" @logout="logout" />
|
|
</BCol>
|
|
<!-- ContentHeader && Content -->
|
|
<BCol>
|
|
<BRow class="px-lg-3">
|
|
<BCol cols="12">
|
|
<BRow class="d-lg-flex" cols="12">
|
|
<!-- ContentHeader -->
|
|
<BCol>
|
|
<content-header
|
|
:balance="balance"
|
|
:gdt-balance="GdtBalance"
|
|
:total-users="totalUsers"
|
|
>
|
|
<template #overview>
|
|
<BRow>
|
|
<BCol cols="12" lg="5">
|
|
<div>
|
|
<gdd-amount
|
|
:balance="balance"
|
|
:show-status="false"
|
|
:badge-show="false"
|
|
/>
|
|
</div>
|
|
</BCol>
|
|
<BCol cols="12" lg="7">
|
|
<div>
|
|
<community-member :total-users="totalUsers" />
|
|
</div>
|
|
</BCol>
|
|
</BRow>
|
|
</template>
|
|
<template #send>
|
|
<BRow>
|
|
<BCol cols="12" lg="6">
|
|
<div>
|
|
<gdd-amount
|
|
:balance="balance"
|
|
:badge="true"
|
|
:show-status="true"
|
|
:badge-show="false"
|
|
/>
|
|
</div>
|
|
</BCol>
|
|
<BCol cols="12" lg="6">
|
|
<div>
|
|
<router-link to="gdt">
|
|
<gdt-amount :gdt-balance="GdtBalance" :badge-show="false" />
|
|
</router-link>
|
|
</div>
|
|
</BCol>
|
|
</BRow>
|
|
</template>
|
|
<template #transactions>
|
|
<BRow>
|
|
<BCol cols="12" lg="6">
|
|
<div>
|
|
<router-link to="transactions">
|
|
<gdd-amount :balance="balance" :show-status="true" />
|
|
</router-link>
|
|
</div>
|
|
</BCol>
|
|
<BCol cols="12" lg="6">
|
|
<div>
|
|
<router-link to="gdt">
|
|
<gdt-amount :gdt-balance="GdtBalance" />
|
|
</router-link>
|
|
</div>
|
|
</BCol>
|
|
</BRow>
|
|
</template>
|
|
<template #gdt>
|
|
<BRow>
|
|
<BCol cols="12" lg="6">
|
|
<div>
|
|
<router-link to="transactions">
|
|
<gdd-amount :balance="balance" :show-status="false" />
|
|
</router-link>
|
|
</div>
|
|
</BCol>
|
|
<BCol cols="12" lg="6">
|
|
<div>
|
|
<router-link to="gdt">
|
|
<gdt-amount
|
|
:badge="true"
|
|
:show-status="true"
|
|
:gdt-balance="GdtBalance"
|
|
/>
|
|
</router-link>
|
|
</div>
|
|
</BCol>
|
|
</BRow>
|
|
</template>
|
|
<template #community>
|
|
<nav-community />
|
|
</template>
|
|
<template #settings></template>
|
|
</content-header>
|
|
</BCol>
|
|
</BRow>
|
|
</BCol>
|
|
<!-- Right Side Mobil -->
|
|
<BCol class="d-block d-lg-none">
|
|
<right-side>
|
|
<template #transactions>
|
|
<last-transactions
|
|
:transactions="transactions"
|
|
:transaction-count="transactionCount"
|
|
:transaction-link-count="transactionLinkCount"
|
|
/>
|
|
</template>
|
|
<template #community>
|
|
<community-template />
|
|
</template>
|
|
<template #empty />
|
|
</right-side>
|
|
</BCol>
|
|
<BCol cols="12">
|
|
<!-- router-view -->
|
|
<div class="main-content mt-lg-3 mt-0">
|
|
<fade-transition :duration="200" origin="center top" mode="out-in">
|
|
<router-view
|
|
ref="router-view"
|
|
:balance="balance"
|
|
:gdt-balance="GdtBalance"
|
|
:transactions="transactions"
|
|
:transaction-count="transactionCount"
|
|
:transaction-link-count="transactionLinkCount"
|
|
:pending="pending"
|
|
@update-transactions="updateTransactions"
|
|
></router-view>
|
|
</fade-transition>
|
|
</div>
|
|
</BCol>
|
|
</BRow>
|
|
</BCol>
|
|
<!-- RightSide Desktop -->
|
|
<BCol cols="3" class="d-none d-lg-block">
|
|
<right-side>
|
|
<template #transactions>
|
|
<last-transactions
|
|
:transactions="transactions"
|
|
:transaction-count="transactionCount"
|
|
:transaction-link-count="transactionLinkCount"
|
|
/>
|
|
</template>
|
|
<template #empty />
|
|
<template #community>
|
|
<community-template />
|
|
</template>
|
|
</right-side>
|
|
</BCol>
|
|
</BRow>
|
|
<BRow>
|
|
<!-- footer -->
|
|
<BCol>
|
|
<content-footer v-if="!$route.meta.hideFooter"></content-footer>
|
|
</BCol>
|
|
</BRow>
|
|
<session-logout-timeout @logout="logout"></session-logout-timeout>
|
|
</div>
|
|
</div>
|
|
</template>
|
|
|
|
<script setup>
|
|
import { ref, onMounted } from 'vue'
|
|
import { useStore } from 'vuex'
|
|
import { useRouter } from 'vue-router'
|
|
import { useLazyQuery, useMutation } from '@vue/apollo-composable'
|
|
import { useI18n } from 'vue-i18n'
|
|
import ContentHeader from '@/layouts/templates/ContentHeader'
|
|
import CommunityTemplate from '@/layouts/templates/CommunityTemplate'
|
|
import Breadcrumb from '@/components/Breadcrumb/breadcrumb'
|
|
import RightSide from '@/layouts/templates/RightSide'
|
|
import SkeletonOverview from '@/components/skeleton/Overview'
|
|
import Navbar from '@/components/Menu/Navbar'
|
|
import Sidebar from '@/components/Menu/Sidebar'
|
|
import MobileSidebar from '@/components/MobileSidebar/MobileSidebar'
|
|
import SessionLogoutTimeout from '@/components/SessionLogoutTimeout'
|
|
import ContentFooter from '@/components/ContentFooter'
|
|
import { FadeTransition } from 'vue2-transitions'
|
|
import GddAmount from '@/components/Template/ContentHeader/GddAmount'
|
|
import GdtAmount from '@/components/Template/ContentHeader/GdtAmount'
|
|
import CommunityMember from '@/components/Template/ContentHeader/CommunityMember'
|
|
import NavCommunity from '@/components/Template/ContentHeader/NavCommunity'
|
|
import LastTransactions from '@/components/Template/RightSide/LastTransactions'
|
|
import { transactionsQuery, communityStatistics } from '@/graphql/queries'
|
|
import { logout } from '@/graphql/mutations'
|
|
import CONFIG from '@/config'
|
|
import { useAppToast } from '@/composables/useToast'
|
|
|
|
const store = useStore()
|
|
const router = useRouter()
|
|
const { load: useCommunityStatsQuery } = useLazyQuery(communityStatistics)
|
|
const { load: useTransactionsQuery } = useLazyQuery(transactionsQuery)
|
|
const { mutate: useLogoutMutation } = useMutation(logout)
|
|
const { t } = useI18n()
|
|
const { toastError } = useAppToast()
|
|
|
|
const balance = ref(0)
|
|
const GdtBalance = ref(0)
|
|
const transactions = ref([])
|
|
const transactionCount = ref(0)
|
|
const transactionLinkCount = ref(0)
|
|
const pending = ref(true)
|
|
const visible = ref(false)
|
|
const hamburger = ref(true)
|
|
const darkMode = ref(false)
|
|
const skeleton = ref(true)
|
|
const totalUsers = ref(null)
|
|
|
|
onMounted(() => {
|
|
updateTransactions({ currentPage: 0, pageSize: 10 })
|
|
getCommunityStatistics()
|
|
setTimeout(() => {
|
|
skeleton.value = false
|
|
}, 1500)
|
|
})
|
|
|
|
const logoutUser = async () => {
|
|
try {
|
|
await useLogoutMutation()
|
|
await store.dispatch('logout')
|
|
await router.push('/login')
|
|
} catch {
|
|
await store.dispatch('logout')
|
|
if (router.currentRoute.value.path !== '/login') await router.push('/login')
|
|
}
|
|
}
|
|
|
|
const updateTransactions = async ({ currentPage, pageSize }) => {
|
|
pending.value = true
|
|
try {
|
|
const result = await useTransactionsQuery()
|
|
if (!result) return // TODO this return mitigate an error when this method is called second time but without actual request
|
|
const { transactionList } = result
|
|
GdtBalance.value =
|
|
transactionList.balance.balanceGDT === null ? 0 : Number(transactionList.balance.balanceGDT)
|
|
transactions.value = transactionList.transactions
|
|
balance.value = Number(transactionList.balance.balance)
|
|
transactionCount.value = transactionList.balance.count
|
|
transactionLinkCount.value = transactionList.balance.linkCount
|
|
pending.value = false
|
|
} catch (error) {
|
|
pending.value = true
|
|
transactionCount.value = -1
|
|
toastError(error.message)
|
|
}
|
|
}
|
|
|
|
const getCommunityStatistics = async () => {
|
|
try {
|
|
const result = await useCommunityStatsQuery()
|
|
totalUsers.value = result.communityStatistics.totalUsers
|
|
} catch {
|
|
toastError(t('communityStatistics has no result, use default data'))
|
|
}
|
|
}
|
|
|
|
const admin = () => {
|
|
window.location.assign(CONFIG.ADMIN_AUTH_URL.replace('{token}', store.state.token))
|
|
store.dispatch('logout') // logout without redirect
|
|
}
|
|
|
|
const setVisible = (bool) => {
|
|
visible.value = bool
|
|
}
|
|
</script>
|
|
<style>
|
|
.breadcrumb {
|
|
background-color: transparent;
|
|
}
|
|
|
|
.main-page {
|
|
background-attachment: fixed;
|
|
background-position: center;
|
|
background-repeat: no-repeat;
|
|
background-size: 100% 100%;
|
|
background-image: url('/img/svg/Gradido_Blaetter_Mainpage.svg') !important;
|
|
}
|
|
|
|
.b-right {
|
|
text-align: -webkit-right;
|
|
}
|
|
|
|
.content-gradido {
|
|
display: inline-flex;
|
|
width: 100%;
|
|
height: 91%;
|
|
position: absolute;
|
|
}
|
|
|
|
.navbar-brand-img {
|
|
height: 2rem;
|
|
padding-left: 10px;
|
|
}
|
|
|
|
.bg-lightgrey {
|
|
background-color: #f0f0f0 !important;
|
|
}
|
|
|
|
.bg-blueviolet {
|
|
background-color: blueviolet !important;
|
|
}
|
|
|
|
.width70 {
|
|
width: 70px;
|
|
}
|
|
|
|
.navbar-toggler-icon {
|
|
background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3e%3cpath stroke='rgba(4, 112, 6, 1)' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e");
|
|
}
|
|
|
|
@media screen and (width <= 450px) {
|
|
.breadcrumb {
|
|
padding-top: 60px;
|
|
}
|
|
}
|
|
</style>
|