diff --git a/CHANGELOG.md b/CHANGELOG.md index 24db7aec..ac4e0a92 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,31 +6,40 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ## Unreleased -### Changed +### Added -- **breaking** PleromaFE login feature relies on `admin` scope presence in PleromaFE token (older versions of PleromaFE don't support it) -- 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 -- Leave dropdown menu open after clicking an action -- Move current try/catch error handling from view files to module, add it where necessary -- Display checkboxes in status card and fetch statuses only when status card was rendered from Statuses by instance page -- Move statuses by instance state from local state to store state -- Pass user's ID to actions that moderate users when action is called from user's profile page +- Ability to see local statuses in Statuses by instance section +- Ability to configure Oban.Cron settings and settings for notifications streamer + +### Fixed + +- Fix parsing tuples in Pleroma.Upload.Filter.Mogrify and Pleroma.Emails.Mailer settings + +## [2.0] - 2020-02-27 ### Added - Optimistic update for actions in users module and fetching users after api function finished its execution - Relay management - Ability to fetch all statuses from a given instance -- Grouped reports: now you can view reports, which are grouped by status (pagination is not implemented yet, though) - Ability to confirm users' emails and resend confirmation emails - Report notes - Ability to moderate users on the statuses page - Ability to moderate user on the user's page +- Ability to remove setting's updated value and set it back to initial value - Ability to restart an application when settings that require instance reboot were changed -- Mobile UI for Settings tab +- Mobile and Tablet UI for all sections + +### Changed + +- **breaking** PleromaFE login feature relies on `admin` scope presence in PleromaFE token (older versions of PleromaFE don't support it) +- `mailerEnabled` must be set to `true` in order to require password reset (password reset currently only works via email) +- Render inputs for configuring settings based on description that comes from the BE +- 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 +- Leave dropdown menu open after clicking an action +- Display checkboxes in status card and fetch statuses only when status card was rendered from Statuses by instance page +- Move statuses by instance state from local state to store state ### Fixed @@ -39,6 +48,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - Remove duplicated success message - Fix styles for Statuses by instance page - Fix styles for Reports section +- Fix listing remote emoji ## [1.2.0] - 2019-09-27 diff --git a/src/api/__mocks__/reports.js b/src/api/__mocks__/reports.js index ba4e412e..36fc2008 100644 --- a/src/api/__mocks__/reports.js +++ b/src/api/__mocks__/reports.js @@ -11,40 +11,12 @@ const reports = [ { created_at: '2019-05-18T13:01:33.000Z', account: { acct: 'nick', display_name: 'Nick Keys', tags: [] }, actor: { acct: 'admin' }, state: 'closed', id: '4', content: '', statuses: [] } ] -const groupedReports = [ - { account: { avatar: 'http://localhost:4000/images/avi.png', confirmation_pending: false, deactivated: false, display_name: 'leo', id: '9oG0YghgBi94EATI9I', local: true, nickname: 'leo', roles: { admin: false, moderator: false }, tags: [] }, - actors: [{ acct: 'admin', avatar: 'http://localhost:4000/images/avi.png', deactivated: false, display_name: 'admin', id: '9oFz4pTauG0cnJ581w', local: true, nickname: 'admin', roles: { admin: false, moderator: false }, tags: [], url: 'http://localhost:4000/users/admin', username: 'admin' }], - date: '2019-11-23T12:56:11.969772Z', - reports: [ - { created_at: '2019-05-21T21:35:33.000Z', account: { acct: 'benj', display_name: 'Benjamin Fame', tags: [] }, actor: { acct: 'admin' }, state: 'open', id: '2', content: 'This is a report', statuses: [] }, - { created_at: '2019-05-20T22:45:33.000Z', account: { acct: 'alice', display_name: 'Alice Pool', tags: [] }, actor: { acct: 'admin2' }, state: 'resolved', id: '7', content: 'Please block this user', statuses: [ - { account: { display_name: 'Alice Pool', avatar: '' }, visibility: 'public', sensitive: false, id: '11', content: 'Hey!', url: '', created_at: '2019-05-10T21:35:33.000Z' }, - { account: { display_name: 'Alice Pool', avatar: '' }, visibility: 'unlisted', sensitive: true, id: '10', content: 'Bye!', url: '', created_at: '2019-05-10T21:00:33.000Z' } - ] } - ], - status: { - account: { acct: 'leo' }, - content: 'At vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis', - created_at: '2019-11-23T12:55:20.000Z', - id: '9pFoQO69piu7cUDnJg', - url: 'http://localhost:4000/notice/9pFoQO69piu7cUDnJg', - visibility: 'unlisted', - sensitive: true - }, - status_deleted: false - } -] - export async function fetchReports(filter, page, pageSize, authHost, token) { return filter.length > 0 ? Promise.resolve({ data: { reports: reports.filter(report => report.state === filter) }}) : Promise.resolve({ data: { reports }}) } -export async function fetchGroupedReports(authHost, token) { - return Promise.resolve({ data: { reports: groupedReports }}) -} - export async function changeState(reportsData, authHost, token) { return Promise.resolve({ data: '' }) } diff --git a/src/api/reports.js b/src/api/reports.js index 3454da2f..abd371c1 100644 --- a/src/api/reports.js +++ b/src/api/reports.js @@ -24,15 +24,6 @@ export async function fetchReports(filter, page, pageSize, authHost, token) { }) } -export async function fetchGroupedReports(authHost, token) { - return await request({ - baseURL: baseName(authHost), - url: `/api/pleroma/admin/grouped_reports`, - method: 'get', - headers: authHeaders(token) - }) -} - export async function createNote(content, reportID, authHost, token) { return await request({ baseURL: baseName(authHost), diff --git a/src/api/status.js b/src/api/status.js index 676cd9dc..37f7e0c2 100644 --- a/src/api/status.js +++ b/src/api/status.js @@ -21,6 +21,15 @@ export async function deleteStatus(id, authHost, token) { }) } +export async function fetchStatuses({ godmode, localOnly, authHost, token, pageSize, page }) { + return await request({ + baseURL: baseName(authHost), + url: `/api/pleroma/admin/statuses?godmode=${godmode}&local_only=${localOnly}&page=${page}&page_size=${pageSize}`, + method: 'get', + headers: authHeaders(token) + }) +} + export async function fetchStatusesByInstance({ instance, authHost, token, pageSize, page }) { return await request({ baseURL: baseName(authHost), diff --git a/src/components/Status/index.vue b/src/components/Status/index.vue index f6c63a12..50fbcfb0 100644 --- a/src/components/Status/index.vue +++ b/src/components/Status/index.vue @@ -267,9 +267,8 @@ export default { font-style: italic; } } -@media -only screen and (max-width: 760px), -(min-device-width: 768px) and (max-device-width: 1024px) { + +@media only screen and (max-width:480px) { .el-message { min-width: 80%; } diff --git a/src/lang/en.js b/src/lang/en.js index d0728e07..8b8e9ff7 100644 --- a/src/lang/en.js +++ b/src/lang/en.js @@ -193,7 +193,7 @@ export default { deleteAccount: 'Delete Account', deleteAccounts: 'Delete Accounts', forceNsfw: 'Force posts to be NSFW', - stripMedia: 'Force posts not to have media', + stripMedia: 'Force posts to not have media', forceUnlisted: 'Force posts to be unlisted', sandbox: 'Force posts to be followers-only', disableRemoteSubscription: 'Disallow following user from remote instances', @@ -244,7 +244,9 @@ export default { statuses: 'Statuses by instance', instanceFilter: 'Instance filter', loadMore: 'Load more', - noInstances: 'No other instances found' + noInstances: 'No other instances found', + onlyLocalStatuses: 'Show only local statuses', + showPrivateStatuses: 'Show private statuses' }, userProfile: { tags: 'Tags', @@ -254,8 +256,7 @@ export default { external: 'external', localUppercase: 'Local', nickname: 'Nickname', - recentStatuses: 'Recent Statues', - showPrivateStatuses: 'Show private statuses', + recentStatuses: 'Recent Statuses', roles: 'Roles', activeUppercase: 'Active', active: 'active', @@ -273,7 +274,6 @@ export default { }, reports: { reports: 'Reports', - groupedReports: 'Grouped reports', reply: 'Reply', from: 'From', showNotes: 'Show notes', diff --git a/src/store/getters.js b/src/store/getters.js index d51dbd28..f58f0c6b 100644 --- a/src/store/getters.js +++ b/src/store/getters.js @@ -17,8 +17,6 @@ const getters = { errorLogs: state => state.errorLog.logs, users: state => state.users.fetchedUsers, authHost: state => state.user.authHost, - settings: state => state.settings, - instances: state => state.peers.fetchedPeers, - statuses: state => state.status.fetchedStatuses + settings: state => state.settings } export default getters diff --git a/src/store/modules/normalizers.js b/src/store/modules/normalizers.js index 651c8295..04416777 100644 --- a/src/store/modules/normalizers.js +++ b/src/store/modules/normalizers.js @@ -63,6 +63,9 @@ export const parseNonTuples = (key, value) => { return updated } if (key === ':args') { + if (typeof value === 'string') { + return [value] + } const index = value.findIndex(el => typeof el === 'object' && el.tuple.includes('implode')) const updated = value.map((el, i) => i === index ? 'implode' : el) return updated @@ -80,10 +83,15 @@ export const parseTuples = (tuples, key) => { accum[item.tuple[0]] = item.tuple[1].reduce((acc, mascot) => { return [...acc, { [mascot.tuple[0]]: { ...mascot.tuple[1], id: `f${(~~(Math.random() * 1e8)).toString(16)}` }}] }, []) - } else if (item.tuple[0] === ':groups' || item.tuple[0] === ':replace' || item.tuple[0] === ':retries') { + } else if (Array.isArray(item.tuple[1]) && + (item.tuple[0] === ':groups' || item.tuple[0] === ':replace' || item.tuple[0] === ':retries')) { accum[item.tuple[0]] = item.tuple[1].reduce((acc, group) => { return [...acc, { [group.tuple[0]]: { value: group.tuple[1], id: `f${(~~(Math.random() * 1e8)).toString(16)}` }}] }, []) + } else if (item.tuple[0] === ':crontab') { + accum[item.tuple[0]] = item.tuple[1].reduce((acc, group) => { + return { ...acc, [group.tuple[1]]: group.tuple[0] } + }, {}) } else if (item.tuple[0] === ':match_actor') { accum[item.tuple[0]] = Object.keys(item.tuple[1]).reduce((acc, regex) => { return [...acc, { [regex]: { value: item.tuple[1][regex], id: `f${(~~(Math.random() * 1e8)).toString(16)}` }}] @@ -218,7 +226,12 @@ export const wrapUpdatedSettings = (group, settings, currentState) => { const wrapValues = (settings, currentState) => { return Object.keys(settings).map(setting => { const [type, value] = settings[setting] - if (type === 'keyword' || type.includes('keyword') || setting === ':replace') { + if ( + type === 'keyword' || + type.includes('keyword') || + type.includes('tuple') && type.includes('list') || + setting === ':replace' + ) { return { 'tuple': [setting, wrapValues(value, currentState)] } } else if (type === 'atom' && value.length > 0) { return { 'tuple': [setting, `:${value}`] } @@ -226,8 +239,8 @@ const wrapValues = (settings, currentState) => { return typeof value === 'string' ? { 'tuple': [setting, value] } : { 'tuple': [setting, { 'tuple': value }] } - } else if (type.includes('tuple') && type.includes('list')) { - return { 'tuple': [setting, value] } + } else if (type === 'reversed_tuple') { + return { 'tuple': [value, setting] } } else if (type === 'map') { const mapValue = Object.keys(value).reduce((acc, key) => { acc[key] = setting === ':match_actor' ? value[key] : value[key][1] diff --git a/src/store/modules/reports.js b/src/store/modules/reports.js index c1b07b51..3a836a2f 100644 --- a/src/store/modules/reports.js +++ b/src/store/modules/reports.js @@ -1,13 +1,11 @@ -import { changeState, fetchReports, fetchGroupedReports, createNote, deleteNote } from '@/api/reports' +import { changeState, fetchReports, createNote, deleteNote } from '@/api/reports' const reports = { state: { fetchedReports: [], - fetchedGroupedReports: [], totalReportsCount: 0, currentPage: 1, pageSize: 50, - groupReports: false, stateFilter: '', loading: true }, @@ -24,17 +22,11 @@ const reports = { SET_REPORTS: (state, reports) => { state.fetchedReports = reports }, - SET_GROUPED_REPORTS: (state, reports) => { - state.fetchedGroupedReports = reports - }, SET_REPORTS_COUNT: (state, total) => { state.totalReportsCount = total }, SET_REPORTS_FILTER: (state, filter) => { state.stateFilter = filter - }, - SET_REPORTS_GROUPING: (state) => { - state.groupReports = !state.groupReports } }, actions: { @@ -46,14 +38,7 @@ const reports = { return updatedReportsIds.includes(report.id) ? { ...report, state: reportsData[0].state } : report }) - const updatedGroupedReports = state.fetchedGroupedReports.map(group => { - const updatedReportsIds = reportsData.map(({ id }) => id) - const updatedReports = group.reports.map(report => updatedReportsIds.includes(report.id) ? { ...report, state: reportsData[0].state } : report) - return { ...group, reports: updatedReports } - }) - commit('SET_REPORTS', updatedReports) - commit('SET_GROUPED_REPORTS', updatedGroupedReports) }, ClearFetchedReports({ commit }) { commit('SET_REPORTS', []) @@ -67,19 +52,9 @@ const reports = { commit('SET_PAGE', page) commit('SET_LOADING', false) }, - async FetchGroupedReports({ commit, getters }) { - commit('SET_LOADING', true) - const { data } = await fetchGroupedReports(getters.authHost, getters.token) - - commit('SET_GROUPED_REPORTS', data.reports) - commit('SET_LOADING', false) - }, SetFilter({ commit }, filter) { commit('SET_REPORTS_FILTER', filter) }, - ToggleReportsGrouping({ commit }) { - commit('SET_REPORTS_GROUPING') - }, CreateReportNote({ commit, getters, state, rootState }, { content, reportID }) { createNote(content, reportID, getters.authHost, getters.token) diff --git a/src/store/modules/status.js b/src/store/modules/status.js index 228e03f1..e0cc5d97 100644 --- a/src/store/modules/status.js +++ b/src/store/modules/status.js @@ -1,4 +1,4 @@ -import { changeStatusScope, deleteStatus, fetchStatusesByInstance } from '@/api/status' +import { changeStatusScope, deleteStatus, fetchStatuses, fetchStatusesByInstance } from '@/api/status' const status = { state: { @@ -6,11 +6,21 @@ const status = { loading: false, statusesByInstance: { selectedInstance: '', + showLocal: false, + showPrivate: false, page: 1, - pageSize: 30 + pageSize: 20, + buttonLoading: false, + allLoaded: false } }, mutations: { + CHANGE_GODMODE_CHECKBOX_VALUE: (state, value) => { + state.statusesByInstance.showPrivate = value + }, + CHANGE_LOCAL_CHECKBOX_VALUE: (state, value) => { + state.statusesByInstance.showLocal = value + }, CHANGE_PAGE: (state, page) => { state.statusesByInstance.page = page }, @@ -23,6 +33,12 @@ const status = { PUSH_STATUSES: (state, statuses) => { state.fetchedStatuses = [...state.fetchedStatuses, ...statuses] }, + SET_ALL_LOADED: (state, status) => { + state.statusesByInstance.allLoaded = status + }, + SET_BUTTON_LOADING: (state, status) => { + state.statusesByInstance.buttonLoading = status + }, SET_LOADING: (state, status) => { state.loading = status } @@ -36,8 +52,6 @@ const status = { dispatch('FetchUserStatuses', { userId, godmode }) } else if (fetchStatusesByInstance) { // called from Statuses by Instance dispatch('FetchStatusesByInstance') - } else { // called from GroupedReports - dispatch('FetchGroupedReports') } }, async DeleteStatus({ dispatch, getters }, { statusId, reportCurrentPage, userId, godmode, fetchStatusesByInstance }) { @@ -48,14 +62,50 @@ const status = { dispatch('FetchUserStatuses', { userId, godmode }) } else if (fetchStatusesByInstance) { // called from Statuses by Instance dispatch('FetchStatusesByInstance') - } else { // called from GroupedReports - dispatch('FetchGroupedReports') } }, - async FetchStatusesByInstance({ commit, getters, state }) { + async FetchStatusesByInstance({ commit, getters, state, rootState }) { commit('SET_LOADING', true) - const statuses = state.statusesByInstance.selectedInstance === '' - ? { data: [] } + if (state.statusesByInstance.selectedInstance === '') { + commit('SET_STATUSES_BY_INSTANCE', []) + } else { + const statuses = state.statusesByInstance.selectedInstance === rootState.user.authHost + ? await fetchStatuses( + { + godmode: state.statusesByInstance.showPrivate, + localOnly: state.statusesByInstance.showLocal, + authHost: getters.authHost, + token: getters.token, + pageSize: state.statusesByInstance.pageSize, + page: state.statusesByInstance.page + }) + : await fetchStatusesByInstance( + { + instance: state.statusesByInstance.selectedInstance, + authHost: getters.authHost, + token: getters.token, + pageSize: state.statusesByInstance.pageSize, + page: state.statusesByInstance.page + }) + commit('SET_STATUSES_BY_INSTANCE', statuses.data) + if (statuses.data.length < state.statusesByInstance.pageSize) { + commit('SET_ALL_LOADED', true) + } + } + commit('SET_LOADING', false) + }, + async FetchStatusesPageByInstance({ commit, getters, rootState, state }) { + commit('SET_BUTTON_LOADING', true) + const statuses = state.statusesByInstance.selectedInstance === rootState.user.authHost + ? await fetchStatuses( + { + godmode: state.statusesByInstance.showPrivate, + localOnly: state.statusesByInstance.showLocal, + authHost: getters.authHost, + token: getters.token, + pageSize: state.statusesByInstance.pageSize, + page: state.statusesByInstance.page + }) : await fetchStatusesByInstance( { instance: state.statusesByInstance.selectedInstance, @@ -64,26 +114,29 @@ const status = { pageSize: state.statusesByInstance.pageSize, page: state.statusesByInstance.page }) - - commit('SET_STATUSES_BY_INSTANCE', statuses.data) - commit('SET_LOADING', false) - }, - async FetchStatusesPageByInstance({ commit, getters, state }) { - commit('SET_LOADING', true) - const statuses = await fetchStatusesByInstance( - { - instance: state.statusesByInstance.selectedInstance, - authHost: getters.authHost, - token: getters.token, - pageSize: state.statusesByInstance.pageSize, - page: state.statusesByInstance.page - }) - commit('PUSH_STATUSES', statuses.data) - commit('SET_LOADING', false) + commit('SET_BUTTON_LOADING', false) + if (statuses.data.length < state.statusesByInstance.pageSize) { + commit('SET_ALL_LOADED', true) + } + }, + HandleGodmodeCheckboxChange({ commit, dispatch }, value) { + dispatch('HandlePageChange', 1) + commit('SET_ALL_LOADED', false) + + commit('CHANGE_GODMODE_CHECKBOX_VALUE', value) + dispatch('FetchStatusesByInstance') + }, + HandleLocalCheckboxChange({ commit, dispatch }, value) { + dispatch('HandlePageChange', 1) + commit('SET_ALL_LOADED', false) + + commit('CHANGE_LOCAL_CHECKBOX_VALUE', value) + dispatch('FetchStatusesByInstance') }, HandleFilterChange({ commit }, instance) { commit('CHANGE_SELECTED_INSTANCE', instance) + commit('SET_ALL_LOADED', false) }, HandlePageChange({ commit }, page) { commit('CHANGE_PAGE', page) diff --git a/src/views/emojiPacks/components/NewEmojiUploader.vue b/src/views/emojiPacks/components/NewEmojiUploader.vue index 8bb431a2..f364b49e 100644 --- a/src/views/emojiPacks/components/NewEmojiUploader.vue +++ b/src/views/emojiPacks/components/NewEmojiUploader.vue @@ -44,6 +44,9 @@ export default { isDesktop() { return this.$store.state.app.device === 'desktop' }, + isMobile() { + return this.$store.state.app.device === 'mobile' + }, shortcodePresent() { return this.shortcode.trim() === '' } diff --git a/src/views/emojiPacks/components/SingleEmojiEditor.vue b/src/views/emojiPacks/components/SingleEmojiEditor.vue index d66bd48d..cd0eeb7f 100644 --- a/src/views/emojiPacks/components/SingleEmojiEditor.vue +++ b/src/views/emojiPacks/components/SingleEmojiEditor.vue @@ -95,6 +95,9 @@ export default { isDesktop() { return this.$store.state.app.device === 'desktop' }, + isMobile() { + return this.$store.state.app.device === 'mobile' + }, localPacks() { return this.$store.state.emojiPacks.localPacks }, diff --git a/src/views/invites/index.vue b/src/views/invites/index.vue index e8ca75fd..2497bfc0 100644 --- a/src/views/invites/index.vue +++ b/src/views/invites/index.vue @@ -85,7 +85,7 @@ sortable/> {{ scope.row.used ? $t('invites.used') : $t('invites.active') }} + disable-transitions> + {{ scope.row.used ? $t('invites.used') : $t('invites.active') }} +

