mirror of
https://gitlab.com/bramw/baserow.git
synced 2025-04-13 00:38:06 +00:00
154 lines
3.8 KiB
Vue
154 lines
3.8 KiB
Vue
<template>
|
|
<div
|
|
class="dropdown"
|
|
:class="{
|
|
'dropdown--floating': !showInput,
|
|
'dropdown--disabled': disabled,
|
|
}"
|
|
@contextmenu.stop
|
|
>
|
|
<a
|
|
v-if="showInput"
|
|
class="select-options__dropdown-selected dropdown__selected"
|
|
@click="show()"
|
|
>
|
|
<div
|
|
v-if="hasValue()"
|
|
class="select-options__dropdown-option"
|
|
:class="'background-color--' + selectedColor"
|
|
>
|
|
{{ selectedName }}
|
|
</div>
|
|
<i v-if="!disabled" class="dropdown__toggle-icon fas fa-caret-down"></i>
|
|
</a>
|
|
<div class="dropdown__items" :class="{ hidden: !open }">
|
|
<div v-if="showSearch" class="select__search">
|
|
<i class="select__search-icon fas fa-search"></i>
|
|
<input
|
|
ref="search"
|
|
v-model="query"
|
|
type="text"
|
|
class="select__search-input"
|
|
:placeholder="searchText"
|
|
@keyup="search(query)"
|
|
/>
|
|
</div>
|
|
<ul
|
|
ref="items"
|
|
v-prevent-parent-scroll
|
|
v-auto-overflow-scroll
|
|
class="select__items"
|
|
>
|
|
<FieldSelectOptionsDropdownItem
|
|
v-if="showEmptyValue"
|
|
:name="''"
|
|
:value="null"
|
|
:color="''"
|
|
></FieldSelectOptionsDropdownItem>
|
|
<FieldSelectOptionsDropdownItem
|
|
v-for="option in options"
|
|
:key="option.id"
|
|
:name="option.value"
|
|
:value="option.id"
|
|
:color="option.color"
|
|
></FieldSelectOptionsDropdownItem>
|
|
</ul>
|
|
<template v-if="canCreateOption">
|
|
<div class="select__description">
|
|
{{ $t('fieldSingleSelectDropdown.notFound') }}
|
|
</div>
|
|
<div class="select__footer">
|
|
<a
|
|
class="select__footer-button"
|
|
:class="{ 'button--loading': createOptionLoading }"
|
|
@click="createOption(query)"
|
|
>
|
|
<i class="fas fa-plus"></i>
|
|
{{ $t('action.create') }} {{ query }}
|
|
</a>
|
|
</div>
|
|
</template>
|
|
</div>
|
|
</div>
|
|
</template>
|
|
|
|
<script>
|
|
import dropdown from '@baserow/modules/core/mixins/dropdown'
|
|
import FieldSelectOptionsDropdownItem from '@baserow/modules/database/components/field/FieldSelectOptionsDropdownItem'
|
|
|
|
export default {
|
|
name: 'FieldSelectOptionsDropdown',
|
|
components: { FieldSelectOptionsDropdownItem },
|
|
mixins: [dropdown],
|
|
props: {
|
|
options: {
|
|
type: Array,
|
|
required: true,
|
|
},
|
|
allowCreateOption: {
|
|
type: Boolean,
|
|
required: false,
|
|
default: false,
|
|
},
|
|
showEmptyValue: {
|
|
type: Boolean,
|
|
required: false,
|
|
default: true,
|
|
},
|
|
},
|
|
data() {
|
|
return {
|
|
createOptionLoading: false,
|
|
}
|
|
},
|
|
computed: {
|
|
canCreateOption() {
|
|
return this.allowCreateOption && this.query !== '' && !this.hasItems
|
|
},
|
|
selectedColor() {
|
|
return this.getSelectedProperty(this.value, 'color')
|
|
},
|
|
},
|
|
methods: {
|
|
forceRefreshSelectedValue() {
|
|
this._computedWatchers.selectedColor.run()
|
|
dropdown.methods.forceRefreshSelectedValue.call(this)
|
|
},
|
|
createOption(value) {
|
|
if (this.createOptionLoading) {
|
|
return
|
|
}
|
|
|
|
this.createOptionLoading = true
|
|
const done = (success) => {
|
|
this.createOptionLoading = false
|
|
|
|
// If the option was created successfully whe have to find that option, select
|
|
// it and hide the dropdown.
|
|
if (success) {
|
|
const option = this.options.find((o) => o.value === value)
|
|
if (option !== undefined) {
|
|
this.select(option.id)
|
|
}
|
|
}
|
|
}
|
|
this.$emit('create-option', { value, done })
|
|
},
|
|
},
|
|
}
|
|
</script>
|
|
|
|
<i18n>
|
|
{
|
|
"en": {
|
|
"fieldSingleSelectDropdown": {
|
|
"notFound": "Option not found"
|
|
}
|
|
},
|
|
"fr": {
|
|
"fieldSingleSelectDropdown": {
|
|
"notFound": "Option manquante"
|
|
}
|
|
}
|
|
}
|
|
</i18n>
|