Merge branch 'master' into improve-apollo-logging
7
.gitignore
vendored
@ -13,4 +13,9 @@ package-lock.json
|
|||||||
/deployment/bare_metal/nginx/update-page/updating.html
|
/deployment/bare_metal/nginx/update-page/updating.html
|
||||||
/deployment/bare_metal/log
|
/deployment/bare_metal/log
|
||||||
/deployment/bare_metal/backup
|
/deployment/bare_metal/backup
|
||||||
/.nvmrc
|
|
||||||
|
# Node Version Manager configuration file
|
||||||
|
.nvmrc
|
||||||
|
|
||||||
|
# Apple macOS folder attribute file
|
||||||
|
.DS_Store
|
||||||
|
|||||||
22
CHANGELOG.md
@ -4,8 +4,30 @@ 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.8.3](https://github.com/gradido/gradido/compare/1.8.2...1.8.3)
|
||||||
|
|
||||||
|
- Checkbox [`#1894`](https://github.com/gradido/gradido/pull/1894)
|
||||||
|
- fix: Count Deprecated Links as Well [`#1892`](https://github.com/gradido/gradido/pull/1892)
|
||||||
|
|
||||||
|
#### [1.8.2](https://github.com/gradido/gradido/compare/1.8.1...1.8.2)
|
||||||
|
|
||||||
|
> 12 May 2022
|
||||||
|
|
||||||
|
- Release 1.8.2 [`#1890`](https://github.com/gradido/gradido/pull/1890)
|
||||||
|
- Update README.md [`#1878`](https://github.com/gradido/gradido/pull/1878)
|
||||||
|
- fix: Unique Previous Column in Transactions Table [`#1879`](https://github.com/gradido/gradido/pull/1879)
|
||||||
|
- fix: Up and Down Migrations for Older SQL Versions [`#1861`](https://github.com/gradido/gradido/pull/1861)
|
||||||
|
- 🍰 Refactor THX Page – 1. Step [`#1856`](https://github.com/gradido/gradido/pull/1856)
|
||||||
|
- Create LICENSE [`#1803`](https://github.com/gradido/gradido/pull/1803)
|
||||||
|
- docu: Update Deployment Documentation [`#1864`](https://github.com/gradido/gradido/pull/1864)
|
||||||
|
- fix: Loading Transaction Links after Reopening Link List [`#1863`](https://github.com/gradido/gradido/pull/1863)
|
||||||
|
- 🍰 Add NVM Config Files To '.gitignore' [`#1846`](https://github.com/gradido/gradido/pull/1846)
|
||||||
|
|
||||||
#### [1.8.1](https://github.com/gradido/gradido/compare/1.8.0...1.8.1)
|
#### [1.8.1](https://github.com/gradido/gradido/compare/1.8.0...1.8.1)
|
||||||
|
|
||||||
|
> 28 April 2022
|
||||||
|
|
||||||
|
- v1.8.1 [`#1855`](https://github.com/gradido/gradido/pull/1855)
|
||||||
- 1851 integrate and test the behaviour of clipboard polyfill [`#1853`](https://github.com/gradido/gradido/pull/1853)
|
- 1851 integrate and test the behaviour of clipboard polyfill [`#1853`](https://github.com/gradido/gradido/pull/1853)
|
||||||
- fix: Deprecated Warning from Faker on Seeding [`#1854`](https://github.com/gradido/gradido/pull/1854)
|
- fix: Deprecated Warning from Faker on Seeding [`#1854`](https://github.com/gradido/gradido/pull/1854)
|
||||||
- feat: Test Admin Resolver [`#1848`](https://github.com/gradido/gradido/pull/1848)
|
- feat: Test Admin Resolver [`#1848`](https://github.com/gradido/gradido/pull/1848)
|
||||||
|
|||||||
12
README.md
@ -93,3 +93,15 @@ Note: The Changelog will be regenerated with all tags on release on the external
|
|||||||
## Useful Links
|
## Useful Links
|
||||||
|
|
||||||
- [Gradido.net](https://gradido.net/)
|
- [Gradido.net](https://gradido.net/)
|
||||||
|
|
||||||
|
|
||||||
|
## Attributions
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
Browser compatibility testing with [BrowserStack](https://www.browserstack.com/).
|
||||||
|
|
||||||
|
|
||||||
|
## License
|
||||||
|
See the [LICENSE](LICENSE.md) file for license rights and limitations (Apache-2.0 license).
|
||||||
|
|
||||||
|
|||||||
1
admin/.gitignore
vendored
@ -10,4 +10,3 @@ coverage/
|
|||||||
|
|
||||||
# emacs
|
# emacs
|
||||||
*~
|
*~
|
||||||
/.nvmrc
|
|
||||||
|
|||||||
@ -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.8.1",
|
"version": "1.8.3",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"private": false,
|
"private": false,
|
||||||
"scripts": {
|
"scripts": {
|
||||||
|
|||||||
1
backend/.gitignore
vendored
@ -6,4 +6,3 @@ package-json.lock
|
|||||||
coverage
|
coverage
|
||||||
# emacs
|
# emacs
|
||||||
*~
|
*~
|
||||||
/.nvmrc
|
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "gradido-backend",
|
"name": "gradido-backend",
|
||||||
"version": "1.8.1",
|
"version": "1.8.3",
|
||||||
"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",
|
||||||
|
|||||||
@ -10,7 +10,7 @@ Decimal.set({
|
|||||||
})
|
})
|
||||||
|
|
||||||
const constants = {
|
const constants = {
|
||||||
DB_VERSION: '0035-admin_pending_creations_decimal',
|
DB_VERSION: '0036-unique_previous_in_transactions',
|
||||||
DECAY_START_TIME: new Date('2021-05-13 17:46:31'), // GMT+0
|
DECAY_START_TIME: new Date('2021-05-13 17:46:31'), // GMT+0
|
||||||
LOG4JS_CONFIG: 'log4js-config.json',
|
LOG4JS_CONFIG: 'log4js-config.json',
|
||||||
// default log level on production should be info
|
// default log level on production should be info
|
||||||
|
|||||||
@ -1077,6 +1077,53 @@ describe('AdminResolver', () => {
|
|||||||
expect(transaction[0].typeId).toEqual(1)
|
expect(transaction[0].typeId).toEqual(1)
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
describe('confirm two creations one after the other quickly', () => {
|
||||||
|
let c1: AdminPendingCreation | void
|
||||||
|
let c2: AdminPendingCreation | void
|
||||||
|
|
||||||
|
beforeAll(async () => {
|
||||||
|
const now = new Date()
|
||||||
|
c1 = await creationFactory(testEnv, {
|
||||||
|
email: 'bibi@bloxberg.de',
|
||||||
|
amount: 50,
|
||||||
|
memo: 'Herzlich Willkommen bei Gradido liebe Bibi!',
|
||||||
|
creationDate: new Date(now.getFullYear(), now.getMonth() - 2, 1).toISOString(),
|
||||||
|
})
|
||||||
|
c2 = await creationFactory(testEnv, {
|
||||||
|
email: 'bibi@bloxberg.de',
|
||||||
|
amount: 50,
|
||||||
|
memo: 'Herzlich Willkommen bei Gradido liebe Bibi!',
|
||||||
|
creationDate: new Date(now.getFullYear(), now.getMonth() - 2, 1).toISOString(),
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
// In the futrue this should not throw anymore
|
||||||
|
it('throws an error for the second confirmation', async () => {
|
||||||
|
const r1 = mutate({
|
||||||
|
mutation: confirmPendingCreation,
|
||||||
|
variables: {
|
||||||
|
id: c1 ? c1.id : -1,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
const r2 = mutate({
|
||||||
|
mutation: confirmPendingCreation,
|
||||||
|
variables: {
|
||||||
|
id: c2 ? c2.id : -1,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
await expect(r1).resolves.toEqual(
|
||||||
|
expect.objectContaining({
|
||||||
|
data: { confirmPendingCreation: true },
|
||||||
|
}),
|
||||||
|
)
|
||||||
|
await expect(r2).resolves.toEqual(
|
||||||
|
expect.objectContaining({
|
||||||
|
errors: [new GraphQLError('Unable to confirm creation.')],
|
||||||
|
}),
|
||||||
|
)
|
||||||
|
})
|
||||||
|
})
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|||||||
@ -361,7 +361,9 @@ export class AdminResolver {
|
|||||||
transaction.balanceDate = receivedCallDate
|
transaction.balanceDate = receivedCallDate
|
||||||
transaction.decay = decay ? decay.decay : new Decimal(0)
|
transaction.decay = decay ? decay.decay : new Decimal(0)
|
||||||
transaction.decayStart = decay ? decay.start : null
|
transaction.decayStart = decay ? decay.start : null
|
||||||
await transaction.save()
|
await transaction.save().catch(() => {
|
||||||
|
throw new Error('Unable to confirm creation.')
|
||||||
|
})
|
||||||
|
|
||||||
await AdminPendingCreation.delete(pendingCreation)
|
await AdminPendingCreation.delete(pendingCreation)
|
||||||
|
|
||||||
|
|||||||
@ -9,7 +9,7 @@ import { Transaction as dbTransaction } from '@entity/Transaction'
|
|||||||
import Decimal from 'decimal.js-light'
|
import Decimal from 'decimal.js-light'
|
||||||
import { GdtResolver } from './GdtResolver'
|
import { GdtResolver } from './GdtResolver'
|
||||||
import { TransactionLink as dbTransactionLink } from '@entity/TransactionLink'
|
import { TransactionLink as dbTransactionLink } from '@entity/TransactionLink'
|
||||||
import { MoreThan, getCustomRepository } from '@dbTools/typeorm'
|
import { getCustomRepository } from '@dbTools/typeorm'
|
||||||
import { TransactionLinkRepository } from '@repository/TransactionLink'
|
import { TransactionLinkRepository } from '@repository/TransactionLink'
|
||||||
|
|
||||||
const logger = getLogger('backend')
|
const logger = getLogger('backend')
|
||||||
@ -52,16 +52,13 @@ export class BalanceResolver {
|
|||||||
: await dbTransaction.count({ where: { userId: user.id } })
|
: await dbTransaction.count({ where: { userId: user.id } })
|
||||||
logger.debug(`transactionCount=${count}`)
|
logger.debug(`transactionCount=${count}`)
|
||||||
|
|
||||||
const linkCount =
|
const linkCount = await dbTransactionLink.count({
|
||||||
context.linkCount || context.linkCount === 0
|
where: {
|
||||||
? context.linkCount
|
userId: user.id,
|
||||||
: await dbTransactionLink.count({
|
redeemedAt: null,
|
||||||
where: {
|
// validUntil: MoreThan(new Date()),
|
||||||
userId: user.id,
|
},
|
||||||
redeemedAt: null,
|
})
|
||||||
validUntil: MoreThan(new Date()),
|
|
||||||
},
|
|
||||||
})
|
|
||||||
logger.debug(`linkCount=${linkCount}`)
|
logger.debug(`linkCount=${linkCount}`)
|
||||||
|
|
||||||
// The decay is always calculated on the last booked transaction
|
// The decay is always calculated on the last booked transaction
|
||||||
|
|||||||
@ -1,6 +1,131 @@
|
|||||||
import { CreationInterface } from './CreationInterface'
|
import { CreationInterface } from './CreationInterface'
|
||||||
import { nMonthsBefore } from '../factory/creation'
|
import { nMonthsBefore } from '../factory/creation'
|
||||||
|
|
||||||
|
const bobsSendings = [
|
||||||
|
{
|
||||||
|
amount: 10,
|
||||||
|
memo: 'Herzlich Willkommen bei Gradido!',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
amount: 10,
|
||||||
|
memo: 'für deine Hilfe, Betty',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
amount: 23.37,
|
||||||
|
memo: 'für deine Hilfe, David',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
amount: 47,
|
||||||
|
memo: 'für deine Hilfe, Frau Holle',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
amount: 1.02,
|
||||||
|
memo: 'für deine Hilfe, Herr Müller',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
amount: 5.67,
|
||||||
|
memo: 'für deine Hilfe, Maier',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
amount: 72.93,
|
||||||
|
memo: 'für deine Hilfe, Elsbeth',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
amount: 5.6,
|
||||||
|
memo: 'für deine Hilfe, Daniel',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
amount: 8.87,
|
||||||
|
memo: 'für deine Hilfe, Yoda',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
amount: 7.56,
|
||||||
|
memo: 'für deine Hilfe, Sabine',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
amount: 7.89,
|
||||||
|
memo: 'für deine Hilfe, Karl',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
amount: 8.9,
|
||||||
|
memo: 'für deine Hilfe, Darth Vader',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
amount: 56.79,
|
||||||
|
memo: 'für deine Hilfe, Luci',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
amount: 3.45,
|
||||||
|
memo: 'für deine Hilfe, Hanne',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
amount: 8.74,
|
||||||
|
memo: 'für deine Hilfe, Luise',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
amount: 7.85,
|
||||||
|
memo: 'für deine Hilfe, Annegred',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
amount: 32.7,
|
||||||
|
memo: 'für deine Hilfe, Prinz von Zamunda',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
amount: 44.2,
|
||||||
|
memo: 'für deine Hilfe, Charly Brown',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
amount: 38.17,
|
||||||
|
memo: 'für deine Hilfe, Michael',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
amount: 5.72,
|
||||||
|
memo: 'für deine Hilfe, Kaja',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
amount: 3.99,
|
||||||
|
memo: 'für deine Hilfe, Maja',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
amount: 4.5,
|
||||||
|
memo: 'für deine Hilfe, Martha',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
amount: 8.3,
|
||||||
|
memo: 'für deine Hilfe, Ursula',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
amount: 2.9,
|
||||||
|
memo: 'für deine Hilfe, Urs',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
amount: 4.6,
|
||||||
|
memo: 'für deine Hilfe, Mecedes',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
amount: 74.1,
|
||||||
|
memo: 'für deine Hilfe, Heidi',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
amount: 4.5,
|
||||||
|
memo: 'für deine Hilfe, Peter',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
amount: 5.8,
|
||||||
|
memo: 'für deine Hilfe, Fräulein Rottenmeier',
|
||||||
|
},
|
||||||
|
]
|
||||||
|
const bobsTransactions: CreationInterface[] = []
|
||||||
|
bobsSendings.forEach((sending) => {
|
||||||
|
bobsTransactions.push({
|
||||||
|
email: 'bob@baumeister.de',
|
||||||
|
amount: sending.amount,
|
||||||
|
memo: sending.memo,
|
||||||
|
creationDate: nMonthsBefore(new Date()),
|
||||||
|
confirmed: true,
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
export const creations: CreationInterface[] = [
|
export const creations: CreationInterface[] = [
|
||||||
{
|
{
|
||||||
email: 'bibi@bloxberg.de',
|
email: 'bibi@bloxberg.de',
|
||||||
@ -10,14 +135,7 @@ export const creations: CreationInterface[] = [
|
|||||||
confirmed: true,
|
confirmed: true,
|
||||||
moveCreationDate: 12,
|
moveCreationDate: 12,
|
||||||
},
|
},
|
||||||
{
|
...bobsTransactions,
|
||||||
email: 'bob@baumeister.de',
|
|
||||||
amount: 1000,
|
|
||||||
memo: 'Herzlich Willkommen bei Gradido!',
|
|
||||||
creationDate: nMonthsBefore(new Date()),
|
|
||||||
confirmed: true,
|
|
||||||
moveCreationDate: 8,
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
email: 'raeuber@hotzenplotz.de',
|
email: 'raeuber@hotzenplotz.de',
|
||||||
amount: 1000,
|
amount: 1000,
|
||||||
|
|||||||
@ -66,7 +66,10 @@ const run = async () => {
|
|||||||
|
|
||||||
// create GDD
|
// create GDD
|
||||||
for (let i = 0; i < creations.length; i++) {
|
for (let i = 0; i < creations.length; i++) {
|
||||||
|
const now = new Date().getTime() // we have to wait a little! quick fix for account sum problem of bob@baumeister.de, (see https://github.com/gradido/gradido/issues/1886)
|
||||||
await creationFactory(seedClient, creations[i])
|
await creationFactory(seedClient, creations[i])
|
||||||
|
// eslint-disable-next-line no-empty
|
||||||
|
while (new Date().getTime() < now + 1000) {} // we have to wait a little! quick fix for account sum problem of bob@baumeister.de, (see https://github.com/gradido/gradido/issues/1886)
|
||||||
}
|
}
|
||||||
|
|
||||||
// create Transaction Links
|
// create Transaction Links
|
||||||
|
|||||||
1
database/.gitignore
vendored
@ -25,4 +25,3 @@ package-lock.json
|
|||||||
coverage/
|
coverage/
|
||||||
|
|
||||||
*~
|
*~
|
||||||
/.nvmrc
|
|
||||||
|
|||||||
@ -0,0 +1,94 @@
|
|||||||
|
import Decimal from 'decimal.js-light'
|
||||||
|
import { BaseEntity, Entity, PrimaryGeneratedColumn, Column } from 'typeorm'
|
||||||
|
import { DecimalTransformer } from '../../src/typeorm/DecimalTransformer'
|
||||||
|
|
||||||
|
@Entity('transactions')
|
||||||
|
export class Transaction extends BaseEntity {
|
||||||
|
@PrimaryGeneratedColumn('increment', { unsigned: true })
|
||||||
|
id: number
|
||||||
|
|
||||||
|
@Column({ name: 'user_id', unsigned: true, nullable: false })
|
||||||
|
userId: number
|
||||||
|
|
||||||
|
@Column({ type: 'int', unsigned: true, unique: true, nullable: true, default: null })
|
||||||
|
previous: number | null
|
||||||
|
|
||||||
|
@Column({ name: 'type_id', unsigned: true, nullable: false })
|
||||||
|
typeId: number
|
||||||
|
|
||||||
|
@Column({
|
||||||
|
type: 'decimal',
|
||||||
|
precision: 40,
|
||||||
|
scale: 20,
|
||||||
|
nullable: false,
|
||||||
|
transformer: DecimalTransformer,
|
||||||
|
})
|
||||||
|
amount: Decimal
|
||||||
|
|
||||||
|
@Column({
|
||||||
|
type: 'decimal',
|
||||||
|
precision: 40,
|
||||||
|
scale: 20,
|
||||||
|
nullable: false,
|
||||||
|
transformer: DecimalTransformer,
|
||||||
|
})
|
||||||
|
balance: Decimal
|
||||||
|
|
||||||
|
@Column({
|
||||||
|
name: 'balance_date',
|
||||||
|
type: 'datetime',
|
||||||
|
default: () => 'CURRENT_TIMESTAMP',
|
||||||
|
nullable: false,
|
||||||
|
})
|
||||||
|
balanceDate: Date
|
||||||
|
|
||||||
|
@Column({
|
||||||
|
type: 'decimal',
|
||||||
|
precision: 40,
|
||||||
|
scale: 20,
|
||||||
|
nullable: false,
|
||||||
|
transformer: DecimalTransformer,
|
||||||
|
})
|
||||||
|
decay: Decimal
|
||||||
|
|
||||||
|
@Column({
|
||||||
|
name: 'decay_start',
|
||||||
|
type: 'datetime',
|
||||||
|
nullable: true,
|
||||||
|
default: null,
|
||||||
|
})
|
||||||
|
decayStart: Date | null
|
||||||
|
|
||||||
|
@Column({ length: 255, nullable: false, collation: 'utf8mb4_unicode_ci' })
|
||||||
|
memo: string
|
||||||
|
|
||||||
|
@Column({ name: 'creation_date', type: 'datetime', nullable: true, default: null })
|
||||||
|
creationDate: Date | null
|
||||||
|
|
||||||
|
@Column({
|
||||||
|
name: 'linked_user_id',
|
||||||
|
type: 'int',
|
||||||
|
unsigned: true,
|
||||||
|
nullable: true,
|
||||||
|
default: null,
|
||||||
|
})
|
||||||
|
linkedUserId?: number | null
|
||||||
|
|
||||||
|
@Column({
|
||||||
|
name: 'linked_transaction_id',
|
||||||
|
type: 'int',
|
||||||
|
unsigned: true,
|
||||||
|
nullable: true,
|
||||||
|
default: null,
|
||||||
|
})
|
||||||
|
linkedTransactionId?: number | null
|
||||||
|
|
||||||
|
@Column({
|
||||||
|
name: 'transaction_link_id',
|
||||||
|
type: 'int',
|
||||||
|
unsigned: true,
|
||||||
|
nullable: true,
|
||||||
|
default: null,
|
||||||
|
})
|
||||||
|
transactionLinkId?: number | null
|
||||||
|
}
|
||||||
@ -1 +1 @@
|
|||||||
export { Transaction } from './0032-add-transaction-link-to-transaction/Transaction'
|
export { Transaction } from './0036-unique_previous_in_transactions/Transaction'
|
||||||
|
|||||||
13
database/migrations/0036-unique_previous_in_transactions.ts
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
/* MIGRATION TO SET previous COLUMN UNIQUE in TRANSACTION table
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */
|
||||||
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
||||||
|
|
||||||
|
export async function upgrade(queryFn: (query: string, values?: any[]) => Promise<Array<any>>) {
|
||||||
|
await queryFn('ALTER TABLE `transactions` ADD UNIQUE(`previous`);')
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function downgrade(queryFn: (query: string, values?: any[]) => Promise<Array<any>>) {
|
||||||
|
await queryFn('ALTER TABLE `transactions` DROP INDEX `previous`;')
|
||||||
|
}
|
||||||
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "gradido-database",
|
"name": "gradido-database",
|
||||||
"version": "1.8.1",
|
"version": "1.8.3",
|
||||||
"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",
|
||||||
|
|||||||
33
docu/Style/Images/Checkbox_aktiv.svg
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- Generator: Adobe Illustrator 26.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||||
|
<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 20 20" style="enable-background:new 0 0 20 20;" xml:space="preserve">
|
||||||
|
<style type="text/css">
|
||||||
|
.st0{fill:#047006;}
|
||||||
|
.st1{fill:none;stroke:#F5F5F5;stroke-width:2;stroke-linecap:round;}
|
||||||
|
.st2{display:none;}
|
||||||
|
.st3{display:inline;}
|
||||||
|
.st4{fill:#FFFFFF;}
|
||||||
|
.st5{fill:none;stroke:#707070;}
|
||||||
|
.st6{fill:none;stroke:#F5F5F5;stroke-width:2;stroke-linecap:round;stroke-opacity:0;}
|
||||||
|
</style>
|
||||||
|
<g id="Ebene_1">
|
||||||
|
<g id="Gruppe_4989" transform="translate(-772 -261.959)">
|
||||||
|
<circle id="Ellipse_17" class="st0" cx="782.16" cy="271.95" r="9.5"/>
|
||||||
|
<line id="Linie_20" class="st1" x1="777.46" y1="271.95" x2="780.54" y2="275.47"/>
|
||||||
|
<line id="Linie_21" class="st1" x1="780.54" y1="275.47" x2="787.53" y2="268.44"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g id="Ebene_2" class="st2">
|
||||||
|
<g id="Gruppe_4989_00000034808020233716670080000006186173982805041337_" transform="translate(-772 -261.959)" class="st3">
|
||||||
|
<g id="Ellipse_17_00000100354317347125335040000001067099806688704903_" transform="translate(772 261.959)">
|
||||||
|
<circle class="st4" cx="10.16" cy="9.99" r="9.5"/>
|
||||||
|
<circle class="st5" cx="10.16" cy="9.99" r="9"/>
|
||||||
|
</g>
|
||||||
|
|
||||||
|
<line id="Linie_20_00000062902523139473969010000009779348807157657532_" class="st6" x1="777.46" y1="271.95" x2="780.54" y2="275.47"/>
|
||||||
|
|
||||||
|
<line id="Linie_21_00000005969448249974932320000012316677830959789444_" class="st6" x1="780.54" y1="275.47" x2="787.53" y2="268.44"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.6 KiB |
33
docu/Style/Images/Checkbox_deaktiv.svg
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- Generator: Adobe Illustrator 26.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||||
|
<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 20 20" style="enable-background:new 0 0 20 20;" xml:space="preserve">
|
||||||
|
<style type="text/css">
|
||||||
|
.st0{display:none;}
|
||||||
|
.st1{display:inline;}
|
||||||
|
.st2{fill:#047006;}
|
||||||
|
.st3{fill:none;stroke:#F5F5F5;stroke-width:2;stroke-linecap:round;}
|
||||||
|
.st4{fill:#FFFFFF;}
|
||||||
|
.st5{fill:none;stroke:#707070;}
|
||||||
|
.st6{fill:none;stroke:#F5F5F5;stroke-width:2;stroke-linecap:round;stroke-opacity:0;}
|
||||||
|
</style>
|
||||||
|
<g id="Ebene_1" class="st0">
|
||||||
|
<g id="Gruppe_4989" transform="translate(-772 -261.959)" class="st1">
|
||||||
|
<circle id="Ellipse_17" class="st2" cx="782.16" cy="271.95" r="9.5"/>
|
||||||
|
<line id="Linie_20" class="st3" x1="777.46" y1="271.95" x2="780.54" y2="275.47"/>
|
||||||
|
<line id="Linie_21" class="st3" x1="780.54" y1="275.47" x2="787.53" y2="268.44"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g id="Ebene_2">
|
||||||
|
<g id="Gruppe_4989_00000034808020233716670080000006186173982805041337_" transform="translate(-772 -261.959)">
|
||||||
|
<g id="Ellipse_17_00000100354317347125335040000001067099806688704903_" transform="translate(772 261.959)">
|
||||||
|
<circle class="st4" cx="10.16" cy="9.99" r="9.5"/>
|
||||||
|
<circle class="st5" cx="10.16" cy="9.99" r="9"/>
|
||||||
|
</g>
|
||||||
|
|
||||||
|
<line id="Linie_20_00000062902523139473969010000009779348807157657532_" class="st6" x1="777.46" y1="271.95" x2="780.54" y2="275.47"/>
|
||||||
|
|
||||||
|
<line id="Linie_21_00000005969448249974932320000012316677830959789444_" class="st6" x1="780.54" y1="275.47" x2="787.53" y2="268.44"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.6 KiB |
1
frontend/.gitignore
vendored
@ -24,4 +24,3 @@ package-lock.json
|
|||||||
coverage/
|
coverage/
|
||||||
|
|
||||||
*~
|
*~
|
||||||
/.nvmrc
|
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "bootstrap-vue-gradido-wallet",
|
"name": "bootstrap-vue-gradido-wallet",
|
||||||
"version": "1.8.1",
|
"version": "1.8.3",
|
||||||
"private": true,
|
"private": true,
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"start": "node run/server.js",
|
"start": "node run/server.js",
|
||||||
|
|||||||
BIN
frontend/public/img/brand/gradido_coin●.png
Normal file
|
After Width: | Height: | Size: 646 KiB |
3
frontend/public/img/svg/type.svg
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-type" viewBox="0 0 16 16">
|
||||||
|
<path d="m2.244 13.081.943-2.803H6.66l.944 2.803H8.86L5.54 3.75H4.322L1 13.081h1.244zm2.7-7.923L6.34 9.314H3.51l1.4-4.156h.034zm9.146 7.027h.035v.896h1.128V8.125c0-1.51-1.114-2.345-2.646-2.345-1.736 0-2.59.916-2.666 2.174h1.108c.068-.718.595-1.19 1.517-1.19.971 0 1.518.52 1.518 1.464v.731H12.19c-1.647.007-2.522.8-2.522 2.058 0 1.319.957 2.18 2.345 2.18 1.06 0 1.716-.43 2.078-1.011zm-1.763.035c-.752 0-1.456-.397-1.456-1.244 0-.65.424-1.115 1.408-1.115h1.805v.834c0 .896-.752 1.525-1.757 1.525z"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 631 B |
BIN
frontend/public/img/template/Blaetter.png
Normal file
|
After Width: | Height: | Size: 19 KiB |
BIN
frontend/public/img/template/Foto_01.jpg
Normal file
|
After Width: | Height: | Size: 81 KiB |
BIN
frontend/public/img/template/gold_03.png
Normal file
|
After Width: | Height: | Size: 1.0 MiB |
BIN
frontend/public/img/template/gradido_background_header.png
Normal file
|
After Width: | Height: | Size: 1.6 KiB |
BIN
frontend/public/img/template/logo-header.png
Normal file
|
After Width: | Height: | Size: 52 KiB |
@ -407,29 +407,34 @@ describe('GddTransactionList', () => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
describe('pagination buttons', () => {
|
describe('pagination buttons', () => {
|
||||||
|
const createTransaction = (idx) => {
|
||||||
|
return {
|
||||||
|
amount: '3.14',
|
||||||
|
balanceDate: '2021-04-29T17:26:40+00:00',
|
||||||
|
decay: {
|
||||||
|
decay: '-477.01',
|
||||||
|
start: '2021-05-13T17:46:31.000Z',
|
||||||
|
end: '2022-04-20T06:51:25.000Z',
|
||||||
|
duration: 29509494,
|
||||||
|
},
|
||||||
|
memo: 'Kreiszahl PI',
|
||||||
|
linkedUser: {
|
||||||
|
firstName: 'Bibi',
|
||||||
|
lastName: 'Bloxberg',
|
||||||
|
},
|
||||||
|
id: idx + 1,
|
||||||
|
typeId: 'RECEIVE',
|
||||||
|
balance: '33.33',
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
beforeEach(async () => {
|
beforeEach(async () => {
|
||||||
|
const transactionCount = 42
|
||||||
await wrapper.setProps({
|
await wrapper.setProps({
|
||||||
transactions: Array.from({ length: 42 }, (_, idx) => {
|
transactions: Array.from({ length: transactionCount }, (_, idx) => {
|
||||||
return {
|
return createTransaction(idx)
|
||||||
amount: '3.14',
|
|
||||||
balanceDate: '2021-04-29T17:26:40+00:00',
|
|
||||||
decay: {
|
|
||||||
decay: '-477.01',
|
|
||||||
start: '2021-05-13T17:46:31.000Z',
|
|
||||||
end: '2022-04-20T06:51:25.000Z',
|
|
||||||
duration: 29509494,
|
|
||||||
},
|
|
||||||
memo: 'Kreiszahl PI',
|
|
||||||
linkedUser: {
|
|
||||||
firstName: 'Bibi',
|
|
||||||
lastName: 'Bloxberg',
|
|
||||||
},
|
|
||||||
id: idx + 1,
|
|
||||||
typeId: 'RECEIVE',
|
|
||||||
balance: '33.33',
|
|
||||||
}
|
|
||||||
}),
|
}),
|
||||||
transactionCount: 42,
|
transactionCount,
|
||||||
decayStartBlock,
|
decayStartBlock,
|
||||||
pageSize: 25,
|
pageSize: 25,
|
||||||
showPagination: true,
|
showPagination: true,
|
||||||
@ -449,22 +454,22 @@ describe('GddTransactionList', () => {
|
|||||||
)
|
)
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
})
|
|
||||||
|
|
||||||
describe('show no pagination', () => {
|
describe('show no pagination', () => {
|
||||||
beforeEach(async () => {
|
it('shows no pagination buttons', async () => {
|
||||||
await wrapper.setProps({
|
const transactionCount = 2
|
||||||
transactions: [],
|
await wrapper.setProps({
|
||||||
transactionCount: 2,
|
transactions: Array.from({ length: transactionCount }, (_, idx) => {
|
||||||
decayStartBlock,
|
return createTransaction(idx)
|
||||||
pageSize: 25,
|
}),
|
||||||
showPagination: false,
|
transactionCount,
|
||||||
|
decayStartBlock,
|
||||||
|
pageSize: 25,
|
||||||
|
showPagination: false,
|
||||||
|
})
|
||||||
|
expect(wrapper.find('ul.pagination').exists()).toBe(false)
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
it('shows no pagination buttons', () => {
|
|
||||||
expect(wrapper.find('ul.pagination').exists()).toBe(false)
|
|
||||||
})
|
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|||||||
@ -61,7 +61,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<b-pagination
|
<b-pagination
|
||||||
v-if="showPagination"
|
v-if="isPaginationVisible"
|
||||||
class="mt-3"
|
class="mt-3"
|
||||||
pills
|
pills
|
||||||
size="lg"
|
size="lg"
|
||||||
@ -96,11 +96,6 @@ export default {
|
|||||||
TransactionCreation,
|
TransactionCreation,
|
||||||
TransactionLinkSummary,
|
TransactionLinkSummary,
|
||||||
},
|
},
|
||||||
data() {
|
|
||||||
return {
|
|
||||||
currentPage: 1,
|
|
||||||
}
|
|
||||||
},
|
|
||||||
props: {
|
props: {
|
||||||
transactions: { default: () => [] },
|
transactions: { default: () => [] },
|
||||||
pageSize: { type: Number, default: 25 },
|
pageSize: { type: Number, default: 25 },
|
||||||
@ -110,6 +105,11 @@ export default {
|
|||||||
showPagination: { type: Boolean, default: false },
|
showPagination: { type: Boolean, default: false },
|
||||||
pending: { type: Boolean },
|
pending: { type: Boolean },
|
||||||
},
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
currentPage: 1,
|
||||||
|
}
|
||||||
|
},
|
||||||
methods: {
|
methods: {
|
||||||
updateTransactions() {
|
updateTransactions() {
|
||||||
this.$emit('update-transactions', {
|
this.$emit('update-transactions', {
|
||||||
@ -123,6 +123,11 @@ export default {
|
|||||||
return '0'
|
return '0'
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
computed: {
|
||||||
|
isPaginationVisible() {
|
||||||
|
return this.showPagination && this.pageSize < this.transactionCount
|
||||||
|
},
|
||||||
|
},
|
||||||
watch: {
|
watch: {
|
||||||
currentPage() {
|
currentPage() {
|
||||||
this.updateTransactions()
|
this.updateTransactions()
|
||||||
@ -134,6 +139,7 @@ export default {
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
collaps-icon {
|
collaps-icon {
|
||||||
width: 95%;
|
width: 95%;
|
||||||
|
|||||||
@ -9,7 +9,7 @@
|
|||||||
:transactionCount="transactionCount"
|
:transactionCount="transactionCount"
|
||||||
:transactionLinkCount="transactionLinkCount"
|
:transactionLinkCount="transactionLinkCount"
|
||||||
:transactions="transactions"
|
:transactions="transactions"
|
||||||
:show-pagination="true"
|
:showPagination="true"
|
||||||
@update-transactions="updateTransactions"
|
@update-transactions="updateTransactions"
|
||||||
v-on="$listeners"
|
v-on="$listeners"
|
||||||
/>
|
/>
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "gradido",
|
"name": "gradido",
|
||||||
"version": "1.8.1",
|
"version": "1.8.3",
|
||||||
"description": "Gradido",
|
"description": "Gradido",
|
||||||
"main": "index.js",
|
"main": "index.js",
|
||||||
"repository": "git@github.com:gradido/gradido.git",
|
"repository": "git@github.com:gradido/gradido.git",
|
||||||
|
|||||||