summaryrefslogtreecommitdiffstats
path: root/src/components/SidebarFeedLinkActions.vue
diff options
context:
space:
mode:
Diffstat (limited to 'src/components/SidebarFeedLinkActions.vue')
-rw-r--r--src/components/SidebarFeedLinkActions.vue194
1 files changed, 194 insertions, 0 deletions
diff --git a/src/components/SidebarFeedLinkActions.vue b/src/components/SidebarFeedLinkActions.vue
new file mode 100644
index 000000000..4c7f082c8
--- /dev/null
+++ b/src/components/SidebarFeedLinkActions.vue
@@ -0,0 +1,194 @@
+<template>
+ <span>
+ <NcActionButton v-if="feed.unreadCount > 0"
+ icon="icon-checkmark"
+ @click="markRead">
+ {{ t("news", "Mark read") }}
+ </NcActionButton>
+ <NcActionButton v-if="feed.pinned"
+ icon="icon-pinned"
+ @click="setPinned(false)">
+ <template #icon>
+ <PinOffIcon />
+ </template>
+ {{ t("news", "Unpin from top") }}
+ </NcActionButton>
+ <NcActionButton v-if="!feed.pinned"
+ icon="icon-pinned"
+ @click="setPinned(true)">
+ <template #icon>
+ <PinIcon />
+ </template>
+ {{ t("news", "Pin to top") }}
+ </NcActionButton>
+ <NcActionButton v-if="feed.ordering === FEED_ORDER.NEWEST"
+ icon="icon-caret-dark"
+ @click="setOrdering(FEED_ORDER.OLDEST)">
+ {{ t("news", "Newest first") }}
+ </NcActionButton>
+ <NcActionButton v-else-if="feed.ordering === FEED_ORDER.OLDEST"
+ icon="icon-caret-dark feed-reverse-ordering"
+ @click="setOrdering(FEED_ORDER.DEFAULT)">
+ {{ t("news", "Oldest first") }}
+ </NcActionButton>
+ <NcActionButton v-else
+ icon="icon-caret-dark"
+ @click="setOrdering(FEED_ORDER.NEWEST)">
+ {{ t("news", "Default order") }}
+ </NcActionButton>
+ <NcActionButton v-if="!feed.fullTextEnabled"
+ icon="icon-full-text-disabled"
+ @click="setFullText(true)">
+ <template #icon>
+ <TextShortIcon />
+ </template>
+ {{ t("news", "Enable full text") }}
+ </NcActionButton>
+ <NcActionButton v-if="feed.fullTextEnabled"
+ icon="icon-full-text-enabled"
+ @click="setFullText(false)">
+ <template #icon>
+ <TextLongIcon />
+ </template>
+ {{ t("news", "Disable full text") }}
+ </NcActionButton>
+ <NcActionButton v-if="feed.updateMode === FEED_UPDATE_MODE.UNREAD"
+ icon="icon-updatemode-default"
+ @click="setUpdateMode(FEED_UPDATE_MODE.IGNORE)">
+ <template #icon>
+ <span class="custom-icon">
+ <img :src="UnreadSvg">
+ </span>
+ </template>
+ {{ t("news", "Unread updated") }}
+ </NcActionButton>
+ <NcActionButton v-if="feed.updateMode === FEED_UPDATE_MODE.IGNORE"
+ icon="icon-updatemode-unread"
+ @click="setUpdateMode(FEED_UPDATE_MODE.UNREAD)">
+ <template #icon>
+ <span class="custom-icon">
+ <img :src="IgnoreSvg">
+ </span>
+ </template>
+ {{ t("news", "Ignore updated") }}
+ </NcActionButton>
+ <NcActionButton icon="icon-rename"
+ @click="rename()">
+ {{ t("news", "Rename") }}
+ </NcActionButton>
+ <NcActionButton icon="icon-delete"
+ @click="deleteFeed()">
+ {{ t("news", "Delete") }}
+ </NcActionButton>
+ <NcAppNavigationItem :title="t('news', 'Open Feed URL')"
+ :href="feed.location">
+ <template #icon>
+ <RssIcon />
+ </template>
+ </NcAppNavigationItem>
+ </span>
+</template>
+
+<script lang="ts">
+
+import Vue from 'vue'
+
+import NcActionButton from '@nextcloud/vue/dist/Components/NcActionButton.js'
+import NcAppNavigationItem from '@nextcloud/vue/dist/Components/NcAppNavigationItem.js'
+
+import { FEED_ORDER, FEED_UPDATE_MODE } from '../dataservices/feed.service'
+
+import RssIcon from 'vue-material-design-icons/Rss.vue'
+import PinIcon from 'vue-material-design-icons/Pin.vue'
+import PinOffIcon from 'vue-material-design-icons/PinOff.vue'
+import TextShortIcon from 'vue-material-design-icons/TextShort.vue'
+import TextLongIcon from 'vue-material-design-icons/TextLong.vue'
+
+import { ACTIONS } from '../store'
+import { Feed } from '../types/Feed'
+const UnreadSvg = require('../../img/updatemodeunread.svg')
+const IgnoreSvg = require('../../img/updatemodedefault.svg')
+
+export default Vue.extend({
+ components: {
+ NcActionButton,
+ NcAppNavigationItem,
+ RssIcon,
+ PinIcon,
+ PinOffIcon,
+ TextShortIcon,
+ TextLongIcon,
+ },
+ props: {
+ feedId: {
+ type: Number,
+ required: true,
+ },
+ },
+ data: () => {
+ return {
+ FEED_ORDER,
+ FEED_UPDATE_MODE,
+ UnreadSvg,
+ IgnoreSvg,
+ }
+ },
+
+ computed: {
+ feed(): Feed {
+ return this.$store.getters.feeds.find((feed: Feed) => {
+ return feed.id === this.feedId
+ })
+ },
+ },
+ methods: {
+ markRead() {
+ this.$store.dispatch(ACTIONS.FEED_MARK_READ, { feed: this.feed })
+ },
+ setPinned(pinned: boolean) {
+ this.$store.dispatch(ACTIONS.FEED_SET_PINNED, { feed: this.feed, pinned })
+ },
+ setOrdering(ordering: FEED_ORDER) {
+ this.$store.dispatch(ACTIONS.FEED_SET_ORDERING, { feed: this.feed, ordering })
+ },
+ setFullText(fullTextEnabled: boolean) {
+ this.$store.dispatch(ACTIONS.FEED_SET_FULL_TEXT, { feed: this.feed, fullTextEnabled })
+ },
+ setUpdateMode(updateMode: FEED_UPDATE_MODE) {
+ this.$store.dispatch(ACTIONS.FEED_SET_UPDATE_MODE, { feed: this.feed, updateMode })
+ },
+ rename() {
+ const title = window.prompt(t('news', 'Rename Feed'), this.feed.title)
+
+ // null when user presses escape (do nothing)
+ if (title !== null) {
+ this.$store.dispatch(ACTIONS.FEED_SET_TITLE, { feed: this.feed, title })
+ }
+ },
+ deleteFeed() {
+ const shouldDelete = window.confirm(t('news', 'Are you sure you want to delete?'))
+
+ if (shouldDelete) {
+ this.$store.dispatch(ACTIONS.FEED_DELETE, { feed: this.feed })
+ }
+ },
+ },
+})
+
+</script>
+
+<style>
+.custom-icon {
+ width: 44px;
+ height: 44px;
+ display: flex;
+ align-self: center;
+ justify-self: center;
+ align-items: center;
+ justify-content: center;
+}
+
+.feed-reverse-ordering {
+ transform: rotate(180deg);
+}
+</style>