Merge branch 'master' into refactor-find-contribtiions

This commit is contained in:
Moriz Wahl 2023-03-10 14:42:43 +01:00
commit d4d38e29b6
108 changed files with 995 additions and 823 deletions

View File

@ -281,7 +281,7 @@ jobs:
# LINT BACKEND ########################################################### # LINT BACKEND ###########################################################
########################################################################## ##########################################################################
- name: backend | Lint - name: backend | Lint
run: cd backend && yarn && yarn run lint run: cd database && yarn && cd ../backend && yarn && yarn run lint
############################################################################## ##############################################################################
# JOB: LOCALES BACKEND ####################################################### # JOB: LOCALES BACKEND #######################################################

View File

@ -4,8 +4,28 @@ All notable changes to this project will be documented in this file. Dates are d
Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog).
#### [1.19.1](https://github.com/gradido/gradido/compare/1.19.0...1.19.1)
- fix(frontend): admin question clickable [`#2810`](https://github.com/gradido/gradido/pull/2810)
- refactor(frontend): change b-img to b-icon send [`#2809`](https://github.com/gradido/gradido/pull/2809)
- fix(admin): update openCreation in case of tab open. [`#2806`](https://github.com/gradido/gradido/pull/2806)
- fix(admin): english language for contributions in admin [`#2804`](https://github.com/gradido/gradido/pull/2804)
- refactor(admin): event buttons for myself turned off in open contributions [`#2760`](https://github.com/gradido/gradido/pull/2760)
- fix(admin): contribution page [`#2794`](https://github.com/gradido/gradido/pull/2794)
- fix(frontend): info.svg [`#2798`](https://github.com/gradido/gradido/pull/2798)
- fix(backend): add relation messages to database query [`#2795`](https://github.com/gradido/gradido/pull/2795)
- fix(admin): header and menu [`#2793`](https://github.com/gradido/gradido/pull/2793)
- fix(frontend): send gdd - change first submit button text to 'Check Now' [`#2774`](https://github.com/gradido/gradido/pull/2774)
- refactor(frontend): creations generated by link NL [`#2771`](https://github.com/gradido/gradido/pull/2771)
- refactor(frontend): creations generated by link (FR) + (NL) [`#2770`](https://github.com/gradido/gradido/pull/2770)
- refactor(frontend): update German locales [`#2765`](https://github.com/gradido/gradido/pull/2765)
- refactor(backend): use find contributions helper for list contributions [`#2762`](https://github.com/gradido/gradido/pull/2762)
#### [1.19.0](https://github.com/gradido/gradido/compare/1.18.2...1.19.0) #### [1.19.0](https://github.com/gradido/gradido/compare/1.18.2...1.19.0)
> 7 March 2023
- chore(release): version 1.19.0 [`#2786`](https://github.com/gradido/gradido/pull/2786)
- fix(frontend): change contribution design [`#2731`](https://github.com/gradido/gradido/pull/2731) - fix(frontend): change contribution design [`#2731`](https://github.com/gradido/gradido/pull/2731)
- refactor(frontend): commnity navbar- & unauthenticated b-gradido styles [`#2732`](https://github.com/gradido/gradido/pull/2732) - refactor(frontend): commnity navbar- & unauthenticated b-gradido styles [`#2732`](https://github.com/gradido/gradido/pull/2732)
- fix(database): change downwards migration to delete entries with last_announced_at IS NULL [`#2767`](https://github.com/gradido/gradido/pull/2767) - fix(database): change downwards migration to delete entries with last_announced_at IS NULL [`#2767`](https://github.com/gradido/gradido/pull/2767)

View File

@ -3,7 +3,7 @@
"description": "Administraion Interface for Gradido", "description": "Administraion Interface for Gradido",
"main": "index.js", "main": "index.js",
"author": "Moriz Wahl", "author": "Moriz Wahl",
"version": "1.19.0", "version": "1.19.1",
"license": "Apache-2.0", "license": "Apache-2.0",
"private": false, "private": false,
"scripts": { "scripts": {

View File

@ -10,6 +10,7 @@ describe('ContributionMessagesList', () => {
const propsData = { const propsData = {
contributionId: 42, contributionId: 42,
contributionState: 'PENDING',
} }
const mocks = { const mocks = {

View File

@ -1,18 +1,19 @@
<template> <template>
<div class="contribution-messages-list"> <div class="contribution-messages-list">
<b-container> <b-container>
{{ messages.lenght }}
<div v-for="message in messages" v-bind:key="message.id"> <div v-for="message in messages" v-bind:key="message.id">
<contribution-messages-list-item :message="message" /> <contribution-messages-list-item :message="message" />
</div> </div>
</b-container> </b-container>
<div v-if="contributionState === 'PENDING' || contributionState === 'IN_PROGRESS'">
<contribution-messages-formular <contribution-messages-formular
:contributionId="contributionId" :contributionId="contributionId"
@get-list-contribution-messages="getListContributionMessages" @get-list-contribution-messages="getListContributionMessages"
@update-state="updateState" @update-state="updateState"
/> />
</div> </div>
</div>
</template> </template>
<script> <script>
import ContributionMessagesListItem from './slots/ContributionMessagesListItem' import ContributionMessagesListItem from './slots/ContributionMessagesListItem'
@ -30,6 +31,10 @@ export default {
type: Number, type: Number,
required: true, required: true,
}, },
contributionState: {
type: String,
required: true,
},
}, },
data() { data() {
return { return {

View File

@ -1,8 +1,8 @@
<template> <template>
<div class="component-nabvar"> <div class="component-nabvar">
<b-navbar toggleable="md" type="dark" variant="success" class="p-3"> <b-navbar toggleable="md" type="dark" variant="success">
<b-navbar-brand to="/"> <b-navbar-brand class="mb-2" to="/">
<img src="img/brand/gradido_logo_w.png" class="navbar-brand-img" alt="..." /> <img src="img/brand/gradido_logo_w.png" class="navbar-brand-img pl-2" alt="..." />
</b-navbar-brand> </b-navbar-brand>
<b-navbar-toggle target="nav-collapse"></b-navbar-toggle> <b-navbar-toggle target="nav-collapse"></b-navbar-toggle>
@ -10,7 +10,7 @@
<b-collapse id="nav-collapse" is-nav> <b-collapse id="nav-collapse" is-nav>
<b-navbar-nav> <b-navbar-nav>
<b-nav-item to="/user">{{ $t('navbar.user_search') }}</b-nav-item> <b-nav-item to="/user">{{ $t('navbar.user_search') }}</b-nav-item>
<b-nav-item class="bg-color-creation p-1" to="/creation-confirm"> <b-nav-item class="bg-color-creation" to="/creation-confirm">
{{ $t('creation') }} {{ $t('creation') }}
<b-badge v-show="$store.state.openCreations > 0" variant="danger"> <b-badge v-show="$store.state.openCreations > 0" variant="danger">
{{ $store.state.openCreations }} {{ $store.state.openCreations }}
@ -52,6 +52,5 @@ export default {
<style> <style>
.navbar-brand-img { .navbar-brand-img {
height: 2rem; height: 2rem;
padding-left: 10px;
} }
</style> </style>

View File

@ -13,6 +13,7 @@
<b-icon :icon="getStatusIcon(row.item.state)"></b-icon> <b-icon :icon="getStatusIcon(row.item.state)"></b-icon>
</template> </template>
<template #cell(bookmark)="row"> <template #cell(bookmark)="row">
<div v-if="!myself(row.item)">
<b-button <b-button
variant="danger" variant="danger"
size="md" size="md"
@ -21,9 +22,10 @@
> >
<b-icon icon="trash" variant="light"></b-icon> <b-icon icon="trash" variant="light"></b-icon>
</b-button> </b-button>
</div>
</template> </template>
<template #cell(editCreation)="row"> <template #cell(editCreation)="row">
<div v-if="$store.state.moderator.id !== row.item.userId"> <div v-if="!myself(row.item)">
<b-button <b-button
v-if="row.item.moderator" v-if="row.item.moderator"
variant="info" variant="info"
@ -36,30 +38,26 @@
<b-button v-else @click="rowToggleDetails(row, 0)"> <b-button v-else @click="rowToggleDetails(row, 0)">
<b-icon icon="chat-dots"></b-icon> <b-icon icon="chat-dots"></b-icon>
<b-icon <b-icon
v-if="row.item.state === 'PENDING' && row.item.messageCount > 0" v-if="row.item.state === 'PENDING' && row.item.messagesCount > 0"
icon="exclamation-circle-fill" icon="exclamation-circle-fill"
variant="warning" variant="warning"
></b-icon> ></b-icon>
<b-icon <b-icon
v-if="row.item.state === 'IN_PROGRESS' && row.item.messageCount > 0" v-if="row.item.state === 'IN_PROGRESS' && row.item.messagesCount > 0"
icon="question-diamond" icon="question-diamond"
variant="light" variant="warning"
class="pl-1"
></b-icon> ></b-icon>
</b-button> </b-button>
</div> </div>
</template> </template>
<template #cell(reActive)>
<b-button variant="warning" size="md" class="mr-2">
<b-icon icon="arrow-up" variant="light"></b-icon>
</b-button>
</template>
<template #cell(chatCreation)="row"> <template #cell(chatCreation)="row">
<b-button v-if="row.item.messagesCount > 0" @click="rowToggleDetails(row, 0)"> <b-button v-if="row.item.messagesCount > 0" @click="rowToggleDetails(row, 0)">
<b-icon icon="chat-dots"></b-icon> <b-icon icon="chat-dots"></b-icon>
</b-button> </b-button>
</template> </template>
<template #cell(deny)="row"> <template #cell(deny)="row">
<div v-if="$store.state.moderator.id !== row.item.userId"> <div v-if="!myself(row.item)">
<b-button <b-button
variant="warning" variant="warning"
size="md" size="md"
@ -71,7 +69,7 @@
</div> </div>
</template> </template>
<template #cell(confirm)="row"> <template #cell(confirm)="row">
<div v-if="$store.state.moderator.id !== row.item.userId"> <div v-if="!myself(row.item)">
<b-button <b-button
variant="success" variant="success"
size="md" size="md"
@ -104,6 +102,7 @@
<div v-else> <div v-else>
<contribution-messages-list <contribution-messages-list
:contributionId="row.item.id" :contributionId="row.item.id"
:contributionState="row.item.state"
@update-state="updateState" @update-state="updateState"
@update-user-data="updateUserData" @update-user-data="updateUserData"
/> />
@ -158,13 +157,22 @@ export default {
} }
}, },
methods: { methods: {
myself(item) {
return (
`${item.firstName} ${item.lastName}` ===
`${this.$store.state.moderator.firstName} ${this.$store.state.moderator.lastName}`
)
},
getStatusIcon(status) { getStatusIcon(status) {
return iconMap[status] ? iconMap[status] : 'default-icon' return iconMap[status] ? iconMap[status] : 'default-icon'
}, },
rowClass(item, type) { rowClass(item, type) {
if (!item || type !== 'row') return if (!item || type !== 'row') return
if (item.state === 'CONFIRMED') return 'table-success' if (item.state === 'CONFIRMED') return 'table-success'
if (item.state === 'DENIED') return 'table-info' if (item.state === 'DENIED') return 'table-warning'
if (item.state === 'DELETED') return 'table-danger'
if (item.state === 'IN_PROGRESS') return 'table-primary'
if (item.state === 'PENDING') return 'table-primary'
}, },
updateCreationData(data) { updateCreationData(data) {
const row = data.row const row = data.row

View File

@ -1,7 +1,7 @@
import gql from 'graphql-tag' import gql from 'graphql-tag'
export const adminCreateContributionMessage = gql` export const adminCreateContributionMessage = gql`
mutation ($contributionId: Float!, $message: String!) { mutation ($contributionId: Int!, $message: String!) {
adminCreateContributionMessage(contributionId: $contributionId, message: $message) { adminCreateContributionMessage(contributionId: $contributionId, message: $message) {
id id
message message

View File

@ -1,7 +1,7 @@
import gql from 'graphql-tag' import gql from 'graphql-tag'
export const listContributionMessages = gql` export const listContributionMessages = gql`
query ($contributionId: Float!, $pageSize: Int = 25, $currentPage: Int = 1, $order: Order = ASC) { query ($contributionId: Int!, $pageSize: Int = 25, $currentPage: Int = 1, $order: Order = ASC) {
listContributionMessages( listContributionMessages(
contributionId: $contributionId contributionId: $contributionId
pageSize: $pageSize pageSize: $pageSize

View File

@ -63,7 +63,6 @@
"deleted_user": "Alle gelöschten Nutzer", "deleted_user": "Alle gelöschten Nutzer",
"delete_user": "Nutzer löschen", "delete_user": "Nutzer löschen",
"deny": "Ablehnen", "deny": "Ablehnen",
"edit": "Bearbeiten",
"enabled": "aktiviert", "enabled": "aktiviert",
"error": "Fehler", "error": "Fehler",
"expired": "abgelaufen", "expired": "abgelaufen",
@ -101,7 +100,6 @@
"message": { "message": {
"request": "Die Anfrage wurde gesendet." "request": "Die Anfrage wurde gesendet."
}, },
"mod": "Mod",
"moderator": "Moderator", "moderator": "Moderator",
"name": "Name", "name": "Name",
"navbar": { "navbar": {

View File

@ -34,12 +34,12 @@
"all": "All", "all": "All",
"confirms": "Confirmed", "confirms": "Confirmed",
"deleted": "Deleted", "deleted": "Deleted",
"denied": "Denied", "denied": "Rejected",
"open": "Open" "open": "Open"
}, },
"created": "Confirmed", "created": "Created for",
"createdAt": "Created", "createdAt": "Created at",
"creation": "Creation", "creation": "Amount",
"creationList": "Creation list", "creationList": "Creation list",
"creation_form": { "creation_form": {
"creation_for": "Active Basic Income for", "creation_for": "Active Basic Income for",
@ -53,7 +53,7 @@
"toasted": "Open creation ({value} GDD) for {email} has been saved and is ready for confirmation.", "toasted": "Open creation ({value} GDD) for {email} has been saved and is ready for confirmation.",
"toasted_created": "Creation has been successfully saved", "toasted_created": "Creation has been successfully saved",
"toasted_delete": "Open creation has been deleted", "toasted_delete": "Open creation has been deleted",
"toasted_denied": "Open creation has been denied", "toasted_denied": "Open creation has been rejected",
"toasted_update": "Open creation {value} GDD) for {email} has been changed and is ready for confirmation.", "toasted_update": "Open creation {value} GDD) for {email} has been changed and is ready for confirmation.",
"update_creation": "Creation update" "update_creation": "Creation update"
}, },
@ -63,7 +63,6 @@
"deleted_user": "All deleted user", "deleted_user": "All deleted user",
"delete_user": "Delete user", "delete_user": "Delete user",
"deny": "Reject", "deny": "Reject",
"edit": "Edit",
"enabled": "enabled", "enabled": "enabled",
"error": "Error", "error": "Error",
"expired": "expired", "expired": "expired",
@ -87,7 +86,7 @@
"transactionlist": { "transactionlist": {
"confirmed": "When was it confirmed by a moderator / admin.", "confirmed": "When was it confirmed by a moderator / admin.",
"periods": "For what period was it submitted by the member.", "periods": "For what period was it submitted by the member.",
"state": "[PENDING = submitted, DELETED = deleted, IN_PROGRESS = in dialogue with moderator, DENIED = denied, CONFIRMED = confirmed]", "state": "[PENDING = submitted, DELETED = deleted, IN_PROGRESS = in dialogue with moderator, DENIED = rejected, CONFIRMED = confirmed]",
"submitted": "When was it submitted by the member" "submitted": "When was it submitted by the member"
} }
}, },
@ -101,7 +100,6 @@
"message": { "message": {
"request": "Request has been sent." "request": "Request has been sent."
}, },
"mod": "Mod",
"moderator": "Moderator", "moderator": "Moderator",
"name": "Name", "name": "Name",
"navbar": { "navbar": {

View File

@ -5,25 +5,37 @@
<b-tabs v-model="tabIndex" content-class="mt-3" fill> <b-tabs v-model="tabIndex" content-class="mt-3" fill>
<b-tab active :title-link-attributes="{ 'data-test': 'open' }"> <b-tab active :title-link-attributes="{ 'data-test': 'open' }">
<template #title> <template #title>
<b-icon icon="bell-fill" variant="primary"></b-icon>
{{ $t('contributions.open') }} {{ $t('contributions.open') }}
<b-badge v-if="$store.state.openCreations > 0" variant="danger"> <b-badge v-if="$store.state.openCreations > 0" variant="danger">
{{ $store.state.openCreations }} {{ $store.state.openCreations }}
</b-badge> </b-badge>
</template> </template>
</b-tab> </b-tab>
<b-tab <b-tab :title-link-attributes="{ 'data-test': 'confirmed' }">
:title="$t('contributions.confirms')" <template #title>
:title-link-attributes="{ 'data-test': 'confirmed' }" <b-icon icon="check" variant="success"></b-icon>
/> {{ $t('contributions.confirms') }}
<b-tab </template>
:title="$t('contributions.denied')" </b-tab>
:title-link-attributes="{ 'data-test': 'denied' }" <b-tab :title-link-attributes="{ 'data-test': 'denied' }">
/> <template #title>
<b-tab <b-icon icon="x-circle" variant="warning"></b-icon>
:title="$t('contributions.deleted')" {{ $t('contributions.denied') }}
:title-link-attributes="{ 'data-test': 'deleted' }" </template>
/> </b-tab>
<b-tab :title="$t('contributions.all')" :title-link-attributes="{ 'data-test': 'all' }" /> <b-tab :title-link-attributes="{ 'data-test': 'deleted' }">
<template #title>
<b-icon icon="trash" variant="danger"></b-icon>
{{ $t('contributions.deleted') }}
</template>
</b-tab>
<b-tab :title-link-attributes="{ 'data-test': 'all' }">
<template #title>
<b-icon icon="list"></b-icon>
{{ $t('contributions.all') }}
</template>
</b-tab>
</b-tabs> </b-tabs>
</div> </div>
<open-creations-table <open-creations-table
@ -71,22 +83,22 @@
</div> </div>
</template> </template>
<script> <script>
import Overlay from '../components/Overlay' import Overlay from '../components/Overlay'
import OpenCreationsTable from '../components/Tables/OpenCreationsTable' import OpenCreationsTable from '../components/Tables/OpenCreationsTable'
import { adminListContributions } from '../graphql/adminListContributions' import { adminListContributions } from '../graphql/adminListContributions'
import { adminDeleteContribution } from '../graphql/adminDeleteContribution' import { adminDeleteContribution } from '../graphql/adminDeleteContribution'
import { confirmContribution } from '../graphql/confirmContribution' import { confirmContribution } from '../graphql/confirmContribution'
import { denyContribution } from '../graphql/denyContribution' import { denyContribution } from '../graphql/denyContribution'
const FILTER_TAB_MAP = [ const FILTER_TAB_MAP = [
['IN_PROGRESS', 'PENDING'], ['IN_PROGRESS', 'PENDING'],
['CONFIRMED'], ['CONFIRMED'],
['DENIED'], ['DENIED'],
['DELETED'], ['DELETED'],
['IN_PROGRESS', 'PENDING', 'CONFIRMED', 'DENIED', 'DELETED'], ['IN_PROGRESS', 'PENDING', 'CONFIRMED', 'DENIED', 'DELETED'],
] ]
export default { export default {
name: 'CreationConfirm', name: 'CreationConfirm',
components: { components: {
OpenCreationsTable, OpenCreationsTable,
@ -172,6 +184,9 @@ export default {
this.items.find((obj) => obj.id === id).messagesCount++ this.items.find((obj) => obj.id === id).messagesCount++
this.items.find((obj) => obj.id === id).state = 'IN_PROGRESS' this.items.find((obj) => obj.id === id).state = 'IN_PROGRESS'
}, },
formatDateOrDash(value) {
return value ? this.$d(new Date(value), 'short') : '—'
},
}, },
computed: { computed: {
fields() { fields() {
@ -180,7 +195,6 @@ export default {
// open contributions // open contributions
{ key: 'bookmark', label: this.$t('delete') }, { key: 'bookmark', label: this.$t('delete') },
{ key: 'deny', label: this.$t('deny') }, { key: 'deny', label: this.$t('deny') },
{ key: 'email', label: this.$t('e_mail') },
{ key: 'firstName', label: this.$t('firstname') }, { key: 'firstName', label: this.$t('firstname') },
{ key: 'lastName', label: this.$t('lastname') }, { key: 'lastName', label: this.$t('lastname') },
{ {
@ -195,11 +209,11 @@ export default {
key: 'contributionDate', key: 'contributionDate',
label: this.$t('created'), label: this.$t('created'),
formatter: (value) => { formatter: (value) => {
return this.$d(new Date(value), 'short') return this.formatDateOrDash(value)
}, },
}, },
{ key: 'moderator', label: this.$t('moderator') }, { key: 'moderator', label: this.$t('moderator') },
{ key: 'editCreation', label: this.$t('edit') }, { key: 'editCreation', label: this.$t('chat') },
{ key: 'confirm', label: this.$t('save') }, { key: 'confirm', label: this.$t('save') },
], ],
[ [
@ -218,28 +232,28 @@ export default {
key: 'contributionDate', key: 'contributionDate',
label: this.$t('created'), label: this.$t('created'),
formatter: (value) => { formatter: (value) => {
return this.$d(new Date(value), 'short') return this.formatDateOrDash(value)
}, },
}, },
{ {
key: 'createdAt', key: 'createdAt',
label: this.$t('createdAt'), label: this.$t('createdAt'),
formatter: (value) => { formatter: (value) => {
return this.$d(new Date(value), 'short') return this.formatDateOrDash(value)
}, },
}, },
{ {
key: 'confirmedAt', key: 'confirmedAt',
label: this.$t('contributions.confirms'), label: this.$t('contributions.confirms'),
formatter: (value) => { formatter: (value) => {
return this.$d(new Date(value), 'short') return this.formatDateOrDash(value)
}, },
}, },
{ key: 'confirmedBy', label: this.$t('moderator') },
{ key: 'chatCreation', label: this.$t('chat') }, { key: 'chatCreation', label: this.$t('chat') },
], ],
[ [
// denied contributions // denied contributions
{ key: 'reActive', label: 'reActive' },
{ key: 'firstName', label: this.$t('firstname') }, { key: 'firstName', label: this.$t('firstname') },
{ key: 'lastName', label: this.$t('lastname') }, { key: 'lastName', label: this.$t('lastname') },
{ {
@ -254,29 +268,28 @@ export default {
key: 'contributionDate', key: 'contributionDate',
label: this.$t('created'), label: this.$t('created'),
formatter: (value) => { formatter: (value) => {
return this.$d(new Date(value), 'short') return this.formatDateOrDash(value)
}, },
}, },
{ {
key: 'createdAt', key: 'createdAt',
label: this.$t('createdAt'), label: this.$t('createdAt'),
formatter: (value) => { formatter: (value) => {
return this.$d(new Date(value), 'short') return this.formatDateOrDash(value)
}, },
}, },
{ {
key: 'deniedAt', key: 'deniedAt',
label: this.$t('contributions.denied'), label: this.$t('contributions.denied'),
formatter: (value) => { formatter: (value) => {
return this.$d(new Date(value), 'short') return this.formatDateOrDash(value)
}, },
}, },
{ key: 'deniedBy', label: this.$t('mod') }, { key: 'deniedBy', label: this.$t('moderator') },
{ key: 'chatCreation', label: this.$t('chat') }, { key: 'chatCreation', label: this.$t('chat') },
], ],
[ [
// deleted contributions // deleted contributions
{ key: 'reActive', label: 'reActive' },
{ key: 'firstName', label: this.$t('firstname') }, { key: 'firstName', label: this.$t('firstname') },
{ key: 'lastName', label: this.$t('lastname') }, { key: 'lastName', label: this.$t('lastname') },
{ {
@ -291,29 +304,29 @@ export default {
key: 'contributionDate', key: 'contributionDate',
label: this.$t('created'), label: this.$t('created'),
formatter: (value) => { formatter: (value) => {
return this.$d(new Date(value), 'short') return this.formatDateOrDash(value)
}, },
}, },
{ {
key: 'createdAt', key: 'createdAt',
label: this.$t('createdAt'), label: this.$t('createdAt'),
formatter: (value) => { formatter: (value) => {
return this.$d(new Date(value), 'short') return this.formatDateOrDash(value)
}, },
}, },
{ {
key: 'deletedAt', key: 'deletedAt',
label: this.$t('contributions.deleted'), label: this.$t('contributions.deleted'),
formatter: (value) => { formatter: (value) => {
return this.$d(new Date(value), 'short') return this.formatDateOrDash(value)
}, },
}, },
{ key: 'deletedBy', label: this.$t('mod') }, { key: 'deletedBy', label: this.$t('moderator') },
{ key: 'chatCreation', label: this.$t('chat') }, { key: 'chatCreation', label: this.$t('chat') },
], ],
[ [
// all contributions // all contributions
{ key: 'state', label: 'state' }, { key: 'state', label: this.$t('status') },
{ key: 'firstName', label: this.$t('firstname') }, { key: 'firstName', label: this.$t('firstname') },
{ key: 'lastName', label: this.$t('lastname') }, { key: 'lastName', label: this.$t('lastname') },
{ {
@ -328,24 +341,24 @@ export default {
key: 'contributionDate', key: 'contributionDate',
label: this.$t('created'), label: this.$t('created'),
formatter: (value) => { formatter: (value) => {
return this.$d(new Date(value), 'short') return this.formatDateOrDash(value)
}, },
}, },
{ {
key: 'createdAt', key: 'createdAt',
label: this.$t('createdAt'), label: this.$t('createdAt'),
formatter: (value) => { formatter: (value) => {
return this.$d(new Date(value), 'short') return this.formatDateOrDash(value)
}, },
}, },
{ {
key: 'confirmedAt', key: 'confirmedAt',
label: this.$t('contributions.confirms'), label: this.$t('contributions.confirms'),
formatter: (value) => { formatter: (value) => {
return this.$d(new Date(value), 'short') return this.formatDateOrDash(value)
}, },
}, },
{ key: 'confirmedBy', label: this.$t('mod') }, { key: 'confirmedBy', label: this.$t('moderator') },
{ key: 'chatCreation', label: this.$t('chat') }, { key: 'chatCreation', label: this.$t('chat') },
], ],
][this.tabIndex] ][this.tabIndex]
@ -397,13 +410,16 @@ export default {
update({ adminListContributions }) { update({ adminListContributions }) {
this.rows = adminListContributions.contributionCount this.rows = adminListContributions.contributionCount
this.items = adminListContributions.contributionList this.items = adminListContributions.contributionList
if (this.statusFilter === FILTER_TAB_MAP[0]) {
this.$store.commit('setOpenCreations', adminListAllContributions.contributionCount)
}
}, },
error({ message }) { error({ message }) {
this.toastError(message) this.toastError(message)
}, },
}, },
}, },
} }
</script> </script>
<style> <style>
#overlay { #overlay {

View File

@ -2,16 +2,10 @@ module.exports = {
root: true, root: true,
env: { env: {
node: true, node: true,
// jest: true,
}, },
parser: '@typescript-eslint/parser', parser: '@typescript-eslint/parser',
plugins: ['prettier', '@typescript-eslint' /*, 'jest' */], plugins: ['prettier', '@typescript-eslint', 'type-graphql'],
extends: [ extends: ['standard', 'eslint:recommended', 'plugin:prettier/recommended'],
'standard',
'eslint:recommended',
'plugin:prettier/recommended',
'plugin:@typescript-eslint/recommended',
],
// add your custom rules here // add your custom rules here
rules: { rules: {
'no-console': ['error'], 'no-console': ['error'],
@ -23,4 +17,28 @@ module.exports = {
}, },
], ],
}, },
overrides: [
// only for ts files
{
files: ['*.ts'],
extends: [
'plugin:@typescript-eslint/recommended',
'plugin:@typescript-eslint/recommended-requiring-type-checking',
'plugin:type-graphql/recommended',
],
rules: {
// allow explicitly defined dangling promises
'@typescript-eslint/no-floating-promises': ['error', { ignoreVoid: true }],
'no-void': ['error', { allowAsStatement: true }],
// ignore prefer-regexp-exec rule to allow string.match(regex)
'@typescript-eslint/prefer-regexp-exec': 'off',
},
parserOptions: {
tsconfigRootDir: __dirname,
project: ['./tsconfig.json'],
// this is to properly reference the referenced project database without requirement of compiling it
EXPERIMENTAL_useSourceOfProjectReferenceRedirect: true,
},
},
],
} }

View File

@ -1,6 +1,6 @@
{ {
"name": "gradido-backend", "name": "gradido-backend",
"version": "1.19.0", "version": "1.19.1",
"description": "Gradido unified backend providing an API-Service for Gradido Transactions", "description": "Gradido unified backend providing an API-Service for Gradido Transactions",
"main": "src/index.ts", "main": "src/index.ts",
"repository": "https://github.com/gradido/gradido/backend", "repository": "https://github.com/gradido/gradido/backend",
@ -65,6 +65,7 @@
"eslint-plugin-node": "^11.1.0", "eslint-plugin-node": "^11.1.0",
"eslint-plugin-prettier": "^3.4.0", "eslint-plugin-prettier": "^3.4.0",
"eslint-plugin-promise": "^5.1.0", "eslint-plugin-promise": "^5.1.0",
"eslint-plugin-type-graphql": "^1.0.0",
"faker": "^5.5.3", "faker": "^5.5.3",
"jest": "^27.2.4", "jest": "^27.2.4",
"nodemon": "^2.0.7", "nodemon": "^2.0.7",

View File

@ -1,16 +1,19 @@
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
import axios from 'axios' import axios from 'axios'
import { backendLogger as logger } from '@/server/logger' import { backendLogger as logger } from '@/server/logger'
import LogError from '@/server/LogError'
// eslint-disable-next-line @typescript-eslint/no-explicit-any // eslint-disable-next-line @typescript-eslint/no-explicit-any
export const apiPost = async (url: string, payload: unknown): Promise<any> => { export const apiPost = async (url: string, payload: unknown): Promise<any> => {
logger.trace('POST: url=' + url + ' payload=' + payload) logger.trace('POST', url, payload)
return axios return axios
.post(url, payload) .post(url, payload)
.then((result) => { .then((result) => {
logger.trace('POST-Response: result=' + result) logger.trace('POST-Response', result)
if (result.status !== 200) { if (result.status !== 200) {
throw new Error('HTTP Status Error ' + result.status) throw new LogError('HTTP Status Error', result.status)
} }
if (result.data.state !== 'success') { if (result.data.state !== 'success') {
throw new Error(result.data.msg) throw new Error(result.data.msg)
@ -28,9 +31,9 @@ export const apiGet = async (url: string): Promise<any> => {
return axios return axios
.get(url) .get(url)
.then((result) => { .then((result) => {
logger.trace('GET-Response: result=' + result) logger.trace('GET-Response', result)
if (result.status !== 200) { if (result.status !== 200) {
throw new Error('HTTP Status Error ' + result.status) throw new LogError('HTTP Status Error', result.status)
} }
if (!['success', 'warning'].includes(result.data.state)) { if (!['success', 'warning'].includes(result.data.state)) {
throw new Error(result.data.msg) throw new Error(result.data.msg)

View File

@ -1,3 +1,5 @@
/* eslint-disable @typescript-eslint/no-unsafe-return */
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
/* eslint-disable @typescript-eslint/no-explicit-any */ /* eslint-disable @typescript-eslint/no-explicit-any */
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ /* eslint-disable @typescript-eslint/explicit-module-boundary-types */
import { KlicktippConnector } from './klicktippConnector' import { KlicktippConnector } from './klicktippConnector'

View File

@ -1,3 +1,7 @@
/* eslint-disable @typescript-eslint/no-unsafe-return */
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
/* eslint-disable @typescript-eslint/restrict-template-expressions */
/* eslint-disable @typescript-eslint/no-explicit-any */ /* eslint-disable @typescript-eslint/no-explicit-any */
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ /* eslint-disable @typescript-eslint/explicit-module-boundary-types */
import axios, { AxiosRequestConfig, Method } from 'axios' import axios, { AxiosRequestConfig, Method } from 'axios'

View File

@ -1,3 +1,5 @@
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
/* eslint-disable @typescript-eslint/unbound-method */
import { createTransport } from 'nodemailer' import { createTransport } from 'nodemailer'
import { logger, i18n } from '@test/testSetup' import { logger, i18n } from '@test/testSetup'
import CONFIG from '@/config' import CONFIG from '@/config'

View File

@ -1,3 +1,4 @@
/* eslint-disable @typescript-eslint/restrict-template-expressions */
import CONFIG from '@/config' import CONFIG from '@/config'
import { backendLogger as logger } from '@/server/logger' import { backendLogger as logger } from '@/server/logger'
import path from 'path' import path from 'path'

View File

@ -1,5 +1,8 @@
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
/* eslint-disable @typescript-eslint/no-explicit-any */ /* eslint-disable @typescript-eslint/no-explicit-any */
/* eslint-disable @typescript-eslint/no-unsafe-return */
/* eslint-disable @typescript-eslint/no-unsafe-call */
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
import Decimal from 'decimal.js-light' import Decimal from 'decimal.js-light'
import { testEnvironment } from '@test/helpers' import { testEnvironment } from '@test/helpers'
import { logger, i18n as localization } from '@test/testSetup' import { logger, i18n as localization } from '@test/testSetup'

View File

@ -1,3 +1,6 @@
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
/* eslint-disable @typescript-eslint/no-unsafe-return */
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
import { gql } from 'graphql-request' import { gql } from 'graphql-request'
import { backendLogger as logger } from '@/server/logger' import { backendLogger as logger } from '@/server/logger'
import { Community as DbCommunity } from '@entity/Community' import { Community as DbCommunity } from '@entity/Community'

View File

@ -1,3 +1,6 @@
/* eslint-disable @typescript-eslint/no-unsafe-return */
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
import { gql } from 'graphql-request' import { gql } from 'graphql-request'
import { backendLogger as logger } from '@/server/logger' import { backendLogger as logger } from '@/server/logger'
import { Community as DbCommunity } from '@entity/Community' import { Community as DbCommunity } from '@entity/Community'

View File

@ -1,3 +1,7 @@
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
/* eslint-disable @typescript-eslint/unbound-method */
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
/* eslint-disable @typescript-eslint/no-unsafe-call */
/* eslint-disable @typescript-eslint/no-explicit-any */ /* eslint-disable @typescript-eslint/no-explicit-any */
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ /* eslint-disable @typescript-eslint/explicit-module-boundary-types */
@ -150,7 +154,8 @@ describe('validate Communities', () => {
}) })
it('logs unsupported api for community with api 2_0 ', () => { it('logs unsupported api for community with api 2_0 ', () => {
expect(logger.warn).toBeCalledWith( expect(logger.warn).toBeCalledWith(
`Federation: dbCom: ${dbCom.id} with unsupported apiVersion=2_0; supported versions=1_0,1_1`, `Federation: dbCom: ${dbCom.id} with unsupported apiVersion=2_0; supported versions`,
['1_0', '1_1'],
) )
}) })
}) })

View File

@ -8,14 +8,14 @@ import { backendLogger as logger } from '@/server/logger'
import { ApiVersionType } from './enum/apiVersionType' import { ApiVersionType } from './enum/apiVersionType'
import LogError from '@/server/LogError' import LogError from '@/server/LogError'
export async function startValidateCommunities(timerInterval: number): Promise<void> { export function startValidateCommunities(timerInterval: number): void {
logger.info( logger.info(
`Federation: startValidateCommunities loop with an interval of ${timerInterval} ms...`, `Federation: startValidateCommunities loop with an interval of ${timerInterval} ms...`,
) )
// TODO: replace the timer-loop by an event-based communication to verify announced foreign communities // TODO: replace the timer-loop by an event-based communication to verify announced foreign communities
// better to use setTimeout twice than setInterval once -> see https://javascript.info/settimeout-setinterval // better to use setTimeout twice than setInterval once -> see https://javascript.info/settimeout-setinterval
setTimeout(function run() { setTimeout(function run() {
validateCommunities() void validateCommunities()
setTimeout(run, timerInterval) setTimeout(run, timerInterval)
}, timerInterval) }, timerInterval)
} }
@ -27,8 +27,8 @@ export async function validateCommunities(): Promise<void> {
.getMany() .getMany()
logger.debug(`Federation: found ${dbCommunities.length} dbCommunities`) logger.debug(`Federation: found ${dbCommunities.length} dbCommunities`)
dbCommunities.forEach(async function (dbCom) { for (const dbCom of dbCommunities) {
logger.debug(`Federation: dbCom: ${JSON.stringify(dbCom)}`) logger.debug('Federation: dbCom', dbCom)
const apiValueStrings: string[] = Object.values(ApiVersionType) const apiValueStrings: string[] = Object.values(ApiVersionType)
logger.debug(`suppported ApiVersions=`, apiValueStrings) logger.debug(`suppported ApiVersions=`, apiValueStrings)
if (apiValueStrings.includes(dbCom.apiVersion)) { if (apiValueStrings.includes(dbCom.apiVersion)) {
@ -38,11 +38,13 @@ export async function validateCommunities(): Promise<void> {
try { try {
const pubKey = await invokeVersionedRequestGetPublicKey(dbCom) const pubKey = await invokeVersionedRequestGetPublicKey(dbCom)
logger.info( logger.info(
`Federation: received publicKey=${pubKey} from endpoint=${dbCom.endPoint}/${dbCom.apiVersion}`, 'Federation: received publicKey from endpoint',
pubKey,
`${dbCom.endPoint}/${dbCom.apiVersion}`,
) )
if (pubKey && pubKey === dbCom.publicKey.toString('hex')) { if (pubKey && pubKey === dbCom.publicKey.toString('hex')) {
logger.info(`Federation: matching publicKey: ${pubKey}`) logger.info(`Federation: matching publicKey: ${pubKey}`)
DbCommunity.update({ id: dbCom.id }, { verifiedAt: new Date() }) await DbCommunity.update({ id: dbCom.id }, { verifiedAt: new Date() })
logger.debug(`Federation: updated dbCom: ${JSON.stringify(dbCom)}`) logger.debug(`Federation: updated dbCom: ${JSON.stringify(dbCom)}`)
} }
/* /*
@ -58,10 +60,11 @@ export async function validateCommunities(): Promise<void> {
} }
} else { } else {
logger.warn( logger.warn(
`Federation: dbCom: ${dbCom.id} with unsupported apiVersion=${dbCom.apiVersion}; supported versions=${apiValueStrings}`, `Federation: dbCom: ${dbCom.id} with unsupported apiVersion=${dbCom.apiVersion}; supported versions`,
apiValueStrings,
) )
} }
}) }
} }
function isLogError(err: unknown) { function isLogError(err: unknown) {

View File

@ -22,7 +22,7 @@ export default class ContributionLinkArgs {
validTo?: string | null validTo?: string | null
@Field(() => Decimal, { nullable: true }) @Field(() => Decimal, { nullable: true })
maxAmountPerMonth: Decimal | null maxAmountPerMonth?: Decimal | null
@Field(() => Int) @Field(() => Int)
maxPerCycle: number maxPerCycle: number

View File

@ -1,9 +1,9 @@
import { ArgsType, Field, InputType } from 'type-graphql' import { ArgsType, Field, Int, InputType } from 'type-graphql'
@InputType() @InputType()
@ArgsType() @ArgsType()
export default class ContributionMessageArgs { export default class ContributionMessageArgs {
@Field(() => Number) @Field(() => Int)
contributionId: number contributionId: number
@Field(() => String) @Field(() => String)

View File

@ -11,11 +11,11 @@ export default class CreateUserArgs {
@Field(() => String) @Field(() => String)
lastName: string lastName: string
@Field(() => String) @Field(() => String, { nullable: true })
language?: string // Will default to DEFAULT_LANGUAGE language?: string | null
@Field(() => Int, { nullable: true }) @Field(() => Int, { nullable: true })
publisherId: number publisherId?: number | null
@Field(() => String, { nullable: true }) @Field(() => String, { nullable: true })
redeemCode?: string | null redeemCode?: string | null

View File

@ -1,3 +1,4 @@
/* eslint-disable type-graphql/invalid-nullable-input-type */
import { ArgsType, Field, Int } from 'type-graphql' import { ArgsType, Field, Int } from 'type-graphql'
import { Order } from '@enum/Order' import { Order } from '@enum/Order'

View File

@ -7,11 +7,14 @@ export default class SearchUsersArgs {
searchText: string searchText: string
@Field(() => Int, { nullable: true }) @Field(() => Int, { nullable: true })
// eslint-disable-next-line type-graphql/invalid-nullable-input-type
currentPage?: number currentPage?: number
@Field(() => Int, { nullable: true }) @Field(() => Int, { nullable: true })
// eslint-disable-next-line type-graphql/invalid-nullable-input-type
pageSize?: number pageSize?: number
// eslint-disable-next-line type-graphql/wrong-decorator-signature
@Field(() => SearchUsersFilters, { nullable: true, defaultValue: null }) @Field(() => SearchUsersFilters, { nullable: true, defaultValue: null })
filters: SearchUsersFilters filters?: SearchUsersFilters | null
} }

View File

@ -3,8 +3,8 @@ import { Field, InputType } from 'type-graphql'
@InputType() @InputType()
export default class SearchUsersFilters { export default class SearchUsersFilters {
@Field(() => Boolean, { nullable: true, defaultValue: null }) @Field(() => Boolean, { nullable: true, defaultValue: null })
byActivated: boolean byActivated?: boolean | null
@Field(() => Boolean, { nullable: true, defaultValue: null }) @Field(() => Boolean, { nullable: true, defaultValue: null })
byDeleted: boolean byDeleted?: boolean | null
} }

View File

@ -1,13 +1,14 @@
/* eslint-disable type-graphql/invalid-nullable-input-type */
import { Field, InputType } from 'type-graphql' import { Field, InputType } from 'type-graphql'
@InputType() @InputType()
export default class TransactionLinkFilters { export default class TransactionLinkFilters {
@Field(() => Boolean, { nullable: true }) @Field(() => Boolean, { nullable: true })
withDeleted: boolean withDeleted?: boolean
@Field(() => Boolean, { nullable: true }) @Field(() => Boolean, { nullable: true })
withExpired: boolean withExpired?: boolean
@Field(() => Boolean, { nullable: true }) @Field(() => Boolean, { nullable: true })
withRedeemed: boolean withRedeemed?: boolean
} }

View File

@ -9,5 +9,5 @@ export default class UnsecureLoginArgs {
password: string password: string
@Field(() => Int, { nullable: true }) @Field(() => Int, { nullable: true })
publisherId: number publisherId?: number | null
} }

View File

@ -1,4 +1,4 @@
import { ArgsType, Field } from 'type-graphql' import { ArgsType, Field, Int } from 'type-graphql'
@ArgsType() @ArgsType()
export default class UpdateUserInfosArgs { export default class UpdateUserInfosArgs {
@ -11,8 +11,8 @@ export default class UpdateUserInfosArgs {
@Field({ nullable: true }) @Field({ nullable: true })
language?: string language?: string
@Field({ nullable: true }) @Field(() => Int, { nullable: true })
publisherId?: number publisherId?: number | null
@Field({ nullable: true }) @Field({ nullable: true })
password?: string password?: string

View File

@ -1,3 +1,5 @@
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
/* eslint-disable @typescript-eslint/no-unsafe-call */
/* eslint-disable @typescript-eslint/no-explicit-any */ /* eslint-disable @typescript-eslint/no-explicit-any */
import { AuthChecker } from 'type-graphql' import { AuthChecker } from 'type-graphql'

View File

@ -1,4 +1,4 @@
import { ObjectType, Field } from 'type-graphql' import { ObjectType, Field, Int, Float } from 'type-graphql'
import Decimal from 'decimal.js-light' import Decimal from 'decimal.js-light'
@ObjectType() @ObjectType()
@ -19,14 +19,14 @@ export class Balance {
@Field(() => Decimal) @Field(() => Decimal)
balance: Decimal balance: Decimal
@Field(() => Number, { nullable: true }) @Field(() => Float, { nullable: true })
balanceGDT: number | null balanceGDT: number | null
// the count of all transactions // the count of all transactions
@Field(() => Number) @Field(() => Int)
count: number count: number
// the count of transaction links // the count of transaction links
@Field(() => Number) @Field(() => Int)
linkCount: number linkCount: number
} }

View File

@ -1,6 +1,8 @@
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
/* eslint-disable @typescript-eslint/no-explicit-any */ /* eslint-disable @typescript-eslint/no-explicit-any */
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ /* eslint-disable @typescript-eslint/explicit-module-boundary-types */
import { ObjectType, Field } from 'type-graphql' import { ObjectType, Field, Int } from 'type-graphql'
@ObjectType() @ObjectType()
export class Community { export class Community {
@ -14,7 +16,7 @@ export class Community {
} }
} }
@Field(() => Number) @Field(() => Int)
id: number id: number
@Field(() => String) @Field(() => String)

View File

@ -1,9 +1,9 @@
import { ObjectType, Field } from 'type-graphql' import { ObjectType, Field, Int } from 'type-graphql'
import Decimal from 'decimal.js-light' import Decimal from 'decimal.js-light'
@ObjectType() @ObjectType()
export class DynamicStatisticsFields { export class DynamicStatisticsFields {
@Field(() => Number) @Field(() => Int)
activeUsers: number activeUsers: number
@Field(() => Decimal) @Field(() => Decimal)
@ -15,13 +15,13 @@ export class DynamicStatisticsFields {
@ObjectType() @ObjectType()
export class CommunityStatistics { export class CommunityStatistics {
@Field(() => Number) @Field(() => Int)
allUsers: number allUsers: number
@Field(() => Number) @Field(() => Int)
totalUsers: number totalUsers: number
@Field(() => Number) @Field(() => Int)
deletedUsers: number deletedUsers: number
@Field(() => Decimal) @Field(() => Decimal)

View File

@ -23,7 +23,7 @@ export class Contribution {
this.deletedBy = contribution.deletedBy this.deletedBy = contribution.deletedBy
} }
@Field(() => Number) @Field(() => Int)
id: number id: number
@Field(() => String, { nullable: true }) @Field(() => String, { nullable: true })
@ -44,25 +44,25 @@ export class Contribution {
@Field(() => Date, { nullable: true }) @Field(() => Date, { nullable: true })
confirmedAt: Date | null confirmedAt: Date | null
@Field(() => Number, { nullable: true }) @Field(() => Int, { nullable: true })
confirmedBy: number | null confirmedBy: number | null
@Field(() => Date, { nullable: true }) @Field(() => Date, { nullable: true })
deniedAt: Date | null deniedAt: Date | null
@Field(() => Number, { nullable: true }) @Field(() => Int, { nullable: true })
deniedBy: number | null deniedBy: number | null
@Field(() => Date, { nullable: true }) @Field(() => Date, { nullable: true })
deletedAt: Date | null deletedAt: Date | null
@Field(() => Number, { nullable: true }) @Field(() => Int, { nullable: true })
deletedBy: number | null deletedBy: number | null
@Field(() => Date) @Field(() => Date)
contributionDate: Date contributionDate: Date
@Field(() => Number) @Field(() => Int)
messagesCount: number messagesCount: number
@Field(() => String) @Field(() => String)

View File

@ -21,7 +21,7 @@ export class ContributionLink {
this.link = CONFIG.COMMUNITY_REDEEM_CONTRIBUTION_URL.replace(/{code}/g, this.code) this.link = CONFIG.COMMUNITY_REDEEM_CONTRIBUTION_URL.replace(/{code}/g, this.code)
} }
@Field(() => Number) @Field(() => Int)
id: number id: number
@Field(() => Decimal) @Field(() => Decimal)

View File

@ -1,4 +1,4 @@
import { ObjectType, Field } from 'type-graphql' import { ObjectType, Field, Int } from 'type-graphql'
import { ContributionLink } from '@model/ContributionLink' import { ContributionLink } from '@model/ContributionLink'
@ObjectType() @ObjectType()
@ -6,6 +6,6 @@ export class ContributionLinkList {
@Field(() => [ContributionLink]) @Field(() => [ContributionLink])
links: ContributionLink[] links: ContributionLink[]
@Field(() => Number) @Field(() => Int)
count: number count: number
} }

View File

@ -1,4 +1,4 @@
import { Field, ObjectType } from 'type-graphql' import { Field, Int, ObjectType } from 'type-graphql'
import { ContributionMessage as DbContributionMessage } from '@entity/ContributionMessage' import { ContributionMessage as DbContributionMessage } from '@entity/ContributionMessage'
import { User } from '@entity/User' import { User } from '@entity/User'
@ -16,7 +16,7 @@ export class ContributionMessage {
this.isModerator = contributionMessage.isModerator this.isModerator = contributionMessage.isModerator
} }
@Field(() => Number) @Field(() => Int)
id: number id: number
@Field(() => String) @Field(() => String)
@ -26,7 +26,7 @@ export class ContributionMessage {
createdAt: Date createdAt: Date
@Field(() => Date, { nullable: true }) @Field(() => Date, { nullable: true })
updatedAt?: Date | null updatedAt: Date | null
@Field(() => String) @Field(() => String)
type: string type: string
@ -37,7 +37,7 @@ export class ContributionMessage {
@Field(() => String, { nullable: true }) @Field(() => String, { nullable: true })
userLastName: string | null userLastName: string | null
@Field(() => Number, { nullable: true }) @Field(() => Int, { nullable: true })
userId: number | null userId: number | null
@Field(() => Boolean) @Field(() => Boolean)
@ -45,7 +45,7 @@ export class ContributionMessage {
} }
@ObjectType() @ObjectType()
export class ContributionMessageListResult { export class ContributionMessageListResult {
@Field(() => Number) @Field(() => Int)
count: number count: number
@Field(() => [ContributionMessage]) @Field(() => [ContributionMessage])

View File

@ -1,6 +1,8 @@
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
/* eslint-disable @typescript-eslint/no-explicit-any */ /* eslint-disable @typescript-eslint/no-explicit-any */
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ /* eslint-disable @typescript-eslint/explicit-module-boundary-types */
import { ObjectType, Field } from 'type-graphql' import { ObjectType, Field, Float, Int } from 'type-graphql'
import { GdtEntryType } from '@enum/GdtEntryType' import { GdtEntryType } from '@enum/GdtEntryType'
@ObjectType() @ObjectType()
@ -19,10 +21,10 @@ export class GdtEntry {
this.gdt = json.gdt this.gdt = json.gdt
} }
@Field(() => Number) @Field(() => Int)
id: number id: number
@Field(() => Number) @Field(() => Float)
amount: number amount: number
@Field(() => String) @Field(() => String)
@ -40,15 +42,15 @@ export class GdtEntry {
@Field(() => GdtEntryType) @Field(() => GdtEntryType)
gdtEntryType: GdtEntryType gdtEntryType: GdtEntryType
@Field(() => Number) @Field(() => Float)
factor: number factor: number
@Field(() => Number) @Field(() => Float)
amount2: number amount2: number
@Field(() => Number) @Field(() => Float)
factor2: number factor2: number
@Field(() => Number) @Field(() => Float)
gdt: number gdt: number
} }

View File

@ -1,7 +1,10 @@
/* eslint-disable @typescript-eslint/no-unsafe-call */
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
/* eslint-disable @typescript-eslint/no-explicit-any */ /* eslint-disable @typescript-eslint/no-explicit-any */
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ /* eslint-disable @typescript-eslint/explicit-module-boundary-types */
import { GdtEntry } from './GdtEntry' import { GdtEntry } from './GdtEntry'
import { ObjectType, Field } from 'type-graphql' import { ObjectType, Field, Int, Float } from 'type-graphql'
@ObjectType() @ObjectType()
export class GdtEntryList { export class GdtEntryList {
@ -16,15 +19,15 @@ export class GdtEntryList {
@Field(() => String) @Field(() => String)
state: string state: string
@Field(() => Number) @Field(() => Int)
count: number count: number
@Field(() => [GdtEntry], { nullable: true }) @Field(() => [GdtEntry], { nullable: true })
gdtEntries?: GdtEntry[] gdtEntries: GdtEntry[] | null
@Field(() => Number) @Field(() => Float)
gdtSum: number gdtSum: number
@Field(() => Number) @Field(() => Float)
timeUsed: number timeUsed: number
} }

View File

@ -1,4 +1,5 @@
/* eslint-disable @typescript-eslint/no-explicit-any */ /* eslint-disable @typescript-eslint/no-explicit-any */
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ /* eslint-disable @typescript-eslint/explicit-module-boundary-types */
import { ObjectType, Field } from 'type-graphql' import { ObjectType, Field } from 'type-graphql'

View File

@ -1,4 +1,4 @@
import { ObjectType, Field } from 'type-graphql' import { ObjectType, Field, Int } from 'type-graphql'
import { Decay } from './Decay' import { Decay } from './Decay'
import { Transaction as dbTransaction } from '@entity/Transaction' import { Transaction as dbTransaction } from '@entity/Transaction'
import Decimal from 'decimal.js-light' import Decimal from 'decimal.js-light'
@ -41,19 +41,19 @@ export class Transaction {
this.memo = transaction.memo this.memo = transaction.memo
this.creationDate = transaction.creationDate this.creationDate = transaction.creationDate
this.linkedUser = linkedUser this.linkedUser = linkedUser
this.linkedTransactionId = transaction.linkedTransactionId this.linkedTransactionId = transaction.linkedTransactionId || null
this.linkId = transaction.contribution this.linkId = transaction.contribution
? transaction.contribution.contributionLinkId ? transaction.contribution.contributionLinkId
: transaction.transactionLinkId : transaction.transactionLinkId || null
} }
@Field(() => Number) @Field(() => Int)
id: number id: number
@Field(() => User) @Field(() => User)
user: User user: User
@Field(() => Number, { nullable: true }) @Field(() => Int, { nullable: true })
previous: number | null previous: number | null
@Field(() => TransactionTypeId) @Field(() => TransactionTypeId)
@ -80,10 +80,10 @@ export class Transaction {
@Field(() => User, { nullable: true }) @Field(() => User, { nullable: true })
linkedUser: User | null linkedUser: User | null
@Field(() => Number, { nullable: true }) @Field(() => Int, { nullable: true })
linkedTransactionId?: number | null linkedTransactionId: number | null
// Links to the TransactionLink/ContributionLink when transaction was created by a link // Links to the TransactionLink/ContributionLink when transaction was created by a link
@Field(() => Number, { nullable: true }) @Field(() => Int, { nullable: true })
linkId?: number | null linkId: number | null
} }

View File

@ -21,7 +21,7 @@ export class TransactionLink {
this.link = CONFIG.COMMUNITY_REDEEM_URL.replace(/{code}/g, this.code) this.link = CONFIG.COMMUNITY_REDEEM_URL.replace(/{code}/g, this.code)
} }
@Field(() => Number) @Field(() => Int)
id: number id: number
@Field(() => User) @Field(() => User)

View File

@ -24,12 +24,12 @@ export class UnconfirmedContribution {
firstName: string firstName: string
@Field(() => Int) @Field(() => Int)
id?: number id: number
@Field(() => String) @Field(() => String)
lastName: string lastName: string
@Field(() => Number) @Field(() => Int)
userId: number userId: number
@Field(() => String) @Field(() => String)
@ -44,7 +44,7 @@ export class UnconfirmedContribution {
@Field(() => Decimal) @Field(() => Decimal)
amount: Decimal amount: Decimal
@Field(() => Number, { nullable: true }) @Field(() => Int, { nullable: true })
moderator: number | null moderator: number | null
@Field(() => [Decimal]) @Field(() => [Decimal])
@ -53,6 +53,6 @@ export class UnconfirmedContribution {
@Field(() => String) @Field(() => String)
state: string state: string
@Field(() => Number) @Field(() => Int)
messageCount: number messageCount: number
} }

View File

@ -1,4 +1,4 @@
import { ObjectType, Field } from 'type-graphql' import { ObjectType, Field, Int } from 'type-graphql'
import { KlickTipp } from './KlickTipp' import { KlickTipp } from './KlickTipp'
import { User as dbUser } from '@entity/User' import { User as dbUser } from '@entity/User'
import { UserContact } from './UserContact' import { UserContact } from './UserContact'
@ -28,21 +28,21 @@ export class User {
this.hideAmountGDT = user.hideAmountGDT this.hideAmountGDT = user.hideAmountGDT
} }
@Field(() => Number) @Field(() => Int)
id: number id: number
@Field(() => String) @Field(() => String)
gradidoID: string gradidoID: string
@Field(() => String, { nullable: true }) @Field(() => String, { nullable: true })
alias?: string alias: string | null
@Field(() => Number, { nullable: true }) @Field(() => Int, { nullable: true })
emailId: number | null emailId: number | null
// TODO privacy issue here // TODO privacy issue here
@Field(() => String, { nullable: true }) @Field(() => String, { nullable: true })
email: string email: string | null
@Field(() => UserContact) @Field(() => UserContact)
emailContact: UserContact emailContact: UserContact
@ -72,7 +72,7 @@ export class User {
hideAmountGDT: boolean hideAmountGDT: boolean
// This is not the users publisherId, but the one of the users who recommend him // This is not the users publisherId, but the one of the users who recommend him
@Field(() => Number, { nullable: true }) @Field(() => Int, { nullable: true })
publisherId: number | null publisherId: number | null
@Field(() => Date, { nullable: true }) @Field(() => Date, { nullable: true })

View File

@ -17,7 +17,7 @@ export class UserAdmin {
this.isAdmin = user.isAdmin this.isAdmin = user.isAdmin
} }
@Field(() => Number) @Field(() => Int)
userId: number userId: number
@Field(() => String) @Field(() => String)
@ -39,10 +39,10 @@ export class UserAdmin {
hasElopage: boolean hasElopage: boolean
@Field(() => Date, { nullable: true }) @Field(() => Date, { nullable: true })
deletedAt?: Date | null deletedAt: Date | null
@Field(() => String, { nullable: true }) @Field(() => String, { nullable: true })
emailConfirmationSend?: string emailConfirmationSend: string | null
@Field(() => Date, { nullable: true }) @Field(() => Date, { nullable: true })
isAdmin: Date | null isAdmin: Date | null

View File

@ -1,4 +1,4 @@
import { ObjectType, Field } from 'type-graphql' import { ObjectType, Field, Int } from 'type-graphql'
import { UserContact as dbUserContact } from '@entity/UserContact' import { UserContact as dbUserContact } from '@entity/UserContact'
@ObjectType() @ObjectType()
@ -18,13 +18,13 @@ export class UserContact {
this.deletedAt = userContact.deletedAt this.deletedAt = userContact.deletedAt
} }
@Field(() => Number) @Field(() => Int)
id: number id: number
@Field(() => String) @Field(() => String)
type: string type: string
@Field(() => Number) @Field(() => Int)
userId: number userId: number
@Field(() => String) @Field(() => String)
@ -33,10 +33,10 @@ export class UserContact {
// @Field(() => BigInt, { nullable: true }) // @Field(() => BigInt, { nullable: true })
// emailVerificationCode: BigInt | null // emailVerificationCode: BigInt | null
@Field(() => Number, { nullable: true }) @Field(() => Int, { nullable: true })
emailOptInTypeId: number | null emailOptInTypeId: number | null
@Field(() => Number, { nullable: true }) @Field(() => Int, { nullable: true })
emailResendCount: number | null emailResendCount: number | null
@Field(() => Boolean) @Field(() => Boolean)

View File

@ -1,3 +1,4 @@
/* eslint-disable @typescript-eslint/restrict-template-expressions */
import Decimal from 'decimal.js-light' import Decimal from 'decimal.js-light'
import { Resolver, Query, Ctx, Authorized } from 'type-graphql' import { Resolver, Query, Ctx, Authorized } from 'type-graphql'
import { getCustomRepository } from '@dbTools/typeorm' import { getCustomRepository } from '@dbTools/typeorm'

View File

@ -1,3 +1,6 @@
/* eslint-disable @typescript-eslint/no-unsafe-call */
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
/* eslint-disable @typescript-eslint/unbound-method */
/* eslint-disable @typescript-eslint/no-explicit-any */ /* eslint-disable @typescript-eslint/no-explicit-any */
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ /* eslint-disable @typescript-eslint/explicit-module-boundary-types */

View File

@ -9,7 +9,7 @@ import CONFIG from '@/config'
export class CommunityResolver { export class CommunityResolver {
@Authorized([RIGHTS.GET_COMMUNITY_INFO]) @Authorized([RIGHTS.GET_COMMUNITY_INFO])
@Query(() => Community) @Query(() => Community)
async getCommunityInfo(): Promise<Community> { getCommunityInfo(): Community {
return new Community({ return new Community({
name: CONFIG.COMMUNITY_NAME, name: CONFIG.COMMUNITY_NAME,
description: CONFIG.COMMUNITY_DESCRIPTION, description: CONFIG.COMMUNITY_DESCRIPTION,
@ -20,7 +20,7 @@ export class CommunityResolver {
@Authorized([RIGHTS.COMMUNITIES]) @Authorized([RIGHTS.COMMUNITIES])
@Query(() => [Community]) @Query(() => [Community])
async communities(): Promise<Community[]> { communities(): Community[] {
if (CONFIG.PRODUCTION) if (CONFIG.PRODUCTION)
return [ return [
new Community({ new Community({

View File

@ -1,3 +1,7 @@
/* eslint-disable @typescript-eslint/no-unsafe-call */
/* eslint-disable @typescript-eslint/unbound-method */
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
/* eslint-disable @typescript-eslint/no-explicit-any */ /* eslint-disable @typescript-eslint/no-explicit-any */
import Decimal from 'decimal.js-light' import Decimal from 'decimal.js-light'

View File

@ -35,7 +35,7 @@ export class ContributionLinkResolver {
cycle, cycle,
validFrom, validFrom,
validTo, validTo,
maxAmountPerMonth, maxAmountPerMonth = null,
maxPerCycle, maxPerCycle,
}: ContributionLinkArgs, }: ContributionLinkArgs,
): Promise<ContributionLink> { ): Promise<ContributionLink> {
@ -114,7 +114,7 @@ export class ContributionLinkResolver {
cycle, cycle,
validFrom, validFrom,
validTo, validTo,
maxAmountPerMonth, maxAmountPerMonth = null,
maxPerCycle, maxPerCycle,
}: ContributionLinkArgs, }: ContributionLinkArgs,
@Arg('id', () => Int) id: number, @Arg('id', () => Int) id: number,

View File

@ -1,3 +1,8 @@
/* eslint-disable @typescript-eslint/no-unsafe-call */
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
/* eslint-disable @typescript-eslint/unbound-method */
/* eslint-disable @typescript-eslint/no-unsafe-return */
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
/* eslint-disable @typescript-eslint/no-explicit-any */ /* eslint-disable @typescript-eslint/no-explicit-any */
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ /* eslint-disable @typescript-eslint/explicit-module-boundary-types */
@ -181,7 +186,7 @@ describe('ContributionMessageResolver', () => {
) )
}) })
it('calls sendAddedContributionMessageEmail', async () => { it('calls sendAddedContributionMessageEmail', () => {
expect(sendAddedContributionMessageEmail).toBeCalledWith({ expect(sendAddedContributionMessageEmail).toBeCalledWith({
firstName: 'Bibi', firstName: 'Bibi',
lastName: 'Bloxberg', lastName: 'Bloxberg',

View File

@ -1,4 +1,5 @@
import { Arg, Args, Authorized, Ctx, Mutation, Query, Resolver } from 'type-graphql' /* eslint-disable @typescript-eslint/restrict-template-expressions */
import { Arg, Args, Authorized, Ctx, Int, Mutation, Query, Resolver } from 'type-graphql'
import { getConnection } from '@dbTools/typeorm' import { getConnection } from '@dbTools/typeorm'
import { ContributionMessage as DbContributionMessage } from '@entity/ContributionMessage' import { ContributionMessage as DbContributionMessage } from '@entity/ContributionMessage'
@ -68,7 +69,7 @@ export class ContributionMessageResolver {
@Authorized([RIGHTS.LIST_ALL_CONTRIBUTION_MESSAGES]) @Authorized([RIGHTS.LIST_ALL_CONTRIBUTION_MESSAGES])
@Query(() => ContributionMessageListResult) @Query(() => ContributionMessageListResult)
async listContributionMessages( async listContributionMessages(
@Arg('contributionId') contributionId: number, @Arg('contributionId', () => Int) contributionId: number,
@Args() @Args()
{ currentPage = 1, pageSize = 5, order = Order.DESC }: Paginated, { currentPage = 1, pageSize = 5, order = Order.DESC }: Paginated,
): Promise<ContributionMessageListResult> { ): Promise<ContributionMessageListResult> {

View File

@ -1,3 +1,8 @@
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
/* eslint-disable @typescript-eslint/no-unsafe-call */
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
/* eslint-disable @typescript-eslint/unbound-method */
/* eslint-disable @typescript-eslint/no-unsafe-return */
/* eslint-disable @typescript-eslint/no-explicit-any */ /* eslint-disable @typescript-eslint/no-explicit-any */
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ /* eslint-disable @typescript-eslint/explicit-module-boundary-types */
@ -176,7 +181,7 @@ describe('ContributionResolver', () => {
}) })
}) })
afterAll(async () => { afterAll(() => {
resetToken() resetToken()
}) })
@ -265,7 +270,7 @@ describe('ContributionResolver', () => {
}) })
describe('valid input', () => { describe('valid input', () => {
it('creates contribution', async () => { it('creates contribution', () => {
expect(pendingContribution.data.createContribution).toMatchObject({ expect(pendingContribution.data.createContribution).toMatchObject({
id: expect.any(Number), id: expect.any(Number),
amount: '100', amount: '100',
@ -311,7 +316,7 @@ describe('ContributionResolver', () => {
}) })
}) })
afterAll(async () => { afterAll(() => {
resetToken() resetToken()
}) })
@ -452,7 +457,7 @@ describe('ContributionResolver', () => {
id: pendingContribution.data.createContribution.id, id: pendingContribution.data.createContribution.id,
}) })
contribution.contributionStatus = ContributionStatus.DELETED contribution.contributionStatus = ContributionStatus.DELETED
contribution.save() await contribution.save()
await mutate({ await mutate({
mutation: login, mutation: login,
variables: { email: 'bibi@bloxberg.de', password: 'Aa12345_' }, variables: { email: 'bibi@bloxberg.de', password: 'Aa12345_' },
@ -464,7 +469,7 @@ describe('ContributionResolver', () => {
id: pendingContribution.data.createContribution.id, id: pendingContribution.data.createContribution.id,
}) })
contribution.contributionStatus = ContributionStatus.PENDING contribution.contributionStatus = ContributionStatus.PENDING
contribution.save() await contribution.save()
}) })
it('throws an error', async () => { it('throws an error', async () => {
@ -636,7 +641,7 @@ describe('ContributionResolver', () => {
}) })
}) })
afterAll(async () => { afterAll(() => {
resetToken() resetToken()
}) })
@ -820,7 +825,7 @@ describe('ContributionResolver', () => {
) )
}) })
it('calls sendContributionDeniedEmail', async () => { it('calls sendContributionDeniedEmail', () => {
expect(sendContributionDeniedEmail).toBeCalledWith({ expect(sendContributionDeniedEmail).toBeCalledWith({
firstName: 'Bibi', firstName: 'Bibi',
lastName: 'Bloxberg', lastName: 'Bloxberg',
@ -856,7 +861,7 @@ describe('ContributionResolver', () => {
}) })
}) })
afterAll(async () => { afterAll(() => {
resetToken() resetToken()
}) })
@ -1009,7 +1014,7 @@ describe('ContributionResolver', () => {
}) })
}) })
afterAll(async () => { afterAll(() => {
resetToken() resetToken()
}) })
@ -1140,7 +1145,7 @@ describe('ContributionResolver', () => {
}) })
}) })
afterAll(async () => { afterAll(() => {
resetToken() resetToken()
}) })
@ -1720,7 +1725,7 @@ describe('ContributionResolver', () => {
}) })
}) })
afterAll(async () => { afterAll(() => {
resetToken() resetToken()
}) })
@ -1798,7 +1803,7 @@ describe('ContributionResolver', () => {
}) })
}) })
afterAll(async () => { afterAll(() => {
resetToken() resetToken()
}) })
@ -1913,7 +1918,7 @@ describe('ContributionResolver', () => {
}) })
describe('valid user to create for', () => { describe('valid user to create for', () => {
beforeAll(async () => { beforeAll(() => {
variables.email = 'bibi@bloxberg.de' variables.email = 'bibi@bloxberg.de'
variables.creationDate = 'invalid-date' variables.creationDate = 'invalid-date'
}) })
@ -2019,7 +2024,7 @@ describe('ContributionResolver', () => {
).resolves.toEqual( ).resolves.toEqual(
expect.objectContaining({ expect.objectContaining({
data: { data: {
adminCreateContribution: [1000, 1000, 590], adminCreateContribution: ['1000', '1000', '590'],
}, },
}), }),
) )
@ -2386,7 +2391,7 @@ describe('ContributionResolver', () => {
) )
}) })
it('calls sendContributionDeletedEmail', async () => { it('calls sendContributionDeletedEmail', () => {
expect(sendContributionDeletedEmail).toBeCalledWith({ expect(sendContributionDeletedEmail).toBeCalledWith({
firstName: 'Peter', firstName: 'Peter',
lastName: 'Lustig', lastName: 'Lustig',
@ -2551,7 +2556,7 @@ describe('ContributionResolver', () => {
expect(transaction[0].typeId).toEqual(1) expect(transaction[0].typeId).toEqual(1)
}) })
it('calls sendContributionConfirmedEmail', async () => { it('calls sendContributionConfirmedEmail', () => {
expect(sendContributionConfirmedEmail).toBeCalledWith({ expect(sendContributionConfirmedEmail).toBeCalledWith({
firstName: 'Bibi', firstName: 'Bibi',
lastName: 'Bloxberg', lastName: 'Bloxberg',
@ -2745,15 +2750,6 @@ describe('ContributionResolver', () => {
messagesCount: 0, messagesCount: 0,
state: 'CONFIRMED', state: 'CONFIRMED',
}), }),
expect.objectContaining({
amount: expect.decimalEqual(100),
firstName: 'Bob',
id: expect.any(Number),
lastName: 'der Baumeister',
memo: 'Confirmed Contribution',
messagesCount: 0,
state: 'CONFIRMED',
}),
expect.objectContaining({ expect.objectContaining({
amount: expect.decimalEqual(400), amount: expect.decimalEqual(400),
firstName: 'Peter', firstName: 'Peter',
@ -2763,6 +2759,15 @@ describe('ContributionResolver', () => {
messagesCount: 0, messagesCount: 0,
state: 'PENDING', state: 'PENDING',
}), }),
expect.objectContaining({
amount: expect.decimalEqual(100),
firstName: 'Bob',
id: expect.any(Number),
lastName: 'der Baumeister',
memo: 'Confirmed Contribution',
messagesCount: 0,
state: 'CONFIRMED',
}),
expect.objectContaining({ expect.objectContaining({
amount: expect.decimalEqual(100), amount: expect.decimalEqual(100),
firstName: 'Peter', firstName: 'Peter',
@ -2781,15 +2786,6 @@ describe('ContributionResolver', () => {
messagesCount: 0, messagesCount: 0,
state: 'PENDING', state: 'PENDING',
}), }),
expect.objectContaining({
amount: expect.decimalEqual(10),
firstName: 'Bibi',
id: expect.any(Number),
lastName: 'Bloxberg',
memo: 'Test PENDING contribution update',
messagesCount: 0,
state: 'PENDING',
}),
expect.objectContaining({ expect.objectContaining({
amount: expect.decimalEqual(200), amount: expect.decimalEqual(200),
firstName: 'Peter', firstName: 'Peter',
@ -2799,15 +2795,6 @@ describe('ContributionResolver', () => {
messagesCount: 0, messagesCount: 0,
state: 'DELETED', state: 'DELETED',
}), }),
expect.objectContaining({
amount: expect.decimalEqual(166),
firstName: 'Räuber',
id: expect.any(Number),
lastName: 'Hotzenplotz',
memo: 'Whatever contribution',
messagesCount: 0,
state: 'DELETED',
}),
expect.objectContaining({ expect.objectContaining({
amount: expect.decimalEqual(166), amount: expect.decimalEqual(166),
firstName: 'Räuber', firstName: 'Räuber',
@ -2817,6 +2804,15 @@ describe('ContributionResolver', () => {
messagesCount: 0, messagesCount: 0,
state: 'DENIED', state: 'DENIED',
}), }),
expect.objectContaining({
amount: expect.decimalEqual(166),
firstName: 'Räuber',
id: expect.any(Number),
lastName: 'Hotzenplotz',
memo: 'Whatever contribution',
messagesCount: 0,
state: 'DELETED',
}),
expect.objectContaining({ expect.objectContaining({
amount: expect.decimalEqual(166), amount: expect.decimalEqual(166),
firstName: 'Räuber', firstName: 'Räuber',
@ -2831,18 +2827,9 @@ describe('ContributionResolver', () => {
firstName: 'Bibi', firstName: 'Bibi',
id: expect.any(Number), id: expect.any(Number),
lastName: 'Bloxberg', lastName: 'Bloxberg',
memo: 'Test IN_PROGRESS contribution', memo: 'Test contribution to delete',
messagesCount: 0, messagesCount: 0,
state: 'IN_PROGRESS', state: 'DELETED',
}),
expect.objectContaining({
amount: expect.decimalEqual(100),
firstName: 'Bibi',
id: expect.any(Number),
lastName: 'Bloxberg',
memo: 'Test contribution to confirm',
messagesCount: 0,
state: 'CONFIRMED',
}), }),
expect.objectContaining({ expect.objectContaining({
amount: expect.decimalEqual(100), amount: expect.decimalEqual(100),
@ -2858,9 +2845,27 @@ describe('ContributionResolver', () => {
firstName: 'Bibi', firstName: 'Bibi',
id: expect.any(Number), id: expect.any(Number),
lastName: 'Bloxberg', lastName: 'Bloxberg',
memo: 'Test contribution to delete', memo: 'Test contribution to confirm',
messagesCount: 0, messagesCount: 0,
state: 'DELETED', state: 'CONFIRMED',
}),
expect.objectContaining({
amount: expect.decimalEqual(100),
firstName: 'Bibi',
id: expect.any(Number),
lastName: 'Bloxberg',
memo: 'Test IN_PROGRESS contribution',
messagesCount: 1,
state: 'IN_PROGRESS',
}),
expect.objectContaining({
amount: expect.decimalEqual(10),
firstName: 'Bibi',
id: expect.any(Number),
lastName: 'Bloxberg',
memo: 'Test PENDING contribution update',
messagesCount: 1,
state: 'PENDING',
}), }),
expect.objectContaining({ expect.objectContaining({
amount: expect.decimalEqual(1000), amount: expect.decimalEqual(1000),

View File

@ -1,3 +1,4 @@
/* eslint-disable @typescript-eslint/restrict-template-expressions */
import Decimal from 'decimal.js-light' import Decimal from 'decimal.js-light'
import { Arg, Args, Authorized, Ctx, Int, Mutation, Query, Resolver } from 'type-graphql' import { Arg, Args, Authorized, Ctx, Int, Mutation, Query, Resolver } from 'type-graphql'
import { IsNull, getConnection } from '@dbTools/typeorm' import { IsNull, getConnection } from '@dbTools/typeorm'
@ -131,7 +132,7 @@ export class ContributionResolver {
@Args() @Args()
{ currentPage = 1, pageSize = 5, order = Order.DESC }: Paginated, { currentPage = 1, pageSize = 5, order = Order.DESC }: Paginated,
@Arg('statusFilter', () => [ContributionStatus], { nullable: true }) @Arg('statusFilter', () => [ContributionStatus], { nullable: true })
statusFilter?: ContributionStatus[], statusFilter?: ContributionStatus[] | null,
): Promise<ContributionListResult> { ): Promise<ContributionListResult> {
const user = getUser(context) const user = getUser(context)
@ -156,7 +157,7 @@ export class ContributionResolver {
@Args() @Args()
{ currentPage = 1, pageSize = 5, order = Order.DESC }: Paginated, { currentPage = 1, pageSize = 5, order = Order.DESC }: Paginated,
@Arg('statusFilter', () => [ContributionStatus], { nullable: true }) @Arg('statusFilter', () => [ContributionStatus], { nullable: true })
statusFilter?: ContributionStatus[], statusFilter?: ContributionStatus[] | null,
): Promise<ContributionListResult> { ): Promise<ContributionListResult> {
const [dbContributions, count] = await findContributions({ const [dbContributions, count] = await findContributions({
order, order,
@ -237,14 +238,14 @@ export class ContributionResolver {
contributionMessage.isModerator = false contributionMessage.isModerator = false
contributionMessage.userId = user.id contributionMessage.userId = user.id
contributionMessage.type = ContributionMessageType.HISTORY contributionMessage.type = ContributionMessageType.HISTORY
ContributionMessage.save(contributionMessage) await ContributionMessage.save(contributionMessage)
contributionToUpdate.amount = amount contributionToUpdate.amount = amount
contributionToUpdate.memo = memo contributionToUpdate.memo = memo
contributionToUpdate.contributionDate = new Date(creationDate) contributionToUpdate.contributionDate = new Date(creationDate)
contributionToUpdate.contributionStatus = ContributionStatus.PENDING contributionToUpdate.contributionStatus = ContributionStatus.PENDING
contributionToUpdate.updatedAt = new Date() contributionToUpdate.updatedAt = new Date()
DbContribution.save(contributionToUpdate) await DbContribution.save(contributionToUpdate)
await EVENT_CONTRIBUTION_UPDATE(user.id, contributionId, amount) await EVENT_CONTRIBUTION_UPDATE(user.id, contributionId, amount)
@ -252,7 +253,7 @@ export class ContributionResolver {
} }
@Authorized([RIGHTS.ADMIN_CREATE_CONTRIBUTION]) @Authorized([RIGHTS.ADMIN_CREATE_CONTRIBUTION])
@Mutation(() => [Number]) @Mutation(() => [Decimal])
async adminCreateContribution( async adminCreateContribution(
@Args() { email, amount, memo, creationDate }: AdminCreateContributionArgs, @Args() { email, amount, memo, creationDate }: AdminCreateContributionArgs,
@Ctx() context: Context, @Ctx() context: Context,
@ -382,9 +383,9 @@ export class ContributionResolver {
@Args() @Args()
{ currentPage = 1, pageSize = 3, order = Order.DESC }: Paginated, { currentPage = 1, pageSize = 3, order = Order.DESC }: Paginated,
@Arg('statusFilter', () => [ContributionStatus], { nullable: true }) @Arg('statusFilter', () => [ContributionStatus], { nullable: true })
statusFilter?: ContributionStatus[], statusFilter?: ContributionStatus[] | null,
@Arg('userId', () => Int, { nullable: true }) @Arg('userId', () => Int, { nullable: true })
userId?: number, userId?: number | null,
): Promise<ContributionListResult> { ): Promise<ContributionListResult> {
const [dbContributions, count] = await findContributions({ const [dbContributions, count] = await findContributions({
order, order,
@ -392,7 +393,7 @@ export class ContributionResolver {
pageSize, pageSize,
withDeleted: true, withDeleted: true,
userId, userId,
relations: ['user'], relations: ['user', 'messages'],
statusFilter, statusFilter,
}) })
@ -433,7 +434,7 @@ export class ContributionResolver {
await EVENT_ADMIN_CONTRIBUTION_DELETE(contribution.userId, contribution.id, contribution.amount) await EVENT_ADMIN_CONTRIBUTION_DELETE(contribution.userId, contribution.id, contribution.amount)
sendContributionDeletedEmail({ void sendContributionDeletedEmail({
firstName: user.firstName, firstName: user.firstName,
lastName: user.lastName, lastName: user.lastName,
email: user.emailContact.email, email: user.emailContact.email,
@ -527,7 +528,7 @@ export class ContributionResolver {
await queryRunner.commitTransaction() await queryRunner.commitTransaction()
logger.info('creation commited successfuly.') logger.info('creation commited successfuly.')
sendContributionConfirmedEmail({ void sendContributionConfirmedEmail({
firstName: user.firstName, firstName: user.firstName,
lastName: user.lastName, lastName: user.lastName,
email: user.emailContact.email, email: user.emailContact.email,
@ -554,8 +555,8 @@ export class ContributionResolver {
@Authorized([RIGHTS.OPEN_CREATIONS]) @Authorized([RIGHTS.OPEN_CREATIONS])
@Query(() => [OpenCreation]) @Query(() => [OpenCreation])
async openCreations( async openCreations(
@Arg('userId', () => Int, { nullable: true }) userId: number | null,
@Ctx() context: Context, @Ctx() context: Context,
@Arg('userId', () => Int, { nullable: true }) userId?: number | null,
): Promise<OpenCreation[]> { ): Promise<OpenCreation[]> {
const id = userId || getUser(context).id const id = userId || getUser(context).id
const clientTimezoneOffset = getClientTimezoneOffset(context) const clientTimezoneOffset = getClientTimezoneOffset(context)
@ -614,7 +615,7 @@ export class ContributionResolver {
contributionToUpdate.amount, contributionToUpdate.amount,
) )
sendContributionDeniedEmail({ void sendContributionDeniedEmail({
firstName: user.firstName, firstName: user.firstName,
lastName: user.lastName, lastName: user.lastName,
email: user.emailContact.email, email: user.emailContact.email,

View File

@ -1,3 +1,6 @@
/* eslint-disable @typescript-eslint/no-unsafe-call */
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
/* eslint-disable @typescript-eslint/no-explicit-any */ /* eslint-disable @typescript-eslint/no-explicit-any */
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ /* eslint-disable @typescript-eslint/explicit-module-boundary-types */

View File

@ -1,4 +1,7 @@
import { Resolver, Query, Args, Ctx, Authorized, Arg } from 'type-graphql' /* eslint-disable @typescript-eslint/no-unsafe-member-access */
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
/* eslint-disable @typescript-eslint/no-unsafe-return */
import { Resolver, Query, Args, Ctx, Authorized, Arg, Int, Float } from 'type-graphql'
import { GdtEntryList } from '@model/GdtEntryList' import { GdtEntryList } from '@model/GdtEntryList'
import { Order } from '@enum/Order' import { Order } from '@enum/Order'
@ -23,6 +26,7 @@ export class GdtResolver {
try { try {
const resultGDT = await apiGet( const resultGDT = await apiGet(
// eslint-disable-next-line @typescript-eslint/restrict-template-expressions
`${CONFIG.GDT_API_URL}/GdtEntries/listPerEmailApi/${userEntity.emailContact.email}/${currentPage}/${pageSize}/${order}`, `${CONFIG.GDT_API_URL}/GdtEntries/listPerEmailApi/${userEntity.emailContact.email}/${currentPage}/${pageSize}/${order}`,
) )
if (!resultGDT.success) { if (!resultGDT.success) {
@ -35,7 +39,7 @@ export class GdtResolver {
} }
@Authorized([RIGHTS.GDT_BALANCE]) @Authorized([RIGHTS.GDT_BALANCE])
@Query(() => Number) @Query(() => Float, { nullable: true })
async gdtBalance(@Ctx() context: Context): Promise<number | null> { async gdtBalance(@Ctx() context: Context): Promise<number | null> {
const user = getUser(context) const user = getUser(context)
try { try {
@ -54,9 +58,9 @@ export class GdtResolver {
} }
@Authorized([RIGHTS.EXIST_PID]) @Authorized([RIGHTS.EXIST_PID])
@Query(() => Number) @Query(() => Int)
// eslint-disable-next-line @typescript-eslint/no-explicit-any // eslint-disable-next-line @typescript-eslint/no-explicit-any
async existPid(@Arg('pid') pid: number): Promise<number> { async existPid(@Arg('pid', () => Int) pid: number): Promise<number> {
// load user // load user
const resultPID = await apiGet(`${CONFIG.GDT_API_URL}/publishers/checkPidApi/${pid}`) const resultPID = await apiGet(`${CONFIG.GDT_API_URL}/publishers/checkPidApi/${pid}`)
if (!resultPID.success) { if (!resultPID.success) {

View File

@ -1,3 +1,4 @@
/* eslint-disable @typescript-eslint/no-unsafe-return */
import { Resolver, Query, Authorized, Arg, Mutation, Args } from 'type-graphql' import { Resolver, Query, Authorized, Arg, Mutation, Args } from 'type-graphql'
import SubscribeNewsletterArgs from '@arg/SubscribeNewsletterArgs' import SubscribeNewsletterArgs from '@arg/SubscribeNewsletterArgs'

View File

@ -1,3 +1,5 @@
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
/* eslint-disable @typescript-eslint/no-unsafe-return */
import Decimal from 'decimal.js-light' import Decimal from 'decimal.js-light'
import { Resolver, Query, Authorized, FieldResolver } from 'type-graphql' import { Resolver, Query, Authorized, FieldResolver } from 'type-graphql'
import { getConnection } from '@dbTools/typeorm' import { getConnection } from '@dbTools/typeorm'
@ -15,7 +17,7 @@ import { calculateDecay } from '@/util/decay'
export class StatisticsResolver { export class StatisticsResolver {
@Authorized([RIGHTS.COMMUNITY_STATISTICS]) @Authorized([RIGHTS.COMMUNITY_STATISTICS])
@Query(() => CommunityStatistics) @Query(() => CommunityStatistics)
async communityStatistics(): Promise<CommunityStatistics> { communityStatistics(): CommunityStatistics {
return new CommunityStatistics() return new CommunityStatistics()
} }

View File

@ -1,3 +1,8 @@
/* eslint-disable @typescript-eslint/no-unsafe-call */
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
/* eslint-disable @typescript-eslint/restrict-template-expressions */
/* eslint-disable @typescript-eslint/unbound-method */
/* eslint-disable @typescript-eslint/no-explicit-any */ /* eslint-disable @typescript-eslint/no-explicit-any */
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ /* eslint-disable @typescript-eslint/explicit-module-boundary-types */
@ -210,7 +215,7 @@ describe('TransactionLinkResolver', () => {
mutate({ mutate({
mutation: redeemTransactionLink, mutation: redeemTransactionLink,
variables: { variables: {
code: 'CL-' + contributionLink.code, code: `CL-${contributionLink.code}`,
}, },
}), }),
).resolves.toMatchObject({ ).resolves.toMatchObject({
@ -249,7 +254,7 @@ describe('TransactionLinkResolver', () => {
mutate({ mutate({
mutation: redeemTransactionLink, mutation: redeemTransactionLink,
variables: { variables: {
code: 'CL-' + contributionLink.code, code: `CL-${contributionLink.code}`,
}, },
}), }),
).resolves.toMatchObject({ ).resolves.toMatchObject({
@ -288,7 +293,7 @@ describe('TransactionLinkResolver', () => {
mutate({ mutate({
mutation: redeemTransactionLink, mutation: redeemTransactionLink,
variables: { variables: {
code: 'CL-' + contributionLink.code, code: `CL-${contributionLink.code}`,
}, },
}), }),
).resolves.toMatchObject({ ).resolves.toMatchObject({

View File

@ -341,8 +341,9 @@ export class TransactionLinkResolver {
async listTransactionLinksAdmin( async listTransactionLinksAdmin(
@Args() @Args()
paginated: Paginated, paginated: Paginated,
// eslint-disable-next-line type-graphql/wrong-decorator-signature
@Arg('filters', () => TransactionLinkFilters, { nullable: true }) @Arg('filters', () => TransactionLinkFilters, { nullable: true })
filters: TransactionLinkFilters | null, filters: TransactionLinkFilters | null, // eslint-disable-line type-graphql/invalid-nullable-input-type
@Arg('userId', () => Int) @Arg('userId', () => Int)
userId: number, userId: number,
): Promise<TransactionLinkResult> { ): Promise<TransactionLinkResult> {

View File

@ -1,3 +1,7 @@
/* eslint-disable @typescript-eslint/no-unsafe-call */
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
/* eslint-disable @typescript-eslint/unbound-method */
/* eslint-disable @typescript-eslint/no-explicit-any */ /* eslint-disable @typescript-eslint/no-explicit-any */
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ /* eslint-disable @typescript-eslint/explicit-module-boundary-types */
@ -324,7 +328,7 @@ describe('send coins', () => {
).toEqual( ).toEqual(
expect.objectContaining({ expect.objectContaining({
data: { data: {
sendCoins: 'true', sendCoins: true,
}, },
}), }),
) )
@ -337,7 +341,7 @@ describe('send coins', () => {
memo: 'unrepeatable memo', memo: 'unrepeatable memo',
}) })
expect(EventProtocol.find()).resolves.toContainEqual( await expect(EventProtocol.find()).resolves.toContainEqual(
expect.objectContaining({ expect.objectContaining({
type: EventProtocolType.TRANSACTION_SEND, type: EventProtocolType.TRANSACTION_SEND,
userId: user[1].id, userId: user[1].id,
@ -354,7 +358,7 @@ describe('send coins', () => {
memo: 'unrepeatable memo', memo: 'unrepeatable memo',
}) })
expect(EventProtocol.find()).resolves.toContainEqual( await expect(EventProtocol.find()).resolves.toContainEqual(
expect.objectContaining({ expect.objectContaining({
type: EventProtocolType.TRANSACTION_RECEIVE, type: EventProtocolType.TRANSACTION_RECEIVE,
userId: user[0].id, userId: user[0].id,
@ -379,7 +383,7 @@ describe('send coins', () => {
).resolves.toEqual( ).resolves.toEqual(
expect.objectContaining({ expect.objectContaining({
data: { data: {
sendCoins: 'true', sendCoins: true,
}, },
}), }),
) )
@ -395,7 +399,7 @@ describe('send coins', () => {
).resolves.toEqual( ).resolves.toEqual(
expect.objectContaining({ expect.objectContaining({
data: { data: {
sendCoins: 'true', sendCoins: true,
}, },
}), }),
) )
@ -411,7 +415,7 @@ describe('send coins', () => {
).resolves.toEqual( ).resolves.toEqual(
expect.objectContaining({ expect.objectContaining({
data: { data: {
sendCoins: 'true', sendCoins: true,
}, },
}), }),
) )
@ -427,7 +431,7 @@ describe('send coins', () => {
).resolves.toEqual( ).resolves.toEqual(
expect.objectContaining({ expect.objectContaining({
data: { data: {
sendCoins: 'true', sendCoins: true,
}, },
}), }),
) )

View File

@ -1,3 +1,4 @@
/* eslint-disable @typescript-eslint/restrict-template-expressions */
/* eslint-disable new-cap */ /* eslint-disable new-cap */
/* eslint-disable @typescript-eslint/no-non-null-assertion */ /* eslint-disable @typescript-eslint/no-non-null-assertion */
@ -304,7 +305,7 @@ export class TransactionResolver {
} }
@Authorized([RIGHTS.SEND_COINS]) @Authorized([RIGHTS.SEND_COINS])
@Mutation(() => String) @Mutation(() => Boolean)
async sendCoins( async sendCoins(
@Args() { email, amount, memo }: TransactionSendArgs, @Args() { email, amount, memo }: TransactionSendArgs,
@Ctx() context: Context, @Ctx() context: Context,

View File

@ -1,3 +1,8 @@
/* eslint-disable @typescript-eslint/no-unsafe-call */
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
/* eslint-disable @typescript-eslint/no-unsafe-return */
/* eslint-disable @typescript-eslint/unbound-method */
/* eslint-disable @typescript-eslint/no-explicit-any */ /* eslint-disable @typescript-eslint/no-explicit-any */
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ /* eslint-disable @typescript-eslint/explicit-module-boundary-types */
@ -182,7 +187,7 @@ describe('UserResolver', () => {
{ email: 'peter@lustig.de' }, { email: 'peter@lustig.de' },
{ relations: ['user'] }, { relations: ['user'] },
) )
expect(EventProtocol.find()).resolves.toContainEqual( await expect(EventProtocol.find()).resolves.toContainEqual(
expect.objectContaining({ expect.objectContaining({
type: EventProtocolType.REGISTER, type: EventProtocolType.REGISTER,
userId: userConatct.user.id, userId: userConatct.user.id,
@ -210,8 +215,8 @@ describe('UserResolver', () => {
}) })
}) })
it('stores the SEND_CONFIRMATION_EMAIL event in the database', () => { it('stores the SEND_CONFIRMATION_EMAIL event in the database', async () => {
expect(EventProtocol.find()).resolves.toContainEqual( await expect(EventProtocol.find()).resolves.toContainEqual(
expect.objectContaining({ expect.objectContaining({
type: EventProtocolType.SEND_CONFIRMATION_EMAIL, type: EventProtocolType.SEND_CONFIRMATION_EMAIL,
userId: user[0].id, userId: user[0].id,
@ -226,7 +231,7 @@ describe('UserResolver', () => {
mutation = await mutate({ mutation: createUser, variables }) mutation = await mutate({ mutation: createUser, variables })
}) })
it('logs an info', async () => { it('logs an info', () => {
expect(logger.info).toBeCalledWith('User already exists with this email=peter@lustig.de') expect(logger.info).toBeCalledWith('User already exists with this email=peter@lustig.de')
}) })
@ -239,7 +244,7 @@ describe('UserResolver', () => {
}) })
}) })
it('results with partly faked user with random "id"', async () => { it('results with partly faked user with random "id"', () => {
expect(mutation).toEqual( expect(mutation).toEqual(
expect.objectContaining({ expect.objectContaining({
data: { data: {
@ -256,7 +261,7 @@ describe('UserResolver', () => {
{ email: 'peter@lustig.de' }, { email: 'peter@lustig.de' },
{ relations: ['user'] }, { relations: ['user'] },
) )
expect(EventProtocol.find()).resolves.toContainEqual( await expect(EventProtocol.find()).resolves.toContainEqual(
expect.objectContaining({ expect.objectContaining({
type: EventProtocolType.SEND_ACCOUNT_MULTIREGISTRATION_EMAIL, type: EventProtocolType.SEND_ACCOUNT_MULTIREGISTRATION_EMAIL,
userId: userConatct.user.id, userId: userConatct.user.id,
@ -283,7 +288,7 @@ describe('UserResolver', () => {
}) })
describe('no publisher id', () => { describe('no publisher id', () => {
it('sets publisher id to null', async () => { it('sets publisher id to 0', async () => {
await mutate({ await mutate({
mutation: createUser, mutation: createUser,
variables: { ...variables, email: 'raeuber@hotzenplotz.de', publisherId: undefined }, variables: { ...variables, email: 'raeuber@hotzenplotz.de', publisherId: undefined },
@ -294,7 +299,7 @@ describe('UserResolver', () => {
emailContact: expect.objectContaining({ emailContact: expect.objectContaining({
email: 'raeuber@hotzenplotz.de', email: 'raeuber@hotzenplotz.de',
}), }),
publisherId: null, publisherId: 0,
}), }),
]), ]),
) )
@ -355,8 +360,8 @@ describe('UserResolver', () => {
) )
}) })
it('stores the ACTIVATE_ACCOUNT event in the database', () => { it('stores the ACTIVATE_ACCOUNT event in the database', async () => {
expect(EventProtocol.find()).resolves.toContainEqual( await expect(EventProtocol.find()).resolves.toContainEqual(
expect.objectContaining({ expect.objectContaining({
type: EventProtocolType.ACTIVATE_ACCOUNT, type: EventProtocolType.ACTIVATE_ACCOUNT,
userId: user[0].id, userId: user[0].id,
@ -364,8 +369,8 @@ describe('UserResolver', () => {
) )
}) })
it('stores the REDEEM_REGISTER event in the database', () => { it('stores the REDEEM_REGISTER event in the database', async () => {
expect(EventProtocol.find()).resolves.toContainEqual( await expect(EventProtocol.find()).resolves.toContainEqual(
expect.objectContaining({ expect.objectContaining({
type: EventProtocolType.REDEEM_REGISTER, type: EventProtocolType.REDEEM_REGISTER,
userId: result.data.createUser.id, userId: result.data.createUser.id,
@ -680,7 +685,7 @@ describe('UserResolver', () => {
{ email: 'bibi@bloxberg.de' }, { email: 'bibi@bloxberg.de' },
{ relations: ['user'] }, { relations: ['user'] },
) )
expect(EventProtocol.find()).resolves.toContainEqual( await expect(EventProtocol.find()).resolves.toContainEqual(
expect.objectContaining({ expect.objectContaining({
type: EventProtocolType.LOGIN, type: EventProtocolType.LOGIN,
userId: userConatct.user.id, userId: userConatct.user.id,
@ -849,7 +854,7 @@ describe('UserResolver', () => {
it('returns true', async () => { it('returns true', async () => {
await expect(mutate({ mutation: logout })).resolves.toEqual( await expect(mutate({ mutation: logout })).resolves.toEqual(
expect.objectContaining({ expect.objectContaining({
data: { logout: 'true' }, data: { logout: true },
errors: undefined, errors: undefined,
}), }),
) )
@ -927,8 +932,8 @@ describe('UserResolver', () => {
) )
}) })
it('stores the LOGIN event in the database', () => { it('stores the LOGIN event in the database', async () => {
expect(EventProtocol.find()).resolves.toContainEqual( await expect(EventProtocol.find()).resolves.toContainEqual(
expect.objectContaining({ expect.objectContaining({
type: EventProtocolType.LOGIN, type: EventProtocolType.LOGIN,
userId: user[0].id, userId: user[0].id,
@ -1847,7 +1852,7 @@ describe('UserResolver', () => {
{ email: 'bibi@bloxberg.de' }, { email: 'bibi@bloxberg.de' },
{ relations: ['user'] }, { relations: ['user'] },
) )
expect(EventProtocol.find()).resolves.toContainEqual( await expect(EventProtocol.find()).resolves.toContainEqual(
expect.objectContaining({ expect.objectContaining({
type: EventProtocolType.ADMIN_SEND_CONFIRMATION_EMAIL, type: EventProtocolType.ADMIN_SEND_CONFIRMATION_EMAIL,
userId: userConatct.user.id, userId: userConatct.user.id,

View File

@ -1,3 +1,7 @@
/* eslint-disable @typescript-eslint/no-unsafe-call */
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
/* eslint-disable @typescript-eslint/restrict-template-expressions */
import i18n from 'i18n' import i18n from 'i18n'
import { v4 as uuidv4 } from 'uuid' import { v4 as uuidv4 } from 'uuid'
import { import {
@ -166,11 +170,11 @@ export class UserResolver {
// Elopage Status & Stored PublisherId // Elopage Status & Stored PublisherId
user.hasElopage = await this.hasElopage({ ...context, user: dbUser }) user.hasElopage = await this.hasElopage({ ...context, user: dbUser })
logger.info('user.hasElopage=' + user.hasElopage) logger.info('user.hasElopage', user.hasElopage)
if (!user.hasElopage && publisherId) { if (!user.hasElopage && publisherId) {
user.publisherId = publisherId user.publisherId = publisherId
dbUser.publisherId = publisherId dbUser.publisherId = publisherId
DbUser.save(dbUser) await DbUser.save(dbUser)
} }
context.setHeaders.push({ context.setHeaders.push({
@ -184,8 +188,8 @@ export class UserResolver {
} }
@Authorized([RIGHTS.LOGOUT]) @Authorized([RIGHTS.LOGOUT])
@Mutation(() => String) @Mutation(() => Boolean)
async logout(): Promise<boolean> { logout(): boolean {
// TODO: Event still missing here!! // TODO: Event still missing here!!
// TODO: We dont need this anymore, but might need this in the future in oder to invalidate a valid JWT-Token. // TODO: We dont need this anymore, but might need this in the future in oder to invalidate a valid JWT-Token.
// Furthermore this hook can be useful for tracking user behaviour (did he logout or not? Warn him if he didn't on next login) // Furthermore this hook can be useful for tracking user behaviour (did he logout or not? Warn him if he didn't on next login)
@ -202,7 +206,7 @@ export class UserResolver {
@Mutation(() => User) @Mutation(() => User)
async createUser( async createUser(
@Args() @Args()
{ email, firstName, lastName, language, publisherId, redeemCode = null }: CreateUserArgs, { email, firstName, lastName, language, publisherId = null, redeemCode = null }: CreateUserArgs,
): Promise<User> { ): Promise<User> {
logger.addContext('user', 'unknown') logger.addContext('user', 'unknown')
logger.info( logger.info(
@ -239,7 +243,7 @@ export class UserResolver {
user.lastName = lastName user.lastName = lastName
user.language = language user.language = language
user.publisherId = publisherId user.publisherId = publisherId
logger.debug('partly faked user=' + user) logger.debug('partly faked user', user)
const emailSent = await sendAccountMultiRegistrationEmail({ const emailSent = await sendAccountMultiRegistrationEmail({
firstName: foundUser.firstName, // this is the real name of the email owner, but just "firstName" would be the name of the new registrant which shall not be passed to the outside firstName: foundUser.firstName, // this is the real name of the email owner, but just "firstName" would be the name of the new registrant which shall not be passed to the outside
@ -272,22 +276,22 @@ export class UserResolver {
dbUser.firstName = firstName dbUser.firstName = firstName
dbUser.lastName = lastName dbUser.lastName = lastName
dbUser.language = language dbUser.language = language
dbUser.publisherId = publisherId dbUser.publisherId = publisherId || 0
dbUser.passwordEncryptionType = PasswordEncryptionType.NO_PASSWORD dbUser.passwordEncryptionType = PasswordEncryptionType.NO_PASSWORD
logger.debug('new dbUser=' + dbUser) logger.debug('new dbUser', dbUser)
if (redeemCode) { if (redeemCode) {
if (redeemCode.match(/^CL-/)) { if (redeemCode.match(/^CL-/)) {
const contributionLink = await DbContributionLink.findOne({ const contributionLink = await DbContributionLink.findOne({
code: redeemCode.replace('CL-', ''), code: redeemCode.replace('CL-', ''),
}) })
logger.info('redeemCode found contributionLink=' + contributionLink) logger.info('redeemCode found contributionLink', contributionLink)
if (contributionLink) { if (contributionLink) {
dbUser.contributionLinkId = contributionLink.id dbUser.contributionLinkId = contributionLink.id
eventRegisterRedeem.contributionId = contributionLink.id eventRegisterRedeem.contributionId = contributionLink.id
} }
} else { } else {
const transactionLink = await DbTransactionLink.findOne({ code: redeemCode }) const transactionLink = await DbTransactionLink.findOne({ code: redeemCode })
logger.info('redeemCode found transactionLink=' + transactionLink) logger.info('redeemCode found transactionLink', transactionLink)
if (transactionLink) { if (transactionLink) {
dbUser.referrerId = transactionLink.userId dbUser.referrerId = transactionLink.userId
eventRegisterRedeem.transactionId = transactionLink.id eventRegisterRedeem.transactionId = transactionLink.id
@ -654,7 +658,7 @@ export class UserResolver {
return 'user.' + fieldName return 'user.' + fieldName
}), }),
searchText, searchText,
filters, filters || null,
currentPage, currentPage,
pageSize, pageSize,
) )

View File

@ -1,3 +1,7 @@
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
/* eslint-disable @typescript-eslint/no-unsafe-call */
/* eslint-disable @typescript-eslint/restrict-template-expressions */
/* eslint-disable @typescript-eslint/no-explicit-any */ /* eslint-disable @typescript-eslint/no-explicit-any */
import Decimal from 'decimal.js-light' import Decimal from 'decimal.js-light'
@ -79,7 +83,7 @@ describe('semaphore', () => {
maxPerCycle: 1, maxPerCycle: 1,
}, },
}) })
contributionLinkCode = 'CL-' + contributionLink.code contributionLinkCode = `CL-${contributionLink.code}`
await mutate({ await mutate({
mutation: login, mutation: login,
variables: { email: 'bob@baumeister.de', password: 'Aa12345_' }, variables: { email: 'bob@baumeister.de', password: 'Aa12345_' },

View File

@ -1,3 +1,6 @@
/* eslint-disable @typescript-eslint/no-unsafe-call */
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
/* eslint-disable @typescript-eslint/no-explicit-any */ /* eslint-disable @typescript-eslint/no-explicit-any */
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ /* eslint-disable @typescript-eslint/explicit-module-boundary-types */

View File

@ -1,3 +1,5 @@
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
import LogError from '@/server/LogError' import LogError from '@/server/LogError'
import { backendLogger as logger } from '@/server/logger' import { backendLogger as logger } from '@/server/logger'
import { getConnection } from '@dbTools/typeorm' import { getConnection } from '@dbTools/typeorm'

View File

@ -17,7 +17,7 @@ async function main() {
console.log(`GraphIQL available at http://localhost:${CONFIG.PORT}`) console.log(`GraphIQL available at http://localhost:${CONFIG.PORT}`)
} }
}) })
startValidateCommunities(Number(CONFIG.FEDERATION_VALIDATE_COMMUNITY_TIMER)) void startValidateCommunities(Number(CONFIG.FEDERATION_VALIDATE_COMMUNITY_TIMER))
} }
main().catch((e) => { main().catch((e) => {

View File

@ -1,3 +1,7 @@
/* eslint-disable @typescript-eslint/no-unsafe-return */
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
/* eslint-disable @typescript-eslint/restrict-template-expressions */
import { MiddlewareFn } from 'type-graphql' import { MiddlewareFn } from 'type-graphql'
import { /* klicktippSignIn, */ getKlickTippUser } from '@/apis/KlicktippController' import { /* klicktippSignIn, */ getKlickTippUser } from '@/apis/KlicktippController'
import { KlickTipp } from '@model/KlickTipp' import { KlickTipp } from '@model/KlickTipp'

View File

@ -1,3 +1,6 @@
/* eslint-disable @typescript-eslint/no-unsafe-call */
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
import CONFIG from '@/config' import CONFIG from '@/config'
import LogError from '@/server/LogError' import LogError from '@/server/LogError'
import { backendLogger as logger } from '@/server/logger' import { backendLogger as logger } from '@/server/logger'

View File

@ -1,3 +1,6 @@
/* eslint-disable @typescript-eslint/no-unsafe-return */
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
/* eslint-disable @typescript-eslint/unbound-method */
import { ApolloServerTestClient } from 'apollo-server-testing' import { ApolloServerTestClient } from 'apollo-server-testing'
import { login, createContributionLink } from '@/seeds/graphql/mutations' import { login, createContributionLink } from '@/seeds/graphql/mutations'
import { ContributionLink } from '@model/ContributionLink' import { ContributionLink } from '@model/ContributionLink'

View File

@ -1,3 +1,7 @@
/* eslint-disable @typescript-eslint/no-unsafe-return */
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
/* eslint-disable @typescript-eslint/unbound-method */
/* eslint-disable @typescript-eslint/no-explicit-any */ /* eslint-disable @typescript-eslint/no-explicit-any */
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ /* eslint-disable @typescript-eslint/explicit-module-boundary-types */

View File

@ -1,3 +1,5 @@
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
/* eslint-disable @typescript-eslint/unbound-method */
import { ApolloServerTestClient } from 'apollo-server-testing' import { ApolloServerTestClient } from 'apollo-server-testing'
import { login, createTransactionLink } from '@/seeds/graphql/mutations' import { login, createTransactionLink } from '@/seeds/graphql/mutations'
import { TransactionLinkInterface } from '@/seeds/transactionLink/TransactionLinkInterface' import { TransactionLinkInterface } from '@/seeds/transactionLink/TransactionLinkInterface'

View File

@ -1,3 +1,5 @@
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
/* eslint-disable @typescript-eslint/unbound-method */
import { createUser, setPassword } from '@/seeds/graphql/mutations' import { createUser, setPassword } from '@/seeds/graphql/mutations'
import { User } from '@entity/User' import { User } from '@entity/User'
import { UserInterface } from '@/seeds/users/UserInterface' import { UserInterface } from '@/seeds/users/UserInterface'

View File

@ -269,7 +269,7 @@ export const denyContribution = gql`
` `
export const createContributionMessage = gql` export const createContributionMessage = gql`
mutation ($contributionId: Float!, $message: String!) { mutation ($contributionId: Int!, $message: String!) {
createContributionMessage(contributionId: $contributionId, message: $message) { createContributionMessage(contributionId: $contributionId, message: $message) {
id id
message message
@ -283,7 +283,7 @@ export const createContributionMessage = gql`
` `
export const adminCreateContributionMessage = gql` export const adminCreateContributionMessage = gql`
mutation ($contributionId: Float!, $message: String!) { mutation ($contributionId: Int!, $message: String!) {
adminCreateContributionMessage(contributionId: $contributionId, message: $message) { adminCreateContributionMessage(contributionId: $contributionId, message: $message) {
id id
message message

View File

@ -303,7 +303,7 @@ export const searchAdminUsers = gql`
` `
export const listContributionMessages = gql` export const listContributionMessages = gql`
query ($contributionId: Float!, $pageSize: Int = 25, $currentPage: Int = 1, $order: Order = ASC) { query ($contributionId: Int!, $pageSize: Int = 25, $currentPage: Int = 1, $order: Order = ASC) {
listContributionMessages( listContributionMessages(
contributionId: $contributionId contributionId: $contributionId
pageSize: $pageSize pageSize: $pageSize

View File

@ -1,3 +1,7 @@
/* eslint-disable @typescript-eslint/no-unsafe-return */
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
/* eslint-disable @typescript-eslint/no-unsafe-call */
/* eslint-disable @typescript-eslint/no-explicit-any */ /* eslint-disable @typescript-eslint/no-explicit-any */
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ /* eslint-disable @typescript-eslint/explicit-module-boundary-types */
@ -94,4 +98,4 @@ const run = async () => {
await con.close() await con.close()
} }
run() void run()

View File

@ -1,3 +1,5 @@
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
/* eslint-disable @typescript-eslint/unbound-method */
import { logger } from '@test/testSetup' import { logger } from '@test/testSetup'
import LogError from './LogError' import LogError from './LogError'

View File

@ -1,3 +1,6 @@
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
/* eslint-disable @typescript-eslint/restrict-template-expressions */
/* eslint-disable @typescript-eslint/unbound-method */
import 'reflect-metadata' import 'reflect-metadata'
import { ApolloServer } from 'apollo-server-express' import { ApolloServer } from 'apollo-server-express'
@ -71,6 +74,7 @@ const createServer = async (
app.use(localization.init) app.use(localization.init)
// Elopage Webhook // Elopage Webhook
// eslint-disable-next-line @typescript-eslint/no-misused-promises
app.post('/hook/elopage/' + CONFIG.WEBHOOK_ELOPAGE_SECRET, elopageWebhook) app.post('/hook/elopage/' + CONFIG.WEBHOOK_ELOPAGE_SECRET, elopageWebhook)
// Apollo Server // Apollo Server

View File

@ -1,3 +1,5 @@
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
import log4js from 'log4js' import log4js from 'log4js'
import CONFIG from '@/config' import CONFIG from '@/config'

View File

@ -1,3 +1,8 @@
/* eslint-disable @typescript-eslint/no-unsafe-call */
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
/* eslint-disable @typescript-eslint/restrict-template-expressions */
/* eslint-disable @typescript-eslint/no-unsafe-return */
/* eslint-disable @typescript-eslint/no-explicit-any */ /* eslint-disable @typescript-eslint/no-explicit-any */
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ /* eslint-disable @typescript-eslint/explicit-module-boundary-types */

View File

@ -1,3 +1,4 @@
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
import { Repository, EntityRepository } from '@dbTools/typeorm' import { Repository, EntityRepository } from '@dbTools/typeorm'
import { TransactionLink as dbTransactionLink } from '@entity/TransactionLink' import { TransactionLink as dbTransactionLink } from '@entity/TransactionLink'
import Decimal from 'decimal.js-light' import Decimal from 'decimal.js-light'

View File

@ -7,7 +7,7 @@ export class UserRepository extends Repository<DbUser> {
async findBySearchCriteriaPagedFiltered( async findBySearchCriteriaPagedFiltered(
select: string[], select: string[],
searchCriteria: string, searchCriteria: string,
filters: SearchUsersFilters, filters: SearchUsersFilters | null,
currentPage: number, currentPage: number,
pageSize: number, pageSize: number,
): Promise<[DbUser[], number]> { ): Promise<[DbUser[], number]> {

View File

@ -10,13 +10,13 @@ describe('utils/decay', () => {
// TODO: toString() was required, we could not compare two decimals // TODO: toString() was required, we could not compare two decimals
expect(decayFormula(amount, seconds).toString()).toBe('0.999999978035040489732012') expect(decayFormula(amount, seconds).toString()).toBe('0.999999978035040489732012')
}) })
it('has correct backward calculation', async () => { it('has correct backward calculation', () => {
const amount = new Decimal(1.0) const amount = new Decimal(1.0)
const seconds = -1 const seconds = -1
expect(decayFormula(amount, seconds).toString()).toBe('1.000000021964959992727444') expect(decayFormula(amount, seconds).toString()).toBe('1.000000021964959992727444')
}) })
// we get pretty close, but not exact here, skipping // we get pretty close, but not exact here, skipping
it.skip('has correct forward calculation', async () => { it.skip('has correct forward calculation', () => {
const amount = new Decimal(1.0).div( const amount = new Decimal(1.0).div(
new Decimal('0.99999997803504048973201202316767079413460520837376'), new Decimal('0.99999997803504048973201202316767079413460520837376'),
) )
@ -24,7 +24,7 @@ describe('utils/decay', () => {
expect(decayFormula(amount, seconds).toString()).toBe('1.0') expect(decayFormula(amount, seconds).toString()).toBe('1.0')
}) })
}) })
it('has base 0.99999997802044727', async () => { it('has base 0.99999997802044727', () => {
const now = new Date() const now = new Date()
now.setSeconds(1) now.setSeconds(1)
const oneSecondAgo = new Date(now.getTime()) const oneSecondAgo = new Date(now.getTime())
@ -34,7 +34,7 @@ describe('utils/decay', () => {
) )
}) })
it('returns input amount when from and to is the same', async () => { it('returns input amount when from and to is the same', () => {
const now = new Date() const now = new Date()
expect(calculateDecay(new Decimal(100.0), now, now).balance.toString()).toBe('100') expect(calculateDecay(new Decimal(100.0), now, now).balance.toString()).toBe('100')
}) })

View File

@ -26,4 +26,4 @@ export async function retrieveNotRegisteredEmails(): Promise<string[]> {
return notRegisteredUser return notRegisteredUser
} }
retrieveNotRegisteredEmails() void retrieveNotRegisteredEmails()

View File

@ -1,3 +1,7 @@
/* eslint-disable @typescript-eslint/no-unsafe-call */
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
/* eslint-disable @typescript-eslint/restrict-template-expressions */
/* eslint-disable @typescript-eslint/no-explicit-any */ /* eslint-disable @typescript-eslint/no-explicit-any */
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ /* eslint-disable @typescript-eslint/explicit-module-boundary-types */
/* /*

View File

@ -1,3 +1,6 @@
/* eslint-disable @typescript-eslint/no-unsafe-call */
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
/* eslint-disable @typescript-eslint/restrict-template-expressions */
/* eslint-disable @typescript-eslint/no-empty-interface */ /* eslint-disable @typescript-eslint/no-empty-interface */
import Decimal from 'decimal.js-light' import Decimal from 'decimal.js-light'

View File

@ -1,3 +1,8 @@
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
/* eslint-disable @typescript-eslint/no-unsafe-return */
/* eslint-disable @typescript-eslint/no-unsafe-call */
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
/* eslint-disable @typescript-eslint/unbound-method */
/* eslint-disable @typescript-eslint/no-explicit-any */ /* eslint-disable @typescript-eslint/no-explicit-any */
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ /* eslint-disable @typescript-eslint/explicit-module-boundary-types */

View File

@ -1,3 +1,5 @@
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
/* eslint-disable @typescript-eslint/no-unsafe-return */
import CONFIG from '@/config' import CONFIG from '@/config'
import { backendLogger as logger } from '@/server/logger' import { backendLogger as logger } from '@/server/logger'
import { i18n } from '@/server/localization' import { i18n } from '@/server/localization'

View File

@ -1014,6 +1014,11 @@
resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.9.tgz#97edc9037ea0c38585320b28964dde3b39e4660d" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.9.tgz#97edc9037ea0c38585320b28964dde3b39e4660d"
integrity sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ== integrity sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==
"@types/json-schema@^7.0.9":
version "7.0.11"
resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3"
integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==
"@types/json5@^0.0.29": "@types/json5@^0.0.29":
version "0.0.29" version "0.0.29"
resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee"
@ -1123,6 +1128,11 @@
resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.4.tgz#cd667bcfdd025213aafb7ca5915a932590acdcdc" resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.4.tgz#cd667bcfdd025213aafb7ca5915a932590acdcdc"
integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==
"@types/semver@^7.3.12":
version "7.3.13"
resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.3.13.tgz#da4bfd73f49bd541d28920ab0e2bf0ee80f71c91"
integrity sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==
"@types/semver@^7.3.3": "@types/semver@^7.3.3":
version "7.3.8" version "7.3.8"
resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.3.8.tgz#508a27995498d7586dcecd77c25e289bfaf90c59" resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.3.8.tgz#508a27995498d7586dcecd77c25e289bfaf90c59"
@ -1196,6 +1206,13 @@
eslint-scope "^5.1.1" eslint-scope "^5.1.1"
eslint-utils "^3.0.0" eslint-utils "^3.0.0"
"@typescript-eslint/experimental-utils@^5.9.0":
version "5.53.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-5.53.0.tgz#e249e3a47ace290ea3d83a5a08c8d90cd7fe2a53"
integrity sha512-4SklZEwRn0jqkhtW+pPZpbKFXprwGneBndRM0TGzJu/LWdb9QV2hBgFIVU9AREo02BzqFvyG/ypd+xAW5YGhXw==
dependencies:
"@typescript-eslint/utils" "5.53.0"
"@typescript-eslint/parser@^4.28.0": "@typescript-eslint/parser@^4.28.0":
version "4.33.0" version "4.33.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.33.0.tgz#dfe797570d9694e560528d18eecad86c8c744899" resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.33.0.tgz#dfe797570d9694e560528d18eecad86c8c744899"
@ -1214,11 +1231,24 @@
"@typescript-eslint/types" "4.33.0" "@typescript-eslint/types" "4.33.0"
"@typescript-eslint/visitor-keys" "4.33.0" "@typescript-eslint/visitor-keys" "4.33.0"
"@typescript-eslint/scope-manager@5.53.0":
version "5.53.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.53.0.tgz#42b54f280e33c82939275a42649701024f3fafef"
integrity sha512-Opy3dqNsp/9kBBeCPhkCNR7fmdSQqA+47r21hr9a14Bx0xnkElEQmhoHga+VoaoQ6uDHjDKmQPIYcUcKJifS7w==
dependencies:
"@typescript-eslint/types" "5.53.0"
"@typescript-eslint/visitor-keys" "5.53.0"
"@typescript-eslint/types@4.33.0": "@typescript-eslint/types@4.33.0":
version "4.33.0" version "4.33.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.33.0.tgz#a1e59036a3b53ae8430ceebf2a919dc7f9af6d72" resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.33.0.tgz#a1e59036a3b53ae8430ceebf2a919dc7f9af6d72"
integrity sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ== integrity sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ==
"@typescript-eslint/types@5.53.0":
version "5.53.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.53.0.tgz#f79eca62b97e518ee124086a21a24f3be267026f"
integrity sha512-5kcDL9ZUIP756K6+QOAfPkigJmCPHcLN7Zjdz76lQWWDdzfOhZDTj1irs6gPBKiXx5/6O3L0+AvupAut3z7D2A==
"@typescript-eslint/typescript-estree@4.33.0": "@typescript-eslint/typescript-estree@4.33.0":
version "4.33.0" version "4.33.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.33.0.tgz#0dfb51c2908f68c5c08d82aefeaf166a17c24609" resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.33.0.tgz#0dfb51c2908f68c5c08d82aefeaf166a17c24609"
@ -1232,6 +1262,33 @@
semver "^7.3.5" semver "^7.3.5"
tsutils "^3.21.0" tsutils "^3.21.0"
"@typescript-eslint/typescript-estree@5.53.0":
version "5.53.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.53.0.tgz#bc651dc28cf18ab248ecd18a4c886c744aebd690"
integrity sha512-eKmipH7QyScpHSkhbptBBYh9v8FxtngLquq292YTEQ1pxVs39yFBlLC1xeIZcPPz1RWGqb7YgERJRGkjw8ZV7w==
dependencies:
"@typescript-eslint/types" "5.53.0"
"@typescript-eslint/visitor-keys" "5.53.0"
debug "^4.3.4"
globby "^11.1.0"
is-glob "^4.0.3"
semver "^7.3.7"
tsutils "^3.21.0"
"@typescript-eslint/utils@5.53.0":
version "5.53.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.53.0.tgz#e55eaad9d6fffa120575ffaa530c7e802f13bce8"
integrity sha512-VUOOtPv27UNWLxFwQK/8+7kvxVC+hPHNsJjzlJyotlaHjLSIgOCKj9I0DBUjwOOA64qjBwx5afAPjksqOxMO0g==
dependencies:
"@types/json-schema" "^7.0.9"
"@types/semver" "^7.3.12"
"@typescript-eslint/scope-manager" "5.53.0"
"@typescript-eslint/types" "5.53.0"
"@typescript-eslint/typescript-estree" "5.53.0"
eslint-scope "^5.1.1"
eslint-utils "^3.0.0"
semver "^7.3.7"
"@typescript-eslint/visitor-keys@4.33.0": "@typescript-eslint/visitor-keys@4.33.0":
version "4.33.0" version "4.33.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.33.0.tgz#2a22f77a41604289b7a186586e9ec48ca92ef1dd" resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.33.0.tgz#2a22f77a41604289b7a186586e9ec48ca92ef1dd"
@ -1240,6 +1297,14 @@
"@typescript-eslint/types" "4.33.0" "@typescript-eslint/types" "4.33.0"
eslint-visitor-keys "^2.0.0" eslint-visitor-keys "^2.0.0"
"@typescript-eslint/visitor-keys@5.53.0":
version "5.53.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.53.0.tgz#8a5126623937cdd909c30d8fa72f79fa56cc1a9f"
integrity sha512-JqNLnX3leaHFZEN0gCh81sIvgrp/2GOACZNgO4+Tkf64u51kTpAyWFOY8XHx8XuXr3N2C9zgPPHtcpMg6z1g0w==
dependencies:
"@typescript-eslint/types" "5.53.0"
eslint-visitor-keys "^3.3.0"
"@wry/equality@^0.1.2": "@wry/equality@^0.1.2":
version "0.1.11" version "0.1.11"
resolved "https://registry.yarnpkg.com/@wry/equality/-/equality-0.1.11.tgz#35cb156e4a96695aa81a9ecc4d03787bc17f1790" resolved "https://registry.yarnpkg.com/@wry/equality/-/equality-0.1.11.tgz#35cb156e4a96695aa81a9ecc4d03787bc17f1790"
@ -2673,6 +2738,13 @@ eslint-plugin-promise@^5.1.0:
resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-5.1.0.tgz#fb2188fb734e4557993733b41aa1a688f46c6f24" resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-5.1.0.tgz#fb2188fb734e4557993733b41aa1a688f46c6f24"
integrity sha512-NGmI6BH5L12pl7ScQHbg7tvtk4wPxxj8yPHH47NvSmMtFneC077PSeY3huFj06ZWZvtbfxSPt3RuOQD5XcR4ng== integrity sha512-NGmI6BH5L12pl7ScQHbg7tvtk4wPxxj8yPHH47NvSmMtFneC077PSeY3huFj06ZWZvtbfxSPt3RuOQD5XcR4ng==
eslint-plugin-type-graphql@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/eslint-plugin-type-graphql/-/eslint-plugin-type-graphql-1.0.0.tgz#d348560ed628d6ca1dfcea35a02891432daafe6b"
integrity sha512-l6Yjcylavs88mcRZ3znwRuu8R9a8eoLdSaMGfycaMragf+VMxiz3kwjPmYz8AZxqqp8gvM7/2EGJqkkjM4NKIQ==
dependencies:
"@typescript-eslint/experimental-utils" "^5.9.0"
eslint-scope@^5.1.1: eslint-scope@^5.1.1:
version "5.1.1" version "5.1.1"
resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c"
@ -2705,6 +2777,11 @@ eslint-visitor-keys@^2.0.0:
resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303"
integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==
eslint-visitor-keys@^3.3.0:
version "3.3.0"
resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826"
integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==
eslint@^7.29.0: eslint@^7.29.0:
version "7.32.0" version "7.32.0"
resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.32.0.tgz#c6d328a14be3fb08c8d1d21e12c02fdb7a2a812d" resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.32.0.tgz#c6d328a14be3fb08c8d1d21e12c02fdb7a2a812d"
@ -2916,6 +2993,17 @@ fast-glob@^3.1.1:
merge2 "^1.3.0" merge2 "^1.3.0"
micromatch "^4.0.4" micromatch "^4.0.4"
fast-glob@^3.2.9:
version "3.2.12"
resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80"
integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==
dependencies:
"@nodelib/fs.stat" "^2.0.2"
"@nodelib/fs.walk" "^1.2.3"
glob-parent "^5.1.2"
merge2 "^1.3.0"
micromatch "^4.0.4"
fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0: fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0:
version "2.1.0" version "2.1.0"
resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633"
@ -3197,6 +3285,18 @@ globby@^11.0.3:
merge2 "^1.3.0" merge2 "^1.3.0"
slash "^3.0.0" slash "^3.0.0"
globby@^11.1.0:
version "11.1.0"
resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b"
integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==
dependencies:
array-union "^2.1.0"
dir-glob "^3.0.1"
fast-glob "^3.2.9"
ignore "^5.2.0"
merge2 "^1.4.1"
slash "^3.0.0"
got@^9.6.0: got@^9.6.0:
version "9.6.0" version "9.6.0"
resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85" resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85"
@ -3505,6 +3605,11 @@ ignore@^5.1.1, ignore@^5.1.4, ignore@^5.1.8:
resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57" resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57"
integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw== integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==
ignore@^5.2.0:
version "5.2.4"
resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324"
integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==
import-fresh@^3.0.0, import-fresh@^3.2.1: import-fresh@^3.0.0, import-fresh@^3.2.1:
version "3.3.0" version "3.3.0"
resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b"
@ -3668,7 +3773,7 @@ is-generator-fn@^2.0.0:
resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118"
integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==
is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1:
version "4.0.3" version "4.0.3"
resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084"
integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==
@ -4690,7 +4795,7 @@ merge-stream@^2.0.0:
resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60"
integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==
merge2@^1.3.0: merge2@^1.3.0, merge2@^1.4.1:
version "1.4.1" version "1.4.1"
resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae"
integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==
@ -5760,6 +5865,13 @@ semver@^6.0.0, semver@^6.1.0, semver@^6.2.0, semver@^6.3.0:
resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
semver@^7.3.7:
version "7.3.8"
resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798"
integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==
dependencies:
lru-cache "^6.0.0"
send@0.17.1: send@0.17.1:
version "0.17.1" version "0.17.1"
resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8"

View File

@ -1,6 +1,6 @@
{ {
"name": "gradido-database", "name": "gradido-database",
"version": "1.19.0", "version": "1.19.1",
"description": "Gradido Database Tool to execute database migrations", "description": "Gradido Database Tool to execute database migrations",
"main": "src/index.ts", "main": "src/index.ts",
"repository": "https://github.com/gradido/gradido/database", "repository": "https://github.com/gradido/gradido/database",

View File

@ -1,6 +1,6 @@
{ {
"name": "bootstrap-vue-gradido-wallet", "name": "bootstrap-vue-gradido-wallet",
"version": "1.19.0", "version": "1.19.1",
"private": true, "private": true,
"scripts": { "scripts": {
"start": "node run/server.js", "start": "node run/server.js",

View File

@ -3,180 +3,20 @@
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" <svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 64 64" style="enable-background:new 0 0 64 64;" xml:space="preserve"> viewBox="0 0 64 64" style="enable-background:new 0 0 64 64;" xml:space="preserve">
<style type="text/css"> <style type="text/css">
.st0{display:none;}
.st1{display:inline;enable-background:new ;}
.st2{fill:#72778F;}
.st3{display:inline;opacity:0.6;}
.st4{enable-background:new ;}
.st5{fill:#CD5656;}
.st6{fill:#047006;} .st6{fill:#047006;}
.st7{fill:#FFFFFF;}
.st8{display:inline;}
.st9{clip-path:url(#SVGID_00000178163426027821014280000005828283979416336312_);}
</style> </style>
<g id="Transaktionen" class="st0"> <g id="info" fill-rule="evenodd" class="st6" transform="translate(0 -0.001)">
<g class="st1"> <!-- d="
<path class="st2" d="M6.74,16.53L31.37,5.35c0.34-0.16,0.73-0.24,1.13-0.24c0.4,0,0.78,0.09,1.12,0.24l24.63,11.18 CIRCLE:
c1.75,0.79,1.75,3.44,0,4.23L33.62,31.94c-0.72,0.33-1.53,0.33-2.25,0L6.74,20.76C4.99,19.97,4.99,17.32,6.74,16.53z M58.26,34.33 M (CX - R), CY
L33.62,45.5c-0.72,0.33-1.53,0.33-2.25,0L6.74,34.33c-1.75-0.79-1.75-3.44,0-4.23l6.14-2.78l17.09,7.75 a R,R 0 1,0 (R * 2),0
c0.8,0.36,1.65,0.55,2.52,0.55c0.87,0,1.72-0.18,2.52-0.55l17.09-7.75l6.14,2.78C60.01,30.89,60.01,33.54,58.26,34.33z a R,R 0 1,0 -(R * 2),0
M58.26,47.85L33.62,59.01c-0.72,0.33-1.53,0.33-2.25,0L6.74,47.85c-1.75-0.79-1.75-3.44,0-4.23l6.12-2.77l17.12,7.76 RECTANGLE
c0.8,0.36,1.65,0.55,2.52,0.55c0.87,0,1.72-0.18,2.52-0.55l17.12-7.76l6.12,2.77C60.01,44.41,60.01,47.05,58.26,47.85z"/> MX YhHEIGHTvWIDTHh-HEIGHTz
" -->
<path d="M0,32 a32,32 0 1,0 64,0 a32,32 0 1,0 -64,0
M28 28h8v24h-8z
M28,20 a4,4 0 1,0 8,0 a4,4 0 1,0 -8,0"
fill="#72778F" fill-rule="evenodd" />
</g> </g>
</g>
<g id="mein_x5F_profil" class="st0">
<g class="st1">
<path class="st2" d="M56.7,51.31v4.64c0,2.96-2.4,5.35-5.35,5.35H12.11c-2.95,0-5.35-2.4-5.35-5.35v-4.64
c0-8.27,6.71-14.98,14.98-14.98h1.86c2.49,1.14,5.23,1.78,8.13,1.78s5.65-0.65,8.13-1.78h1.86C49.99,36.33,56.7,43.04,56.7,51.31z
M17.46,18.49c0-7.88,6.39-14.27,14.27-14.27S46,10.61,46,18.49s-6.39,14.27-14.27,14.27S17.46,26.37,17.46,18.49z"/>
</g>
</g>
<g id="Top_Stories" class="st0">
<g class="st1">
<path class="st2" d="M64,14.86v34.67c0,2.95-2.39,5.33-5.33,5.33H6.22C2.79,54.87,0,52.08,0,48.64V18.42
c0-1.47,1.19-2.67,2.67-2.67h4.44v-0.89c0-1.47,1.19-2.67,2.67-2.67h51.56C62.81,12.2,64,13.39,64,14.86z M7.11,48.64V21.09H5.33
v27.56c0,0.49,0.4,0.89,0.89,0.89C6.71,49.53,7.11,49.13,7.11,48.64z M56.89,25.09v-4.44c0-0.74-0.6-1.33-1.33-1.33h-40
c-0.74,0-1.33,0.6-1.33,1.33v4.44c0,0.74,0.6,1.33,1.33,1.33h40C56.29,26.42,56.89,25.82,56.89,25.09z M33.78,35.75v-0.89
c0-0.74-0.6-1.33-1.33-1.33H15.56c-0.74,0-1.33,0.6-1.33,1.33v0.89c0,0.74,0.6,1.33,1.33,1.33h16.89
C33.18,37.09,33.78,36.49,33.78,35.75z M33.78,46.42v-0.89c0-0.74-0.6-1.33-1.33-1.33H15.56c-0.74,0-1.33,0.6-1.33,1.33v0.89
c0,0.74,0.6,1.33,1.33,1.33h16.89C33.18,47.75,33.78,47.16,33.78,46.42z M56.89,35.75v-0.89c0-0.74-0.6-1.33-1.33-1.33H38.67
c-0.74,0-1.33,0.6-1.33,1.33v0.89c0,0.74,0.6,1.33,1.33,1.33h16.89C56.29,37.09,56.89,36.49,56.89,35.75z M56.89,46.42v-0.89
c0-0.74-0.6-1.33-1.33-1.33H38.67c-0.74,0-1.33,0.6-1.33,1.33v0.89c0,0.74,0.6,1.33,1.33,1.33h16.89
C56.29,47.75,56.89,47.16,56.89,46.42z"/>
</g>
</g>
<g id="settings" class="st0">
<g id="Settings" transform="translate(1)" class="st3">
<g class="st4">
<path class="st2" d="M53,20.34c-1.17,0.82-2.79,0.54-3.61-0.63c-4.31-6.14-11.36-9.87-18.86-9.98
c-6.09-0.09-11.77,2.17-15.95,6.36c-4.01,4.01-6.17,9.34-6.08,15.02l-0.02,2.56c-0.04,1.4-1.19,2.52-2.59,2.52
c-0.03,0-0.05,0-0.08,0c-1.43-0.04-2.56-1.24-2.51-2.67l0.01-2.32C3.2,24.09,5.9,17.43,10.9,12.41
c5.19-5.19,12.16-7.97,19.7-7.88c9.16,0.14,17.77,4.69,23.03,12.19C54.45,17.89,54.17,19.51,53,20.34z M19.29,23.79
c-2.03,2.49-3.08,5.52-3.02,8.75c0.07,4.39-0.29,8.8-1.07,13.1c-0.09,0.49-0.84,2.47-3.01,2.09c-1.41-0.26-2.34-1.6-2.09-3.01
c0.72-3.97,1.05-8.04,0.98-12.1c-0.07-4.4,1.42-8.7,4.19-12.1c0.91-1.11,2.53-1.28,3.65-0.38
C20.02,21.04,20.19,22.67,19.29,23.79z M42.2,33.37c0.08,5.5-0.32,11.03-1.22,16.43c-0.08,0.5-0.82,2.49-2.98,2.14
c-1.41-0.24-2.37-1.57-2.13-2.98c0.84-5.1,1.23-10.32,1.15-15.51c-0.05-3.25-2.84-5.94-6.22-5.99c-3.73-0.01-5.93,2.85-5.88,5.65
c0.09,5.56-0.44,11.12-1.55,16.53c-0.29,1.4-1.65,2.3-3.06,2.01c-1.4-0.29-2.3-1.66-2.01-3.06c1.04-5.04,1.52-10.22,1.44-15.4
c-0.09-5.83,4.53-10.93,11.14-10.92C37.02,22.36,42.11,27.34,42.2,33.37z M50.85,33.04c0.01,0.53,0.02,0.92,0.02,1.45
c0,3.89-0.22,7.72-0.65,11.49c-0.12,1-1.07,2.49-2.87,2.28c-1.42-0.16-2.44-1.45-2.28-2.87c0.46-4.05,0.67-8.18,0.6-12.28
c-0.12-7.89-6.85-14.41-15-14.54c-1.24-0.01-2.48,0.11-3.67,0.4c-1.39,0.32-2.79-0.53-3.12-1.93s0.53-2.79,1.93-3.12
c1.61-0.38,3.28-0.58,4.95-0.54C41.66,13.57,50.68,22.38,50.85,33.04z M33.55,33.7c0.17,10.7-1.72,19.08-3.18,24.25
c-0.32,1.15-1.36,1.89-2.49,1.89c-2.27,0-2.79-2.24-2.5-3.29c2.11-7.52,3.12-15.05,2.99-22.85c0-1.43,1.16-2.59,2.59-2.59
C32.39,31.1,33.55,32.27,33.55,33.7z M58.6,34.34c-0.01,1.42-1.17,2.57-2.59,2.57h-0.02c-1.43-0.01-2.58-1.18-2.57-2.62
c0.02-2.61,0-4.34-0.51-6.65c-0.31-1.4,0.58-2.78,1.97-3.09c1.41-0.32,2.78,0.58,3.09,1.97C58.64,29.57,58.62,31.94,58.6,34.34z"
/>
</g>
</g>
</g>
<g id="Senden" class="st0">
<g class="st1">
<path class="st2" d="M64,12.24v38.4c0,1.77-1.43,3.2-3.2,3.2H3.2c-1.77,0-3.2-1.43-3.2-3.2v-38.4c0-1.77,1.43-3.2,3.2-3.2h57.6
C62.57,9.04,64,10.47,64,12.24z M21.87,34.12c0-2-1.3-3.78-3.16-4.34l-4.5-1.35c-0.52-0.15-0.88-0.68-0.88-1.27
c0-0.73,0.53-1.32,1.18-1.32h2.81c0.46,0,0.9,0.13,1.28,0.37c0.32,0.2,0.74,0.19,1.01-0.07l1.18-1.12
c0.35-0.34,0.33-0.92-0.06-1.21c-0.91-0.68-2.01-1.08-3.14-1.13v-1.63c0-0.44-0.36-0.8-0.8-0.8h-1.6c-0.44,0-0.8,0.36-0.8,0.8
v1.61c-2.36,0.06-4.27,2.06-4.27,4.51c0,2,1.3,3.78,3.16,4.34l4.5,1.35c0.52,0.15,0.88,0.68,0.88,1.27c0,0.73-0.53,1.32-1.18,1.32
h-2.81c-0.46,0-0.9-0.13-1.28-0.37c-0.32-0.2-0.74-0.19-1.01,0.07l-1.18,1.12c-0.35,0.34-0.33,0.92,0.06,1.21
c0.91,0.68,2.01,1.08,3.14,1.14v1.63c0,0.44,0.36,0.8,0.8,0.8h1.6c0.44,0,0.8-0.36,0.8-0.8v-1.61
C19.96,38.57,21.87,36.58,21.87,34.12z M57.6,25.84c0-0.44-0.36-0.8-0.8-0.8H29.6c-0.44,0-0.8,0.36-0.8,0.8v1.6
c0,0.44,0.36,0.8,0.8,0.8h27.2c0.44,0,0.8-0.36,0.8-0.8V25.84z M41.6,35.44c0-0.44-0.36-0.8-0.8-0.8H29.6
c-0.44,0-0.8,0.36-0.8,0.8v1.6c0,0.44,0.36,0.8,0.8,0.8h11.2c0.44,0,0.8-0.36,0.8-0.8V35.44z M57.6,35.44c0-0.44-0.36-0.8-0.8-0.8
h-8c-0.44,0-0.8,0.36-0.8,0.8v1.6c0,0.44,0.36,0.8,0.8,0.8h8c0.44,0,0.8-0.36,0.8-0.8V35.44z"/>
</g>
</g>
<g id="logout" class="st0">
<g class="st1">
<path class="st5" d="M22.86,56.38H12.19C5.46,56.38,0,50.92,0,44.19V19.81C0,13.08,5.46,7.62,12.19,7.62h10.67
c0.84,0,1.52,0.69,1.52,1.52v5.08c0,0.84-0.69,1.52-1.52,1.52H12.19c-2.25,0-4.06,1.82-4.06,4.06v24.38
c0,2.25,1.82,4.06,4.06,4.06h10.67c0.84,0,1.52,0.69,1.52,1.52v5.08C24.38,55.69,23.7,56.38,22.86,56.38z M41.78,55.49
c-1.9,1.9-5.21,0.57-5.21-2.16V41.14H19.3c-1.69,0-3.05-1.36-3.05-3.05V25.9c0-1.69,1.36-3.05,3.05-3.05h17.27V10.66
c0-2.72,3.29-4.06,5.21-2.16l21.33,21.33c1.18,1.19,1.18,3.12,0,4.32L41.78,55.49z"/>
</g>
</g>
<g id="info">
<g id="Infobutton" transform="translate(0 -0.001)">
<circle id="Ellipse_4" class="st6" cx="32" cy="32" r="32"/>
<rect id="Rechteck_49" x="28" y="28" class="st7" width="8" height="24"/>
<circle id="Ellipse_5" class="st7" cx="32" cy="20" r="4"/>
</g>
</g>
<g id="Home" class="st0">
<g id="Haus" transform="translate(-319.046 -300.603)" class="st8">
<path id="Pfad_9173" class="st2" d="M356.12,358.2v-15.2h-10.16v14.91c-0.37,0.12-0.75,0.21-1.13,0.26c-4.54,0-9.07,0.04-13.61,0
c-2.24-0.02-3.13-0.92-3.14-3.14c-0.03-5.84-0.03-11.69,0.03-17.53c0.02-0.72,0.32-1.41,0.83-1.92
c7.28-6.08,14.61-12.1,22.02-18.21c0.51,0.38,1.01,0.71,1.47,1.09c6.69,5.5,13.35,11.03,20.07,16.5c1.01,0.7,1.58,1.88,1.52,3.1
c-0.09,5.5-0.03,11-0.04,16.5c0,2.79-0.78,3.6-3.5,3.61C365.8,358.21,361.14,358.2,356.12,358.2z"/>
<path id="Pfad_9174" class="st2" d="M351,313.85c-8.82,7.36-17.46,14.59-26.15,21.76c-0.76,0.64-2.31,1.49-2.69,1.2
c-1.26-1.03-2.31-2.29-3.09-3.72c-0.19-0.32,0.7-1.5,1.32-2.02c8.63-7.25,17.29-14.48,25.97-21.67c0.47-0.4,0.94-0.8,1.43-1.18
c1.88-1.68,4.73-1.64,6.58,0.08c3.02,2.47,6,4.99,9.43,7.85c0-2.56,0.05-4.71-0.02-6.85c-0.05-1.55,0.49-2.29,2.14-2.21
c1.92,0.1,3.84,0.1,5.76,0c1.68-0.09,2.33,0.51,2.3,2.24c-0.08,4.54-0.1,9.08,0.03,13.61c0.08,1.03,0.54,2,1.28,2.73
c2.16,2.01,4.48,3.84,6.79,5.7c0.87,0.45,1.21,1.52,0.76,2.39c-0.11,0.21-0.26,0.4-0.44,0.55c-2.7,3.45-2.67,3.48-5.96,0.73
l-23.43-19.55C352.41,314.97,351.76,314.47,351,313.85z"/>
</g>
</g>
<g id="Community" class="st0">
<g class="st1">
<path class="st2" d="M9.7,42.88H3.11c-1.77,0-3.2-1.43-3.2-3.2v-3.2c0-3.53,2.87-6.4,6.4-6.4h6.4c1.76,0,3.35,0.71,4.51,1.86
C13.19,34.15,10.33,38.14,9.7,42.88z M3.11,20.48c0-3.53,2.87-6.4,6.4-6.4s6.4,2.87,6.4,6.4s-2.87,6.4-6.4,6.4
S3.11,24.01,3.11,20.48z M51.11,44.8v2.88c0,2.65-2.15,4.8-4.8,4.8h-28.8c-2.65,0-4.8-2.15-4.8-4.8V44.8
c0-6.36,5.16-11.52,11.52-11.52h0.83c2.09,1,4.39,1.6,6.85,1.6c2.46,0,4.77-0.6,6.85-1.6h0.83C45.95,33.28,51.11,38.44,51.11,44.8
z M20.71,18.88c0-6.19,5.01-11.2,11.2-11.2c6.19,0,11.2,5.01,11.2,11.2s-5.01,11.2-11.2,11.2C25.72,30.08,20.71,25.07,20.71,18.88
z M63.91,36.48v3.2c0,1.77-1.43,3.2-3.2,3.2h-6.6c-0.62-4.74-3.48-8.73-7.51-10.94c1.16-1.15,2.75-1.86,4.51-1.86h6.4
C61.04,30.08,63.91,32.95,63.91,36.48z M47.91,20.48c0-3.53,2.87-6.4,6.4-6.4c3.53,0,6.4,2.87,6.4,6.4s-2.87,6.4-6.4,6.4
C50.78,26.88,47.91,24.01,47.91,20.48z"/>
</g>
</g>
<g id="coin_x5F_icon" class="st0">
<g class="st1">
<path class="st6" d="M46.41,30.2c0,4.98-9.68,9.01-21.62,9.01S3.17,35.18,3.17,30.2s9.68-9.01,21.62-9.01S46.41,25.22,46.41,30.2z
M24.79,42.81c8.46,0,16.97-1.98,21.62-5.81v5.81c0,3.98-9.68,7.21-21.62,7.21S3.17,46.79,3.17,42.81V37
C7.82,40.83,16.34,42.81,24.79,42.81z M24.79,53.62c8.47,0,16.97-1.53,21.62-4.81v4.81c0,3.98-9.68,7.21-21.62,7.21
S3.17,57.6,3.17,53.62v-4.81C7.82,52.09,16.32,53.62,24.79,53.62z M17.59,10.38c0-3.98,9.68-7.21,21.62-7.21
s21.62,3.23,21.62,7.21s-9.68,7.21-21.62,7.21S17.59,14.35,17.59,10.38z M42.73,21.09c7.23-0.36,14.1-1.88,18.1-4.71v4.81
c0,2.74-4.58,5.12-11.34,6.34C48.5,24.86,46.06,22.7,42.73,21.09z M50.02,31.08c4.36-0.78,8.2-2.04,10.81-3.89V32
c0,2.67-4.36,4.99-10.81,6.24V31.08z"/>
</g>
</g>
<g id="Adressen" class="st0">
<g class="st8">
<defs>
<rect id="SVGID_1_" x="3.98" y="4.04" width="55.34" height="55.46"/>
</defs>
<clipPath id="SVGID_00000150784502249149970240000013189293628367867574_">
<use xlink:href="#SVGID_1_" style="overflow:visible;"/>
</clipPath>
<g id="Gruppe_4997" style="clip-path:url(#SVGID_00000150784502249149970240000013189293628367867574_);">
<path id="Pfad_9157" class="st2" d="M21.8,59.5V4.04h34.22c1.64-0.18,3.12,1,3.3,2.65c0.02,0.21,0.02,0.43,0,0.64
c0,16.29,0,32.58,0,48.88c0.17,1.65-1.02,3.12-2.67,3.29c-0.21,0.02-0.42,0.02-0.63,0H21.8 M25.72,31.78
c0.03,8.19,6.69,14.8,14.88,14.77c8.19-0.03,14.8-6.69,14.77-14.88c-0.03-8.16-6.65-14.77-14.82-14.77
C32.35,16.91,25.71,23.57,25.72,31.78C25.72,31.78,25.72,31.78,25.72,31.78"/>
<path id="Pfad_9158" class="st2" d="M9.92,54.54c0.69,0,1.33,0,1.97,0c2.19,0,3.96-1.77,3.96-3.96c0-2.18-1.77-3.95-3.96-3.96
c-0.63,0-1.27,0-1.99,0v-3.97c0.69,0,1.31,0,1.95,0c2.19,0,3.96-1.77,3.96-3.96c0-2.19-1.77-3.96-3.96-3.96
c-0.62,0-1.23,0-1.95,0v-4.95h1.8c2.19,0.11,4.05-1.57,4.16-3.76c0.11-2.19-1.57-4.05-3.76-4.16c-0.14-0.01-0.27-0.01-0.41,0
H9.89V17.9c0.69,0,1.32,0,1.96,0c2.19,0,3.96-1.77,3.96-3.96c0-2.19-1.77-3.96-3.96-3.96c0,0,0,0,0,0c-0.62,0-1.23,0-1.99,0
c0-1.27,0.07-2.55,0.21-3.81c0.28-1.24,1.38-2.12,2.65-2.11c2.32-0.02,4.65-0.02,7.03-0.02v55.39c0,0-0.05,0.06-0.08,0.06
c-2.35,0-4.69,0.05-7.04,0c-1.47-0.09-2.63-1.27-2.71-2.73C9.88,56.05,9.92,55.36,9.92,54.54"/>
<path id="Pfad_9159" class="st2" d="M8.9,15.93c-0.95,0-1.89,0-2.84,0c-1.09,0-1.98-0.89-1.98-1.98c0-1.09,0.89-1.98,1.98-1.98
c1.89,0,3.79,0,5.68,0c1.09-0.06,2.03,0.77,2.1,1.86c0.06,1.09-0.77,2.03-1.86,2.1c-0.08,0-0.16,0-0.23,0
C10.79,15.92,9.85,15.92,8.9,15.93"/>
<path id="Pfad_9160" class="st2" d="M8.95,23.85c0.93,0,1.85,0,2.77,0c1.09-0.07,2.04,0.75,2.11,1.85
c0.07,1.09-0.75,2.04-1.84,2.11c-0.08,0.01-0.15,0.01-0.23,0c-1.89,0-3.79,0-5.68,0c-1.09,0.06-2.03-0.78-2.08-1.88
s0.78-2.03,1.88-2.08c0.08,0,0.16,0,0.23,0C7.05,23.85,7.99,23.85,8.95,23.85"/>
<path id="Pfad_9161" class="st2" d="M8.95,36.72c0.95,0,1.89,0,2.84,0c1.09-0.05,2.02,0.79,2.07,1.88
c0.05,1.09-0.79,2.02-1.88,2.07c-0.05,0-0.11,0-0.16,0c-1.93,0.01-3.87,0.01-5.8,0c-1.09,0.04-2.01-0.82-2.04-1.91
s0.82-2.01,1.91-2.04c0.05,0,0.11,0,0.16,0C7.02,36.72,7.98,36.72,8.95,36.72"/>
<path id="Pfad_9162" class="st2" d="M8.92,52.57c-0.95,0-1.89,0-2.84,0c-1.09,0.11-2.06-0.69-2.16-1.78s0.69-2.06,1.78-2.16
c0.12-0.01,0.25-0.01,0.37,0c1.91,0,3.83,0,5.74,0c1.09-0.05,2.02,0.79,2.07,1.88c0.05,1.09-0.79,2.02-1.88,2.07
c-0.05,0-0.11,0-0.16,0c-0.97,0-1.93,0-2.9,0"/>
<path id="Pfad_9163" class="st2" d="M44.92,30.89c2.24-2.47,2.04-6.29-0.43-8.53c-0.03-0.03-0.06-0.06-0.1-0.09
c-2.51-2.13-6.27-1.82-8.39,0.69c-1.96,2.31-1.87,5.73,0.2,7.93c-1.91,0.43-3.56,1.62-4.58,3.3c-0.87,1.73-1.2,3.69-0.95,5.61
c-3.79-4.48-3.98-10.98-0.47-15.69c4.37-5.58,12.43-6.57,18.02-2.2s6.57,12.43,2.2,18.02l0,0c0-0.86,0.03-1.61,0-2.36
c-0.03-2.76-1.72-5.23-4.28-6.27C45.75,31.15,45.34,31.01,44.92,30.89"/>
<path id="Pfad_9164" class="st2" d="M40.6,32.87c1.29-0.08,2.59-0.07,3.88,0.03c2.27,0.38,3.94,2.33,3.97,4.62
c0.04,1.34,0.02,2.68,0,4.02c-0.02,0.23-0.14,0.45-0.32,0.6c-4.5,3.32-10.63,3.32-15.13,0.02c-0.15-0.11-0.35-0.31-0.35-0.46
c-0.07-1.63-0.03-3.25,0.11-4.87c0.36-2.34,2.38-4.07,4.75-4.05c1.04-0.02,2.06,0,3.09,0C40.6,32.8,40.6,32.84,40.6,32.87"/>
<path id="Pfad_9165" class="st2" d="M40.57,22.86c2.19,0.01,3.95,1.78,3.95,3.97c-0.01,2.19-1.78,3.95-3.97,3.95
c-2.18-0.01-3.95-1.78-3.95-3.96C36.6,24.63,38.38,22.86,40.57,22.86L40.57,22.86"/>
</g>
</g>
</g>
</svg> </svg>

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 787 B

View File

@ -25,7 +25,11 @@
</div> </div>
<div class="mt-3 font-weight-bold">{{ $t('contributionText') }}</div> <div class="mt-3 font-weight-bold">{{ $t('contributionText') }}</div>
<div class="mb-3 text-break word-break">{{ memo }}</div> <div class="mb-3 text-break word-break">{{ memo }}</div>
<div v-if="state === 'IN_PROGRESS' && !allContribution" class="text-205"> <div
v-if="state === 'IN_PROGRESS'"
class="text-205 pointer hover-font-bold"
@click="visible = !visible"
>
{{ $t('contribution.alert.answerQuestion') }} {{ $t('contribution.alert.answerQuestion') }}
</div> </div>
</b-col> </b-col>

View File

@ -105,10 +105,7 @@
</b-col> </b-col>
<b-col cols="12" md="6" lg="6" class="text-lg-right"> <b-col cols="12" md="6" lg="6" class="text-lg-right">
<b-button block type="submit" variant="gradido"> <b-button block type="submit" variant="gradido">
<span v-if="radioSelected === sendTypes.send">{{ $t('form.check_now') }}</span> {{ $t('form.check_now') }}
<span v-if="radioSelected === sendTypes.link">
{{ $t('form.generate_now') }}
</span>
</b-button> </b-button>
</b-col> </b-col>
</b-row> </b-row>

Some files were not shown because too many files have changed in this diff Show More