import { oneOf } from '../../utils/assist'; import { checkConditions } from '../../mixins/check-conditions'; import { SlickList, SlickItem } from '../../../../../node_modules/vue-slicksort'; const WpMedia = { name: 'cx-vui-wp-media', template: '#cx-vui-wp-media', mixins: [ checkConditions ], props: { returnType: { validator ( value ) { return oneOf( value, [ 'string', 'array' ] ); }, default: 'string' }, mediaType: { validator ( value ) { return oneOf( value, [ 'image', 'video' ] ); }, default: 'image' }, value: { type: [String], default: '' }, size: { validator ( value ) { return oneOf( value, [ 'small', 'large', 'default' ] ); }, default: 'default' }, name: { type: String }, elementId: { type: String }, conditions: { type: Array, default: function() { return []; } }, multiple: { type: Boolean, default: true }, mediaPopupTitle: { type: String }, mediaPopupButton: { type: String }, // Wrapper related props (should be passed into wrapper component) preventWrap: { type: Boolean, default: false }, label: { type: String }, description: { type: String }, wrapperCss: { type: Array, default: function() { return []; } }, }, components: { SlickList, SlickItem }, data() { return { currentValue: this.value, currentId: this.elementId, attachmentList: [], wpMedia: false }; }, mounted() { if ( ! this.currentId && this.name ) { this.currentId = 'cx_' + this.name; } this.wpMedia = wp.media.frames.file_frame = wp.media({ title: this.mediaPopupTitle, button: { text: this.mediaPopupButton }, library : { type : this.mediaType }, multiple: this.multiple }); this.wpMedia.on( 'select', () => { let mediaAttachments = this.wpMedia.state().get( 'selection' ).toJSON(), newAttachments = []; if ( this.multiple ) { for ( let attachment of mediaAttachments ) { if ( ! this.attachmentIdList.includes( attachment.id ) ) { newAttachments.push( attachment ); } } this.attachmentList = this.attachmentList.concat( newAttachments ); } else { this.attachmentList = mediaAttachments; } this.setCurrentValue(); } ); this.getAttachmentsData(); }, computed: { controlClasses: function() { let classesList = [ 'cx-vui-media' ]; classesList.push( 'size-' + this.size ); return classesList; }, inputValue: function() { if ( 'array' === this.returnType ) { return JSON.stringify( this.currentValue ); } return this.currentValue; }, attachmentIdList: function() { return this.attachmentList.map( ( item ) => { return item.id; } ); } }, methods: { getAttachmentsData() { if ( false === this.currentValue || '' === this.currentValue ) { return; } let thisVue = this, attachmentIds = [], attachments = []; switch( this.returnType ) { case 'string': attachmentIds = this.currentValue.split( ',' ); break; case 'array': attachmentIds = this.currentValue; break; } wp.media .query( { post__in: attachmentIds } ) .more() .then( function () { for ( let attachmentId of attachmentIds ) { attachments.push( wp.media.attachment( attachmentId ).attributes ); } thisVue.attachmentList = attachments; } ); }, openWpMediaPopup() { this.wpMedia.open(); }, removeAttachment( id ) { this.attachmentList = this.attachmentList.filter( function( obj ) { return obj.id !== id; } ); this.setCurrentValue(); }, sortInput( sortedList ) { this.setCurrentValue(); }, setCurrentValue() { let currentValue; switch( this.returnType ) { case 'string': currentValue = this.attachmentIdList.join( ',' ); break; case 'array': currentValue = this.attachmentIdList; break; } this.$emit( 'input', currentValue ); this.currentValue = currentValue; this.$emit( 'on-change', currentValue ); }, }, }; export default WpMedia;