media-template.php 45 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272
  1. <?php
  2. /**
  3. * WordPress media templates.
  4. *
  5. * @package WordPress
  6. * @subpackage Media
  7. * @since 3.5.0
  8. */
  9. /**
  10. * Output the markup for a audio tag to be used in an Underscore template
  11. * when data.model is passed.
  12. *
  13. * @since 3.9.0
  14. */
  15. function wp_underscore_audio_template() {
  16. $audio_types = wp_get_audio_extensions();
  17. ?>
  18. <audio style="visibility: hidden"
  19. controls
  20. class="wp-audio-shortcode"
  21. width="{{ _.isUndefined( data.model.width ) ? 400 : data.model.width }}"
  22. preload="{{ _.isUndefined( data.model.preload ) ? 'none' : data.model.preload }}"
  23. <#
  24. <?php foreach ( array( 'autoplay', 'loop' ) as $attr ):
  25. ?>if ( ! _.isUndefined( data.model.<?php echo $attr ?> ) && data.model.<?php echo $attr ?> ) {
  26. #> <?php echo $attr ?><#
  27. }
  28. <?php endforeach ?>#>
  29. >
  30. <# if ( ! _.isEmpty( data.model.src ) ) { #>
  31. <source src="{{ data.model.src }}" type="{{ wp.media.view.settings.embedMimes[ data.model.src.split('.').pop() ] }}" />
  32. <# } #>
  33. <?php foreach ( $audio_types as $type ):
  34. ?><# if ( ! _.isEmpty( data.model.<?php echo $type ?> ) ) { #>
  35. <source src="{{ data.model.<?php echo $type ?> }}" type="{{ wp.media.view.settings.embedMimes[ '<?php echo $type ?>' ] }}" />
  36. <# } #>
  37. <?php endforeach;
  38. ?></audio>
  39. <?php
  40. }
  41. /**
  42. * Output the markup for a video tag to be used in an Underscore template
  43. * when data.model is passed.
  44. *
  45. * @since 3.9.0
  46. */
  47. function wp_underscore_video_template() {
  48. $video_types = wp_get_video_extensions();
  49. ?>
  50. <# var w_rule = '', classes = [],
  51. w, h, settings = wp.media.view.settings,
  52. isYouTube = isVimeo = false;
  53. if ( ! _.isEmpty( data.model.src ) ) {
  54. isYouTube = data.model.src.match(/youtube|youtu\.be/);
  55. isVimeo = -1 !== data.model.src.indexOf('vimeo');
  56. }
  57. if ( settings.contentWidth && data.model.width >= settings.contentWidth ) {
  58. w = settings.contentWidth;
  59. } else {
  60. w = data.model.width;
  61. }
  62. if ( w !== data.model.width ) {
  63. h = Math.ceil( ( data.model.height * w ) / data.model.width );
  64. } else {
  65. h = data.model.height;
  66. }
  67. if ( w ) {
  68. w_rule = 'width: ' + w + 'px; ';
  69. }
  70. if ( isYouTube ) {
  71. classes.push( 'youtube-video' );
  72. }
  73. if ( isVimeo ) {
  74. classes.push( 'vimeo-video' );
  75. }
  76. #>
  77. <div style="{{ w_rule }}" class="wp-video">
  78. <video controls
  79. class="wp-video-shortcode {{ classes.join( ' ' ) }}"
  80. <# if ( w ) { #>width="{{ w }}"<# } #>
  81. <# if ( h ) { #>height="{{ h }}"<# } #>
  82. <?php
  83. $props = array( 'poster' => '', 'preload' => 'metadata' );
  84. foreach ( $props as $key => $value ):
  85. if ( empty( $value ) ) {
  86. ?><#
  87. if ( ! _.isUndefined( data.model.<?php echo $key ?> ) && data.model.<?php echo $key ?> ) {
  88. #> <?php echo $key ?>="{{ data.model.<?php echo $key ?> }}"<#
  89. } #>
  90. <?php } else {
  91. echo $key ?>="{{ _.isUndefined( data.model.<?php echo $key ?> ) ? '<?php echo $value ?>' : data.model.<?php echo $key ?> }}"<?php
  92. }
  93. endforeach;
  94. ?><#
  95. <?php foreach ( array( 'autoplay', 'loop' ) as $attr ):
  96. ?> if ( ! _.isUndefined( data.model.<?php echo $attr ?> ) && data.model.<?php echo $attr ?> ) {
  97. #> <?php echo $attr ?><#
  98. }
  99. <?php endforeach ?>#>
  100. >
  101. <# if ( ! _.isEmpty( data.model.src ) ) {
  102. if ( isYouTube ) { #>
  103. <source src="{{ data.model.src }}" type="video/youtube" />
  104. <# } else if ( isVimeo ) { #>
  105. <source src="{{ data.model.src }}" type="video/vimeo" />
  106. <# } else { #>
  107. <source src="{{ data.model.src }}" type="{{ settings.embedMimes[ data.model.src.split('.').pop() ] }}" />
  108. <# }
  109. } #>
  110. <?php foreach ( $video_types as $type ):
  111. ?><# if ( data.model.<?php echo $type ?> ) { #>
  112. <source src="{{ data.model.<?php echo $type ?> }}" type="{{ settings.embedMimes[ '<?php echo $type ?>' ] }}" />
  113. <# } #>
  114. <?php endforeach; ?>
  115. {{{ data.model.content }}}
  116. </video>
  117. </div>
  118. <?php
  119. }
  120. /**
  121. * Prints the templates used in the media manager.
  122. *
  123. * @since 3.5.0
  124. *
  125. * @global bool $is_IE
  126. */
  127. function wp_print_media_templates() {
  128. global $is_IE;
  129. $class = 'media-modal wp-core-ui';
  130. if ( $is_IE && strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE 7') !== false )
  131. $class .= ' ie7';
  132. ?>
  133. <!--[if lte IE 8]>
  134. <style>
  135. .attachment:focus {
  136. outline: #1e8cbe solid;
  137. }
  138. .selected.attachment {
  139. outline: #1e8cbe solid;
  140. }
  141. </style>
  142. <![endif]-->
  143. <script type="text/html" id="tmpl-media-frame">
  144. <div class="media-frame-menu"></div>
  145. <div class="media-frame-title"></div>
  146. <div class="media-frame-router"></div>
  147. <div class="media-frame-content"></div>
  148. <div class="media-frame-toolbar"></div>
  149. <div class="media-frame-uploader"></div>
  150. </script>
  151. <script type="text/html" id="tmpl-media-modal">
  152. <div tabindex="0" class="<?php echo $class; ?>">
  153. <button type="button" class="media-modal-close"><span class="media-modal-icon"><span class="screen-reader-text"><?php _e( 'Close media panel' ); ?></span></span></button>
  154. <div class="media-modal-content"></div>
  155. </div>
  156. <div class="media-modal-backdrop"></div>
  157. </script>
  158. <script type="text/html" id="tmpl-uploader-window">
  159. <div class="uploader-window-content">
  160. <h1><?php _e( 'Drop files to upload' ); ?></h1>
  161. </div>
  162. </script>
  163. <script type="text/html" id="tmpl-uploader-editor">
  164. <div class="uploader-editor-content">
  165. <div class="uploader-editor-title"><?php _e( 'Drop files to upload' ); ?></div>
  166. </div>
  167. </script>
  168. <script type="text/html" id="tmpl-uploader-inline">
  169. <# var messageClass = data.message ? 'has-upload-message' : 'no-upload-message'; #>
  170. <# if ( data.canClose ) { #>
  171. <button class="close dashicons dashicons-no"><span class="screen-reader-text"><?php _e( 'Close uploader' ); ?></span></button>
  172. <# } #>
  173. <div class="uploader-inline-content {{ messageClass }}">
  174. <# if ( data.message ) { #>
  175. <h2 class="upload-message">{{ data.message }}</h2>
  176. <# } #>
  177. <?php if ( ! _device_can_upload() ) : ?>
  178. <h2 class="upload-instructions"><?php printf( __( 'The web browser on your device cannot be used to upload files. You may be able to use the <a href="%s">native app for your device</a> instead.' ), 'https://apps.wordpress.org/' ); ?></h2>
  179. <?php elseif ( is_multisite() && ! is_upload_space_available() ) : ?>
  180. <h2 class="upload-instructions"><?php _e( 'Upload Limit Exceeded' ); ?></h2>
  181. <?php
  182. /** This action is documented in wp-admin/includes/media.php */
  183. do_action( 'upload_ui_over_quota' ); ?>
  184. <?php else : ?>
  185. <div class="upload-ui">
  186. <h2 class="upload-instructions drop-instructions"><?php _e( 'Drop files anywhere to upload' ); ?></h2>
  187. <p class="upload-instructions drop-instructions"><?php _ex( 'or', 'Uploader: Drop files here - or - Select Files' ); ?></p>
  188. <button type="button" class="browser button button-hero"><?php _e( 'Select Files' ); ?></button>
  189. </div>
  190. <div class="upload-inline-status"></div>
  191. <div class="post-upload-ui">
  192. <?php
  193. /** This action is documented in wp-admin/includes/media.php */
  194. do_action( 'pre-upload-ui' );
  195. /** This action is documented in wp-admin/includes/media.php */
  196. do_action( 'pre-plupload-upload-ui' );
  197. if ( 10 === remove_action( 'post-plupload-upload-ui', 'media_upload_flash_bypass' ) ) {
  198. /** This action is documented in wp-admin/includes/media.php */
  199. do_action( 'post-plupload-upload-ui' );
  200. add_action( 'post-plupload-upload-ui', 'media_upload_flash_bypass' );
  201. } else {
  202. /** This action is documented in wp-admin/includes/media.php */
  203. do_action( 'post-plupload-upload-ui' );
  204. }
  205. $max_upload_size = wp_max_upload_size();
  206. if ( ! $max_upload_size ) {
  207. $max_upload_size = 0;
  208. }
  209. ?>
  210. <p class="max-upload-size"><?php
  211. printf( __( 'Maximum upload file size: %s.' ), esc_html( size_format( $max_upload_size ) ) );
  212. ?></p>
  213. <# if ( data.suggestedWidth && data.suggestedHeight ) { #>
  214. <p class="suggested-dimensions">
  215. <?php
  216. /* translators: 1: suggested width number, 2: suggested height number. */
  217. printf( __( 'Suggested image dimensions: %1$s by %2$s pixels.' ), '{{data.suggestedWidth}}', '{{data.suggestedHeight}}' );
  218. ?>
  219. </p>
  220. <# } #>
  221. <?php
  222. /** This action is documented in wp-admin/includes/media.php */
  223. do_action( 'post-upload-ui' ); ?>
  224. </div>
  225. <?php endif; ?>
  226. </div>
  227. </script>
  228. <script type="text/html" id="tmpl-media-library-view-switcher">
  229. <a href="<?php echo esc_url( add_query_arg( 'mode', 'list', $_SERVER['REQUEST_URI'] ) ) ?>" class="view-list">
  230. <span class="screen-reader-text"><?php _e( 'List View' ); ?></span>
  231. </a>
  232. <a href="<?php echo esc_url( add_query_arg( 'mode', 'grid', $_SERVER['REQUEST_URI'] ) ) ?>" class="view-grid current">
  233. <span class="screen-reader-text"><?php _e( 'Grid View' ); ?></span>
  234. </a>
  235. </script>
  236. <script type="text/html" id="tmpl-uploader-status">
  237. <h2><?php _e( 'Uploading' ); ?></h2>
  238. <button type="button" class="button-link upload-dismiss-errors"><span class="screen-reader-text"><?php _e( 'Dismiss Errors' ); ?></span></button>
  239. <div class="media-progress-bar"><div></div></div>
  240. <div class="upload-details">
  241. <span class="upload-count">
  242. <span class="upload-index"></span> / <span class="upload-total"></span>
  243. </span>
  244. <span class="upload-detail-separator">&ndash;</span>
  245. <span class="upload-filename"></span>
  246. </div>
  247. <div class="upload-errors"></div>
  248. </script>
  249. <script type="text/html" id="tmpl-uploader-status-error">
  250. <span class="upload-error-filename">{{{ data.filename }}}</span>
  251. <span class="upload-error-message">{{ data.message }}</span>
  252. </script>
  253. <script type="text/html" id="tmpl-edit-attachment-frame">
  254. <div class="edit-media-header">
  255. <button class="left dashicons <# if ( ! data.hasPrevious ) { #> disabled <# } #>"><span class="screen-reader-text"><?php _e( 'Edit previous media item' ); ?></span></button>
  256. <button class="right dashicons <# if ( ! data.hasNext ) { #> disabled <# } #>"><span class="screen-reader-text"><?php _e( 'Edit next media item' ); ?></span></button>
  257. </div>
  258. <div class="media-frame-title"></div>
  259. <div class="media-frame-content"></div>
  260. </script>
  261. <script type="text/html" id="tmpl-attachment-details-two-column">
  262. <div class="attachment-media-view {{ data.orientation }}">
  263. <div class="thumbnail thumbnail-{{ data.type }}">
  264. <# if ( data.uploading ) { #>
  265. <div class="media-progress-bar"><div></div></div>
  266. <# } else if ( data.sizes && data.sizes.large ) { #>
  267. <img class="details-image" src="{{ data.sizes.large.url }}" draggable="false" alt="" />
  268. <# } else if ( data.sizes && data.sizes.full ) { #>
  269. <img class="details-image" src="{{ data.sizes.full.url }}" draggable="false" alt="" />
  270. <# } else if ( -1 === jQuery.inArray( data.type, [ 'audio', 'video' ] ) ) { #>
  271. <img class="details-image icon" src="{{ data.icon }}" draggable="false" alt="" />
  272. <# } #>
  273. <# if ( 'audio' === data.type ) { #>
  274. <div class="wp-media-wrapper">
  275. <audio style="visibility: hidden" controls class="wp-audio-shortcode" width="100%" preload="none">
  276. <source type="{{ data.mime }}" src="{{ data.url }}"/>
  277. </audio>
  278. </div>
  279. <# } else if ( 'video' === data.type ) {
  280. var w_rule = '';
  281. if ( data.width ) {
  282. w_rule = 'width: ' + data.width + 'px;';
  283. } else if ( wp.media.view.settings.contentWidth ) {
  284. w_rule = 'width: ' + wp.media.view.settings.contentWidth + 'px;';
  285. }
  286. #>
  287. <div style="{{ w_rule }}" class="wp-media-wrapper wp-video">
  288. <video controls="controls" class="wp-video-shortcode" preload="metadata"
  289. <# if ( data.width ) { #>width="{{ data.width }}"<# } #>
  290. <# if ( data.height ) { #>height="{{ data.height }}"<# } #>
  291. <# if ( data.image && data.image.src !== data.icon ) { #>poster="{{ data.image.src }}"<# } #>>
  292. <source type="{{ data.mime }}" src="{{ data.url }}"/>
  293. </video>
  294. </div>
  295. <# } #>
  296. <div class="attachment-actions">
  297. <# if ( 'image' === data.type && ! data.uploading && data.sizes && data.can.save ) { #>
  298. <button type="button" class="button edit-attachment"><?php _e( 'Edit Image' ); ?></button>
  299. <# } else if ( 'pdf' === data.subtype && data.sizes ) { #>
  300. <?php _e( 'Document Preview' ); ?>
  301. <# } #>
  302. </div>
  303. </div>
  304. </div>
  305. <div class="attachment-info">
  306. <span class="settings-save-status">
  307. <span class="spinner"></span>
  308. <span class="saved"><?php esc_html_e('Saved.'); ?></span>
  309. </span>
  310. <div class="details">
  311. <div class="filename"><strong><?php _e( 'File name:' ); ?></strong> {{ data.filename }}</div>
  312. <div class="filename"><strong><?php _e( 'File type:' ); ?></strong> {{ data.mime }}</div>
  313. <div class="uploaded"><strong><?php _e( 'Uploaded on:' ); ?></strong> {{ data.dateFormatted }}</div>
  314. <div class="file-size"><strong><?php _e( 'File size:' ); ?></strong> {{ data.filesizeHumanReadable }}</div>
  315. <# if ( 'image' === data.type && ! data.uploading ) { #>
  316. <# if ( data.width && data.height ) { #>
  317. <div class="dimensions"><strong><?php _e( 'Dimensions:' ); ?></strong> {{ data.width }} &times; {{ data.height }}</div>
  318. <# } #>
  319. <# } #>
  320. <# if ( data.fileLength ) { #>
  321. <div class="file-length"><strong><?php _e( 'Length:' ); ?></strong> {{ data.fileLength }}</div>
  322. <# } #>
  323. <# if ( 'audio' === data.type && data.meta.bitrate ) { #>
  324. <div class="bitrate">
  325. <strong><?php _e( 'Bitrate:' ); ?></strong> {{ Math.round( data.meta.bitrate / 1000 ) }}kb/s
  326. <# if ( data.meta.bitrate_mode ) { #>
  327. {{ ' ' + data.meta.bitrate_mode.toUpperCase() }}
  328. <# } #>
  329. </div>
  330. <# } #>
  331. <div class="compat-meta">
  332. <# if ( data.compat && data.compat.meta ) { #>
  333. {{{ data.compat.meta }}}
  334. <# } #>
  335. </div>
  336. </div>
  337. <div class="settings">
  338. <label class="setting" data-setting="url">
  339. <span class="name"><?php _e('URL'); ?></span>
  340. <input type="text" value="{{ data.url }}" readonly />
  341. </label>
  342. <# var maybeReadOnly = data.can.save || data.allowLocalEdits ? '' : 'readonly'; #>
  343. <?php if ( post_type_supports( 'attachment', 'title' ) ) : ?>
  344. <label class="setting" data-setting="title">
  345. <span class="name"><?php _e('Title'); ?></span>
  346. <input type="text" value="{{ data.title }}" {{ maybeReadOnly }} />
  347. </label>
  348. <?php endif; ?>
  349. <# if ( 'audio' === data.type ) { #>
  350. <?php foreach ( array(
  351. 'artist' => __( 'Artist' ),
  352. 'album' => __( 'Album' ),
  353. ) as $key => $label ) : ?>
  354. <label class="setting" data-setting="<?php echo esc_attr( $key ) ?>">
  355. <span class="name"><?php echo $label ?></span>
  356. <input type="text" value="{{ data.<?php echo $key ?> || data.meta.<?php echo $key ?> || '' }}" />
  357. </label>
  358. <?php endforeach; ?>
  359. <# } #>
  360. <label class="setting" data-setting="caption">
  361. <span class="name"><?php _e( 'Caption' ); ?></span>
  362. <textarea {{ maybeReadOnly }}>{{ data.caption }}</textarea>
  363. </label>
  364. <# if ( 'image' === data.type ) { #>
  365. <label class="setting" data-setting="alt">
  366. <span class="name"><?php _e( 'Alt Text' ); ?></span>
  367. <input type="text" value="{{ data.alt }}" {{ maybeReadOnly }} />
  368. </label>
  369. <# } #>
  370. <label class="setting" data-setting="description">
  371. <span class="name"><?php _e('Description'); ?></span>
  372. <textarea {{ maybeReadOnly }}>{{ data.description }}</textarea>
  373. </label>
  374. <label class="setting">
  375. <span class="name"><?php _e( 'Uploaded By' ); ?></span>
  376. <span class="value">{{ data.authorName }}</span>
  377. </label>
  378. <# if ( data.uploadedToTitle ) { #>
  379. <label class="setting">
  380. <span class="name"><?php _e( 'Uploaded To' ); ?></span>
  381. <# if ( data.uploadedToLink ) { #>
  382. <span class="value"><a href="{{ data.uploadedToLink }}">{{ data.uploadedToTitle }}</a></span>
  383. <# } else { #>
  384. <span class="value">{{ data.uploadedToTitle }}</span>
  385. <# } #>
  386. </label>
  387. <# } #>
  388. <div class="attachment-compat"></div>
  389. </div>
  390. <div class="actions">
  391. <a class="view-attachment" href="{{ data.link }}"><?php _e( 'View attachment page' ); ?></a>
  392. <# if ( data.can.save ) { #> |
  393. <a href="post.php?post={{ data.id }}&action=edit"><?php _e( 'Edit more details' ); ?></a>
  394. <# } #>
  395. <# if ( ! data.uploading && data.can.remove ) { #> |
  396. <?php if ( MEDIA_TRASH ): ?>
  397. <# if ( 'trash' === data.status ) { #>
  398. <button type="button" class="button-link untrash-attachment"><?php _e( 'Untrash' ); ?></button>
  399. <# } else { #>
  400. <button type="button" class="button-link trash-attachment"><?php _ex( 'Trash', 'verb' ); ?></button>
  401. <# } #>
  402. <?php else: ?>
  403. <button type="button" class="button-link delete-attachment"><?php _e( 'Delete Permanently' ); ?></button>
  404. <?php endif; ?>
  405. <# } #>
  406. </div>
  407. </div>
  408. </script>
  409. <script type="text/html" id="tmpl-attachment">
  410. <div class="attachment-preview js--select-attachment type-{{ data.type }} subtype-{{ data.subtype }} {{ data.orientation }}">
  411. <div class="thumbnail">
  412. <# if ( data.uploading ) { #>
  413. <div class="media-progress-bar"><div style="width: {{ data.percent }}%"></div></div>
  414. <# } else if ( 'image' === data.type && data.sizes ) { #>
  415. <div class="centered">
  416. <img src="{{ data.size.url }}" draggable="false" alt="" />
  417. </div>
  418. <# } else { #>
  419. <div class="centered">
  420. <# if ( data.image && data.image.src && data.image.src !== data.icon ) { #>
  421. <img src="{{ data.image.src }}" class="thumbnail" draggable="false" alt="" />
  422. <# } else if ( data.sizes && data.sizes.medium ) { #>
  423. <img src="{{ data.sizes.medium.url }}" class="thumbnail" draggable="false" alt="" />
  424. <# } else { #>
  425. <img src="{{ data.icon }}" class="icon" draggable="false" alt="" />
  426. <# } #>
  427. </div>
  428. <div class="filename">
  429. <div>{{ data.filename }}</div>
  430. </div>
  431. <# } #>
  432. </div>
  433. <# if ( data.buttons.close ) { #>
  434. <button type="button" class="button-link attachment-close media-modal-icon"><span class="screen-reader-text"><?php _e( 'Remove' ); ?></span></button>
  435. <# } #>
  436. </div>
  437. <# if ( data.buttons.check ) { #>
  438. <button type="button" class="check" tabindex="-1"><span class="media-modal-icon"></span><span class="screen-reader-text"><?php _e( 'Deselect' ); ?></span></button>
  439. <# } #>
  440. <#
  441. var maybeReadOnly = data.can.save || data.allowLocalEdits ? '' : 'readonly';
  442. if ( data.describe ) {
  443. if ( 'image' === data.type ) { #>
  444. <input type="text" value="{{ data.caption }}" class="describe" data-setting="caption"
  445. placeholder="<?php esc_attr_e('Caption this image&hellip;'); ?>" {{ maybeReadOnly }} />
  446. <# } else { #>
  447. <input type="text" value="{{ data.title }}" class="describe" data-setting="title"
  448. <# if ( 'video' === data.type ) { #>
  449. placeholder="<?php esc_attr_e('Describe this video&hellip;'); ?>"
  450. <# } else if ( 'audio' === data.type ) { #>
  451. placeholder="<?php esc_attr_e('Describe this audio file&hellip;'); ?>"
  452. <# } else { #>
  453. placeholder="<?php esc_attr_e('Describe this media file&hellip;'); ?>"
  454. <# } #> {{ maybeReadOnly }} />
  455. <# }
  456. } #>
  457. </script>
  458. <script type="text/html" id="tmpl-attachment-details">
  459. <h2>
  460. <?php _e( 'Attachment Details' ); ?>
  461. <span class="settings-save-status">
  462. <span class="spinner"></span>
  463. <span class="saved"><?php esc_html_e('Saved.'); ?></span>
  464. </span>
  465. </h2>
  466. <div class="attachment-info">
  467. <div class="thumbnail thumbnail-{{ data.type }}">
  468. <# if ( data.uploading ) { #>
  469. <div class="media-progress-bar"><div></div></div>
  470. <# } else if ( 'image' === data.type && data.sizes ) { #>
  471. <img src="{{ data.size.url }}" draggable="false" alt="" />
  472. <# } else { #>
  473. <img src="{{ data.icon }}" class="icon" draggable="false" alt="" />
  474. <# } #>
  475. </div>
  476. <div class="details">
  477. <div class="filename">{{ data.filename }}</div>
  478. <div class="uploaded">{{ data.dateFormatted }}</div>
  479. <div class="file-size">{{ data.filesizeHumanReadable }}</div>
  480. <# if ( 'image' === data.type && ! data.uploading ) { #>
  481. <# if ( data.width && data.height ) { #>
  482. <div class="dimensions">{{ data.width }} &times; {{ data.height }}</div>
  483. <# } #>
  484. <# if ( data.can.save && data.sizes ) { #>
  485. <a class="edit-attachment" href="{{ data.editLink }}&amp;image-editor" target="_blank"><?php _e( 'Edit Image' ); ?></a>
  486. <# } #>
  487. <# } #>
  488. <# if ( data.fileLength ) { #>
  489. <div class="file-length"><?php _e( 'Length:' ); ?> {{ data.fileLength }}</div>
  490. <# } #>
  491. <# if ( ! data.uploading && data.can.remove ) { #>
  492. <?php if ( MEDIA_TRASH ): ?>
  493. <# if ( 'trash' === data.status ) { #>
  494. <button type="button" class="button-link untrash-attachment"><?php _e( 'Untrash' ); ?></button>
  495. <# } else { #>
  496. <button type="button" class="button-link trash-attachment"><?php _ex( 'Trash', 'verb' ); ?></button>
  497. <# } #>
  498. <?php else: ?>
  499. <button type="button" class="button-link delete-attachment"><?php _e( 'Delete Permanently' ); ?></button>
  500. <?php endif; ?>
  501. <# } #>
  502. <div class="compat-meta">
  503. <# if ( data.compat && data.compat.meta ) { #>
  504. {{{ data.compat.meta }}}
  505. <# } #>
  506. </div>
  507. </div>
  508. </div>
  509. <label class="setting" data-setting="url">
  510. <span class="name"><?php _e('URL'); ?></span>
  511. <input type="text" value="{{ data.url }}" readonly />
  512. </label>
  513. <# var maybeReadOnly = data.can.save || data.allowLocalEdits ? '' : 'readonly'; #>
  514. <?php if ( post_type_supports( 'attachment', 'title' ) ) : ?>
  515. <label class="setting" data-setting="title">
  516. <span class="name"><?php _e('Title'); ?></span>
  517. <input type="text" value="{{ data.title }}" {{ maybeReadOnly }} />
  518. </label>
  519. <?php endif; ?>
  520. <# if ( 'audio' === data.type ) { #>
  521. <?php foreach ( array(
  522. 'artist' => __( 'Artist' ),
  523. 'album' => __( 'Album' ),
  524. ) as $key => $label ) : ?>
  525. <label class="setting" data-setting="<?php echo esc_attr( $key ) ?>">
  526. <span class="name"><?php echo $label ?></span>
  527. <input type="text" value="{{ data.<?php echo $key ?> || data.meta.<?php echo $key ?> || '' }}" />
  528. </label>
  529. <?php endforeach; ?>
  530. <# } #>
  531. <label class="setting" data-setting="caption">
  532. <span class="name"><?php _e('Caption'); ?></span>
  533. <textarea {{ maybeReadOnly }}>{{ data.caption }}</textarea>
  534. </label>
  535. <# if ( 'image' === data.type ) { #>
  536. <label class="setting" data-setting="alt">
  537. <span class="name"><?php _e('Alt Text'); ?></span>
  538. <input type="text" value="{{ data.alt }}" {{ maybeReadOnly }} />
  539. </label>
  540. <# } #>
  541. <label class="setting" data-setting="description">
  542. <span class="name"><?php _e('Description'); ?></span>
  543. <textarea {{ maybeReadOnly }}>{{ data.description }}</textarea>
  544. </label>
  545. </script>
  546. <script type="text/html" id="tmpl-media-selection">
  547. <div class="selection-info">
  548. <span class="count"></span>
  549. <# if ( data.editable ) { #>
  550. <button type="button" class="button-link edit-selection"><?php _e( 'Edit Selection' ); ?></button>
  551. <# } #>
  552. <# if ( data.clearable ) { #>
  553. <button type="button" class="button-link clear-selection"><?php _e( 'Clear' ); ?></button>
  554. <# } #>
  555. </div>
  556. <div class="selection-view"></div>
  557. </script>
  558. <script type="text/html" id="tmpl-attachment-display-settings">
  559. <h2><?php _e( 'Attachment Display Settings' ); ?></h2>
  560. <# if ( 'image' === data.type ) { #>
  561. <label class="setting align">
  562. <span><?php _e('Alignment'); ?></span>
  563. <select class="alignment"
  564. data-setting="align"
  565. <# if ( data.userSettings ) { #>
  566. data-user-setting="align"
  567. <# } #>>
  568. <option value="left">
  569. <?php esc_html_e( 'Left' ); ?>
  570. </option>
  571. <option value="center">
  572. <?php esc_html_e( 'Center' ); ?>
  573. </option>
  574. <option value="right">
  575. <?php esc_html_e( 'Right' ); ?>
  576. </option>
  577. <option value="none" selected>
  578. <?php esc_html_e( 'None' ); ?>
  579. </option>
  580. </select>
  581. </label>
  582. <# } #>
  583. <div class="setting">
  584. <label>
  585. <# if ( data.model.canEmbed ) { #>
  586. <span><?php _e('Embed or Link'); ?></span>
  587. <# } else { #>
  588. <span><?php _e('Link To'); ?></span>
  589. <# } #>
  590. <select class="link-to"
  591. data-setting="link"
  592. <# if ( data.userSettings && ! data.model.canEmbed ) { #>
  593. data-user-setting="urlbutton"
  594. <# } #>>
  595. <# if ( data.model.canEmbed ) { #>
  596. <option value="embed" selected>
  597. <?php esc_html_e( 'Embed Media Player' ); ?>
  598. </option>
  599. <option value="file">
  600. <# } else { #>
  601. <option value="none" selected>
  602. <?php esc_html_e( 'None' ); ?>
  603. </option>
  604. <option value="file">
  605. <# } #>
  606. <# if ( data.model.canEmbed ) { #>
  607. <?php esc_html_e( 'Link to Media File' ); ?>
  608. <# } else { #>
  609. <?php esc_html_e( 'Media File' ); ?>
  610. <# } #>
  611. </option>
  612. <option value="post">
  613. <# if ( data.model.canEmbed ) { #>
  614. <?php esc_html_e( 'Link to Attachment Page' ); ?>
  615. <# } else { #>
  616. <?php esc_html_e( 'Attachment Page' ); ?>
  617. <# } #>
  618. </option>
  619. <# if ( 'image' === data.type ) { #>
  620. <option value="custom">
  621. <?php esc_html_e( 'Custom URL' ); ?>
  622. </option>
  623. <# } #>
  624. </select>
  625. </label>
  626. <input type="text" class="link-to-custom" data-setting="linkUrl" />
  627. </div>
  628. <# if ( 'undefined' !== typeof data.sizes ) { #>
  629. <label class="setting">
  630. <span><?php _e('Size'); ?></span>
  631. <select class="size" name="size"
  632. data-setting="size"
  633. <# if ( data.userSettings ) { #>
  634. data-user-setting="imgsize"
  635. <# } #>>
  636. <?php
  637. /** This filter is documented in wp-admin/includes/media.php */
  638. $sizes = apply_filters( 'image_size_names_choose', array(
  639. 'thumbnail' => __('Thumbnail'),
  640. 'medium' => __('Medium'),
  641. 'large' => __('Large'),
  642. 'full' => __('Full Size'),
  643. ) );
  644. foreach ( $sizes as $value => $name ) : ?>
  645. <#
  646. var size = data.sizes['<?php echo esc_js( $value ); ?>'];
  647. if ( size ) { #>
  648. <option value="<?php echo esc_attr( $value ); ?>" <?php selected( $value, 'full' ); ?>>
  649. <?php echo esc_html( $name ); ?> &ndash; {{ size.width }} &times; {{ size.height }}
  650. </option>
  651. <# } #>
  652. <?php endforeach; ?>
  653. </select>
  654. </label>
  655. <# } #>
  656. </script>
  657. <script type="text/html" id="tmpl-gallery-settings">
  658. <h2><?php _e( 'Gallery Settings' ); ?></h2>
  659. <label class="setting">
  660. <span><?php _e('Link To'); ?></span>
  661. <select class="link-to"
  662. data-setting="link"
  663. <# if ( data.userSettings ) { #>
  664. data-user-setting="urlbutton"
  665. <# } #>>
  666. <option value="post" <# if ( ! wp.media.galleryDefaults.link || 'post' == wp.media.galleryDefaults.link ) {
  667. #>selected="selected"<# }
  668. #>>
  669. <?php esc_html_e( 'Attachment Page' ); ?>
  670. </option>
  671. <option value="file" <# if ( 'file' == wp.media.galleryDefaults.link ) { #>selected="selected"<# } #>>
  672. <?php esc_html_e( 'Media File' ); ?>
  673. </option>
  674. <option value="none" <# if ( 'none' == wp.media.galleryDefaults.link ) { #>selected="selected"<# } #>>
  675. <?php esc_html_e( 'None' ); ?>
  676. </option>
  677. </select>
  678. </label>
  679. <label class="setting">
  680. <span><?php _e('Columns'); ?></span>
  681. <select class="columns" name="columns"
  682. data-setting="columns">
  683. <?php for ( $i = 1; $i <= 9; $i++ ) : ?>
  684. <option value="<?php echo esc_attr( $i ); ?>" <#
  685. if ( <?php echo $i ?> == wp.media.galleryDefaults.columns ) { #>selected="selected"<# }
  686. #>>
  687. <?php echo esc_html( $i ); ?>
  688. </option>
  689. <?php endfor; ?>
  690. </select>
  691. </label>
  692. <label class="setting">
  693. <span><?php _e( 'Random Order' ); ?></span>
  694. <input type="checkbox" data-setting="_orderbyRandom" />
  695. </label>
  696. <label class="setting size">
  697. <span><?php _e( 'Size' ); ?></span>
  698. <select class="size" name="size"
  699. data-setting="size"
  700. <# if ( data.userSettings ) { #>
  701. data-user-setting="imgsize"
  702. <# } #>
  703. >
  704. <?php
  705. /** This filter is documented in wp-admin/includes/media.php */
  706. $size_names = apply_filters( 'image_size_names_choose', array(
  707. 'thumbnail' => __( 'Thumbnail' ),
  708. 'medium' => __( 'Medium' ),
  709. 'large' => __( 'Large' ),
  710. 'full' => __( 'Full Size' ),
  711. ) );
  712. foreach ( $size_names as $size => $label ) : ?>
  713. <option value="<?php echo esc_attr( $size ); ?>">
  714. <?php echo esc_html( $label ); ?>
  715. </option>
  716. <?php endforeach; ?>
  717. </select>
  718. </label>
  719. </script>
  720. <script type="text/html" id="tmpl-playlist-settings">
  721. <h2><?php _e( 'Playlist Settings' ); ?></h2>
  722. <# var emptyModel = _.isEmpty( data.model ),
  723. isVideo = 'video' === data.controller.get('library').props.get('type'); #>
  724. <label class="setting">
  725. <input type="checkbox" data-setting="tracklist" <# if ( emptyModel ) { #>
  726. checked="checked"
  727. <# } #> />
  728. <# if ( isVideo ) { #>
  729. <span><?php _e( 'Show Video List' ); ?></span>
  730. <# } else { #>
  731. <span><?php _e( 'Show Tracklist' ); ?></span>
  732. <# } #>
  733. </label>
  734. <# if ( ! isVideo ) { #>
  735. <label class="setting">
  736. <input type="checkbox" data-setting="artists" <# if ( emptyModel ) { #>
  737. checked="checked"
  738. <# } #> />
  739. <span><?php _e( 'Show Artist Name in Tracklist' ); ?></span>
  740. </label>
  741. <# } #>
  742. <label class="setting">
  743. <input type="checkbox" data-setting="images" <# if ( emptyModel ) { #>
  744. checked="checked"
  745. <# } #> />
  746. <span><?php _e( 'Show Images' ); ?></span>
  747. </label>
  748. </script>
  749. <script type="text/html" id="tmpl-embed-link-settings">
  750. <label class="setting link-text">
  751. <span><?php _e( 'Link Text' ); ?></span>
  752. <input type="text" class="alignment" data-setting="linkText" />
  753. </label>
  754. <div class="embed-container" style="display: none;">
  755. <div class="embed-preview"></div>
  756. </div>
  757. </script>
  758. <script type="text/html" id="tmpl-embed-image-settings">
  759. <div class="thumbnail">
  760. <img src="{{ data.model.url }}" draggable="false" alt="" />
  761. </div>
  762. <?php
  763. /** This filter is documented in wp-admin/includes/media.php */
  764. if ( ! apply_filters( 'disable_captions', '' ) ) : ?>
  765. <label class="setting caption">
  766. <span><?php _e('Caption'); ?></span>
  767. <textarea data-setting="caption" />
  768. </label>
  769. <?php endif; ?>
  770. <label class="setting alt-text">
  771. <span><?php _e('Alt Text'); ?></span>
  772. <input type="text" data-setting="alt" />
  773. </label>
  774. <div class="setting align">
  775. <span><?php _e('Align'); ?></span>
  776. <div class="button-group button-large" data-setting="align">
  777. <button class="button" value="left">
  778. <?php esc_html_e( 'Left' ); ?>
  779. </button>
  780. <button class="button" value="center">
  781. <?php esc_html_e( 'Center' ); ?>
  782. </button>
  783. <button class="button" value="right">
  784. <?php esc_html_e( 'Right' ); ?>
  785. </button>
  786. <button class="button active" value="none">
  787. <?php esc_html_e( 'None' ); ?>
  788. </button>
  789. </div>
  790. </div>
  791. <div class="setting link-to">
  792. <span><?php _e('Link To'); ?></span>
  793. <div class="button-group button-large" data-setting="link">
  794. <button class="button" value="file">
  795. <?php esc_html_e( 'Image URL' ); ?>
  796. </button>
  797. <button class="button" value="custom">
  798. <?php esc_html_e( 'Custom URL' ); ?>
  799. </button>
  800. <button class="button active" value="none">
  801. <?php esc_html_e( 'None' ); ?>
  802. </button>
  803. </div>
  804. <input type="text" class="link-to-custom" data-setting="linkUrl" />
  805. </div>
  806. </script>
  807. <script type="text/html" id="tmpl-image-details">
  808. <div class="media-embed">
  809. <div class="embed-media-settings">
  810. <div class="column-image">
  811. <div class="image">
  812. <img src="{{ data.model.url }}" draggable="false" alt="" />
  813. <# if ( data.attachment && window.imageEdit ) { #>
  814. <div class="actions">
  815. <input type="button" class="edit-attachment button" value="<?php esc_attr_e( 'Edit Original' ); ?>" />
  816. <input type="button" class="replace-attachment button" value="<?php esc_attr_e( 'Replace' ); ?>" />
  817. </div>
  818. <# } #>
  819. </div>
  820. </div>
  821. <div class="column-settings">
  822. <?php
  823. /** This filter is documented in wp-admin/includes/media.php */
  824. if ( ! apply_filters( 'disable_captions', '' ) ) : ?>
  825. <label class="setting caption">
  826. <span><?php _e('Caption'); ?></span>
  827. <textarea data-setting="caption">{{ data.model.caption }}</textarea>
  828. </label>
  829. <?php endif; ?>
  830. <label class="setting alt-text">
  831. <span><?php _e('Alternative Text'); ?></span>
  832. <input type="text" data-setting="alt" value="{{ data.model.alt }}" />
  833. </label>
  834. <h2><?php _e( 'Display Settings' ); ?></h2>
  835. <div class="setting align">
  836. <span><?php _e('Align'); ?></span>
  837. <div class="button-group button-large" data-setting="align">
  838. <button class="button" value="left">
  839. <?php esc_html_e( 'Left' ); ?>
  840. </button>
  841. <button class="button" value="center">
  842. <?php esc_html_e( 'Center' ); ?>
  843. </button>
  844. <button class="button" value="right">
  845. <?php esc_html_e( 'Right' ); ?>
  846. </button>
  847. <button class="button active" value="none">
  848. <?php esc_html_e( 'None' ); ?>
  849. </button>
  850. </div>
  851. </div>
  852. <# if ( data.attachment ) { #>
  853. <# if ( 'undefined' !== typeof data.attachment.sizes ) { #>
  854. <label class="setting size">
  855. <span><?php _e('Size'); ?></span>
  856. <select class="size" name="size"
  857. data-setting="size"
  858. <# if ( data.userSettings ) { #>
  859. data-user-setting="imgsize"
  860. <# } #>>
  861. <?php
  862. /** This filter is documented in wp-admin/includes/media.php */
  863. $sizes = apply_filters( 'image_size_names_choose', array(
  864. 'thumbnail' => __('Thumbnail'),
  865. 'medium' => __('Medium'),
  866. 'large' => __('Large'),
  867. 'full' => __('Full Size'),
  868. ) );
  869. foreach ( $sizes as $value => $name ) : ?>
  870. <#
  871. var size = data.sizes['<?php echo esc_js( $value ); ?>'];
  872. if ( size ) { #>
  873. <option value="<?php echo esc_attr( $value ); ?>">
  874. <?php echo esc_html( $name ); ?> &ndash; {{ size.width }} &times; {{ size.height }}
  875. </option>
  876. <# } #>
  877. <?php endforeach; ?>
  878. <option value="<?php echo esc_attr( 'custom' ); ?>">
  879. <?php _e( 'Custom Size' ); ?>
  880. </option>
  881. </select>
  882. </label>
  883. <# } #>
  884. <div class="custom-size<# if ( data.model.size !== 'custom' ) { #> hidden<# } #>">
  885. <label><span><?php _e( 'Width' ); ?> <small>(px)</small></span> <input data-setting="customWidth" type="number" step="1" value="{{ data.model.customWidth }}" /></label><span class="sep">&times;</span><label><span><?php _e( 'Height' ); ?> <small>(px)</small></span><input data-setting="customHeight" type="number" step="1" value="{{ data.model.customHeight }}" /></label>
  886. </div>
  887. <# } #>
  888. <div class="setting link-to">
  889. <span><?php _e('Link To'); ?></span>
  890. <select data-setting="link">
  891. <# if ( data.attachment ) { #>
  892. <option value="file">
  893. <?php esc_html_e( 'Media File' ); ?>
  894. </option>
  895. <option value="post">
  896. <?php esc_html_e( 'Attachment Page' ); ?>
  897. </option>
  898. <# } else { #>
  899. <option value="file">
  900. <?php esc_html_e( 'Image URL' ); ?>
  901. </option>
  902. <# } #>
  903. <option value="custom">
  904. <?php esc_html_e( 'Custom URL' ); ?>
  905. </option>
  906. <option value="none">
  907. <?php esc_html_e( 'None' ); ?>
  908. </option>
  909. </select>
  910. <input type="text" class="link-to-custom" data-setting="linkUrl" />
  911. </div>
  912. <div class="advanced-section">
  913. <h2><button type="button" class="button-link advanced-toggle"><?php _e( 'Advanced Options' ); ?></button></h2>
  914. <div class="advanced-settings hidden">
  915. <div class="advanced-image">
  916. <label class="setting title-text">
  917. <span><?php _e('Image Title Attribute'); ?></span>
  918. <input type="text" data-setting="title" value="{{ data.model.title }}" />
  919. </label>
  920. <label class="setting extra-classes">
  921. <span><?php _e('Image CSS Class'); ?></span>
  922. <input type="text" data-setting="extraClasses" value="{{ data.model.extraClasses }}" />
  923. </label>
  924. </div>
  925. <div class="advanced-link">
  926. <div class="setting link-target">
  927. <label><input type="checkbox" data-setting="linkTargetBlank" value="_blank" <# if ( data.model.linkTargetBlank ) { #>checked="checked"<# } #>><?php _e( 'Open link in a new tab' ); ?></label>
  928. </div>
  929. <label class="setting link-rel">
  930. <span><?php _e('Link Rel'); ?></span>
  931. <input type="text" data-setting="linkRel" value="{{ data.model.linkRel }}" />
  932. </label>
  933. <label class="setting link-class-name">
  934. <span><?php _e('Link CSS Class'); ?></span>
  935. <input type="text" data-setting="linkClassName" value="{{ data.model.linkClassName }}" />
  936. </label>
  937. </div>
  938. </div>
  939. </div>
  940. </div>
  941. </div>
  942. </div>
  943. </script>
  944. <script type="text/html" id="tmpl-image-editor">
  945. <div id="media-head-{{ data.id }}"></div>
  946. <div id="image-editor-{{ data.id }}"></div>
  947. </script>
  948. <script type="text/html" id="tmpl-audio-details">
  949. <# var ext, html5types = {
  950. mp3: wp.media.view.settings.embedMimes.mp3,
  951. ogg: wp.media.view.settings.embedMimes.ogg
  952. }; #>
  953. <?php $audio_types = wp_get_audio_extensions(); ?>
  954. <div class="media-embed media-embed-details">
  955. <div class="embed-media-settings embed-audio-settings">
  956. <?php wp_underscore_audio_template() ?>
  957. <# if ( ! _.isEmpty( data.model.src ) ) {
  958. ext = data.model.src.split('.').pop();
  959. if ( html5types[ ext ] ) {
  960. delete html5types[ ext ];
  961. }
  962. #>
  963. <label class="setting">
  964. <span>SRC</span>
  965. <input type="text" disabled="disabled" data-setting="src" value="{{ data.model.src }}" />
  966. <button type="button" class="button-link remove-setting"><?php _e( 'Remove audio source' ); ?></button>
  967. </label>
  968. <# } #>
  969. <?php
  970. foreach ( $audio_types as $type ):
  971. ?><# if ( ! _.isEmpty( data.model.<?php echo $type ?> ) ) {
  972. if ( ! _.isUndefined( html5types.<?php echo $type ?> ) ) {
  973. delete html5types.<?php echo $type ?>;
  974. }
  975. #>
  976. <label class="setting">
  977. <span><?php echo strtoupper( $type ) ?></span>
  978. <input type="text" disabled="disabled" data-setting="<?php echo $type ?>" value="{{ data.model.<?php echo $type ?> }}" />
  979. <button type="button" class="button-link remove-setting"><?php _e( 'Remove audio source' ); ?></button>
  980. </label>
  981. <# } #>
  982. <?php endforeach ?>
  983. <# if ( ! _.isEmpty( html5types ) ) { #>
  984. <div class="setting">
  985. <span><?php _e( 'Add alternate sources for maximum HTML5 playback:' ) ?></span>
  986. <div class="button-large">
  987. <# _.each( html5types, function (mime, type) { #>
  988. <button class="button add-media-source" data-mime="{{ mime }}">{{ type }}</button>
  989. <# } ) #>
  990. </div>
  991. </div>
  992. <# } #>
  993. <div class="setting preload">
  994. <span><?php _e( 'Preload' ); ?></span>
  995. <div class="button-group button-large" data-setting="preload">
  996. <button class="button" value="auto"><?php _ex( 'Auto', 'auto preload' ); ?></button>
  997. <button class="button" value="metadata"><?php _e( 'Metadata' ); ?></button>
  998. <button class="button active" value="none"><?php _e( 'None' ); ?></button>
  999. </div>
  1000. </div>
  1001. <label class="setting checkbox-setting autoplay">
  1002. <input type="checkbox" data-setting="autoplay" />
  1003. <span><?php _e( 'Autoplay' ); ?></span>
  1004. </label>
  1005. <label class="setting checkbox-setting">
  1006. <input type="checkbox" data-setting="loop" />
  1007. <span><?php _e( 'Loop' ); ?></span>
  1008. </label>
  1009. </div>
  1010. </div>
  1011. </script>
  1012. <script type="text/html" id="tmpl-video-details">
  1013. <# var ext, html5types = {
  1014. mp4: wp.media.view.settings.embedMimes.mp4,
  1015. ogv: wp.media.view.settings.embedMimes.ogv,
  1016. webm: wp.media.view.settings.embedMimes.webm
  1017. }; #>
  1018. <?php $video_types = wp_get_video_extensions(); ?>
  1019. <div class="media-embed media-embed-details">
  1020. <div class="embed-media-settings embed-video-settings">
  1021. <div class="wp-video-holder">
  1022. <#
  1023. var w = ! data.model.width || data.model.width > 640 ? 640 : data.model.width,
  1024. h = ! data.model.height ? 360 : data.model.height;
  1025. if ( data.model.width && w !== data.model.width ) {
  1026. h = Math.ceil( ( h * w ) / data.model.width );
  1027. }
  1028. #>
  1029. <?php wp_underscore_video_template() ?>
  1030. <# if ( ! _.isEmpty( data.model.src ) ) {
  1031. ext = data.model.src.split('.').pop();
  1032. if ( html5types[ ext ] ) {
  1033. delete html5types[ ext ];
  1034. }
  1035. #>
  1036. <label class="setting">
  1037. <span>SRC</span>
  1038. <input type="text" disabled="disabled" data-setting="src" value="{{ data.model.src }}" />
  1039. <button type="button" class="button-link remove-setting"><?php _e( 'Remove video source' ); ?></button>
  1040. </label>
  1041. <# } #>
  1042. <?php foreach ( $video_types as $type ):
  1043. ?><# if ( ! _.isEmpty( data.model.<?php echo $type ?> ) ) {
  1044. if ( ! _.isUndefined( html5types.<?php echo $type ?> ) ) {
  1045. delete html5types.<?php echo $type ?>;
  1046. }
  1047. #>
  1048. <label class="setting">
  1049. <span><?php echo strtoupper( $type ) ?></span>
  1050. <input type="text" disabled="disabled" data-setting="<?php echo $type ?>" value="{{ data.model.<?php echo $type ?> }}" />
  1051. <button type="button" class="button-link remove-setting"><?php _e( 'Remove video source' ); ?></button>
  1052. </label>
  1053. <# } #>
  1054. <?php endforeach ?>
  1055. </div>
  1056. <# if ( ! _.isEmpty( html5types ) ) { #>
  1057. <div class="setting">
  1058. <span><?php _e( 'Add alternate sources for maximum HTML5 playback:' ); ?></span>
  1059. <div class="button-large">
  1060. <# _.each( html5types, function (mime, type) { #>
  1061. <button class="button add-media-source" data-mime="{{ mime }}">{{ type }}</button>
  1062. <# } ) #>
  1063. </div>
  1064. </div>
  1065. <# } #>
  1066. <# if ( ! _.isEmpty( data.model.poster ) ) { #>
  1067. <label class="setting">
  1068. <span><?php _e( 'Poster Image' ); ?></span>
  1069. <input type="text" disabled="disabled" data-setting="poster" value="{{ data.model.poster }}" />
  1070. <button type="button" class="button-link remove-setting"><?php _e( 'Remove poster image' ); ?></button>
  1071. </label>
  1072. <# } #>
  1073. <div class="setting preload">
  1074. <span><?php _e( 'Preload' ); ?></span>
  1075. <div class="button-group button-large" data-setting="preload">
  1076. <button class="button" value="auto"><?php _ex( 'Auto', 'auto preload' ); ?></button>
  1077. <button class="button" value="metadata"><?php _e( 'Metadata' ); ?></button>
  1078. <button class="button active" value="none"><?php _e( 'None' ); ?></button>
  1079. </div>
  1080. </div>
  1081. <label class="setting checkbox-setting autoplay">
  1082. <input type="checkbox" data-setting="autoplay" />
  1083. <span><?php _e( 'Autoplay' ); ?></span>
  1084. </label>
  1085. <label class="setting checkbox-setting">
  1086. <input type="checkbox" data-setting="loop" />
  1087. <span><?php _e( 'Loop' ); ?></span>
  1088. </label>
  1089. <label class="setting" data-setting="content">
  1090. <span><?php _e( 'Tracks (subtitles, captions, descriptions, chapters, or metadata)' ); ?></span>
  1091. <#
  1092. var content = '';
  1093. if ( ! _.isEmpty( data.model.content ) ) {
  1094. var tracks = jQuery( data.model.content ).filter( 'track' );
  1095. _.each( tracks.toArray(), function (track) {
  1096. content += track.outerHTML; #>
  1097. <p>
  1098. <input class="content-track" type="text" value="{{ track.outerHTML }}" />
  1099. <button type="button" class="button-link remove-setting remove-track"><?php _ex( 'Remove video track', 'media' ); ?></button>
  1100. </p>
  1101. <# } ); #>
  1102. <# } else { #>
  1103. <em><?php _e( 'There are no associated subtitles.' ); ?></em>
  1104. <# } #>
  1105. <textarea class="hidden content-setting">{{ content }}</textarea>
  1106. </label>
  1107. </div>
  1108. </div>
  1109. </script>
  1110. <script type="text/html" id="tmpl-editor-gallery">
  1111. <# if ( data.attachments.length ) { #>
  1112. <div class="gallery gallery-columns-{{ data.columns }}">
  1113. <# _.each( data.attachments, function( attachment, index ) { #>
  1114. <dl class="gallery-item">
  1115. <dt class="gallery-icon">
  1116. <# if ( attachment.thumbnail ) { #>
  1117. <img src="{{ attachment.thumbnail.url }}" width="{{ attachment.thumbnail.width }}" height="{{ attachment.thumbnail.height }}" alt="" />
  1118. <# } else { #>
  1119. <img src="{{ attachment.url }}" alt="" />
  1120. <# } #>
  1121. </dt>
  1122. <# if ( attachment.caption ) { #>
  1123. <dd class="wp-caption-text gallery-caption">
  1124. {{{ data.verifyHTML( attachment.caption ) }}}
  1125. </dd>
  1126. <# } #>
  1127. </dl>
  1128. <# if ( index % data.columns === data.columns - 1 ) { #>
  1129. <br style="clear: both;">
  1130. <# } #>
  1131. <# } ); #>
  1132. </div>
  1133. <# } else { #>
  1134. <div class="wpview-error">
  1135. <div class="dashicons dashicons-format-gallery"></div><p><?php _e( 'No items found.' ); ?></p>
  1136. </div>
  1137. <# } #>
  1138. </script>
  1139. <script type="text/html" id="tmpl-crop-content">
  1140. <img class="crop-image" src="{{ data.url }}" alt="<?php esc_attr_e( 'Image crop area preview. Requires mouse interaction.' ); ?>">
  1141. <div class="upload-errors"></div>
  1142. </script>
  1143. <script type="text/html" id="tmpl-site-icon-preview">
  1144. <h2><?php _e( 'Preview' ); ?></h2>
  1145. <strong aria-hidden="true"><?php _e( 'As a browser icon' ); ?></strong>
  1146. <div class="favicon-preview">
  1147. <img src="<?php echo esc_url( admin_url( 'images/' . ( is_rtl() ? 'browser-rtl.png' : 'browser.png' ) ) ); ?>" class="browser-preview" width="182" height="" alt="" />
  1148. <div class="favicon">
  1149. <img id="preview-favicon" src="{{ data.url }}" alt="<?php esc_attr_e( 'Preview as a browser icon' ); ?>"/>
  1150. </div>
  1151. <span class="browser-title" aria-hidden="true"><?php bloginfo( 'name' ); ?></span>
  1152. </div>
  1153. <strong aria-hidden="true"><?php _e( 'As an app icon' ); ?></strong>
  1154. <div class="app-icon-preview">
  1155. <img id="preview-app-icon" src="{{ data.url }}" alt="<?php esc_attr_e( 'Preview as an app icon' ); ?>"/>
  1156. </div>
  1157. </script>
  1158. <?php
  1159. /**
  1160. * Fires when the custom Backbone media templates are printed.
  1161. *
  1162. * @since 3.5.0
  1163. */
  1164. do_action( 'print_media_templates' );
  1165. }