Merge branch 'master' into 1459-List-Data-again-on-Confirm-Creation

This commit is contained in:
Alexander Friedland 2022-02-18 00:54:10 +01:00 committed by GitHub
commit dbebc4ba0b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
68 changed files with 358 additions and 404 deletions

View File

@ -305,7 +305,7 @@ jobs:
- name: yarn install
run: yarn install
- name: generate changelog
run: yarn auto-changelog --latest-version ${{ env.VERSION }} --unreleased-only
run: yarn auto-changelog --commit-limit 0 --latest-version ${{ env.VERSION }} --unreleased-only
- name: package-version-to-git-release
continue-on-error: true # Will fail if tag exists
id: create_release

View File

@ -4,8 +4,18 @@ 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).
#### [1.6.5](https://github.com/gradido/gradido/compare/1.6.4...1.6.5)
> 15 February 2022
- v1.6.5 [`#1497`](https://github.com/gradido/gradido/pull/1497)
- Fix: Elopage Hook Crash 2 [`#1481`](https://github.com/gradido/gradido/pull/1481)
#### [1.6.4](https://github.com/gradido/gradido/compare/1.6.3...1.6.4)
> 14 February 2022
- v1.6.4 [`#1478`](https://github.com/gradido/gradido/pull/1478)
- fix: Admin Email Confirmation Date and Time [`#1448`](https://github.com/gradido/gradido/pull/1448)
- Fix: Do not log password or token to the console [`#1477`](https://github.com/gradido/gradido/pull/1477)
- Fix: Elopage Hook Crash [`#1474`](https://github.com/gradido/gradido/pull/1474)
@ -14,9 +24,6 @@ Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog).
- fix: Wrong Email Spelling in German [`#1446`](https://github.com/gradido/gradido/pull/1446)
- fix: Redirect to Login after Register [`#1445`](https://github.com/gradido/gradido/pull/1445)
- refactor: Split User Table Component in Admin Interface [`#1443`](https://github.com/gradido/gradido/pull/1443)
- remove user table [`c6a469e`](https://github.com/gradido/gradido/commit/c6a469e08f16101c8fb78958eda69b163b815ed3)
- open creations table [`9ef575d`](https://github.com/gradido/gradido/commit/9ef575d6b140a4c768e4330a18eaa3b04346b483)
- User Search Table [`ae2d535`](https://github.com/gradido/gradido/commit/ae2d5355d62f525187dd1cdb1448aec63fb05d3f)
#### [1.6.3](https://github.com/gradido/gradido/compare/1.6.2...1.6.3)
@ -25,8 +32,6 @@ Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog).
- v1.6.3 [`#1447`](https://github.com/gradido/gradido/pull/1447)
- add .btn-outline-secondary in scss [`#1442`](https://github.com/gradido/gradido/pull/1442)
- Profil settings and footer refactor [`#1440`](https://github.com/gradido/gradido/pull/1440)
- profil settings header info refactor style [`cbaa016`](https://github.com/gradido/gradido/commit/cbaa0162b9366e5de722235aeb633908c59bb3e1)
- margin footer refactor, more margin to top [`81b3dc0`](https://github.com/gradido/gradido/commit/81b3dc08ae6f60049feba690132dba37c84ad5c5)
#### [1.6.2](https://github.com/gradido/gradido/compare/1.6.1...1.6.2)
@ -64,9 +69,6 @@ Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog).
- upgrade vue version from ^2.6.11 to 2.6.12 [`#1382`](https://github.com/gradido/gradido/pull/1382)
- remove vue-qrcode from dashboard-plugin [`#1364`](https://github.com/gradido/gradido/pull/1364)
- remove unused package from frontend [`#1360`](https://github.com/gradido/gradido/pull/1360)
- Removed community_server folder, removed reference to community_server. [`e5c3c3c`](https://github.com/gradido/gradido/commit/e5c3c3c57a2343e1c4d7b8fbc658edcd78f1a292)
- migration 20 [`c0156d4`](https://github.com/gradido/gradido/commit/c0156d4a298ac11f0d1ccabb859fdcbd56d391ee)
- fix frontend tests [`3f0aa00`](https://github.com/gradido/gradido/commit/3f0aa00dc36499b13878eda469312e00100074f4)
#### [1.6.1](https://github.com/gradido/gradido/compare/1.6.0...1.6.1)
@ -76,9 +78,6 @@ Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog).
- change standard text für creation [`#1343`](https://github.com/gradido/gradido/pull/1343)
- Check if user email is activated to make a creation. [`#1356`](https://github.com/gradido/gradido/pull/1356)
- fix: Creation Confirmation User Ids [`#1345`](https://github.com/gradido/gradido/pull/1345)
- fix and improve test [`1c833d3`](https://github.com/gradido/gradido/commit/1c833d394f502a7aed2b5a648c0171a2fe4ee1e6)
- rewrote elopage hook to handle actual elopage hook [`65bc347`](https://github.com/gradido/gradido/commit/65bc3479fa169920eff57b5a2fa662a4090d7364)
- simple test for mass creation, improved test for single creation [`ffc4727`](https://github.com/gradido/gradido/commit/ffc4727e7a7105ac5dc97515b901be8dbe415627)
#### [1.6.0](https://github.com/gradido/gradido/compare/1.5.1...1.6.0)
@ -237,16 +236,12 @@ Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog).
- analyse_bundle [`#1019`](https://github.com/gradido/gradido/pull/1019)
- release_issue_template [`#1013`](https://github.com/gradido/gradido/pull/1013)
- fix_changelog [`#1014`](https://github.com/gradido/gradido/pull/1014)
- removed incorrect mnemonic lists [`08200f4`](https://github.com/gradido/gradido/commit/08200f49f2ceb5ac121534a19ad2a8347c900145)
- update jest, install transform-require-context [`165ed18`](https://github.com/gradido/gradido/commit/165ed1801ba1aba862d0b0006d8c17e322c4b7ff)
- rework roadmap [`b337bcd`](https://github.com/gradido/gradido/commit/b337bcd850423e67b2119c562575b0ec692dddf2)
#### [1.5.1](https://github.com/gradido/gradido/compare/1.5.0...1.5.1)
> 15 October 2021
- fix isExitInDb [`#994`](https://github.com/gradido/gradido/pull/994)
- fix [`80228ef`](https://github.com/gradido/gradido/commit/80228ef842d4087ea4b80934b15b8112611e3e33)
#### [1.5.0](https://github.com/gradido/gradido/compare/1.4.0...1.5.0)
@ -323,9 +318,6 @@ Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog).
- update docker files [`#830`](https://github.com/gradido/gradido/pull/830)
- added publisher_id field to user [`#245`](https://github.com/gradido/gradido/pull/245)
- webpack update [`#811`](https://github.com/gradido/gradido/pull/811)
- resolvers [`562ad9a`](https://github.com/gradido/gradido/commit/562ad9ae31d97f90a371452bed1ffe10ebf2d3a5)
- deleted inputs (now args) [`8ab542a`](https://github.com/gradido/gradido/commit/8ab542a28acf6b78d7a9e7fe7757363d225f7b4f)
- fix UserCard_CoinAnimation to properly use the store, have 100% coverage and other minor fixes & simplifications [`ce826de`](https://github.com/gradido/gradido/commit/ce826deb1d6d92caba514713539dca2da3f74de7)
#### [1.4.0](https://github.com/gradido/gradido/compare/1.3.1...1.4.0)
@ -367,9 +359,6 @@ Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog).
- feat: Vue Apollo Client [`#701`](https://github.com/gradido/gradido/pull/701)
- change text from Geld to Gradidos [`#711`](https://github.com/gradido/gradido/pull/711)
- fix fix [`#728`](https://github.com/gradido/gradido/pull/728)
- sort locales [`ec12a28`](https://github.com/gradido/gradido/commit/ec12a28f81577d530f58b42b7f8c2c7d20dffd64)
- feat: Unify and Sort Locales [`aba4f4d`](https://github.com/gradido/gradido/commit/aba4f4d20e0a13016e3528a1c5c30c111eb3a9f1)
- feat: Increase Coverage [`3c061bc`](https://github.com/gradido/gradido/commit/3c061bcb8d1a3a47442ed6a351e1428e15b314aa)
#### [1.3.1](https://github.com/gradido/gradido/compare/1.3.0...1.3.1)
@ -378,9 +367,6 @@ Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog).
- fix: Translations and Formula Display [`#727`](https://github.com/gradido/gradido/pull/727)
- 612 docu structure [`#688`](https://github.com/gradido/gradido/pull/688)
- Community update for gdt list GDT transaction format [`#726`](https://github.com/gradido/gradido/pull/726)
- [#612] new directory structure in /docu/Concepts [`10bf3b0`](https://github.com/gradido/gradido/commit/10bf3b0cdfa6c44f879be0155e93f636601a051b)
- #612 additional documents [`ac0ed4f`](https://github.com/gradido/gradido/commit/ac0ed4fee81caff26d09b5de47dd130f12abdb45)
- #612 docu restructuring [`e67e1c4`](https://github.com/gradido/gradido/commit/e67e1c41e78264698e6fae4cf1d29751de7e7b29)
#### [1.3.0](https://github.com/gradido/gradido/compare/1.2.1...1.3.0)
@ -402,9 +388,6 @@ Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog).
- Backend Setup [`#584`](https://github.com/gradido/gradido/pull/584)
- text-size in textarea and font-variante if focus [`#677`](https://github.com/gradido/gradido/pull/677)
- 680 app large maximum width [`#681`](https://github.com/gradido/gradido/pull/681)
- linting, server is working [`34b30b2`](https://github.com/gradido/gradido/commit/34b30b216b6fafcb5b686d4b023b05f2e9766bdf)
- server stack seems to work. Graphql does not load properly yet [`43f7cf8`](https://github.com/gradido/gradido/commit/43f7cf87679713d436a64d569d6af1594a12ee33)
- initial commit, base packages [`fdf0979`](https://github.com/gradido/gradido/commit/fdf0979830fece04208a6b3bb06bb5323a3c149b)
#### [1.2.1](https://github.com/gradido/gradido/compare/1.2.0...1.2.1)
@ -415,9 +398,6 @@ Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog).
- fix unneccessary migration run on fresh (docker) setup [`#654`](https://github.com/gradido/gradido/pull/654)
- move back decay as standalone transaction in old frontend [`#656`](https://github.com/gradido/gradido/pull/656)
- fix display error with creation [`#652`](https://github.com/gradido/gradido/pull/652)
- release [`a0b8056`](https://github.com/gradido/gradido/commit/a0b8056c17b22570a1b1dbb6fa6ce71e561b04af)
- update content for frontend [`d37ce09`](https://github.com/gradido/gradido/commit/d37ce0949ef97d2a6c6ffaf0be31db9f6d92e743)
- exchange positions [`bc000ef`](https://github.com/gradido/gradido/commit/bc000efd87c9701480c4aeaa7b819ab49bfe8f01)
#### [1.2.0](https://github.com/gradido/gradido/compare/1.1.1...1.2.0)
@ -456,9 +436,6 @@ Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog).
- Update Password Reset E-Mail Subject Encoding [`#579`](https://github.com/gradido/gradido/pull/579)
- move decay between transactions into the transactions [`#483`](https://github.com/gradido/gradido/pull/483)
- fix #591 [`#591`](https://github.com/gradido/gradido/issues/591)
- fix style decay startblick [`cc7778b`](https://github.com/gradido/gradido/commit/cc7778b55d1baaa7be2d9440480e0fb27bb9a930)
- Remove dynamic cast because it lead to errors again and agin (Poco::AutoPtr don't work correct with that) [`0db5912`](https://github.com/gradido/gradido/commit/0db5912a67158be8f313c01f06350f8339cb0e28)
- Remove dynamic cast because it lead to errors again and agin (Poco::AutoPtr don't work correct with that) [`cee7d7a`](https://github.com/gradido/gradido/commit/cee7d7ac3c4c8c1f481cc3a87fb15422c858413b)
#### [1.1.1](https://github.com/gradido/gradido/compare/1.1.0...1.1.1)
@ -469,9 +446,6 @@ Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog).
- update transfer email text [`#574`](https://github.com/gradido/gradido/pull/574)
- update mysql because tuple has changed [`#576`](https://github.com/gradido/gradido/pull/576)
- Login fix pending transactions [`#578`](https://github.com/gradido/gradido/pull/578)
- add test to prevent bug in future [`630d667`](https://github.com/gradido/gradido/commit/630d667e996870a1bf9aa9586b0467d58419e525)
- use standard path. add nginx example [`ac249b4`](https://github.com/gradido/gradido/commit/ac249b46830a8039aec52d30b48084b50a264b6f)
- add autodeploy bash scripts [`f49cf4d`](https://github.com/gradido/gradido/commit/f49cf4d7f8054d87efa1e12055a7ef0c6d3b9872)
#### [1.1.0](https://github.com/gradido/gradido/compare/1.0.2...1.1.0)
@ -513,9 +487,6 @@ Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog).
- login without hedera [`#478`](https://github.com/gradido/gradido/pull/478)
- fix: Show Correct Version Number in Footer [`#475`](https://github.com/gradido/gradido/pull/475)
- refactor: Remove Element-UI [`#476`](https://github.com/gradido/gradido/pull/476)
- remove components Charts, Notification, SearchUser, ButtonCheckbox, Button RadioGroup, Breadcrumb [`159bff7`](https://github.com/gradido/gradido/commit/159bff71df20a5c48f93389b2f990f7fe54e53b9)
- fix bug, update dockerfiles to use dependencies without grpc [`dedcebd`](https://github.com/gradido/gradido/commit/dedcebdb95ee0f3dfd2ad62074d4181af38476a2)
- add warning to able to forward warnings from community server to client [`2fc3fe9`](https://github.com/gradido/gradido/commit/2fc3fe94a09bae199bf2f34f9df90e8fc3879c2b)
#### [1.0.2](https://github.com/gradido/gradido/compare/1.0.1...1.0.2)
@ -542,17 +513,12 @@ Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog).
- add dynamic error email if transaction failed [`#452`](https://github.com/gradido/gradido/pull/452)
- ceil the last decay [`#449`](https://github.com/gradido/gradido/pull/449)
- feat: Raise Coverage of Frontend Unit Tets to 18% [`#447`](https://github.com/gradido/gradido/pull/447)
- parse cpsp files automatic in build [`a4a12bb`](https://github.com/gradido/gradido/commit/a4a12bb62b4000e035ff15e17c5a5f5861653ff6)
- translate german html encoded error messages to english and use gettext for automatic translation [`d339627`](https://github.com/gradido/gradido/commit/d33962736d94c1cb7a12ff775bc2c8d7505d646e)
- 100% coverage of GddTransactionList [`96fb245`](https://github.com/gradido/gradido/commit/96fb245821c69f4d321204a663247d5eee60d92f)
#### [1.0.1](https://github.com/gradido/gradido/compare/1.0.0...1.0.1)
> 14 May 2021
- Login crash fix [`#444`](https://github.com/gradido/gradido/pull/444)
- add try catch blocks to prevent login-server from crashing [`22ff220`](https://github.com/gradido/gradido/commit/22ff22072956f8b843037c75c5b16b7ff5d6a2a3)
- fix [`14a4243`](https://github.com/gradido/gradido/commit/14a424347817b1fe6912a113bffd70e55d688112)
### [1.0.0](https://github.com/gradido/gradido/compare/0.9.4...1.0.0)
@ -672,9 +638,6 @@ Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog).
- Background color change [`#117`](https://github.com/gradido/gradido/pull/117)
- Delete unused files [`#116`](https://github.com/gradido/gradido/pull/116)
- store aufräumen teil 1 [`#115`](https://github.com/gradido/gradido/pull/115)
- add migrations table for automatic table data migration [`40a9a8c`](https://github.com/gradido/gradido/commit/40a9a8c2b587f5bef0fcc54136ed7bd13dd91b2b)
- update yarn.lock after running yarn install [`7f38c80`](https://github.com/gradido/gradido/commit/7f38c801213ad886e9d34a8d43b00ae423f5f2a0)
- use new function for balance overview in old frontend, update balance in session on every php-request [`97c570c`](https://github.com/gradido/gradido/commit/97c570c08cc51ed17a69eb8be8d987f95f3c2ce0)
#### [0.9.4](https://github.com/gradido/gradido/compare/0.9.3...0.9.4)
@ -682,9 +645,6 @@ Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog).
- Vue with nginx [`#84`](https://github.com/gradido/gradido/pull/84)
- Build on run [`#103`](https://github.com/gradido/gradido/pull/103)
- update debug docker to use dependencies container pushed to docker hub [`1f002f4`](https://github.com/gradido/gradido/commit/1f002f4ed0b12d4b2bf63efceabe546d0c5b58ea)
- removed email tasks complete [`8a143be`](https://github.com/gradido/gradido/commit/8a143be8423d7bd894d4f512848895df8b9694b0)
- build login-server on docker-compose up in a docker volume so it rebuild only neccessary parts if some c++ files have changed [`0da5279`](https://github.com/gradido/gradido/commit/0da527917523530186e6effe63dc001fc99bd3e3)
#### [0.9.3](https://github.com/gradido/gradido/compare/0.9.2...0.9.3)
@ -713,9 +673,6 @@ Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog).
- Add Feature in user search old frontend because Support has requested the feature long ago [`#56`](https://github.com/gradido/gradido/pull/56)
- sprache angepasst, for login, pwd, sigin [`#54`](https://github.com/gradido/gradido/pull/54)
- Improve workflows [`#53`](https://github.com/gradido/gradido/pull/53)
- setup eslint with tougher rules [`1f13507`](https://github.com/gradido/gradido/commit/1f13507eacfd93c2248fb841de5f481c9eb1e6bd)
- semicolon rule implemented [`6762a02`](https://github.com/gradido/gradido/commit/6762a028f2a3e4f2713b26bed81029defe686ad7)
- dev meeting, bernd [`a99de7f`](https://github.com/gradido/gradido/commit/a99de7f5d1f7557c0877eae565aa4263d65aaaf3)
#### [0.9.2](https://github.com/gradido/gradido/compare/0.9.1...0.9.2)
@ -725,9 +682,6 @@ Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog).
- Reload after login fixed [`#50`](https://github.com/gradido/gradido/pull/50)
- Monorepo login server [`#48`](https://github.com/gradido/gradido/pull/48)
- Stage0 [`#3`](https://github.com/gradido/gradido/pull/3)
- Add auto-sign Transaction functionality [`5592275`](https://github.com/gradido/gradido/commit/55922753a7ffd9552be132501d744da491c409b5)
- read in login the real client ip X-Real-IP from nginx forwarded not from community server [`512d307`](https://github.com/gradido/gradido/commit/512d307a19b955bb6e26ae8b274def354829b50f)
- move check if all passwords allow direct into pwdValidation so it will work with every code which ask for password [`e2c38c1`](https://github.com/gradido/gradido/commit/e2c38c1a0fc25a4a2bc922c4bbc44d86b6d00d8b)
#### 0.9.1
@ -739,6 +693,3 @@ Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog).
- [WIP] 2 create a dockerfile for the frontend application [`#6`](https://github.com/gradido/gradido/pull/6)
- Master - first step [`#1`](https://github.com/gradido/gradido/pull/1)
- Add docker compose [`#7`](https://github.com/gradido/gradido/pull/7)
- style 404 side :) [`c7bdf89`](https://github.com/gradido/gradido/commit/c7bdf8978594b932615e48f9bb1c19d3c3bf3fcf)
- publish workflow test [`df6f66f`](https://github.com/gradido/gradido/commit/df6f66ffe70baa9ed3f70b460a6c0c14011bb944)
- many translations. translation structure [`bf68547`](https://github.com/gradido/gradido/commit/bf685479767d19c246c4d6abe3577dc3cb666346)

View File

@ -3,7 +3,7 @@
"description": "Administraion Interface for Gradido",
"main": "index.js",
"author": "Moriz Wahl",
"version": "1.6.4",
"version": "1.6.5",
"license": "MIT",
"private": false,
"scripts": {

View File

@ -3,7 +3,11 @@
<div class="shadow p-3 mb-5 bg-white rounded">
<div v-if="checked">{{ $t('unregister_mail.text_true') }}</div>
<div v-else>
{{ $t('unregister_mail.text_false', { date: dateLastSend, mail: email }) }}
{{
dateLastSend === ''
? $t('unregister_mail.never_sent', { email })
: $t('unregister_mail.text_false', { date: dateLastSend, email })
}}
<!-- Using components -->
<b-input-group :prepend="$t('unregister_mail.info')" class="mt-3">

View File

@ -1,15 +1,45 @@
<template>
<div class="">
<div>
<hr />
<br />
<div class="text-center">
{{ $t('gradido_admin_footer') }}
<div><small>Version: 1.0.0</small></div>
</div>
<b-row align-v="center" class="mt-4 justify-content-lg-between">
<b-col>
<div class="copyright text-center text-lg-center text-muted">
© {{ year }}
<a
:href="`https://gradido.net/${$i18n.locale}`"
class="font-weight-bold ml-1"
target="_blank"
>
{{ $t('gradido_admin_footer') }}
</a>
|
<a href="https://github.com/gradido/gradido/releases/latest" target="_blank">
App version {{ version }}
</a>
<a
v-if="hash"
:href="'https://github.com/gradido/gradido/commit/' + hash"
target="_blank"
>
({{ shortHash }})
</a>
</div>
</b-col>
</b-row>
</div>
</template>
<script>
import CONFIG from '../config'
export default {
name: 'ContentFooter',
data() {
return {
year: new Date().getFullYear(),
version: CONFIG.APP_VERSION,
hash: CONFIG.BUILD_COMMIT,
shortHash: CONFIG.BUILD_COMMIT_SHORT,
}
},
}
</script>

View File

@ -3,11 +3,15 @@ import NotFoundPage from './NotFoundPage'
const localVue = global.localVue
const mocks = {
$t: jest.fn((t) => t),
}
describe('NotFoundPage', () => {
let wrapper
const Wrapper = () => {
return mount(NotFoundPage, { localVue })
return mount(NotFoundPage, { localVue, mocks })
}
describe('mount', () => {
@ -18,5 +22,9 @@ describe('NotFoundPage', () => {
it('has a svg', () => {
expect(wrapper.find('svg').exists()).toBeTruthy()
})
it('has a back button', () => {
expect(wrapper.find('.test-back').exists()).toBeTruthy()
})
})
})

View File

@ -4,7 +4,7 @@
<div class="header py-1 py-lg-1 pt-lg-3">
<b-container>
<div class="header-body text-center mb-3">
<a href="login" to="login">
<a href="#!" @click="goback">
<div class="container">
<div class="row">
<div class="col-sm-12 col-md-12 mt-5 mb-5">
@ -1185,6 +1185,11 @@
</div>
</b-container>
</div>
<div class="text-center">
<b-button class="test-back" variant="light" @click="goback">
{{ $t('back') }}
</b-button>
</div>
</div>
</template>
@ -1213,6 +1218,11 @@ export default {
},
}
},
methods: {
goback() {
this.$router.go(-1)
},
},
}
</script>
<style>

View File

@ -1,5 +1,6 @@
{
"all_emails": "Alle Nutzer",
"back": "zurück",
"bookmark": "bookmark",
"confirmed": "bestätigt",
"creation": "Schöpfung",
@ -77,8 +78,9 @@
"button": "Registrierungs-Email bestätigen, jetzt senden",
"error": "Fehler beim Senden des Bestätigungs-Links an den Benutzer: {message}",
"info": "Email bestätigen, wiederholt senden an:",
"never_sent": "Es scheint so, als ob wir nie eine E-Mail an {email} geschickt haben",
"success": "Erfolgreiches Senden des Bestätigungs-Links an die E-Mail des Nutzers! ({email})",
"text_false": " Die letzte Email wurde am {date} Uhr an das Mitglied ({mail}) gesendet.",
"text_false": " Die letzte Email wurde am {date} Uhr an das Mitglied ({email}) gesendet.",
"text_true": " Die Email wurde bestätigt."
},
"user_search": "Nutzer-Suche"

View File

@ -1,5 +1,6 @@
{
"all_emails": "All users",
"back": "back",
"bookmark": "Remember",
"confirmed": "confirmed",
"creation": "Creation",
@ -77,8 +78,9 @@
"button": "Confirm registration email, send now",
"error": "Error sending the confirmation link to the user: {message}",
"info": "Confirm email, send repeatedly to:",
"never_sent": "It seems we did never send an email to the member {email}",
"success": "Successfully send the confirmation link to the user's email! ({email})",
"text_false": "The last email was sent to the member ({mail}) on {date}.",
"text_false": "The last email was sent to the member ({email}) on {date}.",
"text_true": "The email was confirmed."
},
"user_search": "User search"

View File

@ -1,6 +1,6 @@
{
"name": "gradido-backend",
"version": "1.6.4",
"version": "1.6.5",
"description": "Gradido unified backend providing an API-Service for Gradido Transactions",
"main": "src/index.ts",
"repository": "https://github.com/gradido/gradido/backend",

View File

@ -0,0 +1,9 @@
import CONFIG from './index'
describe('config/index', () => {
describe('decay start block', () => {
it('has the correct date set', () => {
expect(CONFIG.DECAY_START_TIME).toEqual(new Date('2021-05-13 17:46:31'))
})
})
})

View File

@ -4,7 +4,8 @@ import dotenv from 'dotenv'
dotenv.config()
const constants = {
DB_VERSION: '0021-elopagebuys_fields_nullable',
DB_VERSION: '0022-delete_decay_start_block',
DECAY_START_TIME: new Date('2021-05-13 17:46:31'), // GMT+0
}
const server = {

View File

@ -4,7 +4,7 @@ import { ObjectType, Field, Int } from 'type-graphql'
@ObjectType()
export class Decay {
constructor(json: any) {
constructor(json?: any) {
if (json) {
this.balance = Number(json.balance)
this.decayStart = json.decay_start

View File

@ -13,8 +13,8 @@ export class TransactionList {
this.decayDate = ''
}
@Field(() => Number)
gdtSum: number
@Field(() => Number, { nullable: true })
gdtSum: number | null
@Field(() => Number)
count: number

View File

@ -237,11 +237,11 @@ export class AdminResolver {
if (!lastUserTransaction) {
newBalance = 0
} else {
newBalance = await calculateDecay(
newBalance = calculateDecay(
lastUserTransaction.balance,
lastUserTransaction.balanceDate,
receivedCallDate,
)
).balance
}
newBalance = Number(newBalance) + Number(parseInt(pendingCreation.amount.toString()))

View File

@ -35,7 +35,7 @@ export class BalanceResolver {
return new Balance({
balance: roundFloorFrom4(balanceEntity.amount),
decay: roundFloorFrom4(
await calculateDecay(balanceEntity.amount, balanceEntity.recordDate, now),
calculateDecay(balanceEntity.amount, balanceEntity.recordDate, now).balance,
),
decay_date: now.toString(),
})

View File

@ -25,13 +25,17 @@ export class GdtResolver {
const userRepository = getCustomRepository(UserRepository)
const userEntity = await userRepository.findByPubkeyHex(context.pubKey)
const resultGDT = await apiGet(
`${CONFIG.GDT_API_URL}/GdtEntries/listPerEmailApi/${userEntity.email}/${currentPage}/${pageSize}/${order}`,
)
if (!resultGDT.success) {
throw new Error(resultGDT.data)
try {
const resultGDT = await apiGet(
`${CONFIG.GDT_API_URL}/GdtEntries/listPerEmailApi/${userEntity.email}/${currentPage}/${pageSize}/${order}`,
)
if (!resultGDT.success) {
throw new Error(resultGDT.data)
}
return new GdtEntryList(resultGDT.data)
} catch (err: any) {
throw new Error('GDT Server is not reachable.')
}
return new GdtEntryList(resultGDT.data)
}
@Authorized([RIGHTS.EXIST_PID])

View File

@ -29,7 +29,7 @@ import { Balance as dbBalance } from '@entity/Balance'
import { apiPost } from '../../apis/HttpRequest'
import { roundFloorFrom4, roundCeilFrom4 } from '../../util/round'
import { calculateDecay, calculateDecayWithInterval } from '../../util/decay'
import { calculateDecay } from '../../util/decay'
import { TransactionTypeId } from '../enum/TransactionTypeId'
import { TransactionType } from '../enum/TransactionType'
import { hasUserAmount, isHexPublicKey } from '../../util/validate'
@ -67,8 +67,6 @@ async function calculateAndAddDecayTransactions(
const userRepository = getCustomRepository(UserRepository)
const userIndiced = await userRepository.getUsersIndiced(involvedUsersUnique)
const decayStartTransaction = await transactionRepository.findDecayStartBlock()
for (let i = 0; i < userTransactions.length; i++) {
const userTransaction = userTransactions[i]
const transaction = transactionIndiced[userTransaction.transactionId]
@ -81,26 +79,22 @@ async function calculateAndAddDecayTransactions(
if (previousTransaction) {
const currentTransaction = userTransaction
const decay = await calculateDecayWithInterval(
const decay = calculateDecay(
previousTransaction.balance,
previousTransaction.balanceDate,
currentTransaction.balanceDate,
)
const balance = previousTransaction.balance - decay.balance
if (
decayStartTransaction &&
decayStartTransaction.received < currentTransaction.balanceDate
) {
if (CONFIG.DECAY_START_TIME < currentTransaction.balanceDate) {
finalTransaction.decay = decay
finalTransaction.decay.balance = roundFloorFrom4(balance)
if (
decayStartTransaction &&
previousTransaction.transactionId < decayStartTransaction.id &&
currentTransaction.transactionId > decayStartTransaction.id
previousTransaction.balanceDate < CONFIG.DECAY_START_TIME &&
currentTransaction.balanceDate > CONFIG.DECAY_START_TIME
) {
finalTransaction.decay.decayStartBlock = (
decayStartTransaction.received.getTime() / 1000
CONFIG.DECAY_START_TIME.getTime() / 1000
).toString()
}
}
@ -147,11 +141,7 @@ async function calculateAndAddDecayTransactions(
if (i === userTransactions.length - 1 && decay) {
const now = new Date()
const decay = await calculateDecayWithInterval(
userTransaction.balance,
userTransaction.balanceDate,
now.getTime(),
)
const decay = calculateDecay(userTransaction.balance, userTransaction.balanceDate, now)
const balance = userTransaction.balance - decay.balance
const decayTransaction = new Transaction()
@ -233,12 +223,8 @@ async function updateStateBalance(
balance.amount = centAmount
balance.modified = received
} else {
const decaiedBalance = await calculateDecay(balance.amount, balance.recordDate, received).catch(
() => {
throw new Error('error by calculating decay')
},
)
balance.amount = Number(decaiedBalance) + centAmount
const decayedBalance = calculateDecay(balance.amount, balance.recordDate, received).balance
balance.amount = Number(decayedBalance) + centAmount
balance.modified = new Date()
}
if (balance.amount <= 0) {
@ -262,13 +248,11 @@ async function addUserTransaction(
const lastUserTransaction = await userTransactionRepository.findLastForUser(user.id)
if (lastUserTransaction) {
newBalance += Number(
await calculateDecay(
calculateDecay(
Number(lastUserTransaction.balance),
lastUserTransaction.balanceDate,
transaction.received,
).catch(() => {
throw new Error('error by calculating decay')
}),
).balance,
)
}
@ -331,11 +315,13 @@ export class TransactionResolver {
)
// get gdt sum
const resultGDTSum = await apiPost(`${CONFIG.GDT_API_URL}/GdtEntries/sumPerEmailApi`, {
email: userEntity.email,
})
if (!resultGDTSum.success) throw new Error(resultGDTSum.data)
transactions.gdtSum = Number(resultGDTSum.data.sum) || 0
transactions.gdtSum = null
try {
const resultGDTSum = await apiPost(`${CONFIG.GDT_API_URL}/GdtEntries/sumPerEmailApi`, {
email: userEntity.email,
})
if (resultGDTSum.success) transactions.gdtSum = Number(resultGDTSum.data.sum) || 0
} catch (err: any) {}
// get balance
const balanceRepository = getCustomRepository(BalanceRepository)
@ -344,7 +330,7 @@ export class TransactionResolver {
const now = new Date()
transactions.balance = roundFloorFrom4(balanceEntity.amount)
transactions.decay = roundFloorFrom4(
await calculateDecay(balanceEntity.amount, balanceEntity.recordDate, now),
calculateDecay(balanceEntity.amount, balanceEntity.recordDate, now).balance,
)
transactions.decayDate = now.toString()
}

View File

@ -3,13 +3,6 @@ import { Transaction } from '@entity/Transaction'
@EntityRepository(Transaction)
export class TransactionRepository extends Repository<Transaction> {
async findDecayStartBlock(): Promise<Transaction | undefined> {
return this.createQueryBuilder('transaction')
.where('transaction.transactionTypeId = :transactionTypeId', { transactionTypeId: 9 })
.orderBy('received', 'ASC')
.getOne()
}
async joinFullTransactionsByIds(transactionIds: number[]): Promise<Transaction[]> {
return this.createQueryBuilder('transaction')
.where('transaction.id IN (:...transactions)', { transactions: transactionIds })

View File

@ -1,3 +1,4 @@
import 'reflect-metadata' // This might be wise to load in a test setup file
import { decayFormula, calculateDecay } from './decay'
describe('utils/decay', () => {
@ -35,6 +36,6 @@ describe('utils/decay', () => {
it('returns input amount when from and to is the same', async () => {
const now = new Date()
expect(await calculateDecay(100.0, now, now)).toBe(100.0)
expect((await calculateDecay(100.0, now, now)).balance).toBe(100.0)
})
})

View File

@ -1,70 +1,46 @@
import { getCustomRepository } from '@dbTools/typeorm'
import CONFIG from '../config'
import { Decay } from '../graphql/model/Decay'
import { TransactionRepository } from '../typeorm/repository/Transaction'
function decayFormula(amount: number, seconds: number): number {
return amount * Math.pow(0.99999997802044727, seconds) // This number represents 50% decay a year
}
async function calculateDecay(amount: number, from: Date, to: Date): Promise<number> {
if (amount === undefined || !from || !to) {
throw new Error('at least one parameter is undefined')
function calculateDecay(amount: number, from: Date, to: Date): Decay {
const fromMs = from.getTime()
const toMs = to.getTime()
const decayStartBlockMs = CONFIG.DECAY_START_TIME.getTime()
if (toMs < fromMs) {
throw new Error('to < from, reverse decay calculation is invalid')
}
if (from === to) {
return amount
// Initialize with no decay
const decay = new Decay({
balance: amount,
decayStart: null,
decayEnd: null,
decayDuration: 0,
decayStartBlock: (decayStartBlockMs / 1000).toString(),
})
// decay started after end date; no decay
if (decayStartBlockMs > toMs) {
return decay
}
if (to < from) {
throw new Error('to < from, so the target date is in the past?')
// decay started before start date; decay for full duration
else if (decayStartBlockMs < fromMs) {
decay.decayStart = (fromMs / 1000).toString()
decay.decayDuration = (toMs - fromMs) / 1000
}
// load decay start block
const transactionRepository = getCustomRepository(TransactionRepository)
const decayStartBlock = await transactionRepository.findDecayStartBlock()
// if decay hasn't started yet we return input amount
if (!decayStartBlock) return amount
// what happens when from > to
// Do we want to have negative decay?
const decayDuration = (to.getTime() - from.getTime()) / 1000
return decayFormula(amount, decayDuration)
}
async function calculateDecayWithInterval(
amount: number,
from: number | Date,
to: number | Date,
): Promise<Decay> {
const transactionRepository = getCustomRepository(TransactionRepository)
const decayStartBlock = await transactionRepository.findDecayStartBlock()
const result = new Decay(undefined)
result.balance = amount
const fromMillis = typeof from === 'number' ? from : from.getTime()
const toMillis = typeof to === 'number' ? to : to.getTime()
result.decayStart = (fromMillis / 1000).toString()
result.decayEnd = (toMillis / 1000).toString()
// (amount, from.getTime(), to.getTime())
// if no decay start block exist or decay startet after end date
if (!decayStartBlock || decayStartBlock.received.getTime() > toMillis) {
return result
}
const decayStartBlockMillis = decayStartBlock.received.getTime()
// if decay start date is before start date we calculate decay for full duration
if (decayStartBlockMillis < fromMillis) {
result.decayDuration = toMillis - fromMillis
}
// if decay start in between start date and end date we caculcate decay from decay start time to end date
// decay started between start and end date; decay from decay start till end date
else {
result.decayDuration = toMillis - decayStartBlockMillis
result.decayStart = (decayStartBlockMillis / 1000).toString()
decay.decayStart = (decayStartBlockMs / 1000).toString()
decay.decayDuration = (toMs - decayStartBlockMs) / 1000
}
// js use timestamp in milliseconds but we calculate with seconds
result.decayDuration /= 1000
result.balance = decayFormula(amount, result.decayDuration)
return result
decay.decayEnd = (toMs / 1000).toString()
decay.balance = decayFormula(amount, decay.decayDuration)
return decay
}
export { decayFormula, calculateDecay, calculateDecayWithInterval }
export { decayFormula, calculateDecay }

View File

@ -21,7 +21,7 @@ async function hasUserAmount(user: dbUser, amount: number): Promise<boolean> {
const balance = await balanceRepository.findOne({ userId: user.id })
if (!balance) return false
const decay = await calculateDecay(balance.amount, balance.recordDate, new Date())
const decay = calculateDecay(balance.amount, balance.recordDate, new Date()).balance
return decay > amount
}

View File

@ -53,6 +53,19 @@ export const elopageWebhook = async (req: any, res: any): Promise<void> => {
membership,
} = req.body
// Do not process certain events
if (['lesson.viewed', 'lesson.completed', 'lesson.commented'].includes(event)) {
// eslint-disable-next-line no-console
console.log('User viewed, completed or commented - not saving hook')
return
}
if (!product || !publisher || !membership || !payer) {
// eslint-disable-next-line no-console
console.log('Elopage Hook: Not an event we can process')
return
}
loginElopageBuy.affiliateProgramId = parseInt(product.affiliate_program_id) || null
loginElopageBuy.publisherId = parseInt(publisher.id) || null
loginElopageBuy.orderId = parseInt(order_id) || null
@ -72,13 +85,6 @@ export const elopageWebhook = async (req: any, res: any): Promise<void> => {
const firstName = payer.first_name
const lastName = payer.last_name
// Do not process certain events
if (['lesson.viewed', 'lesson.completed', 'lesson.commented'].includes(loginElopageBuy.event)) {
// eslint-disable-next-line no-console
console.log('User viewed, completed or commented - not saving hook')
return
}
// Save the hook data
try {
await LoginElopageBuys.save(loginElopageBuy)

View File

@ -0,0 +1,18 @@
/* MIGRATION TO DELETE DECAY START BLOCK
*
* the decay start block is now specified as static value
* we can delete it from the database
*/
export async function upgrade(queryFn: (query: string, values?: any[]) => Promise<Array<any>>) {
// Remove transactions with type 9 (start decay block). This should affect exactly 1 row
await queryFn(`DELETE FROM transactions WHERE transaction_type_id = 9;`)
}
export async function downgrade(queryFn: (query: string, values?: any[]) => Promise<Array<any>>) {
// When rolling back an empty database this entry is newly created. This should not hurt in any way tho.
await queryFn(`
INSERT INTO transactions
VALUES(1682,9,0xC27BE999D7B4704E5F294099E780C5D6A275B165AFABFD8BECCEA39059CBB7B600000000000000000000000000000000,'','2021-05-13 15:46:31',NULL,NULL)
`)
}

View File

@ -1,6 +1,6 @@
{
"name": "gradido-database",
"version": "1.6.4",
"version": "1.6.5",
"description": "Gradido Database Tool to execute database migrations",
"main": "src/index.ts",
"repository": "https://github.com/gradido/gradido/database",

View File

@ -8,7 +8,6 @@ import { CreateRaeuberHotzenplotzSeed } from './seeds/users/raeuber-hotzenplotz.
import { CreateBobBaumeisterSeed } from './seeds/users/bob-baumeister.seed'
import { CreateGarrickOllivanderSeed } from './seeds/users/garrick-ollivander.seed'
import { CreateUserSeed } from './seeds/create-user.seed'
import { DecayStartBlockSeed } from './seeds/decay-start-block.seed'
import { resetDB, pool, migration } from './helpers'
const run = async (command: string) => {
@ -41,7 +40,6 @@ const run = async (command: string) => {
root: process.cwd(),
configName: 'ormconfig.js',
})
await runSeeder(DecayStartBlockSeed)
await runSeeder(CreatePeterLustigSeed)
await runSeeder(CreateBibiBloxbergSeed)
await runSeeder(CreateRaeuberHotzenplotzSeed)

View File

@ -1,17 +0,0 @@
import { Factory, Seeder } from 'typeorm-seeding'
import { Transaction } from '../../entity/Transaction'
export class DecayStartBlockSeed implements Seeder {
public async run(factory: Factory): Promise<void> {
await factory(Transaction)({
transactionTypeId: 9,
txHash: Buffer.from(
'9c9c4152b8a4cfbac287eee18d2d262e9de756fae726fc0ca36b788564973fff00000000000000000000000000000000',
'hex',
),
memo: '',
received: new Date('2021-11-30T09:13:26'),
blockchainTypeId: 1,
}).create()
}
}

View File

@ -1,6 +1,6 @@
{
"name": "bootstrap-vue-gradido-wallet",
"version": "1.6.4",
"version": "1.6.5",
"private": true,
"scripts": {
"start": "node run/server.js",
@ -62,7 +62,6 @@
"vue-qrcode": "^0.3.5",
"vue-qrcode-reader": "^2.3.16",
"vue-router": "^3.0.6",
"vue-toasted": "^1.1.28",
"vue2-transitions": "^0.2.3",
"vuex": "^3.6.0",
"vuex-persistedstate": "^4.0.0-beta.3"

View File

@ -41,6 +41,15 @@ export default {
}
</script>
<style>
.gdd-toaster-title {
color: #ffffff !important;
}
.gdd-toaster-body {
color: #ffffff !important;
}
.gdd-toaster {
color: #ffffff;
}
.btn-primary pim {
background-color: #5a7b02;
border-color: #5e72e4;

View File

@ -1,7 +1,7 @@
<template>
<div class="gdd-status">
<div class="p-0 gdd-status-div">
{{ pending ? '—' : $n(balance, 'decimal') }} {{ statusText }}
{{ pending || balance === null ? '—' : $n(balance, 'decimal') }} {{ statusText }}
</div>
</div>
</template>

View File

@ -109,6 +109,7 @@
"funding": "Zu den Förderbeiträgen",
"gdt-received": "GradidoTransform (GDT) erhalten",
"no-transactions": "Du hast noch keine GradidoTransform (GDT).",
"not-reachable": "Der GDT Server ist nicht erreichbar.",
"publisher": "Dein geworbenes Mitglied hat einen Beitrag bezahlt",
"raise": "Erhöhung",
"recruited-member": "Eingeladenes Mitglied"
@ -208,6 +209,7 @@
"title": "Danke!"
}
},
"success": "Erfolg",
"transaction": {
"gdd-text": "Gradido Transaktionen",
"gdt-text": "GradidoTransform Transaktionen",

View File

@ -109,6 +109,7 @@
"funding": "To the funding contributions",
"gdt-received": "GradidoTransform (GDT) received",
"no-transactions": "You do not have GradidoTransform (GDT) yet.",
"not-reachable": "The GDT Server is not reachable.",
"publisher": "A member you referred has paid a contribution",
"raise": "Increase",
"recruited-member": "Invited member"
@ -208,6 +209,7 @@
"title": "Thank you!"
}
},
"success": "Success",
"transaction": {
"gdd-text": "Gradido Transactions",
"gdt-text": "GradidoTransform Transactions",

View File

@ -3,6 +3,7 @@ import DashboardPlugin from './plugins/dashboard-plugin'
import App from './App.vue'
import i18n from './i18n.js'
import { loadAllRules } from './validation-rules'
import { toasters } from './mixins/toaster'
import 'regenerator-runtime'
@ -18,15 +19,7 @@ import { apolloProvider } from './plugins/apolloProvider'
Vue.use(DashboardPlugin)
Vue.config.productionTip = false
Vue.toasted.register(
'error',
(payload) => {
return payload.replace(/^GraphQL error: /, '')
},
{
type: 'error',
},
)
Vue.mixin(toasters)
loadAllRules(i18n)

View File

@ -13,7 +13,7 @@ export const getCommunityInfoMixin = {
return result.data.getCommunityInfo
})
.catch((error) => {
this.$toasted.global.error(error.message)
this.toastError(error.message)
})
}
},

View File

@ -0,0 +1,29 @@
export const toasters = {
methods: {
toastSuccess(message) {
this.toast(message, {
title: this.$t('success'),
variant: 'success',
})
},
toastError(message) {
this.toast(message, {
title: this.$t('error.error'),
variant: 'danger',
})
},
toast(message, options) {
message = message.replace(/^GraphQL error: /, '')
this.$bvToast.toast(message, {
autoHideDelay: 5000,
appendToast: false,
solid: true,
toaster: 'b-toaster-top-right',
headerClass: 'gdd-toaster-title',
bodyClass: 'gdd-toaster-body',
toastClass: 'gdd-toaster',
...options,
})
},
},
}

View File

@ -1,7 +1,6 @@
import GlobalComponents from './globalComponents'
import GlobalDirectives from './globalDirectives'
import Toasted from 'vue-toasted'
import PortalVue from 'portal-vue'
// vue-bootstrap
@ -30,16 +29,5 @@ export default {
Vue.use(FlatPickr)
Vue.use(Loading)
Vue.use(VueApollo)
Vue.use(Toasted, {
position: 'top-center',
duration: 5000,
fullWidth: true,
action: {
text: 'x',
onClick: (e, toastObject) => {
toastObject.goAway(0)
},
},
})
},
}

View File

@ -4,13 +4,10 @@ import Vue from 'vue'
import GlobalComponents from './globalComponents'
import GlobalDirectives from './globalDirectives'
import Toasted from 'vue-toasted'
import './assets/scss/app.scss'
jest.mock('./globalComponents')
jest.mock('./globalDirectives')
jest.mock('vue-toasted')
jest.mock('vue')
@ -27,21 +24,4 @@ describe('dashboard plugin', () => {
it('installs the global directives', () => {
expect(vueUseMock).toBeCalledWith(GlobalDirectives)
})
describe('vue toasted', () => {
const toastedAction = vueUseMock.mock.calls[9][1].action.onClick
const goAwayMock = jest.fn()
const toastObject = {
goAway: goAwayMock,
}
it('installs vue toasted', () => {
expect(vueUseMock).toBeCalledWith(Toasted, expect.anything())
})
it('onClick calls goAway(0)', () => {
toastedAction({}, toastObject)
expect(goAwayMock).toBeCalledWith(0)
})
})
})

View File

@ -2,6 +2,8 @@ import { mount, RouterLinkStub } from '@vue/test-utils'
import flushPromises from 'flush-promises'
import DashboardLayoutGdd from './DashboardLayout_gdd'
import { toastErrorSpy } from '../../../test/testSetup'
jest.useFakeTimers()
jest.setTimeout(30000)
@ -16,7 +18,6 @@ const apolloMock = jest.fn().mockResolvedValue({
logout: 'success',
},
})
const toasterMock = jest.fn()
describe('DashboardLayoutGdd', () => {
let wrapper
@ -38,11 +39,6 @@ describe('DashboardLayoutGdd', () => {
path: '/overview',
},
},
$toasted: {
global: {
error: toasterMock,
},
},
$apollo: {
query: apolloMock,
},
@ -219,8 +215,8 @@ describe('DashboardLayoutGdd', () => {
expect(wrapper.vm.pending).toBeTruthy()
})
it('calls $toasted.global.error method', () => {
expect(toasterMock).toBeCalledWith('Ouch!')
it('toasts the error message', () => {
expect(toastErrorSpy).toBeCalledWith('Ouch!')
})
})

View File

@ -92,7 +92,7 @@ export default {
const {
data: { transactionList },
} = result
this.GdtBalance = Number(transactionList.gdtSum)
this.GdtBalance = transactionList.gdtSum === null ? null : Number(transactionList.gdtSum)
this.transactions = transactionList.transactions
this.balance = Number(transactionList.decay)
this.bookedBalance = Number(transactionList.balance)
@ -102,7 +102,7 @@ export default {
.catch((error) => {
this.pending = true
this.transactionCount = -1
this.$toasted.global.error(error.message)
this.toastError(error.message)
// what to do when loading balance fails?
})
},

View File

@ -3,11 +3,15 @@ import NotFoundPage from './NotFoundPage'
const localVue = global.localVue
const mocks = {
$t: jest.fn((t) => t),
}
describe('NotFoundPage', () => {
let wrapper
const Wrapper = () => {
return mount(NotFoundPage, { localVue })
return mount(NotFoundPage, { localVue, mocks })
}
describe('mount', () => {
@ -18,5 +22,9 @@ describe('NotFoundPage', () => {
it('has a svg', () => {
expect(wrapper.find('svg').exists()).toBeTruthy()
})
it('has a back button', () => {
expect(wrapper.find('.test-back').exists()).toBeTruthy()
})
})
})

View File

@ -4,7 +4,7 @@
<div class="header py-1 py-lg-1 pt-lg-3">
<b-container>
<div class="header-body text-center mb-3">
<a href="login" to="login">
<a href="#!" @click="goback">
<div class="container">
<div class="row">
<div class="col-sm-12 col-md-12 mt-5 mb-5">
@ -1185,6 +1185,11 @@
</div>
</b-container>
</div>
<div class="text-center">
<b-button class="test-back" variant="light" @click="goback">
{{ $t('back') }}
</b-button>
</div>
</div>
</template>
@ -1213,6 +1218,11 @@ export default {
},
}
},
methods: {
goback() {
this.$router.go(-1)
},
},
}
</script>
<style>

View File

@ -2,6 +2,8 @@ import { mount } from '@vue/test-utils'
import { GdtEntryType } from '../../../graphql/enums'
import GdtTransactionList from './GdtTransactionList'
import { toastErrorSpy } from '../../../../test/testSetup'
const localVue = global.localVue
const apolloMock = jest.fn().mockResolvedValue({
@ -13,7 +15,6 @@ const apolloMock = jest.fn().mockResolvedValue({
},
})
const toastErrorMock = jest.fn()
const windowScrollToMock = jest.fn()
window.scrollTo = windowScrollToMock
@ -36,11 +37,6 @@ describe('GdtTransactionList ', () => {
$t: jest.fn((t) => t),
$n: jest.fn((n) => n),
$d: jest.fn((d) => d),
$toasted: {
global: {
error: toastErrorMock,
},
},
$apollo: {
query: apolloMock,
},
@ -152,7 +148,7 @@ describe('GdtTransactionList ', () => {
})
it('toasts an error message', () => {
expect(toastErrorMock).toBeCalledWith('Ouch!')
expect(toastErrorSpy).toBeCalledWith('Ouch!')
})
})

View File

@ -8,6 +8,9 @@
{{ $t('gdt.funding') }}
</b-button>
</div>
<div v-else-if="typeof transactionGdtCount === 'object'" class="text-center">
{{ $t('gdt.not-reachable') }}
</div>
<div
v-else
v-for="{ id, amount, date, comment, gdtEntryType, factor, gdt } in transactionsGdt"
@ -71,7 +74,7 @@ export default {
window.scrollTo(0, 0)
})
.catch((error) => {
this.$toasted.global.error(error.message)
this.toastError(error.message)
})
},
},

View File

@ -2,6 +2,8 @@ import { RouterLinkStub, mount } from '@vue/test-utils'
import flushPromises from 'flush-promises'
import Login from './Login'
import { toastErrorSpy } from '../../../test/testSetup'
const localVue = global.localVue
const apolloQueryMock = jest.fn().mockResolvedValue({
@ -15,7 +17,6 @@ const apolloQueryMock = jest.fn().mockResolvedValue({
},
})
const toastErrorMock = jest.fn()
const mockStoreDispach = jest.fn()
const mockStoreCommit = jest.fn()
const mockRouterPush = jest.fn()
@ -51,11 +52,6 @@ describe('Login', () => {
$router: {
push: mockRouterPush,
},
$toasted: {
global: {
error: toastErrorMock,
},
},
$apollo: {
query: apolloQueryMock,
},
@ -96,7 +92,7 @@ describe('Login', () => {
})
it('toasts an error message', () => {
expect(toastErrorMock).toBeCalledWith('Failed to get communities')
expect(toastErrorSpy).toBeCalledWith('Failed to get communities')
})
})
@ -249,7 +245,7 @@ describe('Login', () => {
})
it('toasts an error message', () => {
expect(toastErrorMock).toBeCalledWith('error.no-account')
expect(toastErrorSpy).toBeCalledWith('error.no-account')
})
describe('login fails with "User email not validated"', () => {

View File

@ -105,7 +105,7 @@ export default {
loader.hide()
})
.catch((error) => {
this.$toasted.global.error(this.$t('error.no-account'))
this.toastError(this.$t('error.no-account'))
if (error.message.includes('User email not validated')) {
this.$router.push('/thx/login')
} else if (error.message.includes('User has no password set yet')) {

View File

@ -1,8 +1,9 @@
import { mount, RouterLinkStub } from '@vue/test-utils'
import flushPromises from 'flush-promises'
import Register from './Register'
import { toastErrorSpy } from '../../../test/testSetup'
const localVue = global.localVue
const apolloQueryMock = jest.fn().mockResolvedValue({
@ -16,7 +17,6 @@ const apolloQueryMock = jest.fn().mockResolvedValue({
},
})
const toastErrorMock = jest.fn()
const mockStoreCommit = jest.fn()
const registerUserMutationMock = jest.fn()
const routerPushMock = jest.fn()
@ -48,11 +48,6 @@ describe('Register', () => {
publisherId: 12345,
},
},
$toasted: {
global: {
error: toastErrorMock,
},
},
}
const stubs = {
@ -96,7 +91,7 @@ describe('Register', () => {
})
it('toasts an error message', () => {
expect(toastErrorMock).toBeCalledWith('Failed to get communities')
expect(toastErrorSpy).toBeCalledWith('Failed to get communities')
})
})

View File

@ -1,6 +1,8 @@
import { mount, RouterLinkStub } from '@vue/test-utils'
import RegisterCommunity from './RegisterCommunity'
import { toastErrorSpy } from '../../../test/testSetup'
const localVue = global.localVue
const apolloQueryMock = jest.fn().mockResolvedValue({
@ -13,7 +15,7 @@ const apolloQueryMock = jest.fn().mockResolvedValue({
},
},
})
const toastErrorMock = jest.fn()
const mockStoreCommit = jest.fn()
describe('RegisterCommunity', () => {
@ -36,11 +38,6 @@ describe('RegisterCommunity', () => {
},
},
},
$toasted: {
global: {
error: toastErrorMock,
},
},
}
const stubs = {
@ -78,7 +75,7 @@ describe('RegisterCommunity', () => {
})
it('toasts an error message', () => {
expect(toastErrorMock).toBeCalledWith('Failed to get communities')
expect(toastErrorSpy).toBeCalledWith('Failed to get communities')
})
})

View File

@ -2,6 +2,8 @@ import { mount, RouterLinkStub } from '@vue/test-utils'
import { communities, communityInfo } from '../../graphql/queries'
import RegisterSelectCommunity from './RegisterSelectCommunity'
import { toastErrorSpy } from '../../../test/testSetup'
const localVue = global.localVue
const spinnerHideMock = jest.fn()
@ -52,7 +54,6 @@ const apolloQueryMock = jest
},
})
const toasterMock = jest.fn()
const mockStoreCommit = jest.fn()
describe('RegisterSelectCommunity', () => {
@ -78,11 +79,6 @@ describe('RegisterSelectCommunity', () => {
$loading: {
show: spinnerMock,
},
$toasted: {
global: {
error: toasterMock,
},
},
}
const stubs = {
@ -129,7 +125,7 @@ describe('RegisterSelectCommunity', () => {
})
it('toasts an error message', () => {
expect(toasterMock).toBeCalledWith('Failed to get communities')
expect(toastErrorSpy).toBeCalledWith('Failed to get communities')
})
})
@ -208,7 +204,7 @@ describe('RegisterSelectCommunity', () => {
})
it('toast an error', () => {
expect(toasterMock).toBeCalledWith('Wrong thing')
expect(toastErrorSpy).toBeCalledWith('Wrong thing')
})
it('hides the spinner', () => {

View File

@ -76,7 +76,7 @@ export default {
)
})
.catch((error) => {
this.$toasted.global.error(error.message)
this.toastError(error.message)
})
loader.hide()
this.pending = false

View File

@ -2,13 +2,14 @@ import { mount, RouterLinkStub } from '@vue/test-utils'
import ResetPassword from './ResetPassword'
import flushPromises from 'flush-promises'
import { toastErrorSpy } from '../../../test/testSetup'
// validation is tested in src/views/Pages/UserProfile/UserCard_FormUserPasswort.spec.js
const localVue = global.localVue
const apolloMutationMock = jest.fn()
const toasterMock = jest.fn()
const routerPushMock = jest.fn()
const stubs = {
@ -29,11 +30,6 @@ const mocks = {
includes: jest.fn((t) => t === mocks.$route.path.mock),
},
},
$toasted: {
global: {
error: toasterMock,
},
},
$router: {
push: routerPushMock,
},
@ -65,7 +61,7 @@ describe('ResetPassword', () => {
})
it.skip('toasts an error when no valid optin is given', () => {
expect(toasterMock).toHaveBeenCalledWith('error')
expect(toastErrorSpy).toHaveBeenCalledWith('error')
})
it.skip('has a message suggesting to contact the support', () => {
@ -157,7 +153,7 @@ describe('ResetPassword', () => {
})
it('toasts an error message', () => {
expect(toasterMock).toHaveBeenCalledWith('...Code is older than 10 minutes')
expect(toastErrorSpy).toHaveBeenCalledWith('...Code is older than 10 minutes')
})
it('router pushes to /password/reset', () => {
@ -174,7 +170,7 @@ describe('ResetPassword', () => {
})
it('toasts an error message', () => {
expect(toasterMock).toHaveBeenCalledWith('Error')
expect(toastErrorSpy).toHaveBeenCalledWith('Error')
})
})

View File

@ -99,7 +99,7 @@ export default {
}
})
.catch((error) => {
this.$toasted.global.error(error.message)
this.toastError(error.message)
if (error.message.includes('Code is older than 10 minutes'))
this.$router.push('/password/reset')
})

View File

@ -2,12 +2,12 @@ import { mount } from '@vue/test-utils'
import UserCardCoinAnimation from './UserCard_CoinAnimation'
import { updateUserInfos } from '../../../graphql/mutations'
import { toastErrorSpy, toastSuccessSpy } from '../../../../test/testSetup'
const localVue = global.localVue
const mockAPIcall = jest.fn()
const toastErrorMock = jest.fn()
const toastSuccessMock = jest.fn()
const storeCommitMock = jest.fn()
describe('UserCard_CoinAnimation', () => {
@ -22,12 +22,6 @@ describe('UserCard_CoinAnimation', () => {
},
commit: storeCommitMock,
},
$toasted: {
success: toastSuccessMock,
global: {
error: toastErrorMock,
},
},
$apollo: {
mutate: mockAPIcall,
},
@ -78,7 +72,7 @@ describe('UserCard_CoinAnimation', () => {
})
it('toasts a success message', () => {
expect(toastSuccessMock).toBeCalledWith('settings.coinanimation.True')
expect(toastSuccessSpy).toBeCalledWith('settings.coinanimation.True')
})
})
@ -109,7 +103,7 @@ describe('UserCard_CoinAnimation', () => {
})
it('toasts a success message', () => {
expect(toastSuccessMock).toBeCalledWith('settings.coinanimation.False')
expect(toastSuccessSpy).toBeCalledWith('settings.coinanimation.False')
})
})
@ -126,7 +120,7 @@ describe('UserCard_CoinAnimation', () => {
})
it('toasts an error message', () => {
expect(toastErrorMock).toBeCalledWith('Ouch')
expect(toastErrorSpy).toBeCalledWith('Ouch')
})
})
})

View File

@ -50,7 +50,7 @@ export default {
})
.then(() => {
this.$store.commit('coinanimation', this.CoinAnimationStatus)
this.$toasted.success(
this.toastSuccess(
this.CoinAnimationStatus
? this.$t('settings.coinanimation.True')
: this.$t('settings.coinanimation.False'),
@ -58,7 +58,7 @@ export default {
})
.catch((error) => {
this.CoinAnimationStatus = this.$store.state.coinanimation
this.$toasted.global.error(error.message)
this.toastError(error.message)
})
},
},

View File

@ -2,12 +2,12 @@ import { mount } from '@vue/test-utils'
import UserCardFormUserData from './UserCard_FormUserData'
import flushPromises from 'flush-promises'
import { toastErrorSpy, toastSuccessSpy } from '../../../../test/testSetup'
const localVue = global.localVue
const mockAPIcall = jest.fn()
const toastErrorMock = jest.fn()
const toastSuccessMock = jest.fn()
const storeCommitMock = jest.fn()
describe('UserCard_FormUserData', () => {
@ -22,12 +22,6 @@ describe('UserCard_FormUserData', () => {
},
commit: storeCommitMock,
},
$toasted: {
success: toastSuccessMock,
global: {
error: toastErrorMock,
},
},
$apollo: {
mutate: mockAPIcall,
},
@ -126,7 +120,7 @@ describe('UserCard_FormUserData', () => {
})
it('toasts a success message', () => {
expect(toastSuccessMock).toBeCalledWith('settings.name.change-success')
expect(toastSuccessSpy).toBeCalledWith('settings.name.change-success')
})
it('has an edit button again', () => {
@ -159,7 +153,7 @@ describe('UserCard_FormUserData', () => {
})
it('toasts an error message', () => {
expect(toastErrorMock).toBeCalledWith('Error')
expect(toastErrorSpy).toBeCalledWith('Error')
})
})
})

View File

@ -108,10 +108,10 @@ export default {
this.$store.commit('firstName', this.form.firstName)
this.$store.commit('lastName', this.form.lastName)
this.showUserData = true
this.$toasted.success(this.$t('settings.name.change-success'))
this.toastSuccess(this.$t('settings.name.change-success'))
})
.catch((error) => {
this.$toasted.global.error(error.message)
this.toastError(error.message)
})
},
},

View File

@ -2,25 +2,18 @@ import { mount } from '@vue/test-utils'
import UserCardFormPasswort from './UserCard_FormUserPasswort'
import flushPromises from 'flush-promises'
import { toastErrorSpy, toastSuccessSpy } from '../../../../test/testSetup'
const localVue = global.localVue
const changePasswordProfileMock = jest.fn()
changePasswordProfileMock.mockReturnValue({ success: true })
const toastSuccessMock = jest.fn()
const toastErrorMock = jest.fn()
describe('UserCard_FormUserPasswort', () => {
let wrapper
const mocks = {
$t: jest.fn((t) => t),
$toasted: {
success: toastSuccessMock,
global: {
error: toastErrorMock,
},
},
$apollo: {
mutate: changePasswordProfileMock,
},
@ -196,7 +189,7 @@ describe('UserCard_FormUserPasswort', () => {
})
it('toasts a success message', () => {
expect(toastSuccessMock).toBeCalledWith('site.thx.reset')
expect(toastSuccessSpy).toBeCalledWith('site.thx.reset')
})
it('cancels the edit process', () => {
@ -217,7 +210,7 @@ describe('UserCard_FormUserPasswort', () => {
})
it('toasts an error message', () => {
expect(toastErrorMock).toBeCalledWith('error')
expect(toastErrorSpy).toBeCalledWith('error')
})
})
})

View File

@ -89,11 +89,11 @@ export default {
},
})
.then(() => {
this.$toasted.success(this.$t('site.thx.reset'))
this.toastSuccess(this.$t('site.thx.reset'))
this.cancelEdit()
})
.catch((error) => {
this.$toasted.global.error(error.message)
this.toastError(error.message)
})
},
},

View File

@ -3,6 +3,8 @@ import UserCardFormUsername from './UserCard_FormUsername'
import flushPromises from 'flush-promises'
import { extend } from 'vee-validate'
import { toastErrorSpy, toastSuccessSpy } from '../../../../test/testSetup'
const localVue = global.localVue
const mockAPIcall = jest.fn()
@ -14,8 +16,6 @@ extend('gddUsernameUnique', {
},
})
const toastErrorMock = jest.fn()
const toastSuccessMock = jest.fn()
const storeCommitMock = jest.fn()
describe('UserCard_FormUsername', () => {
@ -29,12 +29,6 @@ describe('UserCard_FormUsername', () => {
},
commit: storeCommitMock,
},
$toasted: {
success: toastSuccessMock,
global: {
error: toastErrorMock,
},
},
$apollo: {
mutate: mockAPIcall,
},
@ -125,7 +119,7 @@ describe('UserCard_FormUsername', () => {
})
it('toasts an success message', () => {
expect(toastSuccessMock).toBeCalledWith('settings.name.change-success')
expect(toastSuccessSpy).toBeCalledWith('settings.name.change-success')
})
it('has no edit button anymore', () => {
@ -155,7 +149,7 @@ describe('UserCard_FormUsername', () => {
})
it('toasts an error message', () => {
expect(toastErrorMock).toBeCalledWith('Ouch!')
expect(toastErrorSpy).toBeCalledWith('Ouch!')
})
it('renders an empty username', () => {

View File

@ -97,10 +97,10 @@ export default {
this.$store.commit('username', this.form.username)
this.username = this.form.username
this.showUsername = true
this.$toasted.success(this.$t('settings.name.change-success'))
this.toastSuccess(this.$t('settings.name.change-success'))
})
.catch((error) => {
this.$toasted.global.error(error.message)
this.toastError(error.message)
this.showUsername = true
this.username = this.$store.state.username
this.form.username = this.$store.state.username

View File

@ -1,6 +1,8 @@
import { mount } from '@vue/test-utils'
import UserCardLanguage from './UserCard_Language'
import { toastErrorSpy, toastSuccessSpy } from '../../../../test/testSetup'
const localVue = global.localVue
const mockAPIcall = jest.fn().mockResolvedValue({
@ -11,8 +13,6 @@ const mockAPIcall = jest.fn().mockResolvedValue({
},
})
const toastErrorMock = jest.fn()
const toastSuccessMock = jest.fn()
const storeCommitMock = jest.fn()
describe('UserCard_Language', () => {
@ -26,12 +26,6 @@ describe('UserCard_Language', () => {
},
commit: storeCommitMock,
},
$toasted: {
success: toastSuccessMock,
global: {
error: toastErrorMock,
},
},
$apollo: {
mutate: mockAPIcall,
},
@ -143,7 +137,7 @@ describe('UserCard_Language', () => {
})
it('toasts a success message', () => {
expect(toastSuccessMock).toBeCalledWith('settings.language.success')
expect(toastSuccessSpy).toBeCalledWith('settings.language.success')
})
})
@ -159,7 +153,7 @@ describe('UserCard_Language', () => {
})
it('toasts an error message', () => {
expect(toastErrorMock).toBeCalledWith('Ouch!')
expect(toastErrorSpy).toBeCalledWith('Ouch!')
})
})
})

View File

@ -97,11 +97,11 @@ export default {
.then(() => {
this.$store.commit('language', this.language)
this.cancelEdit()
this.$toasted.success(this.$t('settings.language.success'))
this.toastSuccess(this.$t('settings.language.success'))
})
.catch((error) => {
this.language = this.$store.state.language
this.$toasted.global.error(error.message)
this.toastError(error.message)
})
},
buildTagFromLanguageString() {

View File

@ -2,12 +2,12 @@ import { mount } from '@vue/test-utils'
import UserCardNewsletter from './UserCard_Newsletter'
import { unsubscribeNewsletter, subscribeNewsletter } from '../../../graphql/mutations'
import { toastErrorSpy, toastSuccessSpy } from '../../../../test/testSetup'
const localVue = global.localVue
const mockAPIcall = jest.fn()
const toastErrorMock = jest.fn()
const toastSuccessMock = jest.fn()
const storeCommitMock = jest.fn()
describe('UserCard_Newsletter', () => {
@ -23,12 +23,6 @@ describe('UserCard_Newsletter', () => {
},
commit: storeCommitMock,
},
$toasted: {
success: toastSuccessMock,
global: {
error: toastErrorMock,
},
},
$apollo: {
mutate: mockAPIcall,
},
@ -77,7 +71,7 @@ describe('UserCard_Newsletter', () => {
})
it('toasts a success message', () => {
expect(toastSuccessMock).toBeCalledWith('settings.newsletter.newsletterFalse')
expect(toastSuccessSpy).toBeCalledWith('settings.newsletter.newsletterFalse')
})
})
@ -107,7 +101,7 @@ describe('UserCard_Newsletter', () => {
})
it('toasts a success message', () => {
expect(toastSuccessMock).toBeCalledWith('settings.newsletter.newsletterTrue')
expect(toastSuccessSpy).toBeCalledWith('settings.newsletter.newsletterTrue')
})
})
@ -124,7 +118,7 @@ describe('UserCard_Newsletter', () => {
})
it('toasts an error message', () => {
expect(toastErrorMock).toBeCalledWith('Ouch')
expect(toastErrorSpy).toBeCalledWith('Ouch')
})
})
})

View File

@ -48,7 +48,7 @@ export default {
})
.then(() => {
this.$store.commit('newsletterState', this.newsletterState)
this.$toasted.success(
this.toastSuccess(
this.newsletterState
? this.$t('settings.newsletter.newsletterTrue')
: this.$t('settings.newsletter.newsletterFalse'),
@ -56,7 +56,7 @@ export default {
})
.catch((error) => {
this.newsletterState = this.$store.state.newsletterState
this.$toasted.global.error(error.message)
this.toastError(error.message)
})
},
},

View File

@ -1,7 +1,7 @@
<template>
<div class="pb-4">
<b-tabs content-class="" justified>
<b-tab :title="'Gradido (' + $n(balance, 'decimal') + ' GDD)'" class="px-4">
<b-tab :title="`Gradido (${$n(balance, 'decimal')} GDD)`" class="px-4">
<p class="tab-tex">{{ $t('transaction.gdd-text') }}</p>
<gdd-transaction-list
@ -13,7 +13,10 @@
/>
</b-tab>
<b-tab :title="'Gradido Transform (' + $n(GdtBalance, 'decimal') + ' GDT)'" class="px-4">
<b-tab
:title="`Gradido Transform (${GdtBalance === null ? '—' : $n(GdtBalance, 'decimal')} GDT)`"
class="px-4"
>
<p class="">{{ $t('transaction.gdt-text') }}</p>
<gdt-transaction-list />

View File

@ -17,6 +17,10 @@ import { focus } from 'vue-focus'
import { loadAllRules } from '../src/validation-rules'
import { toasters } from '../src/mixins/toaster'
export const toastErrorSpy = jest.spyOn(toasters.methods, 'toastError')
export const toastSuccessSpy = jest.spyOn(toasters.methods, 'toastSuccess')
Object.keys(rules).forEach((rule) => {
extend(rule, {
...rules[rule], // copies rule configuration
@ -47,6 +51,18 @@ global.localVue.component('validation-observer', ValidationObserver)
// global.localVue.directive('click-outside', clickOutside)
global.localVue.directive('focus', focus)
global.localVue.mixin(toasters)
// Filter the warnings for portal vue
// https://github.com/BeniRupp/bug_portal-vue-target-already-exists
const consoleWarn = global.console.warn
// eslint-disable-next-line no-console
delete console.warn
// eslint-disable-next-line no-console
console.warn = (m) => {
if (!m.match(/^\[portal-vue\]: Target .+ already exists$/)) consoleWarn(m)
}
// throw errors for vue warnings to force the programmers to take care about warnings
Vue.config.warnHandler = (w) => {
throw new Error(w)

View File

@ -14256,11 +14256,6 @@ vue-template-es2015-compiler@^1.6.0, vue-template-es2015-compiler@^1.9.0:
resolved "https://registry.yarnpkg.com/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.9.1.tgz#1ee3bc9a16ecbf5118be334bb15f9c46f82f5825"
integrity sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw==
vue-toasted@^1.1.28:
version "1.1.28"
resolved "https://registry.yarnpkg.com/vue-toasted/-/vue-toasted-1.1.28.tgz#dbabb83acc89f7a9e8765815e491d79f0dc65c26"
integrity sha512-UUzr5LX51UbbiROSGZ49GOgSzFxaMHK6L00JV8fir/CYNJCpIIvNZ5YmS4Qc8Y2+Z/4VVYRpeQL2UO0G800Raw==
vue2-transitions@^0.2.3:
version "0.2.3"
resolved "https://registry.yarnpkg.com/vue2-transitions/-/vue2-transitions-0.2.3.tgz#69c9d75b1db05f231b80980c03459d68490ba27d"

View File

@ -1,6 +1,6 @@
{
"name": "gradido",
"version": "1.6.4",
"version": "1.6.5",
"description": "Gradido",
"main": "index.js",
"repository": "git@github.com:gradido/gradido.git",

View File

@ -29,4 +29,4 @@ yarn version --no-git-tag-version --no-commit-hooks --no-commit --new-version ${
# generate changelog
cd ${PROJECT_DIR}
auto-changelog --latest-version ${VERSION}
auto-changelog --commit-limit 0 --latest-version ${VERSION}