From e56f3b0817345dc034e8d630de8b0bc734168b82 Mon Sep 17 00:00:00 2001 From: AkiraFukushima Date: Sat, 8 May 2021 20:59:59 +0900 Subject: [PATCH 1/5] refs #2258 Display filters in settings --- src/config/locales/en/translation.json | 3 + src/renderer/components/Settings.vue | 4 ++ src/renderer/components/Settings/Filters.vue | 62 ++++++++++++++++++++ src/renderer/router/index.ts | 5 ++ src/renderer/store/Settings.ts | 5 +- src/renderer/store/Settings/Filters.ts | 54 +++++++++++++++++ 6 files changed, 132 insertions(+), 1 deletion(-) create mode 100644 src/renderer/components/Settings/Filters.vue create mode 100644 src/renderer/store/Settings/Filters.ts diff --git a/src/config/locales/en/translation.json b/src/config/locales/en/translation.json index 0f69a0e8..1960585e 100644 --- a/src/config/locales/en/translation.json +++ b/src/config/locales/en/translation.json @@ -114,6 +114,9 @@ "local": "Local Timeline", "public": "Public Timeline" } + }, + "filters": { + "title": "Filters" } }, "preferences": { diff --git a/src/renderer/components/Settings.vue b/src/renderer/components/Settings.vue index 5ade0bd0..2a1126ad 100644 --- a/src/renderer/components/Settings.vue +++ b/src/renderer/components/Settings.vue @@ -28,6 +28,10 @@ {{ $t('settings.timeline.title') }} + + + {{ $t('settings.filters.title') }} + diff --git a/src/renderer/components/Settings/Filters.vue b/src/renderer/components/Settings/Filters.vue new file mode 100644 index 00000000..5da58ae4 --- /dev/null +++ b/src/renderer/components/Settings/Filters.vue @@ -0,0 +1,62 @@ + + + + + diff --git a/src/renderer/router/index.ts b/src/renderer/router/index.ts index 0b15b505..0cdc2ae5 100644 --- a/src/renderer/router/index.ts +++ b/src/renderer/router/index.ts @@ -14,6 +14,7 @@ import GlobalHeader from '@/components/GlobalHeader.vue' import Settings from '@/components/Settings.vue' import SettingsGeneral from '@/components/Settings/General.vue' import SettingsTimeline from '@/components/Settings/Timeline.vue' +import SettingsFilters from '@/components/Settings/Filters.vue' import TimelineSpace from '@/components/TimelineSpace.vue' import TimelineSpaceContentsHome from '@/components/TimelineSpace/Contents/Home.vue' import TimelineSpaceContentsNotifications from '@/components/TimelineSpace/Contents/Notifications.vue' @@ -100,6 +101,10 @@ const router = new Router({ { path: 'timeline', component: SettingsTimeline + }, + { + path: 'filters', + component: SettingsFilters } ] }, diff --git a/src/renderer/store/Settings.ts b/src/renderer/store/Settings.ts index a9015a1b..431e2ba2 100644 --- a/src/renderer/store/Settings.ts +++ b/src/renderer/store/Settings.ts @@ -1,5 +1,6 @@ import General, { GeneralState } from './Settings/General' import Timeline, { TimelineState } from './Settings/Timeline' +import Filters, { FiltersState } from './Settings/Filters' import { Module, MutationTree } from 'vuex' import { RootState } from '@/store' @@ -24,6 +25,7 @@ const mutations: MutationTree = { type SettingsModule = { General: GeneralState Timeline: TimelineState + Filter: FiltersState } export type SettingsModuleState = SettingsModule & SettingsState @@ -32,7 +34,8 @@ const Settings: Module = { namespaced: true, modules: { General, - Timeline + Timeline, + Filters }, state: state, mutations: mutations diff --git a/src/renderer/store/Settings/Filters.ts b/src/renderer/store/Settings/Filters.ts new file mode 100644 index 00000000..ac5f1a58 --- /dev/null +++ b/src/renderer/store/Settings/Filters.ts @@ -0,0 +1,54 @@ +import { Module, MutationTree, ActionTree } from 'vuex' +import generator, { Entity } from 'megalodon' +import { RootState } from '@/store' + +export type FiltersState = { + filters: Array + filtersLoading: boolean +} + +const state = (): FiltersState => ({ + filters: [], + filtersLoading: false +}) + +export const MUTATION_TYPES = { + UPDATE_FILTERS: 'updateFilters', + CHANGE_LOADING: 'changeLoading' +} + +export const mutations: MutationTree = { + [MUTATION_TYPES.UPDATE_FILTERS]: (state, filters: Array) => { + state.filters = filters + }, + [MUTATION_TYPES.CHANGE_LOADING]: (state, loading: boolean) => { + state.filtersLoading = loading + } +} +export const actions: ActionTree = { + fetchFilters: async ({ commit, rootState }): Promise> => { + const client = generator( + rootState.TimelineSpace.sns, + rootState.TimelineSpace.account.baseURL, + rootState.TimelineSpace.account.accessToken, + rootState.App.userAgent + ) + try { + commit(MUTATION_TYPES.CHANGE_LOADING, true) + const res = await client.getFilters() + commit(MUTATION_TYPES.UPDATE_FILTERS, res.data) + return res.data + } finally { + commit(MUTATION_TYPES.CHANGE_LOADING, false) + } + } +} + +const Filters: Module = { + namespaced: true, + state: state, + mutations: mutations, + actions: actions +} + +export default Filters From 783ddddafef57d5a6ec3677d43b2434fdbd2a457 Mon Sep 17 00:00:00 2001 From: AkiraFukushima Date: Mon, 10 May 2021 00:49:24 +0900 Subject: [PATCH 2/5] refs #2258 Add edit filter form --- src/config/locales/en/translation.json | 29 ++- src/renderer/components/Settings/Filters.vue | 24 +++ .../components/Settings/Filters/Edit.vue | 195 ++++++++++++++++++ src/renderer/router/index.ts | 6 + src/renderer/store/Settings.ts | 4 +- src/renderer/store/Settings/Filters.ts | 12 +- src/renderer/store/Settings/Filters/Edit.ts | 86 ++++++++ 7 files changed, 351 insertions(+), 5 deletions(-) create mode 100644 src/renderer/components/Settings/Filters/Edit.vue create mode 100644 src/renderer/store/Settings/Filters/Edit.ts diff --git a/src/config/locales/en/translation.json b/src/config/locales/en/translation.json index 1960585e..06405c53 100644 --- a/src/config/locales/en/translation.json +++ b/src/config/locales/en/translation.json @@ -116,7 +116,31 @@ } }, "filters": { - "title": "Filters" + "title": "Filters", + "edit": { + "title": "Edit", + "form": { + "phrase": "Keyword or phrase", + "expire": "Expire after", + "context": "Filter contexts", + "irreversible": "Drop instead of hide", + "whole_word": "Whole word", + "submit": "Update", + "cancel": "Cancel" + }, + "expires": { + "never": "Never", + "30_minutes": "30 minutes", + "1_hour": "1 hour", + "6_hours": "6 hours", + "12_hours": "12 hours", + "1_day": "1 day", + "1_week": "1 week" + } + }, + "delete": { + "title": "Delete" + } } }, "preferences": { @@ -455,7 +479,8 @@ "domain_confirmed": "{{domain}} is confirmed, please login", "domain_doesnt_exist": "Failed to connect {{domain}}, make sure the server URL", "loading": "Loading...", - "language_not_support_spellchecker_error": "This language is not supported by Spellchecker" + "language_not_support_spellchecker_error": "This language is not supported by Spellchecker", + "update_filter_error": "Failed to update the filter" }, "validation": { "login": { diff --git a/src/renderer/components/Settings/Filters.vue b/src/renderer/components/Settings/Filters.vue index 5da58ae4..4751e972 100644 --- a/src/renderer/components/Settings/Filters.vue +++ b/src/renderer/components/Settings/Filters.vue @@ -17,6 +17,22 @@ + + + + + + @@ -38,6 +54,14 @@ export default { }, async created() { await this.$store.dispatch('Settings/Filters/fetchFilters') + }, + methods: { + id() { + return this.$route.params.id + }, + deleteFilter(id) { + console.log(id) + } } } diff --git a/src/renderer/components/Settings/Filters/Edit.vue b/src/renderer/components/Settings/Filters/Edit.vue new file mode 100644 index 00000000..f5927fc2 --- /dev/null +++ b/src/renderer/components/Settings/Filters/Edit.vue @@ -0,0 +1,195 @@ + + + + + diff --git a/src/renderer/router/index.ts b/src/renderer/router/index.ts index 0cdc2ae5..a8f5418f 100644 --- a/src/renderer/router/index.ts +++ b/src/renderer/router/index.ts @@ -15,6 +15,7 @@ import Settings from '@/components/Settings.vue' import SettingsGeneral from '@/components/Settings/General.vue' import SettingsTimeline from '@/components/Settings/Timeline.vue' import SettingsFilters from '@/components/Settings/Filters.vue' +import SettingsFiltersEdit from '@/components/Settings/Filters/Edit.vue' import TimelineSpace from '@/components/TimelineSpace.vue' import TimelineSpaceContentsHome from '@/components/TimelineSpace/Contents/Home.vue' import TimelineSpaceContentsNotifications from '@/components/TimelineSpace/Contents/Notifications.vue' @@ -105,6 +106,11 @@ const router = new Router({ { path: 'filters', component: SettingsFilters + }, + { + path: 'filters/:filter_id/edit', + component: SettingsFiltersEdit, + props: true } ] }, diff --git a/src/renderer/store/Settings.ts b/src/renderer/store/Settings.ts index 431e2ba2..c0e28810 100644 --- a/src/renderer/store/Settings.ts +++ b/src/renderer/store/Settings.ts @@ -1,6 +1,6 @@ import General, { GeneralState } from './Settings/General' import Timeline, { TimelineState } from './Settings/Timeline' -import Filters, { FiltersState } from './Settings/Filters' +import Filters, { FiltersModuleState } from './Settings/Filters' import { Module, MutationTree } from 'vuex' import { RootState } from '@/store' @@ -25,7 +25,7 @@ const mutations: MutationTree = { type SettingsModule = { General: GeneralState Timeline: TimelineState - Filter: FiltersState + Filter: FiltersModuleState } export type SettingsModuleState = SettingsModule & SettingsState diff --git a/src/renderer/store/Settings/Filters.ts b/src/renderer/store/Settings/Filters.ts index ac5f1a58..93937189 100644 --- a/src/renderer/store/Settings/Filters.ts +++ b/src/renderer/store/Settings/Filters.ts @@ -1,6 +1,7 @@ import { Module, MutationTree, ActionTree } from 'vuex' import generator, { Entity } from 'megalodon' import { RootState } from '@/store' +import EditFilters, { EditFiltersState } from './Filters/Edit' export type FiltersState = { filters: Array @@ -44,11 +45,20 @@ export const actions: ActionTree = { } } +type FiltersModule = { + Edit: EditFiltersState +} + +export type FiltersModuleState = FiltersModule & FiltersState + const Filters: Module = { namespaced: true, state: state, mutations: mutations, - actions: actions + actions: actions, + modules: { + Edit: EditFilters + } } export default Filters diff --git a/src/renderer/store/Settings/Filters/Edit.ts b/src/renderer/store/Settings/Filters/Edit.ts new file mode 100644 index 00000000..ef387a37 --- /dev/null +++ b/src/renderer/store/Settings/Filters/Edit.ts @@ -0,0 +1,86 @@ +import generator, { Entity } from 'megalodon' +import { Module, MutationTree, ActionTree } from 'vuex' +import { RootState } from '@/store' + +export type EditFiltersState = { + filter: Entity.Filter | null + loading: boolean +} + +const state = (): EditFiltersState => ({ + filter: null, + loading: false +}) + +export const MUTATION_TYPES = { + UPDATE_FILTER: 'updateFilter', + CHANGE_LOADING: 'changeLoading' +} + +export const mutations: MutationTree = { + [MUTATION_TYPES.UPDATE_FILTER]: (state, filter: Entity.Filter) => { + state.filter = filter + }, + [MUTATION_TYPES.CHANGE_LOADING]: (state, loading: boolean) => { + state.loading = loading + } +} + +export const actions: ActionTree = { + fetchFilter: async ({ commit, rootState }, id: string): Promise => { + const client = generator( + rootState.TimelineSpace.sns, + rootState.TimelineSpace.account.baseURL, + rootState.TimelineSpace.account.accessToken, + rootState.App.userAgent + ) + try { + commit(MUTATION_TYPES.CHANGE_LOADING, true) + const res = await client.getFilter(id) + commit(MUTATION_TYPES.UPDATE_FILTER, res.data) + return res.data + } finally { + commit(MUTATION_TYPES.CHANGE_LOADING, false) + } + }, + editFilter: ({ commit, state }, filter: any) => { + const newFilter = Object.assign({}, state.filter, filter) + commit(MUTATION_TYPES.UPDATE_FILTER, newFilter) + }, + updateFilter: async ({ commit, state, rootState }): Promise => { + if (state.filter === null) { + throw new Error('filter is not set') + } + const client = generator( + rootState.TimelineSpace.sns, + rootState.TimelineSpace.account.baseURL, + rootState.TimelineSpace.account.accessToken, + rootState.App.userAgent + ) + try { + commit(MUTATION_TYPES.CHANGE_LOADING, true) + let options = { + irreversible: state.filter.irreversible, + whole_word: state.filter.whole_word + } + if (state.filter.expires_at !== null) { + options = Object.assign({}, options, { + expires_in: state.filter.expires_at + }) + } + const res = await client.updateFilter(state.filter.id, state.filter.phrase, state.filter.context, options) + return res.data + } finally { + commit(MUTATION_TYPES.CHANGE_LOADING, false) + } + } +} + +const EditFilters: Module = { + namespaced: true, + state: state, + mutations: mutations, + actions: actions +} + +export default EditFilters From 9b16716a8046a914834ab688426133a69e38568f Mon Sep 17 00:00:00 2001 From: AkiraFukushima Date: Mon, 10 May 2021 01:05:03 +0900 Subject: [PATCH 3/5] refs #2258 Add delete filter form --- src/config/locales/en/translation.json | 5 ++++- src/renderer/components/Settings/Filters.vue | 8 +++++++- src/renderer/store/Settings/Filters.ts | 15 +++++++++++++++ 3 files changed, 26 insertions(+), 2 deletions(-) diff --git a/src/config/locales/en/translation.json b/src/config/locales/en/translation.json index 06405c53..50a6eb82 100644 --- a/src/config/locales/en/translation.json +++ b/src/config/locales/en/translation.json @@ -139,7 +139,10 @@ } }, "delete": { - "title": "Delete" + "title": "Delete", + "confirm": "Are you sure to delete this filter?", + "confirm_ok": "Delete", + "confirm_cancel": "Cancel" } } }, diff --git a/src/renderer/components/Settings/Filters.vue b/src/renderer/components/Settings/Filters.vue index 4751e972..7bda870f 100644 --- a/src/renderer/components/Settings/Filters.vue +++ b/src/renderer/components/Settings/Filters.vue @@ -60,7 +60,13 @@ export default { return this.$route.params.id }, deleteFilter(id) { - console.log(id) + this.$confirm(this.$t('settings.filters.delete.confirm'), 'Warning', { + confirmButtonText: this.$t('settings.filters.delete.confirm_ok'), + cancelButtonText: this.$t('settings.filters.delete.confirm_cancel'), + type: 'warning' + }).then(() => { + return this.$store.dispatch('Settings/Filters/deleteFilter', id) + }) } } } diff --git a/src/renderer/store/Settings/Filters.ts b/src/renderer/store/Settings/Filters.ts index 93937189..2a55b45e 100644 --- a/src/renderer/store/Settings/Filters.ts +++ b/src/renderer/store/Settings/Filters.ts @@ -42,6 +42,21 @@ export const actions: ActionTree = { } finally { commit(MUTATION_TYPES.CHANGE_LOADING, false) } + }, + deleteFilter: async ({ commit, dispatch, rootState }, id: string) => { + const client = generator( + rootState.TimelineSpace.sns, + rootState.TimelineSpace.account.baseURL, + rootState.TimelineSpace.account.accessToken, + rootState.App.userAgent + ) + try { + commit(MUTATION_TYPES.CHANGE_LOADING, true) + await client.deleteFilter(id) + await dispatch('fetchFilters') + } finally { + commit(MUTATION_TYPES.CHANGE_LOADING, false) + } } } From ee3ba1a155ef2ed52d8b2fcf2c27ffac71565cab Mon Sep 17 00:00:00 2001 From: AkiraFukushima Date: Tue, 11 May 2021 23:11:34 +0900 Subject: [PATCH 4/5] refs #2258 Divide filter form from edit --- src/config/locales/en/translation.json | 38 ++--- .../components/Settings/Filters/Edit.vue | 136 +--------------- .../components/Settings/Filters/form.vue | 152 ++++++++++++++++++ src/renderer/store/Settings/Filters/Edit.ts | 11 +- 4 files changed, 186 insertions(+), 151 deletions(-) create mode 100644 src/renderer/components/Settings/Filters/form.vue diff --git a/src/config/locales/en/translation.json b/src/config/locales/en/translation.json index 50a6eb82..8c4556cb 100644 --- a/src/config/locales/en/translation.json +++ b/src/config/locales/en/translation.json @@ -117,26 +117,26 @@ }, "filters": { "title": "Filters", + "form": { + "phrase": "Keyword or phrase", + "expire": "Expire after", + "context": "Filter contexts", + "irreversible": "Drop instead of hide", + "whole_word": "Whole word", + "submit": "Update", + "cancel": "Cancel" + }, + "expires": { + "never": "Never", + "30_minutes": "30 minutes", + "1_hour": "1 hour", + "6_hours": "6 hours", + "12_hours": "12 hours", + "1_day": "1 day", + "1_week": "1 week" + }, "edit": { - "title": "Edit", - "form": { - "phrase": "Keyword or phrase", - "expire": "Expire after", - "context": "Filter contexts", - "irreversible": "Drop instead of hide", - "whole_word": "Whole word", - "submit": "Update", - "cancel": "Cancel" - }, - "expires": { - "never": "Never", - "30_minutes": "30 minutes", - "1_hour": "1 hour", - "6_hours": "6 hours", - "12_hours": "12 hours", - "1_day": "1 day", - "1_week": "1 week" - } + "title": "Edit" }, "delete": { "title": "Delete", diff --git a/src/renderer/components/Settings/Filters/Edit.vue b/src/renderer/components/Settings/Filters/Edit.vue index f5927fc2..3543464c 100644 --- a/src/renderer/components/Settings/Filters/Edit.vue +++ b/src/renderer/components/Settings/Filters/Edit.vue @@ -1,152 +1,28 @@ + + diff --git a/src/renderer/store/Settings/Filters/Edit.ts b/src/renderer/store/Settings/Filters/Edit.ts index ef387a37..4b743a57 100644 --- a/src/renderer/store/Settings/Filters/Edit.ts +++ b/src/renderer/store/Settings/Filters/Edit.ts @@ -3,12 +3,19 @@ import { Module, MutationTree, ActionTree } from 'vuex' import { RootState } from '@/store' export type EditFiltersState = { - filter: Entity.Filter | null + filter: Entity.Filter loading: boolean } const state = (): EditFiltersState => ({ - filter: null, + filter: { + id: '', + phrase: '', + expires_at: null, + context: [], + irreversible: false, + whole_word: true + } as Entity.Filter, loading: false }) From 3834f41d8ab8f5123924df26c5e1a65f7808945a Mon Sep 17 00:00:00 2001 From: AkiraFukushima Date: Wed, 12 May 2021 00:56:27 +0900 Subject: [PATCH 5/5] refs #2258 Add new filter form --- src/config/locales/en/translation.json | 5 +- src/renderer/components/Settings/Filters.vue | 12 +++ .../components/Settings/Filters/Edit.vue | 19 ----- .../components/Settings/Filters/New.vue | 48 +++++++++++ .../components/Settings/Filters/form.vue | 14 +++- src/renderer/router/index.ts | 5 ++ src/renderer/store/Settings/Filters.ts | 5 +- src/renderer/store/Settings/Filters/New.ts | 83 +++++++++++++++++++ 8 files changed, 169 insertions(+), 22 deletions(-) create mode 100644 src/renderer/components/Settings/Filters/New.vue create mode 100644 src/renderer/store/Settings/Filters/New.ts diff --git a/src/config/locales/en/translation.json b/src/config/locales/en/translation.json index 8c4556cb..fab5f6bf 100644 --- a/src/config/locales/en/translation.json +++ b/src/config/locales/en/translation.json @@ -123,7 +123,7 @@ "context": "Filter contexts", "irreversible": "Drop instead of hide", "whole_word": "Whole word", - "submit": "Update", + "submit": "Submit", "cancel": "Cancel" }, "expires": { @@ -135,6 +135,9 @@ "1_day": "1 day", "1_week": "1 week" }, + "new": { + "title": "New" + }, "edit": { "title": "Edit" }, diff --git a/src/renderer/components/Settings/Filters.vue b/src/renderer/components/Settings/Filters.vue index 7bda870f..73f0c964 100644 --- a/src/renderer/components/Settings/Filters.vue +++ b/src/renderer/components/Settings/Filters.vue @@ -1,6 +1,13 @@