import createSelectOption from '@baserow/modules/database/mixins/createSelectOption' import selectDropdown from '@baserow/modules/database/mixins/selectDropdown' export default { mixins: [createSelectOption, selectDropdown], computed: { /** * availableSelectOptions are needed because in the case of a MultipleSelectField * we only want to show the select options inside the dropdown that have not been * added to the field yet. */ availableSelectOptions() { // When converting from a MultipleSelectField to another field it can happen // that this property is being computed with the value (this.value) of the // converted to field type. It can either be null, or not an array. In both cases // we can safely return an empty array. if (!Array.isArray(this.value) || this.readOnly) { return [] } const ids = this.value.map((item) => item.id) return this.field.select_options.filter((item) => !ids.includes(item.id)) }, }, methods: { /** * Removes the provided ID from the current values list and emits an update * event with the new values list. */ removeValue(event, currentValues, itemIdToRemove) { const vals = currentValues.filter((item) => item.id !== itemIdToRemove) this.$emit('update', vals, currentValues) }, /** * Checks if the new value is a valid select_option id for the field and if * so will add it to a new values list. If this new list of values is unequal * to the old list of values an update event will be emitted which will result * in an API call in order to persist the new value to the field. */ updateValue(newId, oldValue) { if (!oldValue) { oldValue = [] } const newOption = this.field.select_options.find((option) => option.id === newId) || null const newValue = [...oldValue] if (newOption) { newValue.push(newOption) } if (JSON.stringify(newValue) !== JSON.stringify(oldValue)) { this.$emit('update', newValue, oldValue) } }, }, }