Merge branch 'master' into event_refactor_database

This commit is contained in:
Ulf Gebhardt 2023-03-03 23:55:24 +01:00
commit 4379668268
Signed by: ulfgebhardt
GPG Key ID: DA6B843E748679C9
145 changed files with 2482 additions and 1130 deletions

View File

@ -550,7 +550,7 @@ jobs:
run: |
cd e2e-tests/
yarn
yarn run cypress run --spec cypress/e2e/User.Authentication.feature,cypress/e2e/User.Authentication.ResetPassword.feature
yarn run cypress run --spec cypress/e2e/User.Authentication.feature,cypress/e2e/User.Authentication.ResetPassword.feature,cypress/e2e/User.Registration.feature
- name: End-to-end tests | if tests failed, upload screenshots
if: ${{ failure() && steps.e2e-tests.conclusion == 'failure' }}
uses: actions/upload-artifact@v3

View File

@ -1,4 +1,4 @@
name: gradido test_dht-node CI
name: Gradido DHT Node Test CI
on: push
@ -7,7 +7,7 @@ jobs:
# JOB: DOCKER BUILD TEST #####################################################
##############################################################################
build:
name: Docker Build Test
name: Docker Build Test - DHT Node
runs-on: ubuntu-latest
steps:
- name: Checkout code
@ -28,7 +28,7 @@ jobs:
# JOB: LINT ##################################################################
##############################################################################
lint:
name: Lint
name: Lint - DHT Node
runs-on: ubuntu-latest
needs: [build]
steps:
@ -50,7 +50,7 @@ jobs:
# JOB: UNIT TEST #############################################################
##############################################################################
unit_test:
name: Unit tests
name: Unit Tests - DHT Node
runs-on: ubuntu-latest
needs: [build]
steps:
@ -90,7 +90,7 @@ jobs:
- name: Coverage check
uses: webcraftmedia/coverage-check-action@master
with:
report_name: Coverage dht-node
report_name: Coverage DHT Node
type: lcov
#result_path: ./dht-node/coverage/lcov.info
result_path: ./coverage/lcov.info

View File

@ -1,4 +1,4 @@
name: gradido test_federation CI
name: Gradido Federation Test CI
on: push
@ -7,7 +7,7 @@ jobs:
# JOB: DOCKER BUILD TEST #####################################################
##############################################################################
build:
name: Docker Build Test
name: Docker Build Test - Federation
runs-on: ubuntu-latest
steps:
- name: Checkout code
@ -28,7 +28,7 @@ jobs:
# JOB: LINT ##################################################################
##############################################################################
lint:
name: Lint
name: Lint - Federation
runs-on: ubuntu-latest
needs: [build]
steps:
@ -50,7 +50,7 @@ jobs:
# JOB: UNIT TEST #############################################################
##############################################################################
unit_test:
name: Unit tests
name: Unit Tests - Federation
runs-on: ubuntu-latest
needs: [build]
steps:
@ -90,7 +90,7 @@ jobs:
- name: Coverage check
uses: webcraftmedia/coverage-check-action@master
with:
report_name: Coverage federation
report_name: Coverage Federation
type: lcov
#result_path: ./federation/coverage/lcov.info
result_path: ./coverage/lcov.info

View File

@ -6,7 +6,7 @@
</template>
<script>
import defaultLayout from '@/layouts/defaultLayout.vue'
import defaultLayout from '@/layouts/defaultLayout'
export default {
name: 'app',

View File

@ -1,5 +1,5 @@
import { mount } from '@vue/test-utils'
import ChangeUserRoleFormular from './ChangeUserRoleFormular.vue'
import ChangeUserRoleFormular from './ChangeUserRoleFormular'
import { setUserRole } from '../graphql/setUserRole'
import { toastSuccessSpy, toastErrorSpy } from '../../test/testSetup'

View File

@ -1,5 +1,5 @@
import { mount } from '@vue/test-utils'
import ConfirmRegisterMailFormular from './ConfirmRegisterMailFormular.vue'
import ConfirmRegisterMailFormular from './ConfirmRegisterMailFormular'
import { toastErrorSpy, toastSuccessSpy } from '../../test/testSetup'

View File

@ -1,5 +1,5 @@
import { mount } from '@vue/test-utils'
import ContributionLink from './ContributionLink.vue'
import ContributionLink from './ContributionLink'
const localVue = global.localVue

View File

@ -43,8 +43,8 @@
</div>
</template>
<script>
import ContributionLinkForm from '../ContributionLink/ContributionLinkForm.vue'
import ContributionLinkList from '../ContributionLink/ContributionLinkList.vue'
import ContributionLinkForm from '../ContributionLink/ContributionLinkForm'
import ContributionLinkList from '../ContributionLink/ContributionLinkList'
export default {
name: 'ContributionLink',

View File

@ -1,5 +1,5 @@
import { mount } from '@vue/test-utils'
import ContributionLinkForm from './ContributionLinkForm.vue'
import ContributionLinkForm from './ContributionLinkForm'
import { toastErrorSpy, toastSuccessSpy } from '../../../test/testSetup'
import { createContributionLink } from '@/graphql/createContributionLink.js'

View File

@ -1,5 +1,5 @@
import { mount } from '@vue/test-utils'
import ContributionLinkList from './ContributionLinkList.vue'
import ContributionLinkList from './ContributionLinkList'
import { toastSuccessSpy, toastErrorSpy } from '../../../test/testSetup'
// import { deleteContributionLink } from '../graphql/deleteContributionLink'

View File

@ -46,7 +46,7 @@
</template>
<script>
import { deleteContributionLink } from '@/graphql/deleteContributionLink.js'
import FigureQrCode from '../FigureQrCode.vue'
import FigureQrCode from '../FigureQrCode'
export default {
name: 'ContributionLinkList',

View File

@ -1,5 +1,5 @@
import { mount } from '@vue/test-utils'
import ContributionMessagesFormular from './ContributionMessagesFormular.vue'
import ContributionMessagesFormular from './ContributionMessagesFormular'
import { toastErrorSpy, toastSuccessSpy } from '../../../test/testSetup'
const localVue = global.localVue

View File

@ -1,5 +1,5 @@
import { mount } from '@vue/test-utils'
import ContributionMessagesList from './ContributionMessagesList.vue'
import ContributionMessagesList from './ContributionMessagesList'
const localVue = global.localVue

View File

@ -15,8 +15,8 @@
</div>
</template>
<script>
import ContributionMessagesListItem from './slots/ContributionMessagesListItem.vue'
import ContributionMessagesFormular from '../ContributionMessages/ContributionMessagesFormular.vue'
import ContributionMessagesListItem from './slots/ContributionMessagesListItem'
import ContributionMessagesFormular from '../ContributionMessages/ContributionMessagesFormular'
import { listContributionMessages } from '../../graphql/listContributionMessages.js'
export default {

View File

@ -1,5 +1,5 @@
import { mount } from '@vue/test-utils'
import ContributionMessagesListItem from './ContributionMessagesListItem.vue'
import ContributionMessagesListItem from './ContributionMessagesListItem'
const localVue = global.localVue

View File

@ -16,7 +16,7 @@
</div>
</template>
<script>
import ParseMessage from '@/components/ContributionMessages/ParseMessage.vue'
import ParseMessage from '@/components/ContributionMessages/ParseMessage'
export default {
name: 'ContributionMessagesListItem',

View File

@ -1,7 +1,6 @@
import { mount } from '@vue/test-utils'
import CreationFormular from './CreationFormular.vue'
import CreationFormular from './CreationFormular'
import { adminCreateContribution } from '../graphql/adminCreateContribution'
import { adminCreateContributions } from '../graphql/adminCreateContributions'
import { toastErrorSpy, toastSuccessSpy } from '../../test/testSetup'
const localVue = global.localVue
@ -328,122 +327,6 @@ describe('CreationFormular', () => {
})
})
})
describe('mass creation with success', () => {
beforeEach(async () => {
jest.clearAllMocks()
apolloMutateMock.mockResolvedValue({
data: {
adminCreateContributions: {
success: true,
successfulContribution: ['bob@baumeister.de', 'bibi@bloxberg.de'],
failedContribution: [],
},
},
})
await wrapper.setProps({
type: 'massCreation',
creation: [200, 400, 600],
items: [{ email: 'bob@baumeister.de' }, { email: 'bibi@bloxberg.de' }],
})
await wrapper.findAll('input[type="radio"]').at(1).setChecked()
await wrapper.find('textarea').setValue('Test mass create coins')
await wrapper.find('input[type="number"]').setValue(200)
await wrapper.find('.test-submit').trigger('click')
})
it('calls the API', () => {
expect(apolloMutateMock).toBeCalledWith(
expect.objectContaining({
mutation: adminCreateContributions,
variables: {
pendingCreations: [
{
email: 'bob@baumeister.de',
creationDate: getCreationDate(1),
amount: 200,
memo: 'Test mass create coins',
},
{
email: 'bibi@bloxberg.de',
creationDate: getCreationDate(1),
amount: 200,
memo: 'Test mass create coins',
},
],
},
}),
)
})
it('updates open creations in store', () => {
expect(stateCommitMock).toBeCalledWith('openCreationsPlus', 2)
})
it('emits remove-all-bookmark', () => {
expect(wrapper.emitted('remove-all-bookmark')).toBeTruthy()
})
})
describe('mass creation with success but all failed', () => {
beforeEach(async () => {
jest.clearAllMocks()
apolloMutateMock.mockResolvedValue({
data: {
adminCreateContributions: {
success: true,
successfulContribution: [],
failedContribution: ['bob@baumeister.de', 'bibi@bloxberg.de'],
},
},
})
await wrapper.setProps({
type: 'massCreation',
creation: [200, 400, 600],
items: [{ email: 'bob@baumeister.de' }, { email: 'bibi@bloxberg.de' }],
})
await wrapper.findAll('input[type="radio"]').at(1).setChecked()
await wrapper.find('textarea').setValue('Test mass create coins')
await wrapper.find('input[type="number"]').setValue(200)
await wrapper.find('.test-submit').trigger('click')
})
it('updates open creations in store', () => {
expect(stateCommitMock).toBeCalledWith('openCreationsPlus', 0)
})
it('emits remove all bookmarks', () => {
expect(wrapper.emitted('remove-all-bookmark')).toBeTruthy()
})
it('emits toast failed creations with two emails', () => {
expect(wrapper.emitted('toast-failed-creations')).toEqual([
[['bob@baumeister.de', 'bibi@bloxberg.de']],
])
})
})
describe('mass creation with error', () => {
beforeEach(async () => {
jest.clearAllMocks()
apolloMutateMock.mockRejectedValue({
message: 'Oh no!',
})
await wrapper.setProps({
type: 'massCreation',
creation: [200, 400, 600],
items: [{ email: 'bob@baumeister.de' }, { email: 'bibi@bloxberg.de' }],
})
await wrapper.findAll('input[type="radio"]').at(1).setChecked()
await wrapper.find('textarea').setValue('Test mass create coins')
await wrapper.find('input[type="number"]').setValue(200)
await wrapper.find('.test-submit').trigger('click')
})
it('toasts an error message', () => {
expect(toastErrorSpy).toBeCalledWith('Oh no!')
})
})
})
})
})

View File

