import { v4 as uuidv4 } from 'uuid'; import { search } from '@banez/search'; import { computed, defineComponent, ref } from 'vue'; import Modal from './_modal'; import type { BCMSModalInputDefaults, BCMSMultiSelectItem, BCMSMultiSelectItemExtended, BCMSMultiSelectModalInputData, BCMSMultiSelectModalOutputData, } from '../../types'; import { BCMSTextInput } from '../input'; import BCMSImage from '../image'; import { useTranslation } from '../../translations'; interface Data extends BCMSModalInputDefaults { onlyOne: boolean; items: BCMSMultiSelectItemExtended[]; } const component = defineComponent({ setup() { const inputId = uuidv4(); const translations = computed(() => { return useTranslation(); }); const show = ref(false); const modalData = ref(getData()); const searchTerm = ref(''); const store = window.bcms.vue.store; const items = computed(() => modalData.value.items.map((item) => { if (item.imageId) { item.image = store.getters.media_findOne( (e) => e._id === item.imageId ); } return item; }) ); const filteredItems = computed(() => { let output: BCMSMultiSelectItemExtended[] = JSON.parse( JSON.stringify(items.value) ); if (searchTerm.value) { const result = search({ searchTerm: searchTerm.value, set: modalData.value.items.map((item) => { return { id: item.id, data: [ item.title.toLowerCase(), item.subtitle?.toLowerCase() || '_________', item.image ? item.image.name : '_________', ], }; }), }); output = result.items.map((e) => { return items.value.find((t) => t.id === e.id) as BCMSMultiSelectItem; }); } output.sort((a, b) => { if (b.title > a.title) { return -1; } if (b.title < a.title) { return 1; } return 0; }); return output; }); window.bcms.modal.multiSelect = { hide() { show.value = false; }, show(data) { setTimeout(() => { const el = document.getElementById(inputId); if (el) { el.focus(); } }, 20); modalData.value = getData(data); show.value = true; }, }; function getData(inputData?: BCMSMultiSelectModalInputData): Data { const d: Data = { title: translations.value.modal.multiSelect.title, items: [], onlyOne: false, onCancel() { // ... }, onDone() { // ... }, }; if (inputData) { if (inputData.title) { d.title = inputData.title; } if (inputData.onDone) { d.onDone = inputData.onDone; } if (inputData.onCancel) { d.onCancel = inputData.onCancel; } if (inputData.onlyOne) { d.onlyOne = inputData.onlyOne; } d.items = inputData.items; } return d; } function flush() { searchTerm.value = ''; } function cancel() { flush(); if (modalData.value.onCancel) { const result = modalData.value.onCancel(); if (result instanceof Promise) { result.catch((error) => { console.error(error); }); } } window.bcms.modal.multiSelect.hide(); } function done() { flush(); if (modalData.value.onDone) { const result = modalData.value.onDone({ items: modalData.value.items.filter((e) => e.selected), }); if (result instanceof Promise) { result.catch((error) => { console.error(error); }); } } window.bcms.modal.multiSelect.hide(); } return () => { return (
{ searchTerm.value = value.toLowerCase(); }} />
{filteredItems.value.map((item) => ( ))}
); }; }, }); export default component;