mirror of
https://github.com/IT4Change/gradido.git
synced 2025-12-13 07:45:54 +00:00
Merge branch 'master' into 2501-feature-federation-implement-a-graphql-client-to-request-getpublickey
This commit is contained in:
commit
0a2a02a784
2
.github/workflows/test.yml
vendored
2
.github/workflows/test.yml
vendored
@ -527,7 +527,7 @@ jobs:
|
|||||||
report_name: Coverage Backend
|
report_name: Coverage Backend
|
||||||
type: lcov
|
type: lcov
|
||||||
result_path: ./backend/coverage/lcov.info
|
result_path: ./backend/coverage/lcov.info
|
||||||
min_coverage: 76
|
min_coverage: 78
|
||||||
token: ${{ github.token }}
|
token: ${{ github.token }}
|
||||||
|
|
||||||
##########################################################################
|
##########################################################################
|
||||||
|
|||||||
6
.vscode/extensions.json
vendored
6
.vscode/extensions.json
vendored
@ -3,6 +3,10 @@
|
|||||||
"streetsidesoftware.code-spell-checker",
|
"streetsidesoftware.code-spell-checker",
|
||||||
"dbaeumer.vscode-eslint",
|
"dbaeumer.vscode-eslint",
|
||||||
"esbenp.prettier-vscode",
|
"esbenp.prettier-vscode",
|
||||||
"hediet.vscode-drawio"
|
"hediet.vscode-drawio",
|
||||||
|
"streetsidesoftware.code-spell-checker-german",
|
||||||
|
"mtxr.sqltools",
|
||||||
|
"mtxr.sqltools-driver-mysql",
|
||||||
|
"jcbuisson.vue"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
17
.vscode/settings.json
vendored
17
.vscode/settings.json
vendored
@ -1,3 +1,18 @@
|
|||||||
{
|
{
|
||||||
"git.ignoreLimitWarning": true
|
"git.ignoreLimitWarning": true,
|
||||||
|
"sqltools.connections": [
|
||||||
|
{
|
||||||
|
"mysqlOptions": {
|
||||||
|
"authProtocol": "default"
|
||||||
|
},
|
||||||
|
"previewLimit": 50,
|
||||||
|
"server": "localhost",
|
||||||
|
"port": 3306,
|
||||||
|
"driver": "MariaDB",
|
||||||
|
"name": "localhost",
|
||||||
|
"database": "gradido_community",
|
||||||
|
"username": "root",
|
||||||
|
"password": ""
|
||||||
|
}
|
||||||
|
],
|
||||||
}
|
}
|
||||||
@ -4141,9 +4141,9 @@ caniuse-api@^3.0.0:
|
|||||||
lodash.uniq "^4.5.0"
|
lodash.uniq "^4.5.0"
|
||||||
|
|
||||||
caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000844, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001271:
|
caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000844, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001271:
|
||||||
version "1.0.30001354"
|
version "1.0.30001442"
|
||||||
resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001354.tgz"
|
resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001442.tgz"
|
||||||
integrity sha512-mImKeCkyGDAHNywYFA4bqnLAzTUvVkqPvhY4DV47X+Gl2c5Z8c3KNETnXp14GQt11LvxE8AwjzGxJ+rsikiOzg==
|
integrity sha512-239m03Pqy0hwxYPYR5JwOIxRJfLTWtle9FV8zosfV5pHg+/51uD4nxcUlM8+mWWGfwKtt8lJNHnD3cWw9VZ6ow==
|
||||||
|
|
||||||
capture-exit@^2.0.0:
|
capture-exit@^2.0.0:
|
||||||
version "2.0.0"
|
version "2.0.0"
|
||||||
|
|||||||
@ -32,7 +32,6 @@
|
|||||||
"graphql": "^15.5.1",
|
"graphql": "^15.5.1",
|
||||||
"graphql-request": "5.0.0",
|
"graphql-request": "5.0.0",
|
||||||
"i18n": "^0.15.1",
|
"i18n": "^0.15.1",
|
||||||
"jest": "^27.2.4",
|
|
||||||
"jsonwebtoken": "^8.5.1",
|
"jsonwebtoken": "^8.5.1",
|
||||||
"lodash.clonedeep": "^4.5.0",
|
"lodash.clonedeep": "^4.5.0",
|
||||||
"log4js": "^6.4.6",
|
"log4js": "^6.4.6",
|
||||||
|
|||||||
@ -70,11 +70,13 @@ const email = {
|
|||||||
EMAIL: process.env.EMAIL === 'true' || false,
|
EMAIL: process.env.EMAIL === 'true' || false,
|
||||||
EMAIL_TEST_MODUS: process.env.EMAIL_TEST_MODUS === 'true' || false,
|
EMAIL_TEST_MODUS: process.env.EMAIL_TEST_MODUS === 'true' || false,
|
||||||
EMAIL_TEST_RECEIVER: process.env.EMAIL_TEST_RECEIVER || 'stage1@gradido.net',
|
EMAIL_TEST_RECEIVER: process.env.EMAIL_TEST_RECEIVER || 'stage1@gradido.net',
|
||||||
EMAIL_USERNAME: process.env.EMAIL_USERNAME || 'gradido_email',
|
EMAIL_USERNAME: process.env.EMAIL_USERNAME || '',
|
||||||
EMAIL_SENDER: process.env.EMAIL_SENDER || 'info@gradido.net',
|
EMAIL_SENDER: process.env.EMAIL_SENDER || 'info@gradido.net',
|
||||||
EMAIL_PASSWORD: process.env.EMAIL_PASSWORD || 'xxx',
|
EMAIL_PASSWORD: process.env.EMAIL_PASSWORD || '',
|
||||||
EMAIL_SMTP_URL: process.env.EMAIL_SMTP_URL || 'gmail.com',
|
EMAIL_SMTP_URL: process.env.EMAIL_SMTP_URL || 'mailserver',
|
||||||
EMAIL_SMTP_PORT: process.env.EMAIL_SMTP_PORT || '587',
|
EMAIL_SMTP_PORT: process.env.EMAIL_SMTP_PORT || '1025',
|
||||||
|
// eslint-disable-next-line no-unneeded-ternary
|
||||||
|
EMAIL_TLS: process.env.EMAIL_TLS === 'false' ? false : true,
|
||||||
EMAIL_LINK_VERIFICATION:
|
EMAIL_LINK_VERIFICATION:
|
||||||
process.env.EMAIL_LINK_VERIFICATION || 'http://localhost/checkEmail/{optin}{code}',
|
process.env.EMAIL_LINK_VERIFICATION || 'http://localhost/checkEmail/{optin}{code}',
|
||||||
EMAIL_LINK_SETPASSWORD:
|
EMAIL_LINK_SETPASSWORD:
|
||||||
|
|||||||
@ -41,7 +41,7 @@ export const sendEmailTranslated = async (params: {
|
|||||||
host: CONFIG.EMAIL_SMTP_URL,
|
host: CONFIG.EMAIL_SMTP_URL,
|
||||||
port: Number(CONFIG.EMAIL_SMTP_PORT),
|
port: Number(CONFIG.EMAIL_SMTP_PORT),
|
||||||
secure: false, // true for 465, false for other ports
|
secure: false, // true for 465, false for other ports
|
||||||
requireTLS: true,
|
requireTLS: CONFIG.EMAIL_TLS,
|
||||||
auth: {
|
auth: {
|
||||||
user: CONFIG.EMAIL_USERNAME,
|
user: CONFIG.EMAIL_USERNAME,
|
||||||
pass: CONFIG.EMAIL_PASSWORD,
|
pass: CONFIG.EMAIL_PASSWORD,
|
||||||
|
|||||||
@ -32,7 +32,7 @@ export class BalanceResolver {
|
|||||||
|
|
||||||
const lastTransaction = context.lastTransaction
|
const lastTransaction = context.lastTransaction
|
||||||
? context.lastTransaction
|
? context.lastTransaction
|
||||||
: await dbTransaction.findOne({ userId: user.id }, { order: { balanceDate: 'DESC' } })
|
: await dbTransaction.findOne({ userId: user.id }, { order: { id: 'DESC' } })
|
||||||
|
|
||||||
logger.debug(`lastTransaction=${lastTransaction}`)
|
logger.debug(`lastTransaction=${lastTransaction}`)
|
||||||
|
|
||||||
|
|||||||
@ -1947,6 +1947,23 @@ describe('ContributionResolver', () => {
|
|||||||
}),
|
}),
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
describe('confirm same contribution again', () => {
|
||||||
|
it('throws an error', async () => {
|
||||||
|
await expect(
|
||||||
|
mutate({
|
||||||
|
mutation: confirmContribution,
|
||||||
|
variables: {
|
||||||
|
id: creation ? creation.id : -1,
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
).resolves.toEqual(
|
||||||
|
expect.objectContaining({
|
||||||
|
errors: [new GraphQLError('Contribution already confirmd.')],
|
||||||
|
}),
|
||||||
|
)
|
||||||
|
})
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
describe('confirm two creations one after the other quickly', () => {
|
describe('confirm two creations one after the other quickly', () => {
|
||||||
|
|||||||
@ -553,108 +553,116 @@ export class ContributionResolver {
|
|||||||
@Arg('id', () => Int) id: number,
|
@Arg('id', () => Int) id: number,
|
||||||
@Ctx() context: Context,
|
@Ctx() context: Context,
|
||||||
): Promise<boolean> {
|
): Promise<boolean> {
|
||||||
const clientTimezoneOffset = getClientTimezoneOffset(context)
|
|
||||||
const contribution = await DbContribution.findOne(id)
|
|
||||||
if (!contribution) {
|
|
||||||
logger.error(`Contribution not found for given id: ${id}`)
|
|
||||||
throw new Error('Contribution not found to given id.')
|
|
||||||
}
|
|
||||||
const moderatorUser = getUser(context)
|
|
||||||
if (moderatorUser.id === contribution.userId) {
|
|
||||||
logger.error('Moderator can not confirm own contribution')
|
|
||||||
throw new Error('Moderator can not confirm own contribution')
|
|
||||||
}
|
|
||||||
const user = await DbUser.findOneOrFail(
|
|
||||||
{ id: contribution.userId },
|
|
||||||
{ withDeleted: true, relations: ['emailContact'] },
|
|
||||||
)
|
|
||||||
if (user.deletedAt) {
|
|
||||||
logger.error('This user was deleted. Cannot confirm a contribution.')
|
|
||||||
throw new Error('This user was deleted. Cannot confirm a contribution.')
|
|
||||||
}
|
|
||||||
const creations = await getUserCreation(contribution.userId, clientTimezoneOffset, false)
|
|
||||||
validateContribution(
|
|
||||||
creations,
|
|
||||||
contribution.amount,
|
|
||||||
contribution.contributionDate,
|
|
||||||
clientTimezoneOffset,
|
|
||||||
)
|
|
||||||
|
|
||||||
// acquire lock
|
// acquire lock
|
||||||
const releaseLock = await TRANSACTIONS_LOCK.acquire()
|
const releaseLock = await TRANSACTIONS_LOCK.acquire()
|
||||||
|
|
||||||
const receivedCallDate = new Date()
|
|
||||||
const queryRunner = getConnection().createQueryRunner()
|
|
||||||
await queryRunner.connect()
|
|
||||||
await queryRunner.startTransaction('REPEATABLE READ') // 'READ COMMITTED')
|
|
||||||
try {
|
try {
|
||||||
const lastTransaction = await queryRunner.manager
|
const clientTimezoneOffset = getClientTimezoneOffset(context)
|
||||||
.createQueryBuilder()
|
const contribution = await DbContribution.findOne(id)
|
||||||
.select('transaction')
|
if (!contribution) {
|
||||||
.from(DbTransaction, 'transaction')
|
logger.error(`Contribution not found for given id: ${id}`)
|
||||||
.where('transaction.userId = :id', { id: contribution.userId })
|
throw new Error('Contribution not found to given id.')
|
||||||
.orderBy('transaction.id', 'DESC')
|
|
||||||
.getOne()
|
|
||||||
logger.info('lastTransaction ID', lastTransaction ? lastTransaction.id : 'undefined')
|
|
||||||
|
|
||||||
let newBalance = new Decimal(0)
|
|
||||||
let decay: Decay | null = null
|
|
||||||
if (lastTransaction) {
|
|
||||||
decay = calculateDecay(
|
|
||||||
lastTransaction.balance,
|
|
||||||
lastTransaction.balanceDate,
|
|
||||||
receivedCallDate,
|
|
||||||
)
|
|
||||||
newBalance = decay.balance
|
|
||||||
}
|
}
|
||||||
newBalance = newBalance.add(contribution.amount.toString())
|
if (contribution.confirmedAt) {
|
||||||
|
logger.error(`Contribution already confirmd: ${id}`)
|
||||||
|
throw new Error('Contribution already confirmd.')
|
||||||
|
}
|
||||||
|
const moderatorUser = getUser(context)
|
||||||
|
if (moderatorUser.id === contribution.userId) {
|
||||||
|
logger.error('Moderator can not confirm own contribution')
|
||||||
|
throw new Error('Moderator can not confirm own contribution')
|
||||||
|
}
|
||||||
|
const user = await DbUser.findOneOrFail(
|
||||||
|
{ id: contribution.userId },
|
||||||
|
{ withDeleted: true, relations: ['emailContact'] },
|
||||||
|
)
|
||||||
|
if (user.deletedAt) {
|
||||||
|
logger.error('This user was deleted. Cannot confirm a contribution.')
|
||||||
|
throw new Error('This user was deleted. Cannot confirm a contribution.')
|
||||||
|
}
|
||||||
|
const creations = await getUserCreation(contribution.userId, clientTimezoneOffset, false)
|
||||||
|
validateContribution(
|
||||||
|
creations,
|
||||||
|
contribution.amount,
|
||||||
|
contribution.contributionDate,
|
||||||
|
clientTimezoneOffset,
|
||||||
|
)
|
||||||
|
|
||||||
const transaction = new DbTransaction()
|
const receivedCallDate = new Date()
|
||||||
transaction.typeId = TransactionTypeId.CREATION
|
const queryRunner = getConnection().createQueryRunner()
|
||||||
transaction.memo = contribution.memo
|
await queryRunner.connect()
|
||||||
transaction.userId = contribution.userId
|
await queryRunner.startTransaction('REPEATABLE READ') // 'READ COMMITTED')
|
||||||
transaction.previous = lastTransaction ? lastTransaction.id : null
|
try {
|
||||||
transaction.amount = contribution.amount
|
const lastTransaction = await queryRunner.manager
|
||||||
transaction.creationDate = contribution.contributionDate
|
.createQueryBuilder()
|
||||||
transaction.balance = newBalance
|
.select('transaction')
|
||||||
transaction.balanceDate = receivedCallDate
|
.from(DbTransaction, 'transaction')
|
||||||
transaction.decay = decay ? decay.decay : new Decimal(0)
|
.where('transaction.userId = :id', { id: contribution.userId })
|
||||||
transaction.decayStart = decay ? decay.start : null
|
.orderBy('transaction.id', 'DESC')
|
||||||
await queryRunner.manager.insert(DbTransaction, transaction)
|
.getOne()
|
||||||
|
logger.info('lastTransaction ID', lastTransaction ? lastTransaction.id : 'undefined')
|
||||||
|
|
||||||
contribution.confirmedAt = receivedCallDate
|
let newBalance = new Decimal(0)
|
||||||
contribution.confirmedBy = moderatorUser.id
|
let decay: Decay | null = null
|
||||||
contribution.transactionId = transaction.id
|
if (lastTransaction) {
|
||||||
contribution.contributionStatus = ContributionStatus.CONFIRMED
|
decay = calculateDecay(
|
||||||
await queryRunner.manager.update(DbContribution, { id: contribution.id }, contribution)
|
lastTransaction.balance,
|
||||||
|
lastTransaction.balanceDate,
|
||||||
|
receivedCallDate,
|
||||||
|
)
|
||||||
|
newBalance = decay.balance
|
||||||
|
}
|
||||||
|
newBalance = newBalance.add(contribution.amount.toString())
|
||||||
|
|
||||||
await queryRunner.commitTransaction()
|
const transaction = new DbTransaction()
|
||||||
logger.info('creation commited successfuly.')
|
transaction.typeId = TransactionTypeId.CREATION
|
||||||
sendContributionConfirmedEmail({
|
transaction.memo = contribution.memo
|
||||||
firstName: user.firstName,
|
transaction.userId = contribution.userId
|
||||||
lastName: user.lastName,
|
transaction.previous = lastTransaction ? lastTransaction.id : null
|
||||||
email: user.emailContact.email,
|
transaction.amount = contribution.amount
|
||||||
language: user.language,
|
transaction.creationDate = contribution.contributionDate
|
||||||
senderFirstName: moderatorUser.firstName,
|
transaction.balance = newBalance
|
||||||
senderLastName: moderatorUser.lastName,
|
transaction.balanceDate = receivedCallDate
|
||||||
contributionMemo: contribution.memo,
|
transaction.decay = decay ? decay.decay : new Decimal(0)
|
||||||
contributionAmount: contribution.amount,
|
transaction.decayStart = decay ? decay.start : null
|
||||||
})
|
await queryRunner.manager.insert(DbTransaction, transaction)
|
||||||
} catch (e) {
|
|
||||||
await queryRunner.rollbackTransaction()
|
contribution.confirmedAt = receivedCallDate
|
||||||
logger.error('Creation was not successful', e)
|
contribution.confirmedBy = moderatorUser.id
|
||||||
throw new Error('Creation was not successful.')
|
contribution.transactionId = transaction.id
|
||||||
|
contribution.contributionStatus = ContributionStatus.CONFIRMED
|
||||||
|
await queryRunner.manager.update(DbContribution, { id: contribution.id }, contribution)
|
||||||
|
|
||||||
|
await queryRunner.commitTransaction()
|
||||||
|
logger.info('creation commited successfuly.')
|
||||||
|
sendContributionConfirmedEmail({
|
||||||
|
firstName: user.firstName,
|
||||||
|
lastName: user.lastName,
|
||||||
|
email: user.emailContact.email,
|
||||||
|
language: user.language,
|
||||||
|
senderFirstName: moderatorUser.firstName,
|
||||||
|
senderLastName: moderatorUser.lastName,
|
||||||
|
contributionMemo: contribution.memo,
|
||||||
|
contributionAmount: contribution.amount,
|
||||||
|
})
|
||||||
|
} catch (e) {
|
||||||
|
await queryRunner.rollbackTransaction()
|
||||||
|
logger.error('Creation was not successful', e)
|
||||||
|
throw new Error('Creation was not successful.')
|
||||||
|
} finally {
|
||||||
|
await queryRunner.release()
|
||||||
|
}
|
||||||
|
|
||||||
|
const event = new Event()
|
||||||
|
const eventContributionConfirm = new EventContributionConfirm()
|
||||||
|
eventContributionConfirm.userId = user.id
|
||||||
|
eventContributionConfirm.amount = contribution.amount
|
||||||
|
eventContributionConfirm.contributionId = contribution.id
|
||||||
|
await eventProtocol.writeEvent(event.setEventContributionConfirm(eventContributionConfirm))
|
||||||
} finally {
|
} finally {
|
||||||
await queryRunner.release()
|
|
||||||
releaseLock()
|
releaseLock()
|
||||||
}
|
}
|
||||||
|
|
||||||
const event = new Event()
|
|
||||||
const eventContributionConfirm = new EventContributionConfirm()
|
|
||||||
eventContributionConfirm.userId = user.id
|
|
||||||
eventContributionConfirm.amount = contribution.amount
|
|
||||||
eventContributionConfirm.contributionId = contribution.id
|
|
||||||
await eventProtocol.writeEvent(event.setEventContributionConfirm(eventContributionConfirm))
|
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -211,7 +211,7 @@ export class TransactionResolver {
|
|||||||
// find current balance
|
// find current balance
|
||||||
const lastTransaction = await dbTransaction.findOne(
|
const lastTransaction = await dbTransaction.findOne(
|
||||||
{ userId: user.id },
|
{ userId: user.id },
|
||||||
{ order: { balanceDate: 'DESC' }, relations: ['contribution'] },
|
{ order: { id: 'DESC' }, relations: ['contribution'] },
|
||||||
)
|
)
|
||||||
logger.debug(`lastTransaction=${lastTransaction}`)
|
logger.debug(`lastTransaction=${lastTransaction}`)
|
||||||
|
|
||||||
|
|||||||
@ -1918,9 +1918,9 @@ camelcase@^6.2.0:
|
|||||||
integrity sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==
|
integrity sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==
|
||||||
|
|
||||||
caniuse-lite@^1.0.30001264:
|
caniuse-lite@^1.0.30001264:
|
||||||
version "1.0.30001418"
|
version "1.0.30001442"
|
||||||
resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001418.tgz"
|
resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001442.tgz"
|
||||||
integrity sha512-oIs7+JL3K9JRQ3jPZjlH6qyYDp+nBTCais7hjh0s+fuBwufc7uZ7hPYMXrDOJhV360KGMTcczMRObk0/iMqZRg==
|
integrity sha512-239m03Pqy0hwxYPYR5JwOIxRJfLTWtle9FV8zosfV5pHg+/51uD4nxcUlM8+mWWGfwKtt8lJNHnD3cWw9VZ6ow==
|
||||||
|
|
||||||
chacha20-universal@^1.0.4:
|
chacha20-universal@^1.0.4:
|
||||||
version "1.0.4"
|
version "1.0.4"
|
||||||
|
|||||||
@ -112,6 +112,17 @@ services:
|
|||||||
volumes:
|
volumes:
|
||||||
- /sessions
|
- /sessions
|
||||||
|
|
||||||
|
########################################################
|
||||||
|
# MAILSERVER TO FAKE SMTP ##############################
|
||||||
|
########################################################
|
||||||
|
mailserver:
|
||||||
|
image: maildev/maildev
|
||||||
|
ports:
|
||||||
|
- 1080:1080
|
||||||
|
- 1025:1025
|
||||||
|
networks:
|
||||||
|
- external-net
|
||||||
|
|
||||||
volumes:
|
volumes:
|
||||||
frontend_node_modules:
|
frontend_node_modules:
|
||||||
admin_node_modules:
|
admin_node_modules:
|
||||||
|
|||||||
@ -81,6 +81,17 @@ services:
|
|||||||
nginx:
|
nginx:
|
||||||
image: gradido/nginx:test
|
image: gradido/nginx:test
|
||||||
|
|
||||||
|
########################################################
|
||||||
|
# MAILSERVER TO FAKE SMTP ##############################
|
||||||
|
########################################################
|
||||||
|
mailserver:
|
||||||
|
image: maildev/maildev
|
||||||
|
ports:
|
||||||
|
- 1080:1080
|
||||||
|
- 1025:1025
|
||||||
|
networks:
|
||||||
|
- external-net
|
||||||
|
|
||||||
networks:
|
networks:
|
||||||
external-net:
|
external-net:
|
||||||
internal-net:
|
internal-net:
|
||||||
|
|||||||
@ -37,7 +37,7 @@
|
|||||||
</b-row>
|
</b-row>
|
||||||
<b-row class="mt-5 p-5">
|
<b-row class="mt-5 p-5">
|
||||||
<b-col>
|
<b-col>
|
||||||
<b-button @click="$emit('on-reset')">{{ $t('back') }}</b-button>
|
<b-button @click="$emit('on-back')">{{ $t('back') }}</b-button>
|
||||||
</b-col>
|
</b-col>
|
||||||
<b-col class="text-right">
|
<b-col class="text-right">
|
||||||
<b-button
|
<b-button
|
||||||
|
|||||||
@ -41,7 +41,7 @@
|
|||||||
</b-row>
|
</b-row>
|
||||||
<b-row class="mt-5 p-5">
|
<b-row class="mt-5 p-5">
|
||||||
<b-col>
|
<b-col>
|
||||||
<b-button @click="$emit('on-reset')">{{ $t('back') }}</b-button>
|
<b-button @click="$emit('on-back')">{{ $t('back') }}</b-button>
|
||||||
</b-col>
|
</b-col>
|
||||||
<b-col class="text-right">
|
<b-col class="text-right">
|
||||||
<b-button
|
<b-button
|
||||||
|
|||||||
@ -322,7 +322,7 @@ Die ganze Welt bezwingen.“`)
|
|||||||
[
|
[
|
||||||
{
|
{
|
||||||
email: 'someone@watches.tv',
|
email: 'someone@watches.tv',
|
||||||
amount: '87.23',
|
amount: 87.23,
|
||||||
memo: 'Long enough',
|
memo: 'Long enough',
|
||||||
selected: 'send',
|
selected: 'send',
|
||||||
},
|
},
|
||||||
|
|||||||
@ -144,7 +144,7 @@ export default {
|
|||||||
this.$emit('set-transaction', {
|
this.$emit('set-transaction', {
|
||||||
selected: this.radioSelected,
|
selected: this.radioSelected,
|
||||||
email: this.form.email,
|
email: this.form.email,
|
||||||
amount: this.form.amount,
|
amount: Number(this.form.amount.replace(',', '.')),
|
||||||
memo: this.form.memo,
|
memo: this.form.memo,
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
|
|||||||
@ -10,7 +10,7 @@
|
|||||||
<div class="text-center">
|
<div class="text-center">
|
||||||
<div><figure-qr-code :link="link" /></div>
|
<div><figure-qr-code :link="link" /></div>
|
||||||
<div>
|
<div>
|
||||||
<b-button variant="secondary" @click="$emit('on-reset')" class="mt-4" data-test="close-btn">
|
<b-button variant="secondary" @click="$emit('on-back')" class="mt-4" data-test="close-btn">
|
||||||
{{ $t('form.close') }}
|
{{ $t('form.close') }}
|
||||||
</b-button>
|
</b-button>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@ -6,7 +6,7 @@
|
|||||||
{{ $t('form.send_transaction_success') }}
|
{{ $t('form.send_transaction_success') }}
|
||||||
</div>
|
</div>
|
||||||
<div class="text-center mt-5">
|
<div class="text-center mt-5">
|
||||||
<b-button variant="primary" @click="$emit('on-reset')">{{ $t('form.close') }}</b-button>
|
<b-button variant="primary" @click="$emit('on-back')">{{ $t('form.close') }}</b-button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@ -24,7 +24,7 @@
|
|||||||
:size="72"
|
:size="72"
|
||||||
:color="'#fff'"
|
:color="'#fff'"
|
||||||
:username="`${transaction.linkedUser.firstName} ${transaction.linkedUser.lastName}`"
|
:username="`${transaction.linkedUser.firstName} ${transaction.linkedUser.lastName}`"
|
||||||
:initials="`${transaction.linkedUser.firstName[0]} ${transaction.linkedUser.lastName[0]}`"
|
:initials="`${transaction.linkedUser.firstName[0]}${transaction.linkedUser.lastName[0]}`"
|
||||||
></avatar>
|
></avatar>
|
||||||
</div>
|
</div>
|
||||||
</b-col>
|
</b-col>
|
||||||
|
|||||||
@ -15,7 +15,7 @@
|
|||||||
:amount="transactionData.amount"
|
:amount="transactionData.amount"
|
||||||
:memo="transactionData.memo"
|
:memo="transactionData.memo"
|
||||||
@send-transaction="sendTransaction"
|
@send-transaction="sendTransaction"
|
||||||
@on-reset="onReset"
|
@on-back="onBack"
|
||||||
></transaction-confirmation-send>
|
></transaction-confirmation-send>
|
||||||
</template>
|
</template>
|
||||||
<template #transactionConfirmationLink>
|
<template #transactionConfirmationLink>
|
||||||
@ -26,17 +26,17 @@
|
|||||||
:memo="transactionData.memo"
|
:memo="transactionData.memo"
|
||||||
:loading="loading"
|
:loading="loading"
|
||||||
@send-transaction="sendTransaction"
|
@send-transaction="sendTransaction"
|
||||||
@on-reset="onReset"
|
@on-back="onBack"
|
||||||
></transaction-confirmation-link>
|
></transaction-confirmation-link>
|
||||||
</template>
|
</template>
|
||||||
<template #transactionResultSendSuccess>
|
<template #transactionResultSendSuccess>
|
||||||
<transaction-result-send-success @on-reset="onReset"></transaction-result-send-success>
|
<transaction-result-send-success @on-back="onBack"></transaction-result-send-success>
|
||||||
</template>
|
</template>
|
||||||
<template #transactionResultSendError>
|
<template #transactionResultSendError>
|
||||||
<transaction-result-send-error
|
<transaction-result-send-error
|
||||||
:error="error"
|
:error="error"
|
||||||
:errorResult="errorResult"
|
:errorResult="errorResult"
|
||||||
@on-reset="onReset"
|
@on-back="onBack"
|
||||||
></transaction-result-send-error>
|
></transaction-result-send-error>
|
||||||
</template>
|
</template>
|
||||||
<template #transactionResultLink>
|
<template #transactionResultLink>
|
||||||
@ -45,7 +45,7 @@
|
|||||||
:amount="amount"
|
:amount="amount"
|
||||||
:memo="memo"
|
:memo="memo"
|
||||||
:validUntil="validUntil"
|
:validUntil="validUntil"
|
||||||
@on-reset="onReset"
|
@on-back="onBack"
|
||||||
></transaction-result-link>
|
></transaction-result-link>
|
||||||
</template>
|
</template>
|
||||||
</gdd-send>
|
</gdd-send>
|
||||||
@ -169,8 +169,9 @@ export default {
|
|||||||
}
|
}
|
||||||
this.loading = false
|
this.loading = false
|
||||||
},
|
},
|
||||||
onReset() {
|
onBack() {
|
||||||
this.currentTransactionStep = TRANSACTION_STEPS.transactionForm
|
this.currentTransactionStep = TRANSACTION_STEPS.transactionForm
|
||||||
|
this.$mount()
|
||||||
},
|
},
|
||||||
updateTransactions(pagination) {
|
updateTransactions(pagination) {
|
||||||
this.$emit('update-transactions', pagination)
|
this.$emit('update-transactions', pagination)
|
||||||
|
|||||||
@ -4578,9 +4578,9 @@ caniuse-api@^3.0.0:
|
|||||||
lodash.uniq "^4.5.0"
|
lodash.uniq "^4.5.0"
|
||||||
|
|
||||||
caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001181, caniuse-lite@^1.0.30001280, caniuse-lite@^1.0.30001286:
|
caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001181, caniuse-lite@^1.0.30001280, caniuse-lite@^1.0.30001286:
|
||||||
version "1.0.30001439"
|
version "1.0.30001442"
|
||||||
resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001439.tgz"
|
resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001442.tgz"
|
||||||
integrity sha512-1MgUzEkoMO6gKfXflStpYgZDlFM7M/ck/bgfVCACO5vnAf0fXoNVHdWtqGU+MYca+4bL9Z5bpOVmR33cWW9G2A==
|
integrity sha512-239m03Pqy0hwxYPYR5JwOIxRJfLTWtle9FV8zosfV5pHg+/51uD4nxcUlM8+mWWGfwKtt8lJNHnD3cWw9VZ6ow==
|
||||||
|
|
||||||
capture-exit@^2.0.0:
|
capture-exit@^2.0.0:
|
||||||
version "2.0.0"
|
version "2.0.0"
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user