diff --git a/.gitignore b/.gitignore
index b02b9d6ec..f771e49f4 100644
--- a/.gitignore
+++ b/.gitignore
@@ -11,3 +11,4 @@ package-lock.json
/deployment/bare_metal/nginx/update-page/updating.html
/deployment/bare_metal/log
/deployment/bare_metal/backup
+/.nvmrc
diff --git a/admin/.gitignore b/admin/.gitignore
index 6bb62f667..d78b066c1 100644
--- a/admin/.gitignore
+++ b/admin/.gitignore
@@ -9,4 +9,5 @@ dist/
coverage/
# emacs
-*~
\ No newline at end of file
+*~
+/.nvmrc
diff --git a/backend/.gitignore b/backend/.gitignore
index 147e82849..2381e9abc 100644
--- a/backend/.gitignore
+++ b/backend/.gitignore
@@ -5,4 +5,5 @@
package-json.lock
coverage
# emacs
-*~
\ No newline at end of file
+*~
+/.nvmrc
diff --git a/database/.gitignore b/database/.gitignore
index bce5da58f..d1bd69ed3 100644
--- a/database/.gitignore
+++ b/database/.gitignore
@@ -24,4 +24,5 @@ package-lock.json
coverage/
-*~
\ No newline at end of file
+*~
+/.nvmrc
diff --git a/deployment/bare_metal/setup.md b/deployment/bare_metal/setup.md
index f39228879..f43a3d655 100644
--- a/deployment/bare_metal/setup.md
+++ b/deployment/bare_metal/setup.md
@@ -2,6 +2,9 @@
# This assums you have root access via ssh to your cleanly setup server
# Furthermore this assumes you have debian (11 64bit) running
+# Check your (Sub-)Domain with your Provider.
+# In this document gddhost.tld refers to your chosen domain
+
> ssh root@gddhost.tld
# change root default shell
@@ -87,9 +90,10 @@
# Adjust .env
# NOTE ';' can not be part of any value
+# The Github Secret is Created on Github in Settimgs -> Webhooks
> cd gradido/deployment/bare_metal
> cp .env.dist .env
> nano .env
>> Adjust values accordingly
# TODO the install.sh is not yet ready to run directly - consider to use it as pattern to do it manually
-> ./install.sh
\ No newline at end of file
+> ./install.sh
diff --git a/frontend/.gitignore b/frontend/.gitignore
index b19667d17..2054a5cd5 100644
--- a/frontend/.gitignore
+++ b/frontend/.gitignore
@@ -23,4 +23,5 @@ package-lock.json
coverage/
-*~
\ No newline at end of file
+*~
+/.nvmrc
diff --git a/frontend/src/components/Message/Message.spec.js b/frontend/src/components/Message/Message.spec.js
index 03efa8026..1d911812f 100644
--- a/frontend/src/components/Message/Message.spec.js
+++ b/frontend/src/components/Message/Message.spec.js
@@ -30,14 +30,34 @@ describe('Message', () => {
expect(wrapper.find('div.header').exists()).toBe(true)
})
- it('renders title, subtitle, and button text', () => {
- expect(wrapper.find('.test-message-headline').text()).toBe('Headline text')
- expect(wrapper.find('.test-message-subtitle').text()).toBe('Subtitle text')
- expect(wrapper.find('.test-message-button').text()).toBe('login')
+ describe('with button', () => {
+ it('renders title, subtitle, and button text', () => {
+ expect(wrapper.find('.test-message-headline').text()).toBe('Headline text')
+ expect(wrapper.find('.test-message-subtitle').text()).toBe('Subtitle text')
+ expect(wrapper.find('.test-message-button').text()).toBe('login')
+ })
+
+ it('button link redirects to /login', () => {
+ expect(wrapper.find('a.btn').attributes('href')).toBe('/login')
+ })
})
- it('button link redirects to /login', () => {
- expect(wrapper.find('a.btn').attributes('href')).toBe('/login')
+ describe('without button', () => {
+ beforeEach(() => {
+ wrapper.setProps({
+ buttonText: null,
+ linkTo: null,
+ })
+ })
+
+ it('renders title, subtitle, and button text', () => {
+ expect(wrapper.find('.test-message-headline').text()).toBe('site.thx.title')
+ expect(wrapper.find('.test-message-subtitle').text()).toBe('site.thx.email')
+ })
+
+ it('button is not shown', () => {
+ expect(wrapper.find('.test-message-button').exists()).toBe(false)
+ })
})
})
})
diff --git a/frontend/src/components/Message/Message.vue b/frontend/src/components/Message/Message.vue
index a8a7c2800..caf2465f9 100644
--- a/frontend/src/components/Message/Message.vue
+++ b/frontend/src/components/Message/Message.vue
@@ -6,12 +6,7 @@
{{ headline }}
{{ subtitle }}
-
+
{{ buttonText }}
@@ -28,17 +23,11 @@ export default {
subtitle: { type: String, required: true },
buttonText: { type: String, required: false, default: null },
linkTo: { type: String, required: false, default: null },
- callback: { type: Function, required: false, default: null },
code: { type: String, required: false, default: null }, // Wolle: to be removed by adding it directly to the "linkTo"
},
- methods: {
- optionalCallback() {
- if (this.callback) {
- this.callback()
- }
- },
+ computed: {
showButton() {
- return this.buttonText && (this.linkTo || this.callback)
+ return this.buttonText && this.linkTo
},
buttonLinkTo() {
return this.linkTo ? this.linkTo + (this.code ? `/${this.code}` : '') : null
diff --git a/frontend/src/components/Transactions/TransactionLinkSummary.spec.js b/frontend/src/components/Transactions/TransactionLinkSummary.spec.js
index b60cc60f8..ba07f7aff 100644
--- a/frontend/src/components/Transactions/TransactionLinkSummary.spec.js
+++ b/frontend/src/components/Transactions/TransactionLinkSummary.spec.js
@@ -227,6 +227,36 @@ describe('TransactionLinkSummary', () => {
fetchPolicy: 'network-only',
})
})
+
+ describe('close transaction link list', () => {
+ beforeEach(async () => {
+ wrapper.find('div.transaction-link-details').trigger('click')
+ })
+ describe('reopen transaction link list', () => {
+ beforeEach(async () => {
+ jest.clearAllMocks()
+ wrapper.find('div.transaction-link-details').trigger('click')
+ })
+
+ it('calls the API once', () => {
+ expect(apolloQueryMock).toBeCalledTimes(1)
+ })
+
+ it('calls the API with current page one', () => {
+ expect(apolloQueryMock).toBeCalledWith({
+ query: listTransactionLinks,
+ variables: {
+ currentPage: 1,
+ },
+ fetchPolicy: 'network-only',
+ })
+ })
+
+ it('has four transactionLinks', () => {
+ expect(wrapper.vm.transactionLinks).toHaveLength(4)
+ })
+ })
+ })
})
})
diff --git a/frontend/src/components/Transactions/TransactionLinkSummary.vue b/frontend/src/components/Transactions/TransactionLinkSummary.vue
index c24410924..cbce57029 100644
--- a/frontend/src/components/Transactions/TransactionLinkSummary.vue
+++ b/frontend/src/components/Transactions/TransactionLinkSummary.vue
@@ -84,7 +84,11 @@ export default {
this.visible = false
} else {
this.transactionLinks = []
- this.updateListTransactionLinks()
+ if (this.currentPage === 1) {
+ this.updateListTransactionLinks()
+ } else {
+ this.currentPage = 1
+ }
this.visible = true
}
},
diff --git a/frontend/src/locales/de.json b/frontend/src/locales/de.json
index ea288819f..0d496bc3f 100644
--- a/frontend/src/locales/de.json
+++ b/frontend/src/locales/de.json
@@ -35,6 +35,7 @@
"error": "Fehler!",
"no-account": "Leider konnten wir keinen (aktivierten) Account mit diesen Daten finden.",
"no-transactionlist": "Es gab leider einen Fehler. Es wurden keine Transaktionen vom Server übermittelt.",
+ "no-user": "Kein Benutzer mit diesen Anmeldedaten.",
"session-expired": "Die Sitzung wurde aus Sicherheitsgründen beendet.",
"unknown-error": "Unbekanter Fehler: ",
"user-already-exists": "Ein Benutzer mit diesen Daten existiert bereits."
@@ -215,9 +216,6 @@
"new_wallet": "Neues Konto erstellen",
"signin": "Anmelden"
},
- "register": {
- "message-button-text": "Alles klar"
- },
"signup": {
"agree": "Ich stimme der Datenschutzerklärung zu.",
"dont_match": "Die Passwörter stimmen nicht überein.",
diff --git a/frontend/src/locales/en.json b/frontend/src/locales/en.json
index f5e412086..f5009e04f 100644
--- a/frontend/src/locales/en.json
+++ b/frontend/src/locales/en.json
@@ -35,6 +35,7 @@
"error": "Error!",
"no-account": "Unfortunately we could not find an (activated) account to the given data.",
"no-transactionlist": "Unfortunately, there was an error. No transactions have been sent from the server.",
+ "no-user": "No user with this credentials.",
"session-expired": "The session was closed for security reasons.",
"unknown-error": "Unknown error: ",
"user-already-exists": "A user with this data already exists."
@@ -215,9 +216,6 @@
"new_wallet": "Create new account",
"signin": "Sign in"
},
- "register": {
- "message-button-text": "Okay"
- },
"signup": {
"agree": "I agree to the privacy policy.",
"dont_match": "Passwords don't match.",
diff --git a/frontend/src/pages/ForgotPassword.vue b/frontend/src/pages/ForgotPassword.vue
index eea54427a..182df5bc3 100644
--- a/frontend/src/pages/ForgotPassword.vue
+++ b/frontend/src/pages/ForgotPassword.vue
@@ -13,7 +13,7 @@
-
+
@@ -75,6 +75,11 @@ export default {
success: null,
}
},
+ created() {
+ if (this.$route.params.comingFrom) {
+ this.subtitle = 'settings.password.resend_subtitle'
+ }
+ },
methods: {
async onSubmit() {
this.$apollo
@@ -95,10 +100,10 @@ export default {
})
},
},
- created() {
- if (this.$route.params.comingFrom) {
- this.subtitle = 'settings.password.resend_subtitle'
- }
+ computed: {
+ enterData() {
+ return !this.showPageMessage
+ },
},
}
diff --git a/frontend/src/pages/Login.spec.js b/frontend/src/pages/Login.spec.js
index 80f507a1c..715f297e1 100644
--- a/frontend/src/pages/Login.spec.js
+++ b/frontend/src/pages/Login.spec.js
@@ -219,7 +219,7 @@ describe('Login', () => {
describe('login fails with "User email not validated"', () => {
beforeEach(async () => {
- await createError('GraphQL error: User email not validated')
+ await createError('GraphQL error: User email not validated.')
})
it('hides the spinner', () => {
@@ -251,7 +251,7 @@ describe('Login', () => {
describe('login fails with "User has no password set yet"', () => {
beforeEach(async () => {
- await createError('GraphQL error: User has no password set yet')
+ await createError('GraphQL error: User has no password set yet.')
})
it('shows error title, subtitle, login button', () => {
@@ -277,26 +277,35 @@ describe('Login', () => {
})
})
+ describe('login fails with "No user with this credentials"', () => {
+ beforeEach(async () => {
+ await createError('GraphQL error: No user with this credentials.')
+ })
+
+ it('shows no error message on the page', () => {
+ // don't show any error on the page! against boots
+ expect(wrapper.vm.showPageMessage).toBe(false)
+ expect(wrapper.find('.test-message-headline').exists()).toBe(false)
+ expect(wrapper.find('.test-message-subtitle').exists()).toBe(false)
+ expect(wrapper.find('.test-message-button').exists()).toBe(false)
+ })
+
+ it('toasts the error message', () => {
+ expect(toastErrorSpy).toBeCalledWith('error.no-user')
+ })
+ })
+
describe('login fails with an unknow error', () => {
beforeEach(async () => {
await createError(' – Unknow error')
})
- it('shows error title, subtitle, login button', () => {
- expect(wrapper.vm.showPageMessage).toBe(true)
- expect(wrapper.find('.test-message-headline').text()).toBe('site.thx.errorTitle')
- expect(wrapper.find('.test-message-subtitle').text()).toBe(
- 'error.unknown-error – Unknow error',
- )
- expect(wrapper.find('.test-message-button').text()).toBe('settings.password.reset')
- })
-
- it('button link directs to "/forgot-password"', () => {
- expect(wrapper.find('.test-message-button').attributes('href')).toBe('/forgot-password')
- })
-
- it.skip('click redirects to "/forgot-password"', () => {
- // expect(mockRouterPush).toBeCalledWith('/forgot-password')
+ it('shows no error message on the page', () => {
+ // don't show any error on the page! against boots
+ expect(wrapper.vm.showPageMessage).toBe(false)
+ expect(wrapper.find('.test-message-headline').exists()).toBe(false)
+ expect(wrapper.find('.test-message-subtitle').exists()).toBe(false)
+ expect(wrapper.find('.test-message-button').exists()).toBe(false)
})
it('toasts the error message', () => {
diff --git a/frontend/src/pages/Login.vue b/frontend/src/pages/Login.vue
index 4cfd62e69..10fcca649 100755
--- a/frontend/src/pages/Login.vue
+++ b/frontend/src/pages/Login.vue
@@ -13,7 +13,7 @@
-
+
@@ -134,17 +134,21 @@ export default {
this.errorSubtitle = this.$t('site.thx.unsetPassword')
this.errorLinkTo = '/reset-password/login'
this.toastError(this.$t('error.no-account'))
+ } else if (error.message.includes('No user with this credentials')) {
+ // don't show any error on the page! against boots
+ this.toastError(this.$t('error.no-user'))
} else {
- // appeared errors: 'GraphQL error: No user with this credentials'
- const errorMessage = this.$t('error.unknown-error') + error.message
- this.showPageMessage = true
- this.errorSubtitle = errorMessage
- this.errorLinkTo = '/forgot-password'
- this.toastError(errorMessage)
+ // don't show any error on the page! against boots
+ this.toastError(this.$t('error.unknown-error') + error.message)
}
loader.hide()
})
},
},
+ computed: {
+ enterData() {
+ return !this.showPageMessage
+ },
+ },
}
diff --git a/frontend/src/pages/Register.spec.js b/frontend/src/pages/Register.spec.js
index e889f0ca7..f7a6c0ac8 100644
--- a/frontend/src/pages/Register.spec.js
+++ b/frontend/src/pages/Register.spec.js
@@ -234,24 +234,17 @@ describe('Register', () => {
await createError('GraphQL error: User already exists.')
})
- it('shows success title, subtitle, login button', () => {
- expect(wrapper.vm.showPageMessage).toBe(true)
- expect(wrapper.find('.test-message-headline').text()).toBe('site.thx.errorTitle')
- expect(wrapper.find('.test-message-subtitle').text()).toBe('error.user-already-exists')
- expect(wrapper.find('.test-message-button').text()).toBe(
- 'site.register.message-button-text',
- )
+ it('shows no error message on the page', () => {
+ // don't show any error on the page! against boots
+ expect(wrapper.vm.showPageMessage).toBe(false)
+ expect(wrapper.find('.test-message-headline').exists()).toBe(false)
+ expect(wrapper.find('.test-message-subtitle').exists()).toBe(false)
+ expect(wrapper.find('.test-message-button').exists()).toBe(false)
})
it('toasts the error message', () => {
expect(toastErrorSpy).toBeCalledWith('error.user-already-exists')
})
-
- it('click calls "solveError"', async () => {
- wrapper.find('.test-message-button').trigger('click')
- await wrapper.vm.$nextTick()
- expect(wrapper.vm.showPageMessage).toBe(false)
- })
})
describe('server sends back error "Unknown error"', () => {
@@ -259,26 +252,17 @@ describe('Register', () => {
await createError(' – Unknown error.')
})
- it('shows success title, subtitle, login button', () => {
- expect(wrapper.vm.showPageMessage).toBe(true)
- expect(wrapper.find('.test-message-headline').text()).toBe('site.thx.errorTitle')
- expect(wrapper.find('.test-message-subtitle').text()).toBe(
- 'error.unknown-error – Unknown error.',
- )
- expect(wrapper.find('.test-message-button').text()).toBe(
- 'site.register.message-button-text',
- )
+ it('shows no error message on the page', () => {
+ // don't show any error on the page! against boots
+ expect(wrapper.vm.showPageMessage).toBe(false)
+ expect(wrapper.find('.test-message-headline').exists()).toBe(false)
+ expect(wrapper.find('.test-message-subtitle').exists()).toBe(false)
+ expect(wrapper.find('.test-message-button').exists()).toBe(false)
})
it('toasts the error message', () => {
expect(toastErrorSpy).toBeCalledWith('error.unknown-error – Unknown error.')
})
-
- it('click calls "solveError"', async () => {
- wrapper.find('.test-message-button').trigger('click')
- await wrapper.vm.$nextTick()
- expect(wrapper.vm.showPageMessage).toBe(false)
- })
})
})
diff --git a/frontend/src/pages/Register.vue b/frontend/src/pages/Register.vue
index a41952030..39230cb1e 100755
--- a/frontend/src/pages/Register.vue
+++ b/frontend/src/pages/Register.vue
@@ -15,7 +15,7 @@
-
+
@@ -165,18 +165,7 @@
-
-
+