mirror of
https://gitlab.com/bramw/baserow.git
synced 2025-04-22 12:22:24 +00:00
104 lines
2.8 KiB
Vue
104 lines
2.8 KiB
Vue
<template>
|
|
<div ref="cell" class="grid-view__cell active">
|
|
<div
|
|
ref="dropdownLink"
|
|
class="grid-field-single-select grid-field-single-select--selected"
|
|
:class="{ 'grid-field-single-select--read-only': readOnly }"
|
|
@click="toggleDropdown()"
|
|
>
|
|
<div
|
|
v-if="value !== null"
|
|
class="grid-field-single-select__option"
|
|
:class="'background-color--' + value.color"
|
|
>
|
|
{{ value.value }}
|
|
</div>
|
|
<i
|
|
v-if="!readOnly"
|
|
class="fa fa-caret-down grid-field-single-select__icon"
|
|
></i>
|
|
</div>
|
|
<FieldSingleSelectDropdown
|
|
v-if="!readOnly"
|
|
ref="dropdown"
|
|
:value="valueId"
|
|
:options="field.select_options"
|
|
:show-input="false"
|
|
:allow-create-option="true"
|
|
class="dropdown--floating grid-field-single-select__dropdown"
|
|
@show="editing = true"
|
|
@hide="editing = false"
|
|
@input="updateValue($event, value)"
|
|
@create-option="createOption($event)"
|
|
></FieldSingleSelectDropdown>
|
|
</div>
|
|
</template>
|
|
|
|
<script>
|
|
import gridField from '@baserow/modules/database/mixins/gridField'
|
|
import { isCharacterKeyPress } from '@baserow/modules/core/utils/events'
|
|
import singleSelectField from '@baserow/modules/database/mixins/singleSelectField'
|
|
|
|
export default {
|
|
mixins: [gridField, singleSelectField],
|
|
data() {
|
|
return {
|
|
editing: false,
|
|
}
|
|
},
|
|
methods: {
|
|
toggleDropdown(value, query) {
|
|
if (this.readOnly) {
|
|
return
|
|
}
|
|
|
|
this.$refs.dropdown.toggle(this.$refs.dropdownLink, value, query)
|
|
},
|
|
hideDropdown() {
|
|
this.$refs.dropdown.hide()
|
|
},
|
|
select() {
|
|
this.$el.keydownEvent = (event) => {
|
|
// If the tab or arrow keys are pressed we don't want to do anything because
|
|
// the GridViewField component will select the next field.
|
|
const ignoredKeys = [9, 37, 38, 39, 40]
|
|
if (ignoredKeys.includes(event.keyCode)) {
|
|
return
|
|
}
|
|
|
|
// When the escape key is pressed while editing the value we can hide the
|
|
// dropdown.
|
|
if (event.keyCode === 27 && this.editing) {
|
|
this.hideDropdown()
|
|
return
|
|
}
|
|
|
|
// When the enter key is pressed when not editing the value we want to show the
|
|
// dropdown.
|
|
if (
|
|
!this.editing &&
|
|
(event.keyCode === 13 || isCharacterKeyPress(event))
|
|
) {
|
|
this.toggleDropdown()
|
|
}
|
|
}
|
|
document.body.addEventListener('keydown', this.$el.keydownEvent)
|
|
},
|
|
beforeUnSelect() {
|
|
document.body.removeEventListener('keydown', this.$el.keydownEvent)
|
|
},
|
|
canSelectNext() {
|
|
return !this.editing
|
|
},
|
|
canCopy() {
|
|
return !this.editing
|
|
},
|
|
canPaste() {
|
|
return !this.editing
|
|
},
|
|
canEmpty() {
|
|
return !this.editing
|
|
},
|
|
},
|
|
}
|
|
</script>
|