@ -86,16 +86,11 @@
</template>
<script>
import { adminCreateContribution } from '../graphql/adminCreateContribution'
import { adminCreateContributions } from '../graphql/adminCreateContributions'
import { creationMonths } from '../mixins/creationMonths'
export default {
name: 'CreationFormular',
mixins: [creationMonths],
props: {
type: {
type: String,
required: false,
},
pagetype: {
type: String,
required: false,
@ -140,78 +135,38 @@ export default {
updateRadioSelected(name) {
// do we want to reset the memo everytime the month changes?
this.text = this.$t('creation_form.creation_for') + ' ' + name.short + ' ' + name.year
if (this.type === 'singleCreation') {
this.rangeMin = 0
this.rangeMax = name.creation
}
this.rangeMin = 0
this.rangeMax = name.creation
},
submitCreation() {
let submitObj = []
if (this.type === 'massCreation') {
this.items.forEach((item) => {
submitObj.push({
email: item.email,
this.$apollo
.mutate({
mutation: adminCreateContribution,
variables: {
email: this.item.email,
creationDate: this.selected.date,
amount: Number(this.value),
memo: this.text,
})
},
})
.then((result) => {
this.$emit('update-user-data', this.item, result.data.adminCreateContribution)
this.$store.commit('openCreationsPlus', 1)
this.toastSuccess(
this.$t('creation_form.toasted', {
value: this.value,
email: this.item.email,
}),
)
// what is this? Tests says that this.text is not reseted
this.$refs.creationForm.reset()
this.value = 0
})
.catch((error) => {
this.toastError(error.message)
this.$refs.creationForm.reset()
this.value = 0
})
this.$apollo
.mutate({
mutation: adminCreateContributions,
variables: {
pendingCreations: submitObj,
},
fetchPolicy: 'no-cache',
})
.then((result) => {
const failedContributions = []
this.$store.commit(
'openCreationsPlus',
result.data.adminCreateContributions.successfulContribution.length,
)
if (result.data.adminCreateContributions.failedContribution.length > 0) {
result.data.adminCreateContributions.failedContribution.forEach((email) => {
failedContributions.push(email)
})
}
this.$emit('remove-all-bookmark')
this.$emit('toast-failed-creations', failedContributions)
})
.catch((error) => {
this.toastError(error.message)
})
} else if (this.type === 'singleCreation') {
submitObj = {
email: this.item.email,
creationDate: this.selected.date,
amount: Number(this.value),
memo: this.text,
}
this.$apollo
.mutate({
mutation: adminCreateContribution,
variables: submitObj,
})
.then((result) => {
this.$emit('update-user-data', this.item, result.data.adminCreateContribution)
this.$store.commit('openCreationsPlus', 1)
this.toastSuccess(
this.$t('creation_form.toasted', {
value: this.value,
email: this.item.email,
}),
)
// what is this? Tests says that this.text is not reseted
this.$refs.creationForm.reset()
this.value = 0
})
.catch((error) => {
this.toastError(error.message)
this.$refs.creationForm.reset()
this.value = 0
})
}
},
},
watch: {

View File

@ -1,5 +1,5 @@
import { mount } from '@vue/test-utils'
import CreationTransactionList from './CreationTransactionList.vue'
import CreationTransactionList from './CreationTransactionList'
import { toastErrorSpy } from '../../test/testSetup'
const localVue = global.localVue

View File

@ -1,5 +1,5 @@
import { mount } from '@vue/test-utils'
import DeletedUserFormular from './DeletedUserFormular.vue'
import DeletedUserFormular from './DeletedUserFormular'
import { deleteUser } from '../graphql/deleteUser'
import { unDeleteUser } from '../graphql/unDeleteUser'
import { toastErrorSpy } from '../../test/testSetup'

View File

@ -1,5 +1,5 @@
import { mount } from '@vue/test-utils'
import EditCreationFormular from './EditCreationFormular.vue'
import EditCreationFormular from './EditCreationFormular'
import { toastErrorSpy, toastSuccessSpy } from '../../test/testSetup'
const localVue = global.localVue

View File

@ -1,5 +1,5 @@
import { mount } from '@vue/test-utils'
import FigureQrCode from './FigureQrCode.vue'
import FigureQrCode from './FigureQrCode'
const localVue = global.localVue

View File

@ -1,5 +1,5 @@
import { mount } from '@vue/test-utils'
import NavBar from './NavBar.vue'
import NavBar from './NavBar'
const localVue = global.localVue
@ -68,14 +68,11 @@ describe('NavBar', () => {
})
describe('wallet', () => {
const windowLocationMock = jest.fn()
const windowLocation = window.location
beforeEach(async () => {
delete window.location
window.location = {
assign: windowLocationMock,
}
await wrapper.findAll('.nav-item').at(5).find('a').trigger('click')
window.location = ''
await wrapper.findAll('.nav-item').at(4).find('a').trigger('click')
})
afterEach(() => {
@ -83,8 +80,8 @@ describe('NavBar', () => {
window.location = windowLocation
})
it.skip('changes window location to wallet', () => {
expect(windowLocationMock()).toBe('valid-token')
it('changes window location to wallet', () => {
expect(window.location).toBe('http://localhost/authenticate?token=valid-token')
})
it('dispatches logout to store', () => {

View File

@ -1,5 +1,5 @@
import { mount } from '@vue/test-utils'
import Overlay from './Overlay.vue'
import Overlay from './Overlay'
const localVue = global.localVue

View File

@ -1,5 +1,5 @@
import { mount } from '@vue/test-utils'
import OpenCreationsTable from './OpenCreationsTable.vue'
import OpenCreationsTable from './OpenCreationsTable'
const localVue = global.localVue

View File

@ -117,9 +117,9 @@
<script>
import { toggleRowDetails } from '../../mixins/toggleRowDetails'
import RowDetails from '../RowDetails.vue'
import EditCreationFormular from '../EditCreationFormular.vue'
import ContributionMessagesList from '../ContributionMessages/ContributionMessagesList.vue'
import RowDetails from '../RowDetails'
import EditCreationFormular from '../EditCreationFormular'
import ContributionMessagesList from '../ContributionMessages/ContributionMessagesList'
const iconMap = {
IN_PROGRESS: 'question-square',

View File

@ -1,5 +1,5 @@
import { mount } from '@vue/test-utils'
import SearchUserTable from './SearchUserTable.vue'
import SearchUserTable from './SearchUserTable'
const localVue = global.localVue

View File

@ -53,7 +53,6 @@
<b-tab :title="$t('creation')" active :disabled="row.item.deletedAt !== null">
<creation-formular
v-if="!row.item.deletedAt"
type="singleCreation"
pagetype="singleCreation"
:creation="row.item.creation"
:item="row.item"
@ -92,12 +91,12 @@
</div>
</template>
<script>
import CreationFormular from '../CreationFormular.vue'
import ConfirmRegisterMailFormular from '../ConfirmRegisterMailFormular.vue'
import CreationTransactionList from '../CreationTransactionList.vue'
import TransactionLinkList from '../TransactionLinkList.vue'
import ChangeUserRoleFormular from '../ChangeUserRoleFormular.vue'
import DeletedUserFormular from '../DeletedUserFormular.vue'
import CreationFormular from '../CreationFormular'
import ConfirmRegisterMailFormular from '../ConfirmRegisterMailFormular'
import CreationTransactionList from '../CreationTransactionList'
import TransactionLinkList from '../TransactionLinkList'
import ChangeUserRoleFormular from '../ChangeUserRoleFormular'
import DeletedUserFormular from '../DeletedUserFormular'
export default {
name: 'SearchUserTable',

View File

@ -1,5 +1,5 @@
import { mount } from '@vue/test-utils'
import StatisticTable from './StatisticTable.vue'
import StatisticTable from './StatisticTable'
const localVue = global.localVue

View File

@ -1,5 +1,5 @@
import { mount } from '@vue/test-utils'
import TransactionLinkList from './TransactionLinkList.vue'
import TransactionLinkList from './TransactionLinkList'
import { listTransactionLinksAdmin } from '../graphql/listTransactionLinksAdmin.js'
import { toastErrorSpy } from '../../test/testSetup'
@ -9,8 +9,8 @@ const apolloQueryMock = jest.fn()
apolloQueryMock.mockResolvedValue({
data: {
listTransactionLinksAdmin: {
linkCount: 8,
linkList: [
count: 8,
links: [
{
amount: '19.99',
code: '62ef8236ace7217fbd066c5a',

View File

@ -42,8 +42,8 @@ export default {
},
})
.then((result) => {
this.rows = result.data.listTransactionLinksAdmin.linkCount
this.items = result.data.listTransactionLinksAdmin.linkList
this.rows = result.data.listTransactionLinksAdmin.count
this.items = result.data.listTransactionLinksAdmin.links
})
.catch((error) => {
this.toastError(error.message)

View File

@ -1,11 +0,0 @@
import gql from 'graphql-tag'
export const adminCreateContributions = gql`
mutation ($pendingCreations: [AdminCreateContributionArgs!]!) {
adminCreateContributions(pendingCreations: $pendingCreations) {
success
successfulContribution
failedContribution
}
}
`

View File

@ -1,13 +1,13 @@
import gql from 'graphql-tag'
export const listAllContributions = gql`
export const adminListAllContributions = gql`
query (
$currentPage: Int = 1
$pageSize: Int = 25
$order: Order = DESC
$statusFilter: [ContributionStatus!]
) {
listAllContributions(
adminListAllContributions(
currentPage: $currentPage
pageSize: $pageSize
order: $order
@ -28,6 +28,8 @@ export const listAllContributions = gql`
messagesCount
deniedAt
deniedBy
deletedAt
deletedBy
}
}
}

View File

@ -8,8 +8,8 @@ export const listTransactionLinksAdmin = gql`
userId: $userId
filters: { withRedeemed: true, withExpired: true, withDeleted: true }
) {
linkCount
linkList {
count
links {
id
amount
holdAvailableAmount

View File

@ -7,8 +7,8 @@
</template>
<script>
import NavBar from '@/components/NavBar.vue'
import ContentFooter from '@/components/ContentFooter.vue'
import NavBar from '@/components/NavBar'
import ContentFooter from '@/components/ContentFooter'
export default {
name: 'defaultLayout',
components: {

View File

@ -1,5 +1,5 @@
import Vue from 'vue'
import App from './App.vue'
import App from './App'
// without this async calls are not working
import 'regenerator-runtime'

View File

@ -1,5 +1,5 @@
import { mount } from '@vue/test-utils'
import CommunityStatistic from './CommunityStatistic.vue'
import CommunityStatistic from './CommunityStatistic'
import { communityStatistics } from '@/graphql/communityStatistics.js'
import { toastErrorSpy } from '../../test/testSetup'
import VueApollo from 'vue-apollo'

View File

@ -5,7 +5,7 @@
</template>
<script>
import { communityStatistics } from '@/graphql/communityStatistics.js'
import StatisticTable from '../components/Tables/StatisticTable.vue'
import StatisticTable from '../components/Tables/StatisticTable'
export default {
name: 'CommunityStatistic',

View File

@ -1,5 +1,5 @@
import { mount } from '@vue/test-utils'
import ContributionLinks from './ContributionLinks.vue'
import ContributionLinks from './ContributionLinks'
import { listContributionLinks } from '@/graphql/listContributionLinks.js'
import { toastErrorSpy } from '../../test/testSetup'

View File

@ -9,7 +9,7 @@
</template>
<script>
import { listContributionLinks } from '@/graphql/listContributionLinks.js'
import ContributionLink from '../components/ContributionLink/ContributionLink.vue'
import ContributionLink from '../components/ContributionLink/ContributionLink'
export default {
name: 'ContributionLinks',

View File

@ -1,8 +1,8 @@
import { mount } from '@vue/test-utils'
import CreationConfirm from './CreationConfirm.vue'
import CreationConfirm from './CreationConfirm'
import { adminDeleteContribution } from '../graphql/adminDeleteContribution'
import { denyContribution } from '../graphql/denyContribution'
import { listAllContributions } from '../graphql/listAllContributions'
import { adminListAllContributions } from '../graphql/adminListAllContributions'
import { confirmContribution } from '../graphql/confirmContribution'
import { toastErrorSpy, toastSuccessSpy } from '../../test/testSetup'
import VueApollo from 'vue-apollo'
@ -38,7 +38,7 @@ const mocks = {
const defaultData = () => {
return {
listAllContributions: {
adminListAllContributions: {
contributionCount: 2,
contributionList: [
{
@ -92,14 +92,14 @@ const defaultData = () => {
describe('CreationConfirm', () => {
let wrapper
const adminListAllContributionsMock = jest.fn()
const adminDeleteContributionMock = jest.fn()
const adminDenyContributionMock = jest.fn()
const confirmContributionMock = jest.fn()
mockClient.setRequestHandler(
listAllContributions,
jest
.fn()
adminListAllContributions,
adminListAllContributionsMock
.mockRejectedValueOnce({ message: 'Ouch!' })
.mockResolvedValue({ data: defaultData() }),
)
@ -331,78 +331,82 @@ describe('CreationConfirm', () => {
describe('filter tabs', () => {
describe('click tab "confirmed"', () => {
let refetchSpy
beforeEach(async () => {
jest.clearAllMocks()
refetchSpy = jest.spyOn(wrapper.vm.$apollo.queries.ListAllContributions, 'refetch')
await wrapper.find('a[data-test="confirmed"]').trigger('click')
})
it('has statusFilter set to ["CONFIRMED"]', () => {
expect(
wrapper.vm.$apollo.queries.ListAllContributions.observer.options.variables,
).toMatchObject({ statusFilter: ['CONFIRMED'] })
})
it('refetches contributions', () => {
expect(refetchSpy).toBeCalled()
it('refetches contributions with proper filter', () => {
expect(adminListAllContributionsMock).toBeCalledWith({
currentPage: 1,
order: 'DESC',
pageSize: 25,
statusFilter: ['CONFIRMED'],
})
})
describe('click tab "open"', () => {
beforeEach(async () => {
jest.clearAllMocks()
refetchSpy = jest.spyOn(wrapper.vm.$apollo.queries.ListAllContributions, 'refetch')
await wrapper.find('a[data-test="open"]').trigger('click')
})
it('has statusFilter set to ["IN_PROGRESS", "PENDING"]', () => {
expect(
wrapper.vm.$apollo.queries.ListAllContributions.observer.options.variables,
).toMatchObject({ statusFilter: ['IN_PROGRESS', 'PENDING'] })
})
it('refetches contributions', () => {
expect(refetchSpy).toBeCalled()
it('refetches contributions with proper filter', () => {
expect(adminListAllContributionsMock).toBeCalledWith({
currentPage: 1,
order: 'DESC',
pageSize: 25,
statusFilter: ['IN_PROGRESS', 'PENDING'],
})
})
})
describe('click tab "denied"', () => {
beforeEach(async () => {
jest.clearAllMocks()
refetchSpy = jest.spyOn(wrapper.vm.$apollo.queries.ListAllContributions, 'refetch')
await wrapper.find('a[data-test="denied"]').trigger('click')
})
it('has statusFilter set to ["DENIED"]', () => {
expect(
wrapper.vm.$apollo.queries.ListAllContributions.observer.options.variables,
).toMatchObject({ statusFilter: ['DENIED'] })
it('refetches contributions with proper filter', () => {
expect(adminListAllContributionsMock).toBeCalledWith({
currentPage: 1,
order: 'DESC',
pageSize: 25,
statusFilter: ['DENIED'],
})
})
})
describe('click tab "deleted"', () => {
beforeEach(async () => {
jest.clearAllMocks()
await wrapper.find('a[data-test="deleted"]').trigger('click')
})
it('refetches contributions', () => {
expect(refetchSpy).toBeCalled()
it('refetches contributions with proper filter', () => {
expect(adminListAllContributionsMock).toBeCalledWith({
currentPage: 1,
order: 'DESC',
pageSize: 25,
statusFilter: ['DELETED'],
})
})
})
describe('click tab "all"', () => {
beforeEach(async () => {
jest.clearAllMocks()
refetchSpy = jest.spyOn(wrapper.vm.$apollo.queries.ListAllContributions, 'refetch')
await wrapper.find('a[data-test="all"]').trigger('click')
})
it('has statusFilter set to ["IN_PROGRESS", "PENDING", "CONFIRMED", "DENIED", "DELETED"]', () => {
expect(
wrapper.vm.$apollo.queries.ListAllContributions.observer.options.variables,
).toMatchObject({
it('refetches contributions with proper filter', () => {
expect(adminListAllContributionsMock).toBeCalledWith({
currentPage: 1,
order: 'DESC',
pageSize: 25,
statusFilter: ['IN_PROGRESS', 'PENDING', 'CONFIRMED', 'DENIED', 'DELETED'],
})
})
it('refetches contributions', () => {
expect(refetchSpy).toBeCalled()
})
})
})
})
@ -412,10 +416,20 @@ describe('CreationConfirm', () => {
await wrapper.findComponent({ name: 'OpenCreationsTable' }).vm.$emit('update-state', 2)
})
it.skip('updates the status', () => {
it('updates the status', () => {
expect(wrapper.vm.items.find((obj) => obj.id === 2).messagesCount).toBe(1)
expect(wrapper.vm.items.find((obj) => obj.id === 2).state).toBe('IN_PROGRESS')
})
})
describe('unknown variant', () => {
beforeEach(async () => {
await wrapper.setData({ variant: 'unknown' })
})
it('has overlay icon "info"', () => {
expect(wrapper.vm.overlayIcon).toBe('info')
})
})
})
})

View File

@ -71,9 +71,9 @@
</div>
</template>
<script>
import Overlay from '../components/Overlay.vue'
import OpenCreationsTable from '../components/Tables/OpenCreationsTable.vue'
import { listAllContributions } from '../graphql/listAllContributions'
import Overlay from '../components/Overlay'
import OpenCreationsTable from '../components/Tables/OpenCreationsTable'
import { adminListAllContributions } from '../graphql/adminListAllContributions'
import { adminDeleteContribution } from '../graphql/adminDeleteContribution'
import { confirmContribution } from '../graphql/confirmContribution'
import { denyContribution } from '../graphql/denyContribution'
@ -173,15 +173,11 @@ export default {
this.items.find((obj) => obj.id === id).state = 'IN_PROGRESS'
},
},
watch: {
statusFilter() {
this.$apollo.queries.ListAllContributions.refetch()
},
},
computed: {
fields() {
return [
[
// open contributions
{ key: 'bookmark', label: this.$t('delete') },
{ key: 'deny', label: this.$t('deny') },
{ key: 'email', label: this.$t('e_mail') },
@ -207,6 +203,7 @@ export default {
{ key: 'confirm', label: this.$t('save') },
],
[
// confirmed contributions
{ key: 'firstName', label: this.$t('firstname') },
{ key: 'lastName', label: this.$t('lastname') },
{
@ -241,6 +238,7 @@ export default {
{ key: 'chatCreation', label: this.$t('chat') },
],
[
// denied contributions
{ key: 'reActive', label: 'reActive' },
{ key: 'firstName', label: this.$t('firstname') },
{ key: 'lastName', label: this.$t('lastname') },
@ -276,8 +274,45 @@ export default {
{ key: 'deniedBy', label: this.$t('mod') },
{ key: 'chatCreation', label: this.$t('chat') },
],
[],
[
// deleted contributions
{ key: 'reActive', label: 'reActive' },
{ key: 'firstName', label: this.$t('firstname') },
{ key: 'lastName', label: this.$t('lastname') },
{
key: 'amount',
label: this.$t('creation'),
formatter: (value) => {
return value + ' GDD'
},
},
{ key: 'memo', label: this.$t('text'), class: 'text-break' },
{
key: 'contributionDate',
label: this.$t('created'),
formatter: (value) => {
return this.$d(new Date(value), 'short')
},
},
{
key: 'createdAt',
label: this.$t('createdAt'),
formatter: (value) => {
return this.$d(new Date(value), 'short')
},
},
{
key: 'deletedAt',
label: this.$t('contributions.deleted'),
formatter: (value) => {
return this.$d(new Date(value), 'short')
},
},
{ key: 'deletedBy', label: this.$t('mod') },
{ key: 'chatCreation', label: this.$t('chat') },
],
[
// all contributions
{ key: 'state', label: 'state' },
{ key: 'firstName', label: this.$t('firstname') },
{ key: 'lastName', label: this.$t('lastname') },
@ -349,19 +384,19 @@ export default {
apollo: {
ListAllContributions: {
query() {
return listAllContributions
return adminListAllContributions
},
variables() {
// may be at some point we need a pagination here
return {
currentPage: this.currentPage,
pageSize: this.pageSize,
statusFilter: this.statusFilter,
}
},
update({ listAllContributions }) {
this.rows = listAllContributions.contributionCount
this.items = listAllContributions.contributionList
fetchPolicy: 'no-cache',
update({ adminListAllContributions }) {
this.rows = adminListAllContributions.contributionCount
this.items = adminListAllContributions.contributionList
},
error({ message }) {
this.toastError(message)

View File

@ -1,6 +1,6 @@
import { mount } from '@vue/test-utils'
import Overview from './Overview.vue'
import { listAllContributions } from '../graphql/listAllContributions'
import Overview from './Overview'
import { adminListAllContributions } from '../graphql/adminListAllContributions'
import VueApollo from 'vue-apollo'
import { createMockClient } from 'mock-apollo-client'
import { toastErrorSpy } from '../../test/testSetup'
@ -30,7 +30,7 @@ const mocks = {
const defaultData = () => {
return {
listAllContributions: {
adminListAllContributions: {
contributionCount: 2,
contributionList: [
{
@ -84,11 +84,11 @@ const defaultData = () => {
describe('Overview', () => {
let wrapper
const listAllContributionsMock = jest.fn()
const adminListAllContributionsMock = jest.fn()
mockClient.setRequestHandler(
listAllContributions,
listAllContributionsMock
adminListAllContributions,
adminListAllContributionsMock
.mockRejectedValueOnce({ message: 'Ouch!' })
.mockResolvedValue({ data: defaultData() }),
)
@ -109,8 +109,8 @@ describe('Overview', () => {
})
})
it('calls the listAllContributions query', () => {
expect(listAllContributionsMock).toBeCalledWith({
it('calls the adminListAllContributions query', () => {
expect(adminListAllContributionsMock).toBeCalledWith({
currentPage: 1,
order: 'DESC',
pageSize: 25,

View File

@ -31,7 +31,7 @@
</div>
</template>
<script>
import { listAllContributions } from '../graphql/listAllContributions'
import { adminListAllContributions } from '../graphql/adminListAllContributions'
export default {
name: 'overview',
@ -43,7 +43,7 @@ export default {
apollo: {
AllContributions: {
query() {
return listAllContributions
return adminListAllContributions
},
variables() {
// may be at some point we need a pagination here
@ -51,8 +51,8 @@ export default {
statusFilter: this.statusFilter,
}
},
update({ listAllContributions }) {
this.$store.commit('setOpenCreations', listAllContributions.contributionCount)
update({ adminListAllContributions }) {
this.$store.commit('setOpenCreations', adminListAllContributions.contributionCount)
},
error({ message }) {
this.toastError(message)

View File

@ -1,5 +1,5 @@
import { mount } from '@vue/test-utils'
import UserSearch from './UserSearch.vue'
import UserSearch from './UserSearch'
import { toastErrorSpy, toastSuccessSpy } from '../../test/testSetup'
const localVue = global.localVue

View File

@ -58,7 +58,7 @@
</div>
</template>
<script>
import SearchUserTable from '../components/Tables/SearchUserTable.vue'
import SearchUserTable from '../components/Tables/SearchUserTable'
import { searchUsers } from '../graphql/searchUsers'
import { creationMonths } from '../mixins/creationMonths'
@ -72,7 +72,6 @@ export default {
return {
showArrays: false,
searchResult: [],
massCreation: [],
criteria: '',
filters: {
byActivated: null,

View File

@ -24,9 +24,6 @@ export const mutations = {
moderator: (state, moderator) => {
state.moderator = moderator
},
setUserSelectedInMassCreation: (state, userSelectedInMassCreation) => {
state.userSelectedInMassCreation = userSelectedInMassCreation
},
}
export const actions = {

View File

@ -10,7 +10,6 @@ const {
resetOpenCreations,
setOpenCreations,
moderator,
setUserSelectedInMassCreation,
} = mutations
const { logout } = actions
@ -65,14 +64,6 @@ describe('Vuex store', () => {
expect(state.openCreations).toEqual(12)
})
})
describe('setUserSelectedInMassCreation', () => {
it('sets userSelectedInMassCreation to given value', () => {
const state = { userSelectedInMassCreation: [] }
setUserSelectedInMassCreation(state, [0, 1, 2])
expect(state.userSelectedInMassCreation).toEqual([0, 1, 2])
})
})
})
describe('actions', () => {

View File

@ -42,7 +42,6 @@ export enum RIGHTS {
DELETE_USER = 'DELETE_USER',
UNDELETE_USER = 'UNDELETE_USER',
ADMIN_CREATE_CONTRIBUTION = 'ADMIN_CREATE_CONTRIBUTION',
ADMIN_CREATE_CONTRIBUTIONS = 'ADMIN_CREATE_CONTRIBUTIONS',
ADMIN_UPDATE_CONTRIBUTION = 'ADMIN_UPDATE_CONTRIBUTION',
ADMIN_DELETE_CONTRIBUTION = 'ADMIN_DELETE_CONTRIBUTION',
LIST_UNCONFIRMED_CONTRIBUTIONS = 'LIST_UNCONFIRMED_CONTRIBUTIONS',

View File

@ -8,6 +8,7 @@ CONFIG.EMAIL_SMTP_URL = 'EMAIL_SMTP_URL'
CONFIG.EMAIL_SMTP_PORT = '1234'
CONFIG.EMAIL_USERNAME = 'user'
CONFIG.EMAIL_PASSWORD = 'pwd'
CONFIG.EMAIL_TLS = true
jest.mock('nodemailer', () => {
return {

View File

@ -106,7 +106,7 @@ describe('sendEmailVariants', () => {
'you have received a message from Bibi Bloxberg regarding your common good contribution “My contribution.”.',
)
expect(result.originalMessage.html).toContain(
'To view and reply to the message, go to the “Community” menu in your Gradido account and click on the “My contributions to the common good” tab!',
'To view and reply to the message, go to the “Creation” menu in your Gradido account and click on the “My contributions” tab!',
)
expect(result.originalMessage.html).toContain(
`Link to your account: <a href="${CONFIG.EMAIL_LINK_OVERVIEW}">${CONFIG.EMAIL_LINK_OVERVIEW}</a>`,
@ -424,7 +424,7 @@ describe('sendEmailVariants', () => {
'Your public good contribution “My contribution.” was rejected by Bibi Bloxberg.',
)
expect(result.originalMessage.html).toContain(
'To see your common good contributions and related messages, go to the “Community” menu in your Gradido account and click on the “My contributions to the common good” tab!',
'To see your common good contributions and related messages, go to the “Creation” menu in your Gradido account and click on the “My contributions” tab!',
)
expect(result.originalMessage.html).toContain(
`Link to your account: <a href="${CONFIG.EMAIL_LINK_OVERVIEW}">${CONFIG.EMAIL_LINK_OVERVIEW}</a>`,
@ -502,7 +502,7 @@ describe('sendEmailVariants', () => {
'Your public good contribution “My contribution.” was deleted by Bibi Bloxberg.',
)
expect(result.originalMessage.html).toContain(
'To see your common good contributions and related messages, go to the “Community” menu in your Gradido account and click on the “My contributions to the common good” tab!',
'To see your common good contributions and related messages, go to the “Creation” menu in your Gradido account and click on the “My contributions” tab!',
)
expect(result.originalMessage.html).toContain(
`Link to your account: <a href="${CONFIG.EMAIL_LINK_OVERVIEW}">${CONFIG.EMAIL_LINK_OVERVIEW}</a>`,

View File

@ -1,19 +0,0 @@
import { ObjectType, Field } from 'type-graphql'
@ObjectType()
export class AdminCreateContributions {
constructor() {
this.success = false
this.successfulContribution = []
this.failedContribution = []
}
@Field(() => Boolean)
success: boolean
@Field(() => [String])
successfulContribution: string[]
@Field(() => [String])
failedContribution: string[]
}

View File

@ -12,7 +12,6 @@ export class Contribution {
this.amount = contribution.amount
this.memo = contribution.memo
this.createdAt = contribution.createdAt
this.deletedAt = contribution.deletedAt
this.confirmedAt = contribution.confirmedAt
this.confirmedBy = contribution.confirmedBy
this.contributionDate = contribution.contributionDate
@ -20,6 +19,8 @@ export class Contribution {
this.messagesCount = contribution.messages ? contribution.messages.length : 0
this.deniedAt = contribution.deniedAt
this.deniedBy = contribution.deniedBy
this.deletedAt = contribution.deletedAt
this.deletedBy = contribution.deletedBy
}
@Field(() => Number)
@ -40,9 +41,6 @@ export class Contribution {
@Field(() => Date)
createdAt: Date
@Field(() => Date, { nullable: true })
deletedAt: Date | null
@Field(() => Date, { nullable: true })
confirmedAt: Date | null
@ -55,6 +53,12 @@ export class Contribution {
@Field(() => Number, { nullable: true })
deniedBy: number | null
@Field(() => Date, { nullable: true })
deletedAt: Date | null
@Field(() => Number, { nullable: true })
deletedBy: number | null
@Field(() => Date)
contributionDate: Date

View File

@ -61,8 +61,8 @@ export class TransactionLink {
@ObjectType()
export class TransactionLinkResult {
@Field(() => Int)
linkCount: number
count: number
@Field(() => [TransactionLink])
linkList: TransactionLink[]
links: TransactionLink[]
}

View File

@ -13,7 +13,6 @@ import {
denyContribution,
confirmContribution,
adminCreateContribution,
adminCreateContributions,
adminUpdateContribution,
adminDeleteContribution,
login,
@ -23,9 +22,13 @@ import {
import {
listAllContributions,
listContributions,
listUnconfirmedContributions,
adminListAllContributions,
} from '@/seeds/graphql/queries'
import { sendContributionConfirmedEmail } from '@/emails/sendEmailVariants'
import {
sendContributionConfirmedEmail,
sendContributionDeletedEmail,
sendContributionDeniedEmail,
} from '@/emails/sendEmailVariants'
import {
cleanDB,
resetToken,
@ -46,25 +49,12 @@ import { EventProtocolType } from '@/event/EventProtocolType'
import { logger, i18n as localization } from '@test/testSetup'
import { UserInputError } from 'apollo-server-express'
import { raeuberHotzenplotz } from '@/seeds/users/raeuber-hotzenplotz'
import { UnconfirmedContribution } from '../model/UnconfirmedContribution'
import { ContributionListResult } from '../model/Contribution'
import { ContributionStatus } from '../enum/ContributionStatus'
import { UnconfirmedContribution } from '@model/UnconfirmedContribution'
import { ContributionListResult } from '@model/Contribution'
import { ContributionStatus } from '@enum/ContributionStatus'
import { Order } from '@enum/Order'
// mock account activation email to avoid console spam
jest.mock('@/emails/sendEmailVariants', () => {
const originalModule = jest.requireActual('@/emails/sendEmailVariants')
return {
__esModule: true,
...originalModule,
// TODO: test the call of …
// sendAccountActivationEmail: jest.fn((a) => originalModule.sendAccountActivationEmail(a)),
sendContributionConfirmedEmail: jest.fn((a) =>
originalModule.sendContributionConfirmedEmail(a),
),
// TODO: test the call of …
// sendContributionRejectedEmail: jest.fn((a) => originalModule.sendContributionRejectedEmail(a)),
}
})
jest.mock('@/emails/sendEmailVariants')
let mutate: any, query: any, con: any
let testEnv: any
@ -831,6 +821,18 @@ describe('ContributionResolver', () => {
}),
)
})
it('calls sendContributionDeniedEmail', async () => {
expect(sendContributionDeniedEmail).toBeCalledWith({
firstName: 'Bibi',
lastName: 'Bloxberg',
email: 'bibi@bloxberg.de',
language: 'de',
senderFirstName: 'Peter',
senderLastName: 'Lustig',
contributionMemo: 'Test contribution to deny',
})
})
})
})
})
@ -879,6 +881,7 @@ describe('ContributionResolver', () => {
describe('other user sends a deleteContribution', () => {
beforeAll(async () => {
jest.clearAllMocks()
await mutate({
mutation: login,
variables: { email: 'peter@lustig.de', password: 'Aa12345_' },
@ -890,7 +893,6 @@ describe('ContributionResolver', () => {
})
it('returns an error', async () => {
jest.clearAllMocks()
const { errors: errorObjects }: { errors: [GraphQLError] } = await mutate({
mutation: deleteContribution,
variables: {
@ -913,6 +915,7 @@ describe('ContributionResolver', () => {
describe('User deletes own contribution', () => {
beforeAll(async () => {
jest.clearAllMocks()
await mutate({
mutation: login,
variables: { email: 'bibi@bloxberg.de', password: 'Aa12345_' },
@ -1656,21 +1659,6 @@ describe('ContributionResolver', () => {
})
})
describe('adminCreateContributions', () => {
it('returns an error', async () => {
await expect(
mutate({
mutation: adminCreateContributions,
variables: { pendingCreations: [variables] },
}),
).resolves.toEqual(
expect.objectContaining({
errors: [new GraphQLError('401 Unauthorized')],
}),
)
})
})
describe('adminUpdateContribution', () => {
it('returns an error', async () => {
await expect(
@ -1692,20 +1680,6 @@ describe('ContributionResolver', () => {
})
})
describe('listUnconfirmedContributions', () => {
it('returns an error', async () => {
await expect(
query({
query: listUnconfirmedContributions,
}),
).resolves.toEqual(
expect.objectContaining({
errors: [new GraphQLError('401 Unauthorized')],
}),
)
})
})
describe('adminDeleteContribution', () => {
it('returns an error', async () => {
await expect(
@ -1764,21 +1738,6 @@ describe('ContributionResolver', () => {
})
})
describe('adminCreateContributions', () => {
it('returns an error', async () => {
await expect(
mutate({
mutation: adminCreateContributions,
variables: { pendingCreations: [variables] },
}),
).resolves.toEqual(
expect.objectContaining({
errors: [new GraphQLError('401 Unauthorized')],
}),
)
})
})
describe('adminUpdateContribution', () => {
it('returns an error', async () => {
await expect(
@ -1800,20 +1759,6 @@ describe('ContributionResolver', () => {
})
})
describe('listUnconfirmedContributions', () => {
it('returns an error', async () => {
await expect(
query({
query: listUnconfirmedContributions,
}),
).resolves.toEqual(
expect.objectContaining({
errors: [new GraphQLError('401 Unauthorized')],
}),
)
})
})
describe('adminDeleteContribution', () => {
it('returns an error', async () => {
await expect(
@ -2124,59 +2069,13 @@ describe('ContributionResolver', () => {
})
})
describe('adminCreateContributions', () => {
describe('adminUpdateContribution', () => {
// at this point we have this data in DB:
// bibi@bloxberg.de: [1000, 1000, 800]
// peter@lustig.de: [1000, 600, 1000]
// stephen@hawking.uk: [1000, 1000, 1000] - deleted
// garrick@ollivander.com: [1000, 1000, 1000] - not activated
const massCreationVariables = [
'bibi@bloxberg.de',
'peter@lustig.de',
'stephen@hawking.uk',
'garrick@ollivander.com',
'bob@baumeister.de',
].map((email) => {
return {
email,
amount: new Decimal(500),
memo: 'Grundeinkommen',
creationDate: contributionDateFormatter(new Date()),
}
})
it('returns success, two successful creation and three failed creations', async () => {
await expect(
mutate({
mutation: adminCreateContributions,
variables: { pendingCreations: massCreationVariables },
}),
).resolves.toEqual(
expect.objectContaining({
data: {
adminCreateContributions: {
success: true,
successfulContribution: ['bibi@bloxberg.de', 'peter@lustig.de'],
failedContribution: [
'stephen@hawking.uk',
'garrick@ollivander.com',
'bob@baumeister.de',
],
},
},
}),
)
})
})
describe('adminUpdateContribution', () => {
// at this I expect to have this data in DB:
// bibi@bloxberg.de: [1000, 1000, 300]
// peter@lustig.de: [1000, 600, 500]
// stephen@hawking.uk: [1000, 1000, 1000] - deleted
// garrick@ollivander.com: [1000, 1000, 1000] - not activated
describe('user for creation to update does not exist', () => {
it('throws an error', async () => {
jest.clearAllMocks()
@ -2391,7 +2290,7 @@ describe('ContributionResolver', () => {
date: expect.any(String),
memo: 'Das war leider zu Viel!',
amount: '200',
creation: ['1000', '800', '500'],
creation: ['1000', '800', '1000'],
},
},
}),
@ -2411,100 +2310,6 @@ describe('ContributionResolver', () => {
})
})
describe('listUnconfirmedContributions', () => {
it('returns four pending creations', async () => {
await expect(
query({
query: listUnconfirmedContributions,
}),
).resolves.toEqual(
expect.objectContaining({
data: {
listUnconfirmedContributions: expect.arrayContaining([
expect.objectContaining({
id: expect.any(Number),
firstName: 'Peter',
lastName: 'Lustig',
email: 'peter@lustig.de',
date: expect.any(String),
memo: 'Das war leider zu Viel!',
amount: '200',
moderator: admin.id,
creation: ['1000', '800', '500'],
}),
expect.objectContaining({
id: expect.any(Number),
firstName: 'Peter',
lastName: 'Lustig',
email: 'peter@lustig.de',
date: expect.any(String),
memo: 'Grundeinkommen',
amount: '500',
moderator: admin.id,
creation: ['1000', '800', '500'],
}),
expect.not.objectContaining({
id: expect.any(Number),
firstName: 'Bibi',
lastName: 'Bloxberg',
email: 'bibi@bloxberg.de',
date: expect.any(String),
memo: 'Test contribution to delete',
amount: '100',
moderator: null,
creation: ['1000', '1000', '90'],
}),
expect.objectContaining({
id: expect.any(Number),
firstName: 'Bibi',
lastName: 'Bloxberg',
email: 'bibi@bloxberg.de',
date: expect.any(String),
memo: 'Test PENDING contribution update',
amount: '10',
moderator: null,
creation: ['1000', '1000', '90'],
}),
expect.objectContaining({
id: expect.any(Number),
firstName: 'Bibi',
lastName: 'Bloxberg',
email: 'bibi@bloxberg.de',
date: expect.any(String),
memo: 'Test IN_PROGRESS contribution',
amount: '100',
moderator: null,
creation: ['1000', '1000', '90'],
}),
expect.objectContaining({
id: expect.any(Number),
firstName: 'Bibi',
lastName: 'Bloxberg',
email: 'bibi@bloxberg.de',
date: expect.any(String),
memo: 'Grundeinkommen',
amount: '500',
moderator: admin.id,
creation: ['1000', '1000', '90'],
}),
expect.objectContaining({
id: expect.any(Number),
firstName: 'Bibi',
lastName: 'Bloxberg',
email: 'bibi@bloxberg.de',
date: expect.any(String),
memo: 'Aktives Grundeinkommen',
amount: '200',
moderator: admin.id,
creation: ['1000', '1000', '90'],
}),
]),
},
}),
)
})
})
describe('adminDeleteContribution', () => {
describe('creation id does not exist', () => {
it('throws an error', async () => {
@ -2589,6 +2394,18 @@ describe('ContributionResolver', () => {
}),
)
})
it('calls sendContributionDeletedEmail', async () => {
expect(sendContributionDeletedEmail).toBeCalledWith({
firstName: 'Peter',
lastName: 'Lustig',
email: 'peter@lustig.de',
language: 'de',
senderFirstName: 'Peter',
senderLastName: 'Lustig',
contributionMemo: 'Das war leider zu Viel!',
})
})
})
describe('creation already confirmed', () => {
@ -2847,4 +2664,275 @@ describe('ContributionResolver', () => {
})
})
})
describe('adminListAllContribution', () => {
describe('unauthenticated', () => {
it('returns an error', async () => {
await expect(
query({
query: adminListAllContributions,
}),
).resolves.toEqual(
expect.objectContaining({
errors: [new GraphQLError('401 Unauthorized')],
}),
)
})
})
describe('authenticated as user', () => {
beforeAll(async () => {
await mutate({
mutation: login,
variables: { email: 'bibi@bloxberg.de', password: 'Aa12345_' },
})
})
afterAll(() => {
resetToken()
})
it('returns an error', async () => {
await expect(
query({
query: adminListAllContributions,
}),
).resolves.toEqual(
expect.objectContaining({
errors: [new GraphQLError('401 Unauthorized')],
}),
)
})
})
describe('authenticated as admin', () => {
beforeAll(async () => {
await mutate({
mutation: login,
variables: { email: 'peter@lustig.de', password: 'Aa12345_' },
})
})
afterAll(() => {
resetToken()
})
it('returns 17 creations in total', async () => {
const {
data: { adminListAllContributions: contributionListObject },
}: { data: { adminListAllContributions: ContributionListResult } } = await query({
query: adminListAllContributions,
})
expect(contributionListObject.contributionList).toHaveLength(17)
expect(contributionListObject).toMatchObject({
contributionCount: 17,
contributionList: expect.arrayContaining([
expect.objectContaining({
amount: expect.decimalEqual(50),
firstName: 'Bibi',
id: expect.any(Number),
lastName: 'Bloxberg',
memo: 'Herzlich Willkommen bei Gradido liebe Bibi!',
messagesCount: 0,
state: 'CONFIRMED',
}),
expect.objectContaining({
amount: expect.decimalEqual(50),
firstName: 'Bibi',
id: expect.any(Number),
lastName: 'Bloxberg',
memo: 'Herzlich Willkommen bei Gradido liebe Bibi!',
messagesCount: 0,
state: 'CONFIRMED',
}),
expect.objectContaining({
amount: expect.decimalEqual(450),
firstName: 'Bibi',
id: expect.any(Number),
lastName: 'Bloxberg',
memo: 'Herzlich Willkommen bei Gradido liebe Bibi!',
messagesCount: 0,
state: 'CONFIRMED',
}),
expect.objectContaining({
amount: expect.decimalEqual(100),
firstName: 'Bob',
id: expect.any(Number),
lastName: 'der Baumeister',
memo: 'Confirmed Contribution',
messagesCount: 0,
state: 'CONFIRMED',
}),
expect.objectContaining({
amount: expect.decimalEqual(400),
firstName: 'Peter',
id: expect.any(Number),
lastName: 'Lustig',
memo: 'Herzlich Willkommen bei Gradido!',
messagesCount: 0,
state: 'PENDING',
}),
expect.objectContaining({
amount: expect.decimalEqual(100),
firstName: 'Peter',
id: expect.any(Number),
lastName: 'Lustig',
memo: 'Test env contribution',
messagesCount: 0,
state: 'PENDING',
}),
expect.objectContaining({
amount: expect.decimalEqual(200),
firstName: 'Bibi',
id: expect.any(Number),
lastName: 'Bloxberg',
memo: 'Aktives Grundeinkommen',
messagesCount: 0,
state: 'PENDING',
}),
expect.objectContaining({
amount: expect.decimalEqual(10),
firstName: 'Bibi',
id: expect.any(Number),
lastName: 'Bloxberg',
memo: 'Test PENDING contribution update',
messagesCount: 0,
state: 'PENDING',
}),
expect.objectContaining({
amount: expect.decimalEqual(200),
firstName: 'Peter',
id: expect.any(Number),
lastName: 'Lustig',
memo: 'Das war leider zu Viel!',
messagesCount: 0,
state: 'DELETED',
}),
expect.objectContaining({
amount: expect.decimalEqual(166),
firstName: 'Räuber',
id: expect.any(Number),
lastName: 'Hotzenplotz',
memo: 'Whatever contribution',
messagesCount: 0,
state: 'DELETED',
}),
expect.objectContaining({
amount: expect.decimalEqual(166),
firstName: 'Räuber',
id: expect.any(Number),
lastName: 'Hotzenplotz',
memo: 'Whatever contribution',
messagesCount: 0,
state: 'DENIED',
}),
expect.objectContaining({
amount: expect.decimalEqual(166),
firstName: 'Räuber',
id: expect.any(Number),
lastName: 'Hotzenplotz',
memo: 'Whatever contribution',
messagesCount: 0,
state: 'CONFIRMED',
}),
expect.objectContaining({
amount: expect.decimalEqual(100),
firstName: 'Bibi',
id: expect.any(Number),
lastName: 'Bloxberg',
memo: 'Test IN_PROGRESS contribution',
messagesCount: 0,
state: 'IN_PROGRESS',
}),
expect.objectContaining({
amount: expect.decimalEqual(100),
firstName: 'Bibi',
id: expect.any(Number),
lastName: 'Bloxberg',
memo: 'Test contribution to confirm',
messagesCount: 0,
state: 'CONFIRMED',
}),
expect.objectContaining({
amount: expect.decimalEqual(100),
firstName: 'Bibi',
id: expect.any(Number),
lastName: 'Bloxberg',
memo: 'Test contribution to deny',
messagesCount: 0,
state: 'DENIED',
}),
expect.objectContaining({
amount: expect.decimalEqual(100),
firstName: 'Bibi',
id: expect.any(Number),
lastName: 'Bloxberg',
memo: 'Test contribution to delete',
messagesCount: 0,
state: 'DELETED',
}),
expect.objectContaining({
amount: expect.decimalEqual(1000),
firstName: 'Bibi',
id: expect.any(Number),
lastName: 'Bloxberg',
memo: 'Herzlich Willkommen bei Gradido!',
messagesCount: 0,
state: 'CONFIRMED',
}),
]),
})
})
it('returns two pending creations with page size set to 2', async () => {
const {
data: { adminListAllContributions: contributionListObject },
}: { data: { adminListAllContributions: ContributionListResult } } = await query({
query: adminListAllContributions,
variables: {
currentPage: 1,
pageSize: 2,
order: Order.DESC,
statusFilter: ['PENDING'],
},
})
expect(contributionListObject.contributionList).toHaveLength(2)
expect(contributionListObject).toMatchObject({
contributionCount: 4,
contributionList: expect.arrayContaining([
expect.objectContaining({
amount: '400',
firstName: 'Peter',
id: expect.any(Number),
lastName: 'Lustig',
memo: 'Herzlich Willkommen bei Gradido!',
messagesCount: 0,
state: 'PENDING',
}),
expect.objectContaining({
amount: '100',
firstName: 'Peter',
id: expect.any(Number),
lastName: 'Lustig',
memo: 'Test env contribution',
messagesCount: 0,
state: 'PENDING',
}),
expect.not.objectContaining({
state: 'DENIED',
}),
expect.not.objectContaining({
state: 'DELETED',
}),
expect.not.objectContaining({
state: 'CONFIRMED',
}),
expect.not.objectContaining({
state: 'IN_PROGRESS',
}),
]),
})
})
})
})
})

View File

@ -1,6 +1,6 @@
import Decimal from 'decimal.js-light'
import { Arg, Args, Authorized, Ctx, Int, Mutation, Query, Resolver } from 'type-graphql'
import { FindOperator, IsNull, In, getConnection } from '@dbTools/typeorm'
import { FindOperator, IsNull, getConnection } from '@dbTools/typeorm'
import { Contribution as DbContribution } from '@entity/Contribution'
import { ContributionMessage } from '@entity/ContributionMessage'
@ -8,7 +8,6 @@ import { UserContact } from '@entity/UserContact'
import { User as DbUser } from '@entity/User'
import { Transaction as DbTransaction } from '@entity/Transaction'
import { AdminCreateContributions } from '@model/AdminCreateContributions'
import { AdminUpdateContribution } from '@model/AdminUpdateContribution'
import { Contribution, ContributionListResult } from '@model/Contribution'
import { Decay } from '@model/Decay'
@ -30,12 +29,11 @@ import { backendLogger as logger } from '@/server/logger'
import {
getCreationDates,
getUserCreation,
getUserCreations,
validateContribution,
updateCreations,
isValidDateString,
} from './util/creations'
import { MEMO_MAX_CHARS, MEMO_MIN_CHARS, FULL_CREATION_AVAILABLE } from './const/const'
import { MEMO_MAX_CHARS, MEMO_MIN_CHARS } from './const/const'
import {
EVENT_CONTRIBUTION_CREATE,
EVENT_CONTRIBUTION_DELETE,
@ -56,6 +54,7 @@ import { TRANSACTIONS_LOCK } from '@/util/TRANSACTIONS_LOCK'
import LogError from '@/server/LogError'
import { getLastTransaction } from './util/getLastTransaction'
import { findContributions } from './util/findContributions'
@Resolver()
export class ContributionResolver {
@ -168,25 +167,14 @@ export class ContributionResolver {
@Arg('statusFilter', () => [ContributionStatus], { nullable: true })
statusFilter?: ContributionStatus[],
): Promise<ContributionListResult> {
const where: {
contributionStatus?: FindOperator<string> | null
} = {}
const [dbContributions, count] = await findContributions(
order,
currentPage,
pageSize,
false,
statusFilter,
)
if (statusFilter && statusFilter.length) {
where.contributionStatus = In(statusFilter)
}
const [dbContributions, count] = await getConnection()
.createQueryBuilder()
.select('c')
.from(DbContribution, 'c')
.innerJoinAndSelect('c.user', 'u')
.leftJoinAndSelect('c.messages', 'm')
.where(where)
.orderBy('c.createdAt', order)
.limit(pageSize)
.offset((currentPage - 1) * pageSize)
.getManyAndCount()
return new ContributionListResult(
count,
dbContributions.map((contribution) => new Contribution(contribution, contribution.user)),
@ -329,33 +317,6 @@ export class ContributionResolver {
return getUserCreation(emailContact.userId, clientTimezoneOffset)
}
@Authorized([RIGHTS.ADMIN_CREATE_CONTRIBUTIONS])
@Mutation(() => AdminCreateContributions)
async adminCreateContributions(
@Arg('pendingCreations', () => [AdminCreateContributionArgs])
contributions: AdminCreateContributionArgs[],
@Ctx() context: Context,
): Promise<AdminCreateContributions> {
let success = false
const successfulContribution: string[] = []
const failedContribution: string[] = []
for (const contribution of contributions) {
await this.adminCreateContribution(contribution, context)
.then(() => {
successfulContribution.push(contribution.email)
success = true
})
.catch(() => {
failedContribution.push(contribution.email)
})
}
return {
success,
successfulContribution,
failedContribution,
}
}
@Authorized([RIGHTS.ADMIN_UPDATE_CONTRIBUTION])
@Mutation(() => AdminUpdateContribution)
async adminUpdateContribution(
@ -430,40 +391,25 @@ export class ContributionResolver {
}
@Authorized([RIGHTS.LIST_UNCONFIRMED_CONTRIBUTIONS])
@Query(() => [UnconfirmedContribution])
async listUnconfirmedContributions(@Ctx() context: Context): Promise<UnconfirmedContribution[]> {
const clientTimezoneOffset = getClientTimezoneOffset(context)
const contributions = await getConnection()
.createQueryBuilder()
.select('c')
.from(DbContribution, 'c')
.leftJoinAndSelect('c.messages', 'm')
.where({ confirmedAt: IsNull() })
.andWhere({ deniedAt: IsNull() })
.getMany()
@Query(() => ContributionListResult) // [UnconfirmedContribution]
async adminListAllContributions(
@Args()
{ currentPage = 1, pageSize = 3, order = Order.DESC }: Paginated,
@Arg('statusFilter', () => [ContributionStatus], { nullable: true })
statusFilter?: ContributionStatus[],
): Promise<ContributionListResult> {
const [dbContributions, count] = await findContributions(
order,
currentPage,
pageSize,
true,
statusFilter,
)
if (contributions.length === 0) {
return []
}
const userIds = contributions.map((p) => p.userId)
const userCreations = await getUserCreations(userIds, clientTimezoneOffset)
const users = await DbUser.find({
where: { id: In(userIds) },
withDeleted: true,
relations: ['emailContact'],
})
return contributions.map((contribution) => {
const user = users.find((u) => u.id === contribution.userId)
const creation = userCreations.find((c) => c.id === contribution.userId)
return new UnconfirmedContribution(
contribution,
user,
creation ? creation.creations : FULL_CREATION_AVAILABLE,
)
})
return new ContributionListResult(
count,
dbContributions.map((contribution) => new Contribution(contribution, contribution.user)),
)
}
@Authorized([RIGHTS.ADMIN_DELETE_CONTRIBUTION])

View File

@ -600,6 +600,26 @@ describe('TransactionLinkResolver', () => {
resetToken()
})
describe('', () => {
it('throws error when user does not exists', async () => {
jest.clearAllMocks()
await expect(
mutate({
mutation: listTransactionLinksAdmin,
variables: {
userId: -1,
},
}),
).resolves.toMatchObject({
errors: [new GraphQLError('Could not find requested User')],
})
})
it('logs the error thrown', () => {
expect(logger.error).toBeCalledWith('Could not find requested User', -1)
})
})
describe('without any filters', () => {
it('finds 6 open transaction links and no deleted or redeemed', async () => {
await expect(
@ -611,8 +631,8 @@ describe('TransactionLinkResolver', () => {
expect.objectContaining({
data: {
listTransactionLinksAdmin: {
linkCount: 6,
linkList: expect.not.arrayContaining([
count: 6,
links: expect.not.arrayContaining([
expect.objectContaining({
memo: 'Leider wollte niemand meine Gradidos zum Neujahr haben :(',
createdAt: expect.any(String),
@ -647,8 +667,8 @@ describe('TransactionLinkResolver', () => {
expect.objectContaining({
data: {
listTransactionLinksAdmin: {
linkCount: 6,
linkList: expect.not.arrayContaining([
count: 6,
links: expect.not.arrayContaining([
expect.objectContaining({
memo: 'Leider wollte niemand meine Gradidos zum Neujahr haben :(',
createdAt: expect.any(String),
@ -681,8 +701,8 @@ describe('TransactionLinkResolver', () => {
expect.objectContaining({
data: {
listTransactionLinksAdmin: {
linkCount: 7,
linkList: expect.arrayContaining([
count: 7,
links: expect.arrayContaining([
expect.not.objectContaining({
memo: 'Leider wollte niemand meine Gradidos zum Neujahr haben :(',
createdAt: expect.any(String),
@ -715,8 +735,8 @@ describe('TransactionLinkResolver', () => {
expect.objectContaining({
data: {
listTransactionLinksAdmin: {
linkCount: 7,
linkList: expect.arrayContaining([
count: 7,
links: expect.arrayContaining([
expect.objectContaining({
memo: 'Leider wollte niemand meine Gradidos zum Neujahr haben :(',
createdAt: expect.any(String),
@ -752,8 +772,8 @@ describe('TransactionLinkResolver', () => {
expect.objectContaining({
data: {
listTransactionLinksAdmin: {
linkCount: 6,
linkList: expect.arrayContaining([
count: 6,
links: expect.arrayContaining([
expect.not.objectContaining({
memo: 'Leider wollte niemand meine Gradidos zum Neujahr haben :(',
createdAt: expect.any(String),

View File

@ -1,7 +1,7 @@
import { randomBytes } from 'crypto'
import Decimal from 'decimal.js-light'
import { getConnection, MoreThan, FindOperator } from '@dbTools/typeorm'
import { getConnection } from '@dbTools/typeorm'
import { TransactionLink as DbTransactionLink } from '@entity/TransactionLink'
import { User as DbUser } from '@entity/User'
@ -13,7 +13,6 @@ import { User } from '@model/User'
import { ContributionLink } from '@model/ContributionLink'
import { Decay } from '@model/Decay'
import { TransactionLink, TransactionLinkResult } from '@model/TransactionLink'
import { Order } from '@enum/Order'
import { ContributionType } from '@enum/ContributionType'
import { ContributionStatus } from '@enum/ContributionStatus'
import { TransactionTypeId } from '@enum/TransactionTypeId'
@ -35,6 +34,7 @@ import { TRANSACTIONS_LOCK } from '@/util/TRANSACTIONS_LOCK'
import LogError from '@/server/LogError'
import { getLastTransaction } from './util/getLastTransaction'
import transactionLinkList from './util/transactionLinkList'
// TODO: do not export, test it inside the resolver
export const transactionLinkCode = (date: Date): string => {
@ -145,30 +145,6 @@ export class TransactionLinkResolver {
}
}
@Authorized([RIGHTS.LIST_TRANSACTION_LINKS])
@Query(() => [TransactionLink])
async listTransactionLinks(
@Args()
{ currentPage = 1, pageSize = 5, order = Order.DESC }: Paginated,
@Ctx() context: Context,
): Promise<TransactionLink[]> {
const user = getUser(context)
// const now = new Date()
const transactionLinks = await DbTransactionLink.find({
where: {
userId: user.id,
redeemedBy: null,
// validUntil: MoreThan(now),
},
order: {
createdAt: order,
},
skip: (currentPage - 1) * pageSize,
take: pageSize,
})
return transactionLinks.map((tl) => new TransactionLink(tl, new User(user)))
}
@Authorized([RIGHTS.REDEEM_TRANSACTION_LINK])
@Mutation(() => Boolean)
async redeemTransactionLink(
@ -342,43 +318,38 @@ export class TransactionLinkResolver {
}
}
@Authorized([RIGHTS.LIST_TRANSACTION_LINKS])
@Query(() => TransactionLinkResult)
async listTransactionLinks(
@Args()
paginated: Paginated,
@Ctx() context: Context,
): Promise<TransactionLinkResult> {
return transactionLinkList(
paginated,
{
withDeleted: false,
withExpired: true,
withRedeemed: false,
},
getUser(context),
)
}
@Authorized([RIGHTS.LIST_TRANSACTION_LINKS_ADMIN])
@Query(() => TransactionLinkResult)
async listTransactionLinksAdmin(
@Args()
{ currentPage = 1, pageSize = 5, order = Order.DESC }: Paginated,
paginated: Paginated,
@Arg('filters', () => TransactionLinkFilters, { nullable: true })
filters: TransactionLinkFilters,
filters: TransactionLinkFilters | null,
@Arg('userId', () => Int)
userId: number,
): Promise<TransactionLinkResult> {
const user = await DbUser.findOneOrFail({ id: userId })
const where: {
userId: number
redeemedBy?: number | null
validUntil?: FindOperator<Date> | null
} = {
userId,
redeemedBy: null,
validUntil: MoreThan(new Date()),
}
if (filters) {
if (filters.withRedeemed) delete where.redeemedBy
if (filters.withExpired) delete where.validUntil
}
const [transactionLinks, count] = await DbTransactionLink.findAndCount({
where,
withDeleted: filters ? filters.withDeleted : false,
order: {
createdAt: order,
},
skip: (currentPage - 1) * pageSize,
take: pageSize,
})
return {
linkCount: count,
linkList: transactionLinks.map((tl) => new TransactionLink(tl, new User(user))),
const user = await DbUser.findOne({ id: userId })
if (!user) {
throw new LogError('Could not find requested User', userId)
}
return transactionLinkList(paginated, filters, user)
}
}

View File

@ -0,0 +1,25 @@
import { ContributionStatus } from '@enum/ContributionStatus'
import { Order } from '@enum/Order'
import { Contribution as DbContribution } from '@entity/Contribution'
import { In } from '@dbTools/typeorm'
export const findContributions = async (
order: Order,
currentPage: number,
pageSize: number,
withDeleted: boolean,
statusFilter?: ContributionStatus[],
): Promise<[DbContribution[], number]> =>
DbContribution.findAndCount({
where: {
...(statusFilter && statusFilter.length && { contributionStatus: In(statusFilter) }),
},
withDeleted: withDeleted,
order: {
createdAt: order,
id: order,
},
relations: ['user'],
skip: (currentPage - 1) * pageSize,
take: pageSize,
})

View File

@ -0,0 +1,38 @@
import { MoreThan } from '@dbTools/typeorm'
import { TransactionLink as DbTransactionLink } from '@entity/TransactionLink'
import { User as DbUser } from '@entity/User'
import { Order } from '@enum/Order'
import Paginated from '@arg/Paginated'
import TransactionLinkFilters from '@arg/TransactionLinkFilters'
import { TransactionLink, TransactionLinkResult } from '@model/TransactionLink'
import { User } from '@/graphql/model/User'
export default async function transactionLinkList(
{ currentPage = 1, pageSize = 5, order = Order.DESC }: Paginated,
filters: TransactionLinkFilters | null,
user: DbUser,
): Promise<TransactionLinkResult> {
const { withDeleted, withExpired, withRedeemed } = filters || {
withDeleted: false,
withExpired: false,
withRedeemed: false,
}
const [transactionLinks, count] = await DbTransactionLink.findAndCount({
where: {
userId: user.id,
...(!withRedeemed && { redeemedBy: null }),
...(!withExpired && { validUntil: MoreThan(new Date()) }),
},
withDeleted,
order: {
createdAt: order,
},
skip: (currentPage - 1) * pageSize,
take: pageSize,
})
return {
count,
links: transactionLinks.map((tl) => new TransactionLink(tl, new User(user))),
}
}

View File

@ -17,7 +17,7 @@
"addedContributionMessage": {
"commonGoodContributionMessage": "du hast zu deinem Gemeinwohl-Beitrag „{contributionMemo}“ eine Nachricht von {senderFirstName} {senderLastName} erhalten.",
"subject": "Gradido: Nachricht zu deinem Gemeinwohl-Beitrag",
"toSeeAndAnswerMessage": "Um die Nachricht zu sehen und darauf zu antworten, gehe in deinem Gradido-Konto ins Menü „Gemeinschaft“ auf den Tab „Meine Beiträge zum Gemeinwohl“!"
"toSeeAndAnswerMessage": "Um die Nachricht zu sehen und darauf zu antworten, gehe in deinem Gradido-Konto ins Menü „Schöpfen“ auf den Tab „Meine Beiträge“!"
},
"contributionConfirmed": {
"commonGoodContributionConfirmed": "dein Gemeinwohl-Beitrag „{contributionMemo}“ wurde soeben von {senderFirstName} {senderLastName} bestätigt und in deinem Gradido-Konto gutgeschrieben.",
@ -26,12 +26,12 @@
"contributionDeleted": {
"commonGoodContributionDeleted": "dein Gemeinwohl-Beitrag „{contributionMemo}“ wurde von {senderFirstName} {senderLastName} gelöscht.",
"subject": "Gradido: Dein Gemeinwohl-Beitrag wurde gelöscht",
"toSeeContributionsAndMessages": "Um deine Gemeinwohl-Beiträge und dazugehörige Nachrichten zu sehen, gehe in deinem Gradido-Konto ins Menü „Gemeinschaft“ auf den Tab „Meine Beiträge zum Gemeinwohl“!"
"toSeeContributionsAndMessages": "Um deine Gemeinwohl-Beiträge und dazugehörige Nachrichten zu sehen, gehe in deinem Gradido-Konto ins Menü „Schöpfen“ auf den Tab „Meine Beiträge“!"
},
"contributionDenied": {
"commonGoodContributionDenied": "dein Gemeinwohl-Beitrag „{contributionMemo}“ wurde von {senderFirstName} {senderLastName} abgelehnt.",
"subject": "Gradido: Dein Gemeinwohl-Beitrag wurde abgelehnt",
"toSeeContributionsAndMessages": "Um deine Gemeinwohl-Beiträge und dazugehörige Nachrichten zu sehen, gehe in deinem Gradido-Konto ins Menü „Gemeinschaft“ auf den Tab „Meine Beiträge zum Gemeinwohl“!"
"toSeeContributionsAndMessages": "Um deine Gemeinwohl-Beiträge und dazugehörige Nachrichten zu sehen, gehe in deinem Gradido-Konto ins Menü „Schöpfen“ auf den Tab „Meine Beiträge“!"
},
"general": {
"amountGDD": "Betrag: {amountGDD} GDD",

View File

@ -17,7 +17,7 @@
"addedContributionMessage": {
"commonGoodContributionMessage": "you have received a message from {senderFirstName} {senderLastName} regarding your common good contribution “{contributionMemo}”.",
"subject": "Gradido: Message about your common good contribution",
"toSeeAndAnswerMessage": "To view and reply to the message, go to the “Community” menu in your Gradido account and click on the “My contributions to the common good” tab!"
"toSeeAndAnswerMessage": "To view and reply to the message, go to the “Creation” menu in your Gradido account and click on the “My contributions” tab!"
},
"contributionConfirmed": {
"commonGoodContributionConfirmed": "Your public good contribution “{contributionMemo}” has just been confirmed by {senderFirstName} {senderLastName} and credited to your Gradido account.",
@ -26,12 +26,12 @@
"contributionDeleted": {
"commonGoodContributionDeleted": "Your public good contribution “{contributionMemo}” was deleted by {senderFirstName} {senderLastName}.",
"subject": "Gradido: Your common good contribution was deleted",
"toSeeContributionsAndMessages": "To see your common good contributions and related messages, go to the “Community” menu in your Gradido account and click on the “My contributions to the common good” tab!"
"toSeeContributionsAndMessages": "To see your common good contributions and related messages, go to the “Creation” menu in your Gradido account and click on the “My contributions” tab!"
},
"contributionDenied": {
"commonGoodContributionDenied": "Your public good contribution “{contributionMemo}” was rejected by {senderFirstName} {senderLastName}.",
"subject": "Gradido: Your common good contribution was rejected",
"toSeeContributionsAndMessages": "To see your common good contributions and related messages, go to the “Community” menu in your Gradido account and click on the “My contributions to the common good” tab!"
"toSeeContributionsAndMessages": "To see your common good contributions and related messages, go to the “Creation” menu in your Gradido account and click on the “My contributions” tab!"
},
"general": {
"amountGDD": "Amount: {amountGDD} GDD",

View File

@ -126,16 +126,6 @@ export const unDeleteUser = gql`
}
`
export const adminCreateContributions = gql`
mutation ($pendingCreations: [AdminCreateContributionArgs!]!) {
adminCreateContributions(pendingCreations: $pendingCreations) {
success
successfulContribution
failedContribution
}
}
`
export const adminUpdateContribution = gql`
mutation ($id: Int!, $email: String!, $amount: Decimal!, $memo: String!, $creationDate: String!) {
adminUpdateContribution(

View File

@ -186,6 +186,40 @@ query ($currentPage: Int = 1, $pageSize: Int = 5, $order: Order = DESC, $statusF
contributionCount
contributionList {
id
firstName
lastName
amount
memo
createdAt
confirmedAt
confirmedBy
contributionDate
state
messagesCount
deniedAt
deniedBy
}
}
}
`
// from admin interface
export const adminListAllContributions = gql`
query (
$currentPage: Int = 1
$pageSize: Int = 25
$order: Order = DESC
$statusFilter: [ContributionStatus!]
) {
adminListAllContributions(
currentPage: $currentPage
pageSize: $pageSize
order: $order
statusFilter: $statusFilter
) {
contributionCount
contributionList {
id
firstName
lastName
amount
@ -198,24 +232,7 @@ query ($currentPage: Int = 1, $pageSize: Int = 5, $order: Order = DESC, $statusF
messagesCount
deniedAt
deniedBy
}
}
}
`
// from admin interface
export const listUnconfirmedContributions = gql`
query {
listUnconfirmedContributions {
id
firstName
lastName
email
amount
memo
date
moderator
creation
}
}
}
`
@ -233,8 +250,8 @@ export const listTransactionLinksAdmin = gql`
currentPage: $currentPage
pageSize: $pageSize
) {
linkCount
linkList {
count
links {
id
amount
holdAvailableAmount

View File

@ -23,6 +23,7 @@ export async function upgrade(queryFn: (query: string, values?: any[]) => Promis
export async function downgrade(queryFn: (query: string, values?: any[]) => Promise<Array<any>>) {
// write downgrade logic as parameter of queryFn
await queryFn('DELETE FROM `communities` WHERE `last_announced_at` IS NULL;')
await queryFn(
'ALTER TABLE `communities` MODIFY COLUMN `last_announced_at` datetime(3) NOT NULL AFTER `end_point`;',
)

View File

@ -57,10 +57,15 @@ EMAIL_CODE_REQUEST_TIME=10
WEBHOOK_ELOPAGE_SECRET=secret
# Federation
# if you set the value of FEDERATION_DHT_TOPIC, the DHT hyperswarm will start to announce and listen
# on an hash created from this topic
FEDERATION_DHT_CONFIG_VERSION=v2.2023-02-07
# if you set the value of FEDERATION_DHT_TOPIC, the DHT hyperswarm will start to announce and listen on an hash created from this topic
# FEDERATION_DHT_TOPIC=GRADIDO_HUB
# FEDERATION_DHT_SEED=64ebcb0e3ad547848fef4197c6e2332f
FEDERATION_COMMUNITY_URL=http://stage1.gradido.net
# the api port is the baseport, which will be added with the api-version, e.g. 1_0 = 5010
FEDERATION_COMMUNITY_API_PORT=5000
# database
DATABASE_CONFIG_VERSION=v1.2022-03-18

View File

@ -137,6 +137,9 @@ envsubst "$(env | sed -e 's/=.*//' -e 's/^/\$/g')" < $PROJECT_ROOT/frontend/.env
# Configure admin
envsubst "$(env | sed -e 's/=.*//' -e 's/^/\$/g')" < $PROJECT_ROOT/admin/.env.template > $PROJECT_ROOT/admin/.env
# Configure dht-node
envsubst "$(env | sed -e 's/=.*//' -e 's/^/\$/g')" < $PROJECT_ROOT/dht-node/.env.template > $PROJECT_ROOT/dht-node/.env
# create cronjob to delete yarn output in /tmp
# crontab -e
# hourly job: 0 * * * * find /tmp -name "yarn--*" -cmin +60 -exec rm -r {} \; > /dev/null

View File

@ -93,10 +93,12 @@ cp -f $PROJECT_ROOT/database/.env $PROJECT_ROOT/database/.env.bak
cp -f $PROJECT_ROOT/backend/.env $PROJECT_ROOT/backend/.env.bak
cp -f $PROJECT_ROOT/frontend/.env $PROJECT_ROOT/frontend/.env.bak
cp -f $PROJECT_ROOT/admin/.env $PROJECT_ROOT/admin/.env.bak
cp -f $PROJECT_ROOT/dht-node/.env $PROJECT_ROOT/dht-node/.env.bak
envsubst "$(env | sed -e 's/=.*//' -e 's/^/\$/g')" < $PROJECT_ROOT/database/.env.template > $PROJECT_ROOT/database/.env
envsubst "$(env | sed -e 's/=.*//' -e 's/^/\$/g')" < $PROJECT_ROOT/backend/.env.template > $PROJECT_ROOT/backend/.env
envsubst "$(env | sed -e 's/=.*//' -e 's/^/\$/g')" < $PROJECT_ROOT/frontend/.env.template > $PROJECT_ROOT/frontend/.env
envsubst "$(env | sed -e 's/=.*//' -e 's/^/\$/g')" < $PROJECT_ROOT/admin/.env.template > $PROJECT_ROOT/admin/.env
envsubst "$(env | sed -e 's/=.*//' -e 's/^/\$/g')" < $PROJECT_ROOT/dht-node/.env.template > $PROJECT_ROOT/dht-node/.env
# Install & build database
echo 'Updating database' >> $UPDATE_HTML
@ -152,6 +154,25 @@ pm2 delete gradido-admin
pm2 start --name gradido-admin "yarn --cwd $PROJECT_ROOT/admin start" -l $GRADIDO_LOG_PATH/pm2.admin.$TODAY.log --log-date-format 'YYYY-MM-DD HH:mm:ss.SSS'
pm2 save
# Install & build dht-node
echo 'Updating dht-node' >> $UPDATE_HTML
cd $PROJECT_ROOT/dht-node
# TODO maybe handle this differently?
unset NODE_ENV
yarn install
yarn build
# TODO maybe handle this differently?
export NODE_ENV=production
pm2 delete gradido-dht-node
if [ ! -z $FEDERATION_DHT_TOPIC ]; then
pm2 start --name gradido-dht-node "yarn --cwd $PROJECT_ROOT/dht-node start" -l $GRADIDO_LOG_PATH/pm2.dht-node.$TODAY.log --log-date-format 'YYYY-MM-DD HH:mm:ss.SSS'
else
echo "====================================================================="
echo "WARNING: FEDERATION_DHT_TOPIC not configured. DHT-Node not started..."
echo "====================================================================="
fi
pm2 save
# let nginx showing gradido
echo 'Configuring nginx to serve gradido again' >> $UPDATE_HTML
ln -s /etc/nginx/sites-available/gradido.conf /etc/nginx/sites-enabled/

View File

@ -11,9 +11,9 @@ TYPEORM_LOGGING_RELATIVE_PATH=typeorm.dht-node.log
# LOG_LEVEL=info
# Federation
# if you set the value of FEDERATION_DHT_TOPIC, the DHT hyperswarm will start to announce and listen
# on an hash created from this topic
# if you set the value of FEDERATION_DHT_TOPIC, the DHT hyperswarm will start to announce and listen on an hash created from this topic
FEDERATION_DHT_TOPIC=GRADIDO_HUB
# FEDERATION_DHT_SEED=64ebcb0e3ad547848fef4197c6e2332f
# FEDERATION_COMMUNITY_URL=http://localhost
# FEDERATION_COMMUNITY_API_PORT=5000
# FEDERATION_DHT_SEED=64ebcb0e3ad547848fef4197c6e2332f
FEDERATION_COMMUNITY_URL=http://localhost
# the api port is the dht baseport, which will be added with the supported api-versions, e.g. 1_0 = 5010
FEDERATION_COMMUNITY_API_PORT=5000

View File

@ -1,4 +1,4 @@
CONFIG_VERSION=$BACKEND_CONFIG_VERSION
CONFIG_VERSION=$FEDERATION_DHT_CONFIG_VERSION
# Database
DB_HOST=localhost

View File

@ -8,7 +8,7 @@
"pattern": "yyyy-MM-dd",
"layout":
{
"type": "pattern", "pattern": "%d{ISO8601} %c [%X{user}] [%f : %l] - %m"
"type": "pattern", "pattern": "%d{ISO8601} %p %c [%X{user}] [%f : %l] - %m"
},
"keepFileExt" : true,
"fileNameSep" : "_",
@ -21,7 +21,7 @@
"pattern": "yyyy-MM-dd",
"layout":
{
"type": "pattern", "pattern": "%d{ISO8601} %c [%X{user}] [%f : %l] - %m"
"type": "pattern", "pattern": "%d{ISO8601} %p %c [%X{user}] [%f : %l] - %m"
},
"keepFileExt" : true,
"fileNameSep" : "_",

View File

@ -31,8 +31,8 @@ export const startDHT = async (topic: string): Promise<void> => {
logger.info(`keyPairDHT: publicKey=${keyPair.publicKey.toString('hex')}`)
logger.debug(`keyPairDHT: secretKey=${keyPair.secretKey.toString('hex')}`)
const ownApiVersions = writeHomeCommunityEnries(keyPair.publicKey)
logger.debug(`ApiList: ${JSON.stringify(ownApiVersions)}`)
const ownApiVersions = await writeHomeCommunityEnries(keyPair.publicKey)
logger.info(`ApiList: ${JSON.stringify(ownApiVersions)}`)
const node = new DHT({ keyPair })

View File

@ -123,10 +123,6 @@ Zusätzlich wird als Parameter ein *creationDate* vom User mitgeliefert, das dem
nothing to do
#### + adminCreateContributions
Hier wird eine Liste von übergebenen Contributions über den internen Aufruf von *adminCreateContribution()* verarbeitet. Da dort eine Berücksichtigung des User-TimeOffsets notwendig ist, muss hier die UserTime entsprechen im Context weitergereicht werden.
#### - adminDeleteContribution
nothing to do

View File

@ -2,7 +2,7 @@ import { defineConfig } from 'cypress'
import { addCucumberPreprocessorPlugin } from '@badeball/cypress-cucumber-preprocessor'
import browserify from '@badeball/cypress-cucumber-preprocessor/browserify'
let resetPasswordLink: string
let emailLink: string
async function setupNodeEvents(
on: Cypress.PluginEvents,
@ -18,11 +18,11 @@ async function setupNodeEvents(
)
on('task', {
setResetPasswordLink: (val) => {
return (resetPasswordLink = val)
setEmailLink: (link: string) => {
return (emailLink = link)
},
getResetPasswordLink: () => {
return resetPasswordLink
getEmailLink: () => {
return emailLink
},
})

View File

@ -13,8 +13,8 @@ Feature: User Authentication - reset password
And the user navigates to the forgot password page
When the user enters the e-mail address "bibi@bloxberg.de"
And the user submits the e-mail form
Then the user receives an e-mail containing the password reset link
When the user opens the password reset link in the browser
Then the user receives an e-mail containing the "password reset" link
When the user opens the "password reset" link in the browser
And the user enters the password "12345Aa_"
And the user repeats the password "12345Aa_"
And the user submits the password form

View File

@ -2,12 +2,16 @@ Feature: User registration
As a user
I want to register to create an account
@skip
Scenario: Register successfully
Given the user navigates to page "/register"
When the user fills name and email "Regina" "Register" "regina@register.com"
And the user agrees to the privacy policy
And the user submits the registration form
Then the user can use a provided activation link
And the user can set a password "Aa12345_"
And the user can login with the credentials "regina@register.com" "Aa12345_"
Then the user receives an e-mail containing the "activation" link
When the user opens the "activation" link in the browser
And the user enters the password "12345Aa_"
And the user repeats the password "12345Aa_"
And the user submits the password form
And the user clicks the sign in button
Then the user submits the credentials "regina@register.com" "12345Aa_"
And the user is logged in with username "Regina Register"

View File

@ -4,7 +4,7 @@ export class RegistrationPage {
// selectors
firstnameInput = '#registerFirstname'
lastnameInput = '#registerLastname'
emailInput = '#Email-input-field'
emailInput = 'input[type=email]'
checkbox = '#registerCheckbox'
submitBtn = '[type=submit]'
@ -35,7 +35,7 @@ export class RegistrationPage {
cy.get(this.checkbox).click({ force: true })
}
submitRegistrationPage() {
submitRegistrationForm() {
cy.get(this.submitBtn).should('be.enabled')
cy.get(this.submitBtn).click()
}

View File

@ -2,19 +2,19 @@
export class ResetPasswordPage {
// selectors
newPasswordBlock = '#new-password-input-field'
newPasswordRepeatBlock = '#repeat-new-password-input-field'
newPasswordInput = '#new-password-input-field'
newPasswordRepeatInput = '#repeat-new-password-input-field'
resetPasswordBtn = 'button[type=submit]'
resetPasswordMessageBlock = '[data-test="reset-password-message"]'
signinBtn = '.btn.test-message-button'
enterNewPassword(password: string) {
cy.get(this.newPasswordBlock).find('input[type=password]').type(password)
cy.get(this.newPasswordInput).find('input[type=password]').type(password)
return this
}
repeatNewPassword(password: string) {
cy.get(this.newPasswordRepeatBlock)
cy.get(this.newPasswordRepeatInput)
.find('input[type=password]')
.type(password)
return this

View File

@ -5,41 +5,55 @@ import { UserEMailSite } from '../../e2e/models/UserEMailSite'
const userEMailSite = new UserEMailSite()
const resetPasswordPage = new ResetPasswordPage()
Then('the user receives an e-mail containing the password reset link', () => {
Then('the user receives an e-mail containing the {string} link', (linkName: string) => {
let emailSubject: string
let linkPattern: RegExp
switch (linkName) {
case 'activation':
emailSubject = 'Email Verification'
linkPattern = /\/checkEmail\/[0-9]+\d/
break
case 'password reset':
emailSubject = 'asswor'
linkPattern = /\/reset-password\/[0-9]+\d/
break
default:
throw new Error(`Error in "Then the user receives an e-mail containing the {string} link" step: incorrect linkname string "${linkName}"`)
}
cy.origin(
Cypress.env('mailserverURL'),
{ args: userEMailSite },
(userEMailSite) => {
const linkPattern = /\/reset-password\/[0-9]+\d/
cy.visit('/') // navigate to user's e-maile site (on fake mail server)
{ args: { emailSubject, linkPattern, userEMailSite } },
({ emailSubject, linkPattern, userEMailSite }) => {
cy.visit('/') // navigate to user's e-mail site (on fake mail server)
cy.get(userEMailSite.emailInbox).should('be.visible')
cy.get(userEMailSite.emailList)
.find('.email-item')
.filter(':contains(asswor)')
.filter(`:contains(${emailSubject})`)
.first()
.click()
cy.get(userEMailSite.emailMeta)
.find(userEMailSite.emailSubject)
.contains('asswor')
.contains(emailSubject)
cy.get('.email-content')
cy.get('.email-content', { timeout: 2000})
.find('.plain-text')
.contains(linkPattern)
.invoke('text')
.then((text) => {
const resetPasswordLink = text.match(linkPattern)[0]
cy.task('setResetPasswordLink', resetPasswordLink)
const emailLink = text.match(linkPattern)[0]
cy.task('setEmailLink', emailLink)
})
}
)
})
When('the user opens the password reset link in the browser', () => {
cy.task('getResetPasswordLink').then((passwordResetLink) => {
cy.visit(passwordResetLink)
When('the user opens the {string} link in the browser', (linkName: string) => {
cy.task('getEmailLink').then((emailLink) => {
cy.visit(emailLink)
})
cy.get(resetPasswordPage.newPasswordRepeatBlock).should('be.visible')
cy.get(resetPasswordPage.newPasswordInput).should('be.visible')
})

View File

@ -18,7 +18,7 @@ And('the user agrees to the privacy policy', () => {
})
And('the user submits the registration form', () => {
registrationPage.submitRegistrationPage()
registrationPage.submitRegistrationForm()
cy.get(registrationPage.RegistrationThanxHeadline).should('be.visible')
cy.get(registrationPage.RegistrationThanxText).should('be.visible')
})

View File

@ -22,7 +22,7 @@
"@cypress/browserify-preprocessor": "^3.0.2",
"@typescript-eslint/eslint-plugin": "^5.38.0",
"@typescript-eslint/parser": "^5.38.0",
"cypress": "^10.4.0",
"cypress": "^12.7.0",
"eslint": "^8.23.1",
"eslint-config-prettier": "^8.3.0",
"eslint-config-standard": "^16.0.3",

View File

@ -0,0 +1,103 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 26.5.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 64 64" style="enable-background:new 0 0 64 64;" xml:space="preserve">
<style type="text/css">
.st0{display:none;}
.st1{display:inline;fill:#72778F;}
.st2{font-family:'FontAwesome5Free-Solid';}
.st3{font-size:54.1523px;}
.st4{display:inline;enable-background:new ;}
.st5{fill:#72778F;}
.st6{font-size:56.8896px;}
.st7{font-size:51.2px;}
.st8{display:inline;}
.st9{enable-background:new ;}
.st10{clip-path:url(#SVGID_00000044144592529643807670000007729734690606357893_);}
</style>
<g id="Transaktionen" class="st0">
<text transform="matrix(1 0 0 1 5.4236 52.4902)" class="st1 st2 st3"></text>
</g>
<g id="mein_x5F_profil" class="st0">
<g class="st4">
<path class="st5" d="M56.7,51.31v4.64c0,2.96-2.4,5.35-5.35,5.35H12.11c-2.95,0-5.35-2.4-5.35-5.35v-4.64
c0-8.27,6.71-14.98,14.98-14.98h1.86c2.49,1.14,5.23,1.78,8.13,1.78s5.65-0.65,8.13-1.78h1.86C49.99,36.33,56.7,43.04,56.7,51.31z
M17.46,18.49c0-7.88,6.39-14.27,14.27-14.27S46,10.61,46,18.49s-6.39,14.27-14.27,14.27S17.46,26.37,17.46,18.49z"/>
</g>
</g>
<g id="Top_Stories" class="st0">
<text transform="matrix(1 0 0 1 0 54.8652)" class="st1 st2 st6"></text>
</g>
<g id="Senden" class="st0">
<text transform="matrix(1 0 0 1 4.882812e-04 50.6426)" class="st1 st2 st7"></text>
</g>
<g id="Home" class="st0">
<g id="Haus" transform="translate(-319.046 -300.603)" class="st8">
<path id="Pfad_9173" class="st5" d="M356.12,358.2v-15.2h-10.16v14.91c-0.37,0.12-0.75,0.21-1.13,0.26c-4.54,0-9.07,0.04-13.61,0
c-2.24-0.02-3.13-0.92-3.14-3.14c-0.03-5.84-0.03-11.69,0.03-17.53c0.02-0.72,0.32-1.41,0.83-1.92
c7.28-6.08,14.61-12.1,22.02-18.21c0.51,0.38,1.01,0.71,1.47,1.09c6.69,5.5,13.35,11.03,20.07,16.5c1.01,0.7,1.58,1.88,1.52,3.1
c-0.09,5.5-0.03,11-0.04,16.5c0,2.79-0.78,3.6-3.5,3.61C365.8,358.21,361.14,358.2,356.12,358.2z"/>
<path id="Pfad_9174" class="st5" d="M351,313.85c-8.82,7.36-17.46,14.59-26.15,21.76c-0.76,0.64-2.31,1.49-2.69,1.2
c-1.26-1.03-2.31-2.29-3.09-3.72c-0.19-0.32,0.7-1.5,1.32-2.02c8.63-7.25,17.29-14.48,25.97-21.67c0.47-0.4,0.94-0.8,1.43-1.18
c1.88-1.68,4.73-1.64,6.58,0.08c3.02,2.47,6,4.99,9.43,7.85c0-2.56,0.05-4.71-0.02-6.85c-0.05-1.55,0.49-2.29,2.14-2.21
c1.92,0.1,3.84,0.1,5.76,0c1.68-0.09,2.33,0.51,2.3,2.24c-0.08,4.54-0.1,9.08,0.03,13.61c0.08,1.03,0.54,2,1.28,2.73
c2.16,2.01,4.48,3.84,6.79,5.7c0.87,0.45,1.21,1.52,0.76,2.39c-0.11,0.21-0.26,0.4-0.44,0.55c-2.7,3.45-2.67,3.48-5.96,0.73
l-23.43-19.55C352.41,314.97,351.76,314.47,351,313.85z"/>
</g>
</g>
<g id="Community">
<g class="st9">
<path class="st5" d="M9.7,42.88H3.11c-1.77,0-3.2-1.43-3.2-3.2v-3.2c0-3.53,2.87-6.4,6.4-6.4h6.4c1.76,0,3.35,0.71,4.51,1.86
C13.19,34.15,10.33,38.14,9.7,42.88z M3.11,20.48c0-3.53,2.87-6.4,6.4-6.4s6.4,2.87,6.4,6.4s-2.87,6.4-6.4,6.4
S3.11,24.01,3.11,20.48z M51.11,44.8v2.88c0,2.65-2.15,4.8-4.8,4.8h-28.8c-2.65,0-4.8-2.15-4.8-4.8V44.8
c0-6.36,5.16-11.52,11.52-11.52h0.83c2.09,1,4.39,1.6,6.85,1.6c2.46,0,4.77-0.6,6.85-1.6h0.83C45.95,33.28,51.11,38.44,51.11,44.8
z M20.71,18.88c0-6.19,5.01-11.2,11.2-11.2c6.19,0,11.2,5.01,11.2,11.2s-5.01,11.2-11.2,11.2C25.72,30.08,20.71,25.07,20.71,18.88
z M63.91,36.48v3.2c0,1.77-1.43,3.2-3.2,3.2h-6.6c-0.62-4.74-3.48-8.73-7.51-10.94c1.16-1.15,2.75-1.86,4.51-1.86h6.4
C61.04,30.08,63.91,32.95,63.91,36.48z M47.91,20.48c0-3.53,2.87-6.4,6.4-6.4c3.53,0,6.4,2.87,6.4,6.4s-2.87,6.4-6.4,6.4
C50.78,26.88,47.91,24.01,47.91,20.48z"/>
</g>
</g>
<g id="Adressen" class="st0">
<g class="st8">
<defs>
<rect id="SVGID_1_" x="3.98" y="4.04" width="55.34" height="55.46"/>
</defs>
<clipPath id="SVGID_00000137852128488145803360000002351992332542316180_">
<use xlink:href="#SVGID_1_" style="overflow:visible;"/>
</clipPath>
<g id="Gruppe_4997" style="clip-path:url(#SVGID_00000137852128488145803360000002351992332542316180_);">
<path id="Pfad_9157" class="st5" d="M21.8,59.5V4.04h34.22c1.64-0.18,3.12,1,3.3,2.65c0.02,0.21,0.02,0.43,0,0.64
c0,16.29,0,32.58,0,48.88c0.17,1.65-1.02,3.12-2.67,3.29c-0.21,0.02-0.42,0.02-0.63,0H21.8 M25.72,31.78
c0.03,8.19,6.69,14.8,14.88,14.77c8.19-0.03,14.8-6.69,14.77-14.88c-0.03-8.16-6.65-14.77-14.82-14.77
C32.35,16.91,25.71,23.57,25.72,31.78C25.72,31.78,25.72,31.78,25.72,31.78"/>
<path id="Pfad_9158" class="st5" d="M9.92,54.54c0.69,0,1.33,0,1.97,0c2.19,0,3.96-1.77,3.96-3.96c0-2.18-1.77-3.95-3.96-3.96
c-0.63,0-1.27,0-1.99,0v-3.97c0.69,0,1.31,0,1.95,0c2.19,0,3.96-1.77,3.96-3.96c0-2.19-1.77-3.96-3.96-3.96
c-0.62,0-1.23,0-1.95,0v-4.95h1.8c2.19,0.11,4.05-1.57,4.16-3.76c0.11-2.19-1.57-4.05-3.76-4.16c-0.14-0.01-0.27-0.01-0.41,0
H9.89V17.9c0.69,0,1.32,0,1.96,0c2.19,0,3.96-1.77,3.96-3.96c0-2.19-1.77-3.96-3.96-3.96c0,0,0,0,0,0c-0.62,0-1.23,0-1.99,0
c0-1.27,0.07-2.55,0.21-3.81c0.28-1.24,1.38-2.12,2.65-2.11c2.32-0.02,4.65-0.02,7.03-0.02v55.39c0,0-0.05,0.06-0.08,0.06
c-2.35,0-4.69,0.05-7.04,0c-1.47-0.09-2.63-1.27-2.71-2.73C9.88,56.05,9.92,55.36,9.92,54.54"/>
<path id="Pfad_9159" class="st5" d="M8.9,15.93c-0.95,0-1.89,0-2.84,0c-1.09,0-1.98-0.89-1.98-1.98c0-1.09,0.89-1.98,1.98-1.98
c1.89,0,3.79,0,5.68,0c1.09-0.06,2.03,0.77,2.1,1.86c0.06,1.09-0.77,2.03-1.86,2.1c-0.08,0-0.16,0-0.23,0
C10.79,15.92,9.85,15.92,8.9,15.93"/>
<path id="Pfad_9160" class="st5" d="M8.95,23.85c0.93,0,1.85,0,2.77,0c1.09-0.07,2.04,0.75,2.11,1.85
c0.07,1.09-0.75,2.04-1.84,2.11c-0.08,0.01-0.15,0.01-0.23,0c-1.89,0-3.79,0-5.68,0c-1.09,0.06-2.03-0.78-2.08-1.88
s0.78-2.03,1.88-2.08c0.08,0,0.16,0,0.23,0C7.05,23.85,7.99,23.85,8.95,23.85"/>
<path id="Pfad_9161" class="st5" d="M8.95,36.72c0.95,0,1.89,0,2.84,0c1.09-0.05,2.02,0.79,2.07,1.88
c0.05,1.09-0.79,2.02-1.88,2.07c-0.05,0-0.11,0-0.16,0c-1.93,0.01-3.87,0.01-5.8,0c-1.09,0.04-2.01-0.82-2.04-1.91
s0.82-2.01,1.91-2.04c0.05,0,0.11,0,0.16,0C7.02,36.72,7.98,36.72,8.95,36.72"/>
<path id="Pfad_9162" class="st5" d="M8.92,52.57c-0.95,0-1.89,0-2.84,0c-1.09,0.11-2.06-0.69-2.16-1.78s0.69-2.06,1.78-2.16
c0.12-0.01,0.25-0.01,0.37,0c1.91,0,3.83,0,5.74,0c1.09-0.05,2.02,0.79,2.07,1.88c0.05,1.09-0.79,2.02-1.88,2.07
c-0.05,0-0.11,0-0.16,0c-0.97,0-1.93,0-2.9,0"/>
<path id="Pfad_9163" class="st5" d="M44.92,30.89c2.24-2.47,2.04-6.29-0.43-8.53c-0.03-0.03-0.06-0.06-0.1-0.09
c-2.51-2.13-6.27-1.82-8.39,0.69c-1.96,2.31-1.87,5.73,0.2,7.93c-1.91,0.43-3.56,1.62-4.58,3.3c-0.87,1.73-1.2,3.69-0.95,5.61
c-3.79-4.48-3.98-10.98-0.47-15.69c4.37-5.58,12.43-6.57,18.02-2.2s6.57,12.43,2.2,18.02l0,0c0-0.86,0.03-1.61,0-2.36
c-0.03-2.76-1.72-5.23-4.28-6.27C45.75,31.15,45.34,31.01,44.92,30.89"/>
<path id="Pfad_9164" class="st5" d="M40.6,32.87c1.29-0.08,2.59-0.07,3.88,0.03c2.27,0.38,3.94,2.33,3.97,4.62
c0.04,1.34,0.02,2.68,0,4.02c-0.02,0.23-0.14,0.45-0.32,0.6c-4.5,3.32-10.63,3.32-15.13,0.02c-0.15-0.11-0.35-0.31-0.35-0.46
c-0.07-1.63-0.03-3.25,0.11-4.87c0.36-2.34,2.38-4.07,4.75-4.05c1.04-0.02,2.06,0,3.09,0C40.6,32.8,40.6,32.84,40.6,32.87"/>
<path id="Pfad_9165" class="st5" d="M40.57,22.86c2.19,0.01,3.95,1.78,3.95,3.97c-0.01,2.19-1.78,3.95-3.97,3.95
c-2.18-0.01-3.95-1.78-3.95-3.96C36.6,24.63,38.38,22.86,40.57,22.86L40.57,22.86"/>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 7.2 KiB

View File

@ -0,0 +1,29 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 26.5.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 64 64" style="enable-background:new 0 0 64 64;" xml:space="preserve">
<style type="text/css">
.st0{display:none;}
.st1{display:inline;fill:#72778F;}
.st2{font-family:'FontAwesome5Free-Solid';}
.st3{font-size:51.1997px;}
.st4{fill:#72778F;}
</style>
<g id="Community" class="st0">
<text transform="matrix(1 0 0 1 -0.0903 49.2777)" class="st1 st2 st3"></text>
</g>
<g id="Home">
<g id="Haus" transform="translate(-319.046 -300.603)">
<path id="Pfad_9173" class="st4" d="M356.12,358.2v-15.2h-10.16v14.91c-0.37,0.12-0.75,0.21-1.13,0.26c-4.54,0-9.07,0.04-13.61,0
c-2.24-0.02-3.13-0.92-3.14-3.14c-0.03-5.84-0.03-11.69,0.03-17.53c0.02-0.72,0.32-1.41,0.83-1.92
c7.28-6.08,14.61-12.1,22.02-18.21c0.51,0.38,1.01,0.71,1.47,1.09c6.69,5.5,13.35,11.03,20.07,16.5c1.01,0.7,1.58,1.88,1.52,3.1
c-0.09,5.5-0.03,11-0.04,16.5c0,2.79-0.78,3.6-3.5,3.61C365.8,358.21,361.14,358.2,356.12,358.2z"/>
<path id="Pfad_9174" class="st4" d="M351,313.85c-8.82,7.36-17.46,14.59-26.15,21.76c-0.76,0.64-2.31,1.49-2.69,1.2
c-1.26-1.03-2.31-2.29-3.09-3.72c-0.19-0.32,0.7-1.5,1.32-2.02c8.63-7.25,17.29-14.48,25.97-21.67c0.47-0.4,0.94-0.8,1.43-1.18
c1.88-1.68,4.73-1.64,6.58,0.08c3.02,2.47,6,4.99,9.43,7.85c0-2.56,0.05-4.71-0.02-6.85c-0.05-1.55,0.49-2.29,2.14-2.21
c1.92,0.1,3.84,0.1,5.76,0c1.68-0.09,2.33,0.51,2.3,2.24c-0.08,4.54-0.1,9.08,0.03,13.61c0.08,1.03,0.54,2,1.28,2.73
c2.16,2.01,4.48,3.84,6.79,5.7c0.87,0.45,1.21,1.52,0.76,2.39c-0.11,0.21-0.26,0.4-0.44,0.55c-2.7,3.45-2.67,3.48-5.96,0.73
l-23.43-19.55C352.41,314.97,351.76,314.47,351,313.85z"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

View File

@ -0,0 +1,182 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 26.5.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 64 64" style="enable-background:new 0 0 64 64;" xml:space="preserve">
<style type="text/css">
.st0{display:none;}
.st1{display:inline;enable-background:new ;}
.st2{fill:#72778F;}
.st3{display:inline;opacity:0.6;}
.st4{enable-background:new ;}
.st5{fill:#CD5656;}
.st6{fill:#047006;}
.st7{fill:#FFFFFF;}
.st8{display:inline;}
.st9{clip-path:url(#SVGID_00000178163426027821014280000005828283979416336312_);}
</style>
<g id="Transaktionen" class="st0">
<g class="st1">
<path class="st2" d="M6.74,16.53L31.37,5.35c0.34-0.16,0.73-0.24,1.13-0.24c0.4,0,0.78,0.09,1.12,0.24l24.63,11.18
c1.75,0.79,1.75,3.44,0,4.23L33.62,31.94c-0.72,0.33-1.53,0.33-2.25,0L6.74,20.76C4.99,19.97,4.99,17.32,6.74,16.53z M58.26,34.33
L33.62,45.5c-0.72,0.33-1.53,0.33-2.25,0L6.74,34.33c-1.75-0.79-1.75-3.44,0-4.23l6.14-2.78l17.09,7.75
c0.8,0.36,1.65,0.55,2.52,0.55c0.87,0,1.72-0.18,2.52-0.55l17.09-7.75l6.14,2.78C60.01,30.89,60.01,33.54,58.26,34.33z
M58.26,47.85L33.62,59.01c-0.72,0.33-1.53,0.33-2.25,0L6.74,47.85c-1.75-0.79-1.75-3.44,0-4.23l6.12-2.77l17.12,7.76
c0.8,0.36,1.65,0.55,2.52,0.55c0.87,0,1.72-0.18,2.52-0.55l17.12-7.76l6.12,2.77C60.01,44.41,60.01,47.05,58.26,47.85z"/>
</g>
</g>
<g id="mein_x5F_profil" class="st0">
<g class="st1">
<path class="st2" d="M56.7,51.31v4.64c0,2.96-2.4,5.35-5.35,5.35H12.11c-2.95,0-5.35-2.4-5.35-5.35v-4.64
c0-8.27,6.71-14.98,14.98-14.98h1.86c2.49,1.14,5.23,1.78,8.13,1.78s5.65-0.65,8.13-1.78h1.86C49.99,36.33,56.7,43.04,56.7,51.31z
M17.46,18.49c0-7.88,6.39-14.27,14.27-14.27S46,10.61,46,18.49s-6.39,14.27-14.27,14.27S17.46,26.37,17.46,18.49z"/>
</g>
</g>
<g id="Top_Stories" class="st0">
<g class="st1">
<path class="st2" d="M64,14.86v34.67c0,2.95-2.39,5.33-5.33,5.33H6.22C2.79,54.87,0,52.08,0,48.64V18.42
c0-1.47,1.19-2.67,2.67-2.67h4.44v-0.89c0-1.47,1.19-2.67,2.67-2.67h51.56C62.81,12.2,64,13.39,64,14.86z M7.11,48.64V21.09H5.33
v27.56c0,0.49,0.4,0.89,0.89,0.89C6.71,49.53,7.11,49.13,7.11,48.64z M56.89,25.09v-4.44c0-0.74-0.6-1.33-1.33-1.33h-40
c-0.74,0-1.33,0.6-1.33,1.33v4.44c0,0.74,0.6,1.33,1.33,1.33h40C56.29,26.42,56.89,25.82,56.89,25.09z M33.78,35.75v-0.89
c0-0.74-0.6-1.33-1.33-1.33H15.56c-0.74,0-1.33,0.6-1.33,1.33v0.89c0,0.74,0.6,1.33,1.33,1.33h16.89
C33.18,37.09,33.78,36.49,33.78,35.75z M33.78,46.42v-0.89c0-0.74-0.6-1.33-1.33-1.33H15.56c-0.74,0-1.33,0.6-1.33,1.33v0.89
c0,0.74,0.6,1.33,1.33,1.33h16.89C33.18,47.75,33.78,47.16,33.78,46.42z M56.89,35.75v-0.89c0-0.74-0.6-1.33-1.33-1.33H38.67
c-0.74,0-1.33,0.6-1.33,1.33v0.89c0,0.74,0.6,1.33,1.33,1.33h16.89C56.29,37.09,56.89,36.49,56.89,35.75z M56.89,46.42v-0.89
c0-0.74-0.6-1.33-1.33-1.33H38.67c-0.74,0-1.33,0.6-1.33,1.33v0.89c0,0.74,0.6,1.33,1.33,1.33h16.89
C56.29,47.75,56.89,47.16,56.89,46.42z"/>
</g>
</g>
<g id="settings" class="st0">
<g id="Settings" transform="translate(1)" class="st3">
<g class="st4">
<path class="st2" d="M53,20.34c-1.17,0.82-2.79,0.54-3.61-0.63c-4.31-6.14-11.36-9.87-18.86-9.98
c-6.09-0.09-11.77,2.17-15.95,6.36c-4.01,4.01-6.17,9.34-6.08,15.02l-0.02,2.56c-0.04,1.4-1.19,2.52-2.59,2.52
c-0.03,0-0.05,0-0.08,0c-1.43-0.04-2.56-1.24-2.51-2.67l0.01-2.32C3.2,24.09,5.9,17.43,10.9,12.41
c5.19-5.19,12.16-7.97,19.7-7.88c9.16,0.14,17.77,4.69,23.03,12.19C54.45,17.89,54.17,19.51,53,20.34z M19.29,23.79
c-2.03,2.49-3.08,5.52-3.02,8.75c0.07,4.39-0.29,8.8-1.07,13.1c-0.09,0.49-0.84,2.47-3.01,2.09c-1.41-0.26-2.34-1.6-2.09-3.01
c0.72-3.97,1.05-8.04,0.98-12.1c-0.07-4.4,1.42-8.7,4.19-12.1c0.91-1.11,2.53-1.28,3.65-0.38
C20.02,21.04,20.19,22.67,19.29,23.79z M42.2,33.37c0.08,5.5-0.32,11.03-1.22,16.43c-0.08,0.5-0.82,2.49-2.98,2.14
c-1.41-0.24-2.37-1.57-2.13-2.98c0.84-5.1,1.23-10.32,1.15-15.51c-0.05-3.25-2.84-5.94-6.22-5.99c-3.73-0.01-5.93,2.85-5.88,5.65
c0.09,5.56-0.44,11.12-1.55,16.53c-0.29,1.4-1.65,2.3-3.06,2.01c-1.4-0.29-2.3-1.66-2.01-3.06c1.04-5.04,1.52-10.22,1.44-15.4
c-0.09-5.83,4.53-10.93,11.14-10.92C37.02,22.36,42.11,27.34,42.2,33.37z M50.85,33.04c0.01,0.53,0.02,0.92,0.02,1.45
c0,3.89-0.22,7.72-0.65,11.49c-0.12,1-1.07,2.49-2.87,2.28c-1.42-0.16-2.44-1.45-2.28-2.87c0.46-4.05,0.67-8.18,0.6-12.28
c-0.12-7.89-6.85-14.41-15-14.54c-1.24-0.01-2.48,0.11-3.67,0.4c-1.39,0.32-2.79-0.53-3.12-1.93s0.53-2.79,1.93-3.12
c1.61-0.38,3.28-0.58,4.95-0.54C41.66,13.57,50.68,22.38,50.85,33.04z M33.55,33.7c0.17,10.7-1.72,19.08-3.18,24.25
c-0.32,1.15-1.36,1.89-2.49,1.89c-2.27,0-2.79-2.24-2.5-3.29c2.11-7.52,3.12-15.05,2.99-22.85c0-1.43,1.16-2.59,2.59-2.59
C32.39,31.1,33.55,32.27,33.55,33.7z M58.6,34.34c-0.01,1.42-1.17,2.57-2.59,2.57h-0.02c-1.43-0.01-2.58-1.18-2.57-2.62
c0.02-2.61,0-4.34-0.51-6.65c-0.31-1.4,0.58-2.78,1.97-3.09c1.41-0.32,2.78,0.58,3.09,1.97C58.64,29.57,58.62,31.94,58.6,34.34z"
/>
</g>
</g>
</g>
<g id="Senden" class="st0">
<g class="st1">
<path class="st2" d="M64,12.24v38.4c0,1.77-1.43,3.2-3.2,3.2H3.2c-1.77,0-3.2-1.43-3.2-3.2v-38.4c0-1.77,1.43-3.2,3.2-3.2h57.6
C62.57,9.04,64,10.47,64,12.24z M21.87,34.12c0-2-1.3-3.78-3.16-4.34l-4.5-1.35c-0.52-0.15-0.88-0.68-0.88-1.27
c0-0.73,0.53-1.32,1.18-1.32h2.81c0.46,0,0.9,0.13,1.28,0.37c0.32,0.2,0.74,0.19,1.01-0.07l1.18-1.12
c0.35-0.34,0.33-0.92-0.06-1.21c-0.91-0.68-2.01-1.08-3.14-1.13v-1.63c0-0.44-0.36-0.8-0.8-0.8h-1.6c-0.44,0-0.8,0.36-0.8,0.8
v1.61c-2.36,0.06-4.27,2.06-4.27,4.51c0,2,1.3,3.78,3.16,4.34l4.5,1.35c0.52,0.15,0.88,0.68,0.88,1.27c0,0.73-0.53,1.32-1.18,1.32
h-2.81c-0.46,0-0.9-0.13-1.28-0.37c-0.32-0.2-0.74-0.19-1.01,0.07l-1.18,1.12c-0.35,0.34-0.33,0.92,0.06,1.21
c0.91,0.68,2.01,1.08,3.14,1.14v1.63c0,0.44,0.36,0.8,0.8,0.8h1.6c0.44,0,0.8-0.36,0.8-0.8v-1.61
C19.96,38.57,21.87,36.58,21.87,34.12z M57.6,25.84c0-0.44-0.36-0.8-0.8-0.8H29.6c-0.44,0-0.8,0.36-0.8,0.8v1.6
c0,0.44,0.36,0.8,0.8,0.8h27.2c0.44,0,0.8-0.36,0.8-0.8V25.84z M41.6,35.44c0-0.44-0.36-0.8-0.8-0.8H29.6
c-0.44,0-0.8,0.36-0.8,0.8v1.6c0,0.44,0.36,0.8,0.8,0.8h11.2c0.44,0,0.8-0.36,0.8-0.8V35.44z M57.6,35.44c0-0.44-0.36-0.8-0.8-0.8
h-8c-0.44,0-0.8,0.36-0.8,0.8v1.6c0,0.44,0.36,0.8,0.8,0.8h8c0.44,0,0.8-0.36,0.8-0.8V35.44z"/>
</g>
</g>
<g id="logout" class="st0">
<g class="st1">
<path class="st5" d="M22.86,56.38H12.19C5.46,56.38,0,50.92,0,44.19V19.81C0,13.08,5.46,7.62,12.19,7.62h10.67
c0.84,0,1.52,0.69,1.52,1.52v5.08c0,0.84-0.69,1.52-1.52,1.52H12.19c-2.25,0-4.06,1.82-4.06,4.06v24.38
c0,2.25,1.82,4.06,4.06,4.06h10.67c0.84,0,1.52,0.69,1.52,1.52v5.08C24.38,55.69,23.7,56.38,22.86,56.38z M41.78,55.49
c-1.9,1.9-5.21,0.57-5.21-2.16V41.14H19.3c-1.69,0-3.05-1.36-3.05-3.05V25.9c0-1.69,1.36-3.05,3.05-3.05h17.27V10.66
c0-2.72,3.29-4.06,5.21-2.16l21.33,21.33c1.18,1.19,1.18,3.12,0,4.32L41.78,55.49z"/>
</g>
</g>
<g id="info">
<g id="Infobutton" transform="translate(0 -0.001)">
<circle id="Ellipse_4" class="st6" cx="32" cy="32" r="32"/>
<rect id="Rechteck_49" x="28" y="28" class="st7" width="8" height="24"/>
<circle id="Ellipse_5" class="st7" cx="32" cy="20" r="4"/>
</g>
</g>
<g id="Home" class="st0">
<g id="Haus" transform="translate(-319.046 -300.603)" class="st8">
<path id="Pfad_9173" class="st2" d="M356.12,358.2v-15.2h-10.16v14.91c-0.37,0.12-0.75,0.21-1.13,0.26c-4.54,0-9.07,0.04-13.61,0
c-2.24-0.02-3.13-0.92-3.14-3.14c-0.03-5.84-0.03-11.69,0.03-17.53c0.02-0.72,0.32-1.41,0.83-1.92
c7.28-6.08,14.61-12.1,22.02-18.21c0.51,0.38,1.01,0.71,1.47,1.09c6.69,5.5,13.35,11.03,20.07,16.5c1.01,0.7,1.58,1.88,1.52,3.1
c-0.09,5.5-0.03,11-0.04,16.5c0,2.79-0.78,3.6-3.5,3.61C365.8,358.21,361.14,358.2,356.12,358.2z"/>
<path id="Pfad_9174" class="st2" d="M351,313.85c-8.82,7.36-17.46,14.59-26.15,21.76c-0.76,0.64-2.31,1.49-2.69,1.2
c-1.26-1.03-2.31-2.29-3.09-3.72c-0.19-0.32,0.7-1.5,1.32-2.02c8.63-7.25,17.29-14.48,25.97-21.67c0.47-0.4,0.94-0.8,1.43-1.18
c1.88-1.68,4.73-1.64,6.58,0.08c3.02,2.47,6,4.99,9.43,7.85c0-2.56,0.05-4.71-0.02-6.85c-0.05-1.55,0.49-2.29,2.14-2.21
c1.92,0.1,3.84,0.1,5.76,0c1.68-0.09,2.33,0.51,2.3,2.24c-0.08,4.54-0.1,9.08,0.03,13.61c0.08,1.03,0.54,2,1.28,2.73
c2.16,2.01,4.48,3.84,6.79,5.7c0.87,0.45,1.21,1.52,0.76,2.39c-0.11,0.21-0.26,0.4-0.44,0.55c-2.7,3.45-2.67,3.48-5.96,0.73
l-23.43-19.55C352.41,314.97,351.76,314.47,351,313.85z"/>
</g>
</g>
<g id="Community" class="st0">
<g class="st1">
<path class="st2" d="M9.7,42.88H3.11c-1.77,0-3.2-1.43-3.2-3.2v-3.2c0-3.53,2.87-6.4,6.4-6.4h6.4c1.76,0,3.35,0.71,4.51,1.86
C13.19,34.15,10.33,38.14,9.7,42.88z M3.11,20.48c0-3.53,2.87-6.4,6.4-6.4s6.4,2.87,6.4,6.4s-2.87,6.4-6.4,6.4
S3.11,24.01,3.11,20.48z M51.11,44.8v2.88c0,2.65-2.15,4.8-4.8,4.8h-28.8c-2.65,0-4.8-2.15-4.8-4.8V44.8
c0-6.36,5.16-11.52,11.52-11.52h0.83c2.09,1,4.39,1.6,6.85,1.6c2.46,0,4.77-0.6,6.85-1.6h0.83C45.95,33.28,51.11,38.44,51.11,44.8
z M20.71,18.88c0-6.19,5.01-11.2,11.2-11.2c6.19,0,11.2,5.01,11.2,11.2s-5.01,11.2-11.2,11.2C25.72,30.08,20.71,25.07,20.71,18.88
z M63.91,36.48v3.2c0,1.77-1.43,3.2-3.2,3.2h-6.6c-0.62-4.74-3.48-8.73-7.51-10.94c1.16-1.15,2.75-1.86,4.51-1.86h6.4
C61.04,30.08,63.91,32.95,63.91,36.48z M47.91,20.48c0-3.53,2.87-6.4,6.4-6.4c3.53,0,6.4,2.87,6.4,6.4s-2.87,6.4-6.4,6.4
C50.78,26.88,47.91,24.01,47.91,20.48z"/>
</g>
</g>
<g id="coin_x5F_icon" class="st0">
<g class="st1">
<path class="st6" d="M46.41,30.2c0,4.98-9.68,9.01-21.62,9.01S3.17,35.18,3.17,30.2s9.68-9.01,21.62-9.01S46.41,25.22,46.41,30.2z
M24.79,42.81c8.46,0,16.97-1.98,21.62-5.81v5.81c0,3.98-9.68,7.21-21.62,7.21S3.17,46.79,3.17,42.81V37
C7.82,40.83,16.34,42.81,24.79,42.81z M24.79,53.62c8.47,0,16.97-1.53,21.62-4.81v4.81c0,3.98-9.68,7.21-21.62,7.21
S3.17,57.6,3.17,53.62v-4.81C7.82,52.09,16.32,53.62,24.79,53.62z M17.59,10.38c0-3.98,9.68-7.21,21.62-7.21
s21.62,3.23,21.62,7.21s-9.68,7.21-21.62,7.21S17.59,14.35,17.59,10.38z M42.73,21.09c7.23-0.36,14.1-1.88,18.1-4.71v4.81
c0,2.74-4.58,5.12-11.34,6.34C48.5,24.86,46.06,22.7,42.73,21.09z M50.02,31.08c4.36-0.78,8.2-2.04,10.81-3.89V32
c0,2.67-4.36,4.99-10.81,6.24V31.08z"/>
</g>
</g>
<g id="Adressen" class="st0">
<g class="st8">
<defs>
<rect id="SVGID_1_" x="3.98" y="4.04" width="55.34" height="55.46"/>
</defs>
<clipPath id="SVGID_00000150784502249149970240000013189293628367867574_">
<use xlink:href="#SVGID_1_" style="overflow:visible;"/>
</clipPath>
<g id="Gruppe_4997" style="clip-path:url(#SVGID_00000150784502249149970240000013189293628367867574_);">
<path id="Pfad_9157" class="st2" d="M21.8,59.5V4.04h34.22c1.64-0.18,3.12,1,3.3,2.65c0.02,0.21,0.02,0.43,0,0.64
c0,16.29,0,32.58,0,48.88c0.17,1.65-1.02,3.12-2.67,3.29c-0.21,0.02-0.42,0.02-0.63,0H21.8 M25.72,31.78
c0.03,8.19,6.69,14.8,14.88,14.77c8.19-0.03,14.8-6.69,14.77-14.88c-0.03-8.16-6.65-14.77-14.82-14.77
C32.35,16.91,25.71,23.57,25.72,31.78C25.72,31.78,25.72,31.78,25.72,31.78"/>
<path id="Pfad_9158" class="st2" d="M9.92,54.54c0.69,0,1.33,0,1.97,0c2.19,0,3.96-1.77,3.96-3.96c0-2.18-1.77-3.95-3.96-3.96
c-0.63,0-1.27,0-1.99,0v-3.97c0.69,0,1.31,0,1.95,0c2.19,0,3.96-1.77,3.96-3.96c0-2.19-1.77-3.96-3.96-3.96
c-0.62,0-1.23,0-1.95,0v-4.95h1.8c2.19,0.11,4.05-1.57,4.16-3.76c0.11-2.19-1.57-4.05-3.76-4.16c-0.14-0.01-0.27-0.01-0.41,0
H9.89V17.9c0.69,0,1.32,0,1.96,0c2.19,0,3.96-1.77,3.96-3.96c0-2.19-1.77-3.96-3.96-3.96c0,0,0,0,0,0c-0.62,0-1.23,0-1.99,0
c0-1.27,0.07-2.55,0.21-3.81c0.28-1.24,1.38-2.12,2.65-2.11c2.32-0.02,4.65-0.02,7.03-0.02v55.39c0,0-0.05,0.06-0.08,0.06
c-2.35,0-4.69,0.05-7.04,0c-1.47-0.09-2.63-1.27-2.71-2.73C9.88,56.05,9.92,55.36,9.92,54.54"/>
<path id="Pfad_9159" class="st2" d="M8.9,15.93c-0.95,0-1.89,0-2.84,0c-1.09,0-1.98-0.89-1.98-1.98c0-1.09,0.89-1.98,1.98-1.98
c1.89,0,3.79,0,5.68,0c1.09-0.06,2.03,0.77,2.1,1.86c0.06,1.09-0.77,2.03-1.86,2.1c-0.08,0-0.16,0-0.23,0
C10.79,15.92,9.85,15.92,8.9,15.93"/>
<path id="Pfad_9160" class="st2" d="M8.95,23.85c0.93,0,1.85,0,2.77,0c1.09-0.07,2.04,0.75,2.11,1.85
c0.07,1.09-0.75,2.04-1.84,2.11c-0.08,0.01-0.15,0.01-0.23,0c-1.89,0-3.79,0-5.68,0c-1.09,0.06-2.03-0.78-2.08-1.88
s0.78-2.03,1.88-2.08c0.08,0,0.16,0,0.23,0C7.05,23.85,7.99,23.85,8.95,23.85"/>
<path id="Pfad_9161" class="st2" d="M8.95,36.72c0.95,0,1.89,0,2.84,0c1.09-0.05,2.02,0.79,2.07,1.88
c0.05,1.09-0.79,2.02-1.88,2.07c-0.05,0-0.11,0-0.16,0c-1.93,0.01-3.87,0.01-5.8,0c-1.09,0.04-2.01-0.82-2.04-1.91
s0.82-2.01,1.91-2.04c0.05,0,0.11,0,0.16,0C7.02,36.72,7.98,36.72,8.95,36.72"/>
<path id="Pfad_9162" class="st2" d="M8.92,52.57c-0.95,0-1.89,0-2.84,0c-1.09,0.11-2.06-0.69-2.16-1.78s0.69-2.06,1.78-2.16
c0.12-0.01,0.25-0.01,0.37,0c1.91,0,3.83,0,5.74,0c1.09-0.05,2.02,0.79,2.07,1.88c0.05,1.09-0.79,2.02-1.88,2.07
c-0.05,0-0.11,0-0.16,0c-0.97,0-1.93,0-2.9,0"/>
<path id="Pfad_9163" class="st2" d="M44.92,30.89c2.24-2.47,2.04-6.29-0.43-8.53c-0.03-0.03-0.06-0.06-0.1-0.09
c-2.51-2.13-6.27-1.82-8.39,0.69c-1.96,2.31-1.87,5.73,0.2,7.93c-1.91,0.43-3.56,1.62-4.58,3.3c-0.87,1.73-1.2,3.69-0.95,5.61
c-3.79-4.48-3.98-10.98-0.47-15.69c4.37-5.58,12.43-6.57,18.02-2.2s6.57,12.43,2.2,18.02l0,0c0-0.86,0.03-1.61,0-2.36
c-0.03-2.76-1.72-5.23-4.28-6.27C45.75,31.15,45.34,31.01,44.92,30.89"/>
<path id="Pfad_9164" class="st2" d="M40.6,32.87c1.29-0.08,2.59-0.07,3.88,0.03c2.27,0.38,3.94,2.33,3.97,4.62
c0.04,1.34,0.02,2.68,0,4.02c-0.02,0.23-0.14,0.45-0.32,0.6c-4.5,3.32-10.63,3.32-15.13,0.02c-0.15-0.11-0.35-0.31-0.35-0.46
c-0.07-1.63-0.03-3.25,0.11-4.87c0.36-2.34,2.38-4.07,4.75-4.05c1.04-0.02,2.06,0,3.09,0C40.6,32.8,40.6,32.84,40.6,32.87"/>
<path id="Pfad_9165" class="st2" d="M40.57,22.86c2.19,0.01,3.95,1.78,3.95,3.97c-0.01,2.19-1.78,3.95-3.97,3.95
c-2.18-0.01-3.95-1.78-3.95-3.96C36.6,24.63,38.38,22.86,40.57,22.86L40.57,22.86"/>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 793 B

View File

@ -0,0 +1,162 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 26.5.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 64 64" style="enable-background:new 0 0 64 64;" xml:space="preserve">
<style type="text/css">
.st0{display:none;}
.st1{display:inline;enable-background:new ;}
.st2{fill:#72778F;}
.st3{display:inline;opacity:0.6;}
.st4{enable-background:new ;}
.st5{fill:#CD5656;}
.st6{display:inline;}
.st7{clip-path:url(#SVGID_00000031177400750764849750000007392222980339360955_);}
</style>
<g id="Transaktionen" class="st0">
<g class="st1">
<path class="st2" d="M6.74,16.53L31.37,5.35c0.34-0.16,0.73-0.24,1.13-0.24c0.4,0,0.78,0.09,1.12,0.24l24.63,11.18
c1.75,0.79,1.75,3.44,0,4.23L33.62,31.94c-0.72,0.33-1.53,0.33-2.25,0L6.74,20.76C4.99,19.97,4.99,17.32,6.74,16.53z M58.26,34.33
L33.62,45.5c-0.72,0.33-1.53,0.33-2.25,0L6.74,34.33c-1.75-0.79-1.75-3.44,0-4.23l6.14-2.78l17.09,7.75
c0.8,0.36,1.65,0.55,2.52,0.55c0.87,0,1.72-0.18,2.52-0.55l17.09-7.75l6.14,2.78C60.01,30.89,60.01,33.54,58.26,34.33z
M58.26,47.85L33.62,59.01c-0.72,0.33-1.53,0.33-2.25,0L6.74,47.85c-1.75-0.79-1.75-3.44,0-4.23l6.12-2.77l17.12,7.76
c0.8,0.36,1.65,0.55,2.52,0.55c0.87,0,1.72-0.18,2.52-0.55l17.12-7.76l6.12,2.77C60.01,44.41,60.01,47.05,58.26,47.85z"/>
</g>
</g>
<g id="mein_x5F_profil" class="st0">
<g class="st1">
<path class="st2" d="M56.7,51.31v4.64c0,2.96-2.4,5.35-5.35,5.35H12.11c-2.95,0-5.35-2.4-5.35-5.35v-4.64
c0-8.27,6.71-14.98,14.98-14.98h1.86c2.49,1.14,5.23,1.78,8.13,1.78s5.65-0.65,8.13-1.78h1.86C49.99,36.33,56.7,43.04,56.7,51.31z
M17.46,18.49c0-7.88,6.39-14.27,14.27-14.27S46,10.61,46,18.49s-6.39,14.27-14.27,14.27S17.46,26.37,17.46,18.49z"/>
</g>
</g>
<g id="Top_Stories" class="st0">
<g class="st1">
<path class="st2" d="M64,14.86v34.67c0,2.95-2.39,5.33-5.33,5.33H6.22C2.79,54.87,0,52.08,0,48.64V18.42
c0-1.47,1.19-2.67,2.67-2.67h4.44v-0.89c0-1.47,1.19-2.67,2.67-2.67h51.56C62.81,12.2,64,13.39,64,14.86z M7.11,48.64V21.09H5.33
v27.56c0,0.49,0.4,0.89,0.89,0.89C6.71,49.53,7.11,49.13,7.11,48.64z M56.89,25.09v-4.44c0-0.74-0.6-1.33-1.33-1.33h-40
c-0.74,0-1.33,0.6-1.33,1.33v4.44c0,0.74,0.6,1.33,1.33,1.33h40C56.29,26.42,56.89,25.82,56.89,25.09z M33.78,35.75v-0.89
c0-0.74-0.6-1.33-1.33-1.33H15.56c-0.74,0-1.33,0.6-1.33,1.33v0.89c0,0.74,0.6,1.33,1.33,1.33h16.89
C33.18,37.09,33.78,36.49,33.78,35.75z M33.78,46.42v-0.89c0-0.74-0.6-1.33-1.33-1.33H15.56c-0.74,0-1.33,0.6-1.33,1.33v0.89
c0,0.74,0.6,1.33,1.33,1.33h16.89C33.18,47.75,33.78,47.16,33.78,46.42z M56.89,35.75v-0.89c0-0.74-0.6-1.33-1.33-1.33H38.67
c-0.74,0-1.33,0.6-1.33,1.33v0.89c0,0.74,0.6,1.33,1.33,1.33h16.89C56.29,37.09,56.89,36.49,56.89,35.75z M56.89,46.42v-0.89
c0-0.74-0.6-1.33-1.33-1.33H38.67c-0.74,0-1.33,0.6-1.33,1.33v0.89c0,0.74,0.6,1.33,1.33,1.33h16.89
C56.29,47.75,56.89,47.16,56.89,46.42z"/>
</g>
</g>
<g id="settings" class="st0">
<g id="Settings" transform="translate(1)" class="st3">
<g class="st4">
<path class="st2" d="M53,20.34c-1.17,0.82-2.79,0.54-3.61-0.63c-4.31-6.14-11.36-9.87-18.86-9.98
c-6.09-0.09-11.77,2.17-15.95,6.36c-4.01,4.01-6.17,9.34-6.08,15.02l-0.02,2.56c-0.04,1.4-1.19,2.52-2.59,2.52
c-0.03,0-0.05,0-0.08,0c-1.43-0.04-2.56-1.24-2.51-2.67l0.01-2.32C3.2,24.09,5.9,17.43,10.9,12.41
c5.19-5.19,12.16-7.97,19.7-7.88c9.16,0.14,17.77,4.69,23.03,12.19C54.45,17.89,54.17,19.51,53,20.34z M19.29,23.79
c-2.03,2.49-3.08,5.52-3.02,8.75c0.07,4.39-0.29,8.8-1.07,13.1c-0.09,0.49-0.84,2.47-3.01,2.09c-1.41-0.26-2.34-1.6-2.09-3.01
c0.72-3.97,1.05-8.04,0.98-12.1c-0.07-4.4,1.42-8.7,4.19-12.1c0.91-1.11,2.53-1.28,3.65-0.38
C20.02,21.04,20.19,22.67,19.29,23.79z M42.2,33.37c0.08,5.5-0.32,11.03-1.22,16.43c-0.08,0.5-0.82,2.49-2.98,2.14
c-1.41-0.24-2.37-1.57-2.13-2.98c0.84-5.1,1.23-10.32,1.15-15.51c-0.05-3.25-2.84-5.94-6.22-5.99c-3.73-0.01-5.93,2.85-5.88,5.65
c0.09,5.56-0.44,11.12-1.55,16.53c-0.29,1.4-1.65,2.3-3.06,2.01c-1.4-0.29-2.3-1.66-2.01-3.06c1.04-5.04,1.52-10.22,1.44-15.4
c-0.09-5.83,4.53-10.93,11.14-10.92C37.02,22.36,42.11,27.34,42.2,33.37z M50.85,33.04c0.01,0.53,0.02,0.92,0.02,1.45
c0,3.89-0.22,7.72-0.65,11.49c-0.12,1-1.07,2.49-2.87,2.28c-1.42-0.16-2.44-1.45-2.28-2.87c0.46-4.05,0.67-8.18,0.6-12.28
c-0.12-7.89-6.85-14.41-15-14.54c-1.24-0.01-2.48,0.11-3.67,0.4c-1.39,0.32-2.79-0.53-3.12-1.93s0.53-2.79,1.93-3.12
c1.61-0.38,3.28-0.58,4.95-0.54C41.66,13.57,50.68,22.38,50.85,33.04z M33.55,33.7c0.17,10.7-1.72,19.08-3.18,24.25
c-0.32,1.15-1.36,1.89-2.49,1.89c-2.27,0-2.79-2.24-2.5-3.29c2.11-7.52,3.12-15.05,2.99-22.85c0-1.43,1.16-2.59,2.59-2.59
C32.39,31.1,33.55,32.27,33.55,33.7z M58.6,34.34c-0.01,1.42-1.17,2.57-2.59,2.57h-0.02c-1.43-0.01-2.58-1.18-2.57-2.62
c0.02-2.61,0-4.34-0.51-6.65c-0.31-1.4,0.58-2.78,1.97-3.09c1.41-0.32,2.78,0.58,3.09,1.97C58.64,29.57,58.62,31.94,58.6,34.34z"
/>
</g>
</g>
</g>
<g id="Senden" class="st0">
<g class="st1">
<path class="st2" d="M64,12.24v38.4c0,1.77-1.43,3.2-3.2,3.2H3.2c-1.77,0-3.2-1.43-3.2-3.2v-38.4c0-1.77,1.43-3.2,3.2-3.2h57.6
C62.57,9.04,64,10.47,64,12.24z M21.87,34.12c0-2-1.3-3.78-3.16-4.34l-4.5-1.35c-0.52-0.15-0.88-0.68-0.88-1.27
c0-0.73,0.53-1.32,1.18-1.32h2.81c0.46,0,0.9,0.13,1.28,0.37c0.32,0.2,0.74,0.19,1.01-0.07l1.18-1.12
c0.35-0.34,0.33-0.92-0.06-1.21c-0.91-0.68-2.01-1.08-3.14-1.13v-1.63c0-0.44-0.36-0.8-0.8-0.8h-1.6c-0.44,0-0.8,0.36-0.8,0.8
v1.61c-2.36,0.06-4.27,2.06-4.27,4.51c0,2,1.3,3.78,3.16,4.34l4.5,1.35c0.52,0.15,0.88,0.68,0.88,1.27c0,0.73-0.53,1.32-1.18,1.32
h-2.81c-0.46,0-0.9-0.13-1.28-0.37c-0.32-0.2-0.74-0.19-1.01,0.07l-1.18,1.12c-0.35,0.34-0.33,0.92,0.06,1.21
c0.91,0.68,2.01,1.08,3.14,1.14v1.63c0,0.44,0.36,0.8,0.8,0.8h1.6c0.44,0,0.8-0.36,0.8-0.8v-1.61
C19.96,38.57,21.87,36.58,21.87,34.12z M57.6,25.84c0-0.44-0.36-0.8-0.8-0.8H29.6c-0.44,0-0.8,0.36-0.8,0.8v1.6
c0,0.44,0.36,0.8,0.8,0.8h27.2c0.44,0,0.8-0.36,0.8-0.8V25.84z M41.6,35.44c0-0.44-0.36-0.8-0.8-0.8H29.6
c-0.44,0-0.8,0.36-0.8,0.8v1.6c0,0.44,0.36,0.8,0.8,0.8h11.2c0.44,0,0.8-0.36,0.8-0.8V35.44z M57.6,35.44c0-0.44-0.36-0.8-0.8-0.8
h-8c-0.44,0-0.8,0.36-0.8,0.8v1.6c0,0.44,0.36,0.8,0.8,0.8h8c0.44,0,0.8-0.36,0.8-0.8V35.44z"/>
</g>
</g>
<g id="logout">
<g class="st4">
<path class="st5" d="M22.86,56.38H12.19C5.46,56.38,0,50.92,0,44.19V19.81C0,13.08,5.46,7.62,12.19,7.62h10.67
c0.84,0,1.52,0.69,1.52,1.52v5.08c0,0.84-0.69,1.52-1.52,1.52H12.19c-2.25,0-4.06,1.82-4.06,4.06v24.38
c0,2.25,1.82,4.06,4.06,4.06h10.67c0.84,0,1.52,0.69,1.52,1.52v5.08C24.38,55.69,23.7,56.38,22.86,56.38z M41.78,55.49
c-1.9,1.9-5.21,0.57-5.21-2.16V41.14H19.3c-1.69,0-3.05-1.36-3.05-3.05V25.9c0-1.69,1.36-3.05,3.05-3.05h17.27V10.66
c0-2.72,3.29-4.06,5.21-2.16l21.33,21.33c1.18,1.19,1.18,3.12,0,4.32L41.78,55.49z"/>
</g>
</g>
<g id="Home" class="st0">
<g id="Haus" transform="translate(-319.046 -300.603)" class="st6">
<path id="Pfad_9173" class="st2" d="M356.12,358.2v-15.2h-10.16v14.91c-0.37,0.12-0.75,0.21-1.13,0.26c-4.54,0-9.07,0.04-13.61,0
c-2.24-0.02-3.13-0.92-3.14-3.14c-0.03-5.84-0.03-11.69,0.03-17.53c0.02-0.72,0.32-1.41,0.83-1.92
c7.28-6.08,14.61-12.1,22.02-18.21c0.51,0.38,1.01,0.71,1.47,1.09c6.69,5.5,13.35,11.03,20.07,16.5c1.01,0.7,1.58,1.88,1.52,3.1
c-0.09,5.5-0.03,11-0.04,16.5c0,2.79-0.78,3.6-3.5,3.61C365.8,358.21,361.14,358.2,356.12,358.2z"/>
<path id="Pfad_9174" class="st2" d="M351,313.85c-8.82,7.36-17.46,14.59-26.15,21.76c-0.76,0.64-2.31,1.49-2.69,1.2
c-1.26-1.03-2.31-2.29-3.09-3.72c-0.19-0.32,0.7-1.5,1.32-2.02c8.63-7.25,17.29-14.48,25.97-21.67c0.47-0.4,0.94-0.8,1.43-1.18
c1.88-1.68,4.73-1.64,6.58,0.08c3.02,2.47,6,4.99,9.43,7.85c0-2.56,0.05-4.71-0.02-6.85c-0.05-1.55,0.49-2.29,2.14-2.21
c1.92,0.1,3.84,0.1,5.76,0c1.68-0.09,2.33,0.51,2.3,2.24c-0.08,4.54-0.1,9.08,0.03,13.61c0.08,1.03,0.54,2,1.28,2.73
c2.16,2.01,4.48,3.84,6.79,5.7c0.87,0.45,1.21,1.52,0.76,2.39c-0.11,0.21-0.26,0.4-0.44,0.55c-2.7,3.45-2.67,3.48-5.96,0.73
l-23.43-19.55C352.41,314.97,351.76,314.47,351,313.85z"/>
</g>
</g>
<g id="Community" class="st0">
<g class="st1">
<path class="st2" d="M9.7,42.88H3.11c-1.77,0-3.2-1.43-3.2-3.2v-3.2c0-3.53,2.87-6.4,6.4-6.4h6.4c1.76,0,3.35,0.71,4.51,1.86
C13.19,34.15,10.33,38.14,9.7,42.88z M3.11,20.48c0-3.53,2.87-6.4,6.4-6.4s6.4,2.87,6.4,6.4s-2.87,6.4-6.4,6.4
S3.11,24.01,3.11,20.48z M51.11,44.8v2.88c0,2.65-2.15,4.8-4.8,4.8h-28.8c-2.65,0-4.8-2.15-4.8-4.8V44.8
c0-6.36,5.16-11.52,11.52-11.52h0.83c2.09,1,4.39,1.6,6.85,1.6c2.46,0,4.77-0.6,6.85-1.6h0.83C45.95,33.28,51.11,38.44,51.11,44.8
z M20.71,18.88c0-6.19,5.01-11.2,11.2-11.2c6.19,0,11.2,5.01,11.2,11.2s-5.01,11.2-11.2,11.2C25.72,30.08,20.71,25.07,20.71,18.88
z M63.91,36.48v3.2c0,1.77-1.43,3.2-3.2,3.2h-6.6c-0.62-4.74-3.48-8.73-7.51-10.94c1.16-1.15,2.75-1.86,4.51-1.86h6.4
C61.04,30.08,63.91,32.95,63.91,36.48z M47.91,20.48c0-3.53,2.87-6.4,6.4-6.4c3.53,0,6.4,2.87,6.4,6.4s-2.87,6.4-6.4,6.4
C50.78,26.88,47.91,24.01,47.91,20.48z"/>
</g>
</g>
<g id="Adressen" class="st0">
<g class="st6">
<defs>
<rect id="SVGID_1_" x="3.98" y="4.04" width="55.34" height="55.46"/>
</defs>
<clipPath id="SVGID_00000057106565430898592500000001661123875775782306_">
<use xlink:href="#SVGID_1_" style="overflow:visible;"/>
</clipPath>
<g id="Gruppe_4997" style="clip-path:url(#SVGID_00000057106565430898592500000001661123875775782306_);">
<path id="Pfad_9157" class="st2" d="M21.8,59.5V4.04h34.22c1.64-0.18,3.12,1,3.3,2.65c0.02,0.21,0.02,0.43,0,0.64
c0,16.29,0,32.58,0,48.88c0.17,1.65-1.02,3.12-2.67,3.29c-0.21,0.02-0.42,0.02-0.63,0H21.8 M25.72,31.78
c0.03,8.19,6.69,14.8,14.88,14.77c8.19-0.03,14.8-6.69,14.77-14.88c-0.03-8.16-6.65-14.77-14.82-14.77
C32.35,16.91,25.71,23.57,25.72,31.78C25.72,31.78,25.72,31.78,25.72,31.78"/>
<path id="Pfad_9158" class="st2" d="M9.92,54.54c0.69,0,1.33,0,1.97,0c2.19,0,3.96-1.77,3.96-3.96c0-2.18-1.77-3.95-3.96-3.96
c-0.63,0-1.27,0-1.99,0v-3.97c0.69,0,1.31,0,1.95,0c2.19,0,3.96-1.77,3.96-3.96c0-2.19-1.77-3.96-3.96-3.96
c-0.62,0-1.23,0-1.95,0v-4.95h1.8c2.19,0.11,4.05-1.57,4.16-3.76c0.11-2.19-1.57-4.05-3.76-4.16c-0.14-0.01-0.27-0.01-0.41,0
H9.89V17.9c0.69,0,1.32,0,1.96,0c2.19,0,3.96-1.77,3.96-3.96c0-2.19-1.77-3.96-3.96-3.96c0,0,0,0,0,0c-0.62,0-1.23,0-1.99,0
c0-1.27,0.07-2.55,0.21-3.81c0.28-1.24,1.38-2.12,2.65-2.11c2.32-0.02,4.65-0.02,7.03-0.02v55.39c0,0-0.05,0.06-0.08,0.06
c-2.35,0-4.69,0.05-7.04,0c-1.47-0.09-2.63-1.27-2.71-2.73C9.88,56.05,9.92,55.36,9.92,54.54"/>
<path id="Pfad_9159" class="st2" d="M8.9,15.93c-0.95,0-1.89,0-2.84,0c-1.09,0-1.98-0.89-1.98-1.98c0-1.09,0.89-1.98,1.98-1.98
c1.89,0,3.79,0,5.68,0c1.09-0.06,2.03,0.77,2.1,1.86c0.06,1.09-0.77,2.03-1.86,2.1c-0.08,0-0.16,0-0.23,0
C10.79,15.92,9.85,15.92,8.9,15.93"/>
<path id="Pfad_9160" class="st2" d="M8.95,23.85c0.93,0,1.85,0,2.77,0c1.09-0.07,2.04,0.75,2.11,1.85
c0.07,1.09-0.75,2.04-1.84,2.11c-0.08,0.01-0.15,0.01-0.23,0c-1.89,0-3.79,0-5.68,0c-1.09,0.06-2.03-0.78-2.08-1.88
s0.78-2.03,1.88-2.08c0.08,0,0.16,0,0.23,0C7.05,23.85,7.99,23.85,8.95,23.85"/>
<path id="Pfad_9161" class="st2" d="M8.95,36.72c0.95,0,1.89,0,2.84,0c1.09-0.05,2.02,0.79,2.07,1.88
c0.05,1.09-0.79,2.02-1.88,2.07c-0.05,0-0.11,0-0.16,0c-1.93,0.01-3.87,0.01-5.8,0c-1.09,0.04-2.01-0.82-2.04-1.91
s0.82-2.01,1.91-2.04c0.05,0,0.11,0,0.16,0C7.02,36.72,7.98,36.72,8.95,36.72"/>
<path id="Pfad_9162" class="st2" d="M8.92,52.57c-0.95,0-1.89,0-2.84,0c-1.09,0.11-2.06-0.69-2.16-1.78s0.69-2.06,1.78-2.16
c0.12-0.01,0.25-0.01,0.37,0c1.91,0,3.83,0,5.74,0c1.09-0.05,2.02,0.79,2.07,1.88c0.05,1.09-0.79,2.02-1.88,2.07
c-0.05,0-0.11,0-0.16,0c-0.97,0-1.93,0-2.9,0"/>
<path id="Pfad_9163" class="st2" d="M44.92,30.89c2.24-2.47,2.04-6.29-0.43-8.53c-0.03-0.03-0.06-0.06-0.1-0.09
c-2.51-2.13-6.27-1.82-8.39,0.69c-1.96,2.31-1.87,5.73,0.2,7.93c-1.91,0.43-3.56,1.62-4.58,3.3c-0.87,1.73-1.2,3.69-0.95,5.61
c-3.79-4.48-3.98-10.98-0.47-15.69c4.37-5.58,12.43-6.57,18.02-2.2s6.57,12.43,2.2,18.02l0,0c0-0.86,0.03-1.61,0-2.36
c-0.03-2.76-1.72-5.23-4.28-6.27C45.75,31.15,45.34,31.01,44.92,30.89"/>
<path id="Pfad_9164" class="st2" d="M40.6,32.87c1.29-0.08,2.59-0.07,3.88,0.03c2.27,0.38,3.94,2.33,3.97,4.62
c0.04,1.34,0.02,2.68,0,4.02c-0.02,0.23-0.14,0.45-0.32,0.6c-4.5,3.32-10.63,3.32-15.13,0.02c-0.15-0.11-0.35-0.31-0.35-0.46
c-0.07-1.63-0.03-3.25,0.11-4.87c0.36-2.34,2.38-4.07,4.75-4.05c1.04-0.02,2.06,0,3.09,0C40.6,32.8,40.6,32.84,40.6,32.87"/>
<path id="Pfad_9165" class="st2" d="M40.57,22.86c2.19,0.01,3.95,1.78,3.95,3.97c-0.01,2.19-1.78,3.95-3.97,3.95
c-2.18-0.01-3.95-1.78-3.95-3.96C36.6,24.63,38.38,22.86,40.57,22.86L40.57,22.86"/>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 12 KiB

View File

@ -0,0 +1,94 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 26.5.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 64 64" style="enable-background:new 0 0 64 64;" xml:space="preserve">
<style type="text/css">
.st0{display:none;}
.st1{display:inline;fill:#72778F;}
.st2{font-family:'FontAwesome5Free-Solid';}
.st3{font-size:54.1523px;}
.st4{enable-background:new ;}
.st5{fill:#72778F;}
.st6{font-size:56.8896px;}
.st7{font-size:51.2px;}
.st8{display:inline;}
.st9{font-size:51.1997px;}
.st10{clip-path:url(#SVGID_00000129207379519052237770000007964736051681552055_);}
</style>
<g id="Transaktionen" class="st0">
<text transform="matrix(1 0 0 1 5.4236 52.4902)" class="st1 st2 st3"></text>
</g>
<g id="mein_x5F_profil">
<g class="st4">
<path class="st5" d="M56.7,51.31v4.64c0,2.96-2.4,5.35-5.35,5.35H12.11c-2.95,0-5.35-2.4-5.35-5.35v-4.64
c0-8.27,6.71-14.98,14.98-14.98h1.86c2.49,1.14,5.23,1.78,8.13,1.78s5.65-0.65,8.13-1.78h1.86C49.99,36.33,56.7,43.04,56.7,51.31z
M17.46,18.49c0-7.88,6.39-14.27,14.27-14.27S46,10.61,46,18.49s-6.39,14.27-14.27,14.27S17.46,26.37,17.46,18.49z"/>
</g>
</g>
<g id="Top_Stories" class="st0">
<text transform="matrix(1 0 0 1 0 54.8652)" class="st1 st2 st6"></text>
</g>
<g id="Senden" class="st0">
<text transform="matrix(1 0 0 1 4.882812e-04 50.6426)" class="st1 st2 st7"></text>
</g>
<g id="Home" class="st0">
<g id="Haus" transform="translate(-319.046 -300.603)" class="st8">
<path id="Pfad_9173" class="st5" d="M356.12,358.2v-15.2h-10.16v14.91c-0.37,0.12-0.75,0.21-1.13,0.26c-4.54,0-9.07,0.04-13.61,0
c-2.24-0.02-3.13-0.92-3.14-3.14c-0.03-5.84-0.03-11.69,0.03-17.53c0.02-0.72,0.32-1.41,0.83-1.92
c7.28-6.08,14.61-12.1,22.02-18.21c0.51,0.38,1.01,0.71,1.47,1.09c6.69,5.5,13.35,11.03,20.07,16.5c1.01,0.7,1.58,1.88,1.52,3.1
c-0.09,5.5-0.03,11-0.04,16.5c0,2.79-0.78,3.6-3.5,3.61C365.8,358.21,361.14,358.2,356.12,358.2z"/>
<path id="Pfad_9174" class="st5" d="M351,313.85c-8.82,7.36-17.46,14.59-26.15,21.76c-0.76,0.64-2.31,1.49-2.69,1.2
c-1.26-1.03-2.31-2.29-3.09-3.72c-0.19-0.32,0.7-1.5,1.32-2.02c8.63-7.25,17.29-14.48,25.97-21.67c0.47-0.4,0.94-0.8,1.43-1.18
c1.88-1.68,4.73-1.64,6.58,0.08c3.02,2.47,6,4.99,9.43,7.85c0-2.56,0.05-4.71-0.02-6.85c-0.05-1.55,0.49-2.29,2.14-2.21
c1.92,0.1,3.84,0.1,5.76,0c1.68-0.09,2.33,0.51,2.3,2.24c-0.08,4.54-0.1,9.08,0.03,13.61c0.08,1.03,0.54,2,1.28,2.73
c2.16,2.01,4.48,3.84,6.79,5.7c0.87,0.45,1.21,1.52,0.76,2.39c-0.11,0.21-0.26,0.4-0.44,0.55c-2.7,3.45-2.67,3.48-5.96,0.73
l-23.43-19.55C352.41,314.97,351.76,314.47,351,313.85z"/>
</g>
</g>
<g id="Community" class="st0">
<text transform="matrix(1 0 0 1 -0.0903 49.2777)" class="st1 st2 st9"></text>
</g>
<g id="Adressen" class="st0">
<g class="st8">
<defs>
<rect id="SVGID_1_" x="3.98" y="4.04" width="55.34" height="55.46"/>
</defs>
<clipPath id="SVGID_00000025415889365352747170000010559577976254934956_">
<use xlink:href="#SVGID_1_" style="overflow:visible;"/>
</clipPath>
<g id="Gruppe_4997" style="clip-path:url(#SVGID_00000025415889365352747170000010559577976254934956_);">
<path id="Pfad_9157" class="st5" d="M21.8,59.5V4.04h34.22c1.64-0.18,3.12,1,3.3,2.65c0.02,0.21,0.02,0.43,0,0.64
c0,16.29,0,32.58,0,48.88c0.17,1.65-1.02,3.12-2.67,3.29c-0.21,0.02-0.42,0.02-0.63,0H21.8 M25.72,31.78
c0.03,8.19,6.69,14.8,14.88,14.77c8.19-0.03,14.8-6.69,14.77-14.88c-0.03-8.16-6.65-14.77-14.82-14.77
C32.35,16.91,25.71,23.57,25.72,31.78C25.72,31.78,25.72,31.78,25.72,31.78"/>
<path id="Pfad_9158" class="st5" d="M9.92,54.54c0.69,0,1.33,0,1.97,0c2.19,0,3.96-1.77,3.96-3.96c0-2.18-1.77-3.95-3.96-3.96
c-0.63,0-1.27,0-1.99,0v-3.97c0.69,0,1.31,0,1.95,0c2.19,0,3.96-1.77,3.96-3.96c0-2.19-1.77-3.96-3.96-3.96
c-0.62,0-1.23,0-1.95,0v-4.95h1.8c2.19,0.11,4.05-1.57,4.16-3.76c0.11-2.19-1.57-4.05-3.76-4.16c-0.14-0.01-0.27-0.01-0.41,0
H9.89V17.9c0.69,0,1.32,0,1.96,0c2.19,0,3.96-1.77,3.96-3.96c0-2.19-1.77-3.96-3.96-3.96c0,0,0,0,0,0c-0.62,0-1.23,0-1.99,0
c0-1.27,0.07-2.55,0.21-3.81c0.28-1.24,1.38-2.12,2.65-2.11c2.32-0.02,4.65-0.02,7.03-0.02v55.39c0,0-0.05,0.06-0.08,0.06
c-2.35,0-4.69,0.05-7.04,0c-1.47-0.09-2.63-1.27-2.71-2.73C9.88,56.05,9.92,55.36,9.92,54.54"/>
<path id="Pfad_9159" class="st5" d="M8.9,15.93c-0.95,0-1.89,0-2.84,0c-1.09,0-1.98-0.89-1.98-1.98c0-1.09,0.89-1.98,1.98-1.98
c1.89,0,3.79,0,5.68,0c1.09-0.06,2.03,0.77,2.1,1.86c0.06,1.09-0.77,2.03-1.86,2.1c-0.08,0-0.16,0-0.23,0
C10.79,15.92,9.85,15.92,8.9,15.93"/>
<path id="Pfad_9160" class="st5" d="M8.95,23.85c0.93,0,1.85,0,2.77,0c1.09-0.07,2.04,0.75,2.11,1.85
c0.07,1.09-0.75,2.04-1.84,2.11c-0.08,0.01-0.15,0.01-0.23,0c-1.89,0-3.79,0-5.68,0c-1.09,0.06-2.03-0.78-2.08-1.88
s0.78-2.03,1.88-2.08c0.08,0,0.16,0,0.23,0C7.05,23.85,7.99,23.85,8.95,23.85"/>
<path id="Pfad_9161" class="st5" d="M8.95,36.72c0.95,0,1.89,0,2.84,0c1.09-0.05,2.02,0.79,2.07,1.88
c0.05,1.09-0.79,2.02-1.88,2.07c-0.05,0-0.11,0-0.16,0c-1.93,0.01-3.87,0.01-5.8,0c-1.09,0.04-2.01-0.82-2.04-1.91
s0.82-2.01,1.91-2.04c0.05,0,0.11,0,0.16,0C7.02,36.72,7.98,36.72,8.95,36.72"/>
<path id="Pfad_9162" class="st5" d="M8.92,52.57c-0.95,0-1.89,0-2.84,0c-1.09,0.11-2.06-0.69-2.16-1.78s0.69-2.06,1.78-2.16
c0.12-0.01,0.25-0.01,0.37,0c1.91,0,3.83,0,5.74,0c1.09-0.05,2.02,0.79,2.07,1.88c0.05,1.09-0.79,2.02-1.88,2.07
c-0.05,0-0.11,0-0.16,0c-0.97,0-1.93,0-2.9,0"/>
<path id="Pfad_9163" class="st5" d="M44.92,30.89c2.24-2.47,2.04-6.29-0.43-8.53c-0.03-0.03-0.06-0.06-0.1-0.09
c-2.51-2.13-6.27-1.82-8.39,0.69c-1.96,2.31-1.87,5.73,0.2,7.93c-1.91,0.43-3.56,1.62-4.58,3.3c-0.87,1.73-1.2,3.69-0.95,5.61
c-3.79-4.48-3.98-10.98-0.47-15.69c4.37-5.58,12.43-6.57,18.02-2.2s6.57,12.43,2.2,18.02l0,0c0-0.86,0.03-1.61,0-2.36
c-0.03-2.76-1.72-5.23-4.28-6.27C45.75,31.15,45.34,31.01,44.92,30.89"/>
<path id="Pfad_9164" class="st5" d="M40.6,32.87c1.29-0.08,2.59-0.07,3.88,0.03c2.27,0.38,3.94,2.33,3.97,4.62
c0.04,1.34,0.02,2.68,0,4.02c-0.02,0.23-0.14,0.45-0.32,0.6c-4.5,3.32-10.63,3.32-15.13,0.02c-0.15-0.11-0.35-0.31-0.35-0.46
c-0.07-1.63-0.03-3.25,0.11-4.87c0.36-2.34,2.38-4.07,4.75-4.05c1.04-0.02,2.06,0,3.09,0C40.6,32.8,40.6,32.84,40.6,32.87"/>
<path id="Pfad_9165" class="st5" d="M40.57,22.86c2.19,0.01,3.95,1.78,3.95,3.97c-0.01,2.19-1.78,3.95-3.97,3.95
c-2.18-0.01-3.95-1.78-3.95-3.96C36.6,24.63,38.38,22.86,40.57,22.86L40.57,22.86"/>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 6.4 KiB

View File

@ -0,0 +1,114 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 26.5.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 64 64" style="enable-background:new 0 0 64 64;" xml:space="preserve">
<style type="text/css">
.st0{display:none;}
.st1{display:inline;fill:#72778F;}
.st2{font-family:'FontAwesome5Free-Solid';}
.st3{font-size:54.1523px;}
.st4{display:inline;enable-background:new ;}
.st5{fill:#72778F;}
.st6{font-size:56.8896px;}
.st7{enable-background:new ;}
.st8{display:inline;}
.st9{clip-path:url(#SVGID_00000039131194176967667170000001588002319106732182_);}
</style>
<g id="Transaktionen" class="st0">
<text transform="matrix(1 0 0 1 5.4236 52.4902)" class="st1 st2 st3"></text>
</g>
<g id="mein_x5F_profil" class="st0">
<g class="st4">
<path class="st5" d="M56.7,51.31v4.64c0,2.96-2.4,5.35-5.35,5.35H12.11c-2.95,0-5.35-2.4-5.35-5.35v-4.64
c0-8.27,6.71-14.98,14.98-14.98h1.86c2.49,1.14,5.23,1.78,8.13,1.78s5.65-0.65,8.13-1.78h1.86C49.99,36.33,56.7,43.04,56.7,51.31z
M17.46,18.49c0-7.88,6.39-14.27,14.27-14.27S46,10.61,46,18.49s-6.39,14.27-14.27,14.27S17.46,26.37,17.46,18.49z"/>
</g>
</g>
<g id="Top_Stories" class="st0">
<text transform="matrix(1 0 0 1 0 54.8652)" class="st1 st2 st6"></text>
</g>
<g id="Senden">
<g class="st7">
<path class="st5" d="M64,12.24v38.4c0,1.77-1.43,3.2-3.2,3.2H3.2c-1.77,0-3.2-1.43-3.2-3.2v-38.4c0-1.77,1.43-3.2,3.2-3.2h57.6
C62.57,9.04,64,10.47,64,12.24z M21.87,34.12c0-2-1.3-3.78-3.16-4.34l-4.5-1.35c-0.52-0.15-0.88-0.68-0.88-1.27
c0-0.73,0.53-1.32,1.18-1.32h2.81c0.46,0,0.9,0.13,1.28,0.37c0.32,0.2,0.74,0.19,1.01-0.07l1.18-1.12
c0.35-0.34,0.33-0.92-0.06-1.21c-0.91-0.68-2.01-1.08-3.14-1.13v-1.63c0-0.44-0.36-0.8-0.8-0.8h-1.6c-0.44,0-0.8,0.36-0.8,0.8
v1.61c-2.36,0.06-4.27,2.06-4.27,4.51c0,2,1.3,3.78,3.16,4.34l4.5,1.35c0.52,0.15,0.88,0.68,0.88,1.27c0,0.73-0.53,1.32-1.18,1.32
h-2.81c-0.46,0-0.9-0.13-1.28-0.37c-0.32-0.2-0.74-0.19-1.01,0.07l-1.18,1.12c-0.35,0.34-0.33,0.92,0.06,1.21
c0.91,0.68,2.01,1.08,3.14,1.14v1.63c0,0.44,0.36,0.8,0.8,0.8h1.6c0.44,0,0.8-0.36,0.8-0.8v-1.61
C19.96,38.57,21.87,36.58,21.87,34.12z M57.6,25.84c0-0.44-0.36-0.8-0.8-0.8H29.6c-0.44,0-0.8,0.36-0.8,0.8v1.6
c0,0.44,0.36,0.8,0.8,0.8h27.2c0.44,0,0.8-0.36,0.8-0.8V25.84z M41.6,35.44c0-0.44-0.36-0.8-0.8-0.8H29.6
c-0.44,0-0.8,0.36-0.8,0.8v1.6c0,0.44,0.36,0.8,0.8,0.8h11.2c0.44,0,0.8-0.36,0.8-0.8V35.44z M57.6,35.44c0-0.44-0.36-0.8-0.8-0.8
h-8c-0.44,0-0.8,0.36-0.8,0.8v1.6c0,0.44,0.36,0.8,0.8,0.8h8c0.44,0,0.8-0.36,0.8-0.8V35.44z"/>
</g>
</g>
<g id="Home" class="st0">
<g id="Haus" transform="translate(-319.046 -300.603)" class="st8">
<path id="Pfad_9173" class="st5" d="M356.12,358.2v-15.2h-10.16v14.91c-0.37,0.12-0.75,0.21-1.13,0.26c-4.54,0-9.07,0.04-13.61,0
c-2.24-0.02-3.13-0.92-3.14-3.14c-0.03-5.84-0.03-11.69,0.03-17.53c0.02-0.72,0.32-1.41,0.83-1.92
c7.28-6.08,14.61-12.1,22.02-18.21c0.51,0.38,1.01,0.71,1.47,1.09c6.69,5.5,13.35,11.03,20.07,16.5c1.01,0.7,1.58,1.88,1.52,3.1
c-0.09,5.5-0.03,11-0.04,16.5c0,2.79-0.78,3.6-3.5,3.61C365.8,358.21,361.14,358.2,356.12,358.2z"/>
<path id="Pfad_9174" class="st5" d="M351,313.85c-8.82,7.36-17.46,14.59-26.15,21.76c-0.76,0.64-2.31,1.49-2.69,1.2
c-1.26-1.03-2.31-2.29-3.09-3.72c-0.19-0.32,0.7-1.5,1.32-2.02c8.63-7.25,17.29-14.48,25.97-21.67c0.47-0.4,0.94-0.8,1.43-1.18
c1.88-1.68,4.73-1.64,6.58,0.08c3.02,2.47,6,4.99,9.43,7.85c0-2.56,0.05-4.71-0.02-6.85c-0.05-1.55,0.49-2.29,2.14-2.21
c1.92,0.1,3.84,0.1,5.76,0c1.68-0.09,2.33,0.51,2.3,2.24c-0.08,4.54-0.1,9.08,0.03,13.61c0.08,1.03,0.54,2,1.28,2.73
c2.16,2.01,4.48,3.84,6.79,5.7c0.87,0.45,1.21,1.52,0.76,2.39c-0.11,0.21-0.26,0.4-0.44,0.55c-2.7,3.45-2.67,3.48-5.96,0.73
l-23.43-19.55C352.41,314.97,351.76,314.47,351,313.85z"/>
</g>
</g>
<g id="Community" class="st0">
<g class="st4">
<path class="st5" d="M9.7,42.88H3.11c-1.77,0-3.2-1.43-3.2-3.2v-3.2c0-3.53,2.87-6.4,6.4-6.4h6.4c1.76,0,3.35,0.71,4.51,1.86
C13.19,34.15,10.33,38.14,9.7,42.88z M3.11,20.48c0-3.53,2.87-6.4,6.4-6.4s6.4,2.87,6.4,6.4s-2.87,6.4-6.4,6.4
S3.11,24.01,3.11,20.48z M51.11,44.8v2.88c0,2.65-2.15,4.8-4.8,4.8h-28.8c-2.65,0-4.8-2.15-4.8-4.8V44.8
c0-6.36,5.16-11.52,11.52-11.52h0.83c2.09,1,4.39,1.6,6.85,1.6c2.46,0,4.77-0.6,6.85-1.6h0.83C45.95,33.28,51.11,38.44,51.11,44.8
z M20.71,18.88c0-6.19,5.01-11.2,11.2-11.2c6.19,0,11.2,5.01,11.2,11.2s-5.01,11.2-11.2,11.2C25.72,30.08,20.71,25.07,20.71,18.88
z M63.91,36.48v3.2c0,1.77-1.43,3.2-3.2,3.2h-6.6c-0.62-4.74-3.48-8.73-7.51-10.94c1.16-1.15,2.75-1.86,4.51-1.86h6.4
C61.04,30.08,63.91,32.95,63.91,36.48z M47.91,20.48c0-3.53,2.87-6.4,6.4-6.4c3.53,0,6.4,2.87,6.4,6.4s-2.87,6.4-6.4,6.4
C50.78,26.88,47.91,24.01,47.91,20.48z"/>
</g>
</g>
<g id="Adressen" class="st0">
<g class="st8">
<defs>
<rect id="SVGID_1_" x="3.98" y="4.04" width="55.34" height="55.46"/>
</defs>
<clipPath id="SVGID_00000139291908983709205020000014339602762391354759_">
<use xlink:href="#SVGID_1_" style="overflow:visible;"/>
</clipPath>
<g id="Gruppe_4997" style="clip-path:url(#SVGID_00000139291908983709205020000014339602762391354759_);">
<path id="Pfad_9157" class="st5" d="M21.8,59.5V4.04h34.22c1.64-0.18,3.12,1,3.3,2.65c0.02,0.21,0.02,0.43,0,0.64
c0,16.29,0,32.58,0,48.88c0.17,1.65-1.02,3.12-2.67,3.29c-0.21,0.02-0.42,0.02-0.63,0H21.8 M25.72,31.78
c0.03,8.19,6.69,14.8,14.88,14.77c8.19-0.03,14.8-6.69,14.77-14.88c-0.03-8.16-6.65-14.77-14.82-14.77
C32.35,16.91,25.71,23.57,25.72,31.78C25.72,31.78,25.72,31.78,25.72,31.78"/>
<path id="Pfad_9158" class="st5" d="M9.92,54.54c0.69,0,1.33,0,1.97,0c2.19,0,3.96-1.77,3.96-3.96c0-2.18-1.77-3.95-3.96-3.96
c-0.63,0-1.27,0-1.99,0v-3.97c0.69,0,1.31,0,1.95,0c2.19,0,3.96-1.77,3.96-3.96c0-2.19-1.77-3.96-3.96-3.96
c-0.62,0-1.23,0-1.95,0v-4.95h1.8c2.19,0.11,4.05-1.57,4.16-3.76c0.11-2.19-1.57-4.05-3.76-4.16c-0.14-0.01-0.27-0.01-0.41,0
H9.89V17.9c0.69,0,1.32,0,1.96,0c2.19,0,3.96-1.77,3.96-3.96c0-2.19-1.77-3.96-3.96-3.96c0,0,0,0,0,0c-0.62,0-1.23,0-1.99,0
c0-1.27,0.07-2.55,0.21-3.81c0.28-1.24,1.38-2.12,2.65-2.11c2.32-0.02,4.65-0.02,7.03-0.02v55.39c0,0-0.05,0.06-0.08,0.06
c-2.35,0-4.69,0.05-7.04,0c-1.47-0.09-2.63-1.27-2.71-2.73C9.88,56.05,9.92,55.36,9.92,54.54"/>
<path id="Pfad_9159" class="st5" d="M8.9,15.93c-0.95,0-1.89,0-2.84,0c-1.09,0-1.98-0.89-1.98-1.98c0-1.09,0.89-1.98,1.98-1.98
c1.89,0,3.79,0,5.68,0c1.09-0.06,2.03,0.77,2.1,1.86c0.06,1.09-0.77,2.03-1.86,2.1c-0.08,0-0.16,0-0.23,0
C10.79,15.92,9.85,15.92,8.9,15.93"/>
<path id="Pfad_9160" class="st5" d="M8.95,23.85c0.93,0,1.85,0,2.77,0c1.09-0.07,2.04,0.75,2.11,1.85
c0.07,1.09-0.75,2.04-1.84,2.11c-0.08,0.01-0.15,0.01-0.23,0c-1.89,0-3.79,0-5.68,0c-1.09,0.06-2.03-0.78-2.08-1.88
s0.78-2.03,1.88-2.08c0.08,0,0.16,0,0.23,0C7.05,23.85,7.99,23.85,8.95,23.85"/>
<path id="Pfad_9161" class="st5" d="M8.95,36.72c0.95,0,1.89,0,2.84,0c1.09-0.05,2.02,0.79,2.07,1.88
c0.05,1.09-0.79,2.02-1.88,2.07c-0.05,0-0.11,0-0.16,0c-1.93,0.01-3.87,0.01-5.8,0c-1.09,0.04-2.01-0.82-2.04-1.91
s0.82-2.01,1.91-2.04c0.05,0,0.11,0,0.16,0C7.02,36.72,7.98,36.72,8.95,36.72"/>
<path id="Pfad_9162" class="st5" d="M8.92,52.57c-0.95,0-1.89,0-2.84,0c-1.09,0.11-2.06-0.69-2.16-1.78s0.69-2.06,1.78-2.16
c0.12-0.01,0.25-0.01,0.37,0c1.91,0,3.83,0,5.74,0c1.09-0.05,2.02,0.79,2.07,1.88c0.05,1.09-0.79,2.02-1.88,2.07
c-0.05,0-0.11,0-0.16,0c-0.97,0-1.93,0-2.9,0"/>
<path id="Pfad_9163" class="st5" d="M44.92,30.89c2.24-2.47,2.04-6.29-0.43-8.53c-0.03-0.03-0.06-0.06-0.1-0.09
c-2.51-2.13-6.27-1.82-8.39,0.69c-1.96,2.31-1.87,5.73,0.2,7.93c-1.91,0.43-3.56,1.62-4.58,3.3c-0.87,1.73-1.2,3.69-0.95,5.61
c-3.79-4.48-3.98-10.98-0.47-15.69c4.37-5.58,12.43-6.57,18.02-2.2s6.57,12.43,2.2,18.02l0,0c0-0.86,0.03-1.61,0-2.36
c-0.03-2.76-1.72-5.23-4.28-6.27C45.75,31.15,45.34,31.01,44.92,30.89"/>
<path id="Pfad_9164" class="st5" d="M40.6,32.87c1.29-0.08,2.59-0.07,3.88,0.03c2.27,0.38,3.94,2.33,3.97,4.62
c0.04,1.34,0.02,2.68,0,4.02c-0.02,0.23-0.14,0.45-0.32,0.6c-4.5,3.32-10.63,3.32-15.13,0.02c-0.15-0.11-0.35-0.31-0.35-0.46
c-0.07-1.63-0.03-3.25,0.11-4.87c0.36-2.34,2.38-4.07,4.75-4.05c1.04-0.02,2.06,0,3.09,0C40.6,32.8,40.6,32.84,40.6,32.87"/>
<path id="Pfad_9165" class="st5" d="M40.57,22.86c2.19,0.01,3.95,1.78,3.95,3.97c-0.01,2.19-1.78,3.95-3.97,3.95
c-2.18-0.01-3.95-1.78-3.95-3.96C36.6,24.63,38.38,22.86,40.57,22.86L40.57,22.86"/>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 8.3 KiB

View File

@ -0,0 +1,152 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 26.5.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 64 64" style="enable-background:new 0 0 64 64;" xml:space="preserve">
<style type="text/css">
.st0{display:none;}
.st1{display:inline;enable-background:new ;}
.st2{fill:#72778F;}
.st3{opacity:0.6;}
.st4{enable-background:new ;}
.st5{display:inline;}
.st6{clip-path:url(#SVGID_00000125579706284381458460000010580698921969067440_);}
</style>
<g id="Transaktionen" class="st0">
<g class="st1">
<path class="st2" d="M6.74,16.53L31.37,5.35c0.34-0.16,0.73-0.24,1.13-0.24c0.4,0,0.78,0.09,1.12,0.24l24.63,11.18
c1.75,0.79,1.75,3.44,0,4.23L33.62,31.94c-0.72,0.33-1.53,0.33-2.25,0L6.74,20.76C4.99,19.97,4.99,17.32,6.74,16.53z M58.26,34.33
L33.62,45.5c-0.72,0.33-1.53,0.33-2.25,0L6.74,34.33c-1.75-0.79-1.75-3.44,0-4.23l6.14-2.78l17.09,7.75
c0.8,0.36,1.65,0.55,2.52,0.55c0.87,0,1.72-0.18,2.52-0.55l17.09-7.75l6.14,2.78C60.01,30.89,60.01,33.54,58.26,34.33z
M58.26,47.85L33.62,59.01c-0.72,0.33-1.53,0.33-2.25,0L6.74,47.85c-1.75-0.79-1.75-3.44,0-4.23l6.12-2.77l17.12,7.76
c0.8,0.36,1.65,0.55,2.52,0.55c0.87,0,1.72-0.18,2.52-0.55l17.12-7.76l6.12,2.77C60.01,44.41,60.01,47.05,58.26,47.85z"/>
</g>
</g>
<g id="mein_x5F_profil" class="st0">
<g class="st1">
<path class="st2" d="M56.7,51.31v4.64c0,2.96-2.4,5.35-5.35,5.35H12.11c-2.95,0-5.35-2.4-5.35-5.35v-4.64
c0-8.27,6.71-14.98,14.98-14.98h1.86c2.49,1.14,5.23,1.78,8.13,1.78s5.65-0.65,8.13-1.78h1.86C49.99,36.33,56.7,43.04,56.7,51.31z
M17.46,18.49c0-7.88,6.39-14.27,14.27-14.27S46,10.61,46,18.49s-6.39,14.27-14.27,14.27S17.46,26.37,17.46,18.49z"/>
</g>
</g>
<g id="Top_Stories" class="st0">
<g class="st1">
<path class="st2" d="M64,14.86v34.67c0,2.95-2.39,5.33-5.33,5.33H6.22C2.79,54.87,0,52.08,0,48.64V18.42
c0-1.47,1.19-2.67,2.67-2.67h4.44v-0.89c0-1.47,1.19-2.67,2.67-2.67h51.56C62.81,12.2,64,13.39,64,14.86z M7.11,48.64V21.09H5.33
v27.56c0,0.49,0.4,0.89,0.89,0.89C6.71,49.53,7.11,49.13,7.11,48.64z M56.89,25.09v-4.44c0-0.74-0.6-1.33-1.33-1.33h-40
c-0.74,0-1.33,0.6-1.33,1.33v4.44c0,0.74,0.6,1.33,1.33,1.33h40C56.29,26.42,56.89,25.82,56.89,25.09z M33.78,35.75v-0.89
c0-0.74-0.6-1.33-1.33-1.33H15.56c-0.74,0-1.33,0.6-1.33,1.33v0.89c0,0.74,0.6,1.33,1.33,1.33h16.89
C33.18,37.09,33.78,36.49,33.78,35.75z M33.78,46.42v-0.89c0-0.74-0.6-1.33-1.33-1.33H15.56c-0.74,0-1.33,0.6-1.33,1.33v0.89
c0,0.74,0.6,1.33,1.33,1.33h16.89C33.18,47.75,33.78,47.16,33.78,46.42z M56.89,35.75v-0.89c0-0.74-0.6-1.33-1.33-1.33H38.67
c-0.74,0-1.33,0.6-1.33,1.33v0.89c0,0.74,0.6,1.33,1.33,1.33h16.89C56.29,37.09,56.89,36.49,56.89,35.75z M56.89,46.42v-0.89
c0-0.74-0.6-1.33-1.33-1.33H38.67c-0.74,0-1.33,0.6-1.33,1.33v0.89c0,0.74,0.6,1.33,1.33,1.33h16.89
C56.29,47.75,56.89,47.16,56.89,46.42z"/>
</g>
</g>
<g id="settings">
<g id="Settings" transform="translate(1)" class="st3">
<g class="st4">
<path class="st2" d="M53,20.34c-1.17,0.82-2.79,0.54-3.61-0.63c-4.31-6.14-11.36-9.87-18.86-9.98
c-6.09-0.09-11.77,2.17-15.95,6.36c-4.01,4.01-6.17,9.34-6.08,15.02l-0.02,2.56c-0.04,1.4-1.19,2.52-2.59,2.52
c-0.03,0-0.05,0-0.08,0c-1.43-0.04-2.56-1.24-2.51-2.67l0.01-2.32C3.2,24.09,5.9,17.43,10.9,12.41
c5.19-5.19,12.16-7.97,19.7-7.88c9.16,0.14,17.77,4.69,23.03,12.19C54.45,17.89,54.17,19.51,53,20.34z M19.29,23.79
c-2.03,2.49-3.08,5.52-3.02,8.75c0.07,4.39-0.29,8.8-1.07,13.1c-0.09,0.49-0.84,2.47-3.01,2.09c-1.41-0.26-2.34-1.6-2.09-3.01
c0.72-3.97,1.05-8.04,0.98-12.1c-0.07-4.4,1.42-8.7,4.19-12.1c0.91-1.11,2.53-1.28,3.65-0.38
C20.02,21.04,20.19,22.67,19.29,23.79z M42.2,33.37c0.08,5.5-0.32,11.03-1.22,16.43c-0.08,0.5-0.82,2.49-2.98,2.14
c-1.41-0.24-2.37-1.57-2.13-2.98c0.84-5.1,1.23-10.32,1.15-15.51c-0.05-3.25-2.84-5.94-6.22-5.99c-3.73-0.01-5.93,2.85-5.88,5.65
c0.09,5.56-0.44,11.12-1.55,16.53c-0.29,1.4-1.65,2.3-3.06,2.01c-1.4-0.29-2.3-1.66-2.01-3.06c1.04-5.04,1.52-10.22,1.44-15.4
c-0.09-5.83,4.53-10.93,11.14-10.92C37.02,22.36,42.11,27.34,42.2,33.37z M50.85,33.04c0.01,0.53,0.02,0.92,0.02,1.45
c0,3.89-0.22,7.72-0.65,11.49c-0.12,1-1.07,2.49-2.87,2.28c-1.42-0.16-2.44-1.45-2.28-2.87c0.46-4.05,0.67-8.18,0.6-12.28
c-0.12-7.89-6.85-14.41-15-14.54c-1.24-0.01-2.48,0.11-3.67,0.4c-1.39,0.32-2.79-0.53-3.12-1.93s0.53-2.79,1.93-3.12
c1.61-0.38,3.28-0.58,4.95-0.54C41.66,13.57,50.68,22.38,50.85,33.04z M33.55,33.7c0.17,10.7-1.72,19.08-3.18,24.25
c-0.32,1.15-1.36,1.89-2.49,1.89c-2.27,0-2.79-2.24-2.5-3.29c2.11-7.52,3.12-15.05,2.99-22.85c0-1.43,1.16-2.59,2.59-2.59
C32.39,31.1,33.55,32.27,33.55,33.7z M58.6,34.34c-0.01,1.42-1.17,2.57-2.59,2.57h-0.02c-1.43-0.01-2.58-1.18-2.57-2.62
c0.02-2.61,0-4.34-0.51-6.65c-0.31-1.4,0.58-2.78,1.97-3.09c1.41-0.32,2.78,0.58,3.09,1.97C58.64,29.57,58.62,31.94,58.6,34.34z"
/>
</g>
</g>
</g>
<g id="Senden" class="st0">
<g class="st1">
<path class="st2" d="M64,12.24v38.4c0,1.77-1.43,3.2-3.2,3.2H3.2c-1.77,0-3.2-1.43-3.2-3.2v-38.4c0-1.77,1.43-3.2,3.2-3.2h57.6
C62.57,9.04,64,10.47,64,12.24z M21.87,34.12c0-2-1.3-3.78-3.16-4.34l-4.5-1.35c-0.52-0.15-0.88-0.68-0.88-1.27
c0-0.73,0.53-1.32,1.18-1.32h2.81c0.46,0,0.9,0.13,1.28,0.37c0.32,0.2,0.74,0.19,1.01-0.07l1.18-1.12
c0.35-0.34,0.33-0.92-0.06-1.21c-0.91-0.68-2.01-1.08-3.14-1.13v-1.63c0-0.44-0.36-0.8-0.8-0.8h-1.6c-0.44,0-0.8,0.36-0.8,0.8
v1.61c-2.36,0.06-4.27,2.06-4.27,4.51c0,2,1.3,3.78,3.16,4.34l4.5,1.35c0.52,0.15,0.88,0.68,0.88,1.27c0,0.73-0.53,1.32-1.18,1.32
h-2.81c-0.46,0-0.9-0.13-1.28-0.37c-0.32-0.2-0.74-0.19-1.01,0.07l-1.18,1.12c-0.35,0.34-0.33,0.92,0.06,1.21
c0.91,0.68,2.01,1.08,3.14,1.14v1.63c0,0.44,0.36,0.8,0.8,0.8h1.6c0.44,0,0.8-0.36,0.8-0.8v-1.61
C19.96,38.57,21.87,36.58,21.87,34.12z M57.6,25.84c0-0.44-0.36-0.8-0.8-0.8H29.6c-0.44,0-0.8,0.36-0.8,0.8v1.6
c0,0.44,0.36,0.8,0.8,0.8h27.2c0.44,0,0.8-0.36,0.8-0.8V25.84z M41.6,35.44c0-0.44-0.36-0.8-0.8-0.8H29.6
c-0.44,0-0.8,0.36-0.8,0.8v1.6c0,0.44,0.36,0.8,0.8,0.8h11.2c0.44,0,0.8-0.36,0.8-0.8V35.44z M57.6,35.44c0-0.44-0.36-0.8-0.8-0.8
h-8c-0.44,0-0.8,0.36-0.8,0.8v1.6c0,0.44,0.36,0.8,0.8,0.8h8c0.44,0,0.8-0.36,0.8-0.8V35.44z"/>
</g>
</g>
<g id="Home" class="st0">
<g id="Haus" transform="translate(-319.046 -300.603)" class="st5">
<path id="Pfad_9173" class="st2" d="M356.12,358.2v-15.2h-10.16v14.91c-0.37,0.12-0.75,0.21-1.13,0.26c-4.54,0-9.07,0.04-13.61,0
c-2.24-0.02-3.13-0.92-3.14-3.14c-0.03-5.84-0.03-11.69,0.03-17.53c0.02-0.72,0.32-1.41,0.83-1.92
c7.28-6.08,14.61-12.1,22.02-18.21c0.51,0.38,1.01,0.71,1.47,1.09c6.69,5.5,13.35,11.03,20.07,16.5c1.01,0.7,1.58,1.88,1.52,3.1
c-0.09,5.5-0.03,11-0.04,16.5c0,2.79-0.78,3.6-3.5,3.61C365.8,358.21,361.14,358.2,356.12,358.2z"/>
<path id="Pfad_9174" class="st2" d="M351,313.85c-8.82,7.36-17.46,14.59-26.15,21.76c-0.76,0.64-2.31,1.49-2.69,1.2
c-1.26-1.03-2.31-2.29-3.09-3.72c-0.19-0.32,0.7-1.5,1.32-2.02c8.63-7.25,17.29-14.48,25.97-21.67c0.47-0.4,0.94-0.8,1.43-1.18
c1.88-1.68,4.73-1.64,6.58,0.08c3.02,2.47,6,4.99,9.43,7.85c0-2.56,0.05-4.71-0.02-6.85c-0.05-1.55,0.49-2.29,2.14-2.21
c1.92,0.1,3.84,0.1,5.76,0c1.68-0.09,2.33,0.51,2.3,2.24c-0.08,4.54-0.1,9.08,0.03,13.61c0.08,1.03,0.54,2,1.28,2.73
c2.16,2.01,4.48,3.84,6.79,5.7c0.87,0.45,1.21,1.52,0.76,2.39c-0.11,0.21-0.26,0.4-0.44,0.55c-2.7,3.45-2.67,3.48-5.96,0.73
l-23.43-19.55C352.41,314.97,351.76,314.47,351,313.85z"/>
</g>
</g>
<g id="Community" class="st0">
<g class="st1">
<path class="st2" d="M9.7,42.88H3.11c-1.77,0-3.2-1.43-3.2-3.2v-3.2c0-3.53,2.87-6.4,6.4-6.4h6.4c1.76,0,3.35,0.71,4.51,1.86
C13.19,34.15,10.33,38.14,9.7,42.88z M3.11,20.48c0-3.53,2.87-6.4,6.4-6.4s6.4,2.87,6.4,6.4s-2.87,6.4-6.4,6.4
S3.11,24.01,3.11,20.48z M51.11,44.8v2.88c0,2.65-2.15,4.8-4.8,4.8h-28.8c-2.65,0-4.8-2.15-4.8-4.8V44.8
c0-6.36,5.16-11.52,11.52-11.52h0.83c2.09,1,4.39,1.6,6.85,1.6c2.46,0,4.77-0.6,6.85-1.6h0.83C45.95,33.28,51.11,38.44,51.11,44.8
z M20.71,18.88c0-6.19,5.01-11.2,11.2-11.2c6.19,0,11.2,5.01,11.2,11.2s-5.01,11.2-11.2,11.2C25.72,30.08,20.71,25.07,20.71,18.88
z M63.91,36.48v3.2c0,1.77-1.43,3.2-3.2,3.2h-6.6c-0.62-4.74-3.48-8.73-7.51-10.94c1.16-1.15,2.75-1.86,4.51-1.86h6.4
C61.04,30.08,63.91,32.95,63.91,36.48z M47.91,20.48c0-3.53,2.87-6.4,6.4-6.4c3.53,0,6.4,2.87,6.4,6.4s-2.87,6.4-6.4,6.4
C50.78,26.88,47.91,24.01,47.91,20.48z"/>
</g>
</g>
<g id="Adressen" class="st0">
<g class="st5">
<defs>
<rect id="SVGID_1_" x="3.98" y="4.04" width="55.34" height="55.46"/>
</defs>
<clipPath id="SVGID_00000101071337026672449950000008400453584463692960_">
<use xlink:href="#SVGID_1_" style="overflow:visible;"/>
</clipPath>
<g id="Gruppe_4997" style="clip-path:url(#SVGID_00000101071337026672449950000008400453584463692960_);">
<path id="Pfad_9157" class="st2" d="M21.8,59.5V4.04h34.22c1.64-0.18,3.12,1,3.3,2.65c0.02,0.21,0.02,0.43,0,0.64
c0,16.29,0,32.58,0,48.88c0.17,1.65-1.02,3.12-2.67,3.29c-0.21,0.02-0.42,0.02-0.63,0H21.8 M25.72,31.78
c0.03,8.19,6.69,14.8,14.88,14.77c8.19-0.03,14.8-6.69,14.77-14.88c-0.03-8.16-6.65-14.77-14.82-14.77
C32.35,16.91,25.71,23.57,25.72,31.78C25.72,31.78,25.72,31.78,25.72,31.78"/>
<path id="Pfad_9158" class="st2" d="M9.92,54.54c0.69,0,1.33,0,1.97,0c2.19,0,3.96-1.77,3.96-3.96c0-2.18-1.77-3.95-3.96-3.96
c-0.63,0-1.27,0-1.99,0v-3.97c0.69,0,1.31,0,1.95,0c2.19,0,3.96-1.77,3.96-3.96c0-2.19-1.77-3.96-3.96-3.96
c-0.62,0-1.23,0-1.95,0v-4.95h1.8c2.19,0.11,4.05-1.57,4.16-3.76c0.11-2.19-1.57-4.05-3.76-4.16c-0.14-0.01-0.27-0.01-0.41,0
H9.89V17.9c0.69,0,1.32,0,1.96,0c2.19,0,3.96-1.77,3.96-3.96c0-2.19-1.77-3.96-3.96-3.96c0,0,0,0,0,0c-0.62,0-1.23,0-1.99,0
c0-1.27,0.07-2.55,0.21-3.81c0.28-1.24,1.38-2.12,2.65-2.11c2.32-0.02,4.65-0.02,7.03-0.02v55.39c0,0-0.05,0.06-0.08,0.06
c-2.35,0-4.69,0.05-7.04,0c-1.47-0.09-2.63-1.27-2.71-2.73C9.88,56.05,9.92,55.36,9.92,54.54"/>
<path id="Pfad_9159" class="st2" d="M8.9,15.93c-0.95,0-1.89,0-2.84,0c-1.09,0-1.98-0.89-1.98-1.98c0-1.09,0.89-1.98,1.98-1.98
c1.89,0,3.79,0,5.68,0c1.09-0.06,2.03,0.77,2.1,1.86c0.06,1.09-0.77,2.03-1.86,2.1c-0.08,0-0.16,0-0.23,0
C10.79,15.92,9.85,15.92,8.9,15.93"/>
<path id="Pfad_9160" class="st2" d="M8.95,23.85c0.93,0,1.85,0,2.77,0c1.09-0.07,2.04,0.75,2.11,1.85
c0.07,1.09-0.75,2.04-1.84,2.11c-0.08,0.01-0.15,0.01-0.23,0c-1.89,0-3.79,0-5.68,0c-1.09,0.06-2.03-0.78-2.08-1.88
s0.78-2.03,1.88-2.08c0.08,0,0.16,0,0.23,0C7.05,23.85,7.99,23.85,8.95,23.85"/>
<path id="Pfad_9161" class="st2" d="M8.95,36.72c0.95,0,1.89,0,2.84,0c1.09-0.05,2.02,0.79,2.07,1.88
c0.05,1.09-0.79,2.02-1.88,2.07c-0.05,0-0.11,0-0.16,0c-1.93,0.01-3.87,0.01-5.8,0c-1.09,0.04-2.01-0.82-2.04-1.91
s0.82-2.01,1.91-2.04c0.05,0,0.11,0,0.16,0C7.02,36.72,7.98,36.72,8.95,36.72"/>
<path id="Pfad_9162" class="st2" d="M8.92,52.57c-0.95,0-1.89,0-2.84,0c-1.09,0.11-2.06-0.69-2.16-1.78s0.69-2.06,1.78-2.16
c0.12-0.01,0.25-0.01,0.37,0c1.91,0,3.83,0,5.74,0c1.09-0.05,2.02,0.79,2.07,1.88c0.05,1.09-0.79,2.02-1.88,2.07
c-0.05,0-0.11,0-0.16,0c-0.97,0-1.93,0-2.9,0"/>
<path id="Pfad_9163" class="st2" d="M44.92,30.89c2.24-2.47,2.04-6.29-0.43-8.53c-0.03-0.03-0.06-0.06-0.1-0.09
c-2.51-2.13-6.27-1.82-8.39,0.69c-1.96,2.31-1.87,5.73,0.2,7.93c-1.91,0.43-3.56,1.62-4.58,3.3c-0.87,1.73-1.2,3.69-0.95,5.61
c-3.79-4.48-3.98-10.98-0.47-15.69c4.37-5.58,12.43-6.57,18.02-2.2s6.57,12.43,2.2,18.02l0,0c0-0.86,0.03-1.61,0-2.36
c-0.03-2.76-1.72-5.23-4.28-6.27C45.75,31.15,45.34,31.01,44.92,30.89"/>
<path id="Pfad_9164" class="st2" d="M40.6,32.87c1.29-0.08,2.59-0.07,3.88,0.03c2.27,0.38,3.94,2.33,3.97,4.62
c0.04,1.34,0.02,2.68,0,4.02c-0.02,0.23-0.14,0.45-0.32,0.6c-4.5,3.32-10.63,3.32-15.13,0.02c-0.15-0.11-0.35-0.31-0.35-0.46
c-0.07-1.63-0.03-3.25,0.11-4.87c0.36-2.34,2.38-4.07,4.75-4.05c1.04-0.02,2.06,0,3.09,0C40.6,32.8,40.6,32.84,40.6,32.87"/>
<path id="Pfad_9165" class="st2" d="M40.57,22.86c2.19,0.01,3.95,1.78,3.95,3.97c-0.01,2.19-1.78,3.95-3.97,3.95
c-2.18-0.01-3.95-1.78-3.95-3.96C36.6,24.63,38.38,22.86,40.57,22.86L40.57,22.86"/>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 12 KiB

View File

@ -0,0 +1,128 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 26.5.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 64 64" style="enable-background:new 0 0 64 64;" xml:space="preserve">
<style type="text/css">
.st0{enable-background:new ;}
.st1{fill:#72778F;}
.st2{display:none;}
.st3{display:inline;enable-background:new ;}
.st4{display:inline;}
.st5{clip-path:url(#SVGID_00000023994710743791037210000011656225644761444505_);}
</style>
<g id="Transaktionen">
<g class="st0">
<path class="st1" d="M6.74,16.53L31.37,5.35c0.34-0.16,0.73-0.24,1.13-0.24c0.4,0,0.78,0.09,1.12,0.24l24.63,11.18
c1.75,0.79,1.75,3.44,0,4.23L33.62,31.94c-0.72,0.33-1.53,0.33-2.25,0L6.74,20.76C4.99,19.97,4.99,17.32,6.74,16.53z M58.26,34.33
L33.62,45.5c-0.72,0.33-1.53,0.33-2.25,0L6.74,34.33c-1.75-0.79-1.75-3.44,0-4.23l6.14-2.78l17.09,7.75
c0.8,0.36,1.65,0.55,2.52,0.55c0.87,0,1.72-0.18,2.52-0.55l17.09-7.75l6.14,2.78C60.01,30.89,60.01,33.54,58.26,34.33z
M58.26,47.85L33.62,59.01c-0.72,0.33-1.53,0.33-2.25,0L6.74,47.85c-1.75-0.79-1.75-3.44,0-4.23l6.12-2.77l17.12,7.76
c0.8,0.36,1.65,0.55,2.52,0.55c0.87,0,1.72-0.18,2.52-0.55l17.12-7.76l6.12,2.77C60.01,44.41,60.01,47.05,58.26,47.85z"/>
</g>
</g>
<g id="mein_x5F_profil" class="st2">
<g class="st3">
<path class="st1" d="M56.7,51.31v4.64c0,2.96-2.4,5.35-5.35,5.35H12.11c-2.95,0-5.35-2.4-5.35-5.35v-4.64
c0-8.27,6.71-14.98,14.98-14.98h1.86c2.49,1.14,5.23,1.78,8.13,1.78s5.65-0.65,8.13-1.78h1.86C49.99,36.33,56.7,43.04,56.7,51.31z
M17.46,18.49c0-7.88,6.39-14.27,14.27-14.27S46,10.61,46,18.49s-6.39,14.27-14.27,14.27S17.46,26.37,17.46,18.49z"/>
</g>
</g>
<g id="Top_Stories" class="st2">
<g class="st3">
<path class="st1" d="M64,14.86v34.67c0,2.95-2.39,5.33-5.33,5.33H6.22C2.79,54.87,0,52.08,0,48.64V18.42
c0-1.47,1.19-2.67,2.67-2.67h4.44v-0.89c0-1.47,1.19-2.67,2.67-2.67h51.56C62.81,12.2,64,13.39,64,14.86z M7.11,48.64V21.09H5.33
v27.56c0,0.49,0.4,0.89,0.89,0.89C6.71,49.53,7.11,49.13,7.11,48.64z M56.89,25.09v-4.44c0-0.74-0.6-1.33-1.33-1.33h-40
c-0.74,0-1.33,0.6-1.33,1.33v4.44c0,0.74,0.6,1.33,1.33,1.33h40C56.29,26.42,56.89,25.82,56.89,25.09z M33.78,35.75v-0.89
c0-0.74-0.6-1.33-1.33-1.33H15.56c-0.74,0-1.33,0.6-1.33,1.33v0.89c0,0.74,0.6,1.33,1.33,1.33h16.89
C33.18,37.09,33.78,36.49,33.78,35.75z M33.78,46.42v-0.89c0-0.74-0.6-1.33-1.33-1.33H15.56c-0.74,0-1.33,0.6-1.33,1.33v0.89
c0,0.74,0.6,1.33,1.33,1.33h16.89C33.18,47.75,33.78,47.16,33.78,46.42z M56.89,35.75v-0.89c0-0.74-0.6-1.33-1.33-1.33H38.67
c-0.74,0-1.33,0.6-1.33,1.33v0.89c0,0.74,0.6,1.33,1.33,1.33h16.89C56.29,37.09,56.89,36.49,56.89,35.75z M56.89,46.42v-0.89
c0-0.74-0.6-1.33-1.33-1.33H38.67c-0.74,0-1.33,0.6-1.33,1.33v0.89c0,0.74,0.6,1.33,1.33,1.33h16.89
C56.29,47.75,56.89,47.16,56.89,46.42z"/>
</g>
</g>
<g id="Senden" class="st2">
<g class="st3">
<path class="st1" d="M64,12.24v38.4c0,1.77-1.43,3.2-3.2,3.2H3.2c-1.77,0-3.2-1.43-3.2-3.2v-38.4c0-1.77,1.43-3.2,3.2-3.2h57.6
C62.57,9.04,64,10.47,64,12.24z M21.87,34.12c0-2-1.3-3.78-3.16-4.34l-4.5-1.35c-0.52-0.15-0.88-0.68-0.88-1.27
c0-0.73,0.53-1.32,1.18-1.32h2.81c0.46,0,0.9,0.13,1.28,0.37c0.32,0.2,0.74,0.19,1.01-0.07l1.18-1.12
c0.35-0.34,0.33-0.92-0.06-1.21c-0.91-0.68-2.01-1.08-3.14-1.13v-1.63c0-0.44-0.36-0.8-0.8-0.8h-1.6c-0.44,0-0.8,0.36-0.8,0.8
v1.61c-2.36,0.06-4.27,2.06-4.27,4.51c0,2,1.3,3.78,3.16,4.34l4.5,1.35c0.52,0.15,0.88,0.68,0.88,1.27c0,0.73-0.53,1.32-1.18,1.32
h-2.81c-0.46,0-0.9-0.13-1.28-0.37c-0.32-0.2-0.74-0.19-1.01,0.07l-1.18,1.12c-0.35,0.34-0.33,0.92,0.06,1.21
c0.91,0.68,2.01,1.08,3.14,1.14v1.63c0,0.44,0.36,0.8,0.8,0.8h1.6c0.44,0,0.8-0.36,0.8-0.8v-1.61
C19.96,38.57,21.87,36.58,21.87,34.12z M57.6,25.84c0-0.44-0.36-0.8-0.8-0.8H29.6c-0.44,0-0.8,0.36-0.8,0.8v1.6
c0,0.44,0.36,0.8,0.8,0.8h27.2c0.44,0,0.8-0.36,0.8-0.8V25.84z M41.6,35.44c0-0.44-0.36-0.8-0.8-0.8H29.6
c-0.44,0-0.8,0.36-0.8,0.8v1.6c0,0.44,0.36,0.8,0.8,0.8h11.2c0.44,0,0.8-0.36,0.8-0.8V35.44z M57.6,35.44c0-0.44-0.36-0.8-0.8-0.8
h-8c-0.44,0-0.8,0.36-0.8,0.8v1.6c0,0.44,0.36,0.8,0.8,0.8h8c0.44,0,0.8-0.36,0.8-0.8V35.44z"/>
</g>
</g>
<g id="Home" class="st2">
<g id="Haus" transform="translate(-319.046 -300.603)" class="st4">
<path id="Pfad_9173" class="st1" d="M356.12,358.2v-15.2h-10.16v14.91c-0.37,0.12-0.75,0.21-1.13,0.26c-4.54,0-9.07,0.04-13.61,0
c-2.24-0.02-3.13-0.92-3.14-3.14c-0.03-5.84-0.03-11.69,0.03-17.53c0.02-0.72,0.32-1.41,0.83-1.92
c7.28-6.08,14.61-12.1,22.02-18.21c0.51,0.38,1.01,0.71,1.47,1.09c6.69,5.5,13.35,11.03,20.07,16.5c1.01,0.7,1.58,1.88,1.52,3.1
c-0.09,5.5-0.03,11-0.04,16.5c0,2.79-0.78,3.6-3.5,3.61C365.8,358.21,361.14,358.2,356.12,358.2z"/>
<path id="Pfad_9174" class="st1" d="M351,313.85c-8.82,7.36-17.46,14.59-26.15,21.76c-0.76,0.64-2.31,1.49-2.69,1.2
c-1.26-1.03-2.31-2.29-3.09-3.72c-0.19-0.32,0.7-1.5,1.32-2.02c8.63-7.25,17.29-14.48,25.97-21.67c0.47-0.4,0.94-0.8,1.43-1.18
c1.88-1.68,4.73-1.64,6.58,0.08c3.02,2.47,6,4.99,9.43,7.85c0-2.56,0.05-4.71-0.02-6.85c-0.05-1.55,0.49-2.29,2.14-2.21
c1.92,0.1,3.84,0.1,5.76,0c1.68-0.09,2.33,0.51,2.3,2.24c-0.08,4.54-0.1,9.08,0.03,13.61c0.08,1.03,0.54,2,1.28,2.73
c2.16,2.01,4.48,3.84,6.79,5.7c0.87,0.45,1.21,1.52,0.76,2.39c-0.11,0.21-0.26,0.4-0.44,0.55c-2.7,3.45-2.67,3.48-5.96,0.73
l-23.43-19.55C352.41,314.97,351.76,314.47,351,313.85z"/>
</g>
</g>
<g id="Community" class="st2">
<g class="st3">
<path class="st1" d="M9.7,42.88H3.11c-1.77,0-3.2-1.43-3.2-3.2v-3.2c0-3.53,2.87-6.4,6.4-6.4h6.4c1.76,0,3.35,0.71,4.51,1.86
C13.19,34.15,10.33,38.14,9.7,42.88z M3.11,20.48c0-3.53,2.87-6.4,6.4-6.4s6.4,2.87,6.4,6.4s-2.87,6.4-6.4,6.4
S3.11,24.01,3.11,20.48z M51.11,44.8v2.88c0,2.65-2.15,4.8-4.8,4.8h-28.8c-2.65,0-4.8-2.15-4.8-4.8V44.8
c0-6.36,5.16-11.52,11.52-11.52h0.83c2.09,1,4.39,1.6,6.85,1.6c2.46,0,4.77-0.6,6.85-1.6h0.83C45.95,33.28,51.11,38.44,51.11,44.8
z M20.71,18.88c0-6.19,5.01-11.2,11.2-11.2c6.19,0,11.2,5.01,11.2,11.2s-5.01,11.2-11.2,11.2C25.72,30.08,20.71,25.07,20.71,18.88
z M63.91,36.48v3.2c0,1.77-1.43,3.2-3.2,3.2h-6.6c-0.62-4.74-3.48-8.73-7.51-10.94c1.16-1.15,2.75-1.86,4.51-1.86h6.4
C61.04,30.08,63.91,32.95,63.91,36.48z M47.91,20.48c0-3.53,2.87-6.4,6.4-6.4c3.53,0,6.4,2.87,6.4,6.4s-2.87,6.4-6.4,6.4
C50.78,26.88,47.91,24.01,47.91,20.48z"/>
</g>
</g>
<g id="Adressen" class="st2">
<g class="st4">
<defs>
<rect id="SVGID_1_" x="3.98" y="4.04" width="55.34" height="55.46"/>
</defs>
<clipPath id="SVGID_00000152973741960951679760000018000196742558351546_">
<use xlink:href="#SVGID_1_" style="overflow:visible;"/>
</clipPath>
<g id="Gruppe_4997" style="clip-path:url(#SVGID_00000152973741960951679760000018000196742558351546_);">
<path id="Pfad_9157" class="st1" d="M21.8,59.5V4.04h34.22c1.64-0.18,3.12,1,3.3,2.65c0.02,0.21,0.02,0.43,0,0.64
c0,16.29,0,32.58,0,48.88c0.17,1.65-1.02,3.12-2.67,3.29c-0.21,0.02-0.42,0.02-0.63,0H21.8 M25.72,31.78
c0.03,8.19,6.69,14.8,14.88,14.77c8.19-0.03,14.8-6.69,14.77-14.88c-0.03-8.16-6.65-14.77-14.82-14.77
C32.35,16.91,25.71,23.57,25.72,31.78C25.72,31.78,25.72,31.78,25.72,31.78"/>
<path id="Pfad_9158" class="st1" d="M9.92,54.54c0.69,0,1.33,0,1.97,0c2.19,0,3.96-1.77,3.96-3.96c0-2.18-1.77-3.95-3.96-3.96
c-0.63,0-1.27,0-1.99,0v-3.97c0.69,0,1.31,0,1.95,0c2.19,0,3.96-1.77,3.96-3.96c0-2.19-1.77-3.96-3.96-3.96
c-0.62,0-1.23,0-1.95,0v-4.95h1.8c2.19,0.11,4.05-1.57,4.16-3.76c0.11-2.19-1.57-4.05-3.76-4.16c-0.14-0.01-0.27-0.01-0.41,0
H9.89V17.9c0.69,0,1.32,0,1.96,0c2.19,0,3.96-1.77,3.96-3.96c0-2.19-1.77-3.96-3.96-3.96c0,0,0,0,0,0c-0.62,0-1.23,0-1.99,0
c0-1.27,0.07-2.55,0.21-3.81c0.28-1.24,1.38-2.12,2.65-2.11c2.32-0.02,4.65-0.02,7.03-0.02v55.39c0,0-0.05,0.06-0.08,0.06
c-2.35,0-4.69,0.05-7.04,0c-1.47-0.09-2.63-1.27-2.71-2.73C9.88,56.05,9.92,55.36,9.92,54.54"/>
<path id="Pfad_9159" class="st1" d="M8.9,15.93c-0.95,0-1.89,0-2.84,0c-1.09,0-1.98-0.89-1.98-1.98c0-1.09,0.89-1.98,1.98-1.98
c1.89,0,3.79,0,5.68,0c1.09-0.06,2.03,0.77,2.1,1.86c0.06,1.09-0.77,2.03-1.86,2.1c-0.08,0-0.16,0-0.23,0
C10.79,15.92,9.85,15.92,8.9,15.93"/>
<path id="Pfad_9160" class="st1" d="M8.95,23.85c0.93,0,1.85,0,2.77,0c1.09-0.07,2.04,0.75,2.11,1.85
c0.07,1.09-0.75,2.04-1.84,2.11c-0.08,0.01-0.15,0.01-0.23,0c-1.89,0-3.79,0-5.68,0c-1.09,0.06-2.03-0.78-2.08-1.88
s0.78-2.03,1.88-2.08c0.08,0,0.16,0,0.23,0C7.05,23.85,7.99,23.85,8.95,23.85"/>
<path id="Pfad_9161" class="st1" d="M8.95,36.72c0.95,0,1.89,0,2.84,0c1.09-0.05,2.02,0.79,2.07,1.88
c0.05,1.09-0.79,2.02-1.88,2.07c-0.05,0-0.11,0-0.16,0c-1.93,0.01-3.87,0.01-5.8,0c-1.09,0.04-2.01-0.82-2.04-1.91
s0.82-2.01,1.91-2.04c0.05,0,0.11,0,0.16,0C7.02,36.72,7.98,36.72,8.95,36.72"/>
<path id="Pfad_9162" class="st1" d="M8.92,52.57c-0.95,0-1.89,0-2.84,0c-1.09,0.11-2.06-0.69-2.16-1.78s0.69-2.06,1.78-2.16
c0.12-0.01,0.25-0.01,0.37,0c1.91,0,3.83,0,5.74,0c1.09-0.05,2.02,0.79,2.07,1.88c0.05,1.09-0.79,2.02-1.88,2.07
c-0.05,0-0.11,0-0.16,0c-0.97,0-1.93,0-2.9,0"/>
<path id="Pfad_9163" class="st1" d="M44.92,30.89c2.24-2.47,2.04-6.29-0.43-8.53c-0.03-0.03-0.06-0.06-0.1-0.09
c-2.51-2.13-6.27-1.82-8.39,0.69c-1.96,2.31-1.87,5.73,0.2,7.93c-1.91,0.43-3.56,1.62-4.58,3.3c-0.87,1.73-1.2,3.69-0.95,5.61
c-3.79-4.48-3.98-10.98-0.47-15.69c4.37-5.58,12.43-6.57,18.02-2.2s6.57,12.43,2.2,18.02l0,0c0-0.86,0.03-1.61,0-2.36
c-0.03-2.76-1.72-5.23-4.28-6.27C45.75,31.15,45.34,31.01,44.92,30.89"/>
<path id="Pfad_9164" class="st1" d="M40.6,32.87c1.29-0.08,2.59-0.07,3.88,0.03c2.27,0.38,3.94,2.33,3.97,4.62
c0.04,1.34,0.02,2.68,0,4.02c-0.02,0.23-0.14,0.45-0.32,0.6c-4.5,3.32-10.63,3.32-15.13,0.02c-0.15-0.11-0.35-0.31-0.35-0.46
c-0.07-1.63-0.03-3.25,0.11-4.87c0.36-2.34,2.38-4.07,4.75-4.05c1.04-0.02,2.06,0,3.09,0C40.6,32.8,40.6,32.84,40.6,32.87"/>
<path id="Pfad_9165" class="st1" d="M40.57,22.86c2.19,0.01,3.95,1.78,3.95,3.97c-0.01,2.19-1.78,3.95-3.97,3.95
c-2.18-0.01-3.95-1.78-3.95-3.96C36.6,24.63,38.38,22.86,40.57,22.86L40.57,22.86"/>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 9.8 KiB

View File

@ -0,0 +1,287 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 26.5.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 64 64" style="enable-background:new 0 0 64 64;" xml:space="preserve">
<style type="text/css">
.st0{display:none;}
.st1{display:inline;enable-background:new ;}
.st2{fill:#72778F;}
.st3{fill:#A2A6BB;}
.st4{display:inline;opacity:0.6;}
.st5{enable-background:new ;}
.st6{clip-path:url(#SVGID_00000095319084122216941990000003876059359341478307_);}
.st7{fill:#F5F5F5;}
.st8{fill:#CD5656;}
.st9{display:inline;}
.st10{fill:#047006;}
.st11{fill:#FFFFFF;}
.st12{fill:#C2C2C2;}
.st13{clip-path:url(#SVGID_00000067941181806368316720000002317936364391484863_);}
.st14{fill-rule:evenodd;clip-rule:evenodd;fill:#C58D38;}
.st15{clip-path:url(#SVGID_00000063591109121623545610000007980139569245760180_);}
</style>
<g id="Transaktionen" class="st0">
<g class="st1">
<path class="st2" d="M6.74,16.53L31.37,5.35c0.34-0.16,0.73-0.24,1.13-0.24c0.4,0,0.78,0.09,1.12,0.24l24.63,11.18
c1.75,0.79,1.75,3.44,0,4.23L33.62,31.94c-0.72,0.33-1.53,0.33-2.25,0L6.74,20.76C4.99,19.97,4.99,17.32,6.74,16.53z M58.26,34.33
L33.62,45.5c-0.72,0.33-1.53,0.33-2.25,0L6.74,34.33c-1.75-0.79-1.75-3.44,0-4.23l6.14-2.78l17.09,7.75
c0.8,0.36,1.65,0.55,2.52,0.55c0.87,0,1.72-0.18,2.52-0.55l17.09-7.75l6.14,2.78C60.01,30.89,60.01,33.54,58.26,34.33z
M58.26,47.85L33.62,59.01c-0.72,0.33-1.53,0.33-2.25,0L6.74,47.85c-1.75-0.79-1.75-3.44,0-4.23l6.12-2.77l17.12,7.76
c0.8,0.36,1.65,0.55,2.52,0.55c0.87,0,1.72-0.18,2.52-0.55l17.12-7.76l6.12,2.77C60.01,44.41,60.01,47.05,58.26,47.85z"/>
</g>
</g>
<g id="Top_Stories" class="st0">
<g class="st1">
<path class="st2" d="M64,14.86v34.67c0,2.95-2.39,5.33-5.33,5.33H6.22C2.79,54.87,0,52.08,0,48.64V18.42
c0-1.47,1.19-2.67,2.67-2.67h4.44v-0.89c0-1.47,1.19-2.67,2.67-2.67h51.56C62.81,12.2,64,13.39,64,14.86z M7.11,48.64V21.09H5.33
v27.56c0,0.49,0.4,0.89,0.89,0.89C6.71,49.53,7.11,49.13,7.11,48.64z M56.89,25.09v-4.44c0-0.74-0.6-1.33-1.33-1.33h-40
c-0.74,0-1.33,0.6-1.33,1.33v4.44c0,0.74,0.6,1.33,1.33,1.33h40C56.29,26.42,56.89,25.82,56.89,25.09z M33.78,35.75v-0.89
c0-0.74-0.6-1.33-1.33-1.33H15.56c-0.74,0-1.33,0.6-1.33,1.33v0.89c0,0.74,0.6,1.33,1.33,1.33h16.89
C33.18,37.09,33.78,36.49,33.78,35.75z M33.78,46.42v-0.89c0-0.74-0.6-1.33-1.33-1.33H15.56c-0.74,0-1.33,0.6-1.33,1.33v0.89
c0,0.74,0.6,1.33,1.33,1.33h16.89C33.18,47.75,33.78,47.16,33.78,46.42z M56.89,35.75v-0.89c0-0.74-0.6-1.33-1.33-1.33H38.67
c-0.74,0-1.33,0.6-1.33,1.33v0.89c0,0.74,0.6,1.33,1.33,1.33h16.89C56.29,37.09,56.89,36.49,56.89,35.75z M56.89,46.42v-0.89
c0-0.74-0.6-1.33-1.33-1.33H38.67c-0.74,0-1.33,0.6-1.33,1.33v0.89c0,0.74,0.6,1.33,1.33,1.33h16.89
C56.29,47.75,56.89,47.16,56.89,46.42z"/>
</g>
</g>
<g id="share" class="st0">
<g class="st1">
<path class="st3" d="M63.85,56.87c0,3.77-3.05,6.82-6.82,6.82H6.98c-3.77,0-6.82-3.06-6.82-6.82V6.82C0.15,3.06,3.21,0,6.98,0
h50.05c3.77,0,6.82,3.06,6.82,6.82V56.87z M38,39.62l-9.66-5.79c0.16-0.64,0.25-1.3,0.25-1.98c0-0.68-0.09-1.34-0.25-1.97
l9.66-5.8c1.42,1.3,3.3,2.09,5.37,2.09c4.4,0,7.96-3.56,7.96-7.96s-3.57-7.96-7.96-7.96s-7.96,3.56-7.96,7.96
c0,0.68,0.09,1.34,0.25,1.98L26,25.97c-1.42-1.3-3.3-2.09-5.37-2.09c-4.4,0-7.96,3.56-7.96,7.96s3.57,7.96,7.96,7.96
c2.07,0,3.96-0.79,5.37-2.08l9.66,5.79c-0.16,0.63-0.25,1.29-0.25,1.98c0,4.4,3.57,7.96,7.96,7.96s7.96-3.56,7.96-7.96
s-3.57-7.96-7.96-7.96C41.3,37.53,39.42,38.33,38,39.62z"/>
</g>
</g>
<g id="settings" class="st0">
<g id="Settings" transform="translate(1)" class="st4">
<g class="st5">
<path class="st2" d="M53,20.34c-1.17,0.82-2.79,0.54-3.61-0.63c-4.31-6.14-11.36-9.87-18.86-9.98
c-6.09-0.09-11.77,2.17-15.95,6.36c-4.01,4.01-6.17,9.34-6.08,15.02l-0.02,2.56c-0.04,1.4-1.19,2.52-2.59,2.52
c-0.03,0-0.05,0-0.08,0c-1.43-0.04-2.56-1.24-2.51-2.67l0.01-2.32C3.2,24.09,5.9,17.43,10.9,12.41
c5.19-5.19,12.16-7.97,19.7-7.88c9.16,0.14,17.77,4.69,23.03,12.19C54.45,17.89,54.17,19.51,53,20.34z M19.29,23.79
c-2.03,2.49-3.08,5.52-3.02,8.75c0.07,4.39-0.29,8.8-1.07,13.1c-0.09,0.49-0.84,2.47-3.01,2.09c-1.41-0.26-2.34-1.6-2.09-3.01
c0.72-3.97,1.05-8.04,0.98-12.1c-0.07-4.4,1.42-8.7,4.19-12.1c0.91-1.11,2.53-1.28,3.65-0.38
C20.02,21.04,20.19,22.67,19.29,23.79z M42.2,33.37c0.08,5.5-0.32,11.03-1.22,16.43c-0.08,0.5-0.82,2.49-2.98,2.14
c-1.41-0.24-2.37-1.57-2.13-2.98c0.84-5.1,1.23-10.32,1.15-15.51c-0.05-3.25-2.84-5.94-6.22-5.99c-3.73-0.01-5.93,2.85-5.88,5.65
c0.09,5.56-0.44,11.12-1.55,16.53c-0.29,1.4-1.65,2.3-3.06,2.01c-1.4-0.29-2.3-1.66-2.01-3.06c1.04-5.04,1.52-10.22,1.44-15.4
c-0.09-5.83,4.53-10.93,11.14-10.92C37.02,22.36,42.11,27.34,42.2,33.37z M50.85,33.04c0.01,0.53,0.02,0.92,0.02,1.45
c0,3.89-0.22,7.72-0.65,11.49c-0.12,1-1.07,2.49-2.87,2.28c-1.42-0.16-2.44-1.45-2.28-2.87c0.46-4.05,0.67-8.18,0.6-12.28
c-0.12-7.89-6.85-14.41-15-14.54c-1.24-0.01-2.48,0.11-3.67,0.4c-1.39,0.32-2.79-0.53-3.12-1.93s0.53-2.79,1.93-3.12
c1.61-0.38,3.28-0.58,4.95-0.54C41.66,13.57,50.68,22.38,50.85,33.04z M33.55,33.7c0.17,10.7-1.72,19.08-3.18,24.25
c-0.32,1.15-1.36,1.89-2.49,1.89c-2.27,0-2.79-2.24-2.5-3.29c2.11-7.52,3.12-15.05,2.99-22.85c0-1.43,1.16-2.59,2.59-2.59
C32.39,31.1,33.55,32.27,33.55,33.7z M58.6,34.34c-0.01,1.42-1.17,2.57-2.59,2.57h-0.02c-1.43-0.01-2.58-1.18-2.57-2.62
c0.02-2.61,0-4.34-0.51-6.65c-0.31-1.4,0.58-2.78,1.97-3.09c1.41-0.32,2.78,0.58,3.09,1.97C58.64,29.57,58.62,31.94,58.6,34.34z"
/>
</g>
</g>
</g>
<g id="Senden" class="st0">
<g class="st1">
<path class="st2" d="M64,12.24v38.4c0,1.77-1.43,3.2-3.2,3.2H3.2c-1.77,0-3.2-1.43-3.2-3.2v-38.4c0-1.77,1.43-3.2,3.2-3.2h57.6
C62.57,9.04,64,10.47,64,12.24z M21.87,34.12c0-2-1.3-3.78-3.16-4.34l-4.5-1.35c-0.52-0.15-0.88-0.68-0.88-1.27
c0-0.73,0.53-1.32,1.18-1.32h2.81c0.46,0,0.9,0.13,1.28,0.37c0.32,0.2,0.74,0.19,1.01-0.07l1.18-1.12
c0.35-0.34,0.33-0.92-0.06-1.21c-0.91-0.68-2.01-1.08-3.14-1.13v-1.63c0-0.44-0.36-0.8-0.8-0.8h-1.6c-0.44,0-0.8,0.36-0.8,0.8
v1.61c-2.36,0.06-4.27,2.06-4.27,4.51c0,2,1.3,3.78,3.16,4.34l4.5,1.35c0.52,0.15,0.88,0.68,0.88,1.27c0,0.73-0.53,1.32-1.18,1.32
h-2.81c-0.46,0-0.9-0.13-1.28-0.37c-0.32-0.2-0.74-0.19-1.01,0.07l-1.18,1.12c-0.35,0.34-0.33,0.92,0.06,1.21
c0.91,0.68,2.01,1.08,3.14,1.14v1.63c0,0.44,0.36,0.8,0.8,0.8h1.6c0.44,0,0.8-0.36,0.8-0.8v-1.61
C19.96,38.57,21.87,36.58,21.87,34.12z M57.6,25.84c0-0.44-0.36-0.8-0.8-0.8H29.6c-0.44,0-0.8,0.36-0.8,0.8v1.6
c0,0.44,0.36,0.8,0.8,0.8h27.2c0.44,0,0.8-0.36,0.8-0.8V25.84z M41.6,35.44c0-0.44-0.36-0.8-0.8-0.8H29.6
c-0.44,0-0.8,0.36-0.8,0.8v1.6c0,0.44,0.36,0.8,0.8,0.8h11.2c0.44,0,0.8-0.36,0.8-0.8V35.44z M57.6,35.44c0-0.44-0.36-0.8-0.8-0.8
h-8c-0.44,0-0.8,0.36-0.8,0.8v1.6c0,0.44,0.36,0.8,0.8,0.8h8c0.44,0,0.8-0.36,0.8-0.8V35.44z"/>
</g>
</g>
<g id="Schreiben">
<g id="schreiben_icon" transform="translate(0 0)">
<g>
<defs>
<rect id="SVGID_1_" x="0.42" width="63.16" height="64"/>
</defs>
<clipPath id="SVGID_00000104686239521587677620000005551387290565555606_">
<use xlink:href="#SVGID_1_" style="overflow:visible;"/>
</clipPath>
<g id="Gruppe_4994" transform="translate(0 0)" style="clip-path:url(#SVGID_00000104686239521587677620000005551387290565555606_);">
<path id="Pfad_9152" class="st7" d="M62.97,12.37c-0.99,5.81-2.55,11.52-4.67,17.02c-0.15,0.36-0.44,0.66-0.79,0.83
c-4.29,1.79-8.6,3.55-12.9,5.32c-0.19,0.08-0.37,0.17-0.56,0.26l0.03,0.1H55.5c-1.04,1.72-2,3.34-3,4.93
c-0.19,0.28-0.46,0.51-0.78,0.64c-3.73,1.54-7.47,3.05-11.21,4.57l-4.36,1.77v0.14H46.4c-4.89,4.43-11.09,7.15-17.66,7.76
c-4.8,0.44-9.65,0.09-14.34-1.03c-0.39-0.12-0.82,0-1.07,0.32c-2.61,2.68-5.22,5.34-7.85,8c-1.06,1.22-2.91,1.36-4.13,0.3
c-0.35-0.3-0.62-0.68-0.79-1.11c-0.04-0.07-0.09-0.14-0.13-0.2v-2.01c0.44-0.62,0.92-1.21,1.42-1.78
c9.79-9.98,19.6-19.95,29.41-29.91c0.38-0.38,0.77-0.75,1.12-1.16c0.55-0.62,0.66-1.52,0.26-2.25
c-0.36-0.73-1.17-1.13-1.97-0.98c-0.51,0.14-0.97,0.41-1.35,0.79C22.63,31.45,15.95,38.22,9.28,45
c-0.15,0.16-0.32,0.3-0.53,0.51c-0.03-0.16-0.04-0.23-0.06-0.31c-0.44-3.19-0.52-6.42-0.25-9.64c0.43-5.66,2.37-11.1,5.62-15.75
c3.72-5.09,8.63-9.19,14.3-11.94c8.28-4,17.17-6.58,26.3-7.63c2.65-0.57,5.42-0.33,7.93,0.69C64.22,2.22,63.45,8.98,62.97,12.37
"/>
</g>
</g>
</g>
</g>
<g id="mein_x5F_profil" class="st0">
<g class="st1">
<path class="st2" d="M56.7,51.31v4.64c0,2.96-2.4,5.35-5.35,5.35H12.11c-2.95,0-5.35-2.4-5.35-5.35v-4.64
c0-8.27,6.71-14.98,14.98-14.98h1.86c2.49,1.14,5.23,1.78,8.13,1.78s5.65-0.65,8.13-1.78h1.86C49.99,36.33,56.7,43.04,56.7,51.31z
M17.46,18.49c0-7.88,6.39-14.27,14.27-14.27S46,10.61,46,18.49s-6.39,14.27-14.27,14.27S17.46,26.37,17.46,18.49z"/>
</g>
</g>
<g id="logout" class="st0">
<g class="st1">
<path class="st8" d="M22.86,56.38H12.19C5.46,56.38,0,50.92,0,44.19V19.81C0,13.08,5.46,7.62,12.19,7.62h10.67
c0.84,0,1.52,0.69,1.52,1.52v5.08c0,0.84-0.69,1.52-1.52,1.52H12.19c-2.25,0-4.06,1.82-4.06,4.06v24.38
c0,2.25,1.82,4.06,4.06,4.06h10.67c0.84,0,1.52,0.69,1.52,1.52v5.08C24.38,55.69,23.7,56.38,22.86,56.38z M41.78,55.49
c-1.9,1.9-5.21,0.57-5.21-2.16V41.14H19.3c-1.69,0-3.05-1.36-3.05-3.05V25.9c0-1.69,1.36-3.05,3.05-3.05h17.27V10.66
c0-2.72,3.29-4.06,5.21-2.16l21.33,21.33c1.18,1.19,1.18,3.12,0,4.32L41.78,55.49z"/>
</g>
</g>
<g id="info" class="st0">
<g id="Infobutton" transform="translate(0 -0.001)" class="st9">
<circle id="Ellipse_4" class="st10" cx="32" cy="32" r="32"/>
<rect id="Rechteck_49" x="28" y="28" class="st11" width="8" height="24"/>
<circle id="Ellipse_5" class="st11" cx="32" cy="20" r="4"/>
</g>
</g>
<g id="inactive" class="st0">
<g id="Gruppe_4989_00000054225602090163449300000007297713312140317098_" transform="translate(-772 -261.959)" class="st9">
<g id="Ellipse_17_00000142858137041837963310000001425871925284973490_" transform="translate(772 261.959)">
<circle class="st11" cx="32" cy="32" r="31.17"/>
<path class="st12" d="M32,64C14.35,64,0,49.64,0,32S14.35,0,32,0c17.65,0,32,14.35,32,32S49.65,64,32,64z M32,1.43
C15.14,1.43,1.43,15.14,1.43,32c0,16.85,13.71,30.57,30.57,30.57S62.57,48.85,62.57,32C62.57,15.14,48.85,1.43,32,1.43z"/>
</g>
</g>
</g>
<g id="vergaenglichkeit" class="st0">
<g class="st9">
<defs>
<rect id="SVGID_00000070085415845568073820000001771536674054423175_" x="8" width="48" height="64"/>
</defs>
<clipPath id="SVGID_00000085938528792957493290000002016998437306479290_">
<use xlink:href="#SVGID_00000070085415845568073820000001771536674054423175_" style="overflow:visible;"/>
</clipPath>
<g id="Gruppe_4987" style="clip-path:url(#SVGID_00000085938528792957493290000002016998437306479290_);">
<path id="Pfad_9145" class="st14" d="M30.49,7.29c-2.57,2.79-5.01,5.68-7.32,8.67c-3,3.84-5.62,7.95-7.84,12.28
C13.36,31.86,12.22,35.88,12,40c0,0,10,6,20,2.01c6.38-2.4,13.27-3.09,20-2.01c0-4.8-3.19-8.63-8.73-14.8l-0.12-0.13
C38.04,19.83,33.77,13.83,30.49,7.29L30.49,7.29z M28.84,3.2C30.76,1.18,32,0,32,0c0.42,1.41,0.92,2.79,1.48,4.15
c3.15,6.83,7.48,13.06,12.79,18.4C51.51,28.39,56,33.38,56,40c0,6.36-2.53,12.47-7.03,16.97c-1.11,1.11-2.33,2.11-3.64,2.98
c-6.66,4.45-15.11,5.29-22.52,2.22c-1.45-0.6-2.84-1.34-4.15-2.22c-5.29-3.54-8.96-9.03-10.21-15.27C8.15,43.14,8,41.57,8,40
C8,26.67,22.32,10.07,28.84,3.2"/>
<path id="Pfad_9146" class="st14" d="M18.21,31.1c2.18-4.55,5-8.76,8.37-12.52l2.83,2.83c-3.07,3.45-5.63,7.31-7.63,11.47
L18.21,31.1z"/>
</g>
</g>
</g>
<g id="favorit" class="st0">
<g class="st1">
<path class="st2" d="M8.08,6c0-3.31,2.69-6,6-6h36c3.31,0,6,2.69,6,6v58l-24-14l-24,14V6z"/>
</g>
</g>
<g id="Home" class="st0">
<g id="Haus" transform="translate(-319.046 -300.603)" class="st9">
<path id="Pfad_9173" class="st2" d="M356.12,358.2v-15.2h-10.16v14.91c-0.37,0.12-0.75,0.21-1.13,0.26c-4.54,0-9.07,0.04-13.61,0
c-2.24-0.02-3.13-0.92-3.14-3.14c-0.03-5.84-0.03-11.69,0.03-17.53c0.02-0.72,0.32-1.41,0.83-1.92
c7.28-6.08,14.61-12.1,22.02-18.21c0.51,0.38,1.01,0.71,1.47,1.09c6.69,5.5,13.35,11.03,20.07,16.5c1.01,0.7,1.58,1.88,1.52,3.1
c-0.09,5.5-0.03,11-0.04,16.5c0,2.79-0.78,3.6-3.5,3.61C365.8,358.21,361.14,358.2,356.12,358.2z"/>
<path id="Pfad_9174" class="st2" d="M351,313.85c-8.82,7.36-17.46,14.59-26.15,21.76c-0.76,0.64-2.31,1.49-2.69,1.2
c-1.26-1.03-2.31-2.29-3.09-3.72c-0.19-0.32,0.7-1.5,1.32-2.02c8.63-7.25,17.29-14.48,25.97-21.67c0.47-0.4,0.94-0.8,1.43-1.18
c1.88-1.68,4.73-1.64,6.58,0.08c3.02,2.47,6,4.99,9.43,7.85c0-2.56,0.05-4.71-0.02-6.85c-0.05-1.55,0.49-2.29,2.14-2.21
c1.92,0.1,3.84,0.1,5.76,0c1.68-0.09,2.33,0.51,2.3,2.24c-0.08,4.54-0.1,9.08,0.03,13.61c0.08,1.03,0.54,2,1.28,2.73
c2.16,2.01,4.48,3.84,6.79,5.7c0.87,0.45,1.21,1.52,0.76,2.39c-0.11,0.21-0.26,0.4-0.44,0.55c-2.7,3.45-2.67,3.48-5.96,0.73
l-23.43-19.55C352.41,314.97,351.76,314.47,351,313.85z"/>
</g>
</g>
<g id="drop_down" class="st0">
<g id="arrow" transform="translate(17.958 0.75) rotate(90)" class="st9">
<g>
<ellipse id="Ellipse_75_00000110457846241914254590000001499777333948890023_" transform="matrix(2.535182e-06 1 -1 2.535182e-06 17.2081 -45.2926)" class="st7" cx="31.25" cy="-14.04" rx="28.43" ry="29.06"/>
<path class="st2" d="M62.75-14.04c0,17.05-14.13,30.91-31.5,30.91C13.88,16.87-0.25,3-0.25-14.04c0-17.04,14.13-30.91,31.5-30.91
C48.62-44.95,62.75-31.09,62.75-14.04z M4.63-14.04c0,14.31,11.94,25.96,26.62,25.96c14.68,0,26.62-11.64,26.62-25.96
C57.87-28.35,45.93-40,31.25-40C16.57-40,4.63-28.35,4.63-14.04z"/>
</g>
<polygon class="st2" points="39.8,-13.64 27.39,-1.23 23.65,-4.97 32.32,-13.64 23.65,-22.31 27.39,-26.05 "/>
</g>
</g>
<g id="Community" class="st0">
<g class="st1">
<path class="st2" d="M9.7,42.88H3.11c-1.77,0-3.2-1.43-3.2-3.2v-3.2c0-3.53,2.87-6.4,6.4-6.4h6.4c1.76,0,3.35,0.71,4.51,1.86
C13.19,34.15,10.33,38.14,9.7,42.88z M3.11,20.48c0-3.53,2.87-6.4,6.4-6.4s6.4,2.87,6.4,6.4s-2.87,6.4-6.4,6.4
S3.11,24.01,3.11,20.48z M51.11,44.8v2.88c0,2.65-2.15,4.8-4.8,4.8h-28.8c-2.65,0-4.8-2.15-4.8-4.8V44.8
c0-6.36,5.16-11.52,11.52-11.52h0.83c2.09,1,4.39,1.6,6.85,1.6c2.46,0,4.77-0.6,6.85-1.6h0.83C45.95,33.28,51.11,38.44,51.11,44.8
z M20.71,18.88c0-6.19,5.01-11.2,11.2-11.2c6.19,0,11.2,5.01,11.2,11.2s-5.01,11.2-11.2,11.2C25.72,30.08,20.71,25.07,20.71,18.88
z M63.91,36.48v3.2c0,1.77-1.43,3.2-3.2,3.2h-6.6c-0.62-4.74-3.48-8.73-7.51-10.94c1.16-1.15,2.75-1.86,4.51-1.86h6.4
C61.04,30.08,63.91,32.95,63.91,36.48z M47.91,20.48c0-3.53,2.87-6.4,6.4-6.4c3.53,0,6.4,2.87,6.4,6.4s-2.87,6.4-6.4,6.4
C50.78,26.88,47.91,24.01,47.91,20.48z"/>
</g>
</g>
<g id="coin_x5F_icon" class="st0">
<g class="st1">
<path class="st10" d="M46.41,30.2c0,4.98-9.68,9.01-21.62,9.01S3.17,35.18,3.17,30.2s9.68-9.01,21.62-9.01S46.41,25.22,46.41,30.2
z M24.79,42.81c8.46,0,16.97-1.98,21.62-5.81v5.81c0,3.98-9.68,7.21-21.62,7.21S3.17,46.79,3.17,42.81V37
C7.82,40.83,16.34,42.81,24.79,42.81z M24.79,53.62c8.47,0,16.97-1.53,21.62-4.81v4.81c0,3.98-9.68,7.21-21.62,7.21
S3.17,57.6,3.17,53.62v-4.81C7.82,52.09,16.32,53.62,24.79,53.62z M17.59,10.38c0-3.98,9.68-7.21,21.62-7.21
s21.62,3.23,21.62,7.21s-9.68,7.21-21.62,7.21S17.59,14.35,17.59,10.38z M42.73,21.09c7.23-0.36,14.1-1.88,18.1-4.71v4.81
c0,2.74-4.58,5.12-11.34,6.34C48.5,24.86,46.06,22.7,42.73,21.09z M50.02,31.08c4.36-0.78,8.2-2.04,10.81-3.89V32
c0,2.67-4.36,4.99-10.81,6.24V31.08z"/>
</g>
</g>
<g id="clock" class="st0">
<g class="st1">
<path class="st2" d="M64,32c0,17.68-14.32,32-32,32C14.32,64,0,49.68,0,32S14.32,0,32,0C49.68,0,64,14.32,64,32z M44.39,39.1
c0-0.65-0.3-1.23-0.78-1.61L36.13,32V13.42c0-1.14-0.92-2.06-2.06-2.06h-4.13c-1.14,0-2.06,0.93-2.06,2.06v20.07
c0,1.63,0.75,3.08,1.94,4.03l8.64,6.41c0.35,0.28,0.8,0.45,1.29,0.45c0.65,0,1.23-0.3,1.61-0.78l2.58-3.23
C44.22,40.03,44.39,39.58,44.39,39.1z"/>
</g>
</g>
<g id="Adressen" class="st0">
<g class="st9">
<defs>
<rect id="SVGID_00000098937621113595409810000007709929726849059466_" x="3.98" y="4.04" width="55.34" height="55.46"/>
</defs>
<clipPath id="SVGID_00000011012408749757469700000003862327475291214757_">
<use xlink:href="#SVGID_00000098937621113595409810000007709929726849059466_" style="overflow:visible;"/>
</clipPath>
<g id="Gruppe_4997" style="clip-path:url(#SVGID_00000011012408749757469700000003862327475291214757_);">
<path id="Pfad_9157" class="st2" d="M21.8,59.5V4.04h34.22c1.64-0.18,3.12,1,3.3,2.65c0.02,0.21,0.02,0.43,0,0.64
c0,16.29,0,32.58,0,48.88c0.17,1.65-1.02,3.12-2.67,3.29c-0.21,0.02-0.42,0.02-0.63,0H21.8 M25.72,31.78
c0.03,8.19,6.69,14.8,14.88,14.77c8.19-0.03,14.8-6.69,14.77-14.88c-0.03-8.16-6.65-14.77-14.82-14.77
C32.35,16.91,25.71,23.57,25.72,31.78C25.72,31.78,25.72,31.78,25.72,31.78"/>
<path id="Pfad_9158" class="st2" d="M9.92,54.54c0.69,0,1.33,0,1.97,0c2.19,0,3.96-1.77,3.96-3.96c0-2.18-1.77-3.95-3.96-3.96
c-0.63,0-1.27,0-1.99,0v-3.97c0.69,0,1.31,0,1.95,0c2.19,0,3.96-1.77,3.96-3.96c0-2.19-1.77-3.96-3.96-3.96
c-0.62,0-1.23,0-1.95,0v-4.95h1.8c2.19,0.11,4.05-1.57,4.16-3.76c0.11-2.19-1.57-4.05-3.76-4.16c-0.14-0.01-0.27-0.01-0.41,0
H9.89V17.9c0.69,0,1.32,0,1.96,0c2.19,0,3.96-1.77,3.96-3.96c0-2.19-1.77-3.96-3.96-3.96c0,0,0,0,0,0c-0.62,0-1.23,0-1.99,0
c0-1.27,0.07-2.55,0.21-3.81c0.28-1.24,1.38-2.12,2.65-2.11c2.32-0.02,4.65-0.02,7.03-0.02v55.39c0,0-0.05,0.06-0.08,0.06
c-2.35,0-4.69,0.05-7.04,0c-1.47-0.09-2.63-1.27-2.71-2.73C9.88,56.05,9.92,55.36,9.92,54.54"/>
<path id="Pfad_9159" class="st2" d="M8.9,15.93c-0.95,0-1.89,0-2.84,0c-1.09,0-1.98-0.89-1.98-1.98c0-1.09,0.89-1.98,1.98-1.98
c1.89,0,3.79,0,5.68,0c1.09-0.06,2.03,0.77,2.1,1.86c0.06,1.09-0.77,2.03-1.86,2.1c-0.08,0-0.16,0-0.23,0
C10.79,15.92,9.85,15.92,8.9,15.93"/>
<path id="Pfad_9160" class="st2" d="M8.95,23.85c0.93,0,1.85,0,2.77,0c1.09-0.07,2.04,0.75,2.11,1.85
c0.07,1.09-0.75,2.04-1.84,2.11c-0.08,0.01-0.15,0.01-0.23,0c-1.89,0-3.79,0-5.68,0c-1.09,0.06-2.03-0.78-2.08-1.88
s0.78-2.03,1.88-2.08c0.08,0,0.16,0,0.23,0C7.05,23.85,7.99,23.85,8.95,23.85"/>
<path id="Pfad_9161" class="st2" d="M8.95,36.72c0.95,0,1.89,0,2.84,0c1.09-0.05,2.02,0.79,2.07,1.88
c0.05,1.09-0.79,2.02-1.88,2.07c-0.05,0-0.11,0-0.16,0c-1.93,0.01-3.87,0.01-5.8,0c-1.09,0.04-2.01-0.82-2.04-1.91
s0.82-2.01,1.91-2.04c0.05,0,0.11,0,0.16,0C7.02,36.72,7.98,36.72,8.95,36.72"/>
<path id="Pfad_9162" class="st2" d="M8.92,52.57c-0.95,0-1.89,0-2.84,0c-1.09,0.11-2.06-0.69-2.16-1.78s0.69-2.06,1.78-2.16
c0.12-0.01,0.25-0.01,0.37,0c1.91,0,3.83,0,5.74,0c1.09-0.05,2.02,0.79,2.07,1.88c0.05,1.09-0.79,2.02-1.88,2.07
c-0.05,0-0.11,0-0.16,0c-0.97,0-1.93,0-2.9,0"/>
<path id="Pfad_9163" class="st2" d="M44.92,30.89c2.24-2.47,2.04-6.29-0.43-8.53c-0.03-0.03-0.06-0.06-0.1-0.09
c-2.51-2.13-6.27-1.82-8.39,0.69c-1.96,2.31-1.87,5.73,0.2,7.93c-1.91,0.43-3.56,1.62-4.58,3.3c-0.87,1.73-1.2,3.69-0.95,5.61
c-3.79-4.48-3.98-10.98-0.47-15.69c4.37-5.58,12.43-6.57,18.02-2.2s6.57,12.43,2.2,18.02l0,0c0-0.86,0.03-1.61,0-2.36
c-0.03-2.76-1.72-5.23-4.28-6.27C45.75,31.15,45.34,31.01,44.92,30.89"/>
<path id="Pfad_9164" class="st2" d="M40.6,32.87c1.29-0.08,2.59-0.07,3.88,0.03c2.27,0.38,3.94,2.33,3.97,4.62
c0.04,1.34,0.02,2.68,0,4.02c-0.02,0.23-0.14,0.45-0.32,0.6c-4.5,3.32-10.63,3.32-15.13,0.02c-0.15-0.11-0.35-0.31-0.35-0.46
c-0.07-1.63-0.03-3.25,0.11-4.87c0.36-2.34,2.38-4.07,4.75-4.05c1.04-0.02,2.06,0,3.09,0C40.6,32.8,40.6,32.84,40.6,32.87"/>
<path id="Pfad_9165" class="st2" d="M40.57,22.86c2.19,0.01,3.95,1.78,3.95,3.97c-0.01,2.19-1.78,3.95-3.97,3.95
c-2.18-0.01-3.95-1.78-3.95-3.96C36.6,24.63,38.38,22.86,40.57,22.86L40.57,22.86"/>
</g>
</g>
</g>
<g id="active" class="st0">
<g id="Gruppe_4989" transform="translate(-772 -261.959)" class="st9">
<circle id="Ellipse_17" class="st10" cx="804" cy="293.96" r="32"/>
<path class="st7" d="M823.94,280.44c-1.25-1.24-3.28-1.24-4.52,0.01l-20.72,20.83l-7.99-9.07c-1.17-1.33-3.19-1.46-4.52-0.29
c-1.33,1.17-1.46,3.19-0.29,4.52l10.25,11.64c0.01,0.01,0.02,0.01,0.03,0.02c0.04,0.05,0.05,0.1,0.1,0.15
c0.62,0.62,1.44,0.93,2.26,0.93c0.26,0,0.51-0.09,0.76-0.15c0.13-0.03,0.26-0.03,0.38-0.07c0.16-0.06,0.3-0.18,0.46-0.27
c0.18-0.1,0.37-0.18,0.53-0.32c0.02-0.02,0.03-0.05,0.06-0.07c0.02-0.02,0.06-0.03,0.08-0.05l23.15-23.27
C825.2,283.71,825.2,281.68,823.94,280.44z"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 20 KiB

View File

@ -8,8 +8,8 @@
</template>
<script>
import DashboardLayout from '@/layouts/DashboardLayout.vue'
import AuthLayout from '@/layouts/AuthLayout.vue'
import DashboardLayout from '@/layouts/DashboardLayout'
import AuthLayout from '@/layouts/AuthLayout'
export default {
name: 'App',

View File

@ -17,6 +17,7 @@ $gradido-248: rgb(248 248 248) !default;
$gradido-140: rgb(140 66 5) !default;
$gradido-205: rgb(205 86 86) !default;
$gradido-197: rgb(197 141 56) !default;
$gradido-209: rgb(209 209 209) !default;
$gradido-4: rgb(4 112 6) !default;
$black: #000 !default;
$grays: () !default;
@ -36,6 +37,7 @@ $grays: map.merge(
"140": $gradido-140,
"205": $gradido-205,
"197": $gradido-197,
"209": $gradido-209,
"4": $gradido-4
),
$grays
@ -75,6 +77,7 @@ $colors: map.merge(
"140": $gradido-140,
"205": $gradido-205,
"197": $gradido-197,
"209": $gradido-209,
"4": $gradido-4
),
$colors
@ -118,6 +121,7 @@ $theme-colors: map.merge(
"140": $gradido-140,
"205": $gradido-205,
"197": $gradido-197,
"209": $gradido-209,
"4": $gradido-4
),
$theme-colors

View File

@ -21,6 +21,10 @@ body {
padding: 1px;
}
.hover-font-bold:hover {
font-weight: bold;
}
.word-break {
word-break: break-word;
}
@ -122,6 +126,10 @@ a:hover,
border-bottom-right-radius: 17px !important;
}
.rounded-26 {
border-radius: 26px;
}
.alert {
border-radius: 26px;
box-shadow: rgb(0 0 0 / 14%) 0 24px 80px;

View File

@ -1,5 +1,5 @@
import { mount } from '@vue/test-utils'
import ContributionMessagesFormular from './ContributionMessagesFormular.vue'
import ContributionMessagesFormular from './ContributionMessagesFormular'
import { toastErrorSpy, toastSuccessSpy } from '../../../test/testSetup'
const localVue = global.localVue

View File

@ -1,5 +1,5 @@
import { mount } from '@vue/test-utils'
import ContributionMessagesList from './ContributionMessagesList.vue'
import ContributionMessagesList from './ContributionMessagesList'
const localVue = global.localVue

View File

@ -23,8 +23,8 @@
</div>
</template>
<script>
import ContributionMessagesListItem from '@/components/ContributionMessages/ContributionMessagesListItem.vue'
import ContributionMessagesFormular from '@/components/ContributionMessages/ContributionMessagesFormular.vue'
import ContributionMessagesListItem from '@/components/ContributionMessages/ContributionMessagesListItem'
import ContributionMessagesFormular from '@/components/ContributionMessages/ContributionMessagesFormular'
export default {
name: 'ContributionMessagesList',

View File

@ -1,6 +1,6 @@
import { mount } from '@vue/test-utils'
import ContributionMessagesList from './ContributionMessagesList.vue'
import ContributionMessagesListItem from './ContributionMessagesListItem.vue'
import ContributionMessagesList from './ContributionMessagesList'
import ContributionMessagesListItem from './ContributionMessagesListItem'
const localVue = global.localVue
let wrapper

View File

@ -1,6 +1,23 @@
<template>
<div class="contribution-messages-list-item">
<div v-if="isNotModerator" class="text-right pr-4 pr-lg-0 is-not-moderator">
<div v-if="message.type === 'HISTORY'">
<b-row class="mb-3 border border-197 p-1">
<b-col cols="10">
<small>{{ $d(new Date(message.createdAt), 'short') }}</small>
<div class="font-weight-bold" data-test="username">
{{ storeName.username }} {{ $t('contribution.isEdited') }}
</div>
<div class="small">
{{ $t('contribution.oldContribution') }}
</div>
<parse-message v-bind="message" data-test="message" class="p-2"></parse-message>
</b-col>
<b-col cols="2">
<avatar :username="storeName.username" :initials="storeName.initials"></avatar>
</b-col>
</b-row>
</div>
<div v-else-if="isNotModerator" class="text-right pr-4 pr-lg-0 is-not-moderator">
<b-row class="mb-3">
<b-col cols="10">
<div class="font-weight-bold" data-test="username">{{ storeName.username }}</div>
@ -35,7 +52,7 @@
<script>
import Avatar from 'vue-avatar'
import ParseMessage from '@/components/ContributionMessages/ParseMessage.vue'
import ParseMessage from '@/components/ContributionMessages/ParseMessage'
export default {
name: 'ContributionMessagesListItem',

View File

@ -1,5 +1,5 @@
import { mount } from '@vue/test-utils'
import ContributionForm from './ContributionForm.vue'
import ContributionForm from './ContributionForm'
const localVue = global.localVue

Some files were not shown because too many files have changed in this diff Show More