diff --git a/CHANGELOG.md b/CHANGELOG.md index ded5c6e4d..20c9c2693 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). +## 2.9.3 +### Fixed +- Being unable to update profile + ## 2.9.2 ### Changed - BREAKING: due to some internal technical changes logging into AdminFE through PleromaFE is no longer possible diff --git a/changelog.d/broken.fix b/changelog.d/broken.fix new file mode 100644 index 000000000..7e58091b4 --- /dev/null +++ b/changelog.d/broken.fix @@ -0,0 +1,2 @@ +Fix display of the broken/deleted/banned users + diff --git a/changelog.d/everything-instance-default.add b/changelog.d/everything-instance-default.add new file mode 100644 index 000000000..6c4475905 --- /dev/null +++ b/changelog.d/everything-instance-default.add @@ -0,0 +1 @@ +Make every configuration option default-overridable by instance admins diff --git a/package.json b/package.json index edc122760..21d75f0fb 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "pleroma_fe", - "version": "2.9.2", + "version": "2.9.3", "description": "Pleroma frontend, the default frontend of Pleroma social network server", "author": "Pleroma contributors ", "private": false, @@ -17,12 +17,12 @@ "lint-fix": "eslint --fix src test/unit/specs test/e2e/specs" }, "dependencies": { - "@babel/runtime": "7.28.3", + "@babel/runtime": "7.28.4", "@chenfengyuan/vue-qrcode": "2.0.0", - "@fortawesome/fontawesome-svg-core": "6.7.2", - "@fortawesome/free-regular-svg-icons": "6.7.2", - "@fortawesome/free-solid-svg-icons": "6.7.2", - "@fortawesome/vue-fontawesome": "3.1.1", + "@fortawesome/fontawesome-svg-core": "7.1.0", + "@fortawesome/free-regular-svg-icons": "7.1.0", + "@fortawesome/free-solid-svg-icons": "7.1.0", + "@fortawesome/vue-fontawesome": "3.1.2", "@kazvmoe-infra/pinch-zoom-element": "1.3.0", "@kazvmoe-infra/unicode-emoji-json": "0.4.0", "@ruffle-rs/ruffle": "0.1.0-nightly.2025.6.22", @@ -39,7 +39,7 @@ "js-cookie": "3.0.5", "localforage": "1.10.0", "parse-link-header": "2.0.0", - "phoenix": "1.8.0", + "phoenix": "1.8.1", "pinia": "^3.0.0", "punycode.js": "2.3.1", "qrcode": "1.5.4", @@ -47,15 +47,15 @@ "url": "0.11.4", "utf8": "3.0.0", "uuid": "11.1.0", - "vue": "3.5.19", + "vue": "3.5.22", "vue-i18n": "11", "vue-router": "4.5.1", "vue-virtual-scroller": "^2.0.0-beta.7", "vuex": "4.1.0" }, "devDependencies": { - "@babel/core": "7.28.3", - "@babel/eslint-parser": "7.28.0", + "@babel/core": "7.28.4", + "@babel/eslint-parser": "7.28.4", "@babel/plugin-transform-runtime": "7.28.3", "@babel/preset-env": "7.28.3", "@babel/register": "7.28.3", @@ -66,24 +66,24 @@ "@vitest/ui": "^3.0.7", "@vue/babel-helper-vue-jsx-merge-props": "1.4.0", "@vue/babel-plugin-jsx": "1.5.0", - "@vue/compiler-sfc": "3.5.19", + "@vue/compiler-sfc": "3.5.22", "@vue/test-utils": "2.4.6", "autoprefixer": "10.4.21", "babel-plugin-lodash": "3.3.4", - "chai": "5.3.2", - "chalk": "5.6.0", + "chai": "5.3.3", + "chalk": "5.6.2", "chromedriver": "135.0.4", "connect-history-api-fallback": "2.0.0", "cross-spawn": "7.0.6", "custom-event-polyfill": "1.0.7", - "eslint": "9.33.0", + "eslint": "9.37.0", "vue-eslint-parser": "10.2.0", "eslint-config-standard": "17.1.0", "eslint-formatter-friendly": "7.0.0", "eslint-plugin-import": "2.32.0", - "eslint-plugin-n": "17.21.3", + "eslint-plugin-n": "17.23.1", "eslint-plugin-promise": "7.2.1", - "eslint-plugin-vue": "10.4.0", + "eslint-plugin-vue": "10.5.0", "eventsource-polyfill": "0.9.6", "express": "5.1.0", "function-bind": "1.1.2", @@ -96,14 +96,14 @@ "postcss": "8.5.6", "postcss-html": "^1.5.0", "postcss-scss": "^4.0.6", - "sass": "1.89.2", + "sass": "1.93.2", "selenium-server": "3.141.59", - "semver": "7.7.2", + "semver": "7.7.3", "serve-static": "2.2.0", "shelljs": "0.10.0", "sinon": "20.0.0", - "sinon-chai": "4.0.0", - "stylelint": "16.19.1", + "sinon-chai": "4.0.1", + "stylelint": "16.25.0", "stylelint-config-html": "^1.1.0", "stylelint-config-recommended": "^16.0.0", "stylelint-config-recommended-scss": "^14.0.0", diff --git a/src/boot/after_store.js b/src/boot/after_store.js index fd4c57229..ad994af6a 100644 --- a/src/boot/after_store.js +++ b/src/boot/after_store.js @@ -24,6 +24,7 @@ import { useI18nStore } from 'src/stores/i18n' import { useInterfaceStore } from 'src/stores/interface' import { useAnnouncementsStore } from 'src/stores/announcements' import { useAuthFlowStore } from 'src/stores/auth_flow' +import { staticOrApiConfigDefault, instanceDefaultConfig } from 'src/modules/default_config_state.js' let staticInitialResults = null @@ -130,50 +131,15 @@ const setSettings = async ({ apiConfig, staticConfig, store }) => { } const copyInstanceOption = (name) => { - store.dispatch('setInstanceOption', { name, value: config[name] }) + if (typeof config[name] !== 'undefined') { + store.dispatch('setInstanceOption', { name, value: config[name] }) + } } - copyInstanceOption('theme') - copyInstanceOption('style') - copyInstanceOption('palette') - copyInstanceOption('embeddedToS') - copyInstanceOption('nsfwCensorImage') - copyInstanceOption('background') - copyInstanceOption('hidePostStats') - copyInstanceOption('hideBotIndication') - copyInstanceOption('hideUserStats') - copyInstanceOption('hideFilteredStatuses') - copyInstanceOption('logo') + Object.keys(staticOrApiConfigDefault).forEach(copyInstanceOption) + Object.keys(instanceDefaultConfig).forEach(copyInstanceOption) - store.dispatch('setInstanceOption', { - name: 'logoMask', - value: typeof config.logoMask === 'undefined' - ? true - : config.logoMask - }) - - store.dispatch('setInstanceOption', { - name: 'logoMargin', - value: typeof config.logoMargin === 'undefined' - ? 0 - : config.logoMargin - }) - copyInstanceOption('logoLeft') useAuthFlowStore().setInitialStrategy(config.loginMethod) - - copyInstanceOption('redirectRootNoLogin') - copyInstanceOption('redirectRootLogin') - copyInstanceOption('showInstanceSpecificPanel') - copyInstanceOption('minimalScopesMode') - copyInstanceOption('hideMutedPosts') - copyInstanceOption('collapseMessageWithSubject') - copyInstanceOption('scopeCopy') - copyInstanceOption('subjectLineBehavior') - copyInstanceOption('postContentType') - copyInstanceOption('alwaysShowSubjectInput') - copyInstanceOption('showFeaturesPanel') - copyInstanceOption('hideSitename') - copyInstanceOption('sidebarRight') } const getTOS = async ({ store }) => { diff --git a/src/components/exporter/exporter.vue b/src/components/exporter/exporter.vue index 79defdf6f..e36d9dd62 100644 --- a/src/components/exporter/exporter.vue +++ b/src/components/exporter/exporter.vue @@ -23,6 +23,9 @@ diff --git a/src/components/settings_modal/settings_modal.scss b/src/components/settings_modal/settings_modal.scss index 2c975917f..a1e3ec412 100644 --- a/src/components/settings_modal/settings_modal.scss +++ b/src/components/settings_modal/settings_modal.scss @@ -1,21 +1,48 @@ .settings-modal { overflow: hidden; - h4 { + h2 { + font-size: 1.3rem; + font-weight: 500; + margin-top: 1em; + margin-bottom: 1em; + } + + h3 { + font-size: 1.2rem; + font-weight: 500; + margin-top: 1em; margin-bottom: 0.5em; + border-bottom: 1px solid var(--border); + padding-bottom: 0.25em; + box-sizing: border-box; + padding-left: 0.5em; + } + + h4 { + font-size: 1.1rem; + margin-top: 1em; + margin-bottom: 0.5em; + } + + h5 { + font-size: 1rem; + margin-bottom: 0.5em; + margin-top: 0; } .setting-list, .option-list { list-style-type: none; padding-left: 2em; + margin: 0; .btn:not(.dropdown-button) { padding: 0 2em; } li { - margin-bottom: 0.5em; + margin: 1em 0; } .suboptions { @@ -42,7 +69,7 @@ transition: transform; transition-timing-function: ease-in-out; transition-duration: 300ms; - width: 1000px; + width: 70em; max-width: 90vw; height: 90vh; @@ -77,6 +104,12 @@ } &.-mobile { + .tabs { + .menu-item { + font-size: 1.2em + } + } + .setting-list, .option-list { padding-left: 0.25em; diff --git a/src/components/settings_modal/settings_modal_admin_content.js b/src/components/settings_modal/settings_modal_admin_content.js index 593318ec4..fa6b7f8ad 100644 --- a/src/components/settings_modal/settings_modal_admin_content.js +++ b/src/components/settings_modal/settings_modal_admin_content.js @@ -1,4 +1,4 @@ -import TabSwitcher from 'src/components/tab_switcher/tab_switcher.jsx' +import VerticalTabSwitcher from 'src/components/tab_switcher/vertical_tab_switcher.jsx' import InstanceTab from './admin_tabs/instance_tab.vue' import LimitsTab from './admin_tabs/limits_tab.vue' @@ -31,7 +31,7 @@ library.add( const SettingsModalAdminContent = { components: { - TabSwitcher, + VerticalTabSwitcher, InstanceTab, LimitsTab, diff --git a/src/components/settings_modal/settings_modal_admin_content.vue b/src/components/settings_modal/settings_modal_admin_content.vue index 39ef74f64..501a3acf6 100644 --- a/src/components/settings_modal/settings_modal_admin_content.vue +++ b/src/components/settings_modal/settings_modal_admin_content.vue @@ -1,5 +1,5 @@ diff --git a/src/components/settings_modal/settings_modal_user_content.js b/src/components/settings_modal/settings_modal_user_content.js index c46b477d8..18e1148dc 100644 --- a/src/components/settings_modal/settings_modal_user_content.js +++ b/src/components/settings_modal/settings_modal_user_content.js @@ -1,4 +1,4 @@ -import TabSwitcher from 'src/components/tab_switcher/tab_switcher.jsx' +import VerticalTabSwitcher from 'src/components/tab_switcher/vertical_tab_switcher.jsx' import DataImportExportTab from './tabs/data_import_export_tab.vue' import MutesAndBlocksTab from './tabs/mutes_and_blocks_tab.vue' @@ -7,15 +7,20 @@ import FilteringTab from './tabs/filtering_tab.vue' import SecurityTab from './tabs/security_tab/security_tab.vue' import ProfileTab from './tabs/profile_tab.vue' import GeneralTab from './tabs/general_tab.vue' +import PostsTab from './tabs/posts_tab.vue' +import ComposingTab from './tabs/composing_tab.vue' +import ClutterTab from './tabs/clutter_tab.vue' +import LayoutTab from './tabs/layout_tab.vue' import AppearanceTab from './tabs/appearance_tab.vue' -import VersionTab from './tabs/version_tab.vue' -import ThemeTab from './tabs/theme_tab/theme_tab.vue' +import DeveloperTab from './tabs/developer_tab.vue' +import OldThemeTab from './tabs/old_theme_tab/old_theme_tab.vue' import StyleTab from './tabs/style_tab/style_tab.vue' import { library } from '@fortawesome/fontawesome-svg-core' import { faWrench, faUser, + faMessage, faFilter, faPaintBrush, faPalette, @@ -23,13 +28,16 @@ import { faDownload, faEyeSlash, faInfo, - faWindowRestore + faWindowRestore, + faCode, + faBroom } from '@fortawesome/free-solid-svg-icons' import { useInterfaceStore } from 'src/stores/interface' library.add( faWrench, faUser, + faMessage, faFilter, faPaintBrush, faPalette, @@ -37,12 +45,14 @@ library.add( faDownload, faEyeSlash, faInfo, - faWindowRestore + faWindowRestore, + faBroom, + faCode ) const SettingsModalContent = { components: { - TabSwitcher, + VerticalTabSwitcher, DataImportExportTab, MutesAndBlocksTab, @@ -51,10 +61,14 @@ const SettingsModalContent = { SecurityTab, ProfileTab, GeneralTab, + PostsTab, + ComposingTab, + ClutterTab, + LayoutTab, AppearanceTab, StyleTab, - VersionTab, - ThemeTab + DeveloperTab, + OldThemeTab }, computed: { isLoggedIn () { @@ -68,9 +82,12 @@ const SettingsModalContent = { }, expertLevel () { return this.$store.state.config.expertLevel - }, - isMobileLayout () { - return useInterfaceStore().layoutType === 'mobile' + } + }, + data () { + return { + navCollapsed: false, + navHideHeader: false } }, methods: { diff --git a/src/components/settings_modal/settings_modal_user_content.scss b/src/components/settings_modal/settings_modal_user_content.scss index 25e9bda3a..5deca7868 100644 --- a/src/components/settings_modal/settings_modal_user_content.scss +++ b/src/components/settings_modal/settings_modal_user_content.scss @@ -1,21 +1,6 @@ .settings_tab-switcher { height: 100%; - h1 { - margin-bottom: 0.5em; - margin-top: 0.5em; - } - - h4 { - margin-bottom: 0; - margin-top: 0.25em; - } - - h5 { - margin-bottom: 0; - margin-top: 0.25em; - } - .setting-item { border-bottom: 2px solid var(--border); margin: 1em 1em 1.4em; diff --git a/src/components/settings_modal/settings_modal_user_content.vue b/src/components/settings_modal/settings_modal_user_content.vue index f9a1e99bc..6709b6e02 100644 --- a/src/components/settings_modal/settings_modal_user_content.vue +++ b/src/components/settings_modal/settings_modal_user_content.vue @@ -1,10 +1,11 @@ diff --git a/src/components/settings_modal/tabs/appearance_tab.js b/src/components/settings_modal/tabs/appearance_tab.js index 7fbb0a5cd..3bb5ec508 100644 --- a/src/components/settings_modal/tabs/appearance_tab.js +++ b/src/components/settings_modal/tabs/appearance_tab.js @@ -1,12 +1,12 @@ +import VerticalTabSwitcher from 'src/components/tab_switcher/vertical_tab_switcher.jsx' + import BooleanSetting from '../helpers/boolean_setting.vue' import ChoiceSetting from '../helpers/choice_setting.vue' import IntegerSetting from '../helpers/integer_setting.vue' import FloatSetting from '../helpers/float_setting.vue' import UnitSetting from '../helpers/unit_setting.vue' -import { defaultHorizontalUnits } from '../helpers/unit_setting.js' import PaletteEditor from 'src/components/palette_editor/palette_editor.vue' -import Preview from './theme_tab/theme_preview.vue' -import FontControl from 'src/components/font_control/font_control.vue' +import Preview from './old_theme_tab/theme_preview.vue' import { newImporter } from 'src/services/export_import/export_import.js' import { convertTheme2To3 } from 'src/services/theme_data/theme2_to_theme3.js' @@ -26,11 +26,17 @@ import { useInterfaceStore, normalizeThemeData } from 'src/stores/interface' import { library } from '@fortawesome/fontawesome-svg-core' import { - faGlobe + faGlobe, + faDashboard, + faPaintRoller, + faTableColumns } from '@fortawesome/free-solid-svg-icons' library.add( - faGlobe + faGlobe, + faPaintRoller, + faDashboard, + faTableColumns ) const AppearanceTab = { @@ -59,11 +65,6 @@ const AppearanceTab = { ], userPalette: {}, intersectionObserver: null, - thirdColumnModeOptions: ['none', 'notifications', 'postform'].map(mode => ({ - key: mode, - value: mode, - label: this.$t(`settings.third_column_mode_${mode}`) - })), forcedRoundnessOptions: ['disabled', 'sharp', 'nonsharp', 'round'].map((mode, i) => ({ key: mode, value: i - 1, @@ -86,9 +87,9 @@ const AppearanceTab = { FloatSetting, UnitSetting, ProfileSettingIndicator, - FontControl, Preview, - PaletteEditor + PaletteEditor, + VerticalTabSwitcher }, mounted () { useInterfaceStore().getThemeData() @@ -253,33 +254,10 @@ const AppearanceTab = { noIntersectionObserver () { return !window.IntersectionObserver }, - horizontalUnits () { - return defaultHorizontalUnits - }, - fontsOverride () { - return this.$store.getters.mergedConfig.fontsOverride - }, - columns () { - const mode = this.$store.getters.mergedConfig.thirdColumnMode - - const notif = mode === 'none' ? [] : ['notifs'] - - if (this.$store.getters.mergedConfig.sidebarRight || mode === 'postform') { - return [...notif, 'content', 'sidebar'] - } else { - return ['sidebar', 'content', ...notif] - } - }, instanceWallpaperUsed () { return this.$store.state.instance.background && !this.$store.state.users.currentUser.background_image }, - language: { - get: function () { return this.$store.getters.mergedConfig.interfaceLanguage }, - set: function (val) { - this.$store.dispatch('setOption', { name: 'interfaceLanguage', value: val }) - } - }, customThemeVersion () { const { themeVersion } = useInterfaceStore() return themeVersion @@ -295,18 +273,6 @@ const AppearanceTab = { ...SharedComputedObject() }, methods: { - updateFont (key, value) { - this.$store.dispatch('setOption', { - name: 'theme3hacks', - value: { - ...this.mergedConfig.theme3hacks, - fonts: { - ...this.mergedConfig.theme3hacks.fonts, - [key]: value - } - } - }) - }, importFile () { this.fileImporter.importData() }, diff --git a/src/components/settings_modal/tabs/appearance_tab.scss b/src/components/settings_modal/tabs/appearance_tab.scss index d786cfa38..58ec1e8aa 100644 --- a/src/components/settings_modal/tabs/appearance_tab.scss +++ b/src/components/settings_modal/tabs/appearance_tab.scss @@ -1,28 +1,19 @@ .appearance-tab { + h3 { + border: none + } + .palette, .theme-notice { padding: 0.5em; margin: 1em; } - .setting-item { - padding-bottom: 0; - - &.heading { - display: grid; - align-items: baseline; - grid-template-columns: 1fr auto auto auto; - grid-gap: 0.5em; - - h2 { - flex: 1 0 auto; - } - } + .theme-name { + font-weight: 900; + padding-bottom: 0.5em; } - h4 { - margin: 0.5em 0; - } input[type="file"] { padding: 0.25em; @@ -71,6 +62,7 @@ border-radius: var(--roundness); border: 1px solid var(--border); margin: -0.5em; + margin-top: 0; } .palettes { @@ -80,9 +72,9 @@ padding: 0.5em; width: 100%; - h4 { - margin: 0; + h5 { grid-column: 1 / span 2; + margin-bottom: 0; } } @@ -160,7 +152,7 @@ .theme-preview { font-size: 1rem; // fix for firefox - width: 19rem; + width: 14rem; display: flex; flex-direction: column; align-items: center; diff --git a/src/components/settings_modal/tabs/appearance_tab.vue b/src/components/settings_modal/tabs/appearance_tab.vue index cd54e2c82..868fb8bfa 100644 --- a/src/components/settings_modal/tabs/appearance_tab.vue +++ b/src/components/settings_modal/tabs/appearance_tab.vue @@ -1,10 +1,15 @@