diff --git a/admin/package.json b/admin/package.json
index ae1f1c305..3d3919954 100644
--- a/admin/package.json
+++ b/admin/package.json
@@ -14,7 +14,7 @@
"analyse-bundle": "yarn build && webpack-bundle-analyzer dist/webpack.stats.json",
"lint": "eslint --max-warnings=0 --ext .js,.vue,.json .",
"stylelint": "stylelint --max-warnings=0 '**/*.{scss,vue}'",
- "test": "TZ=UTC jest --coverage",
+ "test": "cross-env TZ=UTC jest --coverage",
"locales": "scripts/sort.sh"
},
"dependencies": {
@@ -57,6 +57,7 @@
"@vue/cli-service": "~4.5.0",
"babel-eslint": "^10.1.0",
"babel-plugin-transform-require-context": "^0.1.1",
+ "cross-env": "^7.0.3",
"eslint": "7.25.0",
"eslint-config-prettier": "^8.3.0",
"eslint-config-standard": "^16.0.3",
diff --git a/admin/yarn.lock b/admin/yarn.lock
index d5fae27fe..af1d18fa6 100644
--- a/admin/yarn.lock
+++ b/admin/yarn.lock
@@ -4688,6 +4688,13 @@ create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7:
safe-buffer "^5.0.1"
sha.js "^2.4.8"
+cross-env@^7.0.3:
+ version "7.0.3"
+ resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-7.0.3.tgz#865264b29677dc015ba8418918965dd232fc54cf"
+ integrity sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==
+ dependencies:
+ cross-spawn "^7.0.1"
+
cross-spawn@^5.0.1:
version "5.1.0"
resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449"
@@ -4708,7 +4715,7 @@ cross-spawn@^6.0.0:
shebang-command "^1.2.0"
which "^1.2.9"
-cross-spawn@^7.0.0, cross-spawn@^7.0.2:
+cross-spawn@^7.0.0, cross-spawn@^7.0.1, cross-spawn@^7.0.2:
version "7.0.3"
resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6"
integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==
diff --git a/backend/package.json b/backend/package.json
index 3c4066d6b..8654f4cc7 100644
--- a/backend/package.json
+++ b/backend/package.json
@@ -10,11 +10,11 @@
"scripts": {
"build": "tsc --build",
"clean": "tsc --build --clean",
- "start": "TZ=UTC TS_NODE_BASEURL=./build node -r tsconfig-paths/register build/src/index.js",
- "dev": "TZ=UTC nodemon -w src --ext ts --exec ts-node -r tsconfig-paths/register src/index.ts",
+ "start": "cross-env TZ=UTC TS_NODE_BASEURL=./build node -r tsconfig-paths/register build/src/index.js",
+ "dev": "cross-env TZ=UTC nodemon -w src --ext ts --exec ts-node -r tsconfig-paths/register src/index.ts",
"lint": "eslint --max-warnings=0 --ext .js,.ts .",
- "test": "TZ=UTC NODE_ENV=development jest --runInBand --coverage --forceExit --detectOpenHandles",
- "seed": "TZ=UTC ts-node -r tsconfig-paths/register src/seeds/index.ts"
+ "test": "cross-env TZ=UTC NODE_ENV=development jest --runInBand --coverage --forceExit --detectOpenHandles",
+ "seed": "cross-env TZ=UTC ts-node -r tsconfig-paths/register src/seeds/index.ts"
},
"dependencies": {
"@types/jest": "^27.0.2",
@@ -25,6 +25,7 @@
"axios": "^0.21.1",
"class-validator": "^0.13.1",
"cors": "^2.8.5",
+ "cross-env": "^7.0.3",
"decimal.js-light": "^2.5.1",
"dotenv": "^10.0.0",
"express": "^4.17.1",
diff --git a/backend/yarn.lock b/backend/yarn.lock
index 3ba20211a..f37b64d11 100644
--- a/backend/yarn.lock
+++ b/backend/yarn.lock
@@ -1900,7 +1900,14 @@ create-require@^1.1.0:
resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333"
integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==
-cross-spawn@^7.0.2, cross-spawn@^7.0.3:
+cross-env@^7.0.3:
+ version "7.0.3"
+ resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-7.0.3.tgz#865264b29677dc015ba8418918965dd232fc54cf"
+ integrity sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==
+ dependencies:
+ cross-spawn "^7.0.1"
+
+cross-spawn@^7.0.1, cross-spawn@^7.0.2, cross-spawn@^7.0.3:
version "7.0.3"
resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6"
integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==
diff --git a/database/package.json b/database/package.json
index 40c43c9b5..a1fffa882 100644
--- a/database/package.json
+++ b/database/package.json
@@ -10,15 +10,15 @@
"scripts": {
"build": "mkdir -p build/src/config/ && cp src/config/*.txt build/src/config/ && tsc --build",
"clean": "tsc --build --clean",
- "up": "TZ=UTC node build/src/index.js up",
- "down": "TZ=UTC node build/src/index.js down",
- "reset": "TZ=UTC node build/src/index.js reset",
- "dev_up": "TZ=UTC ts-node src/index.ts up",
- "dev_down": "TZ=UTC ts-node src/index.ts down",
- "dev_reset": "TZ=UTC ts-node src/index.ts reset",
+ "up": "cross-env TZ=UTC node build/src/index.js up",
+ "down": "cross-env TZ=UTC node build/src/index.js down",
+ "reset": "cross-env TZ=UTC node build/src/index.js reset",
+ "dev_up": "cross-env TZ=UTC ts-node src/index.ts up",
+ "dev_down": "cross-env TZ=UTC ts-node src/index.ts down",
+ "dev_reset": "cross-env TZ=UTC ts-node src/index.ts reset",
"lint": "eslint --max-warnings=0 --ext .js,.ts .",
"seed:config": "ts-node ./node_modules/typeorm-seeding/dist/cli.js config",
- "seed": "TZ=UTC ts-node src/index.ts seed"
+ "seed": "cross-env TZ=UTC ts-node src/index.ts seed"
},
"devDependencies": {
"@types/faker": "^5.5.9",
@@ -37,6 +37,7 @@
"typescript": "^4.3.5"
},
"dependencies": {
+ "cross-env": "^7.0.3",
"crypto": "^1.0.1",
"decimal.js-light": "^2.5.1",
"dotenv": "^10.0.0",
diff --git a/database/yarn.lock b/database/yarn.lock
index a2df693ec..e5d74929c 100644
--- a/database/yarn.lock
+++ b/database/yarn.lock
@@ -481,7 +481,14 @@ create-require@^1.1.0:
resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333"
integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==
-cross-spawn@^7.0.2:
+cross-env@^7.0.3:
+ version "7.0.3"
+ resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-7.0.3.tgz#865264b29677dc015ba8418918965dd232fc54cf"
+ integrity sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==
+ dependencies:
+ cross-spawn "^7.0.1"
+
+cross-spawn@^7.0.1, cross-spawn@^7.0.2:
version "7.0.3"
resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6"
integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==
diff --git a/docu/graphics/federation.drawio b/docu/graphics/federation.drawio
new file mode 100644
index 000000000..1b4db9002
--- /dev/null
+++ b/docu/graphics/federation.drawio
@@ -0,0 +1,135 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docu/graphics/federation.png b/docu/graphics/federation.png
new file mode 100644
index 000000000..6d25708f8
Binary files /dev/null and b/docu/graphics/federation.png differ
diff --git a/frontend/package.json b/frontend/package.json
index 3bd975798..b3091d4b4 100755
--- a/frontend/package.json
+++ b/frontend/package.json
@@ -10,7 +10,7 @@
"analyse-bundle": "yarn build && webpack-bundle-analyzer dist/webpack.stats.json",
"lint": "eslint --max-warnings=0 --ext .js,.vue,.json .",
"stylelint": "stylelint --max-warnings=0 '**/*.{scss,vue}'",
- "test": "TZ=UTC jest --coverage",
+ "test": "cross-env TZ=UTC jest --coverage",
"locales": "scripts/sort.sh"
},
"dependencies": {
@@ -72,6 +72,7 @@
"babel-eslint": "^10.1.0",
"babel-plugin-component": "^1.1.0",
"babel-plugin-transform-require-context": "^0.1.1",
+ "cross-env": "^7.0.3",
"dotenv-webpack": "^7.0.3",
"postcss": "^8.4.8",
"postcss-html": "^1.3.0",
diff --git a/frontend/src/components/ClipboardCopy.vue b/frontend/src/components/ClipboardCopy.vue
index ff8a3ae87..936f6db1a 100644
--- a/frontend/src/components/ClipboardCopy.vue
+++ b/frontend/src/components/ClipboardCopy.vue
@@ -3,9 +3,12 @@
-
+
{{ $t('gdd_per_link.copy') }}
+
+
+
@@ -30,3 +33,8 @@ export default {
},
}
+
diff --git a/frontend/src/components/GddSend/TransactionResultLink.vue b/frontend/src/components/GddSend/TransactionResultLink.vue
index 633796b23..04445acfe 100644
--- a/frontend/src/components/GddSend/TransactionResultLink.vue
+++ b/frontend/src/components/GddSend/TransactionResultLink.vue
@@ -3,13 +3,12 @@
{{ $t('gdd_per_link.created') }}
-
-
+
-
+
-
+
{{ $t('form.close') }}
@@ -33,5 +32,15 @@ export default {
required: true,
},
},
+ data() {
+ return {
+ showQrcode: false,
+ }
+ },
+ methods: {
+ showQrCodeButton() {
+ this.showQrcode = !this.showQrcode
+ },
+ },
}
diff --git a/frontend/src/components/GddSend/TransactionResultSendError.vue b/frontend/src/components/GddSend/TransactionResultSendError.vue
index 6a3761092..279ee931e 100644
--- a/frontend/src/components/GddSend/TransactionResultSendError.vue
+++ b/frontend/src/components/GddSend/TransactionResultSendError.vue
@@ -22,7 +22,9 @@
{{ errorResult }}
- {{ $t('form.close') }}
+
+ {{ $t('form.close') }}
+
diff --git a/frontend/src/components/GddSend/TransactionResultSendSuccess.vue b/frontend/src/components/GddSend/TransactionResultSendSuccess.vue
index 74bb6963a..bc8c39f3b 100644
--- a/frontend/src/components/GddSend/TransactionResultSendSuccess.vue
+++ b/frontend/src/components/GddSend/TransactionResultSendSuccess.vue
@@ -9,7 +9,7 @@
{{ $t('form.send_transaction_success') }}
- {{ $t('form.close') }}
+ {{ $t('form.close') }}
diff --git a/frontend/src/components/QrCode/FigureQrCode.spec.js b/frontend/src/components/QrCode/FigureQrCode.spec.js
index d19d806d3..715a5d5d5 100644
--- a/frontend/src/components/QrCode/FigureQrCode.spec.js
+++ b/frontend/src/components/QrCode/FigureQrCode.spec.js
@@ -4,7 +4,7 @@ import FigureQrCode from './FigureQrCode'
const localVue = global.localVue
const propsData = {
- text: '',
+ link: '',
}
describe('FigureQrCode', () => {
diff --git a/frontend/src/components/QrCode/FigureQrCode.vue b/frontend/src/components/QrCode/FigureQrCode.vue
index df450a52e..00f1b54b9 100644
--- a/frontend/src/components/QrCode/FigureQrCode.vue
+++ b/frontend/src/components/QrCode/FigureQrCode.vue
@@ -14,14 +14,14 @@ export default {
QRCanvas,
},
props: {
- text: { type: String, required: true },
+ link: { type: String, required: true },
},
data() {
return {
options: {
cellSize: 8,
correctLevel: 'H',
- data: this.text,
+ data: this.link,
},
}
},
diff --git a/frontend/src/components/TransactionLinks/TransactionLink.spec.js b/frontend/src/components/TransactionLinks/TransactionLink.spec.js
index b2d8f6f54..ad9e4860e 100644
--- a/frontend/src/components/TransactionLinks/TransactionLink.spec.js
+++ b/frontend/src/components/TransactionLinks/TransactionLink.spec.js
@@ -44,115 +44,140 @@ describe('TransactionLink', () => {
expect(wrapper.find('div.transaction-link').exists()).toBeTruthy()
})
- describe('Copy link to Clipboard', () => {
- const navigatorClipboard = navigator.clipboard
- beforeAll(() => {
- delete navigator.clipboard
- navigator.clipboard = { writeText: navigatorClipboardMock }
- })
- afterAll(() => {
- navigator.clipboard = navigatorClipboard
+ describe('Link validUntil Date is not valid', () => {
+ it('has no copy link button', () => {
+ expect(wrapper.find('.test-copy-link').exists()).toBe(false)
})
- describe('copy with success', () => {
- beforeEach(async () => {
- navigatorClipboardMock.mockResolvedValue()
- await wrapper.find('.test-copy-link').trigger('click')
- })
- it('should call clipboard.writeText', () => {
- expect(navigator.clipboard.writeText).toHaveBeenCalledWith(
- 'http://localhost/redeem/c00000000c000000c0000',
- )
- })
- it('toasts success message', () => {
- expect(toastSuccessSpy).toBeCalledWith('gdd_per_link.link-copied')
- })
+ it('has no Qr-Code Button ', () => {
+ expect(wrapper.find('.test-qr-code').exists()).toBe(false)
+ })
+
+ it('has delete link button ', () => {
+ expect(wrapper.find('.test-delete-link').exists()).toBe(true)
})
})
- describe('qr code modal', () => {
- let spy
-
- beforeEach(() => {
+ describe('Link validUntil Date is valid ', () => {
+ beforeEach(async () => {
+ const now = new Date()
jest.clearAllMocks()
+ await wrapper.setProps({
+ validUntil: `${new Date(now.getFullYear(), now.getMonth(), now.getDate() + 2)}`,
+ })
})
- describe('with success', () => {
+ describe('Copy link to Clipboard', () => {
+ const navigatorClipboard = navigator.clipboard
+ beforeAll(() => {
+ delete navigator.clipboard
+ navigator.clipboard = { writeText: navigatorClipboardMock }
+ })
+ afterAll(() => {
+ navigator.clipboard = navigatorClipboard
+ })
+
+ describe('copy with success', () => {
+ beforeEach(async () => {
+ navigatorClipboardMock.mockResolvedValue()
+ await wrapper.find('.test-copy-link .dropdown-item').trigger('click')
+ })
+
+ it('should call clipboard.writeText', () => {
+ expect(navigator.clipboard.writeText).toHaveBeenCalledWith(
+ 'http://localhost/redeem/c00000000c000000c0000',
+ )
+ })
+ it('toasts success message', () => {
+ expect(toastSuccessSpy).toBeCalledWith('gdd_per_link.link-copied')
+ })
+ })
+ })
+
+ describe('qr code modal', () => {
+ let spy
+
beforeEach(async () => {
- spy = jest.spyOn(wrapper.vm.$bvModal, 'show')
- // spy.mockImplementation(() => Promise.resolve('some value'))
- // mockAPIcall.mockResolvedValue()
- await wrapper.find('.test-qr-code').trigger('click')
+ jest.clearAllMocks()
})
- it('qr-code Modal if show', () => {
- expect(spy).toBeCalled()
+ describe('with success', () => {
+ beforeEach(async () => {
+ spy = jest.spyOn(wrapper.vm.$bvModal, 'show')
+ // spy.mockImplementation(() => Promise.resolve('some value'))
+ // mockAPIcall.mockResolvedValue()
+ await wrapper.find('.test-qr-code .dropdown-item').trigger('click')
+ })
+
+ it('opens the qr-code Modal', () => {
+ expect(spy).toBeCalled()
+ })
})
})
- })
- describe('delete link', () => {
- let spy
+ describe('delete link', () => {
+ let spy
- beforeEach(() => {
- jest.clearAllMocks()
- })
-
- describe('with success', () => {
beforeEach(async () => {
- spy = jest.spyOn(wrapper.vm.$bvModal, 'msgBoxConfirm')
- spy.mockImplementation(() => Promise.resolve('some value'))
- mockAPIcall.mockResolvedValue()
- await wrapper.find('.test-delete-link').trigger('click')
+ jest.clearAllMocks()
})
- it('test Modal if confirm true', () => {
- expect(spy).toBeCalled()
+ describe('with success', () => {
+ beforeEach(async () => {
+ spy = jest.spyOn(wrapper.vm.$bvModal, 'msgBoxConfirm')
+ spy.mockImplementation(() => Promise.resolve('some value'))
+ mockAPIcall.mockResolvedValue()
+ await wrapper.find('.test-delete-link .dropdown-item').trigger('click')
+ })
+
+ it('opens the modal ', () => {
+ expect(spy).toBeCalled()
+ })
+
+ it('calls the API', () => {
+ expect(mockAPIcall).toBeCalledWith(
+ expect.objectContaining({
+ mutation: deleteTransactionLink,
+ variables: {
+ id: 12,
+ },
+ }),
+ )
+ })
+
+ it('toasts a success message', () => {
+ expect(toastSuccessSpy).toBeCalledWith('gdd_per_link.deleted')
+ })
+
+ it('emits reset transaction link list', () => {
+ expect(wrapper.emitted('reset-transaction-link-list')).toBeTruthy()
+ })
})
- it('calls the API', () => {
- expect(mockAPIcall).toBeCalledWith(
- expect.objectContaining({
- mutation: deleteTransactionLink,
- variables: {
- id: 12,
- },
- }),
- )
+ describe('with error', () => {
+ beforeEach(async () => {
+ spy = jest.spyOn(wrapper.vm.$bvModal, 'msgBoxConfirm')
+ spy.mockImplementation(() => Promise.resolve('some value'))
+ mockAPIcall.mockRejectedValue({ message: 'Something went wrong :(' })
+ await wrapper.find('.test-delete-link .dropdown-item').trigger('click')
+ })
+
+ it('toasts an error message', () => {
+ expect(toastErrorSpy).toBeCalledWith('Something went wrong :(')
+ })
})
- it('toasts a success message', () => {
- expect(toastSuccessSpy).toBeCalledWith('gdd_per_link.deleted')
- })
+ describe('cancel delete', () => {
+ beforeEach(async () => {
+ spy = jest.spyOn(wrapper.vm.$bvModal, 'msgBoxConfirm')
+ spy.mockImplementation(() => Promise.resolve(false))
+ mockAPIcall.mockResolvedValue()
+ await wrapper.find('.test-delete-link .dropdown-item').trigger('click')
+ })
- it('emits reset transaction link list', () => {
- expect(wrapper.emitted('reset-transaction-link-list')).toBeTruthy()
- })
- })
-
- describe('with error', () => {
- beforeEach(async () => {
- spy = jest.spyOn(wrapper.vm.$bvModal, 'msgBoxConfirm')
- spy.mockImplementation(() => Promise.resolve('some value'))
- mockAPIcall.mockRejectedValue({ message: 'Something went wrong :(' })
- await wrapper.find('.test-delete-link').trigger('click')
- })
-
- it('toasts an error message', () => {
- expect(toastErrorSpy).toBeCalledWith('Something went wrong :(')
- })
- })
-
- describe('cancel delete', () => {
- beforeEach(async () => {
- spy = jest.spyOn(wrapper.vm.$bvModal, 'msgBoxConfirm')
- spy.mockImplementation(() => Promise.resolve(false))
- mockAPIcall.mockResolvedValue()
- await wrapper.find('.test-delete-link').trigger('click')
- })
-
- it('does not call the API', () => {
- expect(mockAPIcall).not.toBeCalled()
+ it('does not call the API', () => {
+ expect(mockAPIcall).not.toBeCalled()
+ })
})
})
})
diff --git a/frontend/src/components/TransactionLinks/TransactionLink.vue b/frontend/src/components/TransactionLinks/TransactionLink.vue
index 63e610b26..5b8e15d5c 100644
--- a/frontend/src/components/TransactionLinks/TransactionLink.vue
+++ b/frontend/src/components/TransactionLinks/TransactionLink.vue
@@ -1,55 +1,54 @@
-
-
+
+
-
+
-
+
-
+
-
-
-
-
+
+
+
+
+
+
+
+
+ {{ $t('gdd_per_link.copy') }}
+
+
+
+ {{ $t('qrCode') }}
+
+
+
+ {{ $t('delete') }}
+
+
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+ {{ $t('qrCode') }}
+
+
+
+ {{ link }}
+
+
@@ -115,6 +114,9 @@ export default {
decay() {
return `${this.amount - this.holdAvailableAmount}`
},
+ validLink() {
+ return new Date(this.validUntil) > new Date()
+ },
},
}
diff --git a/frontend/src/components/TransactionRows/DateRow.vue b/frontend/src/components/TransactionRows/DateRow.vue
index 5f526caaf..5998be134 100644
--- a/frontend/src/components/TransactionRows/DateRow.vue
+++ b/frontend/src/components/TransactionRows/DateRow.vue
@@ -3,7 +3,7 @@
- {{ diffNow ? $t('gdd_per_link.valid_until') : $t('form.date') }}
+ {{ text }}
@@ -27,6 +27,20 @@ export default {
required: false,
default: false,
},
+ validLink: {
+ type: Boolean,
+ required: false,
+ default: false,
+ },
+ },
+ computed: {
+ text() {
+ if (this.diffNow)
+ return this.validLink
+ ? this.$t('gdd_per_link.validUntil')
+ : this.$t('gdd_per_link.expiredOn')
+ return this.$t('form.date')
+ },
},
}
diff --git a/frontend/src/locales/de.json b/frontend/src/locales/de.json
index 20ce055d4..16111ef4a 100644
--- a/frontend/src/locales/de.json
+++ b/frontend/src/locales/de.json
@@ -102,6 +102,7 @@
"decay-14-day": "Vergänglichkeit für 14 Tage",
"delete-the-link": "Den Link löschen?",
"deleted": "Der Link wurde gelöscht!",
+ "expiredOn": "Abgelaufen am",
"has-account": "Du besitzt bereits ein Gradido Konto?",
"header": "Gradidos versenden per Link",
"isFree": "Gradido ist weltweit kostenfrei.",
@@ -121,7 +122,7 @@
"redeemed-title": "eingelöst",
"to-login": "Log dich ein",
"to-register": "Registriere ein neues Konto.",
- "valid_until": "Gültig bis"
+ "validUntil": "Gültig bis"
},
"gdt": {
"calculation": "Berechnung der Gradido Transform",
@@ -164,6 +165,7 @@
"infoText": "Wenn dir dein Empfehlungsgeber seine Publisher-Id gegeben hat, trage sie hier ein, sonst lass das Feld bitte unverändert!",
"publisherId": "Publisher-Id:"
},
+ "qrCode": "QR Code",
"send_gdd": "GDD versenden",
"send_per_link": "GDD versenden per Link",
"settings": {
diff --git a/frontend/src/locales/en.json b/frontend/src/locales/en.json
index 201c44d93..70a2fabca 100644
--- a/frontend/src/locales/en.json
+++ b/frontend/src/locales/en.json
@@ -102,6 +102,7 @@
"decay-14-day": "Decay for 14 days",
"delete-the-link": "Delete the link?",
"deleted": "The link was deleted!",
+ "expiredOn": "Expired on",
"has-account": "You already have a Gradido account?",
"header": "Send Gradidos via link",
"isFree": "Gradido is free of charge worldwide.",
@@ -121,7 +122,7 @@
"redeemed-title": "redeemed",
"to-login": "Log in",
"to-register": "Register a new account.",
- "valid_until": "Valid until"
+ "validUntil": "Valid until"
},
"gdt": {
"calculation": "Calculation of Gradido Transform",
@@ -164,6 +165,7 @@
"infoText": "If your referrer has given you his publisher id, enter it here, otherwise leave the field unchanged!",
"publisherId": "PublisherID:"
},
+ "qrCode": "QR Code",
"send_gdd": "GDD send",
"send_per_link": "GDD send via link",
"settings": {
diff --git a/frontend/src/pages/Send.spec.js b/frontend/src/pages/Send.spec.js
index 0c6cadb2e..88759c839 100644
--- a/frontend/src/pages/Send.spec.js
+++ b/frontend/src/pages/Send.spec.js
@@ -253,7 +253,7 @@ describe('Send', () => {
describe('close button click', () => {
beforeEach(async () => {
- await wrapper.findAll('button').at(1).trigger('click')
+ await wrapper.findAll('button').at(2).trigger('click')
})
it('Shows the TransactionForm', () => {
diff --git a/frontend/yarn.lock b/frontend/yarn.lock
index cc7868ce3..b7648c9c8 100644
--- a/frontend/yarn.lock
+++ b/frontend/yarn.lock
@@ -5276,6 +5276,13 @@ create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7:
safe-buffer "^5.0.1"
sha.js "^2.4.8"
+cross-env@^7.0.3:
+ version "7.0.3"
+ resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-7.0.3.tgz#865264b29677dc015ba8418918965dd232fc54cf"
+ integrity sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==
+ dependencies:
+ cross-spawn "^7.0.1"
+
cross-spawn@^5.0.1, cross-spawn@^5.1.0:
version "5.1.0"
resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449"
@@ -5296,7 +5303,7 @@ cross-spawn@^6.0.0:
shebang-command "^1.2.0"
which "^1.2.9"
-cross-spawn@^7.0.0, cross-spawn@^7.0.2:
+cross-spawn@^7.0.0, cross-spawn@^7.0.1, cross-spawn@^7.0.2:
version "7.0.3"
resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6"
integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==