From 574906eb7602afcd75d4aef11291f6ed053feb76 Mon Sep 17 00:00:00 2001 From: elweyn Date: Tue, 24 Jan 2023 10:27:46 +0100 Subject: [PATCH 01/62] Add filterState parameter to listAllContributions query, can be a string or null and checks in the DB for the ContributionStatus. --- .../graphql/resolver/ContributionResolver.ts | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/backend/src/graphql/resolver/ContributionResolver.ts b/backend/src/graphql/resolver/ContributionResolver.ts index a71e4767e..e9c949dba 100644 --- a/backend/src/graphql/resolver/ContributionResolver.ts +++ b/backend/src/graphql/resolver/ContributionResolver.ts @@ -1,6 +1,6 @@ import Decimal from 'decimal.js-light' import { Arg, Args, Authorized, Ctx, Int, Mutation, Query, Resolver } from 'type-graphql' -import { FindOperator, IsNull, In, getConnection } from '@dbTools/typeorm' +import { FindOperator, IsNull, In, getConnection, Equal } from '@dbTools/typeorm' import { Contribution as DbContribution } from '@entity/Contribution' import { ContributionMessage } from '@entity/ContributionMessage' @@ -179,12 +179,27 @@ export class ContributionResolver { async listAllContributions( @Args() { currentPage = 1, pageSize = 5, order = Order.DESC }: Paginated, + @Arg('filterState', () => String, { nullable: true }) + filterState: string | null, ): Promise { + const where: { + contributionStatus?: FindOperator | null + } = {} + const typeStatus = Object.values(ContributionStatus) + if (filterState !== null) { + // Asked ChatGBT for explanation => filterState converted to ContributionStatus + const contributionStatus = ContributionStatus[filterState as keyof typeof ContributionStatus] + if (typeStatus.includes(contributionStatus)) { + where.contributionStatus = Equal(filterState) + } + } + const [dbContributions, count] = await getConnection() .createQueryBuilder() .select('c') .from(DbContribution, 'c') .innerJoinAndSelect('c.user', 'u') + .where(where) .orderBy('c.createdAt', order) .limit(pageSize) .offset((currentPage - 1) * pageSize) From f4c743f7b4e30118cbe35e2faec55becf117e3df Mon Sep 17 00:00:00 2001 From: elweyn Date: Tue, 24 Jan 2023 11:33:29 +0100 Subject: [PATCH 02/62] Add localization, change filterState from string to array of string. --- .../graphql/resolver/ContributionResolver.ts | 38 ++++++++++++++++--- backend/src/locales/de.json | 5 +++ backend/src/locales/en.json | 6 +++ 3 files changed, 43 insertions(+), 6 deletions(-) diff --git a/backend/src/graphql/resolver/ContributionResolver.ts b/backend/src/graphql/resolver/ContributionResolver.ts index e9c949dba..759d3b1a1 100644 --- a/backend/src/graphql/resolver/ContributionResolver.ts +++ b/backend/src/graphql/resolver/ContributionResolver.ts @@ -1,4 +1,5 @@ import Decimal from 'decimal.js-light' +import i18n from 'i18n' import { Arg, Args, Authorized, Ctx, Int, Mutation, Query, Resolver } from 'type-graphql' import { FindOperator, IsNull, In, getConnection, Equal } from '@dbTools/typeorm' @@ -179,18 +180,43 @@ export class ContributionResolver { async listAllContributions( @Args() { currentPage = 1, pageSize = 5, order = Order.DESC }: Paginated, - @Arg('filterState', () => String, { nullable: true }) - filterState: string | null, + @Arg('filterState', () => [String], { nullable: true }) + filterStates: string[] | null, + @Ctx() context: Context, ): Promise { const where: { contributionStatus?: FindOperator | null } = {} const typeStatus = Object.values(ContributionStatus) - if (filterState !== null) { + const filterStateArray = [] + const user = getUser(context) + i18n.setLocale(user.language) + if (filterStates !== null) { // Asked ChatGBT for explanation => filterState converted to ContributionStatus - const contributionStatus = ContributionStatus[filterState as keyof typeof ContributionStatus] - if (typeStatus.includes(contributionStatus)) { - where.contributionStatus = Equal(filterState) + const length = filterStates.length + let i = 0 + for (i; i < length; i++) { + const filterState = filterStates[i].toUpperCase() + logger.info('filterState', filterState) + const contributionStatus = + ContributionStatus[filterState as keyof typeof ContributionStatus] + logger.info('contributionStatus', contributionStatus) + if (!typeStatus.includes(contributionStatus)) { + logger.error( + `${i18n.__('error.contributions.wrongFilterState', { + contributionState: filterStates[i], + })}`, + ) + throw new Error( + `${i18n.__('error.contributions.wrongFilterState', { + contributionState: filterStates[i], + })}`, + ) + } + filterStateArray.push(contributionStatus) + } + if (filterStateArray.length > 0) { + where.contributionStatus = In(filterStateArray) } } diff --git a/backend/src/locales/de.json b/backend/src/locales/de.json index 38b53508b..d547fd951 100644 --- a/backend/src/locales/de.json +++ b/backend/src/locales/de.json @@ -55,6 +55,11 @@ "subject": "Gradido: {senderFirstName} {senderLastName} hat dir {transactionAmount} Gradido gesendet" } }, + "error": { + "contributions": { + "wrongFilterState": "Nicht definierter Status wurde gesendet: {contributionState}" + } + }, "general": { "decimalSeparator": ",", "imprint": "Gradido-Akademie\nInstitut für Wirtschaftsbionik\nPfarrweg 2\n74653 Künzelsau\nDeutschland", diff --git a/backend/src/locales/en.json b/backend/src/locales/en.json index ac1ad380f..f6ada3716 100644 --- a/backend/src/locales/en.json +++ b/backend/src/locales/en.json @@ -1,4 +1,5 @@ { + "contributions": {}, "emails": { "addedContributionMessage": { "commonGoodContributionMessage": "you have received a message from {senderFirstName} {senderLastName} regarding your common good contribution “{contributionMemo}”.", @@ -55,6 +56,11 @@ "subject": "Gradido: {senderFirstName} {senderLastName} has sent you {transactionAmount} Gradido" } }, + "error": { + "contributions": { + "wrongFilterState": "Send a state that isn't defined: {contributionState}" + } + }, "general": { "decimalSeparator": ".", "imprint": "Gradido-Akademie\nInstitut für Wirtschaftsbionik\nPfarrweg 2\n74653 Künzelsau\nDeutschland", From 1554a7d454957eae0fdee7b0415f8401fef4f0ea Mon Sep 17 00:00:00 2001 From: elweyn Date: Tue, 24 Jan 2023 12:04:09 +0100 Subject: [PATCH 03/62] Remove test loggings. --- backend/src/graphql/resolver/ContributionResolver.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/backend/src/graphql/resolver/ContributionResolver.ts b/backend/src/graphql/resolver/ContributionResolver.ts index 759d3b1a1..68bfddeb9 100644 --- a/backend/src/graphql/resolver/ContributionResolver.ts +++ b/backend/src/graphql/resolver/ContributionResolver.ts @@ -197,10 +197,8 @@ export class ContributionResolver { let i = 0 for (i; i < length; i++) { const filterState = filterStates[i].toUpperCase() - logger.info('filterState', filterState) const contributionStatus = ContributionStatus[filterState as keyof typeof ContributionStatus] - logger.info('contributionStatus', contributionStatus) if (!typeStatus.includes(contributionStatus)) { logger.error( `${i18n.__('error.contributions.wrongFilterState', { From d42804acfb4900c9b7914aad42e819a5db6eaa89 Mon Sep 17 00:00:00 2001 From: elweyn Date: Tue, 24 Jan 2023 12:10:53 +0100 Subject: [PATCH 04/62] Change type of filterState from string[] to ContributionStatus[]. --- .../src/graphql/resolver/ContributionResolver.ts | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/backend/src/graphql/resolver/ContributionResolver.ts b/backend/src/graphql/resolver/ContributionResolver.ts index 68bfddeb9..bc1706e0c 100644 --- a/backend/src/graphql/resolver/ContributionResolver.ts +++ b/backend/src/graphql/resolver/ContributionResolver.ts @@ -180,26 +180,23 @@ export class ContributionResolver { async listAllContributions( @Args() { currentPage = 1, pageSize = 5, order = Order.DESC }: Paginated, - @Arg('filterState', () => [String], { nullable: true }) - filterStates: string[] | null, + @Arg('filterState', () => [ContributionStatus], { nullable: true }) + filterStates: ContributionStatus[] | null, @Ctx() context: Context, ): Promise { const where: { contributionStatus?: FindOperator | null } = {} const typeStatus = Object.values(ContributionStatus) - const filterStateArray = [] const user = getUser(context) i18n.setLocale(user.language) if (filterStates !== null) { - // Asked ChatGBT for explanation => filterState converted to ContributionStatus + const filterStateArray = [] const length = filterStates.length let i = 0 for (i; i < length; i++) { - const filterState = filterStates[i].toUpperCase() - const contributionStatus = - ContributionStatus[filterState as keyof typeof ContributionStatus] - if (!typeStatus.includes(contributionStatus)) { + const filterState = filterStates[i] + if (!typeStatus.includes(filterState)) { logger.error( `${i18n.__('error.contributions.wrongFilterState', { contributionState: filterStates[i], @@ -211,7 +208,7 @@ export class ContributionResolver { })}`, ) } - filterStateArray.push(contributionStatus) + filterStateArray.push(filterState) } if (filterStateArray.length > 0) { where.contributionStatus = In(filterStateArray) From b940400e5b4e0716ed00128885fa32e95d2ce879 Mon Sep 17 00:00:00 2001 From: elweyn Date: Tue, 24 Jan 2023 14:26:43 +0100 Subject: [PATCH 05/62] Remove unused import. --- backend/src/graphql/resolver/ContributionResolver.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/graphql/resolver/ContributionResolver.ts b/backend/src/graphql/resolver/ContributionResolver.ts index bc1706e0c..148cbceb8 100644 --- a/backend/src/graphql/resolver/ContributionResolver.ts +++ b/backend/src/graphql/resolver/ContributionResolver.ts @@ -1,7 +1,7 @@ import Decimal from 'decimal.js-light' import i18n from 'i18n' import { Arg, Args, Authorized, Ctx, Int, Mutation, Query, Resolver } from 'type-graphql' -import { FindOperator, IsNull, In, getConnection, Equal } from '@dbTools/typeorm' +import { FindOperator, IsNull, In, getConnection } from '@dbTools/typeorm' import { Contribution as DbContribution } from '@entity/Contribution' import { ContributionMessage } from '@entity/ContributionMessage' From 295dbff4f8b4d6411bbc3d788fdd39cafe1c074d Mon Sep 17 00:00:00 2001 From: ogerly Date: Tue, 24 Jan 2023 16:51:56 +0100 Subject: [PATCH 06/62] show info if no open contribution for selected date --- .../Contributions/ContributionForm.vue | 123 +++++++++++------- frontend/src/locales/de.json | 5 + frontend/src/locales/en.json | 5 + frontend/src/pages/Community.vue | 51 +++++--- 4 files changed, 120 insertions(+), 64 deletions(-) diff --git a/frontend/src/components/Contributions/ContributionForm.vue b/frontend/src/components/Contributions/ContributionForm.vue index bdd25f23c..9a2ffb54b 100644 --- a/frontend/src/components/Contributions/ContributionForm.vue +++ b/frontend/src/components/Contributions/ContributionForm.vue @@ -3,7 +3,7 @@ - - - +
+ {{ noOpenCreation }} +
+
+ + + - - - - {{ $t('form.cancel') }} - - - - - {{ form.id ? $t('form.change') : $t('contribution.submit') }} - - - + + + + {{ $t('form.cancel') }} + + + + + {{ form.id ? $t('form.change') : $t('contribution.submit') }} + + + +
@@ -133,6 +153,18 @@ export default { validMaxTime() { return Number(this.validMaxGDD / 20) }, + noOpenCreation() { + if (this.maxGddThisMonth <= 0 && this.maxGddLastMonth <= 0) { + return this.$t('contribution.noOpenCreation.allMonth') + } + if (this.isThisMonth && this.maxGddThisMonth <= 0) { + return this.$t('contribution.noOpenCreation.thisMonth') + } + if (!this.isThisMonth && this.maxGddLastMonth <= 0) { + return this.$t('contribution.noOpenCreation.lastMonth') + } + return '' + }, }, watch: { value() { @@ -142,6 +174,9 @@ export default { }