logo

pleroma-fe

My custom branche(s) on git.pleroma.social/pleroma/pleroma-fe git clone https://hacktivis.me/git/pleroma-fe.git
commit: c7a16bdfe2cebe51c232ae3fe3101d35c4f877a2
parent 6992439c92c247bf5b48155a76ff4e39a57b0ec7
Author: Henry Jameson <me@hjkos.com>
Date:   Wed, 22 Mar 2023 12:43:53 +0200

grouped settings/managed drafts support added

Diffstat:

Msrc/components/settings_modal/admin_tabs/instance_tab.js4+++-
Msrc/components/settings_modal/admin_tabs/instance_tab.vue15+++++++++++++++
Asrc/components/settings_modal/helpers/group_setting.js14++++++++++++++
Asrc/components/settings_modal/helpers/group_setting.vue15+++++++++++++++
Msrc/components/settings_modal/helpers/setting.js32++++++++++++++++++++++++++++----
Msrc/modules/adminSettings.js24+++++++++++++++++++++---
6 files changed, 96 insertions(+), 8 deletions(-)

diff --git a/src/components/settings_modal/admin_tabs/instance_tab.js b/src/components/settings_modal/admin_tabs/instance_tab.js @@ -2,6 +2,7 @@ import BooleanSetting from '../helpers/boolean_setting.vue' import ChoiceSetting from '../helpers/choice_setting.vue' import IntegerSetting from '../helpers/integer_setting.vue' import StringSetting from '../helpers/string_setting.vue' +import GroupSetting from '../helpers/group_setting.vue' import SharedComputedObject from '../helpers/shared_computed_object.js' import { library } from '@fortawesome/fontawesome-svg-core' @@ -24,7 +25,8 @@ const InstanceTab = { BooleanSetting, ChoiceSetting, IntegerSetting, - StringSetting + StringSetting, + GroupSetting }, computed: { ...SharedComputedObject() diff --git a/src/components/settings_modal/admin_tabs/instance_tab.vue b/src/components/settings_modal/admin_tabs/instance_tab.vue @@ -71,6 +71,11 @@ </BooleanSetting> </li> <li> + <GroupSetting path=":pleroma.:restrict_unauthenticated.:timelines"> + TIMELINES + </GroupSetting> + </li> + <li> <h4>{{ $t('admin_dash.instance.restrict.profiles') }}</h4> </li> <li> @@ -90,6 +95,11 @@ </BooleanSetting> </li> <li> + <GroupSetting path=":pleroma.:restrict_unauthenticated.:profiles"> + PROFILES + </GroupSetting> + </li> + <li> <h4>{{ $t('admin_dash.instance.restrict.activities') }}</h4> </li> <li> @@ -108,6 +118,11 @@ FED STATUSES </BooleanSetting> </li> + <li> + <GroupSetting path=":pleroma.:restrict_unauthenticated.:activities"> + STATUSES + </GroupSetting> + </li> </ul> </div> <div class="setting-item"> diff --git a/src/components/settings_modal/helpers/group_setting.js b/src/components/settings_modal/helpers/group_setting.js @@ -0,0 +1,14 @@ +import { isEqual } from 'lodash' + +import Setting from './setting.js' + +export default { + ...Setting, + computed: { + ...Setting.computed, + isDirty () { + console.log(this.state, this.draft) + return !isEqual(this.state, this.draft) + } + } +} diff --git a/src/components/settings_modal/helpers/group_setting.vue b/src/components/settings_modal/helpers/group_setting.vue @@ -0,0 +1,15 @@ +<template> + <span + v-if="matchesExpertLevel" + class="GroupSetting" + > + <ModifiedIndicator + :changed="isChanged" + :onclick="reset" + /> + <ProfileSettingIndicator :is-profile="isProfileSetting" /> + <DraftButtons /> + </span> +</template> + +<script src="./group_setting.js"></script> diff --git a/src/components/settings_modal/helpers/setting.js b/src/components/settings_modal/helpers/setting.js @@ -48,15 +48,32 @@ export default { }, data () { return { - draft: null + localDraft: null } }, created () { - if (this.realDraftMode) { + if (this.realDraftMode && this.realSource !== 'admin') { this.draft = this.state } }, computed: { + draft: { + // TODO allow passing shared draft object? + get () { + if (this.realSource === 'admin') { + return get(this.$store.state.adminSettings.draft, this.path) + } else { + return this.localDraft + } + }, + set (value) { + if (this.realSource === 'admin') { + this.$store.commit('updateAdminDraft', { path: this.canonPath, value }) + } else { + this.localDraft = value + } + } + }, state () { const value = get(this.configSource, this.path) if (value === undefined) { @@ -130,11 +147,18 @@ export default { return this.state !== this.defaultState } }, + canonPath () { + return Array.isArray(this.path) ? this.path : this.path.split('.') + }, isDirty () { - return this.realDraftMode && this.draft !== this.state + if (this.realSource === 'admin' && this.canonPath.length > 3) { + return false // should not show draft buttons for "grouped" values + } else { + return this.realDraftMode && this.draft !== this.state + } }, canHardReset () { - return this.realSource === 'admin' && this.$store.state.adminSettings.modifiedPaths.has(this.path) + return this.realSource === 'admin' && this.$store.state.adminSettings.modifiedPaths.has(this.canonPath.join(' -> ')) }, matchesExpertLevel () { return (this.expert || 0) <= this.$store.state.config.expertLevel > 0 diff --git a/src/modules/adminSettings.js b/src/modules/adminSettings.js @@ -1,10 +1,11 @@ -import { set, cloneDeep } from 'lodash' +import { set, get, cloneDeep } from 'lodash' export const defaultState = { needsReboot: null, config: null, modifiedPaths: null, - descriptions: null + descriptions: null, + draft: null } export const newUserFlags = { @@ -22,6 +23,20 @@ const adminSettingsStorage = { }, updateAdminDescriptions (state, { descriptions }) { state.descriptions = descriptions + }, + updateAdminDraft (state, { path, value }) { + const [group, key, subkey] = path + const parent = [group, key, subkey] + + set(state.draft, path, value) + + // force-updating grouped draft to trigger refresh of group settings + if (path.length > parent.length) { + set(state.draft, parent, cloneDeep(get(state.draft, parent))) + } + }, + resetAdminDraft (state) { + state.draft = cloneDeep(state.config) } }, actions: { @@ -31,7 +46,9 @@ const adminSettingsStorage = { backendDbConfig.configs.forEach(c => { const path = [c.group, c.key] if (c.db) { - c.db.forEach(x => modifiedPaths.add(path + '.' + x)) + // Path elements can contain dot, therefore we use ' -> ' as a separator instead + // Using strings for modified paths for easier searching + c.db.forEach(x => modifiedPaths.add([...path, x].join(' -> '))) } const convert = (value) => { if (Array.isArray(value) && value.length > 0 && value[0].tuple) { @@ -46,6 +63,7 @@ const adminSettingsStorage = { }) console.log(config[':pleroma']) commit('updateAdminSettings', { config, modifiedPaths }) + commit('resetAdminDraft') }, setInstanceAdminDescriptions ({ state, commit, dispatch }, { backendDescriptions }) { const convert = ({ children, description, label, key = '<ROOT>', group, suggestions }, path, acc) => {