mirror of
https://github.com/IT4Change/gradido.git
synced 2025-12-13 07:45:54 +00:00
Merge branch 'master' into 2428-feature-federation-implement-multiple-apollo-graphql-endpoints
This commit is contained in:
commit
a3af2e5513
4
.github/workflows/test.yml
vendored
4
.github/workflows/test.yml
vendored
@ -436,7 +436,7 @@ jobs:
|
|||||||
report_name: Coverage Frontend
|
report_name: Coverage Frontend
|
||||||
type: lcov
|
type: lcov
|
||||||
result_path: ./coverage/lcov.info
|
result_path: ./coverage/lcov.info
|
||||||
min_coverage: 93
|
min_coverage: 95
|
||||||
token: ${{ github.token }}
|
token: ${{ github.token }}
|
||||||
|
|
||||||
##############################################################################
|
##############################################################################
|
||||||
@ -478,7 +478,7 @@ jobs:
|
|||||||
report_name: Coverage Admin Interface
|
report_name: Coverage Admin Interface
|
||||||
type: lcov
|
type: lcov
|
||||||
result_path: ./coverage/lcov.info
|
result_path: ./coverage/lcov.info
|
||||||
min_coverage: 95
|
min_coverage: 96
|
||||||
token: ${{ github.token }}
|
token: ${{ github.token }}
|
||||||
|
|
||||||
##############################################################################
|
##############################################################################
|
||||||
|
|||||||
@ -5,6 +5,7 @@ const localVue = global.localVue
|
|||||||
|
|
||||||
const apolloMutateMock = jest.fn().mockResolvedValue({})
|
const apolloMutateMock = jest.fn().mockResolvedValue({})
|
||||||
const apolloQueryMock = jest.fn().mockResolvedValue({})
|
const apolloQueryMock = jest.fn().mockResolvedValue({})
|
||||||
|
const toggleDetailsMock = jest.fn()
|
||||||
|
|
||||||
const propsData = {
|
const propsData = {
|
||||||
items: [
|
items: [
|
||||||
@ -138,5 +139,50 @@ describe('OpenCreationsTable', () => {
|
|||||||
expect(wrapper.vm.items[0].creation).toEqual([444, 555, 666])
|
expect(wrapper.vm.items[0].creation).toEqual([444, 555, 666])
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
describe('call updateState', () => {
|
||||||
|
beforeEach(() => {
|
||||||
|
wrapper.vm.updateState(4)
|
||||||
|
})
|
||||||
|
|
||||||
|
it('emits update-state', () => {
|
||||||
|
expect(wrapper.vm.$root.$emit('update-state', 4)).toBeTruthy()
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
describe('call updateCreationData', () => {
|
||||||
|
const date = new Date()
|
||||||
|
beforeEach(() => {
|
||||||
|
wrapper.vm.updateCreationData({
|
||||||
|
amount: Number(80.0),
|
||||||
|
date: date,
|
||||||
|
memo: 'Test memo',
|
||||||
|
row: {
|
||||||
|
item: {},
|
||||||
|
detailsShowing: false,
|
||||||
|
toggleDetails: toggleDetailsMock,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
it('emits update-state', () => {
|
||||||
|
expect(
|
||||||
|
wrapper.vm.$emit('update-contributions', {
|
||||||
|
amount: Number(80.0),
|
||||||
|
date: date,
|
||||||
|
memo: 'Test memo',
|
||||||
|
row: {
|
||||||
|
item: {},
|
||||||
|
detailsShowing: false,
|
||||||
|
toggleDetails: toggleDetailsMock,
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
).toBeTruthy()
|
||||||
|
})
|
||||||
|
|
||||||
|
it('calls toggleDetails', () => {
|
||||||
|
expect(toggleDetailsMock).toBeCalled()
|
||||||
|
})
|
||||||
|
})
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|||||||
@ -8,7 +8,7 @@
|
|||||||
@click="$emit('remove-creation', row.item)"
|
@click="$emit('remove-creation', row.item)"
|
||||||
class="mr-2"
|
class="mr-2"
|
||||||
>
|
>
|
||||||
<b-icon icon="x" variant="light"></b-icon>
|
<b-icon icon="trash" variant="light"></b-icon>
|
||||||
</b-button>
|
</b-button>
|
||||||
</template>
|
</template>
|
||||||
<template #cell(editCreation)="row">
|
<template #cell(editCreation)="row">
|
||||||
@ -49,6 +49,18 @@
|
|||||||
</b-button>
|
</b-button>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
<template #cell(deny)="row">
|
||||||
|
<div v-if="$store.state.moderator.id !== row.item.userId">
|
||||||
|
<b-button
|
||||||
|
variant="danger"
|
||||||
|
size="md"
|
||||||
|
@click="$emit('deny-creation', row.item)"
|
||||||
|
class="mr-2"
|
||||||
|
>
|
||||||
|
<b-icon icon="x" variant="light"></b-icon>
|
||||||
|
</b-button>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
<template #row-details="row">
|
<template #row-details="row">
|
||||||
<row-details
|
<row-details
|
||||||
:row="row"
|
:row="row"
|
||||||
|
|||||||
7
admin/src/graphql/denyContribution.js
Normal file
7
admin/src/graphql/denyContribution.js
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
import gql from 'graphql-tag'
|
||||||
|
|
||||||
|
export const denyContribution = gql`
|
||||||
|
mutation ($id: Int!) {
|
||||||
|
denyContribution(id: $id)
|
||||||
|
}
|
||||||
|
`
|
||||||
@ -35,6 +35,7 @@
|
|||||||
"creation_failed": "Ausstehende Schöpfung für {email} konnte nicht erzeugt werden.",
|
"creation_failed": "Ausstehende Schöpfung für {email} konnte nicht erzeugt werden.",
|
||||||
"creation_for": "Aktives Grundeinkommen für",
|
"creation_for": "Aktives Grundeinkommen für",
|
||||||
"deleteNow": "Möchtest du diesen Beitrag zur Gemeinschaft wirklich löschen?",
|
"deleteNow": "Möchtest du diesen Beitrag zur Gemeinschaft wirklich löschen?",
|
||||||
|
"denyNow": "Möchtest du diesen Beitrag zur Gemeinschaft wirklich ablehnen?",
|
||||||
"enter_text": "Text eintragen",
|
"enter_text": "Text eintragen",
|
||||||
"form": "Schöpfungsformular",
|
"form": "Schöpfungsformular",
|
||||||
"min_characters": "Mindestens 10 Zeichen eingeben",
|
"min_characters": "Mindestens 10 Zeichen eingeben",
|
||||||
@ -45,6 +46,7 @@
|
|||||||
"toasted": "Offene Schöpfung ({value} GDD) für {email} wurde gespeichert und liegt zur Bestätigung bereit",
|
"toasted": "Offene Schöpfung ({value} GDD) für {email} wurde gespeichert und liegt zur Bestätigung bereit",
|
||||||
"toasted_created": "Schöpfung wurde erfolgreich gespeichert",
|
"toasted_created": "Schöpfung wurde erfolgreich gespeichert",
|
||||||
"toasted_delete": "Offene Schöpfung wurde gelöscht",
|
"toasted_delete": "Offene Schöpfung wurde gelöscht",
|
||||||
|
"toasted_denied": "Offene Schöpfung wurde abgelehnt",
|
||||||
"toasted_update": "`Offene Schöpfung {value} GDD) für {email} wurde geändert und liegt zur Bestätigung bereit",
|
"toasted_update": "`Offene Schöpfung {value} GDD) für {email} wurde geändert und liegt zur Bestätigung bereit",
|
||||||
"update_creation": "Schöpfung aktualisieren"
|
"update_creation": "Schöpfung aktualisieren"
|
||||||
},
|
},
|
||||||
@ -54,6 +56,7 @@
|
|||||||
"deleted": "gelöscht",
|
"deleted": "gelöscht",
|
||||||
"deleted_user": "Alle gelöschten Nutzer",
|
"deleted_user": "Alle gelöschten Nutzer",
|
||||||
"delete_user": "Nutzer löschen",
|
"delete_user": "Nutzer löschen",
|
||||||
|
"deny": "Ablehnen",
|
||||||
"edit": "Bearbeiten",
|
"edit": "Bearbeiten",
|
||||||
"enabled": "aktiviert",
|
"enabled": "aktiviert",
|
||||||
"error": "Fehler",
|
"error": "Fehler",
|
||||||
|
|||||||
@ -35,6 +35,7 @@
|
|||||||
"creation_failed": "Could not create pending creation for {email}",
|
"creation_failed": "Could not create pending creation for {email}",
|
||||||
"creation_for": "Active Basic Income for",
|
"creation_for": "Active Basic Income for",
|
||||||
"deleteNow": "Do you really want to delete this contribution to the community?",
|
"deleteNow": "Do you really want to delete this contribution to the community?",
|
||||||
|
"denyNow": "Do you really want to reject this contribution to the community?",
|
||||||
"enter_text": "Enter text",
|
"enter_text": "Enter text",
|
||||||
"form": "Creation form",
|
"form": "Creation form",
|
||||||
"min_characters": "Enter at least 10 characters",
|
"min_characters": "Enter at least 10 characters",
|
||||||
@ -45,6 +46,7 @@
|
|||||||
"toasted": "Open creation ({value} GDD) for {email} has been saved and is ready for confirmation.",
|
"toasted": "Open creation ({value} GDD) for {email} has been saved and is ready for confirmation.",
|
||||||
"toasted_created": "Creation has been successfully saved",
|
"toasted_created": "Creation has been successfully saved",
|
||||||
"toasted_delete": "Open creation has been deleted",
|
"toasted_delete": "Open creation has been deleted",
|
||||||
|
"toasted_denied": "Open creation has been denied",
|
||||||
"toasted_update": "Open creation {value} GDD) for {email} has been changed and is ready for confirmation.",
|
"toasted_update": "Open creation {value} GDD) for {email} has been changed and is ready for confirmation.",
|
||||||
"update_creation": "Creation update"
|
"update_creation": "Creation update"
|
||||||
},
|
},
|
||||||
@ -54,6 +56,7 @@
|
|||||||
"deleted": "deleted",
|
"deleted": "deleted",
|
||||||
"deleted_user": "All deleted user",
|
"deleted_user": "All deleted user",
|
||||||
"delete_user": "Delete user",
|
"delete_user": "Delete user",
|
||||||
|
"deny": "Reject",
|
||||||
"edit": "Edit",
|
"edit": "Edit",
|
||||||
"enabled": "enabled",
|
"enabled": "enabled",
|
||||||
"error": "Error",
|
"error": "Error",
|
||||||
|
|||||||
@ -1,6 +1,7 @@
|
|||||||
import { mount } from '@vue/test-utils'
|
import { mount } from '@vue/test-utils'
|
||||||
import CreationConfirm from './CreationConfirm.vue'
|
import CreationConfirm from './CreationConfirm.vue'
|
||||||
import { adminDeleteContribution } from '../graphql/adminDeleteContribution'
|
import { adminDeleteContribution } from '../graphql/adminDeleteContribution'
|
||||||
|
import { denyContribution } from '../graphql/denyContribution'
|
||||||
import { listUnconfirmedContributions } from '../graphql/listUnconfirmedContributions'
|
import { listUnconfirmedContributions } from '../graphql/listUnconfirmedContributions'
|
||||||
import { confirmContribution } from '../graphql/confirmContribution'
|
import { confirmContribution } from '../graphql/confirmContribution'
|
||||||
import { toastErrorSpy, toastSuccessSpy } from '../../test/testSetup'
|
import { toastErrorSpy, toastSuccessSpy } from '../../test/testSetup'
|
||||||
@ -75,6 +76,7 @@ describe('CreationConfirm', () => {
|
|||||||
|
|
||||||
const listUnconfirmedContributionsMock = jest.fn()
|
const listUnconfirmedContributionsMock = jest.fn()
|
||||||
const adminDeleteContributionMock = jest.fn()
|
const adminDeleteContributionMock = jest.fn()
|
||||||
|
const adminDenyContributionMock = jest.fn()
|
||||||
const confirmContributionMock = jest.fn()
|
const confirmContributionMock = jest.fn()
|
||||||
|
|
||||||
mockClient.setRequestHandler(
|
mockClient.setRequestHandler(
|
||||||
@ -89,6 +91,13 @@ describe('CreationConfirm', () => {
|
|||||||
adminDeleteContributionMock.mockResolvedValue({ data: { adminDeleteContribution: true } }),
|
adminDeleteContributionMock.mockResolvedValue({ data: { adminDeleteContribution: true } }),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
mockClient.setRequestHandler(
|
||||||
|
denyContribution,
|
||||||
|
adminDenyContributionMock
|
||||||
|
.mockRejectedValueOnce({ message: 'Ouch!' })
|
||||||
|
.mockResolvedValue({ data: { denyContribution: true } }),
|
||||||
|
)
|
||||||
|
|
||||||
mockClient.setRequestHandler(
|
mockClient.setRequestHandler(
|
||||||
confirmContribution,
|
confirmContribution,
|
||||||
confirmContributionMock.mockResolvedValue({ data: { confirmContribution: true } }),
|
confirmContributionMock.mockResolvedValue({ data: { confirmContribution: true } }),
|
||||||
@ -243,5 +252,59 @@ describe('CreationConfirm', () => {
|
|||||||
})
|
})
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
describe('deny creation with error', () => {
|
||||||
|
let spy
|
||||||
|
|
||||||
|
beforeEach(async () => {
|
||||||
|
spy = jest.spyOn(wrapper.vm.$bvModal, 'msgBoxConfirm')
|
||||||
|
spy.mockImplementation(() => Promise.resolve('some value'))
|
||||||
|
await wrapper.findAll('tr').at(1).findAll('button').at(0).trigger('click')
|
||||||
|
})
|
||||||
|
|
||||||
|
it('toasts an error message', () => {
|
||||||
|
expect(toastErrorSpy).toBeCalledWith('Ouchhh!')
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
describe('deny creation with success', () => {
|
||||||
|
let spy
|
||||||
|
|
||||||
|
describe('admin confirms deny', () => {
|
||||||
|
beforeEach(async () => {
|
||||||
|
spy = jest.spyOn(wrapper.vm.$bvModal, 'msgBoxConfirm')
|
||||||
|
spy.mockImplementation(() => Promise.resolve('some value'))
|
||||||
|
await wrapper.findAll('tr').at(1).findAll('button').at(3).trigger('click')
|
||||||
|
})
|
||||||
|
|
||||||
|
it('opens a modal', () => {
|
||||||
|
expect(spy).toBeCalled()
|
||||||
|
})
|
||||||
|
|
||||||
|
it('calls the adminDeleteContribution mutation', () => {
|
||||||
|
expect(adminDenyContributionMock).toBeCalledWith({ id: 1 })
|
||||||
|
})
|
||||||
|
|
||||||
|
it('commits openCreationsMinus to store', () => {
|
||||||
|
expect(storeCommitMock).toBeCalledWith('openCreationsMinus', 1)
|
||||||
|
})
|
||||||
|
|
||||||
|
it('toasts a success message', () => {
|
||||||
|
expect(toastSuccessSpy).toBeCalledWith('creation_form.toasted_denied')
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
describe('admin cancels deny', () => {
|
||||||
|
beforeEach(async () => {
|
||||||
|
spy = jest.spyOn(wrapper.vm.$bvModal, 'msgBoxConfirm')
|
||||||
|
spy.mockImplementation(() => Promise.resolve(false))
|
||||||
|
await wrapper.findAll('tr').at(1).findAll('button').at(3).trigger('click')
|
||||||
|
})
|
||||||
|
|
||||||
|
it('does not call the adminDeleteContribution mutation', () => {
|
||||||
|
expect(adminDenyContributionMock).not.toBeCalled()
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|||||||
@ -7,6 +7,7 @@
|
|||||||
class="mt-4"
|
class="mt-4"
|
||||||
:items="pendingCreations"
|
:items="pendingCreations"
|
||||||
:fields="fields"
|
:fields="fields"
|
||||||
|
@deny-creation="denyCreation"
|
||||||
@remove-creation="removeCreation"
|
@remove-creation="removeCreation"
|
||||||
@show-overlay="showOverlay"
|
@show-overlay="showOverlay"
|
||||||
@update-state="updateState"
|
@update-state="updateState"
|
||||||
@ -20,6 +21,7 @@ import OpenCreationsTable from '../components/Tables/OpenCreationsTable.vue'
|
|||||||
import { listUnconfirmedContributions } from '../graphql/listUnconfirmedContributions'
|
import { listUnconfirmedContributions } from '../graphql/listUnconfirmedContributions'
|
||||||
import { adminDeleteContribution } from '../graphql/adminDeleteContribution'
|
import { adminDeleteContribution } from '../graphql/adminDeleteContribution'
|
||||||
import { confirmContribution } from '../graphql/confirmContribution'
|
import { confirmContribution } from '../graphql/confirmContribution'
|
||||||
|
import { denyContribution } from '../graphql/denyContribution'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'CreationConfirm',
|
name: 'CreationConfirm',
|
||||||
@ -35,6 +37,26 @@ export default {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
|
denyCreation(item) {
|
||||||
|
this.$bvModal.msgBoxConfirm(this.$t('creation_form.denyNow')).then(async (value) => {
|
||||||
|
if (value) {
|
||||||
|
await this.$apollo
|
||||||
|
.mutate({
|
||||||
|
mutation: denyContribution,
|
||||||
|
variables: {
|
||||||
|
id: item.id,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
.then((result) => {
|
||||||
|
this.updatePendingCreations(item.id)
|
||||||
|
this.toastSuccess(this.$t('creation_form.toasted_denied'))
|
||||||
|
})
|
||||||
|
.catch((error) => {
|
||||||
|
this.toastError(error.message)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
removeCreation(item) {
|
removeCreation(item) {
|
||||||
this.$bvModal.msgBoxConfirm(this.$t('creation_form.deleteNow')).then(async (value) => {
|
this.$bvModal.msgBoxConfirm(this.$t('creation_form.deleteNow')).then(async (value) => {
|
||||||
if (value)
|
if (value)
|
||||||
@ -110,6 +132,7 @@ export default {
|
|||||||
{ key: 'moderator', label: this.$t('moderator') },
|
{ key: 'moderator', label: this.$t('moderator') },
|
||||||
{ key: 'editCreation', label: this.$t('edit') },
|
{ key: 'editCreation', label: this.$t('edit') },
|
||||||
{ key: 'confirm', label: this.$t('save') },
|
{ key: 'confirm', label: this.$t('save') },
|
||||||
|
{ key: 'deny', label: this.$t('deny') },
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|||||||
@ -4141,9 +4141,9 @@ caniuse-api@^3.0.0:
|
|||||||
lodash.uniq "^4.5.0"
|
lodash.uniq "^4.5.0"
|
||||||
|
|
||||||
caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000844, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001271:
|
caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000844, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001271:
|
||||||
version "1.0.30001442"
|
version "1.0.30001445"
|
||||||
resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001442.tgz"
|
resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001445.tgz"
|
||||||
integrity sha512-239m03Pqy0hwxYPYR5JwOIxRJfLTWtle9FV8zosfV5pHg+/51uD4nxcUlM8+mWWGfwKtt8lJNHnD3cWw9VZ6ow==
|
integrity sha512-8sdQIdMztYmzfTMO6KfLny878Ln9c2M0fc7EH60IjlP4Dc4PiCy7K2Vl3ITmWgOyPgVQKa5x+UP/KqFsxj4mBg==
|
||||||
|
|
||||||
capture-exit@^2.0.0:
|
capture-exit@^2.0.0:
|
||||||
version "2.0.0"
|
version "2.0.0"
|
||||||
|
|||||||
@ -54,4 +54,5 @@ export enum RIGHTS {
|
|||||||
DELETE_CONTRIBUTION_LINK = 'DELETE_CONTRIBUTION_LINK',
|
DELETE_CONTRIBUTION_LINK = 'DELETE_CONTRIBUTION_LINK',
|
||||||
UPDATE_CONTRIBUTION_LINK = 'UPDATE_CONTRIBUTION_LINK',
|
UPDATE_CONTRIBUTION_LINK = 'UPDATE_CONTRIBUTION_LINK',
|
||||||
ADMIN_CREATE_CONTRIBUTION_MESSAGE = 'ADMIN_CREATE_CONTRIBUTION_MESSAGE',
|
ADMIN_CREATE_CONTRIBUTION_MESSAGE = 'ADMIN_CREATE_CONTRIBUTION_MESSAGE',
|
||||||
|
DENY_CONTRIBUTION = 'DENY_CONTRIBUTION',
|
||||||
}
|
}
|
||||||
|
|||||||
@ -9,7 +9,7 @@ import {
|
|||||||
sendAccountActivationEmail,
|
sendAccountActivationEmail,
|
||||||
sendAccountMultiRegistrationEmail,
|
sendAccountMultiRegistrationEmail,
|
||||||
sendContributionConfirmedEmail,
|
sendContributionConfirmedEmail,
|
||||||
sendContributionRejectedEmail,
|
sendContributionDeniedEmail,
|
||||||
sendResetPasswordEmail,
|
sendResetPasswordEmail,
|
||||||
sendTransactionLinkRedeemedEmail,
|
sendTransactionLinkRedeemedEmail,
|
||||||
sendTransactionReceivedEmail,
|
sendTransactionReceivedEmail,
|
||||||
@ -360,9 +360,9 @@ describe('sendEmailVariants', () => {
|
|||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
describe('sendContributionRejectedEmail', () => {
|
describe('sendContributionDeniedEmail', () => {
|
||||||
beforeAll(async () => {
|
beforeAll(async () => {
|
||||||
result = await sendContributionRejectedEmail({
|
result = await sendContributionDeniedEmail({
|
||||||
firstName: 'Peter',
|
firstName: 'Peter',
|
||||||
lastName: 'Lustig',
|
lastName: 'Lustig',
|
||||||
email: 'peter@lustig.de',
|
email: 'peter@lustig.de',
|
||||||
@ -379,7 +379,7 @@ describe('sendEmailVariants', () => {
|
|||||||
receiver: {
|
receiver: {
|
||||||
to: 'Peter Lustig <peter@lustig.de>',
|
to: 'Peter Lustig <peter@lustig.de>',
|
||||||
},
|
},
|
||||||
template: 'contributionRejected',
|
template: 'contributionDenied',
|
||||||
locals: {
|
locals: {
|
||||||
firstName: 'Peter',
|
firstName: 'Peter',
|
||||||
lastName: 'Lustig',
|
lastName: 'Lustig',
|
||||||
|
|||||||
@ -103,7 +103,7 @@ export const sendContributionConfirmedEmail = (data: {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
export const sendContributionRejectedEmail = (data: {
|
export const sendContributionDeniedEmail = (data: {
|
||||||
firstName: string
|
firstName: string
|
||||||
lastName: string
|
lastName: string
|
||||||
email: string
|
email: string
|
||||||
@ -114,7 +114,7 @@ export const sendContributionRejectedEmail = (data: {
|
|||||||
}): Promise<Record<string, unknown> | null> => {
|
}): Promise<Record<string, unknown> | null> => {
|
||||||
return sendEmailTranslated({
|
return sendEmailTranslated({
|
||||||
receiver: { to: `${data.firstName} ${data.lastName} <${data.email}>` },
|
receiver: { to: `${data.firstName} ${data.lastName} <${data.email}>` },
|
||||||
template: 'contributionRejected',
|
template: 'contributionDenied',
|
||||||
locals: {
|
locals: {
|
||||||
firstName: data.firstName,
|
firstName: data.firstName,
|
||||||
lastName: data.lastName,
|
lastName: data.lastName,
|
||||||
|
|||||||
16
backend/src/emails/templates/contributionDenied/html.pug
Normal file
16
backend/src/emails/templates/contributionDenied/html.pug
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
doctype html
|
||||||
|
html(lang=locale)
|
||||||
|
head
|
||||||
|
title= t('emails.contributionDenied.subject')
|
||||||
|
body
|
||||||
|
h1(style='margin-bottom: 24px;')= t('emails.contributionDenied.subject')
|
||||||
|
#container.col
|
||||||
|
include ../hello.pug
|
||||||
|
p= t('emails.contributionDenied.commonGoodContributionDenied', { senderFirstName, senderLastName, contributionMemo })
|
||||||
|
p= t('emails.contributionDenied.toSeeContributionsAndMessages')
|
||||||
|
p
|
||||||
|
= t('emails.general.linkToYourAccount')
|
||||||
|
= " "
|
||||||
|
a(href=overviewURL) #{overviewURL}
|
||||||
|
p= t('emails.general.pleaseDoNotReply')
|
||||||
|
include ../greatingFormularImprint.pug
|
||||||
@ -0,0 +1 @@
|
|||||||
|
= t('emails.contributionDenied.subject')
|
||||||
@ -1,16 +0,0 @@
|
|||||||
doctype html
|
|
||||||
html(lang=locale)
|
|
||||||
head
|
|
||||||
title= t('emails.contributionRejected.subject')
|
|
||||||
body
|
|
||||||
h1(style='margin-bottom: 24px;')= t('emails.contributionRejected.subject')
|
|
||||||
#container.col
|
|
||||||
include ../hello.pug
|
|
||||||
p= t('emails.contributionRejected.commonGoodContributionRejected', { senderFirstName, senderLastName, contributionMemo })
|
|
||||||
p= t('emails.contributionRejected.toSeeContributionsAndMessages')
|
|
||||||
p
|
|
||||||
= t('emails.general.linkToYourAccount')
|
|
||||||
= " "
|
|
||||||
a(href=overviewURL) #{overviewURL}
|
|
||||||
p= t('emails.general.pleaseDoNotReply')
|
|
||||||
include ../greatingFormularImprint.pug
|
|
||||||
@ -1 +0,0 @@
|
|||||||
= t('emails.contributionRejected.subject')
|
|
||||||
@ -18,6 +18,8 @@ export class Contribution {
|
|||||||
this.contributionDate = contribution.contributionDate
|
this.contributionDate = contribution.contributionDate
|
||||||
this.state = contribution.contributionStatus
|
this.state = contribution.contributionStatus
|
||||||
this.messagesCount = contribution.messages ? contribution.messages.length : 0
|
this.messagesCount = contribution.messages ? contribution.messages.length : 0
|
||||||
|
this.deniedAt = contribution.deniedAt
|
||||||
|
this.deniedBy = contribution.deniedBy
|
||||||
}
|
}
|
||||||
|
|
||||||
@Field(() => Number)
|
@Field(() => Number)
|
||||||
@ -47,6 +49,12 @@ export class Contribution {
|
|||||||
@Field(() => Number, { nullable: true })
|
@Field(() => Number, { nullable: true })
|
||||||
confirmedBy: number | null
|
confirmedBy: number | null
|
||||||
|
|
||||||
|
@Field(() => Date, { nullable: true })
|
||||||
|
deniedAt: Date | null
|
||||||
|
|
||||||
|
@Field(() => Number, { nullable: true })
|
||||||
|
deniedBy: number | null
|
||||||
|
|
||||||
@Field(() => Date)
|
@Field(() => Date)
|
||||||
contributionDate: Date
|
contributionDate: Date
|
||||||
|
|
||||||
|
|||||||
@ -50,7 +50,7 @@ import { eventProtocol } from '@/event/EventProtocolEmitter'
|
|||||||
import { calculateDecay } from '@/util/decay'
|
import { calculateDecay } from '@/util/decay'
|
||||||
import {
|
import {
|
||||||
sendContributionConfirmedEmail,
|
sendContributionConfirmedEmail,
|
||||||
sendContributionRejectedEmail,
|
sendContributionDeniedEmail,
|
||||||
} from '@/emails/sendEmailVariants'
|
} from '@/emails/sendEmailVariants'
|
||||||
import { TRANSACTIONS_LOCK } from '@/util/TRANSACTIONS_LOCK'
|
import { TRANSACTIONS_LOCK } from '@/util/TRANSACTIONS_LOCK'
|
||||||
|
|
||||||
@ -217,7 +217,7 @@ export class ContributionResolver {
|
|||||||
const user = getUser(context)
|
const user = getUser(context)
|
||||||
|
|
||||||
const contributionToUpdate = await DbContribution.findOne({
|
const contributionToUpdate = await DbContribution.findOne({
|
||||||
where: { id: contributionId, confirmedAt: IsNull() },
|
where: { id: contributionId, confirmedAt: IsNull(), deniedAt: IsNull() },
|
||||||
})
|
})
|
||||||
if (!contributionToUpdate) {
|
if (!contributionToUpdate) {
|
||||||
logger.error('No contribution found to given id')
|
logger.error('No contribution found to given id')
|
||||||
@ -409,7 +409,7 @@ export class ContributionResolver {
|
|||||||
const moderator = getUser(context)
|
const moderator = getUser(context)
|
||||||
|
|
||||||
const contributionToUpdate = await DbContribution.findOne({
|
const contributionToUpdate = await DbContribution.findOne({
|
||||||
where: { id, confirmedAt: IsNull() },
|
where: { id, confirmedAt: IsNull(), deniedAt: IsNull() },
|
||||||
})
|
})
|
||||||
if (!contributionToUpdate) {
|
if (!contributionToUpdate) {
|
||||||
logger.error('No contribution found to given id.')
|
logger.error('No contribution found to given id.')
|
||||||
@ -475,6 +475,7 @@ export class ContributionResolver {
|
|||||||
.from(DbContribution, 'c')
|
.from(DbContribution, 'c')
|
||||||
.leftJoinAndSelect('c.messages', 'm')
|
.leftJoinAndSelect('c.messages', 'm')
|
||||||
.where({ confirmedAt: IsNull() })
|
.where({ confirmedAt: IsNull() })
|
||||||
|
.andWhere({ deniedAt: IsNull() })
|
||||||
.getMany()
|
.getMany()
|
||||||
|
|
||||||
if (contributions.length === 0) {
|
if (contributions.length === 0) {
|
||||||
@ -540,7 +541,7 @@ export class ContributionResolver {
|
|||||||
await eventProtocol.writeEvent(
|
await eventProtocol.writeEvent(
|
||||||
event.setEventAdminContributionDelete(eventAdminContributionDelete),
|
event.setEventAdminContributionDelete(eventAdminContributionDelete),
|
||||||
)
|
)
|
||||||
sendContributionRejectedEmail({
|
sendContributionDeniedEmail({
|
||||||
firstName: user.firstName,
|
firstName: user.firstName,
|
||||||
lastName: user.lastName,
|
lastName: user.lastName,
|
||||||
email: user.emailContact.email,
|
email: user.emailContact.email,
|
||||||
@ -572,6 +573,10 @@ export class ContributionResolver {
|
|||||||
logger.error(`Contribution already confirmd: ${id}`)
|
logger.error(`Contribution already confirmd: ${id}`)
|
||||||
throw new Error('Contribution already confirmd.')
|
throw new Error('Contribution already confirmd.')
|
||||||
}
|
}
|
||||||
|
if (contribution.contributionStatus === 'DENIED') {
|
||||||
|
logger.error(`Contribution already denied: ${id}`)
|
||||||
|
throw new Error('Contribution already denied.')
|
||||||
|
}
|
||||||
const moderatorUser = getUser(context)
|
const moderatorUser = getUser(context)
|
||||||
if (moderatorUser.id === contribution.userId) {
|
if (moderatorUser.id === contribution.userId) {
|
||||||
logger.error('Moderator can not confirm own contribution')
|
logger.error('Moderator can not confirm own contribution')
|
||||||
@ -684,6 +689,7 @@ export class ContributionResolver {
|
|||||||
.from(DbContribution, 'c')
|
.from(DbContribution, 'c')
|
||||||
.leftJoinAndSelect('c.user', 'u')
|
.leftJoinAndSelect('c.user', 'u')
|
||||||
.where(`user_id = ${userId}`)
|
.where(`user_id = ${userId}`)
|
||||||
|
.withDeleted()
|
||||||
.limit(pageSize)
|
.limit(pageSize)
|
||||||
.offset(offset)
|
.offset(offset)
|
||||||
.orderBy('c.created_at', order)
|
.orderBy('c.created_at', order)
|
||||||
@ -714,4 +720,58 @@ export class ContributionResolver {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Authorized([RIGHTS.DENY_CONTRIBUTION])
|
||||||
|
@Mutation(() => Boolean)
|
||||||
|
async denyContribution(
|
||||||
|
@Arg('id', () => Int) id: number,
|
||||||
|
@Ctx() context: Context,
|
||||||
|
): Promise<boolean> {
|
||||||
|
const contributionToUpdate = await DbContribution.findOne({
|
||||||
|
id,
|
||||||
|
confirmedAt: IsNull(),
|
||||||
|
deniedBy: IsNull(),
|
||||||
|
})
|
||||||
|
if (!contributionToUpdate) {
|
||||||
|
logger.error(`Contribution not found for given id: ${id}`)
|
||||||
|
throw new Error(`Contribution not found for given id.`)
|
||||||
|
}
|
||||||
|
if (
|
||||||
|
contributionToUpdate.contributionStatus !== ContributionStatus.IN_PROGRESS &&
|
||||||
|
contributionToUpdate.contributionStatus !== ContributionStatus.PENDING
|
||||||
|
) {
|
||||||
|
logger.error(
|
||||||
|
`Contribution state (${contributionToUpdate.contributionStatus}) is not allowed.`,
|
||||||
|
)
|
||||||
|
throw new Error(`State of the contribution is not allowed.`)
|
||||||
|
}
|
||||||
|
const moderator = getUser(context)
|
||||||
|
const user = await DbUser.findOne(
|
||||||
|
{ id: contributionToUpdate.userId },
|
||||||
|
{ relations: ['emailContact'] },
|
||||||
|
)
|
||||||
|
if (!user) {
|
||||||
|
logger.error(
|
||||||
|
`Could not find User for the Contribution (userId: ${contributionToUpdate.userId}).`,
|
||||||
|
)
|
||||||
|
throw new Error('Could not find User for the Contribution.')
|
||||||
|
}
|
||||||
|
|
||||||
|
contributionToUpdate.contributionStatus = ContributionStatus.DENIED
|
||||||
|
contributionToUpdate.deniedBy = moderator.id
|
||||||
|
contributionToUpdate.deniedAt = new Date()
|
||||||
|
const res = await contributionToUpdate.save()
|
||||||
|
|
||||||
|
sendContributionDeniedEmail({
|
||||||
|
firstName: user.firstName,
|
||||||
|
lastName: user.lastName,
|
||||||
|
email: user.emailContact.email,
|
||||||
|
language: user.language,
|
||||||
|
senderFirstName: moderator.firstName,
|
||||||
|
senderLastName: moderator.lastName,
|
||||||
|
contributionMemo: contributionToUpdate.memo,
|
||||||
|
})
|
||||||
|
|
||||||
|
return !!res
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -23,8 +23,8 @@
|
|||||||
"commonGoodContributionConfirmed": "Your public good contribution “{contributionMemo}” has just been confirmed by {senderFirstName} {senderLastName} and credited to your Gradido account.",
|
"commonGoodContributionConfirmed": "Your public good contribution “{contributionMemo}” has just been confirmed by {senderFirstName} {senderLastName} and credited to your Gradido account.",
|
||||||
"subject": "Gradido: Your contribution to the common good was confirmed"
|
"subject": "Gradido: Your contribution to the common good was confirmed"
|
||||||
},
|
},
|
||||||
"contributionRejected": {
|
"contributionDenied": {
|
||||||
"commonGoodContributionRejected": "Your public good contribution “{contributionMemo}” was rejected by {senderFirstName} {senderLastName}.",
|
"commonGoodContributionDenied": "Your public good contribution “{contributionMemo}” was rejected by {senderFirstName} {senderLastName}.",
|
||||||
"subject": "Gradido: Your common good contribution was rejected",
|
"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 “Community” menu in your Gradido account and click on the “My contributions to the common good” tab!"
|
||||||
},
|
},
|
||||||
|
|||||||
@ -66,6 +66,7 @@
|
|||||||
"vuex-persistedstate": "^4.0.0-beta.3"
|
"vuex-persistedstate": "^4.0.0-beta.3"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
"@apollo/client": "^3.7.4",
|
||||||
"@intlify/eslint-plugin-vue-i18n": "^1.4.0",
|
"@intlify/eslint-plugin-vue-i18n": "^1.4.0",
|
||||||
"@vue/cli-plugin-babel": "^3.7.0",
|
"@vue/cli-plugin-babel": "^3.7.0",
|
||||||
"@vue/cli-plugin-eslint": "^3.7.0",
|
"@vue/cli-plugin-eslint": "^3.7.0",
|
||||||
@ -76,6 +77,7 @@
|
|||||||
"babel-plugin-transform-require-context": "^0.1.1",
|
"babel-plugin-transform-require-context": "^0.1.1",
|
||||||
"cross-env": "^7.0.3",
|
"cross-env": "^7.0.3",
|
||||||
"dotenv-webpack": "^7.0.3",
|
"dotenv-webpack": "^7.0.3",
|
||||||
|
"mock-apollo-client": "^1.2.1",
|
||||||
"postcss": "^8.4.8",
|
"postcss": "^8.4.8",
|
||||||
"postcss-html": "^1.3.0",
|
"postcss-html": "^1.3.0",
|
||||||
"postcss-scss": "^4.0.3",
|
"postcss-scss": "^4.0.3",
|
||||||
|
|||||||
@ -33,6 +33,10 @@
|
|||||||
<div class="small">
|
<div class="small">
|
||||||
{{ $t('creation') }} {{ $t('(') }}{{ amount / 20 }} {{ $t('h') }}{{ $t(')') }}
|
{{ $t('creation') }} {{ $t('(') }}{{ amount / 20 }} {{ $t('h') }}{{ $t(')') }}
|
||||||
</div>
|
</div>
|
||||||
|
<div v-if="state === 'DENIED' && allContribution" class="font-weight-bold">
|
||||||
|
<b-icon icon="x-circle" variant="danger"></b-icon>
|
||||||
|
{{ $t('contribution.alert.denied') }}
|
||||||
|
</div>
|
||||||
<div v-if="state === 'DELETED'" class="small">
|
<div v-if="state === 'DELETED'" class="small">
|
||||||
{{ $t('contribution.deleted') }}
|
{{ $t('contribution.deleted') }}
|
||||||
</div>
|
</div>
|
||||||
@ -146,6 +150,14 @@ export default {
|
|||||||
type: String,
|
type: String,
|
||||||
required: false,
|
required: false,
|
||||||
},
|
},
|
||||||
|
deniedBy: {
|
||||||
|
type: Number,
|
||||||
|
required: false,
|
||||||
|
},
|
||||||
|
deniedAt: {
|
||||||
|
type: String,
|
||||||
|
required: false,
|
||||||
|
},
|
||||||
state: {
|
state: {
|
||||||
type: String,
|
type: String,
|
||||||
required: false,
|
required: false,
|
||||||
@ -175,12 +187,14 @@ export default {
|
|||||||
computed: {
|
computed: {
|
||||||
icon() {
|
icon() {
|
||||||
if (this.deletedAt) return 'trash'
|
if (this.deletedAt) return 'trash'
|
||||||
|
if (this.deniedAt) return 'x-circle'
|
||||||
if (this.confirmedAt) return 'check'
|
if (this.confirmedAt) return 'check'
|
||||||
if (this.state === 'IN_PROGRESS') return 'question-circle'
|
if (this.state === 'IN_PROGRESS') return 'question-circle'
|
||||||
return 'bell-fill'
|
return 'bell-fill'
|
||||||
},
|
},
|
||||||
variant() {
|
variant() {
|
||||||
if (this.deletedAt) return 'danger'
|
if (this.deletedAt) return 'danger'
|
||||||
|
if (this.deniedAt) return 'warning'
|
||||||
if (this.confirmedAt) return 'success'
|
if (this.confirmedAt) return 'success'
|
||||||
if (this.state === 'IN_PROGRESS') return 'f5'
|
if (this.state === 'IN_PROGRESS') return 'f5'
|
||||||
return 'primary'
|
return 'primary'
|
||||||
|
|||||||
@ -55,7 +55,7 @@ describe('ContributionInfo', () => {
|
|||||||
expect(listItems.at(2).text()).toBe('contribution.alert.confirm')
|
expect(listItems.at(2).text()).toBe('contribution.alert.confirm')
|
||||||
|
|
||||||
expect(listItems.at(3).find('svg').attributes('aria-label')).toEqual('x circle')
|
expect(listItems.at(3).find('svg').attributes('aria-label')).toEqual('x circle')
|
||||||
expect(listItems.at(3).text()).toBe('contribution.alert.rejected')
|
expect(listItems.at(3).text()).toBe('contribution.alert.denied')
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
@ -72,7 +72,7 @@ describe('ContributionInfo', () => {
|
|||||||
expect(wrapper.find('p').text()).toBe('contribution.alert.communityNoteList')
|
expect(wrapper.find('p').text()).toBe('contribution.alert.communityNoteList')
|
||||||
})
|
})
|
||||||
|
|
||||||
it('has a legend to explain the icons', () => {
|
it.skip('has a legend to explain the icons', () => {
|
||||||
const listItems = wrapper.findAll('li')
|
const listItems = wrapper.findAll('li')
|
||||||
|
|
||||||
expect(listItems.at(0).find('svg').attributes('aria-label')).toEqual('bell fill')
|
expect(listItems.at(0).find('svg').attributes('aria-label')).toEqual('bell fill')
|
||||||
|
|||||||
@ -19,8 +19,8 @@
|
|||||||
{{ $t('contribution.alert.confirm') }}
|
{{ $t('contribution.alert.confirm') }}
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<b-icon icon="x-circle" variant="danger"></b-icon>
|
<b-icon icon="x-circle" variant="warning"></b-icon>
|
||||||
{{ $t('contribution.alert.rejected') }}
|
{{ $t('contribution.alert.denied') }}
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<b-icon icon="trash" variant="danger"></b-icon>
|
<b-icon icon="trash" variant="danger"></b-icon>
|
||||||
@ -33,16 +33,6 @@
|
|||||||
<p>
|
<p>
|
||||||
{{ $t('contribution.alert.communityNoteList') }}
|
{{ $t('contribution.alert.communityNoteList') }}
|
||||||
</p>
|
</p>
|
||||||
<ul>
|
|
||||||
<li>
|
|
||||||
<b-icon icon="bell-fill" variant="primary"></b-icon>
|
|
||||||
{{ $t('contribution.alert.pending') }}
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<b-icon icon="check" variant="success"></b-icon>
|
|
||||||
{{ $t('contribution.alert.confirm') }}
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
</div>
|
||||||
<div v-if="hash === '#edit'" show fade variant="secondary" class="text-dark">
|
<div v-if="hash === '#edit'" show fade variant="secondary" class="text-dark">
|
||||||
<div>
|
<div>
|
||||||
|
|||||||
@ -183,6 +183,8 @@ export const listContributions = gql`
|
|||||||
deletedAt
|
deletedAt
|
||||||
state
|
state
|
||||||
messagesCount
|
messagesCount
|
||||||
|
deniedAt
|
||||||
|
deniedBy
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -202,6 +204,10 @@ export const listAllContributions = gql`
|
|||||||
contributionDate
|
contributionDate
|
||||||
confirmedAt
|
confirmedAt
|
||||||
confirmedBy
|
confirmedBy
|
||||||
|
state
|
||||||
|
messagesCount
|
||||||
|
deniedAt
|
||||||
|
deniedBy
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -42,10 +42,10 @@
|
|||||||
"communityNoteList": "Hier findest du alle eingereichten und bestätigten Beiträge von allen Mitgliedern aus dieser Gemeinschaft.",
|
"communityNoteList": "Hier findest du alle eingereichten und bestätigten Beiträge von allen Mitgliedern aus dieser Gemeinschaft.",
|
||||||
"confirm": "bestätigt",
|
"confirm": "bestätigt",
|
||||||
"deleted": "gelöscht",
|
"deleted": "gelöscht",
|
||||||
|
"denied": "abgelehnt",
|
||||||
"in_progress": "Es gibt eine Rückfrage der Moderatoren.",
|
"in_progress": "Es gibt eine Rückfrage der Moderatoren.",
|
||||||
"myContributionNoteList": "Eingereichte Beiträge, die noch nicht bestätigt wurden, kannst du jederzeit bearbeiten oder löschen.",
|
"myContributionNoteList": "Eingereichte Beiträge, die noch nicht bestätigt wurden, kannst du jederzeit bearbeiten oder löschen.",
|
||||||
"pending": "Eingereicht und wartet auf Bestätigung",
|
"pending": "Eingereicht und wartet auf Bestätigung"
|
||||||
"rejected": "abgelehnt"
|
|
||||||
},
|
},
|
||||||
"delete": "Beitrag löschen! Bist du sicher?",
|
"delete": "Beitrag löschen! Bist du sicher?",
|
||||||
"deleted": "Der Beitrag wurde gelöscht! Wird aber sichtbar bleiben.",
|
"deleted": "Der Beitrag wurde gelöscht! Wird aber sichtbar bleiben.",
|
||||||
|
|||||||
@ -42,10 +42,10 @@
|
|||||||
"communityNoteList": "Here you will find all submitted and confirmed contributions from all members of this community.",
|
"communityNoteList": "Here you will find all submitted and confirmed contributions from all members of this community.",
|
||||||
"confirm": "confirmed",
|
"confirm": "confirmed",
|
||||||
"deleted": "deleted",
|
"deleted": "deleted",
|
||||||
|
"denied": "rejected",
|
||||||
"in_progress": "There is a question from the moderators.",
|
"in_progress": "There is a question from the moderators.",
|
||||||
"myContributionNoteList": "You can edit or delete entries that have not yet been confirmed at any time.",
|
"myContributionNoteList": "You can edit or delete entries that have not yet been confirmed at any time.",
|
||||||
"pending": "Submitted and waiting for confirmation",
|
"pending": "Submitted and waiting for confirmation"
|
||||||
"rejected": "deleted"
|
|
||||||
},
|
},
|
||||||
"delete": "Delete Contribution! Are you sure?",
|
"delete": "Delete Contribution! Are you sure?",
|
||||||
"deleted": "The contribution has been deleted! But it will remain visible.",
|
"deleted": "The contribution has been deleted! But it will remain visible.",
|
||||||
|
|||||||
@ -39,10 +39,10 @@
|
|||||||
"answerQuestion": "Por favor, contesta las preguntas",
|
"answerQuestion": "Por favor, contesta las preguntas",
|
||||||
"communityNoteList": "Aquí encontrarás todas las contribuciones enviadas y confirmadas de todos los miembros de esta comunidad.",
|
"communityNoteList": "Aquí encontrarás todas las contribuciones enviadas y confirmadas de todos los miembros de esta comunidad.",
|
||||||
"confirm": "confirmado",
|
"confirm": "confirmado",
|
||||||
|
"denied": "rechazado",
|
||||||
"in_progress": "Hay una pregunta de los moderatores.",
|
"in_progress": "Hay una pregunta de los moderatores.",
|
||||||
"myContributionNoteList": "Puedes editar o eliminar las contribuciones enviadas que aún no han sido confirmadas en cualquier momento.",
|
"myContributionNoteList": "Puedes editar o eliminar las contribuciones enviadas que aún no han sido confirmadas en cualquier momento.",
|
||||||
"pending": "Enviado y a la espera de confirmación",
|
"pending": "Enviado y a la espera de confirmación"
|
||||||
"rejected": "rechazado"
|
|
||||||
},
|
},
|
||||||
"date": "Contribución para:",
|
"date": "Contribución para:",
|
||||||
"delete": "Eliminar la contribución. ¿Estás seguro?",
|
"delete": "Eliminar la contribución. ¿Estás seguro?",
|
||||||
|
|||||||
@ -41,10 +41,10 @@
|
|||||||
"communityNoteList": "Vous trouverez ci-contre toutes les contributions versées et certifiées de tous les membres de cette communauté.",
|
"communityNoteList": "Vous trouverez ci-contre toutes les contributions versées et certifiées de tous les membres de cette communauté.",
|
||||||
"confirm": "Approuvé",
|
"confirm": "Approuvé",
|
||||||
"deleted": "Supprimé",
|
"deleted": "Supprimé",
|
||||||
|
"denied": "supprimé",
|
||||||
"in_progress": "Il y a une question du modérateur.",
|
"in_progress": "Il y a une question du modérateur.",
|
||||||
"myContributionNoteList": "À tout moment vous pouvez éditer ou supprimer les données qui n´ont pas été confirmées.",
|
"myContributionNoteList": "À tout moment vous pouvez éditer ou supprimer les données qui n´ont pas été confirmées.",
|
||||||
"pending": "Inscription en attente de validation",
|
"pending": "Inscription en attente de validation"
|
||||||
"rejected": "supprimé"
|
|
||||||
},
|
},
|
||||||
"date": "Contribution pour:",
|
"date": "Contribution pour:",
|
||||||
"delete": "Supprimer la contribution! Êtes-vous sûr?",
|
"delete": "Supprimer la contribution! Êtes-vous sûr?",
|
||||||
|
|||||||
@ -39,10 +39,10 @@
|
|||||||
"answerQuestion": "Please answer the question",
|
"answerQuestion": "Please answer the question",
|
||||||
"communityNoteList": "Hier vind je alle ingediende en bevestigde bijdragen van alle leden uit deze gemeenschap.",
|
"communityNoteList": "Hier vind je alle ingediende en bevestigde bijdragen van alle leden uit deze gemeenschap.",
|
||||||
"confirm": "bevestigt",
|
"confirm": "bevestigt",
|
||||||
|
"denied": "afgewezen",
|
||||||
"in_progress": "There is a question from the moderators.",
|
"in_progress": "There is a question from the moderators.",
|
||||||
"myContributionNoteList": "Ingediende bijdragen, die nog niet bevestigd zijn, kun je op elk moment wijzigen of verwijderen.",
|
"myContributionNoteList": "Ingediende bijdragen, die nog niet bevestigd zijn, kun je op elk moment wijzigen of verwijderen.",
|
||||||
"pending": "Ingediend en wacht op bevestiging",
|
"pending": "Ingediend en wacht op bevestiging"
|
||||||
"rejected": "afgewezen"
|
|
||||||
},
|
},
|
||||||
"date": "Bijdrage voor:",
|
"date": "Bijdrage voor:",
|
||||||
"delete": "Bijdrage verwijderen! Weet je het zeker?",
|
"delete": "Bijdrage verwijderen! Weet je het zeker?",
|
||||||
|
|||||||
@ -34,10 +34,10 @@
|
|||||||
"alert": {
|
"alert": {
|
||||||
"communityNoteList": "Burada, bu topluluğun tüm üyelerinden gönderilen ve onaylanan bütün faydalı hizmetleri bulacaksın.",
|
"communityNoteList": "Burada, bu topluluğun tüm üyelerinden gönderilen ve onaylanan bütün faydalı hizmetleri bulacaksın.",
|
||||||
"confirm": "onaylandı",
|
"confirm": "onaylandı",
|
||||||
|
"denied": "reddedildi",
|
||||||
"myContributionNoteList": "Bildirmiş olduğun henüz onaylanmamış olan faaliyetleri istediğin zaman düzenleyebilir veya silebilirsin.",
|
"myContributionNoteList": "Bildirmiş olduğun henüz onaylanmamış olan faaliyetleri istediğin zaman düzenleyebilir veya silebilirsin.",
|
||||||
"myContributionNoteSupport": "Yakın zamanda moderatörlerle aranda bir diyalog olasılığı olacak. Şu anda herhangi bir sorun yaşıyorsan, lütfen destek hattına başvur.",
|
"myContributionNoteSupport": "Yakın zamanda moderatörlerle aranda bir diyalog olasılığı olacak. Şu anda herhangi bir sorun yaşıyorsan, lütfen destek hattına başvur.",
|
||||||
"pending": "Gönderildi ve onay bekleniyor",
|
"pending": "Gönderildi ve onay bekleniyor"
|
||||||
"rejected": "reddedildi"
|
|
||||||
},
|
},
|
||||||
"date": "Hizmet:",
|
"date": "Hizmet:",
|
||||||
"delete": "Hizmeti sil! Emin misin?",
|
"delete": "Hizmeti sil! Emin misin?",
|
||||||
|
|||||||
@ -1,58 +1,59 @@
|
|||||||
import { mount } from '@vue/test-utils'
|
import { mount } from '@vue/test-utils'
|
||||||
import Community from './Community'
|
import Community from './Community'
|
||||||
import { toastErrorSpy, toastSuccessSpy } from '@test/testSetup'
|
import { toastErrorSpy, toastSuccessSpy, toastInfoSpy } from '@test/testSetup'
|
||||||
import { createContribution, updateContribution, deleteContribution } from '@/graphql/mutations'
|
import { createContribution, updateContribution, deleteContribution } from '@/graphql/mutations'
|
||||||
import { listContributions, listAllContributions } from '@/graphql/queries'
|
import { listContributions, listAllContributions, openCreations } from '@/graphql/queries'
|
||||||
|
import { createMockClient } from 'mock-apollo-client'
|
||||||
|
import VueApollo from 'vue-apollo'
|
||||||
|
|
||||||
|
const mockClient = createMockClient()
|
||||||
|
const apolloProvider = new VueApollo({
|
||||||
|
defaultClient: mockClient,
|
||||||
|
})
|
||||||
|
|
||||||
const localVue = global.localVue
|
const localVue = global.localVue
|
||||||
|
localVue.use(VueApollo)
|
||||||
|
|
||||||
const mockStoreDispach = jest.fn()
|
const mockStoreDispach = jest.fn()
|
||||||
const apolloQueryMock = jest.fn()
|
const routerPushMock = jest.fn()
|
||||||
const apolloMutationMock = jest.fn()
|
|
||||||
const apolloRefetchMock = jest.fn()
|
|
||||||
|
|
||||||
describe('Community', () => {
|
describe('Community', () => {
|
||||||
let wrapper
|
let wrapper
|
||||||
|
|
||||||
const mocks = {
|
mockClient.setRequestHandler(
|
||||||
$t: jest.fn((t) => t),
|
openCreations,
|
||||||
$d: jest.fn((d) => d),
|
jest
|
||||||
$apollo: {
|
.fn()
|
||||||
query: apolloQueryMock,
|
.mockRejectedValueOnce({ message: 'Open Creations failed!' })
|
||||||
mutate: apolloMutationMock,
|
.mockResolvedValue({
|
||||||
queries: {
|
data: {
|
||||||
OpenCreations: {
|
openCreations: [
|
||||||
refetch: apolloRefetchMock,
|
{
|
||||||
|
month: 0,
|
||||||
|
year: 2023,
|
||||||
|
amount: '1000',
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
month: 1,
|
||||||
|
year: 2023,
|
||||||
|
amount: '1000',
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
month: 2,
|
||||||
|
year: 2023,
|
||||||
|
amount: '1000',
|
||||||
},
|
},
|
||||||
$store: {
|
],
|
||||||
dispatch: mockStoreDispach,
|
|
||||||
state: {
|
|
||||||
creation: ['1000', '1000', '1000'],
|
|
||||||
},
|
},
|
||||||
},
|
}),
|
||||||
$i18n: {
|
)
|
||||||
locale: 'en',
|
|
||||||
},
|
|
||||||
$router: {
|
|
||||||
push: jest.fn(),
|
|
||||||
},
|
|
||||||
$route: {
|
|
||||||
hash: 'my',
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
const Wrapper = () => {
|
mockClient.setRequestHandler(
|
||||||
return mount(Community, {
|
listContributions,
|
||||||
localVue,
|
jest
|
||||||
mocks,
|
.fn()
|
||||||
})
|
.mockRejectedValueOnce({ message: 'List Contributions failed!' })
|
||||||
}
|
.mockResolvedValue({
|
||||||
|
|
||||||
describe('mount', () => {
|
|
||||||
beforeEach(() => {
|
|
||||||
apolloQueryMock.mockResolvedValue({
|
|
||||||
data: {
|
data: {
|
||||||
listContributions: {
|
listContributions: {
|
||||||
contributionList: [
|
contributionList: [
|
||||||
@ -64,10 +65,40 @@ describe('Community', () => {
|
|||||||
deletedAt: null,
|
deletedAt: null,
|
||||||
confirmedBy: null,
|
confirmedBy: null,
|
||||||
confirmedAt: null,
|
confirmedAt: null,
|
||||||
|
firstName: 'Bibi',
|
||||||
|
contributionDate: '2022-07-15T08:47:06.000Z',
|
||||||
|
lastName: 'Bloxberg',
|
||||||
|
state: 'IN_PROGRESS',
|
||||||
|
messagesCount: 0,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 1550,
|
||||||
|
amount: '200',
|
||||||
|
memo: 'Fleisig, fleisig am Arbeiten gewesen',
|
||||||
|
createdAt: '2022-07-15T08:47:06.000Z',
|
||||||
|
deletedAt: null,
|
||||||
|
confirmedBy: null,
|
||||||
|
confirmedAt: null,
|
||||||
|
firstName: 'Bibi',
|
||||||
|
contributionDate: '2022-06-15T08:47:06.000Z',
|
||||||
|
lastName: 'Bloxberg',
|
||||||
|
state: 'CONFIRMED',
|
||||||
|
messagesCount: 0,
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
contributionCount: 1,
|
contributionCount: 1,
|
||||||
},
|
},
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
)
|
||||||
|
|
||||||
|
mockClient.setRequestHandler(
|
||||||
|
listAllContributions,
|
||||||
|
jest
|
||||||
|
.fn()
|
||||||
|
.mockRejectedValueOnce({ message: 'List All Contributions failed!' })
|
||||||
|
.mockResolvedValue({
|
||||||
|
data: {
|
||||||
listAllContributions: {
|
listAllContributions: {
|
||||||
contributionList: [
|
contributionList: [
|
||||||
{
|
{
|
||||||
@ -75,29 +106,137 @@ describe('Community', () => {
|
|||||||
amount: '200',
|
amount: '200',
|
||||||
memo: 'Fleisig, fleisig am Arbeiten mein lieber Freund, 50 Zeichen sind viel',
|
memo: 'Fleisig, fleisig am Arbeiten mein lieber Freund, 50 Zeichen sind viel',
|
||||||
createdAt: '2022-07-15T08:47:06.000Z',
|
createdAt: '2022-07-15T08:47:06.000Z',
|
||||||
|
contributionDate: '2022-07-15T08:47:06.000Z',
|
||||||
deletedAt: null,
|
deletedAt: null,
|
||||||
confirmedBy: null,
|
confirmedBy: null,
|
||||||
confirmedAt: null,
|
confirmedAt: null,
|
||||||
|
firstName: 'Bibi',
|
||||||
|
lastName: 'Bloxberg',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 1550,
|
||||||
|
amount: '200',
|
||||||
|
memo: 'Fleisig, fleisig am Arbeiten gewesen',
|
||||||
|
createdAt: '2022-07-15T08:47:06.000Z',
|
||||||
|
deletedAt: null,
|
||||||
|
confirmedBy: null,
|
||||||
|
confirmedAt: null,
|
||||||
|
firstName: 'Bibi',
|
||||||
|
contributionDate: '2022-06-15T08:47:06.000Z',
|
||||||
|
lastName: 'Bloxberg',
|
||||||
|
messagesCount: 0,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: 1556,
|
id: 1556,
|
||||||
amount: '400',
|
amount: '400',
|
||||||
memo: 'Ein anderer lieber Freund ist auch sehr felißig am Arbeiten!!!!',
|
memo: 'Ein anderer lieber Freund ist auch sehr felißig am Arbeiten!!!!',
|
||||||
createdAt: '2022-07-16T08:47:06.000Z',
|
createdAt: '2022-07-16T08:47:06.000Z',
|
||||||
|
contributionDate: '2022-07-16T08:47:06.000Z',
|
||||||
deletedAt: null,
|
deletedAt: null,
|
||||||
confirmedBy: null,
|
confirmedBy: null,
|
||||||
confirmedAt: null,
|
confirmedAt: null,
|
||||||
|
firstName: 'Bob',
|
||||||
|
lastName: 'der Baumeister',
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
contributionCount: 2,
|
contributionCount: 3,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
}),
|
||||||
|
)
|
||||||
|
|
||||||
|
mockClient.setRequestHandler(
|
||||||
|
createContribution,
|
||||||
|
jest
|
||||||
|
.fn()
|
||||||
|
.mockRejectedValueOnce({ message: 'Create Contribution failed!' })
|
||||||
|
.mockResolvedValue({
|
||||||
|
data: {
|
||||||
|
createContribution: true,
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
)
|
||||||
|
|
||||||
|
mockClient.setRequestHandler(
|
||||||
|
updateContribution,
|
||||||
|
jest
|
||||||
|
.fn()
|
||||||
|
.mockRejectedValueOnce({ message: 'Update Contribution failed!' })
|
||||||
|
.mockResolvedValue({
|
||||||
|
data: {
|
||||||
|
updateContribution: true,
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
)
|
||||||
|
|
||||||
|
mockClient.setRequestHandler(
|
||||||
|
deleteContribution,
|
||||||
|
jest
|
||||||
|
.fn()
|
||||||
|
.mockRejectedValueOnce({ message: 'Delete Contribution failed!' })
|
||||||
|
.mockResolvedValue({
|
||||||
|
data: {
|
||||||
|
deleteContribution: true,
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
)
|
||||||
|
|
||||||
|
const mocks = {
|
||||||
|
$t: jest.fn((t) => t),
|
||||||
|
$d: jest.fn((d) => d),
|
||||||
|
$store: {
|
||||||
|
dispatch: mockStoreDispach,
|
||||||
|
state: {
|
||||||
|
user: {
|
||||||
|
firstName: 'Bibi',
|
||||||
|
lastName: 'Bloxberg',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
$i18n: {
|
||||||
|
locale: 'en',
|
||||||
|
},
|
||||||
|
$router: {
|
||||||
|
push: routerPushMock,
|
||||||
|
},
|
||||||
|
$route: {
|
||||||
|
hash: '#edit',
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
const Wrapper = () => {
|
||||||
|
return mount(Community, {
|
||||||
|
localVue,
|
||||||
|
mocks,
|
||||||
|
apolloProvider,
|
||||||
})
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
let apolloMutateSpy
|
||||||
|
let refetchContributionsSpy
|
||||||
|
let refetchAllContributionsSpy
|
||||||
|
let refetchOpenCreationsSpy
|
||||||
|
|
||||||
|
describe('mount', () => {
|
||||||
|
beforeEach(() => {
|
||||||
|
jest.clearAllMocks()
|
||||||
wrapper = Wrapper()
|
wrapper = Wrapper()
|
||||||
|
apolloMutateSpy = jest.spyOn(wrapper.vm.$apollo, 'mutate')
|
||||||
|
refetchContributionsSpy = jest.spyOn(wrapper.vm.$apollo.queries.ListContributions, 'refetch')
|
||||||
|
refetchAllContributionsSpy = jest.spyOn(
|
||||||
|
wrapper.vm.$apollo.queries.ListAllContributions,
|
||||||
|
'refetch',
|
||||||
|
)
|
||||||
|
refetchOpenCreationsSpy = jest.spyOn(wrapper.vm.$apollo.queries.OpenCreations, 'refetch')
|
||||||
})
|
})
|
||||||
|
|
||||||
it('has a DIV .community-page', () => {
|
describe('server response for queries is error', () => {
|
||||||
expect(wrapper.find('div.community-page').exists()).toBe(true)
|
it('toasts three errors', () => {
|
||||||
|
expect(toastErrorSpy).toBeCalledTimes(3)
|
||||||
|
expect(toastErrorSpy).toBeCalledWith('Open Creations failed!')
|
||||||
|
expect(toastErrorSpy).toBeCalledWith('List Contributions failed!')
|
||||||
|
expect(toastErrorSpy).toBeCalledWith('List All Contributions failed!')
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
describe('tabs', () => {
|
describe('tabs', () => {
|
||||||
@ -105,60 +244,49 @@ describe('Community', () => {
|
|||||||
expect(wrapper.findAll('div[role="tabpanel"]')).toHaveLength(3)
|
expect(wrapper.findAll('div[role="tabpanel"]')).toHaveLength(3)
|
||||||
})
|
})
|
||||||
|
|
||||||
it.todo('check for correct tabIndex if state is "IN_PROGRESS" or not')
|
it('check for correct tabIndex if state is "IN_PROGRESS" or not', () => {
|
||||||
|
expect(routerPushMock).toBeCalledWith({ path: '/community#my' })
|
||||||
|
})
|
||||||
|
|
||||||
|
it('toasts an info', () => {
|
||||||
|
expect(toastInfoSpy).toBeCalledWith('contribution.alert.answerQuestionToast')
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
describe('API calls after creation', () => {
|
describe('API calls after creation', () => {
|
||||||
|
it('has a DIV .community-page', () => {
|
||||||
|
expect(wrapper.find('div.community-page').exists()).toBe(true)
|
||||||
|
})
|
||||||
|
|
||||||
it('emits update transactions', () => {
|
it('emits update transactions', () => {
|
||||||
expect(wrapper.emitted('update-transactions')).toEqual([[0]])
|
expect(wrapper.emitted('update-transactions')).toEqual([[0]])
|
||||||
})
|
})
|
||||||
|
})
|
||||||
|
|
||||||
it('queries list of own contributions', () => {
|
describe('save contrubtion', () => {
|
||||||
expect(apolloQueryMock).toBeCalledWith({
|
describe('with error', () => {
|
||||||
fetchPolicy: 'no-cache',
|
const now = new Date().toISOString()
|
||||||
query: listContributions,
|
beforeEach(async () => {
|
||||||
variables: {
|
await wrapper.setData({
|
||||||
currentPage: 1,
|
form: {
|
||||||
pageSize: 25,
|
id: null,
|
||||||
|
date: now,
|
||||||
|
memo: 'Mein Beitrag zur Gemeinschaft für diesen Monat ...',
|
||||||
|
amount: '200',
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
await wrapper.find('form').trigger('submit')
|
||||||
})
|
})
|
||||||
|
|
||||||
it('queries list of all contributions', () => {
|
it('toasts the error message', () => {
|
||||||
expect(apolloQueryMock).toBeCalledWith({
|
expect(toastErrorSpy).toBeCalledWith('Create Contribution failed!')
|
||||||
fetchPolicy: 'no-cache',
|
|
||||||
query: listAllContributions,
|
|
||||||
variables: {
|
|
||||||
currentPage: 1,
|
|
||||||
pageSize: 25,
|
|
||||||
},
|
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
describe('server response is error', () => {
|
|
||||||
beforeEach(() => {
|
|
||||||
jest.clearAllMocks()
|
|
||||||
apolloQueryMock.mockRejectedValue({ message: 'Ups' })
|
|
||||||
wrapper = Wrapper()
|
|
||||||
})
|
|
||||||
|
|
||||||
it('toasts two errors', () => {
|
|
||||||
expect(toastErrorSpy).toBeCalledTimes(2)
|
|
||||||
expect(toastErrorSpy).toBeCalledWith('Ups')
|
|
||||||
})
|
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
||||||
describe('set contrubtion', () => {
|
|
||||||
describe('with success', () => {
|
describe('with success', () => {
|
||||||
const now = new Date().toISOString()
|
const now = new Date().toISOString()
|
||||||
beforeEach(async () => {
|
beforeEach(async () => {
|
||||||
jest.clearAllMocks()
|
jest.clearAllMocks()
|
||||||
apolloMutationMock.mockResolvedValue({
|
|
||||||
data: {
|
|
||||||
createContribution: true,
|
|
||||||
},
|
|
||||||
})
|
|
||||||
await wrapper.setData({
|
await wrapper.setData({
|
||||||
form: {
|
form: {
|
||||||
id: null,
|
id: null,
|
||||||
@ -171,7 +299,7 @@ describe('Community', () => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
it('calls the create contribution mutation', () => {
|
it('calls the create contribution mutation', () => {
|
||||||
expect(apolloMutationMock).toBeCalledWith({
|
expect(apolloMutateSpy).toBeCalledWith({
|
||||||
fetchPolicy: 'no-cache',
|
fetchPolicy: 'no-cache',
|
||||||
mutation: createContribution,
|
mutation: createContribution,
|
||||||
variables: {
|
variables: {
|
||||||
@ -187,62 +315,49 @@ describe('Community', () => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
it('updates the contribution list', () => {
|
it('updates the contribution list', () => {
|
||||||
expect(apolloQueryMock).toBeCalledWith({
|
expect(refetchContributionsSpy).toBeCalled()
|
||||||
fetchPolicy: 'no-cache',
|
|
||||||
query: listContributions,
|
|
||||||
variables: {
|
|
||||||
currentPage: 1,
|
|
||||||
pageSize: 25,
|
|
||||||
},
|
|
||||||
})
|
|
||||||
})
|
})
|
||||||
|
|
||||||
it('verifies the login (to get the new creations available)', () => {
|
it('updates the all contribution list', () => {
|
||||||
expect(apolloRefetchMock).toBeCalled()
|
expect(refetchAllContributionsSpy).toBeCalled()
|
||||||
})
|
})
|
||||||
|
|
||||||
it('set all data to the default values)', () => {
|
it('updates the open creations', () => {
|
||||||
|
expect(refetchOpenCreationsSpy).toBeCalled()
|
||||||
|
})
|
||||||
|
|
||||||
|
it('sets all data to the default values)', () => {
|
||||||
expect(wrapper.vm.form.id).toBe(null)
|
expect(wrapper.vm.form.id).toBe(null)
|
||||||
expect(wrapper.vm.form.date).toBe('')
|
expect(wrapper.vm.form.date).toBe('')
|
||||||
expect(wrapper.vm.form.memo).toBe('')
|
expect(wrapper.vm.form.memo).toBe('')
|
||||||
expect(wrapper.vm.form.amount).toBe('')
|
expect(wrapper.vm.form.amount).toBe('')
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
describe('with error', () => {
|
|
||||||
const now = new Date().toISOString()
|
|
||||||
beforeEach(async () => {
|
|
||||||
jest.clearAllMocks()
|
|
||||||
apolloMutationMock.mockRejectedValue({
|
|
||||||
message: 'Ouch!',
|
|
||||||
})
|
|
||||||
await wrapper.setData({
|
|
||||||
form: {
|
|
||||||
id: null,
|
|
||||||
date: now,
|
|
||||||
memo: 'Mein Beitrag zur Gemeinschaft für diesen Monat ...',
|
|
||||||
amount: '200',
|
|
||||||
},
|
|
||||||
})
|
|
||||||
await wrapper.find('form').trigger('submit')
|
|
||||||
})
|
|
||||||
|
|
||||||
it('toasts the error message', () => {
|
|
||||||
expect(toastErrorSpy).toBeCalledWith('Ouch!')
|
|
||||||
})
|
|
||||||
})
|
|
||||||
})
|
})
|
||||||
|
|
||||||
describe('update contrubtion', () => {
|
describe('update contrubtion', () => {
|
||||||
|
describe('with error', () => {
|
||||||
|
const now = new Date().toISOString()
|
||||||
|
beforeEach(async () => {
|
||||||
|
await wrapper
|
||||||
|
.findComponent({ name: 'ContributionForm' })
|
||||||
|
.vm.$emit('update-contribution', {
|
||||||
|
id: 2,
|
||||||
|
date: now,
|
||||||
|
memo: 'Mein Beitrag zur Gemeinschaft für diesen Monat ...',
|
||||||
|
amount: '400',
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
it('toasts the error message', () => {
|
||||||
|
expect(toastErrorSpy).toBeCalledWith('Update Contribution failed!')
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
describe('with success', () => {
|
describe('with success', () => {
|
||||||
const now = new Date().toISOString()
|
const now = new Date().toISOString()
|
||||||
beforeEach(async () => {
|
beforeEach(async () => {
|
||||||
jest.clearAllMocks()
|
jest.clearAllMocks()
|
||||||
apolloMutationMock.mockResolvedValue({
|
|
||||||
data: {
|
|
||||||
updateContribution: true,
|
|
||||||
},
|
|
||||||
})
|
|
||||||
await wrapper
|
await wrapper
|
||||||
.findComponent({ name: 'ContributionForm' })
|
.findComponent({ name: 'ContributionForm' })
|
||||||
.vm.$emit('update-contribution', {
|
.vm.$emit('update-contribution', {
|
||||||
@ -254,7 +369,7 @@ describe('Community', () => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
it('calls the update contribution mutation', () => {
|
it('calls the update contribution mutation', () => {
|
||||||
expect(apolloMutationMock).toBeCalledWith({
|
expect(apolloMutateSpy).toBeCalledWith({
|
||||||
fetchPolicy: 'no-cache',
|
fetchPolicy: 'no-cache',
|
||||||
mutation: updateContribution,
|
mutation: updateContribution,
|
||||||
variables: {
|
variables: {
|
||||||
@ -271,40 +386,15 @@ describe('Community', () => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
it('updates the contribution list', () => {
|
it('updates the contribution list', () => {
|
||||||
expect(apolloQueryMock).toBeCalledWith({
|
expect(refetchContributionsSpy).toBeCalled()
|
||||||
fetchPolicy: 'no-cache',
|
|
||||||
query: listContributions,
|
|
||||||
variables: {
|
|
||||||
currentPage: 1,
|
|
||||||
pageSize: 25,
|
|
||||||
},
|
|
||||||
})
|
|
||||||
})
|
})
|
||||||
|
|
||||||
it('verifies the login (to get the new creations available)', () => {
|
it('updates the all contribution list', () => {
|
||||||
expect(apolloRefetchMock).toBeCalled()
|
expect(refetchAllContributionsSpy).toBeCalled()
|
||||||
})
|
|
||||||
})
|
})
|
||||||
|
|
||||||
describe('with error', () => {
|
it('updates the open creations', () => {
|
||||||
const now = new Date().toISOString()
|
expect(refetchOpenCreationsSpy).toBeCalled()
|
||||||
beforeEach(async () => {
|
|
||||||
jest.clearAllMocks()
|
|
||||||
apolloMutationMock.mockRejectedValue({
|
|
||||||
message: 'Oh No!',
|
|
||||||
})
|
|
||||||
await wrapper
|
|
||||||
.findComponent({ name: 'ContributionForm' })
|
|
||||||
.vm.$emit('update-contribution', {
|
|
||||||
id: 2,
|
|
||||||
date: now,
|
|
||||||
memo: 'Mein Beitrag zur Gemeinschaft für diesen Monat ...',
|
|
||||||
amount: '400',
|
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
||||||
it('toasts the error message', () => {
|
|
||||||
expect(toastErrorSpy).toBeCalledWith('Oh No!')
|
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
@ -314,22 +404,28 @@ describe('Community', () => {
|
|||||||
|
|
||||||
beforeEach(async () => {
|
beforeEach(async () => {
|
||||||
await wrapper.setData({ tabIndex: 1 })
|
await wrapper.setData({ tabIndex: 1 })
|
||||||
contributionListComponent = await wrapper.findComponent({ name: 'ContributionList' })
|
contributionListComponent = wrapper.findComponent({ name: 'ContributionList' })
|
||||||
|
})
|
||||||
|
|
||||||
|
describe('with error', () => {
|
||||||
|
beforeEach(async () => {
|
||||||
|
jest.clearAllMocks()
|
||||||
|
contributionListComponent.vm.$emit('delete-contribution', { id: 2 })
|
||||||
|
})
|
||||||
|
|
||||||
|
it('toasts the error message', () => {
|
||||||
|
expect(toastErrorSpy).toBeCalledWith('Delete Contribution failed!')
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
describe('with success', () => {
|
describe('with success', () => {
|
||||||
beforeEach(async () => {
|
beforeEach(async () => {
|
||||||
jest.clearAllMocks()
|
jest.clearAllMocks()
|
||||||
apolloMutationMock.mockResolvedValue({
|
await contributionListComponent.vm.$emit('delete-contribution', { id: 2 })
|
||||||
data: {
|
|
||||||
deleteContribution: true,
|
|
||||||
},
|
|
||||||
})
|
|
||||||
contributionListComponent.vm.$emit('delete-contribution', { id: 2 })
|
|
||||||
})
|
})
|
||||||
|
|
||||||
it('calls the API', () => {
|
it('calls the API', () => {
|
||||||
expect(apolloMutationMock).toBeCalledWith({
|
expect(apolloMutateSpy).toBeCalledWith({
|
||||||
fetchPolicy: 'no-cache',
|
fetchPolicy: 'no-cache',
|
||||||
mutation: deleteContribution,
|
mutation: deleteContribution,
|
||||||
variables: {
|
variables: {
|
||||||
@ -343,37 +439,20 @@ describe('Community', () => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
it('updates the contribution list', () => {
|
it('updates the contribution list', () => {
|
||||||
expect(apolloQueryMock).toBeCalledWith({
|
expect(refetchContributionsSpy).toBeCalled()
|
||||||
fetchPolicy: 'no-cache',
|
|
||||||
query: listContributions,
|
|
||||||
variables: {
|
|
||||||
currentPage: 1,
|
|
||||||
pageSize: 25,
|
|
||||||
},
|
|
||||||
})
|
|
||||||
})
|
})
|
||||||
|
|
||||||
it('verifies the login (to get the new creations available)', () => {
|
it('updates the all contribution list', () => {
|
||||||
expect(apolloRefetchMock).toBeCalled()
|
expect(refetchAllContributionsSpy).toBeCalled()
|
||||||
})
|
|
||||||
})
|
})
|
||||||
|
|
||||||
describe('with error', () => {
|
it('updates the open creations', () => {
|
||||||
beforeEach(async () => {
|
expect(refetchOpenCreationsSpy).toBeCalled()
|
||||||
jest.clearAllMocks()
|
|
||||||
apolloMutationMock.mockRejectedValue({
|
|
||||||
message: 'Oh my god!',
|
|
||||||
})
|
|
||||||
contributionListComponent.vm.$emit('delete-contribution', { id: 2 })
|
|
||||||
})
|
|
||||||
|
|
||||||
it('toasts the error message', () => {
|
|
||||||
expect(toastErrorSpy).toBeCalledWith('Oh my god!')
|
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
describe.skip('update contribution form', () => {
|
describe('update contribution form', () => {
|
||||||
const now = new Date().toISOString()
|
const now = new Date().toISOString()
|
||||||
beforeEach(async () => {
|
beforeEach(async () => {
|
||||||
await wrapper.setData({ tabIndex: 1 })
|
await wrapper.setData({ tabIndex: 1 })
|
||||||
@ -391,12 +470,58 @@ describe('Community', () => {
|
|||||||
expect(wrapper.vm.form.id).toBe(2)
|
expect(wrapper.vm.form.id).toBe(2)
|
||||||
expect(wrapper.vm.form.date).toBe(now)
|
expect(wrapper.vm.form.date).toBe(now)
|
||||||
expect(wrapper.vm.form.memo).toBe('Mein Beitrag zur Gemeinschaft für diesen Monat ...')
|
expect(wrapper.vm.form.memo).toBe('Mein Beitrag zur Gemeinschaft für diesen Monat ...')
|
||||||
expect(wrapper.vm.form.amount).toBe('400')
|
expect(wrapper.vm.form.amount).toBe('400.00')
|
||||||
})
|
})
|
||||||
|
|
||||||
it('sets tab index back to 0', () => {
|
it('sets tab index back to 0', () => {
|
||||||
expect(wrapper.vm.tabIndex).toBe(0)
|
expect(wrapper.vm.tabIndex).toBe(0)
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
describe('update list all contributions', () => {
|
||||||
|
beforeEach(async () => {
|
||||||
|
jest.clearAllMocks()
|
||||||
|
await wrapper.setData({ tabIndex: 2 })
|
||||||
|
await wrapper
|
||||||
|
.findAllComponents({ name: 'ContributionList' })
|
||||||
|
.at(1)
|
||||||
|
.vm.$emit('update-list-contributions', {
|
||||||
|
currentPage: 2,
|
||||||
|
pageSize: 5,
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
it('updates page size and current page', () => {
|
||||||
|
expect(wrapper.vm.pageSizeAll).toBe(5)
|
||||||
|
expect(wrapper.vm.currentPageAll).toBe(2)
|
||||||
|
})
|
||||||
|
|
||||||
|
it('updates the all contribution list', () => {
|
||||||
|
expect(refetchAllContributionsSpy).toBeCalled()
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
describe('update list contributions', () => {
|
||||||
|
beforeEach(async () => {
|
||||||
|
jest.clearAllMocks()
|
||||||
|
await wrapper.setData({ tabIndex: 1 })
|
||||||
|
await wrapper
|
||||||
|
.findAllComponents({ name: 'ContributionList' })
|
||||||
|
.at(0)
|
||||||
|
.vm.$emit('update-list-contributions', {
|
||||||
|
currentPage: 2,
|
||||||
|
pageSize: 5,
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
it('updates page size and current page', () => {
|
||||||
|
expect(wrapper.vm.pageSize).toBe(5)
|
||||||
|
expect(wrapper.vm.currentPage).toBe(2)
|
||||||
|
})
|
||||||
|
|
||||||
|
it('updates the all contribution list', () => {
|
||||||
|
expect(refetchContributionsSpy).toBeCalled()
|
||||||
|
})
|
||||||
|
})
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|||||||
@ -10,7 +10,7 @@
|
|||||||
/>
|
/>
|
||||||
<div class="mb-3"></div>
|
<div class="mb-3"></div>
|
||||||
<contribution-form
|
<contribution-form
|
||||||
@set-contribution="setContribution"
|
@set-contribution="saveContribution"
|
||||||
@update-contribution="updateContribution"
|
@update-contribution="updateContribution"
|
||||||
v-model="form"
|
v-model="form"
|
||||||
:isThisMonth="isThisMonth"
|
:isThisMonth="isThisMonth"
|
||||||
@ -70,6 +70,7 @@ export default {
|
|||||||
itemsAll: [],
|
itemsAll: [],
|
||||||
currentPage: 1,
|
currentPage: 1,
|
||||||
pageSize: 25,
|
pageSize: 25,
|
||||||
|
currentPageAll: 1,
|
||||||
pageSizeAll: 25,
|
pageSizeAll: 25,
|
||||||
contributionCount: 0,
|
contributionCount: 0,
|
||||||
contributionCountAll: 0,
|
contributionCountAll: 0,
|
||||||
@ -107,6 +108,51 @@ export default {
|
|||||||
this.toastError(message)
|
this.toastError(message)
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
ListAllContributions: {
|
||||||
|
query() {
|
||||||
|
return listAllContributions
|
||||||
|
},
|
||||||
|
fetchPolicy: 'network-only',
|
||||||
|
variables() {
|
||||||
|
return {
|
||||||
|
currentPage: this.currentPageAll,
|
||||||
|
pageSize: this.pageSizeAll,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
update({ listAllContributions }) {
|
||||||
|
this.contributionCountAll = listAllContributions.contributionCount
|
||||||
|
this.itemsAll = listAllContributions.contributionList
|
||||||
|
},
|
||||||
|
error({ message }) {
|
||||||
|
this.toastError(message)
|
||||||
|
},
|
||||||
|
},
|
||||||
|
ListContributions: {
|
||||||
|
query() {
|
||||||
|
return listContributions
|
||||||
|
},
|
||||||
|
fetchPolicy: 'network-only',
|
||||||
|
variables() {
|
||||||
|
return {
|
||||||
|
currentPage: this.currentPage,
|
||||||
|
pageSize: this.pageSize,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
update({ listContributions }) {
|
||||||
|
this.contributionCount = listContributions.contributionCount
|
||||||
|
this.items = listContributions.contributionList
|
||||||
|
if (this.items.find((item) => item.state === 'IN_PROGRESS')) {
|
||||||
|
this.tabIndex = 1
|
||||||
|
if (this.$route.hash !== '#my') {
|
||||||
|
this.$router.push({ path: '/community#my' })
|
||||||
|
}
|
||||||
|
this.toastInfo(this.$t('contribution.alert.answerQuestionToast'))
|
||||||
|
}
|
||||||
|
},
|
||||||
|
error({ message }) {
|
||||||
|
this.toastError(message)
|
||||||
|
},
|
||||||
|
},
|
||||||
},
|
},
|
||||||
watch: {
|
watch: {
|
||||||
$route(to, from) {
|
$route(to, from) {
|
||||||
@ -160,7 +206,12 @@ export default {
|
|||||||
this.$root.$emit('bv::toggle::collapse', value.id)
|
this.$root.$emit('bv::toggle::collapse', value.id)
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
setContribution(data) {
|
refetchData() {
|
||||||
|
this.$apollo.queries.ListAllContributions.refetch()
|
||||||
|
this.$apollo.queries.ListContributions.refetch()
|
||||||
|
this.$apollo.queries.OpenCreations.refetch()
|
||||||
|
},
|
||||||
|
saveContribution(data) {
|
||||||
this.$apollo
|
this.$apollo
|
||||||
.mutate({
|
.mutate({
|
||||||
fetchPolicy: 'no-cache',
|
fetchPolicy: 'no-cache',
|
||||||
@ -173,15 +224,7 @@ export default {
|
|||||||
})
|
})
|
||||||
.then((result) => {
|
.then((result) => {
|
||||||
this.toastSuccess(this.$t('contribution.submitted'))
|
this.toastSuccess(this.$t('contribution.submitted'))
|
||||||
this.updateListContributions({
|
this.refetchData()
|
||||||
currentPage: this.currentPage,
|
|
||||||
pageSize: this.pageSize,
|
|
||||||
})
|
|
||||||
this.updateListAllContributions({
|
|
||||||
currentPage: this.currentPage,
|
|
||||||
pageSize: this.pageSize,
|
|
||||||
})
|
|
||||||
this.$apollo.queries.OpenCreations.refetch()
|
|
||||||
})
|
})
|
||||||
.catch((err) => {
|
.catch((err) => {
|
||||||
this.toastError(err.message)
|
this.toastError(err.message)
|
||||||
@ -201,15 +244,7 @@ export default {
|
|||||||
})
|
})
|
||||||
.then((result) => {
|
.then((result) => {
|
||||||
this.toastSuccess(this.$t('contribution.updated'))
|
this.toastSuccess(this.$t('contribution.updated'))
|
||||||
this.updateListContributions({
|
this.refetchData()
|
||||||
currentPage: this.currentPage,
|
|
||||||
pageSize: this.pageSize,
|
|
||||||
})
|
|
||||||
this.updateListAllContributions({
|
|
||||||
currentPage: this.currentPage,
|
|
||||||
pageSize: this.pageSize,
|
|
||||||
})
|
|
||||||
this.$apollo.queries.OpenCreations.refetch()
|
|
||||||
})
|
})
|
||||||
.catch((err) => {
|
.catch((err) => {
|
||||||
this.toastError(err.message)
|
this.toastError(err.message)
|
||||||
@ -226,68 +261,21 @@ export default {
|
|||||||
})
|
})
|
||||||
.then((result) => {
|
.then((result) => {
|
||||||
this.toastSuccess(this.$t('contribution.deleted'))
|
this.toastSuccess(this.$t('contribution.deleted'))
|
||||||
this.updateListContributions({
|
this.refetchData()
|
||||||
currentPage: this.currentPage,
|
|
||||||
pageSize: this.pageSize,
|
|
||||||
})
|
|
||||||
this.updateListAllContributions({
|
|
||||||
currentPage: this.currentPage,
|
|
||||||
pageSize: this.pageSize,
|
|
||||||
})
|
|
||||||
this.$apollo.queries.OpenCreations.refetch()
|
|
||||||
})
|
})
|
||||||
.catch((err) => {
|
.catch((err) => {
|
||||||
this.toastError(err.message)
|
this.toastError(err.message)
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
updateListAllContributions(pagination) {
|
updateListAllContributions(pagination) {
|
||||||
this.$apollo
|
this.currentPageAll = pagination.currentPage
|
||||||
.query({
|
this.pageSizeAll = pagination.pageSize
|
||||||
fetchPolicy: 'no-cache',
|
this.$apollo.queries.ListAllContributions.refetch()
|
||||||
query: listAllContributions,
|
|
||||||
variables: {
|
|
||||||
currentPage: pagination.currentPage,
|
|
||||||
pageSize: pagination.pageSize,
|
|
||||||
},
|
|
||||||
})
|
|
||||||
.then((result) => {
|
|
||||||
const {
|
|
||||||
data: { listAllContributions },
|
|
||||||
} = result
|
|
||||||
this.contributionCountAll = listAllContributions.contributionCount
|
|
||||||
this.itemsAll = listAllContributions.contributionList
|
|
||||||
})
|
|
||||||
.catch((err) => {
|
|
||||||
this.toastError(err.message)
|
|
||||||
})
|
|
||||||
},
|
},
|
||||||
updateListContributions(pagination) {
|
updateListContributions(pagination) {
|
||||||
this.$apollo
|
this.currentPage = pagination.currentPage
|
||||||
.query({
|
this.pageSize = pagination.pageSize
|
||||||
fetchPolicy: 'no-cache',
|
this.$apollo.queries.ListContributions.refetch()
|
||||||
query: listContributions,
|
|
||||||
variables: {
|
|
||||||
currentPage: pagination.currentPage,
|
|
||||||
pageSize: pagination.pageSize,
|
|
||||||
},
|
|
||||||
})
|
|
||||||
.then((result) => {
|
|
||||||
const {
|
|
||||||
data: { listContributions },
|
|
||||||
} = result
|
|
||||||
this.contributionCount = listContributions.contributionCount
|
|
||||||
this.items = listContributions.contributionList
|
|
||||||
if (this.items.find((item) => item.state === 'IN_PROGRESS')) {
|
|
||||||
this.tabIndex = 1
|
|
||||||
if (this.$route.hash !== '#my') {
|
|
||||||
this.$router.push({ path: '/community#my' })
|
|
||||||
}
|
|
||||||
this.toastInfo(this.$t('contribution.alert.answerQuestionToast'))
|
|
||||||
}
|
|
||||||
})
|
|
||||||
.catch((err) => {
|
|
||||||
this.toastError(err.message)
|
|
||||||
})
|
|
||||||
},
|
},
|
||||||
updateContributionForm(item) {
|
updateContributionForm(item) {
|
||||||
this.form.id = item.id
|
this.form.id = item.id
|
||||||
@ -306,16 +294,7 @@ export default {
|
|||||||
this.items.find((item) => item.id === id).state = 'PENDING'
|
this.items.find((item) => item.id === id).state = 'PENDING'
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
created() {
|
created() {
|
||||||
this.updateListContributions({
|
|
||||||
currentPage: this.currentPage,
|
|
||||||
pageSize: this.pageSize,
|
|
||||||
})
|
|
||||||
this.updateListAllContributions({
|
|
||||||
currentPage: this.currentPage,
|
|
||||||
pageSize: this.pageSize,
|
|
||||||
})
|
|
||||||
this.updateTransactions(0)
|
this.updateTransactions(0)
|
||||||
this.tabIndex = 1
|
this.tabIndex = 1
|
||||||
this.$router.push({ path: '/community#my' })
|
this.$router.push({ path: '/community#my' })
|
||||||
|
|||||||
@ -22,6 +22,7 @@ import { loadFilters } from '@/filters/amount'
|
|||||||
import { toasters } from '@/mixins/toaster'
|
import { toasters } from '@/mixins/toaster'
|
||||||
export const toastErrorSpy = jest.spyOn(toasters.methods, 'toastError')
|
export const toastErrorSpy = jest.spyOn(toasters.methods, 'toastError')
|
||||||
export const toastSuccessSpy = jest.spyOn(toasters.methods, 'toastSuccess')
|
export const toastSuccessSpy = jest.spyOn(toasters.methods, 'toastSuccess')
|
||||||
|
export const toastInfoSpy = jest.spyOn(toasters.methods, 'toastInfo')
|
||||||
|
|
||||||
Object.keys(rules).forEach((rule) => {
|
Object.keys(rules).forEach((rule) => {
|
||||||
extend(rule, {
|
extend(rule, {
|
||||||
|
|||||||
@ -2,6 +2,25 @@
|
|||||||
# yarn lockfile v1
|
# yarn lockfile v1
|
||||||
|
|
||||||
|
|
||||||
|
"@apollo/client@^3.7.4":
|
||||||
|
version "3.7.4"
|
||||||
|
resolved "https://registry.yarnpkg.com/@apollo/client/-/client-3.7.4.tgz#28c3fb7f89365ccaf185bc8b51860041f37629b3"
|
||||||
|
integrity sha512-bgiCKRmLSBImX4JRrw8NjqGo0AQE/mowCdHX1PJp2r5zIXrJx0UeaAYmx1qJY69Oz/KR7SKlLt4xK+bOP1jx7A==
|
||||||
|
dependencies:
|
||||||
|
"@graphql-typed-document-node/core" "^3.1.1"
|
||||||
|
"@wry/context" "^0.7.0"
|
||||||
|
"@wry/equality" "^0.5.0"
|
||||||
|
"@wry/trie" "^0.3.0"
|
||||||
|
graphql-tag "^2.12.6"
|
||||||
|
hoist-non-react-statics "^3.3.2"
|
||||||
|
optimism "^0.16.1"
|
||||||
|
prop-types "^15.7.2"
|
||||||
|
response-iterator "^0.2.6"
|
||||||
|
symbol-observable "^4.0.0"
|
||||||
|
ts-invariant "^0.10.3"
|
||||||
|
tslib "^2.3.0"
|
||||||
|
zen-observable-ts "^1.2.5"
|
||||||
|
|
||||||
"@babel/code-frame@7.12.11":
|
"@babel/code-frame@7.12.11":
|
||||||
version "7.12.11"
|
version "7.12.11"
|
||||||
resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f"
|
resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f"
|
||||||
@ -1904,6 +1923,11 @@
|
|||||||
minimatch "^3.0.4"
|
minimatch "^3.0.4"
|
||||||
strip-json-comments "^3.1.1"
|
strip-json-comments "^3.1.1"
|
||||||
|
|
||||||
|
"@graphql-typed-document-node/core@^3.1.1":
|
||||||
|
version "3.1.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/@graphql-typed-document-node/core/-/core-3.1.1.tgz#076d78ce99822258cf813ecc1e7fa460fa74d052"
|
||||||
|
integrity sha512-NQ17ii0rK1b34VZonlmT2QMJFI70m0TRwbknO/ihlbatXyaktDhN/98vBiUU6kNBPljqGqyIrl2T4nY2RpFANg==
|
||||||
|
|
||||||
"@hapi/address@2.x.x":
|
"@hapi/address@2.x.x":
|
||||||
version "2.1.4"
|
version "2.1.4"
|
||||||
resolved "https://registry.yarnpkg.com/@hapi/address/-/address-2.1.4.tgz#5d67ed43f3fd41a69d4b9ff7b56e7c0d1d0a81e5"
|
resolved "https://registry.yarnpkg.com/@hapi/address/-/address-2.1.4.tgz#5d67ed43f3fd41a69d4b9ff7b56e7c0d1d0a81e5"
|
||||||
@ -3159,6 +3183,13 @@
|
|||||||
"@types/node" ">=6"
|
"@types/node" ">=6"
|
||||||
tslib "^1.9.3"
|
tslib "^1.9.3"
|
||||||
|
|
||||||
|
"@wry/context@^0.7.0":
|
||||||
|
version "0.7.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/@wry/context/-/context-0.7.0.tgz#be88e22c0ddf62aeb0ae9f95c3d90932c619a5c8"
|
||||||
|
integrity sha512-LcDAiYWRtwAoSOArfk7cuYvFXytxfVrdX7yxoUmK7pPITLk5jYh2F8knCwS7LjgYL8u1eidPlKKV6Ikqq0ODqQ==
|
||||||
|
dependencies:
|
||||||
|
tslib "^2.3.0"
|
||||||
|
|
||||||
"@wry/equality@^0.1.2":
|
"@wry/equality@^0.1.2":
|
||||||
version "0.1.11"
|
version "0.1.11"
|
||||||
resolved "https://registry.yarnpkg.com/@wry/equality/-/equality-0.1.11.tgz#35cb156e4a96695aa81a9ecc4d03787bc17f1790"
|
resolved "https://registry.yarnpkg.com/@wry/equality/-/equality-0.1.11.tgz#35cb156e4a96695aa81a9ecc4d03787bc17f1790"
|
||||||
@ -3166,6 +3197,20 @@
|
|||||||
dependencies:
|
dependencies:
|
||||||
tslib "^1.9.3"
|
tslib "^1.9.3"
|
||||||
|
|
||||||
|
"@wry/equality@^0.5.0":
|
||||||
|
version "0.5.3"
|
||||||
|
resolved "https://registry.yarnpkg.com/@wry/equality/-/equality-0.5.3.tgz#fafebc69561aa2d40340da89fa7dc4b1f6fb7831"
|
||||||
|
integrity sha512-avR+UXdSrsF2v8vIqIgmeTY0UR91UT+IyablCyKe/uk22uOJ8fusKZnH9JH9e1/EtLeNJBtagNmL3eJdnOV53g==
|
||||||
|
dependencies:
|
||||||
|
tslib "^2.3.0"
|
||||||
|
|
||||||
|
"@wry/trie@^0.3.0":
|
||||||
|
version "0.3.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/@wry/trie/-/trie-0.3.2.tgz#a06f235dc184bd26396ba456711f69f8c35097e6"
|
||||||
|
integrity sha512-yRTyhWSls2OY/pYLfwff867r8ekooZ4UI+/gxot5Wj8EFwSf2rG+n+Mo/6LoLQm1TKA4GRj2+LCpbfS937dClQ==
|
||||||
|
dependencies:
|
||||||
|
tslib "^2.3.0"
|
||||||
|
|
||||||
"@xtuc/ieee754@^1.2.0":
|
"@xtuc/ieee754@^1.2.0":
|
||||||
version "1.2.0"
|
version "1.2.0"
|
||||||
resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790"
|
resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790"
|
||||||
@ -7453,6 +7498,13 @@ graceful-fs@^4.2.4:
|
|||||||
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.8.tgz#e412b8d33f5e006593cbd3cee6df9f2cebbe802a"
|
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.8.tgz#e412b8d33f5e006593cbd3cee6df9f2cebbe802a"
|
||||||
integrity sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==
|
integrity sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==
|
||||||
|
|
||||||
|
graphql-tag@^2.12.6:
|
||||||
|
version "2.12.6"
|
||||||
|
resolved "https://registry.yarnpkg.com/graphql-tag/-/graphql-tag-2.12.6.tgz#d441a569c1d2537ef10ca3d1633b48725329b5f1"
|
||||||
|
integrity sha512-FdSNcu2QQcWnM2VNvSCCDCVS5PpPqpzgFT8+GXzqJuoDd0CBncxCY278u4mhRO7tMgo2JjgJA5aZ+nWSQ/Z+xg==
|
||||||
|
dependencies:
|
||||||
|
tslib "^2.1.0"
|
||||||
|
|
||||||
graphql-tag@^2.4.2:
|
graphql-tag@^2.4.2:
|
||||||
version "2.12.5"
|
version "2.12.5"
|
||||||
resolved "https://registry.yarnpkg.com/graphql-tag/-/graphql-tag-2.12.5.tgz#5cff974a67b417747d05c8d9f5f3cb4495d0db8f"
|
resolved "https://registry.yarnpkg.com/graphql-tag/-/graphql-tag-2.12.5.tgz#5cff974a67b417747d05c8d9f5f3cb4495d0db8f"
|
||||||
@ -7636,6 +7688,13 @@ hmac-drbg@^1.0.1:
|
|||||||
minimalistic-assert "^1.0.0"
|
minimalistic-assert "^1.0.0"
|
||||||
minimalistic-crypto-utils "^1.0.1"
|
minimalistic-crypto-utils "^1.0.1"
|
||||||
|
|
||||||
|
hoist-non-react-statics@^3.3.2:
|
||||||
|
version "3.3.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45"
|
||||||
|
integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==
|
||||||
|
dependencies:
|
||||||
|
react-is "^16.7.0"
|
||||||
|
|
||||||
homedir-polyfill@^1.0.1:
|
homedir-polyfill@^1.0.1:
|
||||||
version "1.0.3"
|
version "1.0.3"
|
||||||
resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz#743298cef4e5af3e194161fbadcc2151d3a058e8"
|
resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz#743298cef4e5af3e194161fbadcc2151d3a058e8"
|
||||||
@ -9915,7 +9974,7 @@ loglevel@^1.6.8:
|
|||||||
resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.7.1.tgz#005fde2f5e6e47068f935ff28573e125ef72f197"
|
resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.7.1.tgz#005fde2f5e6e47068f935ff28573e125ef72f197"
|
||||||
integrity sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw==
|
integrity sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw==
|
||||||
|
|
||||||
loose-envify@^1.0.0, loose-envify@^1.2.0:
|
loose-envify@^1.0.0, loose-envify@^1.2.0, loose-envify@^1.4.0:
|
||||||
version "1.4.0"
|
version "1.4.0"
|
||||||
resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf"
|
resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf"
|
||||||
integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==
|
integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==
|
||||||
@ -10260,6 +10319,11 @@ mkdirp@^1.0.4:
|
|||||||
resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e"
|
resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e"
|
||||||
integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==
|
integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==
|
||||||
|
|
||||||
|
mock-apollo-client@^1.2.1:
|
||||||
|
version "1.2.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/mock-apollo-client/-/mock-apollo-client-1.2.1.tgz#e3bfdc3ff73b1fea28fa7e91ec82e43ba8cbfa39"
|
||||||
|
integrity sha512-QYQ6Hxo+t7hard1bcHHbsHxlNQYTQsaMNsm2Psh/NbwLMi2R4tGzplJKt97MUWuARHMq3GHB4PTLj/gxej4Caw==
|
||||||
|
|
||||||
moment@^2.19.2:
|
moment@^2.19.2:
|
||||||
version "2.29.1"
|
version "2.29.1"
|
||||||
resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.1.tgz#b2be769fa31940be9eeea6469c075e35006fa3d3"
|
resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.1.tgz#b2be769fa31940be9eeea6469c075e35006fa3d3"
|
||||||
@ -10767,6 +10831,14 @@ optimism@^0.10.0:
|
|||||||
dependencies:
|
dependencies:
|
||||||
"@wry/context" "^0.4.0"
|
"@wry/context" "^0.4.0"
|
||||||
|
|
||||||
|
optimism@^0.16.1:
|
||||||
|
version "0.16.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/optimism/-/optimism-0.16.2.tgz#519b0c78b3b30954baed0defe5143de7776bf081"
|
||||||
|
integrity sha512-zWNbgWj+3vLEjZNIh/okkY2EUfX+vB9TJopzIZwT1xxaMqC5hRLLraePod4c5n4He08xuXNH+zhKFFCu390wiQ==
|
||||||
|
dependencies:
|
||||||
|
"@wry/context" "^0.7.0"
|
||||||
|
"@wry/trie" "^0.3.0"
|
||||||
|
|
||||||
optionator@^0.8.1, optionator@^0.8.2:
|
optionator@^0.8.1, optionator@^0.8.2:
|
||||||
version "0.8.3"
|
version "0.8.3"
|
||||||
resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495"
|
resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495"
|
||||||
@ -11721,6 +11793,15 @@ prompts@^2.0.1:
|
|||||||
kleur "^3.0.3"
|
kleur "^3.0.3"
|
||||||
sisteransi "^1.0.5"
|
sisteransi "^1.0.5"
|
||||||
|
|
||||||
|
prop-types@^15.7.2:
|
||||||
|
version "15.8.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5"
|
||||||
|
integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==
|
||||||
|
dependencies:
|
||||||
|
loose-envify "^1.4.0"
|
||||||
|
object-assign "^4.1.1"
|
||||||
|
react-is "^16.13.1"
|
||||||
|
|
||||||
proto-list@~1.2.1:
|
proto-list@~1.2.1:
|
||||||
version "1.2.4"
|
version "1.2.4"
|
||||||
resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849"
|
resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849"
|
||||||
@ -11900,7 +11981,7 @@ raw-body@2.4.0:
|
|||||||
iconv-lite "0.4.24"
|
iconv-lite "0.4.24"
|
||||||
unpipe "1.0.0"
|
unpipe "1.0.0"
|
||||||
|
|
||||||
react-is@^16.8.4:
|
react-is@^16.13.1, react-is@^16.7.0, react-is@^16.8.4:
|
||||||
version "16.13.1"
|
version "16.13.1"
|
||||||
resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4"
|
resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4"
|
||||||
integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==
|
integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==
|
||||||
@ -12269,6 +12350,11 @@ resolve@^1.10.0, resolve@^1.10.1, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.1
|
|||||||
is-core-module "^2.2.0"
|
is-core-module "^2.2.0"
|
||||||
path-parse "^1.0.6"
|
path-parse "^1.0.6"
|
||||||
|
|
||||||
|
response-iterator@^0.2.6:
|
||||||
|
version "0.2.6"
|
||||||
|
resolved "https://registry.yarnpkg.com/response-iterator/-/response-iterator-0.2.6.tgz#249005fb14d2e4eeb478a3f735a28fd8b4c9f3da"
|
||||||
|
integrity sha512-pVzEEzrsg23Sh053rmDUvLSkGXluZio0qu8VT6ukrYuvtjVfCbDZH9d6PGXb8HZfzdNZt8feXv/jvUzlhRgLnw==
|
||||||
|
|
||||||
restore-cursor@^2.0.0:
|
restore-cursor@^2.0.0:
|
||||||
version "2.0.0"
|
version "2.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf"
|
resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf"
|
||||||
@ -13406,6 +13492,11 @@ symbol-observable@^1.0.2:
|
|||||||
resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804"
|
resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804"
|
||||||
integrity sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==
|
integrity sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==
|
||||||
|
|
||||||
|
symbol-observable@^4.0.0:
|
||||||
|
version "4.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-4.0.0.tgz#5b425f192279e87f2f9b937ac8540d1984b39205"
|
||||||
|
integrity sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==
|
||||||
|
|
||||||
symbol-tree@^3.2.2, symbol-tree@^3.2.4:
|
symbol-tree@^3.2.2, symbol-tree@^3.2.4:
|
||||||
version "3.2.4"
|
version "3.2.4"
|
||||||
resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2"
|
resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2"
|
||||||
@ -13704,6 +13795,13 @@ tryer@^1.0.1:
|
|||||||
resolved "https://registry.yarnpkg.com/tryer/-/tryer-1.0.1.tgz#f2c85406800b9b0f74c9f7465b81eaad241252f8"
|
resolved "https://registry.yarnpkg.com/tryer/-/tryer-1.0.1.tgz#f2c85406800b9b0f74c9f7465b81eaad241252f8"
|
||||||
integrity sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==
|
integrity sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==
|
||||||
|
|
||||||
|
ts-invariant@^0.10.3:
|
||||||
|
version "0.10.3"
|
||||||
|
resolved "https://registry.yarnpkg.com/ts-invariant/-/ts-invariant-0.10.3.tgz#3e048ff96e91459ffca01304dbc7f61c1f642f6c"
|
||||||
|
integrity sha512-uivwYcQaxAucv1CzRp2n/QdYPo4ILf9VXgH19zEIjFx2EJufV16P0JtJVpYHy89DItG6Kwj2oIUjrcK5au+4tQ==
|
||||||
|
dependencies:
|
||||||
|
tslib "^2.1.0"
|
||||||
|
|
||||||
ts-invariant@^0.4.0:
|
ts-invariant@^0.4.0:
|
||||||
version "0.4.4"
|
version "0.4.4"
|
||||||
resolved "https://registry.yarnpkg.com/ts-invariant/-/ts-invariant-0.4.4.tgz#97a523518688f93aafad01b0e80eb803eb2abd86"
|
resolved "https://registry.yarnpkg.com/ts-invariant/-/ts-invariant-0.4.4.tgz#97a523518688f93aafad01b0e80eb803eb2abd86"
|
||||||
@ -13757,6 +13855,11 @@ tslib@^2.1.0:
|
|||||||
resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.0.tgz#803b8cdab3e12ba581a4ca41c8839bbb0dacb09e"
|
resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.0.tgz#803b8cdab3e12ba581a4ca41c8839bbb0dacb09e"
|
||||||
integrity sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==
|
integrity sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==
|
||||||
|
|
||||||
|
tslib@^2.3.0:
|
||||||
|
version "2.4.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.1.tgz#0d0bfbaac2880b91e22df0768e55be9753a5b17e"
|
||||||
|
integrity sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==
|
||||||
|
|
||||||
tsutils@^3.17.1:
|
tsutils@^3.17.1:
|
||||||
version "3.21.0"
|
version "3.21.0"
|
||||||
resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623"
|
resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623"
|
||||||
@ -14919,7 +15022,14 @@ zen-observable-ts@^0.8.21:
|
|||||||
tslib "^1.9.3"
|
tslib "^1.9.3"
|
||||||
zen-observable "^0.8.0"
|
zen-observable "^0.8.0"
|
||||||
|
|
||||||
zen-observable@^0.8.0:
|
zen-observable-ts@^1.2.5:
|
||||||
|
version "1.2.5"
|
||||||
|
resolved "https://registry.yarnpkg.com/zen-observable-ts/-/zen-observable-ts-1.2.5.tgz#6c6d9ea3d3a842812c6e9519209365a122ba8b58"
|
||||||
|
integrity sha512-QZWQekv6iB72Naeake9hS1KxHlotfRpe+WGNbNx5/ta+R3DNjVO2bswf63gXlWDcs+EMd7XY8HfVQyP1X6T4Zg==
|
||||||
|
dependencies:
|
||||||
|
zen-observable "0.8.15"
|
||||||
|
|
||||||
|
zen-observable@0.8.15, zen-observable@^0.8.0:
|
||||||
version "0.8.15"
|
version "0.8.15"
|
||||||
resolved "https://registry.yarnpkg.com/zen-observable/-/zen-observable-0.8.15.tgz#96415c512d8e3ffd920afd3889604e30b9eaac15"
|
resolved "https://registry.yarnpkg.com/zen-observable/-/zen-observable-0.8.15.tgz#96415c512d8e3ffd920afd3889604e30b9eaac15"
|
||||||
integrity sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ==
|
integrity sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ==
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user