Merge branch 'feature/hide-proxy-remote' into 'develop'

Ability to set rules and conditions for rendering settings

See merge request pleroma/admin-fe!190
This commit is contained in:
Angelina Filippova 2021-03-11 20:06:27 +00:00
commit 87e1ee4e21
4 changed files with 73 additions and 1 deletions

View file

@ -15,7 +15,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
- Filter users by actor type: Person, Bot or Application - Filter users by actor type: Person, Bot or Application
- Add ability to configure Media Preview Proxy, User Backup, Websocket based federation and Pleroma.Web.Endpoint.MetricsExporter settings - Add ability to configure Media Preview Proxy, User Backup, Websocket based federation and Pleroma.Web.Endpoint.MetricsExporter settings
- Mobile and Tablet UI for Single Report show page - Mobile and Tablet UI for Single Report show page
- Ability to set rules and conditions for rendering settings (e.g. `:proxy_remote` setting is hidden if `:uploader` setting is set to `Pleroma.Uploaders.Local`)
### Changed ### Changed
- **Breaking**: AdminAPI changed User field `confirmation_pending` to `is_confirmed` - **Breaking**: AdminAPI changed User field `confirmation_pending` to `is_confirmed`

View file

@ -7,6 +7,7 @@
<div v-if="settingGroup.key === 'Pleroma.Emails.Mailer'"> <div v-if="settingGroup.key === 'Pleroma.Emails.Mailer'">
<div v-for="setting in settingGroup.children.filter(setting => !setting.group)" :key="setting.key"> <div v-for="setting in settingGroup.children.filter(setting => !setting.group)" :key="setting.key">
<inputs <inputs
v-if="followsRules(setting.key, settingGroup.key, state)"
:setting-group="settingGroup" :setting-group="settingGroup"
:setting="setting" :setting="setting"
:data="data"/> :data="data"/>
@ -15,6 +16,7 @@
v-for="setting in emailAdapterChildren" v-for="setting in emailAdapterChildren"
:key="setting.key"> :key="setting.key">
<inputs <inputs
v-if="followsRules(setting.key, settingGroup.key, state)"
:setting-group="settingGroup" :setting-group="settingGroup"
:setting="setting" :setting="setting"
:data="data"/> :data="data"/>
@ -24,6 +26,7 @@
<div v-for="setting in settingGroup.children" :key="setting.key"> <div v-for="setting in settingGroup.children" :key="setting.key">
<div v-if="!compound(setting)"> <div v-if="!compound(setting)">
<inputs <inputs
v-if="followsRules(setting.key, settingGroup.key, state)"
:setting-group="settingGroup" :setting-group="settingGroup"
:setting="setting" :setting="setting"
:data="data" :data="data"
@ -33,6 +36,7 @@
<el-divider v-if="divideSetting(setting.key)" class="divider"/> <el-divider v-if="divideSetting(setting.key)" class="divider"/>
<div v-if="!setting.children"> <div v-if="!setting.children">
<inputs <inputs
v-if="followsRules(setting.key, settingGroup.key, state)"
:setting-group="settingGroup" :setting-group="settingGroup"
:setting="setting" :setting="setting"
:data="data[setting.key]" :data="data[setting.key]"
@ -73,6 +77,7 @@ import Inputs from './Inputs'
import i18n from '@/lang' import i18n from '@/lang'
import _ from 'lodash' import _ from 'lodash'
import marked from 'marked' import marked from 'marked'
import { settingFollowsRules } from '../rules'
export default { export default {
name: 'Setting', name: 'Setting',
@ -109,6 +114,9 @@ export default {
}, },
loading() { loading() {
return this.$store.state.settings.loading return this.$store.state.settings.loading
},
state() {
return this.$store.state.settings.settings
} }
}, },
methods: { methods: {
@ -127,6 +135,9 @@ export default {
divideSetting(key) { divideSetting(key) {
return [':sslopts', ':tlsopts', ':adapter', ':poll_limits', ':queues', ':styling', ':invalidation', ':multi_factor_authentication'].includes(key) return [':sslopts', ':tlsopts', ':adapter', ':poll_limits', ':queues', ':styling', ':invalidation', ':multi_factor_authentication'].includes(key)
}, },
followsRules(setting, settingGroup, state) {
return settingFollowsRules(setting, settingGroup, state)
},
getFormattedDescription(desc) { getFormattedDescription(desc) {
return marked(desc) return marked(desc)
}, },

View file

@ -0,0 +1,26 @@
const rules = [{
name: 'renderIfNotEqual',
key: ':proxy_remote',
groupKey: 'Pleroma.Upload',
group: ':pleroma',
targetKey: ':uploader',
targetGroup: 'Pleroma.Upload',
notEqual: 'Pleroma.Uploaders.Local'
}]
const renderIfNotEqual = (state, { group, groupKey, targetKey, notEqual }) => {
return state[group][groupKey][targetKey] !== notEqual
}
const rulesMap = {
renderIfNotEqual
}
export const settingFollowsRules = (settingKey, settingGroupKey, state) => {
const rule = rules.find(rule => rule.groupKey === settingGroupKey && rule.key === settingKey)
if (!rule) return true
const ruleFn = rulesMap[rule.name]
if (!ruleFn) return true
return ruleFn(state, rule)
}

View file

@ -0,0 +1,35 @@
import { settingFollowsRules } from '@/views/settings/rules'
describe('Check if settings follow rules', () => {
it('does not render :proxy_remote when local :uploader is selected', () => {
const state = { ':pleroma': { 'Pleroma.Upload': { ':uploader': 'Pleroma.Uploaders.Local' }}}
expect(settingFollowsRules(':proxy_remote', 'Pleroma.Upload', state)).toBeFalsy()
})
it('render :proxy_remote when local :uploader is not selected', () => {
const state = { ':pleroma': { 'Pleroma.Upload': { ':uploader': 'Pleroma.Uploaders.S3' }}}
expect(settingFollowsRules(':proxy_remote', 'Pleroma.Upload', state)).toBeTruthy()
})
it('render setting when there is no rule', () => {
const state = { ':pleroma': { 'Pleroma.Upload': { ':uploader': 'Pleroma.Uploaders.Local' }}}
expect(settingFollowsRules(':filters', 'Pleroma.Upload', state)).toBeTruthy()
})
it('render setting when one of the keys is undefined', () => {
const state = { ':pleroma': {}}
expect(settingFollowsRules(':level', undefined, state)).toBeTruthy()
expect(settingFollowsRules(':admin_token', undefined, state)).toBeTruthy()
})
it('render setting when state is empty', () => {
const state = { ':pleroma': { 'Pleroma.Upload': {}}}
expect(settingFollowsRules(':proxy_remote', 'Pleroma.Upload', state)).toBeTruthy()
})
})