diff --git a/CHANGELOG.md b/CHANGELOG.md index df093cf5..6a53ed8f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,6 +19,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - Add ability to manually evict and ban URLs from the Pleroma MediaProxy cache - Add Invalidation settings on MediaProxy tab - Ability to configure S3 settings on Upload tab +- Show number of open reports in Sidebar Menu +- Add confirmation message when deleting a user ### Changed @@ -32,6 +34,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - Ability to add custom values in Pleroma.Upload.Filter.Mogrify setting - Change types of the following settings: ':groups', ':replace', ':federated_timeline_removal', ':reject', ':match_actor'. Update functions that parses and wraps settings data according to this change. - Move rendering Crontab setting from a separate component to EditableKeyword component +- Show only those MRF settings that have been enabled in MRF Policies setting +- Move Auto Linker settings to Link Formatter Tab as its configuration was moved to :pleroma, Pleroma.Formatter ### Fixed @@ -43,6 +47,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ### Added - Link settings that enable registrations and invites +- Ability to upload logo, background, default user avatar, instance thumbnail, and NSFW hiding images ### Changed diff --git a/src/api/mediaUpload.js b/src/api/mediaUpload.js new file mode 100644 index 00000000..1cbde204 --- /dev/null +++ b/src/api/mediaUpload.js @@ -0,0 +1,19 @@ +import { getToken } from '@/utils/auth' +import { baseName } from './utils' + +const UPLOAD_URL = '/api/v1/media' + +export function uploadMedia({ formData, authHost }) { + const url = baseName(authHost) + UPLOAD_URL + + return fetch(url, { + body: formData, + method: 'POST', + headers: authHeaders() + }) + .then((data) => data.json()) +} + +const authHeaders = () => { + return { 'Authorization': `Bearer ${getToken()}` } +} diff --git a/src/lang/en.js b/src/lang/en.js index 3256abcd..478a5cc7 100644 --- a/src/lang/en.js +++ b/src/lang/en.js @@ -228,6 +228,7 @@ export default { revokeRightConfirmation: 'Are you sure you want to revoke {right} rights from all selected users?', activateMultipleUsersConfirmation: 'Are you sure you want to activate accounts of all selected users?', deactivateMultipleUsersConfirmation: 'Are you sure you want to deactivate accounts of all selected users?', + deleteUsersConfirmation: 'Are you sure you want to delete this account? This action cannot be undone.', deleteMultipleUsersConfirmation: 'Are you sure you want to delete accounts of all selected users?', addTagForMultipleUsersConfirmation: 'Are you sure you want to apply tag to all selected users?', removeTagFromMultipleUsersConfirmation: 'Are you sure you want to remove tag from all selected users?', @@ -373,10 +374,10 @@ export default { instance: 'Instance', upload: 'Upload', mailer: 'Mailer', + linkFormatter: 'Link Formatter', logger: 'Logger', activityPub: 'ActivityPub', auth: 'Authentication', - autoLinker: 'Auto Linker', captcha: 'Captcha', frontend: 'Frontend', http: 'HTTP', @@ -407,7 +408,10 @@ export default { instanceReboot: 'Reboot Instance', restartApp: 'You must restart the instance to apply settings', restartSuccess: 'Instance rebooted successfully!', - removeSettingConfirmation: 'Are you sure you want to remove this setting\'s value from the database?' + removeSettingConfirmation: 'Are you sure you want to remove this setting\'s value from the database?', + changeImage: 'Change image', + uploadImage: 'Upload image', + remove: 'Remove' }, invites: { inviteTokens: 'Invite tokens', diff --git a/src/store/modules/normalizers.js b/src/store/modules/normalizers.js index 274977e9..c7fc33e8 100644 --- a/src/store/modules/normalizers.js +++ b/src/store/modules/normalizers.js @@ -9,28 +9,6 @@ export const getBooleanValue = value => { return value } -export const checkPartialUpdate = (settings, updatedSettings, description) => { - return Object.keys(updatedSettings).reduce((acc, group) => { - acc[group] = Object.keys(updatedSettings[group]).reduce((acc, key) => { - if (!partialUpdate(group, key)) { - const updated = Object.keys(settings[group][key]).reduce((acc, settingName) => { - const setting = description - .find(element => element.group === group && element.key === key).children - .find(child => child.key === settingName) - const type = setting ? setting.type : '' - acc[settingName] = [type, settings[group][key][settingName]] - return acc - }, {}) - acc[key] = updated - return acc - } - acc[key] = updatedSettings[group][key] - return acc - }, {}) - return acc - }, {}) -} - const getCurrentValue = (type, value, path) => { if (type === 'state') { return _.get(value, path) @@ -50,7 +28,7 @@ const getCurrentValue = (type, value, path) => { } const getValueWithoutKey = (key, [type, value]) => { - if (type === 'atom' && value.length > 1) { + if (prependWithСolon(type, value)) { return `:${value}` } else if (key === ':backends') { const index = value.findIndex(el => el === ':ex_syslogger') @@ -158,8 +136,9 @@ const parseProxyUrl = value => { return { socks5: false, host: null, port: null } } -const partialUpdate = (group, key) => { - return !(group === ':auto_linker' && key === ':opts') +const prependWithСolon = (type, value) => { + return (type === 'atom' && value.length > 0) || + (Array.isArray(type) && type.includes('boolean') && type.includes('atom') && typeof value === 'string') } export const processNested = (valueForState, valueForUpdatedSettings, group, parentKey, parents, settings, updatedSettings) => { @@ -246,7 +225,7 @@ const wrapValues = (settings, currentState) => { )) ) { return { 'tuple': [setting, wrapValues(value, currentState)] } - } else if (type === 'atom' && value.length > 0) { + } else if (prependWithСolon(type, value)) { return { 'tuple': [setting, `:${value}`] } } else if (type.includes('tuple') && (type.includes('string') || type.includes('atom'))) { return typeof value === 'string' diff --git a/src/store/modules/reports.js b/src/store/modules/reports.js index 6bc98993..1f6ae44f 100644 --- a/src/store/modules/reports.js +++ b/src/store/modules/reports.js @@ -2,12 +2,13 @@ import { changeState, fetchReports, createNote, deleteNote } from '@/api/reports const reports = { state: { - fetchedReports: [], - totalReportsCount: 0, currentPage: 1, + fetchedReports: [], + loading: true, + openReportsCount: 0, pageSize: 50, stateFilter: '', - loading: true + totalReportsCount: 0 }, mutations: { SET_LAST_REPORT_ID: (state, id) => { @@ -16,6 +17,9 @@ const reports = { SET_LOADING: (state, status) => { state.loading = status }, + SET_OPEN_REPORTS_COUNT: (state, total) => { + state.openReportsCount = total + }, SET_PAGE: (state, page) => { state.currentPage = page }, @@ -30,7 +34,7 @@ const reports = { } }, actions: { - async ChangeReportState({ commit, getters, state }, reportsData) { + async ChangeReportState({ commit, dispatch, getters, state }, reportsData) { changeState(reportsData, getters.authHost, getters.token) const updatedReports = state.fetchedReports.map(report => { @@ -39,6 +43,7 @@ const reports = { }) commit('SET_REPORTS', updatedReports) + dispatch('FetchOpenReportsCount') }, ClearFetchedReports({ commit }) { commit('SET_REPORTS', []) @@ -52,7 +57,14 @@ const reports = { commit('SET_PAGE', page) commit('SET_LOADING', false) }, - SetFilter({ commit }, filter) { + async FetchOpenReportsCount({ commit, getters, state }) { + commit('SET_LOADING', true) + const { data } = await fetchReports('open', state.currentPage, state.pageSize, getters.authHost, getters.token) + + commit('SET_OPEN_REPORTS_COUNT', data.total) + commit('SET_LOADING', false) + }, + SetReportsFilter({ commit }, filter) { commit('SET_REPORTS_FILTER', filter) }, CreateReportNote({ commit, getters, state, rootState }, { content, reportID }) { diff --git a/src/store/modules/settings.js b/src/store/modules/settings.js index 6053ec2d..6c193e57 100644 --- a/src/store/modules/settings.js +++ b/src/store/modules/settings.js @@ -1,5 +1,5 @@ import { fetchDescription, fetchSettings, removeSettings, updateSettings } from '@/api/settings' -import { checkPartialUpdate, formSearchObject, parseNonTuples, parseTuples, valueHasTuples, wrapUpdatedSettings } from './normalizers' +import { formSearchObject, parseNonTuples, parseTuples, valueHasTuples, wrapUpdatedSettings } from './normalizers' import _ from 'lodash' const settings = { @@ -101,9 +101,8 @@ const settings = { commit('SET_ACTIVE_TAB', tab) }, async SubmitChanges({ getters, commit, state }) { - const updatedData = checkPartialUpdate(state.settings, state.updatedSettings, state.description) - const configs = Object.keys(updatedData).reduce((acc, group) => { - return [...acc, ...wrapUpdatedSettings(group, updatedData[group], state.settings)] + const configs = Object.keys(state.updatedSettings).reduce((acc, group) => { + return [...acc, ...wrapUpdatedSettings(group, state.updatedSettings[group], state.settings)] }, []) await updateSettings(configs, getters.authHost, getters.token) diff --git a/src/store/modules/users.js b/src/store/modules/users.js index 5f35bf44..4db8042f 100644 --- a/src/store/modules/users.js +++ b/src/store/modules/users.js @@ -193,11 +193,14 @@ const users = { } catch (_e) { return } - const deletedUsersIds = users.map(deletedUser => deletedUser.id) - const updatedUsers = state.fetchedUsers.filter(user => !deletedUsersIds.includes(user.id)) - commit('SET_USERS', updatedUsers) + const updatedUsers = users.map(user => { + return { ...user, deactivated: true } + }) + commit('SWAP_USERS', updatedUsers) - dispatch('FetchUserProfile', { userId: _userId, godmode: false }) + if (_userId) { + dispatch('FetchUserProfile', { userId: _userId, godmode: false }) + } dispatch('SuccessMessage') }, async FetchUsers({ commit, dispatch, getters, state }, { page }) { diff --git a/src/views/layout/components/Sidebar/Item.vue b/src/views/layout/components/Sidebar/Item.vue index b515f615..a19a4288 100644 --- a/src/views/layout/components/Sidebar/Item.vue +++ b/src/views/layout/components/Sidebar/Item.vue @@ -1,8 +1,19 @@ + + + + diff --git a/src/views/layout/components/Sidebar/SidebarItem.vue b/src/views/layout/components/Sidebar/SidebarItem.vue index 9fb88139..7451ada2 100644 --- a/src/views/layout/components/Sidebar/SidebarItem.vue +++ b/src/views/layout/components/Sidebar/SidebarItem.vue @@ -4,14 +4,21 @@ - @@ -43,6 +54,7 @@ import { isExternal } from '@/utils' import Item from './Item' import AppLink from './Link' import FixiOSBug from './FixiOSBug' +import numeral from 'numeral' export default { name: 'SidebarItem', @@ -71,6 +83,9 @@ export default { computed: { invitesEnabled() { return this.basePath === '/invites' ? this.$store.state.app.invitesEnabled : true + }, + normalizedReportsCount() { + return numeral(this.$store.state.reports.openReportsCount).format('0a') } }, methods: { @@ -104,6 +119,9 @@ export default { } return path.resolve(this.basePath, routePath) }, + showCount(item) { + return item.path === '/reports' + }, isExternalLink(routePath) { return isExternal(routePath) }, diff --git a/src/views/layout/components/Sidebar/index.vue b/src/views/layout/components/Sidebar/index.vue index 11ef4c02..e52ae6b6 100644 --- a/src/views/layout/components/Sidebar/index.vue +++ b/src/views/layout/components/Sidebar/index.vue @@ -31,6 +31,9 @@ export default { isCollapse() { return !this.sidebar.opened } + }, + mounted() { + this.$store.dispatch('FetchOpenReportsCount') } } diff --git a/src/views/reports/components/ReportsFilter.vue b/src/views/reports/components/ReportsFilter.vue index 29e15075..0d34a389 100644 --- a/src/views/reports/components/ReportsFilter.vue +++ b/src/views/reports/components/ReportsFilter.vue @@ -38,11 +38,11 @@ export default { } }, created() { - this.$store.dispatch('SetFilter', this.$data.filter) + this.$store.dispatch('SetReportsFilter', this.$data.filter) }, methods: { toggleFilters() { - this.$store.dispatch('SetFilter', this.$data.filter) + this.$store.dispatch('SetReportsFilter', this.$data.filter) this.$store.dispatch('ClearFetchedReports') this.$store.dispatch('FetchReports', 1) } diff --git a/src/views/settings/components/Inputs.vue b/src/views/settings/components/Inputs.vue index ae4ae220..0639994e 100644 --- a/src/views/settings/components/Inputs.vue +++ b/src/views/settings/components/Inputs.vue @@ -33,8 +33,16 @@
+ : - + @@ -120,9 +128,10 @@ - - diff --git a/src/views/settings/components/inputComponents/ImageUploadInput.vue b/src/views/settings/components/inputComponents/ImageUploadInput.vue new file mode 100644 index 00000000..f54b4190 --- /dev/null +++ b/src/views/settings/components/inputComponents/ImageUploadInput.vue @@ -0,0 +1,204 @@ + + + + + diff --git a/src/views/settings/components/inputComponents/LinkFormatterInput.vue b/src/views/settings/components/inputComponents/LinkFormatterInput.vue new file mode 100644 index 00000000..38ec2e50 --- /dev/null +++ b/src/views/settings/components/inputComponents/LinkFormatterInput.vue @@ -0,0 +1,90 @@ + + + + + diff --git a/src/views/settings/components/inputComponents/SelectInputWithReducedLabels.vue b/src/views/settings/components/inputComponents/SelectInputWithReducedLabels.vue index 8e7b9129..9b6b6140 100644 --- a/src/views/settings/components/inputComponents/SelectInputWithReducedLabels.vue +++ b/src/views/settings/components/inputComponents/SelectInputWithReducedLabels.vue @@ -56,7 +56,7 @@ export default { inputValue() { if (this.setting.key === 'Pleroma.Web.Auth.Authenticator') { return this.data.value - } else if (this.setting.key === ':rewrite_policy') { + } else if (this.setting.key === ':policies') { return typeof this.data[this.setting.key] === 'string' ? [this.data[this.setting.key]] : this.data[this.setting.key] @@ -71,7 +71,7 @@ export default { methods: { options(suggestions) { const prefixes = { - ':rewrite_policy': 'Pleroma.Web.ActivityPub.MRF.', + ':policies': 'Pleroma.Web.ActivityPub.MRF.', 'Pleroma.Web.Auth.Authenticator': 'Pleroma.Web.Auth.', ':method': 'Pleroma.Captcha.', ':adapter': 'Swoosh.Adapters.', @@ -100,14 +100,6 @@ export default { this.setting.key === ':args' ) }, - rewritePolicyOptions(suggestions) { - return suggestions.map(element => { - const label = element.split('Pleroma.Web.ActivityPub.MRF.')[1] - ? element.split('Pleroma.Web.ActivityPub.MRF.')[1] - : element - return { value: element, label } - }) - }, updateSetting(value, group, key, input, type) { const updatedValue = getBooleanValue(value) this.$store.dispatch('UpdateSettings', { group, key, input, value: updatedValue, type }) diff --git a/src/views/settings/components/inputComponents/index.js b/src/views/settings/components/inputComponents/index.js index d95ebd05..0ef58841 100644 --- a/src/views/settings/components/inputComponents/index.js +++ b/src/views/settings/components/inputComponents/index.js @@ -1,6 +1,7 @@ -export { default as AutoLinkerInput } from './AutoLinkerInput' export { default as EditableKeywordInput } from './EditableKeywordInput' export { default as IconsInput } from './IconsInput' +export { default as ImageUploadInput } from './ImageUploadInput' +export { default as LinkFormatterInput } from './LinkFormatterInput' export { default as MascotsInput } from './MascotsInput' export { default as ProxyUrlInput } from './ProxyUrlInput' export { default as PruneInput } from './PruneInput' diff --git a/src/views/settings/components/tabs.js b/src/views/settings/components/tabs.js index 68b01093..394f0670 100644 --- a/src/views/settings/components/tabs.js +++ b/src/views/settings/components/tabs.js @@ -1,4 +1,3 @@ - export const tabs = description => { return { 'activity-pub': { diff --git a/src/views/settings/index.vue b/src/views/settings/index.vue index 7d47c67b..08f0cb64 100644 --- a/src/views/settings/index.vue +++ b/src/views/settings/index.vue @@ -69,7 +69,7 @@
- + @@ -97,7 +97,6 @@ import { tabs } from './components/tabs' import { ActivityPub, Authentication, - AutoLinker, Captcha, Esshd, Frontend, @@ -105,6 +104,7 @@ import { Http, Instance, JobQueue, + LinkFormatter, Logger, Mailer, MediaProxy, @@ -122,7 +122,6 @@ export default { components: { ActivityPub, Authentication, - AutoLinker, Captcha, Esshd, Frontend, @@ -130,6 +129,7 @@ export default { Http, Instance, JobQueue, + LinkFormatter, Logger, Mailer, MediaProxy, @@ -147,7 +147,7 @@ export default { options: [ { value: 'activityPub', label: i18n.t('settings.activityPub') }, { value: 'auth', label: i18n.t('settings.auth') }, - { value: 'autoLinker', label: i18n.t('settings.autoLinker') }, + { value: 'linkFormatter', label: i18n.t('settings.linkFormatter') }, { value: 'esshd', label: i18n.t('settings.esshd') }, { value: 'captcha', label: i18n.t('settings.captcha') }, { value: 'frontend', label: i18n.t('settings.frontend') }, @@ -222,9 +222,7 @@ export default { querySearch(queryString, cb) { const results = this.searchData.filter(searchObj => searchObj.search.find(el => el.includes(queryString.toLowerCase()))) .map(searchObj => { - return searchObj.groupKey === ':opts' - ? { value: `${searchObj.label} in Auto Linker`, group: searchObj.groupKey, key: searchObj.key } - : { value: `${searchObj.label} in ${searchObj.groupLabel}`, group: searchObj.groupKey, key: searchObj.key } + return { value: `${searchObj.label} in ${searchObj.groupLabel}`, group: searchObj.groupKey, key: searchObj.key } }) cb(results) }, diff --git a/src/views/users/components/ModerationDropdown.vue b/src/views/users/components/ModerationDropdown.vue index 3a145290..6f9a5651 100644 --- a/src/views/users/components/ModerationDropdown.vue +++ b/src/views/users/components/ModerationDropdown.vue @@ -143,7 +143,20 @@ export default { this.$store.dispatch('ResendConfirmationEmail', [user]) }, handleDeletion(user) { - this.$store.dispatch('DeleteUsers', { users: [user], _userId: user.id }) + this.$confirm( + this.$t('users.deleteUsersConfirmation'), + { + confirmButtonText: 'Delete', + cancelButtonText: 'Cancel', + type: 'warning' + }).then(() => { + this.$store.dispatch('DeleteUsers', { users: [user], _userId: user.id }) + }).catch(() => { + this.$message({ + type: 'info', + message: 'Delete canceled' + }) + }) }, handleEmailConfirmation(user) { this.$store.dispatch('ConfirmUsersEmail', { users: [user], _userId: user.id, _statusId: this.statusId }) diff --git a/test/modules/normalizers/checkPartialUpdate.test.js b/test/modules/normalizers/checkPartialUpdate.test.js deleted file mode 100644 index 87e6f104..00000000 --- a/test/modules/normalizers/checkPartialUpdate.test.js +++ /dev/null @@ -1,48 +0,0 @@ -import { checkPartialUpdate } from '@/store/modules/normalizers' -import _ from 'lodash' - -describe('Partial update', () => { - it('partial update for settings that do not allow partial update', () => { - const settings = { ':auto_linker': { ':opts': - { ':strip_prefix': true, ':new_window': false, ':rel': 'ugc', ':truncate': 3 } - }} - const updatedSettings = { ':auto_linker': { ':opts': { ':new_window': false }}} - const description = [{ - children: [ - { key: ':strip_prefix', type: 'boolean' }, - { key: ':truncate', type: ['integer', false] }, - { key: ':new_window', type: 'boolean' }], - description: 'Configuration for the auto_linker library', - group: ':auto_linker', - key: ':opts', - label: 'Opts', - type: 'group' - }] - - const expectedData = { ':auto_linker': { ':opts': { - ':strip_prefix': ['boolean', true], - ':new_window': ['boolean', false], - ':rel': ['', 'ugc'], - ':truncate': [['integer', false], 3] - }}} - const updatedData = checkPartialUpdate(settings, updatedSettings, description) - expect(_.isEqual(updatedData, expectedData)).toBeTruthy() - }) - - it('partial update for settings that allow partial update', () => { - const settings = { ':pleroma': { 'Pleroma.Captcha': { ':enabled': true, ':seconds_valid': 70, ':method': 'Pleroma.Captcha.Kocaptcha' }}} - const updatedSettings = { ':pleroma': { 'Pleroma.Captcha': { ':seconds_valid': ['integer', 70] }}} - const description = [{ - children: [], - description: 'Captcha-related settings', - group: ':pleroma', - key: 'Pleroma.Captcha', - label: 'Pleroma.Captcha', - type: 'group' - }] - - const expectedData = { ':pleroma': { 'Pleroma.Captcha': { ':seconds_valid': ['integer', 70] }}} - const updatedData = checkPartialUpdate(settings, updatedSettings, description) - expect(_.isEqual(updatedData, expectedData)).toBeTruthy() - }) -}) diff --git a/test/views/reports/reportsFilter.test.js b/test/views/reports/reportsFilter.test.js index 0701262c..853cb1c3 100644 --- a/test/views/reports/reportsFilter.test.js +++ b/test/views/reports/reportsFilter.test.js @@ -26,7 +26,7 @@ describe('Reports filter', () => { it('shows open reports when "Open" filter is applied', async (done) => { expect(store.state.reports.fetchedReports.length).toEqual(7) - store.dispatch('SetFilter', 'open') + store.dispatch('SetReportsFilter', 'open') store.dispatch('ClearFetchedReports') store.dispatch('FetchReports', 1) await flushPromises() @@ -38,7 +38,7 @@ describe('Reports filter', () => { it('shows resolved reports when "Resolved" filter is applied', async (done) => { expect(store.state.reports.fetchedReports.length).toEqual(7) - store.dispatch('SetFilter', 'resolved') + store.dispatch('SetReportsFilter', 'resolved') store.dispatch('ClearFetchedReports') store.dispatch('FetchReports') await flushPromises() @@ -50,7 +50,7 @@ describe('Reports filter', () => { it('shows closed reports when "Closed" filter is applied', async (done) => { expect(store.state.reports.fetchedReports.length).toEqual(7) - store.dispatch('SetFilter', 'closed') + store.dispatch('SetReportsFilter', 'closed') store.dispatch('ClearFetchedReports') store.dispatch('FetchReports') await flushPromises() @@ -62,13 +62,13 @@ describe('Reports filter', () => { it('shows all users after removing filters', async (done) => { expect(store.state.reports.fetchedReports.length).toEqual(7) - store.dispatch('SetFilter', 'open') + store.dispatch('SetReportsFilter', 'open') store.dispatch('ClearFetchedReports') store.dispatch('FetchReports') await flushPromises() expect(store.state.reports.fetchedReports.length).toEqual(2) - store.dispatch('SetFilter', '') + store.dispatch('SetReportsFilter', '') store.dispatch('ClearFetchedReports') store.dispatch('FetchReports') await flushPromises() diff --git a/test/views/settings/index.test.js b/test/views/settings/index.test.js index 9455dbb7..4cacf881 100644 --- a/test/views/settings/index.test.js +++ b/test/views/settings/index.test.js @@ -58,8 +58,6 @@ describe('Settings search', () => { wrapper.vm.handleSearchSelect({ group: ':media_proxy', key: ':ssl_options' }) expect(store.state.settings.activeTab).toBe('media-proxy') - wrapper.vm.handleSearchSelect({ group: ':opts', key: ':opts' }) - expect(store.state.settings.activeTab).toBe('auto-linker') done() }) }) diff --git a/test/views/users/index.test.js b/test/views/users/index.test.js index 57cefad1..847de253 100644 --- a/test/views/users/index.test.js +++ b/test/views/users/index.test.js @@ -156,11 +156,13 @@ describe('Users actions', () => { stubs: ['router-link'] }) await flushPromises() - expect(store.state.users.fetchedUsers.length).toEqual(3) + expect(store.state.users.fetchedUsers[1].deactivated).toBe(false) wrapper.find(htmlElement(2, 2)).trigger('click') + store.dispatch('DeleteUsers', { users: [{ active: true, deactivated: false, id: '10', nickname: 'bob', local: false, external: true, roles: { admin: false, moderator: false }, tags: ['sandbox'] }] }) + await flushPromises() - expect(store.state.users.fetchedUsers.length).toEqual(2) + expect(store.state.users.fetchedUsers[1].deactivated).toBe(true) done() }) diff --git a/test/views/users/multipleUsersMenu.test.js b/test/views/users/multipleUsersMenu.test.js index aea1a9aa..c956bed4 100644 --- a/test/views/users/multipleUsersMenu.test.js +++ b/test/views/users/multipleUsersMenu.test.js @@ -225,11 +225,11 @@ describe('Apply users actions to multiple users', () => { expect(wrapper.vm.deleteMultipleUsers).toHaveBeenCalled() const remove = wrapper.vm.mappers().remove - expect(store.state.users.fetchedUsers.length).toEqual(3) + expect(store.state.users.fetchedUsers.filter(user => user.deactivated).length).toEqual(1) remove() await flushPromises() - expect(store.state.users.fetchedUsers.length).toEqual(0) + expect(store.state.users.fetchedUsers.length).toEqual(3) done() })