const SMMediaPicker = { upload: (files) => { const validFiles = Array.from(files).filter((file) => { return SM.mimeMatches(file.type, Alpine.store('media').require_mime_type); }); const titles = Array.from(validFiles).map((file) => SM.toTitleCase(file.name)); SM.upload(validFiles, (response) => { response.files.forEach((file) => { SMMediaPicker.updateSelection(file.data.name); }); SMMediaPicker.open( Alpine.store('media').selected, { require_mime_type: Alpine.store('media').require_mime_type, allow_multiple: Alpine.store('media').allow_multiple, allow_uploads: Alpine.store('media').allow_uploads }, Alpine.store('media').callback ); }, titles); }, gotoLink: (url) => { if(url !== null) { const page = new URL(url).searchParams.get('page'); SMMediaPicker.query(page, document.querySelector('input[name="search"]').value); } }, updateSelection: (name) => { if (typeof name === 'string' && name !== '') { if (Alpine.store('media').selected.some(i => i === name)) { Alpine.store('media').selected = Alpine.store('media').selected.filter(i => i !== name); } else { if (!Alpine.store('media').allow_multiple) { Alpine.store('media').selected = [name]; } else { Alpine.store('media').selected.push(name); } } } }, search: () => { SMMediaPicker.query(null, document.querySelector('input[name="search"]').value); }, query: (page, search) => { let params = { mime_type: Alpine.store('media').require_mime_type, per_page: Alpine.store('media').per_page, search: search, 'selected[]': Alpine.store('media').selected }; if(page !== null) { params.page = page; } axios.get('/media', { params: params }) .then(response => { response.data.links[0].label = ''; response.data.links[response.data.links.length - 1].label = ''; response.data.data.forEach((file) => { file.extension = file.name.split('.').pop(); }); Alpine.store('media').current_page = response.data.current_page; Alpine.store('media').per_page = response.data.per_page; Alpine.store('media').to = response.data.to; Alpine.store('media').total = response.data.total; Alpine.store('media').items = response.data.data; Alpine.store('media').pagination = []; Alpine.nextTick(() => { Alpine.store('media').pagination = response.data.links; }); }) .catch(error => { console.error(error); }); }, html: `

Drop files to upload

or

Maximum upload size: ${SM.bytesToString(SM.maxUploadSize())}

No items found

Drop files to upload

`, onOpen: () => { SMMediaPicker.query(null, ''); }, preClose: () => { /* empty */ }, open: (selected, options = {}, callback = null) => { if(!options.hasOwnProperty('require_mime_type')) options.require_mime_type = '*'; if(!options.hasOwnProperty('allow_multiple')) options.allow_multiple = false; if(!options.hasOwnProperty('allow_uploads')) options.allow_uploads = false; if(selected === null || selected === '') selected = []; if(!Array.isArray(selected)) selected = [selected]; Alpine.store('media').selected = selected; Alpine.store('media').require_mime_type = options.require_mime_type; Alpine.store('media').allow_multiple = options.allow_multiple; Alpine.store('media').allow_uploads = options.allow_uploads; Alpine.store('media').callback = callback; Swal.fire({ title: options.allow_uploads ? 'Select or Upload Media' : 'Select Media', html: SMMediaPicker.html, confirmButtonText: 'Select', confirmButtonColor: '#0284C7', cancelButtonText: 'Cancel', showCancelButton: true, focusConfirm: false, reverseButtons: true, didOpen: SMMediaPicker.onOpen, preConfirm: SMMediaPicker.preClose, customClass: { container: 'sm-media-picker-container', popup: 'sm-media-picker', } }).then((result) => { if(result.isConfirmed && callback) { if(Alpine.store('media').allow_multiple) { callback(Alpine.store('media').selected); } else { if(Alpine.store('media').selected.length > 0) { callback(Alpine.store('media').selected[0]); } else { callback(''); } } } }) }, }; window.SMMediaPicker = SMMediaPicker; document.addEventListener('DOMContentLoaded', () => { Alpine.store('media', { require_mime_type: '*', allow_multiple: true, allow_uploads: false, current_page: 1, per_page: 24, to: 0, total: 0, items: [], selected: [], pagination: [], }); })