import { computed, defineComponent, onBeforeUpdate, onMounted, ref, Transition, } from 'vue'; import { BCMSMediaType } from '@becomes/cms-sdk/types'; import { DefaultComponentProps } from '../_default'; import type { BCMSMediaControlFilters } from '../../types'; import BCMSIcon from '../icon'; import BCMSButton from '../button'; import { BCMSSelect, BCMSDateInput } from '../input'; import { useRoute } from 'vue-router'; import { useTranslation } from '../../translations'; const component = defineComponent({ props: { ...DefaultComponentProps, disableUploadFile: Boolean, disableCreateFolder: Boolean, }, emits: { uploadFile: () => { return true; }, createFolder: () => { return true; }, filter: (_filters: BCMSMediaControlFilters) => { return true; }, }, setup(props, ctx) { const translations = computed(() => { return useTranslation(); }); const route = useRoute(); const filters = ref(getFilters()); const query = computed(() => { return { search: route.query.search as string, }; }); let searchDebounceTimer: any; let searchQueryBuffer = ''; function getFilters(): BCMSMediaControlFilters { return { search: { name: '', }, isOpen: false, options: [ { label: translations.value.page.media.filters.type.label, dropdown: { items: [ { label: translations.value.page.media.filters.type.image, value: BCMSMediaType.IMG, }, { label: translations.value.page.media.filters.type.video, value: BCMSMediaType.VID, }, { label: translations.value.page.media.filters.type.directory, value: BCMSMediaType.DIR, }, ], selected: { label: translations.value.page.media.filters.type.placeholder, value: '', }, }, }, { label: translations.value.page.media.filters.dateModified.label, date: { year: -1, month: -1, day: -1, }, }, ], clear: () => { filters.value = getFilters(); return filters.value; }, }; } onMounted(() => { if (query.value.search && route.path.startsWith('/dashboard/media')) { searchQueryBuffer = query.value.search; filters.value.search.name = query.value.search; ctx.emit('filter', filters.value); } }); onBeforeUpdate(() => { if (searchQueryBuffer !== query.value.search) { searchQueryBuffer = query.value.search; filters.value.search.name = query.value.search; ctx.emit('filter', filters.value); } }); return () => (
{ clearTimeout(searchDebounceTimer); searchDebounceTimer = setTimeout(() => { ctx.emit('filter', filters.value); }, 300); }} /> {filters.value.isOpen ? (
(filters.value.isOpen = false)} > {filters.value.options.map((filterOption) => { return (
{filterOption.dropdown ? ( { if (filterOption.dropdown) { filterOption.dropdown.selected = option; ctx.emit('filter', filters.value); } }} /> ) : filterOption.date ? ( { if (filterOption.date) { if (value === 0) { filterOption.date = { year: -1, month: -1, day: -1, }; } else { const date = new Date(value); filterOption.date.year = date.getFullYear(); filterOption.date.month = date.getMonth() + 1; filterOption.date.day = date.getDate(); } ctx.emit('filter', filters.value); } }} /> ) : ( '' )}
); })}
) : ( '' )}
{ ctx.emit('uploadFile'); }} > {translations.value.page.media.actions.upload} { ctx.emit('createFolder'); }} > {translations.value.page.media.actions.createFolder}
); }, }); export default component;