Allow adding bookmarks to folders

Signed-off-by: marcin mikołajczak <git@mkljczk.pl>
This commit is contained in:
marcin mikołajczak 2024-09-24 00:05:33 +02:00
parent 9e45228823
commit 89fbaa159f
8 changed files with 99 additions and 5 deletions

View file

@ -1,6 +1,7 @@
import Popover from '../popover/popover.vue' import Popover from '../popover/popover.vue'
import genRandomSeed from '../../services/random_seed/random_seed.service.js' import genRandomSeed from '../../services/random_seed/random_seed.service.js'
import ConfirmModal from '../confirm_modal/confirm_modal.vue' import ConfirmModal from '../confirm_modal/confirm_modal.vue'
import StatusBookmarkFolderMenu from '../status_bookmark_folder_menu/status_bookmark_folder_menu.vue'
import { library } from '@fortawesome/fontawesome-svg-core' import { library } from '@fortawesome/fontawesome-svg-core'
import { import {
faEllipsisH, faEllipsisH,
@ -36,7 +37,8 @@ const ExtraButtons = {
props: ['status'], props: ['status'],
components: { components: {
Popover, Popover,
ConfirmModal ConfirmModal,
StatusBookmarkFolderMenu
}, },
data () { data () {
return { return {
@ -145,6 +147,9 @@ const ExtraButtons = {
canBookmark () { canBookmark () {
return !!this.currentUser return !!this.currentUser
}, },
bookmarkFolders () {
return this.$store.state.instance.pleromaBookmarkFoldersAvailable
},
statusLink () { statusLink () {
return `${this.$store.state.instance.server}${this.$router.resolve({ name: 'conversation', params: { id: this.status.id } }).href}` return `${this.$store.state.instance.server}${this.$router.resolve({ name: 'conversation', params: { id: this.status.id } }).href}`
}, },

View file

@ -87,6 +87,10 @@
icon="bookmark" icon="bookmark"
/><span>{{ $t("status.unbookmark") }}</span> /><span>{{ $t("status.unbookmark") }}</span>
</button> </button>
<StatusBookmarkFolderMenu
v-if="status.bookmarked && bookmarkFolders"
:status="status"
/>
</template> </template>
<button <button
v-if="ownStatus && editingAvailable" v-if="ownStatus && editingAvailable"

View file

@ -0,0 +1,40 @@
import { library } from '@fortawesome/fontawesome-svg-core'
import { faChevronRight } from '@fortawesome/free-solid-svg-icons'
import { mapState } from 'vuex'
import DialogModal from '../dialog_modal/dialog_modal.vue'
import Popover from '../popover/popover.vue'
library.add(faChevronRight)
const StatusBookmarkFolderMenu = {
props: [
'status'
],
data () {
return {}
},
components: {
DialogModal,
Popover
},
computed: {
...mapState({
folders: state => state.bookmarkFolders.allFolders
}),
folderId () {
return this.status.bookmark_folder_id
}
},
methods: {
toggleFolder (id) {
const value = id === this.folderId ? null : id
this.$store.dispatch('bookmark', { id: this.status.id, bookmark_folder_id: value })
.then(() => this.$emit('onSuccess'))
.catch(err => this.$emit('onError', err.error.error))
}
}
}
export default StatusBookmarkFolderMenu

View file

@ -0,0 +1,38 @@
<template>
<div class="StatusBookmarkFolderMenu">
<Popover
trigger="hover"
placement="left"
remove-padding
>
<template #content>
<div class="dropdown-menu">
<button
v-for="folder in folders"
:key="folder.id"
class="menu-item dropdown-item"
@click="toggleFolder(folder.id)"
>
<span
class="input menu-checkbox -radio"
:class="{ 'menu-checkbox-checked': status.bookmark_folder_id == folder.id }"
/>
{{ folder.name }}
</button>
</div>
</template>
<template #trigger>
<button class="menu-item dropdown-item -has-submenu">
{{ $t('bookmark_folders.select_folder') }}
<FAIcon
class="chevron-icon"
size="lg"
icon="chevron-right"
/>
</button>
</template>
</Popover>
</div>
</template>
<script src="./status_bookmark_folder_menu.js"></script>

View file

@ -1409,6 +1409,7 @@
"tooltip": "This domain contains non-ascii characters." "tooltip": "This domain contains non-ascii characters."
}, },
"bookmark_folders": { "bookmark_folders": {
"new": "New Folder" "new": "New Folder",
"select_folder": "Select bookmark folder"
} }
} }

View file

@ -385,10 +385,12 @@ export const mutations = {
setBookmarked (state, { status, value }) { setBookmarked (state, { status, value }) {
const newStatus = state.allStatusesObject[status.id] const newStatus = state.allStatusesObject[status.id]
newStatus.bookmarked = value newStatus.bookmarked = value
newStatus.bookmark_folder_id = status.bookmark_folder_id
}, },
setBookmarkedConfirm (state, { status }) { setBookmarkedConfirm (state, { status }) {
const newStatus = state.allStatusesObject[status.id] const newStatus = state.allStatusesObject[status.id]
newStatus.bookmarked = status.bookmarked newStatus.bookmarked = status.bookmarked
if (status.pleroma) newStatus.bookmark_folder_id = status.pleroma.bookmark_folder
}, },
setDeleted (state, { status }) { setDeleted (state, { status }) {
const newStatus = state.allStatusesObject[status.id] const newStatus = state.allStatusesObject[status.id]
@ -569,7 +571,7 @@ const statuses = {
}, },
bookmark ({ rootState, commit }, status) { bookmark ({ rootState, commit }, status) {
commit('setBookmarked', { status, value: true }) commit('setBookmarked', { status, value: true })
rootState.api.backendInteractor.bookmarkStatus({ id: status.id }) rootState.api.backendInteractor.bookmarkStatus({ id: status.id, folder_id: status.bookmark_folder_id })
.then(status => { .then(status => {
commit('setBookmarkedConfirm', { status }) commit('setBookmarkedConfirm', { status })
}) })

View file

@ -835,11 +835,14 @@ const unretweet = ({ id, credentials }) => {
.then((data) => parseStatus(data)) .then((data) => parseStatus(data))
} }
const bookmarkStatus = ({ id, credentials }) => { const bookmarkStatus = ({ id, credentials, ...options }) => {
return promisedRequest({ return promisedRequest({
url: MASTODON_BOOKMARK_STATUS_URL(id), url: MASTODON_BOOKMARK_STATUS_URL(id),
headers: authHeaders(credentials), headers: authHeaders(credentials),
method: 'POST' method: 'POST',
payload: {
folder_id: options.folder_id
}
}) })
} }

View file

@ -332,6 +332,7 @@ export const parseStatus = (data) => {
output.quote_url = pleroma.quote_url output.quote_url = pleroma.quote_url
output.quote_visible = pleroma.quote_visible output.quote_visible = pleroma.quote_visible
output.quotes_count = pleroma.quotes_count output.quotes_count = pleroma.quotes_count
output.bookmark_folder_id = pleroma.bookmark_folder
} else { } else {
output.text = data.content output.text = data.content
output.summary = data.spoiler_text output.summary = data.spoiler_text