const SMMediaPicker = { upload: (files) => { const validFiles = Array.from(files).filter((file) => { return SM.mimeMatches(file.type, Alpine.store('media').require_mime_type); }); if(validFiles.length === 0) { Alpine.store('media').error = 'No files where uploaded as they do not meet the requirements.'; } else if(validFiles.length !== files.length) { Alpine.store('media').error = 'Some files where not uploaded as they do not meet the requirements.'; } else { Alpine.store('media').error = null; } const titles = Array.from(validFiles).map((file) => SM.toTitleCase(file.name)); SM.upload(validFiles, (response) => { if(response.files) { 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); } } } }, doubleClick: (name) => { if (!Alpine.store('media').allow_multiple) { Alpine.store('media').selected = [name]; Swal.clickConfirm(); } }, 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 = []; response.data.data.forEach((file) => { if(file.status === 'processing') { const fileName = file.name; setTimeout(() => { SMMediaPicker.updateThumbnail(fileName); }, 5000); } }); Alpine.nextTick(() => { Alpine.store('media').pagination = response.data.links; }).then(r => { /* empty */ }); }) .catch(error => { console.error(error); }); }, html: `

Drop files to upload

or

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

Prev Next

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(''); } } } }) }, updateThumbnail: (name) => { axios.get('/media/' + name) .then(response => { const item = Alpine.store('media').items.find(i => i.name === name); if(item) { if(response.data.status === 'ready') { item.thumbnail = response.data.thumbnail; item.status = response.data.status; item.variants = response.data.variants; } else if(response.data.status === 'processing') { setTimeout(() => { SMMediaPicker.updateThumbnail(name); }, 5000); } } }) .catch(error => { console.error(error); }); } }; 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: [], }); })