{{ $t('moderationLog.moderationLog') }}

- - - - - - - - - - - - - - - - - +
+ + + + + + +
+
@@ -77,6 +71,9 @@ export default { } }, computed: { + isMobile() { + return this.$store.state.app.device === 'mobile' + }, loading() { return this.$store.state.moderationLog.logLoading && this.$store.state.moderationLog.adminsLoading @@ -139,7 +136,17 @@ h1 { margin: 25px 45px 0 0; padding: 0px; } -.user-select { +.moderation-log-date-panel { + width: 350px; +} +.moderation-log-nav-container { + display: flex; + justify-content: space-between; +} +.moderation-log-search { + width: 350px; +} +.moderation-log-user-select { margin: 0 0 20px; width: 350px; } @@ -149,4 +156,30 @@ h1 { .pagination { text-align: center; } + +@media only screen and (max-width:480px) { + .moderation-log-date-panel { + width: 100%; + } + .moderation-log-user-select { + margin: 0 0 10px; + width: 55%; + } + .moderation-log-search { + width: 40%; + } +} + +@media only screen and (max-width:801px) and (min-width: 481px) { + .moderation-log-date-panel { + width: 55%; + } + .moderation-log-user-select { + margin: 0 0 10px; + width: 55%; + } + .moderation-log-search { + width: 40%; + } +} diff --git a/src/views/reports/components/GroupedReport.vue b/src/views/reports/components/GroupedReport.vue deleted file mode 100644 index fe4aa6f3..00000000 --- a/src/views/reports/components/GroupedReport.vue +++ /dev/null @@ -1,159 +0,0 @@ - - - - - diff --git a/src/views/reports/components/NoteCard.vue b/src/views/reports/components/NoteCard.vue index fdc81d91..379e752b 100644 --- a/src/views/reports/components/NoteCard.vue +++ b/src/views/reports/components/NoteCard.vue @@ -97,9 +97,8 @@ export default { display: flex; justify-content: space-between; } - @media - only screen and (max-width: 760px), - (min-device-width: 768px) and (max-device-width: 1024px) { + + @media only screen and (max-width:480px) { .el-card__header { padding: 10px 17px; } diff --git a/src/views/reports/components/Report.vue b/src/views/reports/components/Report.vue index 9b963679..4df72383 100644 --- a/src/views/reports/components/Report.vue +++ b/src/views/reports/components/Report.vue @@ -74,7 +74,7 @@ v-model="notes[report.id]" :placeholder="$t('reports.leaveNote')" type="textarea" - rows="3"/> + rows="2"/>
{{ $t('reports.postNote') }}
@@ -180,6 +180,9 @@ export default { height: 15px; margin-left: 5px; } + .divider { + margin: 15px 0; + } .el-card__body { padding: 17px; } @@ -279,9 +282,8 @@ export default { font-style: italic; color: gray; } - @media - only screen and (max-width: 760px), - (min-device-width: 768px) and (max-device-width: 1024px) { + + @media only screen and (max-width:480px) { .report { .header-container { display: flex; @@ -303,5 +305,11 @@ export default { margin-bottom: 7px; } } + .reports-timeline { + margin: 20px 10px; + .el-timeline-item__wrapper { + padding-left: 20px; + } + } } diff --git a/src/views/reports/components/ReportCard.vue b/src/views/reports/components/ReportCard.vue index 6121bb52..430b58bb 100644 --- a/src/views/reports/components/ReportCard.vue +++ b/src/views/reports/components/ReportCard.vue @@ -108,9 +108,8 @@ export default { display: flex; justify-content: space-between; } - @media - only screen and (max-width: 760px), - (min-device-width: 768px) and (max-device-width: 1024px) { + + @media only screen and (max-width:480px) { .el-card__header { padding: 10px 17px; } diff --git a/src/views/reports/components/ReportsFilter.vue b/src/views/reports/components/ReportsFilter.vue index da1fd782..29e15075 100644 --- a/src/views/reports/components/ReportsFilter.vue +++ b/src/views/reports/components/ReportsFilter.vue @@ -54,12 +54,17 @@ export default { .select-field { width: 350px; } -@media -only screen and (max-width: 760px), -(min-device-width: 768px) and (max-device-width: 1024px) { + +@media only screen and (max-width:480px) { .select-field { width: 100%; margin-bottom: 5px; } } + +@media only screen and (max-width:801px) and (min-width: 481px) { + .select-field { + width: 50%; + } +} diff --git a/src/views/reports/index.vue b/src/views/reports/index.vue index 3e67d90e..64993da3 100644 --- a/src/views/reports/index.vue +++ b/src/views/reports/index.vue @@ -1,22 +1,14 @@ @@ -77,9 +49,6 @@ export default { margin: 22px 15px 22px 15px; padding-bottom: 0 } - .group-reports-checkbox { - margin-top: 10px; - } h1 { margin: 22px 0 0 15px; } @@ -92,9 +61,8 @@ export default { font-size: 28px; } } -@media -only screen and (max-width: 760px), -(min-device-width: 768px) and (max-device-width: 1024px) { + +@media only screen and (max-width:480px) { .reports-container { h1 { margin: 7px 10px 15px 10px; @@ -103,8 +71,5 @@ only screen and (max-width: 760px), margin: 0 10px; } } - #app > div > div.main-container > section > div > div.block > ul { - margin: 45px 45px 5px 19px; - } } diff --git a/src/views/settings/components/Frontend.vue b/src/views/settings/components/Frontend.vue index 48493e01..188a74ca 100644 --- a/src/views/settings/components/Frontend.vue +++ b/src/views/settings/components/Frontend.vue @@ -3,6 +3,10 @@ + + + + {{ $t('settings.assets') }} @@ -70,12 +74,6 @@ export default { frontendData() { return _.get(this.settings.settings, [':pleroma', ':frontend_configurations']) || {} }, - markup() { - return this.settings.description.find(setting => setting.key === ':markup') - }, - markupData() { - return _.get(this.settings.settings, [':pleroma', ':markup']) || {} - }, isMobile() { return this.$store.state.app.device === 'mobile' }, @@ -93,6 +91,18 @@ export default { }, loading() { return this.settings.loading + }, + markup() { + return this.settings.description.find(setting => setting.key === ':markup') + }, + markupData() { + return _.get(this.settings.settings, [':pleroma', ':markup']) || {} + }, + staticFe() { + return this.settings.description.find(setting => setting.key === ':static_fe') + }, + staticFeData() { + return _.get(this.settings.settings, [':pleroma', ':static_fe']) || {} } }, methods: { diff --git a/src/views/settings/components/Http.vue b/src/views/settings/components/Http.vue index a12a1efa..a94000b2 100644 --- a/src/views/settings/components/Http.vue +++ b/src/views/settings/components/Http.vue @@ -3,10 +3,6 @@ - - - - {{ $t('settings.corsPlug') }} @@ -86,12 +82,6 @@ export default { loading() { return this.settings.loading }, - teslaAdapter() { - return this.settings.description.find(setting => setting.group === ':tesla') - }, - teslaAdapterData() { - return _.get(this.settings.settings, [':tesla']) || {} - }, webCacheTtl() { return this.settings.description.find(setting => setting.key === ':web_cache_ttl') }, diff --git a/src/views/settings/components/Inputs.vue b/src/views/settings/components/Inputs.vue index 6b8aa62f..615aa126 100644 --- a/src/views/settings/components/Inputs.vue +++ b/src/views/settings/components/Inputs.vue @@ -95,11 +95,12 @@ - + - + + @@ -117,7 +118,7 @@ + + diff --git a/src/views/settings/components/inputComponents/EditableKeywordInput.vue b/src/views/settings/components/inputComponents/EditableKeywordInput.vue index a464a890..ec8aa079 100644 --- a/src/views/settings/components/inputComponents/EditableKeywordInput.vue +++ b/src/views/settings/components/inputComponents/EditableKeywordInput.vue @@ -96,15 +96,18 @@ export default { this.updateSetting(updatedValue, this.settingGroup.group, this.settingGroup.key, this.setting.key, this.setting.type) }, updateSetting(value, group, key, input, type) { - const updatedSettings = type !== 'map' - ? value.reduce((acc, element) => { - return { ...acc, [Object.keys(element)[0]]: ['list', Object.values(element)[0].value] } - }, {}) - : value.reduce((acc, element) => { - return { ...acc, [Object.keys(element)[0]]: Object.values(element)[0].value } - }, {}) + const updatedSettings = this.wrapUpdatedSettings(value, input, type) this.$store.dispatch('UpdateSettings', { group, key, input, value: updatedSettings, type }) this.$store.dispatch('UpdateState', { group, key, input, value }) + }, + wrapUpdatedSettings(value, input, type) { + return type === 'map' + ? value.reduce((acc, element) => { + return { ...acc, [Object.keys(element)[0]]: Object.values(element)[0].value } + }, {}) + : value.reduce((acc, element) => { + return { ...acc, [Object.keys(element)[0]]: ['list', Object.values(element)[0].value] } + }, {}) } } } diff --git a/src/views/settings/components/inputComponents/index.js b/src/views/settings/components/inputComponents/index.js index 389b304e..788d1f99 100644 --- a/src/views/settings/components/inputComponents/index.js +++ b/src/views/settings/components/inputComponents/index.js @@ -1,5 +1,6 @@ export { default as AutoLinkerInput } from './AutoLinkerInput' export { default as EditableKeywordInput } from './EditableKeywordInput' +export { default as CrontabInput } from './CrontabInput' export { default as IconsInput } from './IconsInput' export { default as MascotsInput } from './MascotsInput' export { default as MultipleSelect } from './MultipleSelect' diff --git a/src/views/settings/styles/main.scss b/src/views/settings/styles/main.scss index cc90ba7a..4fbdb5ca 100644 --- a/src/views/settings/styles/main.scss +++ b/src/views/settings/styles/main.scss @@ -339,6 +339,12 @@ } @media only screen and (max-width:480px) { + .crontab { + width: 100%; + label { + width: 100%; + } + } .delete-setting-button { margin: 4px 0 0 5px; height: 28px; @@ -382,6 +388,10 @@ margin: 0; padding: 0 15px 10px 0; } + .el-form-item.crontab-container:first-child { + margin: 0; + padding: 0 ; + } .el-form-item:first-child .mascot-form-item { padding: 0; } diff --git a/src/views/statuses/index.vue b/src/views/statuses/index.vue index 828526c8..74e3f55b 100644 --- a/src/views/statuses/index.vue +++ b/src/views/statuses/index.vue @@ -22,6 +22,15 @@ :selected-users="selectedUsers" @apply-action="clearSelection"/> +
+ + {{ $t('statuses.onlyLocalStatuses') }} + + + {{ $t('statuses.showPrivateStatuses') }} + +
+

{{ $t('userProfile.noStatuses') }}

- {{ $t('statuses.loadMore') }} + {{ $t('statuses.loadMore') }} +