Better <select> components See merge request pleroma/pleroma-fe!1373experiment-still-emoji
commit
4e96af0442
@ -0,0 +1,21 @@
|
|||||||
|
import { library } from '@fortawesome/fontawesome-svg-core'
|
||||||
|
import {
|
||||||
|
faChevronDown
|
||||||
|
} from '@fortawesome/free-solid-svg-icons'
|
||||||
|
|
||||||
|
library.add(
|
||||||
|
faChevronDown
|
||||||
|
)
|
||||||
|
|
||||||
|
export default {
|
||||||
|
model: {
|
||||||
|
prop: 'value',
|
||||||
|
event: 'change'
|
||||||
|
},
|
||||||
|
props: [
|
||||||
|
'value',
|
||||||
|
'disabled',
|
||||||
|
'unstyled',
|
||||||
|
'kind'
|
||||||
|
]
|
||||||
|
}
|
@ -0,0 +1,62 @@
|
|||||||
|
|
||||||
|
<template>
|
||||||
|
<label
|
||||||
|
class="Select input"
|
||||||
|
:class="{ disabled, unstyled }"
|
||||||
|
>
|
||||||
|
<select
|
||||||
|
:disabled="disabled"
|
||||||
|
:value="value"
|
||||||
|
@change="$emit('change', $event.target.value)"
|
||||||
|
>
|
||||||
|
<slot />
|
||||||
|
</select>
|
||||||
|
<FAIcon
|
||||||
|
class="select-down-icon"
|
||||||
|
icon="chevron-down"
|
||||||
|
/>
|
||||||
|
</label>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script src="./select.js"> </script>
|
||||||
|
|
||||||
|
<style lang="scss">
|
||||||
|
@import '../../_variables.scss';
|
||||||
|
|
||||||
|
.Select {
|
||||||
|
padding: 0;
|
||||||
|
|
||||||
|
select {
|
||||||
|
-webkit-appearance: none;
|
||||||
|
-moz-appearance: none;
|
||||||
|
appearance: none;
|
||||||
|
background: transparent;
|
||||||
|
border: none;
|
||||||
|
color: $fallback--text;
|
||||||
|
color: var(--inputText, --text, $fallback--text);
|
||||||
|
margin: 0;
|
||||||
|
padding: 0 2em 0 .2em;
|
||||||
|
font-family: sans-serif;
|
||||||
|
font-family: var(--inputFont, sans-serif);
|
||||||
|
font-size: 14px;
|
||||||
|
width: 100%;
|
||||||
|
z-index: 1;
|
||||||
|
height: 28px;
|
||||||
|
line-height: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.select-down-icon {
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
bottom: 0;
|
||||||
|
right: 5px;
|
||||||
|
height: 100%;
|
||||||
|
color: $fallback--text;
|
||||||
|
color: var(--inputText, $fallback--text);
|
||||||
|
line-height: 28px;
|
||||||
|
z-index: 0;
|
||||||
|
pointer-events: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
</style>
|
@ -0,0 +1,30 @@
|
|||||||
|
import { get, set } from 'lodash'
|
||||||
|
import Checkbox from 'src/components/checkbox/checkbox.vue'
|
||||||
|
import ModifiedIndicator from './modified_indicator.vue'
|
||||||
|
export default {
|
||||||
|
components: {
|
||||||
|
Checkbox,
|
||||||
|
ModifiedIndicator
|
||||||
|
},
|
||||||
|
props: [
|
||||||
|
'path',
|
||||||
|
'disabled'
|
||||||
|
],
|
||||||
|
computed: {
|
||||||
|
pathDefault () {
|
||||||
|
const [firstSegment, ...rest] = this.path.split('.')
|
||||||
|
return [firstSegment + 'DefaultValue', ...rest].join('.')
|
||||||
|
},
|
||||||
|
state () {
|
||||||
|
return get(this.$parent, this.path)
|
||||||
|
},
|
||||||
|
isChanged () {
|
||||||
|
return get(this.$parent, this.path) !== get(this.$parent, this.pathDefault)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
update (e) {
|
||||||
|
set(this.$parent, this.path, e)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -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)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -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 === defaultState ? $t('settings.instance_default_simple') : '' }}
|
||||||
|
</option>
|
||||||
|
</Select>
|
||||||
|
<ModifiedIndicator :changed="isChanged" />
|
||||||
|
</label>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script src="./choice_setting.js"></script>
|
||||||
|
|
||||||
|
<style lang="scss">
|
||||||
|
.ChoiceSetting {
|
||||||
|
}
|
||||||
|
</style>
|
Loading…
Reference in new issue