diff --git a/CHANGELOG.md b/CHANGELOG.md index be0fb971..00ad896e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,7 +8,15 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ### Changed +- moves emoji pack configuration from the main menu to settings tab, redesigns it and fixes bugs - `mailerEnabled` must be set to `true` in order to require password reset (password reset currently only works via email) +- remove fetching initial data for configuring server settings +- Actions in users module (ActivateUsers, AddRight, DeactivateUsers, DeleteRight, DeleteUsers) now accept an array of users instead of one user + +### Added + +- Optimistic update for actions in users module and fetching users after api function finished its execution +- Relay management ## [1.2.0] - 2019-09-27 diff --git a/src/api/__mocks__/users.js b/src/api/__mocks__/users.js index 016772a7..b5aca6a1 100644 --- a/src/api/__mocks__/users.js +++ b/src/api/__mocks__/users.js @@ -33,11 +33,6 @@ export async function getPasswordResetToken(nickname, authHost, token) { return Promise.resolve({ data: { token: 'g05lxnBJQnL', link: 'http://url/api/pleroma/password_reset/g05lxnBJQnL' }}) } -export async function toggleUserActivation(nickname, authHost, token) { - const response = users.find(user => user.nickname === nickname) - return Promise.resolve({ data: { ...response, deactivated: !response.deactivated }}) -} - export async function searchUsers(query, filters, authHost, token, page = 1) { const filteredUsers = filterUsers(filters) const response = filteredUsers.filter(user => user.nickname === query) @@ -48,21 +43,37 @@ export async function searchUsers(query, filters, authHost, token, page = 1) { }}) } -export async function addRight(nickname, right, authHost, token) { +export async function activateUsers(nicknames, authHost, token) { + const response = nicknames.map(nickname => { + const currentUser = users.find(user => user.nickname === nickname) + return { ...currentUser, deactivated: false } + }) + return Promise.resolve({ data: response }) +} + +export async function addRight(nicknames, right, authHost, token) { return Promise.resolve({ data: { [`is_${right}`]: true } }) } +export async function deactivateUsers(nicknames, authHost, token) { + const response = nicknames.map(nickname => { + const currentUser = users.find(user => user.nickname === nickname) + return { ...currentUser, deactivated: true } + }) + return Promise.resolve({ data: response }) +} + export async function deleteRight(nickname, right, authHost, token) { return Promise.resolve({ data: { [`is_${right}`]: false } }) } -export async function deleteUser(nickname, authHost, token) { +export async function deleteUsers(nicknames, authHost, token) { return Promise.resolve({ data: - nickname + nicknames }) } diff --git a/src/api/emoji_packs.js b/src/api/emojiPacks.js similarity index 100% rename from src/api/emoji_packs.js rename to src/api/emojiPacks.js diff --git a/src/api/initialDataForConfig.js b/src/api/initialDataForConfig.js deleted file mode 100644 index f24ffb9a..00000000 --- a/src/api/initialDataForConfig.js +++ /dev/null @@ -1,117 +0,0 @@ -export const initialSettings = [ - { - group: 'pleroma', - key: ':instance', - value: [ - { 'tuple': [':name', 'Pleroma'] }, - { 'tuple': [':email', 'example@example.com'] }, - { 'tuple': [':notify_email', 'noreply@example.com'] }, - { 'tuple': [':description', 'A Pleroma instance, an alternative fediverse server'] }, - { 'tuple': [':limit', 5000] }, - { 'tuple': [':remote_limit', 100000] }, - { 'tuple': [':upload_limit', 16 * 1048576] }, - { 'tuple': [':avatar_upload_limit', 2 * 1048576] }, - { 'tuple': [':background_upload_limit', 4 * 1048576] }, - { 'tuple': [':banner_upload_limit', 4 * 1048576] }, - { 'tuple': [':poll_limits', [ - { 'tuple': [':max_options', 20] }, - { 'tuple': [':max_option_chars', 200] }, - { 'tuple': [':min_expiration', 0] }, - { 'tuple': [':max_expiration', 365 * 86400] } - ]] }, - { 'tuple': [':registrations_open', true] }, - { 'tuple': [':invites_enabled', false] }, - { 'tuple': [':account_activation_required', false] }, - { 'tuple': [':federating', true] }, - { 'tuple': [':federation_reachability_timeout_days', 7] }, - { 'tuple': - [':federation_publisher_modules', ['Pleroma.Web.ActivityPub.Publisher', 'Pleroma.Web.Websub', 'Pleroma.Web.Salmon']] }, - { 'tuple': [':allow_relay', true] }, - { 'tuple': [':rewrite_policy', 'Pleroma.Web.ActivityPub.MRF.NoOpPolicy'] }, - { 'tuple': [':public', true] }, - { 'tuple': [':managed_config', true] }, - { 'tuple': [':static_dir', 'instance/static/'] }, - { 'tuple': [':allowed_post_formats', ['text/plain', 'text/html', 'text/markdown', 'text/bbcode']] }, - { 'tuple': [':mrf_transparency', true] }, - { 'tuple': [':extended_nickname_format', false] }, - { 'tuple': [':max_pinned_statuses', 1] }, - { 'tuple': [':no_attachment_links', false] }, - { 'tuple': [':max_report_comment_size', 1000] }, - { 'tuple': [':safe_dm_mentions', false] }, - { 'tuple': [':healthcheck', false] }, - { 'tuple': [':remote_post_retention_days', 90] }, - { 'tuple': [':skip_thread_containment', true] }, - { 'tuple': [':limit_to_local_content', ':unauthenticated'] }, - { 'tuple': [':dynamic_configuration', true] }, - { 'tuple': [':max_account_fields', 10] }, - { 'tuple': [':max_remote_account_fields', 20] }, - { 'tuple': [':account_field_name_length', 255] }, - { 'tuple': [':account_field_value_length', 255] }, - { 'tuple': [':external_user_synchronization', true] }, - { 'tuple': [':user_bio_length', 5000] }, - { 'tuple': [':user_name_length', 100] } - ] - }, - { - group: 'mime', - key: ':types', - value: { - 'application/activity+json': ['activity+json'], - 'application/jrd+json': ['jrd+json'], - 'application/ld+json': ['activity+json'], - 'application/xml': ['xml'], - 'application/xrd+xml': ['xrd+xml'] - } - }, - { - group: 'cors_plug', - key: ':max_age', - value: 86400 - }, - { - group: 'cors_plug', - key: ':methods', - value: ['POST', 'PUT', 'DELETE', 'GET', 'PATCH', 'OPTIONS'] - }, - { - group: 'cors_plug', - key: ':expose', - value: [ - 'Link', - 'X-RateLimit-Reset', - 'X-RateLimit-Limit', - 'X-RateLimit-Remaining', - 'X-Request-Id', - 'Idempotency-Key' - ] - }, - { - group: 'cors_plug', - key: ':credentials', - value: true - }, - { - group: 'cors_plug', - key: ':headers', - value: ['Authorization', 'Content-Type', 'Idempotency-Key'] - }, - { - group: 'tesla', - key: ':adapter', - value: 'Tesla.Adapter.Hackney' - }, - { - group: 'pleroma', - key: ':markup', - value: [ - { 'tuple': [':allow_inline_images', true] }, - { 'tuple': [':allow_headings', false] }, - { 'tuple': [':allow_tables', false] }, - { 'tuple': [':allow_fonts', false] }, - { 'tuple': [':scrub_policy', [ - 'Pleroma.HTML.Transform.MediaProxy', - 'Pleroma.HTML.Scrubber.Default' - ]] } - ] - } -] diff --git a/src/api/users.js b/src/api/users.js index 1e97da92..fb168d6c 100644 --- a/src/api/users.js +++ b/src/api/users.js @@ -2,12 +2,23 @@ import request from '@/utils/request' import { getToken } from '@/utils/auth' import { baseName } from './utils' -export async function addRight(nickname, right, authHost, token) { +export async function activateUsers(nicknames, authHost, token) { return await request({ baseURL: baseName(authHost), - url: `/api/pleroma/admin/users/${nickname}/permission_group/${right}`, + url: `/api/pleroma/admin/users/activate`, + method: 'patch', + headers: authHeaders(token), + data: { nicknames } + }) +} + +export async function addRight(nicknames, right, authHost, token) { + return await request({ + baseURL: baseName(authHost), + url: `/api/pleroma/admin/users/permission_group/${right}`, method: 'post', - headers: authHeaders(token) + headers: authHeaders(token), + data: { nicknames } }) } @@ -21,21 +32,33 @@ export async function createNewAccount(nickname, email, password, authHost, toke }) } -export async function deleteRight(nickname, right, authHost, token) { +export async function deactivateUsers(nicknames, authHost, token) { return await request({ baseURL: baseName(authHost), - url: `/api/pleroma/admin/users/${nickname}/permission_group/${right}`, - method: 'delete', - headers: authHeaders(token) + url: `/api/pleroma/admin/users/deactivate`, + method: 'patch', + headers: authHeaders(token), + data: { nicknames } }) } -export async function deleteUser(nickname, authHost, token) { +export async function deleteRight(nicknames, right, authHost, token) { return await request({ baseURL: baseName(authHost), - url: `/api/pleroma/admin/users?nickname=${nickname}`, + url: `/api/pleroma/admin/users/permission_group/${right}`, method: 'delete', - headers: authHeaders(token) + headers: authHeaders(token), + data: { nicknames } + }) +} + +export async function deleteUsers(nicknames, authHost, token) { + return await request({ + baseURL: baseName(authHost), + url: `/api/pleroma/admin/users`, + method: 'delete', + headers: authHeaders(token), + data: { nicknames } }) } @@ -94,15 +117,6 @@ export async function tagUser(nicknames, tags, authHost, token) { }) } -export async function toggleUserActivation(nickname, authHost, token) { - return await request({ - baseURL: baseName(authHost), - url: `/api/pleroma/admin/users/${nickname}/toggle_activation`, - method: 'patch', - headers: authHeaders(token) - }) -} - export async function untagUser(nicknames, tags, authHost, token) { return await request({ baseURL: baseName(authHost), diff --git a/src/lang/en.js b/src/lang/en.js index c191007c..8818f2dd 100644 --- a/src/lang/en.js +++ b/src/lang/en.js @@ -313,7 +313,56 @@ export default { database: 'Database', other: 'Other', relays: 'Relays', - success: 'Settings changed successfully!' + success: 'Settings changed successfully!', + emojiPacks: 'Emoji packs', + reloadEmoji: 'Reload emoji', + importPacks: 'Import packs from the server filesystem', + importEmojiTooltip: 'Importing from the filesystem will scan the directories and import those without pack.json but with emoji.txt or without neither', + localPacks: 'Local packs', + refreshLocalPacks: 'Refresh local packs', + createLocalPack: 'Create a new local pack', + packs: 'Packs', + remotePacks: 'Remote packs', + remoteInstanceAddress: 'Remote instance address', + refreshRemote: 'Refresh remote packs', + sharePack: 'Share pack', + homepage: 'Homepage', + description: 'Description', + license: 'License', + fallbackSrc: 'Fallback source', + fallbackSrcSha: 'Fallback source SHA', + savePackMetadata: 'Save pack metadata', + addNewEmoji: 'Add new emoji to the pack', + shortcode: 'Shortcode', + uploadFile: 'Upload a file', + customFilename: 'Custom filename', + optional: 'optional', + customFilenameDesc: 'Custom file name (optional)', + url: 'URL', + required: 'required', + clickToUpload: 'Click to upload', + showPackContents: 'Show pack contents', + manageEmoji: 'Manage existing emoji', + file: 'File', + update: 'Update', + remove: 'Remove', + selectLocalPack: 'Select the local pack to copy to', + localPack: 'Local pack', + specifyShortcode: 'Specify a custom shortcode', + specifyFilename: 'Specify a custom filename', + leaveEmptyShortcode: 'leave empty to use the same shortcode', + leaveEmptyFilename: 'leave empty to use the same filename', + copy: 'Copy', + copyToLocalPack: 'Copy to local pack', + thisWillDownload: 'This will download the', + downloadToCurrentInstance: 'pack to the current instance under the name', + canBeChanged: 'can be changed below', + willBeUsable: 'It will then be usable and shareable from the current instance', + downloadPack: 'Download pack', + deletePack: 'Delete pack', + downloadSharedPack: 'Download shared pack to current instance', + downloadAsOptional: 'Download as (optional)', + downloadPackArchive: 'Download pack archive' }, invites: { inviteTokens: 'Invite tokens', diff --git a/src/router/index.js b/src/router/index.js index a5c496cc..53dbf8ec 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -63,20 +63,6 @@ const moderationLog = { ] } -const emojiPacksDisabled = disabledFeatures.includes('emoji-packs') -const emojiPacks = { - path: '/emoji-packs', - component: Layout, - children: [ - { - path: 'index', - component: () => import('@/views/emoji-packs/index'), - name: 'Emoji packs', - meta: { title: 'emoji-packs', icon: 'settings', noCache: true } - } - ] -} - export const constantRouterMap = [ { path: '/redirect', @@ -144,7 +130,6 @@ export const asyncRouterMap = [ ...(invitesDisabled ? [] : [invites]), ...(moderationLogDisabled ? [] : [moderationLog]), ...(settingsDisabled ? [] : [settings]), - ...(emojiPacksDisabled ? [] : [emojiPacks]), { path: '/users/:id', component: Layout, diff --git a/src/store/index.js b/src/store/index.js index 45251a38..c71fca87 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -13,7 +13,7 @@ import user from './modules/user' import userProfile from './modules/userProfile' import users from './modules/users' import getters from './getters' -import emoji_packs from './modules/emoji_packs.js' +import emojiPacks from './modules/emojiPacks.js' Vue.use(Vuex) @@ -31,7 +31,7 @@ const store = new Vuex.Store({ user, userProfile, users, - emoji_packs + emojiPacks }, getters }) diff --git a/src/store/modules/emoji_packs.js b/src/store/modules/emojiPacks.js similarity index 98% rename from src/store/modules/emoji_packs.js rename to src/store/modules/emojiPacks.js index 1cee0060..6a14e406 100644 --- a/src/store/modules/emoji_packs.js +++ b/src/store/modules/emojiPacks.js @@ -7,7 +7,7 @@ import { deletePack, savePackMetadata, importFromFS, - updatePackFile } from '@/api/emoji_packs' + updatePackFile } from '@/api/emojiPacks' import { Message } from 'element-ui' diff --git a/src/store/modules/settings.js b/src/store/modules/settings.js index 3ee58c4e..bb6bd8c1 100644 --- a/src/store/modules/settings.js +++ b/src/store/modules/settings.js @@ -1,5 +1,4 @@ import { fetchSettings, updateSettings, uploadMedia } from '@/api/settings' -import { initialSettings } from '@/api/initialDataForConfig' import { filterIgnored, parseTuples, valueHasTuples, wrapConfig } from './normalizers' const settings = { @@ -116,11 +115,7 @@ const settings = { async FetchSettings({ commit, dispatch, getters }) { commit('SET_LOADING', true) const response = await fetchSettings(getters.authHost, getters.token) - if (response.data.configs.length === 0) { - dispatch('SubmitChanges', initialSettings) - } else { - commit('SET_SETTINGS', response.data.configs) - } + commit('SET_SETTINGS', response.data.configs) commit('SET_LOADING', false) }, RewriteConfig({ commit }, { tab, data }) { diff --git a/src/store/modules/users.js b/src/store/modules/users.js index b3d35108..df3c946d 100644 --- a/src/store/modules/users.js +++ b/src/store/modules/users.js @@ -1,13 +1,14 @@ import { + activateUsers, addRight, createNewAccount, + deactivateUsers, deleteRight, - deleteUser, + deleteUsers, fetchUsers, getPasswordResetToken, searchUsers, tagUser, - toggleUserActivation, untagUser, requirePasswordReset } from '@/api/users' @@ -37,12 +38,6 @@ const users = { SET_LOADING: (state, status) => { state.loading = status }, - SWAP_USER: (state, updatedUser) => { - const updated = state.fetchedUsers.map(user => user.id === updatedUser.id ? updatedUser : user) - state.fetchedUsers = updated - .map(user => user.nickname ? user : { ...user, nickname: '' }) - .sort((a, b) => a.nickname.localeCompare(b.nickname)) - }, SWAP_USERS: (state, users) => { const usersWithoutSwapped = users.reduce((acc, user) => { return acc.filter(u => u.id !== user.id) @@ -76,11 +71,35 @@ const users = { } }, actions: { - async AddTag({ commit, getters }, { users, tag }) { + async ActivateUsers({ commit, dispatch, getters, state }, users) { + const updatedUsers = users.map(user => { + return { ...user, deactivated: false } + }) + commit('SWAP_USERS', updatedUsers) + + const usersNicknames = users.map(user => user.nickname) + await activateUsers(usersNicknames, getters.authHost, getters.token) + dispatch('FetchUsers', { page: state.currentPage }) + }, + async AddRight({ commit, dispatch, getters, state }, { users, right }) { + const updatedUsers = users.map(user => { + return user.local ? { ...user, roles: { ...user.roles, [right]: true }} : user + }) + commit('SWAP_USERS', updatedUsers) + + const usersNicknames = users.map(user => user.nickname) + await addRight(usersNicknames, right, getters.authHost, getters.token) + dispatch('FetchUsers', { page: state.currentPage }) + }, + async AddTag({ commit, dispatch, getters, state }, { users, tag }) { + const updatedUsers = users.map(user => { + return { ...user, tags: [...user.tags, tag] } + }) + commit('SWAP_USERS', updatedUsers) + const nicknames = users.map(user => user.nickname) await tagUser(nicknames, [tag], getters.authHost, getters.token) - - commit('SWAP_USERS', users.map(user => ({ ...user, tags: [...user.tags, tag] }))) + dispatch('FetchUsers', { page: state.currentPage }) }, async ClearFilters({ commit, dispatch, state }) { commit('CLEAR_USERS_FILTERS') @@ -90,33 +109,60 @@ const users = { await createNewAccount(nickname, email, password, getters.authHost, getters.token) dispatch('FetchUsers', { page: state.currentPage }) }, - async DeleteUser({ commit, getters, state }, user) { - const { data } = await deleteUser(user.nickname, getters.authHost, getters.token) - const users = state.fetchedUsers.filter(user => user.nickname !== data) - commit('SET_USERS', users) + async DeactivateUsers({ commit, dispatch, getters, state }, users) { + const updatedUsers = users.map(user => { + return { ...user, deactivated: true } + }) + commit('SWAP_USERS', updatedUsers) + + const usersNicknames = users.map(user => user.nickname) + await deactivateUsers(usersNicknames, getters.authHost, getters.token) + dispatch('FetchUsers', { page: state.currentPage }) }, - async RequirePasswordReset({ commit, getters, state }, user) { + async DeleteRight({ commit, dispatch, getters, state }, { users, right }) { + const updatedUsers = users.map(user => { + return user.local ? { ...user, roles: { ...user.roles, [right]: false }} : user + }) + commit('SWAP_USERS', updatedUsers) + + const usersNicknames = users.map(user => user.nickname) + await deleteRight(usersNicknames, right, getters.authHost, getters.token) + dispatch('FetchUsers', { page: state.currentPage }) + }, + async DeleteUsers({ commit, getters, state }, users) { + const deletedUsersIds = users.map(deletedUser => deletedUser.id) + const updatedUsers = state.fetchedUsers.filter(user => !deletedUsersIds.includes(user.id)) + commit('SET_USERS', updatedUsers) + + const usersNicknames = users.map(user => user.nickname) + await deleteUsers(usersNicknames, getters.authHost, getters.token) + }, + async RequirePasswordReset({ getters }, user) { await requirePasswordReset(user.nickname, getters.authHost, getters.token) }, - async FetchUsers({ commit, state, getters, dispatch }, { page }) { + async FetchUsers({ commit, dispatch, getters, state }, { page }) { commit('SET_LOADING', true) const filters = Object.keys(state.filters).filter(filter => state.filters[filter]).join() const response = await fetchUsers(filters, getters.authHost, getters.token, page) await dispatch('GetNodeInfo') loadUsers(commit, page, response.data) }, - async GetPasswordResetToken({ commit, state, getters }, nickname) { + async GetPasswordResetToken({ commit, getters }, nickname) { const { data } = await getPasswordResetToken(nickname, getters.authHost, getters.token) commit('SET_PASSWORD_RESET_TOKEN', data) }, RemovePasswordToken({ commit }) { commit('SET_PASSWORD_RESET_TOKEN', { link: '', token: '' }) }, - async RemoveTag({ commit, getters }, { users, tag }) { + async RemoveTag({ commit, dispatch, getters, state }, { users, tag }) { + const updatedUsers = users.map(user => { + return { ...user, tags: user.tags.filter(userTag => userTag !== tag) } + }) + commit('SWAP_USERS', updatedUsers) + const nicknames = users.map(user => user.nickname) await untagUser(nicknames, [tag], getters.authHost, getters.token) - - commit('SWAP_USERS', users.map(user => ({ ...user, tags: user.tags.filter(userTag => userTag !== tag) }))) + dispatch('FetchUsers', { page: state.currentPage }) }, async SearchUsers({ commit, dispatch, state, getters }, { query, page }) { if (query.length === 0) { @@ -132,10 +178,6 @@ const users = { loadUsers(commit, page, response.data) } }, - async ToggleUserActivation({ commit, getters }, nickname) { - const { data } = await toggleUserActivation(nickname, getters.authHost, getters.token) - commit('SWAP_USER', data) - }, async ToggleUsersFilter({ commit, dispatch, state }, filters) { const defaultFilters = { local: false, @@ -146,14 +188,6 @@ const users = { const currentFilters = { ...defaultFilters, ...filters } commit('SET_USERS_FILTERS', currentFilters) dispatch('SearchUsers', { query: state.searchQuery, page: 1 }) - }, - async ToggleRight({ commit, getters }, { user, right }) { - user.roles[right] - ? await deleteRight(user.nickname, right, getters.authHost, getters.token) - : await addRight(user.nickname, right, getters.authHost, getters.token) - - const updatedUser = { ...user, roles: { ...user.roles, [right]: !user.roles[right] }} - commit('SWAP_USER', updatedUser) } } } diff --git a/src/utils/request.js b/src/utils/request.js index bbed6501..b7e3d5f1 100644 --- a/src/utils/request.js +++ b/src/utils/request.js @@ -10,14 +10,20 @@ const service = axios.create({ service.interceptors.response.use( response => response, error => { + let errorMessage console.log(`Error ${error}`) - console.log(error.response.data) - // If there's an "error" property in the json, use it - const edata = error.response.data.error ? error.response.data.error : error.response.data + if (error.response) { + const edata = error.response.data.error ? error.response.data.error : error.response.data + errorMessage = !error.response.headers['content-type'].includes('application/json') + ? `${error.message}` + : `${error.message} - ${edata}` + } else { + errorMessage = error + } Message({ - message: `${error.message} - ${edata}`, + message: errorMessage, type: 'error', duration: 5 * 1000 }) diff --git a/src/views/emoji-packs/components/EmojiPack.vue b/src/views/emoji-packs/components/EmojiPack.vue deleted file mode 100644 index d29ea9b2..00000000 --- a/src/views/emoji-packs/components/EmojiPack.vue +++ /dev/null @@ -1,218 +0,0 @@ - - - - - diff --git a/src/views/emoji-packs/components/NewEmojiUploader.vue b/src/views/emoji-packs/components/NewEmojiUploader.vue deleted file mode 100644 index d62011de..00000000 --- a/src/views/emoji-packs/components/NewEmojiUploader.vue +++ /dev/null @@ -1,93 +0,0 @@ - - - - - diff --git a/src/views/emoji-packs/components/PropertyEditingRow.vue b/src/views/emoji-packs/components/PropertyEditingRow.vue deleted file mode 100644 index 8696e06a..00000000 --- a/src/views/emoji-packs/components/PropertyEditingRow.vue +++ /dev/null @@ -1,27 +0,0 @@ - - - - - diff --git a/src/views/emoji-packs/index.vue b/src/views/emoji-packs/index.vue deleted file mode 100644 index eb64fbed..00000000 --- a/src/views/emoji-packs/index.vue +++ /dev/null @@ -1,151 +0,0 @@ - - - - - diff --git a/src/views/emojiPacks/components/EmojiPack.vue b/src/views/emojiPacks/components/EmojiPack.vue new file mode 100644 index 00000000..81e2da99 --- /dev/null +++ b/src/views/emojiPacks/components/EmojiPack.vue @@ -0,0 +1,257 @@ + + + + + diff --git a/src/views/emojiPacks/components/NewEmojiUploader.vue b/src/views/emojiPacks/components/NewEmojiUploader.vue new file mode 100644 index 00000000..0715cde8 --- /dev/null +++ b/src/views/emojiPacks/components/NewEmojiUploader.vue @@ -0,0 +1,90 @@ + + + + + diff --git a/src/views/emoji-packs/components/SingleEmojiEditor.vue b/src/views/emojiPacks/components/SingleEmojiEditor.vue similarity index 52% rename from src/views/emoji-packs/components/SingleEmojiEditor.vue rename to src/views/emojiPacks/components/SingleEmojiEditor.vue index e5d7b01b..39df6bf8 100644 --- a/src/views/emoji-packs/components/SingleEmojiEditor.vue +++ b/src/views/emojiPacks/components/SingleEmojiEditor.vue @@ -1,71 +1,50 @@ - - + + diff --git a/src/views/emojiPacks/index.vue b/src/views/emojiPacks/index.vue new file mode 100644 index 00000000..5e2e468d --- /dev/null +++ b/src/views/emojiPacks/index.vue @@ -0,0 +1,132 @@ + + + + + diff --git a/src/views/reports/components/TimelineItem.vue b/src/views/reports/components/TimelineItem.vue index 771298aa..e7e41e7b 100644 --- a/src/views/reports/components/TimelineItem.vue +++ b/src/views/reports/components/TimelineItem.vue @@ -21,7 +21,7 @@ + @click.native="toggleActivation(report.account)"> {{ report.account.deactivated ? $t('users.activateAccount') : $t('users.deactivateAccount') }} + + + @@ -74,9 +77,10 @@