Added Content Menu and Report Modal

This commit is contained in:
Grzegorz Leoniec 2019-01-11 15:11:49 +01:00
parent cd83d35dc7
commit 01ad6a9822
No known key found for this signature in database
GPG Key ID: 3AA43686D4EB1377
6 changed files with 170 additions and 56 deletions

104
components/ContentMenu.vue Normal file
View File

@ -0,0 +1,104 @@
<template>
<dropdown
class="post-menu"
:placement="placement"
offset="5"
>
<template
slot="default"
slot-scope="{toggleMenu}"
>
<a
class="post-menu-trigger"
href="#"
@click.prevent="toggleMenu()"
>
<ds-icon
v-if="placement.indexOf('top') === 0"
name="angle-up"
/>
<ds-icon
v-else
name="angle-down"
/>
</a>
</template>
<template
slot="popover"
slot-scope="{toggleMenu}"
>
<div class="post-menu-popover">
<ds-menu :routes="routes">
<ds-menu-item
slot="Navigation"
slot-scope="item"
:route="item.route"
:parents="item.parents"
@click.stop.prevent="openItem(item.route, toggleMenu)"
>
<ds-icon :name="item.route.icon" /> {{ item.route.name }}
</ds-menu-item>
</ds-menu>
</div>
</template>
</dropdown>
</template>
<script>
import Dropdown from '~/components/Dropdown'
export default {
components: {
Dropdown
},
props: {
placement: { type: String, default: 'top-end' },
name: { type: String, required: true },
context: {
type: String,
required: true,
validator: value => {
return value.match(/(contribution|comment|organization|user)/)
}
}
},
computed: {
routes() {
let routes = [
{
name: this.$t('common.reportContent'),
callback: this.openReportDialog,
icon: 'flag'
}
]
// if (this.isAdmin) {
// routes.push({
// name: this.$t('admin.name'),
// path: `/admin`,
// icon: 'shield'
// })
// }
return routes
}
},
methods: {
openItem(route, toggleMenu) {
if (route.callback) {
route.callback()
} else {
this.$router.push(route.path)
}
toggleMenu()
},
openReportDialog() {
this.$store.commit('modal/SET_OPEN', {
name: 'report',
data: {
context: this.context,
name: this.name
}
})
}
}
}
</script>

View File

@ -51,41 +51,10 @@
<ds-icon name="comments" /> <small>{{ post.commentsCount }}</small>
</span>
<no-ssr>
<dropdown
class="post-menu"
placement="top-end"
>
<template
slot="default"
slot-scope="{toggleMenu}"
>
<a
class="post-menu-trigger"
href="#"
@click.prevent="toggleMenu()"
>
<ds-icon name="angle-up" />
</a>
</template>
<template
slot="popover"
slot-scope="{toggleMenu}"
>
<div class="post-menu-popover">
<ds-menu :routes="routes">
<ds-menu-item
slot="Navigation"
slot-scope="item"
:route="item.route"
:parents="item.parents"
@click.native="toggleMenu"
>
<ds-icon :name="item.route.icon" /> {{ item.route.name }}
</ds-menu-item>
</ds-menu>
</div>
</template>
</dropdown>
<content-menu
context="contribution"
:name="post.title"
/>
</no-ssr>
</div>
</template>
@ -94,14 +63,14 @@
<script>
import HcAuthor from '~/components/Author.vue'
import Dropdown from '~/components/Dropdown'
import ContentMenu from '~/components/ContentMenu'
import { randomBytes } from 'crypto'
export default {
name: 'HcPostCard',
components: {
HcAuthor,
Dropdown
ContentMenu
},
props: {
post: {
@ -123,23 +92,6 @@ export default {
}
return excerpt
},
routes() {
let routes = [
{
name: this.$t('common.reportContent'),
path: `/profile/`,
icon: 'flag'
}
]
// if (this.isAdmin) {
// routes.push({
// name: this.$t('admin.name'),
// path: `/admin`,
// icon: 'shield'
// })
// }
return routes
}
},
methods: {

View File

@ -0,0 +1,32 @@
<template>
<ds-modal
:title="title"
:is-open="isOpen"
cancel-label="Cancel"
confirm-label="Send Report"
@close="close"
>
<p>Are you sure that you want to report the {{ data.context }} "<b>{{ data.name | truncate(30) }}</b>"?</p>
</ds-modal>
</template>
<script>
export default {
computed: {
data() {
return this.$store.getters['modal/data'] || {}
},
title() {
return `Report ${this.data.context}`
},
isOpen() {
return this.$store.getters['modal/open'] === 'report'
}
},
methods: {
close() {
this.$store.commit('modal/SET_OPEN', {})
}
}
}
</script>

View File

@ -72,6 +72,10 @@
<nuxt />
</div>
</ds-container>
<report-modal />
<no-ssr>
<portal-target name="modal" />
</no-ssr>
</div>
</template>
@ -79,11 +83,13 @@
import { mapGetters } from 'vuex'
import LocaleSwitch from '~/components/LocaleSwitch'
import Dropdown from '~/components/Dropdown'
import ReportModal from '~/components/ReportModal'
import seo from '~/components/mixins/seo'
export default {
components: {
Dropdown,
ReportModal,
LocaleSwitch
},
mixins: [seo],

View File

@ -6,6 +6,14 @@
class="post-card"
>
<hc-author :post="post" />
<no-ssr>
<content-menu
style="float: right; display: inline-block; margin-top: -5rem;"
placement="bottom-end"
context="contribution"
:name="post.title"
/>
</no-ssr>
<ds-space margin-bottom="small" />
<!-- Content -->
<!-- eslint-disable vue/no-v-html -->
@ -112,6 +120,7 @@
<script>
import gql from 'graphql-tag'
import ContentMenu from '~/components/ContentMenu'
import HcAuthor from '~/components/Author.vue'
import HcShoutButton from '~/components/ShoutButton.vue'
@ -122,7 +131,8 @@ export default {
},
components: {
HcAuthor,
HcShoutButton
HcShoutButton,
ContentMenu
},
head() {
return {

View File

@ -17,6 +17,14 @@
class="profile-avatar"
size="120px"
/>
<no-ssr>
<content-menu
style="float: right; display: inline-block; margin-top: -3.5rem; margin-right: -0.5rem;"
placement="bottom-start"
context="user"
:name="user.name"
/>
</no-ssr>
<ds-space margin="small">
<ds-heading
tag="h3"
@ -251,6 +259,7 @@ import HcFollowButton from '~/components/FollowButton.vue'
import HcCountTo from '~/components/CountTo.vue'
import HcBadges from '~/components/Badges.vue'
import HcLoadMore from '~/components/LoadMore.vue'
import ContentMenu from '~/components/ContentMenu'
export default {
components: {
@ -259,7 +268,8 @@ export default {
HcFollowButton,
HcCountTo,
HcBadges,
HcLoadMore
HcLoadMore,
ContentMenu
},
transition: {
name: 'slide-up',