diff options
author | Devlin Junker <devlin.junker@gmail.com> | 2023-09-14 16:50:04 -0700 |
---|---|---|
committer | Benjamin Brahmer <info@b-brahmer.de> | 2023-09-20 17:32:33 +0200 |
commit | ac33e7c13c752fdc671b98c652470d3f4b9e6d53 (patch) | |
tree | 3c301aa83f688e1863dd082f67285d14f5f89dbe | |
parent | 4b24d05ec2e58d06785650f527cf1aba74c4855c (diff) |
remaining feed actions
Signed-off-by: Devlin Junker <devlin.junker@gmail.com>
-rw-r--r-- | src/components/Sidebar.vue | 12 | ||||
-rw-r--r-- | src/components/SidebarFeedLinkActions.vue | 46 | ||||
-rw-r--r-- | src/dataservices/feed.service.ts | 17 | ||||
-rw-r--r-- | src/shims-vue.d.ts | 2 | ||||
-rw-r--r-- | src/store/feed.ts | 21 | ||||
-rw-r--r-- | src/types/Feed.ts | 3 | ||||
-rw-r--r-- | src/types/MutationTypes.ts | 2 |
7 files changed, 77 insertions, 26 deletions
diff --git a/src/components/Sidebar.vue b/src/components/Sidebar.vue index 1835b395c..95cf27002 100644 --- a/src/components/Sidebar.vue +++ b/src/components/Sidebar.vue @@ -19,7 +19,7 @@ </template> </NcAppNavigationNewItem> - <NcAppNavigationItem :title="t('news', 'Unread articles')" icon="icon-rss" :to="{ name: ROUTES.UNREAD }"> + <NcAppNavigationItem :name="t('news', 'Unread articles')" icon="icon-rss" :to="{ name: ROUTES.UNREAD }"> <template #actions> <NcActionButton icon="icon-checkmark" @click="alert('TODO: Mark Read')"> t('news','Mark read') @@ -32,7 +32,7 @@ <NcCounterBubble>{{ items.unreadCount }}</NcCounterBubble> </template> </NcAppNavigationItem> - <NcAppNavigationItem :title="t('news', 'All articles')" icon="icon-rss" :to="{ name: ROUTES.ALL }"> + <NcAppNavigationItem :name="t('news', 'All articles')" icon="icon-rss" :to="{ name: ROUTES.ALL }"> <template #actions> <ActionButton icon="icon-checkmark" @click="alert('TODO: Edit')"> t('news','Mark read') @@ -42,7 +42,7 @@ <RssIcon /> </template> </NcAppNavigationItem> - <NcAppNavigationItem :title="t('news', 'Starred')" icon="icon-starred" :to="{ name: ROUTES.STARRED }"> + <NcAppNavigationItem :name="t('news', 'Starred')" icon="icon-starred" :to="{ name: ROUTES.STARRED }"> <template #counter> <NcCounterBubble>{{ items.starredCount }}</NcCounterBubble> </template> @@ -50,14 +50,14 @@ <NcAppNavigationItem v-for="topLevelItem in topLevelNav" :key="topLevelItem.name || topLevelItem.title" - :title="topLevelItem.name || topLevelItem.title" + :name="topLevelItem.name || topLevelItem.title" :icon="''" :to="isFolder(topLevelItem) ? { name: ROUTES.FOLDER, params: { folderId: topLevelItem.id.toString() }} : { name: ROUTES.FEED, params: { feedId: topLevelItem.id.toString() } }" :allow-collapse="true"> <template #default> <NcAppNavigationItem v-for="feed in topLevelItem.feeds" :key="feed.name" - :title="feed.title" + :name="feed.title" :icon="''" :to="{ name: ROUTES.FEED, params: { feedId: feed.id } }"> <template #icon> @@ -98,7 +98,7 @@ </template> </NcAppNavigationItem> - <NcAppNavigationItem :title="t('news', 'Explore')" + <NcAppNavigationItem :name="t('news', 'Explore')" icon="true" :to="{ name: ROUTES.EXPLORE }"> <template #counter> diff --git a/src/components/SidebarFeedLinkActions.vue b/src/components/SidebarFeedLinkActions.vue index ccb18165e..e9f8bd521 100644 --- a/src/components/SidebarFeedLinkActions.vue +++ b/src/components/SidebarFeedLinkActions.vue @@ -50,18 +50,21 @@ @click="setUpdateMode(FEED_UPDATE_MODE.UNREAD)"> {{ t("news", "Ignore updated") }} </NcActionButton> - <NcActionButton icon="icon-rss" - @click="alert('TODO: Open Feed URL')"> - {{ t("news", "Open feed URL") }} - </NcActionButton> - <NcActionButton icon="icon-icon-rename" - @click="alert('TODO: Rename')"> + <NcActionButton icon="icon-rename" + @click="rename()"> {{ t("news", "Rename") }} </NcActionButton> <NcActionButton icon="icon-delete" - @click="alert('TODO: Delete Feed')"> + @click="deleteFeed()"> {{ t("news", "Delete") }} </NcActionButton> + <NcAppNavigationItem :title="t('news', 'Open Feed URL')" + :href="feed.location"> + <template #icon> + <RssIcon /> + </template> + </NcAppNavigationItem> + </span> </template> @@ -71,20 +74,20 @@ import { mapState } from 'vuex' 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 { ACTIONS } from '../store' import { Feed } from '../types/Feed' -// import { Feed } from '../types/Feed' - -// TODO? -const SidebarFeedLinkState = { } - export default Vue.extend({ components: { NcActionButton, + NcAppNavigationItem, + RssIcon, }, props: { feedId: { @@ -100,16 +103,12 @@ export default Vue.extend({ }, computed: { - ...mapState(SidebarFeedLinkState), feed(): Feed { return this.$store.getters.feeds.find((feed: Feed) => { return feed.id === this.feedId }) }, }, - created() { - // TODO: init? - }, methods: { alert(msg: string) { window.alert(msg) @@ -129,6 +128,21 @@ export default Vue.extend({ 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 on escape + 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 }) + } + }, }, }) diff --git a/src/dataservices/feed.service.ts b/src/dataservices/feed.service.ts index f28320d55..0871fb7f3 100644 --- a/src/dataservices/feed.service.ts +++ b/src/dataservices/feed.service.ts @@ -65,20 +65,33 @@ export class FeedService { * Update a feeds properties * * @param param0 - * @param param0.feedId {Number} ID number of feed to mark items as read + * @param param0.feedId {Number} ID number of feed to update * @param param0.pinned {Boolean} should be pinned (true) or not pinned (flse) * @param param0.ordering {FEED_ORDER} sets feed order (0 = NEWEST, 1 = OLDEST, 2 = DEFAULT) * @param param0.fullTextEnabled {Boolean} should be full text be enabled (true) or not (flse) * @param param0.updateMode {FEED_UPDATE_MODE} sets updateMode (0 = UNREAD, 1 = IGNORE) + * @param param0.title {String} title of feed to display * @return {AxiosResponse} Null value is returned on success */ - static updateFeed({ feedId, pinned, ordering, fullTextEnabled, updateMode }: { feedId: number, pinned?: boolean, ordering?: FEED_ORDER, fullTextEnabled?: boolean, updateMode?: FEED_UPDATE_MODE }): Promise<AxiosResponse> { + static updateFeed({ feedId, pinned, ordering, fullTextEnabled, updateMode, title }: { feedId: number, pinned?: boolean, ordering?: FEED_ORDER, fullTextEnabled?: boolean, updateMode?: FEED_UPDATE_MODE, title?: string }): Promise<AxiosResponse> { return axios.patch(API_ROUTES.FEED + `/${feedId}`, { pinned, ordering, fullTextEnabled, updateMode, + title, }) } + /** + * Deletes a feed + * + * @param param0 + * @param param0.feedId {Number} ID number of feed to delete + * @return {AxiosResponse} Null value is returned on success + */ + static deleteFeed({ feedId }: { feedId: number }): Promise<AxiosResponse> { + return axios.delete(API_ROUTES.FEED + `/${feedId}`) + } + } diff --git a/src/shims-vue.d.ts b/src/shims-vue.d.ts index 6ea357570..e22ed2261 100644 --- a/src/shims-vue.d.ts +++ b/src/shims-vue.d.ts @@ -12,4 +12,4 @@ declare module '@nextcloud/vue/dist/Components/*' { }; // Necessary to access translate in typescript components -function t(app, key) { }
\ No newline at end of file +function t(app, key): string { }
\ No newline at end of file diff --git a/src/store/feed.ts b/src/store/feed.ts index b6031e4e6..d4bdd6bcc 100644 --- a/src/store/feed.ts +++ b/src/store/feed.ts @@ -11,10 +11,14 @@ export const FEED_ACTION_TYPES = { ADD_FEED: 'ADD_FEED', FETCH_FEEDS: 'FETCH_FEEDS', FEED_MARK_READ: 'FEED_MARK_READ', + FEED_SET_PINNED: 'FEED_SET_PINNED', FEED_SET_ORDERING: 'FEED_SET_ORDERING', FEED_SET_FULL_TEXT: 'FEED_SET_FULL_TEXT', FEED_SET_UPDATE_MODE: 'FEED_SET_UPDATE_MODE', + FEED_SET_TITLE: 'FEED_SET_TITLE', + + FEED_DELETE: 'FEED_DELETE', } const state = { @@ -108,6 +112,18 @@ export const actions = { commit(FEED_MUTATION_TYPES.UPDATE_FEED, { id: feed.id, updateMode }) }, + + async [FEED_ACTION_TYPES.FEED_SET_TITLE]({ commit }: ActionParams, { feed, title }: { feed: Feed, title: string }) { + await FeedService.updateFeed({ feedId: feed.id as number, title }) + + commit(FEED_MUTATION_TYPES.UPDATE_FEED, { id: feed.id, title }) + }, + + async [FEED_ACTION_TYPES.FEED_DELETE]({ commit }: ActionParams, { feed }: { feed: Feed }) { + await FeedService.deleteFeed({ feedId: feed.id as number }) + + commit(FEED_MUTATION_TYPES.FEED_DELETE, feed.id) + }, } export const mutations = { @@ -151,6 +167,11 @@ export const mutations = { _.assign(feed, { unreadCount: feed.unreadCount - 1 }) } }, + [FEED_MUTATION_TYPES.FEED_DELETE](state: AppState, feedId: number) { + state.feeds = state.feeds.filter((feed: Feed) => { + return feed.id !== feedId + }) + }, } export default { diff --git a/src/types/Feed.ts b/src/types/Feed.ts index f9544c2b0..5a7ff98f4 100644 --- a/src/types/Feed.ts +++ b/src/types/Feed.ts @@ -11,5 +11,6 @@ export type Feed = { pinned: boolean; ordering: FEED_ORDER; fullTextEnabled: boolean; - updateMode: FEED_UPDATE_MODE + updateMode: FEED_UPDATE_MODE; + location: string; } diff --git a/src/types/MutationTypes.ts b/src/types/MutationTypes.ts index 9947b7d11..dba5a7274 100644 --- a/src/types/MutationTypes.ts +++ b/src/types/MutationTypes.ts @@ -6,6 +6,8 @@ export const FEED_MUTATION_TYPES = { SET_FEED_ALL_READ: 'SET_FEED_ALL_READ', INCREASE_FEED_UNREAD_COUNT: 'INCREASE_FEED_UNREAD_COUNT', DECREASE_FEED_UNREAD_COUNT: 'DECREASE_FEED_UNREAD_COUNT', + + FEED_DELETE: 'FEED_DELETE', } export const FOLDER_MUTATION_TYPES = { |