Ticket #27016: 27016.3.diff
File 27016.3.diff, 29.6 KB (added by , 11 years ago) |
---|
-
src/wp-includes/js/media-models.js
32 32 frame = new MediaFrame.Post( attributes ); 33 33 } else if ( 'image' === attributes.frame && MediaFrame.ImageDetails ) { 34 34 frame = new MediaFrame.ImageDetails( attributes ); 35 } else if ( 'audio' === attributes.frame && MediaFrame.AudioDetails ) { 36 frame = new MediaFrame.AudioDetails( attributes ); 37 } else if ( 'video' === attributes.frame && MediaFrame.VideoDetails ) { 38 frame = new MediaFrame.VideoDetails( attributes ); 35 39 } 36 40 37 41 delete attributes.frame; … … 448 452 }); 449 453 450 454 /** 455 * wp.media.model.PostAudio 456 * 457 * @constructor 458 * @augments Backbone.Model 459 **/ 460 PostAudio = media.model.PostAudio = Backbone.Model.extend({ 461 462 initialize: function( attributes ) { 463 this.attachment = false; 464 465 if ( attributes.attachment_id ) { 466 this.attachment = Attachment.get( attributes.attachment_id ); 467 this.dfd = this.attachment.fetch(); 468 } 469 } 470 }); 471 472 /** 473 * wp.media.model.PostVideo 474 * 475 * @constructor 476 * @augments Backbone.Model 477 **/ 478 PostVideo = media.model.PostVideo = Backbone.Model.extend({ 479 480 initialize: function( attributes ) { 481 this.attachment = false; 482 483 if ( attributes.attachment_id ) { 484 this.attachment = Attachment.get( attributes.attachment_id ); 485 this.dfd = this.attachment.fetch(); 486 } 487 } 488 }); 489 490 /** 451 491 * wp.media.model.Attachments 452 492 * 453 493 * @constructor -
src/wp-includes/js/media-views.js
760 760 }); 761 761 762 762 /** 763 * wp.media.controller.AudioDetails 764 * 765 * @constructor 766 * @augments wp.media.controller.State 767 * @augments Backbone.Model 768 */ 769 media.controller.AudioDetails = media.controller.State.extend({ 770 defaults: _.defaults({ 771 id: 'audio-details', 772 toolbar: 'audio-details', 773 title: l10n.audioDetailsTitle, 774 content: 'audio-details', 775 menu: 'audio-details', 776 router: false, 777 attachment: false, 778 priority: 60, 779 editing: false 780 }, media.controller.Library.prototype.defaults ), 781 782 initialize: function( options ) { 783 this.audio = options.audio; 784 media.controller.State.prototype.initialize.apply( this, arguments ); 785 } 786 }); 787 788 /** 789 * wp.media.controller.VideoDetails 790 * 791 * @constructor 792 * @augments wp.media.controller.State 793 * @augments Backbone.Model 794 */ 795 media.controller.VideoDetails = media.controller.State.extend({ 796 defaults: _.defaults({ 797 id: 'video-details', 798 toolbar: 'video-details', 799 title: l10n.videoDetailsTitle, 800 content: 'video-details', 801 menu: 'video-details', 802 router: false, 803 attachment: false, 804 priority: 60, 805 editing: false 806 }, media.controller.Library.prototype.defaults ), 807 808 initialize: function( options ) { 809 this.video = options.video; 810 media.controller.State.prototype.initialize.apply( this, arguments ); 811 } 812 }); 813 814 /** 763 815 * wp.media.controller.CollectionEdit 764 816 * 765 817 * @static … … 1063 1115 } 1064 1116 }); 1065 1117 1066 /** 1067 * wp.media.controller.ReplaceImage 1068 * 1069 * Replace a selected single image 1070 * 1071 * @constructor 1072 * @augments wp.media.controller.Library 1073 * @augments wp.media.controller.State 1074 * @augments Backbone.Model 1075 */ 1076 media.controller.ReplaceImage = media.controller.Library.extend({ 1077 defaults: _.defaults({ 1078 id: 'replace-image', 1079 filterable: 'uploaded', 1080 multiple: false, 1081 toolbar: 'replace', 1082 title: l10n.replaceImageTitle, 1083 priority: 60, 1084 syncSelection: false 1085 }, media.controller.Library.prototype.defaults ), 1118 media.controller.ReplaceMedia = function (type, args) { 1119 return media.controller.Library.extend({ 1120 defaults: _.defaults({ 1121 id: 'replace-' + type, 1122 filterable: 'uploaded', 1123 multiple: false, 1124 toolbar: 'replace', 1125 title: args.title, 1126 priority: 60, 1127 syncSelection: false 1128 }, media.controller.Library.prototype.defaults ), 1086 1129 1087 initialize: function( options ) {1088 var library, comparator;1130 initialize: function( options ) { 1131 var library, comparator; 1089 1132 1090 this.image = options.image;1091 // If we haven't been provided a `library`, create a `Selection`.1092 if ( ! this.get('library') ) {1093 this.set( 'library', media.query({ type: 'image'}) );1094 }1133 this[type] = options[type]; 1134 // If we haven't been provided a `library`, create a `Selection`. 1135 if ( ! this.get('library') ) { 1136 this.set( 'library', media.query({ type: type }) ); 1137 } 1095 1138 1096 media.controller.Library.prototype.initialize.apply( this, arguments );1139 media.controller.Library.prototype.initialize.apply( this, arguments ); 1097 1140 1098 library = this.get('library');1099 comparator = library.comparator;1141 library = this.get('library'); 1142 comparator = library.comparator; 1100 1143 1101 // Overload the library's comparator to push items that are not in1102 // the mirrored query to the front of the aggregate collection.1103 library.comparator = function( a, b ) {1104 var aInQuery = !! this.mirroring.get( a.cid ),1105 bInQuery = !! this.mirroring.get( b.cid );1144 // Overload the library's comparator to push items that are not in 1145 // the mirrored query to the front of the aggregate collection. 1146 library.comparator = function( a, b ) { 1147 var aInQuery = !! this.mirroring.get( a.cid ), 1148 bInQuery = !! this.mirroring.get( b.cid ); 1106 1149 1107 if ( ! aInQuery && bInQuery ) {1108 return -1;1109 } else if ( aInQuery && ! bInQuery ) {1110 return 1;1111 } else {1112 return comparator.apply( this, arguments );1113 }1114 };1150 if ( ! aInQuery && bInQuery ) { 1151 return -1; 1152 } else if ( aInQuery && ! bInQuery ) { 1153 return 1; 1154 } else { 1155 return comparator.apply( this, arguments ); 1156 } 1157 }; 1115 1158 1116 // Add all items in the selection to the library, so any featured1117 // images that are not initially loaded still appear.1118 library.observe( this.get('selection') );1119 },1159 // Add all items in the selection to the library, so any featured 1160 // images that are not initially loaded still appear. 1161 library.observe( this.get('selection') ); 1162 }, 1120 1163 1121 activate: function() {1122 this.updateSelection();1123 media.controller.Library.prototype.activate.apply( this, arguments );1124 },1164 activate: function() { 1165 this.updateSelection(); 1166 media.controller.Library.prototype.activate.apply( this, arguments ); 1167 }, 1125 1168 1126 updateSelection: function() {1127 var selection = this.get('selection'),1128 attachment = this.image.attachment;1169 updateSelection: function() { 1170 var selection = this.get('selection'), 1171 attachment = this[type].attachment; 1129 1172 1130 selection.reset( attachment ? [ attachment ] : [] ); 1131 } 1132 }); 1173 selection.reset( attachment ? [ attachment ] : [] ); 1174 } 1175 }); 1176 }; 1133 1177 1134 1178 /** 1179 * wp.media.controller.ReplaceImage 1180 * 1181 * Replace a selected single image 1182 * 1183 * @constructor 1184 * @augments wp.media.controller.Library 1185 * @augments wp.media.controller.State 1186 * @augments Backbone.Model 1187 */ 1188 media.controller.ReplaceImage = media.controller.ReplaceMedia( 'image', { 1189 title : l10n.replaceImageTitle 1190 } ); 1191 /** 1192 * wp.media.controller.ReplaceAudio 1193 * 1194 * Replace a selected single audio 1195 * 1196 * @constructor 1197 * @augments wp.media.controller.Library 1198 * @augments wp.media.controller.State 1199 * @augments Backbone.Model 1200 */ 1201 media.controller.ReplaceAudio = media.controller.ReplaceMedia( 'audio', { 1202 title : l10n.replaceAudioTitle 1203 } ); 1204 /** 1205 * wp.media.controller.ReplaceVideo 1206 * 1207 * Replace a selected single video 1208 * 1209 * @constructor 1210 * @augments wp.media.controller.Library 1211 * @augments wp.media.controller.State 1212 * @augments Backbone.Model 1213 */ 1214 media.controller.ReplaceVideo = media.controller.ReplaceMedia( 'video', { 1215 title : l10n.replaceVideoTitle 1216 } ); 1217 1218 /** 1135 1219 * wp.media.controller.Embed 1136 1220 * 1137 1221 * @constructor … … 2348 2432 } 2349 2433 }); 2350 2434 2351 media.view.MediaFrame.ImageDetails = media.view.MediaFrame.Select.extend({ 2352 defaults: { 2353 id: 'image', 2354 url: '', 2355 menu: 'image-details', 2356 content: 'image-details', 2357 toolbar: 'image-details', 2358 type: 'link', 2359 title: l10n.imageDetailsTitle, 2360 priority: 120 2361 }, 2435 media.view.MediaFrame.MediaDetails = function (type, args) { 2436 return media.view.MediaFrame.Select.extend({ 2437 defaults: { 2438 id: type, 2439 url: '', 2440 menu: type + '-details', 2441 content: type + '-details', 2442 toolbar: type + '-details', 2443 type: 'link', 2444 title: args.title, 2445 priority: 120 2446 }, 2362 2447 2363 initialize: function( options ) {2364 this.image = new media.model.PostImage( options.metadata );2365 this.options.selection = new media.model.Selection( this.image.attachment, { multiple: false } );2366 media.view.MediaFrame.Select.prototype.initialize.apply( this, arguments );2367 },2448 initialize: function( options ) { 2449 this[type] = new args.model( options.metadata ); 2450 this.options.selection = new media.model.Selection( this[type].attachment, { multiple: false } ); 2451 media.view.MediaFrame.Select.prototype.initialize.apply( this, arguments ); 2452 }, 2368 2453 2369 bindHandlers: function() {2370 media.view.MediaFrame.Select.prototype.bindHandlers.apply( this, arguments );2371 this.on( 'menu:create:image-details', this.createMenu, this );2372 this.on( 'content:render:image-details', this.renderImageDetailsContent, this );2373 this.on( 'menu:render:image-details', this.renderMenu, this );2374 this.on( 'toolbar:render:image-details', this.renderImageDetailsToolbar, this );2375 // override the select toolbar2376 this.on( 'toolbar:render:replace', this.renderReplaceImageToolbar, this );2377 },2454 bindHandlers: function() { 2455 media.view.MediaFrame.Select.prototype.bindHandlers.apply( this, arguments ); 2456 this.on( 'menu:create:' + type + '-details', this.createMenu, this ); 2457 this.on( 'content:render:' + type + '-details', this.renderDetailsContent, this ); 2458 this.on( 'menu:render:' + type + '-details', this.renderMenu, this ); 2459 this.on( 'toolbar:render:' + type + '-details', this.renderDetailsToolbar, this ); 2460 // override the select toolbar 2461 this.on( 'toolbar:render:replace', this.renderReplaceToolbar, this ); 2462 }, 2378 2463 2379 createStates: function() { 2380 this.states.add([ 2381 new media.controller.ImageDetails({ 2382 image: this.image, 2383 editable: false, 2384 menu: 'image-details' 2385 }), 2386 new media.controller.ReplaceImage({ 2387 id: 'replace-image', 2388 library: media.query( { type: 'image' } ), 2389 image: this.image, 2390 multiple: false, 2391 title: l10n.imageReplaceTitle, 2392 menu: 'image-details', 2393 toolbar: 'replace', 2394 priority: 80, 2395 displaySettings: true 2396 }) 2397 ]); 2398 }, 2464 createStates: function() { 2465 var detailsParams = { 2466 editable: false, 2467 menu: type + '-details' 2468 }, 2469 replaceParams = { 2470 id: 'replace-' + type, 2471 library: media.query( { type: type } ), 2472 image: this[type], 2473 multiple: false, 2474 title: args.replaceTitle, 2475 menu: type + '-details', 2476 toolbar: 'replace', 2477 priority: 80, 2478 displaySettings: true 2479 }; 2399 2480 2400 renderImageDetailsContent: function() { 2401 var view = new media.view.ImageDetails({ 2402 controller: this, 2403 model: this.state().image, 2404 attachment: this.state().image.attachment 2405 }).render(); 2481 detailsParams[type] = this[type]; 2482 replaceParams[type] = this[type]; 2406 2483 2407 this.content.set( view ); 2484 this.states.add([ 2485 new args.detailsController(detailsParams), 2486 new args.replaceController(replaceParams) 2487 ]); 2488 }, 2408 2489 2409 }, 2490 renderDetailsContent: function() { 2491 console.log(this.state()); 2492 var view = new args.detailsView({ 2493 controller: this, 2494 model: this.state()[type], 2495 attachment: this.state()[type].attachment 2496 }).render(); 2410 2497 2411 renderMenu: function( view ) { 2412 var lastState = this.lastState(), 2413 previous = lastState && lastState.id, 2414 frame = this; 2498 this.content.set( view ); 2499 }, 2415 2500 2416 view.set({ 2417 cancel: { 2418 text: l10n.imageDetailsCancel, 2419 priority: 20, 2420 click: function() { 2421 if ( previous ) { 2422 frame.setState( previous ); 2423 } else { 2424 frame.close(); 2501 renderMenu: function( view ) { 2502 var lastState = this.lastState(), 2503 previous = lastState && lastState.id, 2504 frame = this; 2505 2506 view.set({ 2507 cancel: { 2508 text: args.cancelText, 2509 priority: 20, 2510 click: function() { 2511 if ( previous ) { 2512 frame.setState( previous ); 2513 } else { 2514 frame.close(); 2515 } 2425 2516 } 2426 } 2427 }, 2428 separateCancel: new media.View({ 2429 className: 'separator', 2430 priority: 40 2431 }) 2432 }); 2517 }, 2518 separateCancel: new media.View({ 2519 className: 'separator', 2520 priority: 40 2521 }) 2522 }); 2433 2523 2434 },2524 }, 2435 2525 2436 renderImageDetailsToolbar: function() {2437 this.toolbar.set( new media.view.Toolbar({2438 controller: this,2439 items: {2440 select: {2441 style: 'primary',2442 text: l10n.update,2443 priority: 80,2526 renderDetailsToolbar: function() { 2527 this.toolbar.set( new media.view.Toolbar({ 2528 controller: this, 2529 items: { 2530 select: { 2531 style: 'primary', 2532 text: l10n.update, 2533 priority: 80, 2444 2534 2445 click: function() {2446 var controller = this.controller,2447 state = controller.state();2535 click: function() { 2536 var controller = this.controller, 2537 state = controller.state(); 2448 2538 2449 controller.close();2539 controller.close(); 2450 2540 2451 // not sure if we want to use wp.media.string.image which will create a shortcode or2452 // perhaps wp.html.string to at least to build the <img />2453 state.trigger( 'update', controller.image.toJSON() );2541 // not sure if we want to use wp.media.string.image which will create a shortcode or 2542 // perhaps wp.html.string to at least to build the <img /> 2543 state.trigger( 'update', controller[type].toJSON() ); 2454 2544 2455 // Restore and reset the default state. 2456 controller.setState( controller.options.state ); 2457 controller.reset(); 2545 // Restore and reset the default state. 2546 controller.setState( controller.options.state ); 2547 controller.reset(); 2548 } 2458 2549 } 2459 2550 } 2460 } 2461 }) ); 2462 }, 2551 }) ); 2552 }, 2463 2553 2464 renderReplaceImageToolbar: function() {2465 this.toolbar.set( new media.view.Toolbar({2466 controller: this,2467 items: {2468 replace: {2469 style: 'primary',2470 text: l10n.replace,2471 priority: 80,2554 renderReplaceToolbar: function() { 2555 this.toolbar.set( new media.view.Toolbar({ 2556 controller: this, 2557 items: { 2558 replace: { 2559 style: 'primary', 2560 text: l10n.replace, 2561 priority: 80, 2472 2562 2473 click: function() {2474 var controller = this.controller,2475 state = controller.state(),2476 selection = state.get( 'selection' ),2477 attachment = selection.single();2563 click: function() { 2564 var controller = this.controller, 2565 state = controller.state(), 2566 selection = state.get( 'selection' ), 2567 attachment = selection.single(); 2478 2568 2479 controller.close();2569 controller.close(); 2480 2570 2481 controller.image.changeAttachment( attachment, state.display( attachment ) );2571 controller[type].changeAttachment( attachment, state.display( attachment ) ); 2482 2572 2483 // not sure if we want to use wp.media.string.image which will create a shortcode or2484 // perhaps wp.html.string to at least to build the <img />2485 state.trigger( 'replace', controller.image.toJSON() );2573 // not sure if we want to use wp.media.string.image which will create a shortcode or 2574 // perhaps wp.html.string to at least to build the <img /> 2575 state.trigger( 'replace', controller[type].toJSON() ); 2486 2576 2487 // Restore and reset the default state. 2488 controller.setState( controller.options.state ); 2489 controller.reset(); 2577 // Restore and reset the default state. 2578 controller.setState( controller.options.state ); 2579 controller.reset(); 2580 } 2490 2581 } 2491 2582 } 2492 } 2493 }) ); 2494 } 2583 }) ); 2584 } 2495 2585 2496 }); 2586 }); 2587 }; 2497 2588 2589 media.view.MediaFrame.ImageDetails = media.view.MediaFrame.MediaDetails( 'image', { 2590 title : l10n.imageDetailsTitle, 2591 model: media.model.PostImage, 2592 detailsView: media.view.ImageDetails, 2593 detailsController: media.controller.ImageDetails, 2594 replaceController: media.controller.ReplaceImage, 2595 replaceTitle: l10n.imageReplaceTitle, 2596 cancelText: l10n.imageDetailsCancel 2597 } ); 2498 2598 2599 media.view.MediaFrame.AudioDetails = media.view.MediaFrame.MediaDetails( 'audio', { 2600 title : l10n.audioDetailsTitle, 2601 model: media.model.PostAudio, 2602 detailsView: media.view.AudioDetails, 2603 detailsController: media.controller.AudioDetails, 2604 replaceController: media.controller.ReplaceAudio, 2605 replaceTitle: l10n.audioReplaceTitle, 2606 cancelText: l10n.audioDetailsCancel 2607 } ); 2608 2609 media.view.MediaFrame.VideoDetails = media.view.MediaFrame.MediaDetails( 'video', { 2610 title : l10n.videoDetailsTitle, 2611 model: media.model.PostVideo, 2612 detailsView: media.view.VideoDetails, 2613 detailsController: media.controller.VideoDetails, 2614 replaceController: media.controller.ReplaceVideo, 2615 replaceTitle: l10n.videoReplaceTitle, 2616 cancelText: l10n.videoDetailsCancel 2617 } ); 2618 2499 2619 /** 2500 2620 * wp.media.view.Modal 2501 2621 * … … 5527 5647 } 5528 5648 }); 5529 5649 5530 media.view.ImageDetails = media.view.Settings.AttachmentDisplay.extend({ 5531 className: 'image-details', 5532 template: media.template('image-details'), 5650 media.view.MediaDetails = function (type) { 5651 return media.view.Settings.AttachmentDisplay.extend({ 5652 className: type + '-details', 5653 template: media.template(type + '-details'), 5533 5654 5534 initialize: function() {5535 // used in AttachmentDisplay.prototype.updateLinkTo5536 this.options.attachment = this.model.attachment;5537 media.view.Settings.AttachmentDisplay.prototype.initialize.apply( this, arguments );5538 },5655 initialize: function() { 5656 // used in AttachmentDisplay.prototype.updateLinkTo 5657 this.options.attachment = this.model.attachment; 5658 media.view.Settings.AttachmentDisplay.prototype.initialize.apply( this, arguments ); 5659 }, 5539 5660 5540 prepare: function() {5541 var attachment = false;5661 prepare: function() { 5662 var attachment = false; 5542 5663 5543 if ( this.model.attachment ) {5544 attachment = this.model.attachment.toJSON();5545 }5546 return _.defaults({5547 model: this.model.toJSON(),5548 attachment: attachment5549 }, this.options );5550 },5664 if ( this.model.attachment ) { 5665 attachment = this.model.attachment.toJSON(); 5666 } 5667 return _.defaults({ 5668 model: this.model.toJSON(), 5669 attachment: attachment 5670 }, this.options ); 5671 }, 5551 5672 5673 render: function() { 5674 var self = this, 5675 args = arguments; 5676 if ( this.model.attachment && 'pending' === this.model.dfd.state() ) { 5677 // should instead show a spinner when the attachment is new and then add a listener that updates on change 5678 this.model.dfd.done( function() { 5679 media.view.Settings.AttachmentDisplay.prototype.render.apply( self, args ); 5680 self.resetFocus(); 5681 } ); 5682 } else { 5683 media.view.Settings.AttachmentDisplay.prototype.render.apply( this, arguments ); 5684 setTimeout( function() { self.resetFocus(); }, 10 ); 5685 } 5552 5686 5553 render: function() { 5554 var self = this, 5555 args = arguments; 5556 if ( this.model.attachment && 'pending' === this.model.dfd.state() ) { 5557 // should instead show a spinner when the attachment is new and then add a listener that updates on change 5558 this.model.dfd.done( function() { 5559 media.view.Settings.AttachmentDisplay.prototype.render.apply( self, args ); 5560 self.resetFocus(); 5561 } ); 5562 } else { 5563 media.view.Settings.AttachmentDisplay.prototype.render.apply( this, arguments ); 5564 setTimeout( function() { self.resetFocus(); }, 10 ); 5687 return this; 5688 }, 5689 5690 resetFocus: function() { 5691 this.$( '.caption textarea' ).focus(); 5692 this.$( '.embed-image-settings' ).scrollTop( 0 ); 5565 5693 } 5694 } ); 5695 }; 5566 5696 5567 return this; 5568 }, 5569 5570 resetFocus: function() { 5571 this.$( '.caption textarea' ).focus(); 5572 this.$( '.embed-image-settings' ).scrollTop( 0 ); 5573 } 5574 }); 5697 media.view.ImageDetails = media.view.MediaDetails('image'); 5698 media.view.AudioDetails = media.view.MediaDetails('audio'); 5699 media.view.VideoDetails = media.view.MediaDetails('video'); 5575 5700 }(jQuery)); -
src/wp-includes/js/tinymce/plugins/wpgallery/plugin.js
90 90 var shortcode = wp.media['video-playlist'].shortcode( selection ).string(); 91 91 editor.dom.setAttrib( node, 'data-wp-media', window.encodeURIComponent( shortcode ) ); 92 92 }); 93 } else if ( editor.dom.hasClass( node, 'wp-video' ) ) { 94 data = window.decodeURIComponent( editor.dom.getAttrib( node, 'data-wp-media' ) ); 95 frame = wp.media({ 96 frame: 'video', 97 state: 'video-details', 98 metadata: {} 99 } ); 100 frame.state('video-details').on( 'update', function () {} ); 101 frame.state('replace-video').on( 'replace', function () {} ); 102 103 frame.open(); 104 } else if ( editor.dom.hasClass( node, 'wp-audio' ) ) { 105 data = window.decodeURIComponent( editor.dom.getAttrib( node, 'data-wp-media' ) ); 106 frame = wp.media({ 107 frame: 'audio', 108 state: 'audio-details', 109 metadata: { 110 attachment_id: 102, 111 url: false, 112 height: '', 113 width: '', 114 size: 'none', 115 caption: '', 116 alt: '', 117 align: 'none', 118 link: false, 119 linkUrl: '' 120 } 121 } ); 122 frame.state('audio-details').on( 'update', function () {} ); 123 frame.state('replace-audio').on( 'replace', function () {} ); 124 125 frame.open(); 93 126 } else { 94 127 // temp 95 128 window.console && window.console.log( 'Edit AV shortcode ' + window.decodeURIComponent( editor.dom.getAttrib( node, 'data-wp-media' ) ) ); -
src/wp-includes/media-template.php
649 649 </div> 650 650 </div> 651 651 </script> 652 653 <script type="text/html" id="tmpl-audio-details"> 654 <?php // reusing .media-embed to pick up the styles for now ?> 655 <div class="media-embed"> 656 <div class="embed-image-settings"> 657 <div class="thumbnail"> 658 <img src="{{ data.model.url }}" draggable="false" /> 659 </div> 660 661 <div class="setting url"> 662 <?php // might want to make the url editable if it isn't an attachment ?> 663 <input type="text" disabled="disabled" value="{{ data.model.url }}" /> 664 </div> 665 666 <?php 667 /** This filter is documented in wp-admin/includes/media.php */ 668 if ( ! apply_filters( 'disable_captions', '' ) ) : ?> 669 <label class="setting caption"> 670 <span><?php _e('Caption'); ?></span> 671 <textarea data-setting="caption">{{ data.model.caption }}</textarea> 672 </label> 673 <?php endif; ?> 674 675 <label class="setting alt-text"> 676 <span><?php _e('Alt Text'); ?></span> 677 <input type="text" data-setting="alt" value="{{ data.model.alt }}" /> 678 </label> 679 680 <div class="setting align"> 681 <span><?php _e('Align'); ?></span> 682 <div class="button-group button-large" data-setting="align"> 683 <button class="button" value="left"> 684 <?php esc_attr_e('Left'); ?> 685 </button> 686 <button class="button" value="center"> 687 <?php esc_attr_e('Center'); ?> 688 </button> 689 <button class="button" value="right"> 690 <?php esc_attr_e('Right'); ?> 691 </button> 692 <button class="button active" value="none"> 693 <?php esc_attr_e('None'); ?> 694 </button> 695 </div> 696 </div> 697 <div class="setting link-to"> 698 <span><?php _e('Link To'); ?></span> 699 <div class="button-group button-large" data-setting="link"> 700 <# if ( data.attachment ) { #> 701 <button class="button" value="file"> 702 <?php esc_attr_e('Media File'); ?> 703 </button> 704 <button class="button" value="post"> 705 <?php esc_attr_e('Attachment Page'); ?> 706 </button> 707 <# } else { #> 708 <button class="button" value="file"> 709 <?php esc_attr_e('Image URL'); ?> 710 </button> 711 <# } #> 712 <button class="button" value="custom"> 713 <?php esc_attr_e('Custom URL'); ?> 714 </button> 715 <button class="button active" value="none"> 716 <?php esc_attr_e('None'); ?> 717 </button> 718 </div> 719 <input type="text" class="link-to-custom" data-setting="linkUrl" /> 720 </div> 721 722 <# if ( data.attachment ) { #> 723 <div class="setting size"> 724 <span><?php _e('Size'); ?></span> 725 <div class="button-group button-large" data-setting="size"> 726 <?php 727 /** This filter is documented in wp-admin/includes/media.php */ 728 $sizes = apply_filters( 'image_size_names_choose', array( 729 'thumbnail' => __('Thumbnail'), 730 'medium' => __('Medium'), 731 'large' => __('Large'), 732 'full' => __('Full Size'), 733 ) ); 734 735 foreach ( $sizes as $value => $name ) : ?> 736 <# var size = data.attachment.sizes['<?php echo esc_js( $value ); ?>']; 737 if ( size ) { #> 738 <button class="button" value="<?php echo esc_attr( $value ); ?>"> 739 <?php echo esc_html( $name ); ?> 740 </button> 741 <# } #> 742 <?php endforeach; ?> 743 </div> 744 </div> 745 <# } #> 746 </div> 747 </div> 748 </script> 749 750 <script type="text/html" id="tmpl-video-details"> 751 <?php // reusing .media-embed to pick up the styles for now ?> 752 <div class="media-embed"> 753 <div class="embed-image-settings"> 754 <div class="thumbnail"> 755 <img src="{{ data.model.url }}" draggable="false" /> 756 </div> 757 758 <div class="setting url"> 759 <?php // might want to make the url editable if it isn't an attachment ?> 760 <input type="text" disabled="disabled" value="{{ data.model.url }}" /> 761 </div> 762 763 <?php 764 /** This filter is documented in wp-admin/includes/media.php */ 765 if ( ! apply_filters( 'disable_captions', '' ) ) : ?> 766 <label class="setting caption"> 767 <span><?php _e('Caption'); ?></span> 768 <textarea data-setting="caption">{{ data.model.caption }}</textarea> 769 </label> 770 <?php endif; ?> 771 772 <label class="setting alt-text"> 773 <span><?php _e('Alt Text'); ?></span> 774 <input type="text" data-setting="alt" value="{{ data.model.alt }}" /> 775 </label> 776 777 <div class="setting align"> 778 <span><?php _e('Align'); ?></span> 779 <div class="button-group button-large" data-setting="align"> 780 <button class="button" value="left"> 781 <?php esc_attr_e('Left'); ?> 782 </button> 783 <button class="button" value="center"> 784 <?php esc_attr_e('Center'); ?> 785 </button> 786 <button class="button" value="right"> 787 <?php esc_attr_e('Right'); ?> 788 </button> 789 <button class="button active" value="none"> 790 <?php esc_attr_e('None'); ?> 791 </button> 792 </div> 793 </div> 794 <div class="setting link-to"> 795 <span><?php _e('Link To'); ?></span> 796 <div class="button-group button-large" data-setting="link"> 797 <# if ( data.attachment ) { #> 798 <button class="button" value="file"> 799 <?php esc_attr_e('Media File'); ?> 800 </button> 801 <button class="button" value="post"> 802 <?php esc_attr_e('Attachment Page'); ?> 803 </button> 804 <# } else { #> 805 <button class="button" value="file"> 806 <?php esc_attr_e('Image URL'); ?> 807 </button> 808 <# } #> 809 <button class="button" value="custom"> 810 <?php esc_attr_e('Custom URL'); ?> 811 </button> 812 <button class="button active" value="none"> 813 <?php esc_attr_e('None'); ?> 814 </button> 815 </div> 816 <input type="text" class="link-to-custom" data-setting="linkUrl" /> 817 </div> 818 819 <# if ( data.attachment ) { #> 820 <div class="setting size"> 821 <span><?php _e('Size'); ?></span> 822 <div class="button-group button-large" data-setting="size"> 823 <?php 824 /** This filter is documented in wp-admin/includes/media.php */ 825 $sizes = apply_filters( 'image_size_names_choose', array( 826 'thumbnail' => __('Thumbnail'), 827 'medium' => __('Medium'), 828 'large' => __('Large'), 829 'full' => __('Full Size'), 830 ) ); 831 832 foreach ( $sizes as $value => $name ) : ?> 833 <# var size = data.attachment.sizes['<?php echo esc_js( $value ); ?>']; 834 if ( size ) { #> 835 <button class="button" value="<?php echo esc_attr( $value ); ?>"> 836 <?php echo esc_html( $name ); ?> 837 </button> 838 <# } #> 839 <?php endforeach; ?> 840 </div> 841 </div> 842 <# } #> 843 </div> 844 </div> 845 </script> 652 846 <?php 653 847 654 848 /** -
src/wp-includes/media.php
2341 2341 'imageReplaceTitle' => __( 'Replace Image' ), 2342 2342 'imageDetailsCancel' => __( 'Cancel Edit' ), 2343 2343 2344 // Edit Image 2345 'audioDetailsTitle' => __( 'Audio Details' ), 2346 'audioReplaceTitle' => __( 'Replace Audio' ), 2347 'audioDetailsCancel' => __( 'Cancel Edit' ), 2348 2349 // Edit Image 2350 'videoDetailsTitle' => __( 'Video Details' ), 2351 'videoReplaceTitle' => __( 'Replace Video' ), 2352 'videoDetailsCancel' => __( 'Cancel Edit' ), 2353 2344 2354 // Playlist 2345 2355 'playlistDragInfo' => __( 'Drag and drop to reorder tracks.' ), 2346 2356 'createPlaylistTitle' => __( 'Create Playlist' ),