mirror of
https://github.com/IT4Change/Ocelot-Social.git
synced 2025-12-13 07:45:56 +00:00
feat(webapp): add mute/unumute group to menu (#8335)
* basics to notify a user when a followed user posted * do not notify following user on posts in groups * followig user wrote post notification * notify regular group members when a new post is posted in the group * mute and unmute groups * clean database at end * locale for post in group notification * post in group notification triggers correctly * email settings for post in group * Add mute/unumute group to menu (WIP) * Add mute group functionality (WIP) * Add locales; use mute/unmute mutations, cleanup tests * Overhaul group content menu test * Rename isMuted to isMutedByMe and add it to group query * Add German and English locales * Add spanish translations * Add missing translation keys (with null values) * Remove console statement * Add snapshot * Replace mount by render * Mock Math.random(), add tests for mute/unmute * Use container instead of baseElement for snapshots * fix group slug tests * undo wrong variable naming * rename parameter to groupId of mute/unmute group mutation * rename parameter to groupId of mute/unmute group mutation * only non pending members have access to the comtext menu --------- Co-authored-by: Moriz Wahl <moriz.wahl@gmx.de> Co-authored-by: Ulf Gebhardt <ulf.gebhardt@webcraft-media.de>
This commit is contained in:
parent
7a44e1aa4e
commit
caeff070b7
@ -63,8 +63,8 @@ const notificationQuery = gql`
|
|||||||
`
|
`
|
||||||
|
|
||||||
const muteGroupMutation = gql`
|
const muteGroupMutation = gql`
|
||||||
mutation ($id: ID!) {
|
mutation ($groupId: ID!) {
|
||||||
muteGroup(id: $id) {
|
muteGroup(groupId: $groupId) {
|
||||||
id
|
id
|
||||||
isMutedByMe
|
isMutedByMe
|
||||||
}
|
}
|
||||||
@ -72,8 +72,8 @@ const muteGroupMutation = gql`
|
|||||||
`
|
`
|
||||||
|
|
||||||
const unmuteGroupMutation = gql`
|
const unmuteGroupMutation = gql`
|
||||||
mutation ($id: ID!) {
|
mutation ($groupId: ID!) {
|
||||||
unmuteGroup(id: $id) {
|
unmuteGroup(groupId: $groupId) {
|
||||||
id
|
id
|
||||||
isMutedByMe
|
isMutedByMe
|
||||||
}
|
}
|
||||||
@ -281,7 +281,7 @@ describe('notify group members of new posts in group', () => {
|
|||||||
mutate({
|
mutate({
|
||||||
mutation: muteGroupMutation,
|
mutation: muteGroupMutation,
|
||||||
variables: {
|
variables: {
|
||||||
id: 'g-1',
|
groupId: 'g-1',
|
||||||
},
|
},
|
||||||
}),
|
}),
|
||||||
).resolves.toMatchObject({
|
).resolves.toMatchObject({
|
||||||
@ -340,7 +340,7 @@ describe('notify group members of new posts in group', () => {
|
|||||||
mutate({
|
mutate({
|
||||||
mutation: unmuteGroupMutation,
|
mutation: unmuteGroupMutation,
|
||||||
variables: {
|
variables: {
|
||||||
id: 'g-1',
|
groupId: 'g-1',
|
||||||
},
|
},
|
||||||
}),
|
}),
|
||||||
).resolves.toMatchObject({
|
).resolves.toMatchObject({
|
||||||
|
|||||||
@ -369,7 +369,7 @@ export default {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
muteGroup: async (_parent, params, context, _resolveInfo) => {
|
muteGroup: async (_parent, params, context, _resolveInfo) => {
|
||||||
const { id: groupId } = params
|
const { groupId } = params
|
||||||
const userId = context.user.id
|
const userId = context.user.id
|
||||||
const session = context.driver.session()
|
const session = context.driver.session()
|
||||||
const writeTxResultPromise = session.writeTransaction(async (transaction) => {
|
const writeTxResultPromise = session.writeTransaction(async (transaction) => {
|
||||||
@ -398,7 +398,7 @@ export default {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
unmuteGroup: async (_parent, params, context, _resolveInfo) => {
|
unmuteGroup: async (_parent, params, context, _resolveInfo) => {
|
||||||
const { id: groupId } = params
|
const { groupId } = params
|
||||||
const userId = context.user.id
|
const userId = context.user.id
|
||||||
const session = context.driver.session()
|
const session = context.driver.session()
|
||||||
const writeTxResultPromise = session.writeTransaction(async (transaction) => {
|
const writeTxResultPromise = session.writeTransaction(async (transaction) => {
|
||||||
|
|||||||
@ -142,6 +142,6 @@ type Mutation {
|
|||||||
userId: ID!
|
userId: ID!
|
||||||
): User
|
): User
|
||||||
|
|
||||||
muteGroup(id: ID!): Group
|
muteGroup(groupId: ID!): Group
|
||||||
unmuteGroup(id: ID!): Group
|
unmuteGroup(groupId: ID!): Group
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
import { mount } from '@vue/test-utils'
|
|
||||||
import GroupContentMenu from './GroupContentMenu.vue'
|
import GroupContentMenu from './GroupContentMenu.vue'
|
||||||
|
import { render, screen, fireEvent } from '@testing-library/vue'
|
||||||
|
|
||||||
const localVue = global.localVue
|
const localVue = global.localVue
|
||||||
|
|
||||||
@ -7,36 +7,77 @@ const stubs = {
|
|||||||
'router-link': {
|
'router-link': {
|
||||||
template: '<span><slot /></span>',
|
template: '<span><slot /></span>',
|
||||||
},
|
},
|
||||||
|
'v-popover': true,
|
||||||
}
|
}
|
||||||
|
|
||||||
const propsData = {
|
// Mock Math.random, used in Dropdown
|
||||||
usage: 'groupTeaser',
|
Object.assign(Math, {
|
||||||
resource: {},
|
random: () => 0,
|
||||||
group: {},
|
})
|
||||||
resourceType: 'group',
|
|
||||||
}
|
|
||||||
|
|
||||||
describe('GroupContentMenu', () => {
|
describe('GroupContentMenu', () => {
|
||||||
let wrapper
|
|
||||||
let mocks
|
let mocks
|
||||||
|
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
mocks = {
|
mocks = {
|
||||||
$t: jest.fn(),
|
$t: jest.fn((s) => s),
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
describe('mount', () => {
|
const Wrapper = (propsData) => {
|
||||||
const Wrapper = () => {
|
return render(GroupContentMenu, { propsData, mocks, localVue, stubs })
|
||||||
return mount(GroupContentMenu, { propsData, mocks, localVue, stubs })
|
|
||||||
}
|
}
|
||||||
|
|
||||||
beforeEach(() => {
|
it('renders as groupTeaser', () => {
|
||||||
wrapper = Wrapper()
|
const wrapper = Wrapper({ usage: 'groupTeaser', group: { id: 'groupid' } })
|
||||||
|
expect(wrapper.container).toMatchSnapshot()
|
||||||
})
|
})
|
||||||
|
|
||||||
it('renders', () => {
|
it('renders as groupProfile, not muted', () => {
|
||||||
expect(wrapper.findAll('.group-content-menu')).toHaveLength(1)
|
const wrapper = Wrapper({
|
||||||
|
usage: 'groupProfile',
|
||||||
|
group: { isMutedByMe: false, id: 'groupid' },
|
||||||
|
})
|
||||||
|
expect(wrapper.container).toMatchSnapshot()
|
||||||
|
})
|
||||||
|
|
||||||
|
it('renders as groupProfile, muted', () => {
|
||||||
|
const wrapper = Wrapper({
|
||||||
|
usage: 'groupProfile',
|
||||||
|
group: { isMutedByMe: true, id: 'groupid' },
|
||||||
|
})
|
||||||
|
expect(wrapper.container).toMatchSnapshot()
|
||||||
|
})
|
||||||
|
|
||||||
|
it('renders as groupProfile when I am the owner', () => {
|
||||||
|
const wrapper = Wrapper({
|
||||||
|
usage: 'groupProfile',
|
||||||
|
group: { myRole: 'owner', id: 'groupid' },
|
||||||
|
})
|
||||||
|
expect(wrapper.container).toMatchSnapshot()
|
||||||
|
})
|
||||||
|
|
||||||
|
describe('mute button', () => {
|
||||||
|
it('emits mute', async () => {
|
||||||
|
const wrapper = Wrapper({
|
||||||
|
usage: 'groupProfile',
|
||||||
|
group: { isMutedByMe: false, id: 'groupid' },
|
||||||
|
})
|
||||||
|
const muteButton = screen.getByText('group.contentMenu.muteGroup')
|
||||||
|
await fireEvent.click(muteButton)
|
||||||
|
expect(wrapper.emitted().mute).toBeTruthy()
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
describe('unmute button', () => {
|
||||||
|
it('emits unmute', async () => {
|
||||||
|
const wrapper = Wrapper({
|
||||||
|
usage: 'groupProfile',
|
||||||
|
group: { isMutedByMe: true, id: 'groupid' },
|
||||||
|
})
|
||||||
|
const muteButton = screen.getByText('group.contentMenu.unmuteGroup')
|
||||||
|
await fireEvent.click(muteButton)
|
||||||
|
expect(wrapper.emitted().unmute).toBeTruthy()
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|||||||
@ -62,6 +62,27 @@ export default {
|
|||||||
params: { id: this.group.id, slug: this.group.slug },
|
params: { id: this.group.id, slug: this.group.slug },
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (this.usage === 'groupProfile') {
|
||||||
|
if (this.group.isMutedByMe) {
|
||||||
|
routes.push({
|
||||||
|
label: this.$t('group.contentMenu.unmuteGroup'),
|
||||||
|
icon: 'volume-up',
|
||||||
|
callback: () => {
|
||||||
|
this.$emit('unmute', this.group.id)
|
||||||
|
},
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
routes.push({
|
||||||
|
label: this.$t('group.contentMenu.muteGroup'),
|
||||||
|
icon: 'volume-off',
|
||||||
|
callback: () => {
|
||||||
|
this.$emit('mute', this.group.id)
|
||||||
|
},
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (this.group.myRole === 'owner') {
|
if (this.group.myRole === 'owner') {
|
||||||
routes.push({
|
routes.push({
|
||||||
label: this.$t('admin.settings.name'),
|
label: this.$t('admin.settings.name'),
|
||||||
|
|||||||
@ -0,0 +1,321 @@
|
|||||||
|
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
||||||
|
|
||||||
|
exports[`GroupContentMenu renders as groupProfile when I am the owner 1`] = `
|
||||||
|
<div>
|
||||||
|
<v-popover-stub
|
||||||
|
autohide="true"
|
||||||
|
class="group-content-menu"
|
||||||
|
container="body"
|
||||||
|
delay="0"
|
||||||
|
handleresize="true"
|
||||||
|
offset="5"
|
||||||
|
openclass="open"
|
||||||
|
opengroup="0"
|
||||||
|
placement="bottom-end"
|
||||||
|
popoverarrowclass="tooltip-arrow popover-arrow"
|
||||||
|
popoverbaseclass="tooltip popover"
|
||||||
|
popoverclass="vue-popover-theme"
|
||||||
|
popoverinnerclass="tooltip-inner popover-inner"
|
||||||
|
popoverwrapperclass="wrapper"
|
||||||
|
popperoptions="[object Object]"
|
||||||
|
trigger="manual"
|
||||||
|
>
|
||||||
|
<button
|
||||||
|
class="base-button --icon-only --circle --small"
|
||||||
|
data-test="group-menu-button"
|
||||||
|
type="button"
|
||||||
|
>
|
||||||
|
<span
|
||||||
|
class="base-icon"
|
||||||
|
>
|
||||||
|
<!---->
|
||||||
|
</span>
|
||||||
|
|
||||||
|
<!---->
|
||||||
|
|
||||||
|
</button>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<div
|
||||||
|
class="group-menu-popover"
|
||||||
|
>
|
||||||
|
<nav
|
||||||
|
class="ds-menu"
|
||||||
|
>
|
||||||
|
<ul
|
||||||
|
class="ds-menu-list"
|
||||||
|
>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li
|
||||||
|
class="ds-menu-item ds-menu-item-level-0"
|
||||||
|
>
|
||||||
|
<a
|
||||||
|
class="ds-menu-item-link"
|
||||||
|
exact="true"
|
||||||
|
href="/"
|
||||||
|
>
|
||||||
|
<span
|
||||||
|
class="base-icon"
|
||||||
|
>
|
||||||
|
<!---->
|
||||||
|
</span>
|
||||||
|
|
||||||
|
group.contentMenu.muteGroup
|
||||||
|
|
||||||
|
</a>
|
||||||
|
<!---->
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li
|
||||||
|
class="ds-menu-item ds-menu-item-level-0"
|
||||||
|
>
|
||||||
|
<a
|
||||||
|
class="ds-menu-item-link"
|
||||||
|
href="/groups/edit/groupid"
|
||||||
|
>
|
||||||
|
<span
|
||||||
|
class="base-icon"
|
||||||
|
>
|
||||||
|
<!---->
|
||||||
|
</span>
|
||||||
|
|
||||||
|
admin.settings.name
|
||||||
|
|
||||||
|
</a>
|
||||||
|
<!---->
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</v-popover-stub>
|
||||||
|
</div>
|
||||||
|
`;
|
||||||
|
|
||||||
|
exports[`GroupContentMenu renders as groupProfile, muted 1`] = `
|
||||||
|
<div>
|
||||||
|
<v-popover-stub
|
||||||
|
autohide="true"
|
||||||
|
class="group-content-menu"
|
||||||
|
container="body"
|
||||||
|
delay="0"
|
||||||
|
handleresize="true"
|
||||||
|
offset="5"
|
||||||
|
openclass="open"
|
||||||
|
opengroup="0"
|
||||||
|
placement="bottom-end"
|
||||||
|
popoverarrowclass="tooltip-arrow popover-arrow"
|
||||||
|
popoverbaseclass="tooltip popover"
|
||||||
|
popoverclass="vue-popover-theme"
|
||||||
|
popoverinnerclass="tooltip-inner popover-inner"
|
||||||
|
popoverwrapperclass="wrapper"
|
||||||
|
popperoptions="[object Object]"
|
||||||
|
trigger="manual"
|
||||||
|
>
|
||||||
|
<button
|
||||||
|
class="base-button --icon-only --circle --small"
|
||||||
|
data-test="group-menu-button"
|
||||||
|
type="button"
|
||||||
|
>
|
||||||
|
<span
|
||||||
|
class="base-icon"
|
||||||
|
>
|
||||||
|
<!---->
|
||||||
|
</span>
|
||||||
|
|
||||||
|
<!---->
|
||||||
|
|
||||||
|
</button>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<div
|
||||||
|
class="group-menu-popover"
|
||||||
|
>
|
||||||
|
<nav
|
||||||
|
class="ds-menu"
|
||||||
|
>
|
||||||
|
<ul
|
||||||
|
class="ds-menu-list"
|
||||||
|
>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li
|
||||||
|
class="ds-menu-item ds-menu-item-level-0"
|
||||||
|
>
|
||||||
|
<a
|
||||||
|
class="ds-menu-item-link"
|
||||||
|
exact="true"
|
||||||
|
href="/"
|
||||||
|
>
|
||||||
|
<span
|
||||||
|
class="base-icon"
|
||||||
|
>
|
||||||
|
<!---->
|
||||||
|
</span>
|
||||||
|
|
||||||
|
group.contentMenu.unmuteGroup
|
||||||
|
|
||||||
|
</a>
|
||||||
|
<!---->
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</v-popover-stub>
|
||||||
|
</div>
|
||||||
|
`;
|
||||||
|
|
||||||
|
exports[`GroupContentMenu renders as groupProfile, not muted 1`] = `
|
||||||
|
<div>
|
||||||
|
<v-popover-stub
|
||||||
|
autohide="true"
|
||||||
|
class="group-content-menu"
|
||||||
|
container="body"
|
||||||
|
delay="0"
|
||||||
|
handleresize="true"
|
||||||
|
offset="5"
|
||||||
|
openclass="open"
|
||||||
|
opengroup="0"
|
||||||
|
placement="bottom-end"
|
||||||
|
popoverarrowclass="tooltip-arrow popover-arrow"
|
||||||
|
popoverbaseclass="tooltip popover"
|
||||||
|
popoverclass="vue-popover-theme"
|
||||||
|
popoverinnerclass="tooltip-inner popover-inner"
|
||||||
|
popoverwrapperclass="wrapper"
|
||||||
|
popperoptions="[object Object]"
|
||||||
|
trigger="manual"
|
||||||
|
>
|
||||||
|
<button
|
||||||
|
class="base-button --icon-only --circle --small"
|
||||||
|
data-test="group-menu-button"
|
||||||
|
type="button"
|
||||||
|
>
|
||||||
|
<span
|
||||||
|
class="base-icon"
|
||||||
|
>
|
||||||
|
<!---->
|
||||||
|
</span>
|
||||||
|
|
||||||
|
<!---->
|
||||||
|
|
||||||
|
</button>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<div
|
||||||
|
class="group-menu-popover"
|
||||||
|
>
|
||||||
|
<nav
|
||||||
|
class="ds-menu"
|
||||||
|
>
|
||||||
|
<ul
|
||||||
|
class="ds-menu-list"
|
||||||
|
>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li
|
||||||
|
class="ds-menu-item ds-menu-item-level-0"
|
||||||
|
>
|
||||||
|
<a
|
||||||
|
class="ds-menu-item-link"
|
||||||
|
exact="true"
|
||||||
|
href="/"
|
||||||
|
>
|
||||||
|
<span
|
||||||
|
class="base-icon"
|
||||||
|
>
|
||||||
|
<!---->
|
||||||
|
</span>
|
||||||
|
|
||||||
|
group.contentMenu.muteGroup
|
||||||
|
|
||||||
|
</a>
|
||||||
|
<!---->
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</v-popover-stub>
|
||||||
|
</div>
|
||||||
|
`;
|
||||||
|
|
||||||
|
exports[`GroupContentMenu renders as groupTeaser 1`] = `
|
||||||
|
<div>
|
||||||
|
<v-popover-stub
|
||||||
|
autohide="true"
|
||||||
|
class="group-content-menu"
|
||||||
|
container="body"
|
||||||
|
delay="0"
|
||||||
|
handleresize="true"
|
||||||
|
offset="5"
|
||||||
|
openclass="open"
|
||||||
|
opengroup="0"
|
||||||
|
placement="bottom-end"
|
||||||
|
popoverarrowclass="tooltip-arrow popover-arrow"
|
||||||
|
popoverbaseclass="tooltip popover"
|
||||||
|
popoverclass="vue-popover-theme"
|
||||||
|
popoverinnerclass="tooltip-inner popover-inner"
|
||||||
|
popoverwrapperclass="wrapper"
|
||||||
|
popperoptions="[object Object]"
|
||||||
|
trigger="manual"
|
||||||
|
>
|
||||||
|
<button
|
||||||
|
class="base-button --icon-only --circle --small"
|
||||||
|
data-test="group-menu-button"
|
||||||
|
type="button"
|
||||||
|
>
|
||||||
|
<span
|
||||||
|
class="base-icon"
|
||||||
|
>
|
||||||
|
<!---->
|
||||||
|
</span>
|
||||||
|
|
||||||
|
<!---->
|
||||||
|
|
||||||
|
</button>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<div
|
||||||
|
class="group-menu-popover"
|
||||||
|
>
|
||||||
|
<nav
|
||||||
|
class="ds-menu"
|
||||||
|
>
|
||||||
|
<ul
|
||||||
|
class="ds-menu-list"
|
||||||
|
>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li
|
||||||
|
class="ds-menu-item ds-menu-item-level-0"
|
||||||
|
>
|
||||||
|
<a
|
||||||
|
class="ds-menu-item-link"
|
||||||
|
href="/groups/groupid"
|
||||||
|
>
|
||||||
|
<span
|
||||||
|
class="base-icon"
|
||||||
|
>
|
||||||
|
<!---->
|
||||||
|
</span>
|
||||||
|
|
||||||
|
group.contentMenu.visitGroupPage
|
||||||
|
|
||||||
|
</a>
|
||||||
|
<!---->
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</v-popover-stub>
|
||||||
|
</div>
|
||||||
|
`;
|
||||||
@ -177,6 +177,7 @@ export const groupQuery = (i18n) => {
|
|||||||
descriptionExcerpt
|
descriptionExcerpt
|
||||||
groupType
|
groupType
|
||||||
actionRadius
|
actionRadius
|
||||||
|
isMutedByMe
|
||||||
categories {
|
categories {
|
||||||
id
|
id
|
||||||
slug
|
slug
|
||||||
|
|||||||
25
webapp/graphql/settings/MutedGroups.js
Normal file
25
webapp/graphql/settings/MutedGroups.js
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
import gql from 'graphql-tag'
|
||||||
|
|
||||||
|
export const muteGroup = () => {
|
||||||
|
return gql`
|
||||||
|
mutation ($groupId: ID!) {
|
||||||
|
muteGroup(groupId: $groupId) {
|
||||||
|
id
|
||||||
|
name
|
||||||
|
isMutedByMe
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`
|
||||||
|
}
|
||||||
|
|
||||||
|
export const unmuteGroup = () => {
|
||||||
|
return gql`
|
||||||
|
mutation ($groupId: ID!) {
|
||||||
|
unmuteGroup(groupId: $groupId) {
|
||||||
|
id
|
||||||
|
name
|
||||||
|
isMutedByMe
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`
|
||||||
|
}
|
||||||
@ -485,6 +485,8 @@
|
|||||||
"categoriesTitle": "Themen der Gruppe",
|
"categoriesTitle": "Themen der Gruppe",
|
||||||
"changeMemberRole": "Die Rolle wurde auf „{role}“ geändert!",
|
"changeMemberRole": "Die Rolle wurde auf „{role}“ geändert!",
|
||||||
"contentMenu": {
|
"contentMenu": {
|
||||||
|
"muteGroup": "Gruppe stummschalten",
|
||||||
|
"unmuteGroup": "Gruppe nicht mehr stummschalten",
|
||||||
"visitGroupPage": "Gruppe anzeigen"
|
"visitGroupPage": "Gruppe anzeigen"
|
||||||
},
|
},
|
||||||
"createNewGroup": {
|
"createNewGroup": {
|
||||||
@ -535,6 +537,7 @@
|
|||||||
"confirmAddGroupMemberText": "Nutzer „{name}“ zur Gruppe hinzufügen?",
|
"confirmAddGroupMemberText": "Nutzer „{name}“ zur Gruppe hinzufügen?",
|
||||||
"confirmAddGroupMemberTitle": "Bestätigen"
|
"confirmAddGroupMemberTitle": "Bestätigen"
|
||||||
},
|
},
|
||||||
|
"muted": "Gruppe stummgeschaltet",
|
||||||
"myGroups": "Meine Gruppen",
|
"myGroups": "Meine Gruppen",
|
||||||
"name": "Gruppenname",
|
"name": "Gruppenname",
|
||||||
"radius": "Radius",
|
"radius": "Radius",
|
||||||
@ -559,6 +562,8 @@
|
|||||||
"hidden": "Geheim — Gruppe (auch der Name) komplett unsichtbar",
|
"hidden": "Geheim — Gruppe (auch der Name) komplett unsichtbar",
|
||||||
"public": "Öffentlich — Gruppe und alle Beiträge für registrierte Nutzer sichtbar"
|
"public": "Öffentlich — Gruppe und alle Beiträge für registrierte Nutzer sichtbar"
|
||||||
},
|
},
|
||||||
|
"unmute": "Gruppe nicht mehr stummschalten",
|
||||||
|
"unmuted": "Gruppe nicht mehr stummgeschaltet",
|
||||||
"update": "Änderung speichern",
|
"update": "Änderung speichern",
|
||||||
"updatedGroup": "Die Gruppendaten wurden geändert!"
|
"updatedGroup": "Die Gruppendaten wurden geändert!"
|
||||||
},
|
},
|
||||||
|
|||||||
@ -485,6 +485,8 @@
|
|||||||
"categoriesTitle": "Topics of the group",
|
"categoriesTitle": "Topics of the group",
|
||||||
"changeMemberRole": "The role has been changed to “{role}”!",
|
"changeMemberRole": "The role has been changed to “{role}”!",
|
||||||
"contentMenu": {
|
"contentMenu": {
|
||||||
|
"muteGroup": "Mute group",
|
||||||
|
"unmuteGroup": "Unmute group",
|
||||||
"visitGroupPage": "Show group"
|
"visitGroupPage": "Show group"
|
||||||
},
|
},
|
||||||
"createNewGroup": {
|
"createNewGroup": {
|
||||||
@ -535,6 +537,7 @@
|
|||||||
"confirmAddGroupMemberText": "Add user “{name}” to group?",
|
"confirmAddGroupMemberText": "Add user “{name}” to group?",
|
||||||
"confirmAddGroupMemberTitle": "Confirm"
|
"confirmAddGroupMemberTitle": "Confirm"
|
||||||
},
|
},
|
||||||
|
"muted": "Group muted",
|
||||||
"myGroups": "My Groups",
|
"myGroups": "My Groups",
|
||||||
"name": "Group name",
|
"name": "Group name",
|
||||||
"radius": "Radius",
|
"radius": "Radius",
|
||||||
@ -559,6 +562,8 @@
|
|||||||
"hidden": "Secret — Group (including the name) is completely invisible",
|
"hidden": "Secret — Group (including the name) is completely invisible",
|
||||||
"public": "Public — Group and all posts are visible for all registered users"
|
"public": "Public — Group and all posts are visible for all registered users"
|
||||||
},
|
},
|
||||||
|
"unmute": "Unmute group",
|
||||||
|
"unmuted": "Group unmuted",
|
||||||
"update": "Save change",
|
"update": "Save change",
|
||||||
"updatedGroup": "The group data has been changed."
|
"updatedGroup": "The group data has been changed."
|
||||||
},
|
},
|
||||||
|
|||||||
@ -485,6 +485,8 @@
|
|||||||
"categoriesTitle": null,
|
"categoriesTitle": null,
|
||||||
"changeMemberRole": null,
|
"changeMemberRole": null,
|
||||||
"contentMenu": {
|
"contentMenu": {
|
||||||
|
"muteGroup": "Silenciar grupo",
|
||||||
|
"unmuteGroup": "Desactivar silencio del grupo",
|
||||||
"visitGroupPage": null
|
"visitGroupPage": null
|
||||||
},
|
},
|
||||||
"createNewGroup": {
|
"createNewGroup": {
|
||||||
@ -535,6 +537,7 @@
|
|||||||
"confirmAddGroupMemberText": null,
|
"confirmAddGroupMemberText": null,
|
||||||
"confirmAddGroupMemberTitle": null
|
"confirmAddGroupMemberTitle": null
|
||||||
},
|
},
|
||||||
|
"muted": "Grupo silenciado",
|
||||||
"myGroups": null,
|
"myGroups": null,
|
||||||
"name": null,
|
"name": null,
|
||||||
"radius": null,
|
"radius": null,
|
||||||
@ -559,6 +562,8 @@
|
|||||||
"hidden": null,
|
"hidden": null,
|
||||||
"public": null
|
"public": null
|
||||||
},
|
},
|
||||||
|
"unmute": "Desactivar silencio",
|
||||||
|
"unmuted": "Silencio del grupo desactivado",
|
||||||
"update": null,
|
"update": null,
|
||||||
"updatedGroup": null
|
"updatedGroup": null
|
||||||
},
|
},
|
||||||
|
|||||||
@ -485,6 +485,8 @@
|
|||||||
"categoriesTitle": null,
|
"categoriesTitle": null,
|
||||||
"changeMemberRole": null,
|
"changeMemberRole": null,
|
||||||
"contentMenu": {
|
"contentMenu": {
|
||||||
|
"muteGroup": null,
|
||||||
|
"unmuteGroup": null,
|
||||||
"visitGroupPage": null
|
"visitGroupPage": null
|
||||||
},
|
},
|
||||||
"createNewGroup": {
|
"createNewGroup": {
|
||||||
@ -535,6 +537,7 @@
|
|||||||
"confirmAddGroupMemberText": null,
|
"confirmAddGroupMemberText": null,
|
||||||
"confirmAddGroupMemberTitle": null
|
"confirmAddGroupMemberTitle": null
|
||||||
},
|
},
|
||||||
|
"muted": null,
|
||||||
"myGroups": null,
|
"myGroups": null,
|
||||||
"name": null,
|
"name": null,
|
||||||
"radius": null,
|
"radius": null,
|
||||||
@ -559,6 +562,8 @@
|
|||||||
"hidden": null,
|
"hidden": null,
|
||||||
"public": null
|
"public": null
|
||||||
},
|
},
|
||||||
|
"unmute": null,
|
||||||
|
"unmuted": null,
|
||||||
"update": null,
|
"update": null,
|
||||||
"updatedGroup": null
|
"updatedGroup": null
|
||||||
},
|
},
|
||||||
|
|||||||
@ -485,6 +485,8 @@
|
|||||||
"categoriesTitle": null,
|
"categoriesTitle": null,
|
||||||
"changeMemberRole": null,
|
"changeMemberRole": null,
|
||||||
"contentMenu": {
|
"contentMenu": {
|
||||||
|
"muteGroup": null,
|
||||||
|
"unmuteGroup": null,
|
||||||
"visitGroupPage": null
|
"visitGroupPage": null
|
||||||
},
|
},
|
||||||
"createNewGroup": {
|
"createNewGroup": {
|
||||||
@ -535,6 +537,7 @@
|
|||||||
"confirmAddGroupMemberText": null,
|
"confirmAddGroupMemberText": null,
|
||||||
"confirmAddGroupMemberTitle": null
|
"confirmAddGroupMemberTitle": null
|
||||||
},
|
},
|
||||||
|
"muted": null,
|
||||||
"myGroups": null,
|
"myGroups": null,
|
||||||
"name": null,
|
"name": null,
|
||||||
"radius": null,
|
"radius": null,
|
||||||
@ -559,6 +562,8 @@
|
|||||||
"hidden": null,
|
"hidden": null,
|
||||||
"public": null
|
"public": null
|
||||||
},
|
},
|
||||||
|
"unmute": null,
|
||||||
|
"unmuted": null,
|
||||||
"update": null,
|
"update": null,
|
||||||
"updatedGroup": null
|
"updatedGroup": null
|
||||||
},
|
},
|
||||||
|
|||||||
@ -485,6 +485,8 @@
|
|||||||
"categoriesTitle": null,
|
"categoriesTitle": null,
|
||||||
"changeMemberRole": null,
|
"changeMemberRole": null,
|
||||||
"contentMenu": {
|
"contentMenu": {
|
||||||
|
"muteGroup": null,
|
||||||
|
"unmuteGroup": null,
|
||||||
"visitGroupPage": null
|
"visitGroupPage": null
|
||||||
},
|
},
|
||||||
"createNewGroup": {
|
"createNewGroup": {
|
||||||
@ -535,6 +537,7 @@
|
|||||||
"confirmAddGroupMemberText": null,
|
"confirmAddGroupMemberText": null,
|
||||||
"confirmAddGroupMemberTitle": null
|
"confirmAddGroupMemberTitle": null
|
||||||
},
|
},
|
||||||
|
"muted": null,
|
||||||
"myGroups": null,
|
"myGroups": null,
|
||||||
"name": null,
|
"name": null,
|
||||||
"radius": null,
|
"radius": null,
|
||||||
@ -559,6 +562,8 @@
|
|||||||
"hidden": null,
|
"hidden": null,
|
||||||
"public": null
|
"public": null
|
||||||
},
|
},
|
||||||
|
"unmute": null,
|
||||||
|
"unmuted": null,
|
||||||
"update": null,
|
"update": null,
|
||||||
"updatedGroup": null
|
"updatedGroup": null
|
||||||
},
|
},
|
||||||
|
|||||||
@ -485,6 +485,8 @@
|
|||||||
"categoriesTitle": null,
|
"categoriesTitle": null,
|
||||||
"changeMemberRole": null,
|
"changeMemberRole": null,
|
||||||
"contentMenu": {
|
"contentMenu": {
|
||||||
|
"muteGroup": null,
|
||||||
|
"unmuteGroup": null,
|
||||||
"visitGroupPage": null
|
"visitGroupPage": null
|
||||||
},
|
},
|
||||||
"createNewGroup": {
|
"createNewGroup": {
|
||||||
@ -535,6 +537,7 @@
|
|||||||
"confirmAddGroupMemberText": null,
|
"confirmAddGroupMemberText": null,
|
||||||
"confirmAddGroupMemberTitle": null
|
"confirmAddGroupMemberTitle": null
|
||||||
},
|
},
|
||||||
|
"muted": null,
|
||||||
"myGroups": null,
|
"myGroups": null,
|
||||||
"name": null,
|
"name": null,
|
||||||
"radius": null,
|
"radius": null,
|
||||||
@ -559,6 +562,8 @@
|
|||||||
"hidden": null,
|
"hidden": null,
|
||||||
"public": null
|
"public": null
|
||||||
},
|
},
|
||||||
|
"unmute": null,
|
||||||
|
"unmuted": null,
|
||||||
"update": null,
|
"update": null,
|
||||||
"updatedGroup": null
|
"updatedGroup": null
|
||||||
},
|
},
|
||||||
|
|||||||
@ -485,6 +485,8 @@
|
|||||||
"categoriesTitle": null,
|
"categoriesTitle": null,
|
||||||
"changeMemberRole": null,
|
"changeMemberRole": null,
|
||||||
"contentMenu": {
|
"contentMenu": {
|
||||||
|
"muteGroup": null,
|
||||||
|
"unmuteGroup": null,
|
||||||
"visitGroupPage": null
|
"visitGroupPage": null
|
||||||
},
|
},
|
||||||
"createNewGroup": {
|
"createNewGroup": {
|
||||||
@ -535,6 +537,7 @@
|
|||||||
"confirmAddGroupMemberText": null,
|
"confirmAddGroupMemberText": null,
|
||||||
"confirmAddGroupMemberTitle": null
|
"confirmAddGroupMemberTitle": null
|
||||||
},
|
},
|
||||||
|
"muted": null,
|
||||||
"myGroups": null,
|
"myGroups": null,
|
||||||
"name": null,
|
"name": null,
|
||||||
"radius": null,
|
"radius": null,
|
||||||
@ -559,6 +562,8 @@
|
|||||||
"hidden": null,
|
"hidden": null,
|
||||||
"public": null
|
"public": null
|
||||||
},
|
},
|
||||||
|
"unmute": null,
|
||||||
|
"unmuted": null,
|
||||||
"update": null,
|
"update": null,
|
||||||
"updatedGroup": null
|
"updatedGroup": null
|
||||||
},
|
},
|
||||||
|
|||||||
@ -485,6 +485,8 @@
|
|||||||
"categoriesTitle": null,
|
"categoriesTitle": null,
|
||||||
"changeMemberRole": null,
|
"changeMemberRole": null,
|
||||||
"contentMenu": {
|
"contentMenu": {
|
||||||
|
"muteGroup": null,
|
||||||
|
"unmuteGroup": null,
|
||||||
"visitGroupPage": null
|
"visitGroupPage": null
|
||||||
},
|
},
|
||||||
"createNewGroup": {
|
"createNewGroup": {
|
||||||
@ -535,6 +537,7 @@
|
|||||||
"confirmAddGroupMemberText": null,
|
"confirmAddGroupMemberText": null,
|
||||||
"confirmAddGroupMemberTitle": null
|
"confirmAddGroupMemberTitle": null
|
||||||
},
|
},
|
||||||
|
"muted": null,
|
||||||
"myGroups": null,
|
"myGroups": null,
|
||||||
"name": null,
|
"name": null,
|
||||||
"radius": null,
|
"radius": null,
|
||||||
@ -559,6 +562,8 @@
|
|||||||
"hidden": null,
|
"hidden": null,
|
||||||
"public": null
|
"public": null
|
||||||
},
|
},
|
||||||
|
"unmute": null,
|
||||||
|
"unmuted": null,
|
||||||
"update": null,
|
"update": null,
|
||||||
"updatedGroup": null
|
"updatedGroup": null
|
||||||
},
|
},
|
||||||
|
|||||||
7845
webapp/pages/groups/_id/__snapshots__/_slug.spec.js.snap
Normal file
7845
webapp/pages/groups/_id/__snapshots__/_slug.spec.js.snap
Normal file
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -18,18 +18,14 @@
|
|||||||
<!-- Menu -->
|
<!-- Menu -->
|
||||||
<client-only>
|
<client-only>
|
||||||
<group-content-menu
|
<group-content-menu
|
||||||
v-if="isGroupOwner"
|
v-if="isGroupMemberNonePending"
|
||||||
class="group-profile-content-menu"
|
class="group-profile-content-menu"
|
||||||
:usage="'groupProfile'"
|
:usage="'groupProfile'"
|
||||||
:group="group || {}"
|
:group="group || {}"
|
||||||
placement="bottom-end"
|
placement="bottom-end"
|
||||||
|
@mute="muteGroup"
|
||||||
|
@unmute="unmuteGroup"
|
||||||
/>
|
/>
|
||||||
<!-- TODO: implement later on -->
|
|
||||||
<!-- @mute="muteUser"
|
|
||||||
@unmute="unmuteUser"
|
|
||||||
@block="blockUser"
|
|
||||||
@unblock="unblockUser"
|
|
||||||
@delete="deleteUser" -->
|
|
||||||
</client-only>
|
</client-only>
|
||||||
<ds-space margin="small">
|
<ds-space margin="small">
|
||||||
<!-- group name -->
|
<!-- group name -->
|
||||||
@ -84,19 +80,9 @@
|
|||||||
</ds-flex-item> -->
|
</ds-flex-item> -->
|
||||||
</ds-flex>
|
</ds-flex>
|
||||||
<div class="action-buttons">
|
<div class="action-buttons">
|
||||||
<!-- <base-button v-if="user.isBlocked" @click="unblockUser(user)">
|
<base-button danger v-if="group.isMutedByMe" @click="unmuteGroup" icon="volume-up">
|
||||||
{{ $t('settings.blocked-users.unblock') }}
|
{{ $t('group.unmute') }}
|
||||||
</base-button>
|
</base-button>
|
||||||
<base-button v-if="user.isMuted" @click="unmuteUser(user)">
|
|
||||||
{{ $t('settings.muted-users.unmute') }}
|
|
||||||
</base-button>
|
|
||||||
<follow-button
|
|
||||||
v-if="!user.isMuted && !user.isBlocked"
|
|
||||||
:follow-id="user.id"
|
|
||||||
:is-followed="user.followedByCurrentUser"
|
|
||||||
@optimistic="optimisticFollow"
|
|
||||||
@update="updateFollow"
|
|
||||||
/> -->
|
|
||||||
<!-- Group join / leave -->
|
<!-- Group join / leave -->
|
||||||
<join-leave-button
|
<join-leave-button
|
||||||
:group="group || {}"
|
:group="group || {}"
|
||||||
@ -108,8 +94,6 @@
|
|||||||
@prepare="prepareJoinLeave"
|
@prepare="prepareJoinLeave"
|
||||||
@update="updateJoinLeave"
|
@update="updateJoinLeave"
|
||||||
/>
|
/>
|
||||||
<!-- implement:
|
|
||||||
v-if="!user.isMuted && !user.isBlocked" -->
|
|
||||||
</div>
|
</div>
|
||||||
<hr />
|
<hr />
|
||||||
<ds-space margin-top="small" margin-bottom="small">
|
<ds-space margin-top="small" margin-bottom="small">
|
||||||
@ -314,8 +298,7 @@
|
|||||||
import uniqBy from 'lodash/uniqBy'
|
import uniqBy from 'lodash/uniqBy'
|
||||||
import { profilePagePosts } from '~/graphql/PostQuery'
|
import { profilePagePosts } from '~/graphql/PostQuery'
|
||||||
import { updateGroupMutation, groupQuery, groupMembersQuery } from '~/graphql/groups'
|
import { updateGroupMutation, groupQuery, groupMembersQuery } from '~/graphql/groups'
|
||||||
// import { muteUser, unmuteUser } from '~/graphql/settings/MutedUsers'
|
import { muteGroup, unmuteGroup } from '~/graphql/settings/MutedGroups'
|
||||||
// import { blockUser, unblockUser } from '~/graphql/settings/BlockedUsers'
|
|
||||||
import UpdateQuery from '~/components/utils/UpdateQuery'
|
import UpdateQuery from '~/components/utils/UpdateQuery'
|
||||||
import postListActions from '~/mixins/postListActions'
|
import postListActions from '~/mixins/postListActions'
|
||||||
import AvatarUploader from '~/components/Uploader/AvatarUploader'
|
import AvatarUploader from '~/components/Uploader/AvatarUploader'
|
||||||
@ -470,6 +453,32 @@ export default {
|
|||||||
// this.resetPostList()
|
// this.resetPostList()
|
||||||
// }
|
// }
|
||||||
// },
|
// },
|
||||||
|
async muteGroup() {
|
||||||
|
try {
|
||||||
|
await this.$apollo.mutate({
|
||||||
|
mutation: muteGroup(),
|
||||||
|
variables: {
|
||||||
|
groupId: this.group.id,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
this.$toast.success(this.$t('group.muted'))
|
||||||
|
} catch (error) {
|
||||||
|
this.$toast.error(error.message)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
async unmuteGroup() {
|
||||||
|
try {
|
||||||
|
await this.$apollo.mutate({
|
||||||
|
mutation: unmuteGroup(),
|
||||||
|
variables: {
|
||||||
|
groupId: this.group.id,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
this.$toast.success(this.$t('group.unmuted'))
|
||||||
|
} catch (error) {
|
||||||
|
this.$toast.error(error.message)
|
||||||
|
}
|
||||||
|
},
|
||||||
uniq(items, field = 'id') {
|
uniq(items, field = 'id') {
|
||||||
return uniqBy(items, field)
|
return uniqBy(items, field)
|
||||||
},
|
},
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user