<template> <Context> <div class="select elements-context"> <div class="select__search"> <i class="select__search-icon fas fa-search"></i> <input v-model="search" type="text" class="select__search-input" :placeholder="$t('elementsContext.searchPlaceholder')" /> </div> <ElementsList v-if="elementsMatchingSearchTerm.length" :elements="elementsMatchingSearchTerm" @select="selectElement($event)" /> <div v-else class="context__description"> {{ $t('elementsContext.noElements') }} </div> <div class="select__footer"> <div class="select__footer-create"> <AddElementButton :class="{ 'margin-top-1': elementsMatchingSearchTerm.length === 0 }" @click="$refs.addElementModal.show()" /> </div> </div> <AddElementModal ref="addElementModal" :adding-element-type="addingElementType" :page="page" @add="addElement" /> </div> </Context> </template> <script> import context from '@baserow/modules/core/mixins/context' import ElementsList from '@baserow/modules/builder/components/elements/ElementsList' import AddElementButton from '@baserow/modules/builder/components/elements/AddElementButton' import AddElementModal from '@baserow/modules/builder/components/elements/AddElementModal' import { mapActions, mapGetters } from 'vuex' import { notifyIf } from '@baserow/modules/core/utils/error' import { isSubstringOfStrings } from '@baserow/modules/core/utils/string' export default { name: 'ElementsContext', components: { AddElementModal, AddElementButton, ElementsList }, mixins: [context], data() { return { search: null, addingElementType: null, } }, computed: { ...mapGetters({ page: 'page/getSelected', }), elements() { return this.$store.getters['element/getElements'] }, elementsMatchingSearchTerm() { if ( this.search === '' || this.search === null || this.search === undefined ) { return this.elements } return this.elements.filter((element) => { const elementType = this.$registry.get('element', element.type) return isSubstringOfStrings([elementType.name], this.search) }) }, }, methods: { ...mapActions({ actionCreateElement: 'element/create', actionSelectElement: 'element/select', }), async addElement(elementType) { this.addingElementType = elementType.getType() try { await this.actionCreateElement({ pageId: this.page.id, elementType: elementType.getType(), }) this.hide() this.$refs.addElementModal.hide() } catch (error) { notifyIf(error) } this.addingElementType = null }, selectElement(element) { this.actionSelectElement({ element }) this.hide() }, }, } </script>