forked from AkkomaGang/akkoma-fe
implement ChoiceSetting for settings modal similar to BooleanSetting
This commit is contained in:
parent
3870a30aea
commit
1f0ac68fcd
6 changed files with 103 additions and 52 deletions
34
src/components/settings_modal/helpers/choice_setting.js
Normal file
34
src/components/settings_modal/helpers/choice_setting.js
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
import { get, set } from 'lodash'
|
||||||
|
import Select from 'src/components/select/select.vue'
|
||||||
|
import ModifiedIndicator from './modified_indicator.vue'
|
||||||
|
export default {
|
||||||
|
components: {
|
||||||
|
Select,
|
||||||
|
ModifiedIndicator
|
||||||
|
},
|
||||||
|
props: [
|
||||||
|
'path',
|
||||||
|
'disabled',
|
||||||
|
'options'
|
||||||
|
],
|
||||||
|
computed: {
|
||||||
|
pathDefault () {
|
||||||
|
const [firstSegment, ...rest] = this.path.split('.')
|
||||||
|
return [firstSegment + 'DefaultValue', ...rest].join('.')
|
||||||
|
},
|
||||||
|
state () {
|
||||||
|
return get(this.$parent, this.path)
|
||||||
|
},
|
||||||
|
defaultState () {
|
||||||
|
return get(this.$parent, this.pathDefault)
|
||||||
|
},
|
||||||
|
isChanged () {
|
||||||
|
return get(this.$parent, this.path) !== get(this.$parent, this.pathDefault)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
update (e) {
|
||||||
|
set(this.$parent, this.path, e)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
29
src/components/settings_modal/helpers/choice_setting.vue
Normal file
29
src/components/settings_modal/helpers/choice_setting.vue
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
<template>
|
||||||
|
<label
|
||||||
|
class="ChoiceSetting"
|
||||||
|
>
|
||||||
|
<slot />
|
||||||
|
<Select
|
||||||
|
:value="state"
|
||||||
|
:disabled="disabled"
|
||||||
|
@change="update"
|
||||||
|
>
|
||||||
|
<option
|
||||||
|
v-for="option in options"
|
||||||
|
:key="option.key"
|
||||||
|
:value="option.value"
|
||||||
|
>
|
||||||
|
{{ option.label }}
|
||||||
|
{{ option.value === defaultValue ? $t('settings.instance_default_simple') : '' }}
|
||||||
|
</option>
|
||||||
|
</Select>
|
||||||
|
<ModifiedIndicator :changed="isChanged" />
|
||||||
|
</label>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script src="./choice_setting.js"></script>
|
||||||
|
|
||||||
|
<style lang="scss">
|
||||||
|
.ChoiceSetting {
|
||||||
|
}
|
||||||
|
</style>
|
|
@ -1,18 +1,23 @@
|
||||||
import { filter, trim } from 'lodash'
|
import { filter, trim } from 'lodash'
|
||||||
import BooleanSetting from '../helpers/boolean_setting.vue'
|
import BooleanSetting from '../helpers/boolean_setting.vue'
|
||||||
import Select from '../../select/select.vue'
|
import ChoiceSetting from '../helpers/choice_setting.vue'
|
||||||
|
|
||||||
import SharedComputedObject from '../helpers/shared_computed_object.js'
|
import SharedComputedObject from '../helpers/shared_computed_object.js'
|
||||||
|
|
||||||
const FilteringTab = {
|
const FilteringTab = {
|
||||||
data () {
|
data () {
|
||||||
return {
|
return {
|
||||||
muteWordsStringLocal: this.$store.getters.mergedConfig.muteWords.join('\n')
|
muteWordsStringLocal: this.$store.getters.mergedConfig.muteWords.join('\n'),
|
||||||
|
replyVisibilityOptions: ['all', 'following', 'self'].map(mode => ({
|
||||||
|
key: mode,
|
||||||
|
value: mode,
|
||||||
|
label: this.$t(`settings.reply_visibility_${mode}`)
|
||||||
|
}))
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
components: {
|
components: {
|
||||||
BooleanSetting,
|
BooleanSetting,
|
||||||
Select
|
ChoiceSetting
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
...SharedComputedObject(),
|
...SharedComputedObject(),
|
||||||
|
|
|
@ -36,20 +36,13 @@
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<ChoiceSetting
|
||||||
{{ $t('settings.replies_in_timeline') }}
|
|
||||||
<Select
|
|
||||||
id="replyVisibility"
|
id="replyVisibility"
|
||||||
v-model="replyVisibility"
|
path="replyVisibility"
|
||||||
|
:options="replyVisibilityOptions"
|
||||||
>
|
>
|
||||||
<option
|
{{ $t('settings.replies_in_timeline') }}
|
||||||
value="all"
|
</ChoiceSetting>
|
||||||
selected
|
|
||||||
>{{ $t('settings.reply_visibility_all') }}</option>
|
|
||||||
<option value="following">{{ $t('settings.reply_visibility_following') }}</option>
|
|
||||||
<option value="self">{{ $t('settings.reply_visibility_self') }}</option>
|
|
||||||
</Select>
|
|
||||||
</div>
|
|
||||||
<div>
|
<div>
|
||||||
<BooleanSetting path="hidePostStats">
|
<BooleanSetting path="hidePostStats">
|
||||||
{{ $t('settings.hide_post_stats') }}
|
{{ $t('settings.hide_post_stats') }}
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
import BooleanSetting from '../helpers/boolean_setting.vue'
|
import BooleanSetting from '../helpers/boolean_setting.vue'
|
||||||
import Select from '../../select/select.vue'
|
import ChoiceSetting from '../helpers/choice_setting.vue'
|
||||||
import InterfaceLanguageSwitcher from 'src/components/interface_language_switcher/interface_language_switcher.vue'
|
import InterfaceLanguageSwitcher from 'src/components/interface_language_switcher/interface_language_switcher.vue'
|
||||||
|
|
||||||
import SharedComputedObject from '../helpers/shared_computed_object.js'
|
import SharedComputedObject from '../helpers/shared_computed_object.js'
|
||||||
|
@ -15,6 +15,11 @@ library.add(
|
||||||
const GeneralTab = {
|
const GeneralTab = {
|
||||||
data () {
|
data () {
|
||||||
return {
|
return {
|
||||||
|
subjectLineOptions: ['email', 'noop', 'masto'].map(mode => ({
|
||||||
|
key: mode,
|
||||||
|
value: mode,
|
||||||
|
label: this.$t(`settings.subject_line_${mode === 'masto' ? 'mastodon' : mode}`)
|
||||||
|
})),
|
||||||
loopSilentAvailable:
|
loopSilentAvailable:
|
||||||
// Firefox
|
// Firefox
|
||||||
Object.getOwnPropertyDescriptor(HTMLVideoElement.prototype, 'mozHasAudio') ||
|
Object.getOwnPropertyDescriptor(HTMLVideoElement.prototype, 'mozHasAudio') ||
|
||||||
|
@ -26,13 +31,20 @@ const GeneralTab = {
|
||||||
},
|
},
|
||||||
components: {
|
components: {
|
||||||
BooleanSetting,
|
BooleanSetting,
|
||||||
InterfaceLanguageSwitcher,
|
ChoiceSetting,
|
||||||
Select
|
InterfaceLanguageSwitcher
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
postFormats () {
|
postFormats () {
|
||||||
return this.$store.state.instance.postFormats || []
|
return this.$store.state.instance.postFormats || []
|
||||||
},
|
},
|
||||||
|
postContentOptions () {
|
||||||
|
return this.postFormats.map(format => ({
|
||||||
|
key: format,
|
||||||
|
value: format,
|
||||||
|
label: this.$t(`post_status.content_type["${format}"]`)
|
||||||
|
}))
|
||||||
|
},
|
||||||
instanceSpecificPanelPresent () { return this.$store.state.instance.showInstanceSpecificPanel },
|
instanceSpecificPanelPresent () { return this.$store.state.instance.showInstanceSpecificPanel },
|
||||||
instanceWallpaperUsed () {
|
instanceWallpaperUsed () {
|
||||||
return this.$store.state.instance.background &&
|
return this.$store.state.instance.background &&
|
||||||
|
|
|
@ -85,44 +85,22 @@
|
||||||
</BooleanSetting>
|
</BooleanSetting>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<div>
|
<ChoiceSetting
|
||||||
{{ $t('settings.subject_line_behavior') }}
|
|
||||||
<Select
|
|
||||||
id="subjectLineBehavior"
|
id="subjectLineBehavior"
|
||||||
v-model="subjectLineBehavior"
|
path="subjectLineBehavior"
|
||||||
|
:options="subjectLineOptions"
|
||||||
>
|
>
|
||||||
<option value="email">
|
{{ $t('settings.subject_line_behavior') }}
|
||||||
{{ $t('settings.subject_line_email') }}
|
</ChoiceSetting>
|
||||||
{{ subjectLineBehaviorDefaultValue == 'email' ? $t('settings.instance_default_simple') : '' }}
|
|
||||||
</option>
|
|
||||||
<option value="masto">
|
|
||||||
{{ $t('settings.subject_line_mastodon') }}
|
|
||||||
{{ subjectLineBehaviorDefaultValue == 'mastodon' ? $t('settings.instance_default_simple') : '' }}
|
|
||||||
</option>
|
|
||||||
<option value="noop">
|
|
||||||
{{ $t('settings.subject_line_noop') }}
|
|
||||||
{{ subjectLineBehaviorDefaultValue == 'noop' ? $t('settings.instance_default_simple') : '' }}
|
|
||||||
</option>
|
|
||||||
</Select>
|
|
||||||
</div>
|
|
||||||
</li>
|
</li>
|
||||||
<li v-if="postFormats.length > 0">
|
<li v-if="postFormats.length > 0">
|
||||||
<div>
|
<ChoiceSetting
|
||||||
{{ $t('settings.post_status_content_type') }}
|
|
||||||
<Select
|
|
||||||
id="postContentType"
|
id="postContentType"
|
||||||
v-model="postContentType"
|
path="postContentType"
|
||||||
|
:options="postContentOptions"
|
||||||
>
|
>
|
||||||
<option
|
{{ $t('settings.post_status_content_type') }}
|
||||||
v-for="postFormat in postFormats"
|
</ChoiceSetting>
|
||||||
:key="postFormat"
|
|
||||||
:value="postFormat"
|
|
||||||
>
|
|
||||||
{{ $t(`post_status.content_type["${postFormat}"]`) }}
|
|
||||||
{{ postContentTypeDefaultValue === postFormat ? $t('settings.instance_default_simple') : '' }}
|
|
||||||
</option>
|
|
||||||
</Select>
|
|
||||||
</div>
|
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<BooleanSetting path="minimalScopesMode">
|
<BooleanSetting path="minimalScopesMode">
|
||||||
|
|
Loading…
Reference in a new issue