Give media a heart transplant.
Revises the concept of the media controller and workspace views (i.e. two central points of control) to be more granular. The main media object is now the `Frame`, which is a hybrid view and state machine. The state machine is a collection of states, which are just generic instances of `Backbone.Model`. This circumvents the problem of juggling global parameters when changing states. Each state contains its own event loop. All events are also forwarded to the frame itself (as is the case in all model/collection relationships). The frame view contains several regions, each of which can be overridden without harming or re-rendering the other regions. These work well when used in conjunction with the state machine events. This removes the upload sidebar (don't worry, visible upload UI will return). Drag and drop uploading still works. The ability to upload has been abstracted into its own view (instead of being attached to the central workspace view). Editing galleries is temporarily broken — the gallery creation and editing experiences will be unified in a future patch. Adds events to detect dragging changes in `wp.Uploader` and adds methods to detect and leverage browser support for CSS3 transitions. see #21390, #21809. git-svn-id: http://core.svn.wordpress.org/trunk@22320 1a063a9b-81f0-0310-95a4-ce76da25c4cd
This commit is contained in:
parent
f965ff1c84
commit
53ccb09bce
|
@ -1018,7 +1018,7 @@ function post_thumbnail_meta_box( $post ) {
|
||||||
var $element = $('#select-featured-image'),
|
var $element = $('#select-featured-image'),
|
||||||
$thumbnailId = $element.find('input[name="thumbnail_id"]'),
|
$thumbnailId = $element.find('input[name="thumbnail_id"]'),
|
||||||
title = '<?php _e( "Choose a Featured Image" ); ?>',
|
title = '<?php _e( "Choose a Featured Image" ); ?>',
|
||||||
workflow, setFeaturedImage;
|
workflow, selection, setFeaturedImage;
|
||||||
|
|
||||||
setFeaturedImage = function( thumbnailId ) {
|
setFeaturedImage = function( thumbnailId ) {
|
||||||
$element.find('img').remove();
|
$element.find('img').remove();
|
||||||
|
@ -1037,7 +1037,9 @@ function post_thumbnail_meta_box( $post ) {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
workflow.selection.on( 'add', function( model ) {
|
selection = workflow.state().get('selection');
|
||||||
|
|
||||||
|
selection.on( 'add', function( model ) {
|
||||||
var sizes = model.get('sizes'),
|
var sizes = model.get('sizes'),
|
||||||
size;
|
size;
|
||||||
|
|
||||||
|
@ -1051,8 +1053,8 @@ function post_thumbnail_meta_box( $post ) {
|
||||||
// data besides just calling toJSON().
|
// data besides just calling toJSON().
|
||||||
size = size || model.toJSON();
|
size = size || model.toJSON();
|
||||||
|
|
||||||
workflow.modal.close();
|
workflow.close();
|
||||||
workflow.selection.clear();
|
selection.clear();
|
||||||
|
|
||||||
$( '<img />', {
|
$( '<img />', {
|
||||||
src: size.url,
|
src: size.url,
|
||||||
|
@ -1061,7 +1063,7 @@ function post_thumbnail_meta_box( $post ) {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
workflow.modal.open();
|
workflow.open();
|
||||||
});
|
});
|
||||||
|
|
||||||
$element.on( 'click', '.remove', function( event ) {
|
$element.on( 'click', '.remove', function( event ) {
|
||||||
|
|
|
@ -104,11 +104,10 @@ var tb_position;
|
||||||
|
|
||||||
workflow = workflows[ id ] = wp.media( _.defaults( options || {}, {
|
workflow = workflows[ id ] = wp.media( _.defaults( options || {}, {
|
||||||
title: wp.media.view.l10n.insertMedia,
|
title: wp.media.view.l10n.insertMedia,
|
||||||
multiple: true,
|
multiple: true
|
||||||
describe: true
|
|
||||||
} ) );
|
} ) );
|
||||||
|
|
||||||
workflow.on( 'update:insert', function( selection ) {
|
workflow.get('library').on( 'insert', function( selection ) {
|
||||||
this.insert( selection.map( function( attachment ) {
|
this.insert( selection.map( function( attachment ) {
|
||||||
if ( 'image' === attachment.get('type') )
|
if ( 'image' === attachment.get('type') )
|
||||||
return wp.media.string.image( attachment ) + ' ';
|
return wp.media.string.image( attachment ) + ' ';
|
||||||
|
@ -117,7 +116,7 @@ var tb_position;
|
||||||
}).join('') );
|
}).join('') );
|
||||||
}, this );
|
}, this );
|
||||||
|
|
||||||
workflow.on( 'update:gallery', function( selection ) {
|
workflow.get('gallery').on( 'update', function( selection ) {
|
||||||
var view = wp.mce.view.get('gallery'),
|
var view = wp.mce.view.get('gallery'),
|
||||||
shortcode;
|
shortcode;
|
||||||
|
|
||||||
|
|
|
@ -75,6 +75,7 @@
|
||||||
position: relative;
|
position: relative;
|
||||||
z-index: 50;
|
z-index: 50;
|
||||||
height: 60px;
|
height: 60px;
|
||||||
|
padding: 0 10px;
|
||||||
border-bottom: 1px solid #dfdfdf;
|
border-bottom: 1px solid #dfdfdf;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -101,64 +102,11 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Workspace
|
* Frame
|
||||||
*/
|
*/
|
||||||
.media-workspace {
|
|
||||||
position: relative;
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
.upload-attachments {
|
.media-frame .attachments,
|
||||||
position: absolute;
|
.media-frame .media-toolbar {
|
||||||
top: 0;
|
|
||||||
left: 0;
|
|
||||||
bottom: 0;
|
|
||||||
width: 180px;
|
|
||||||
margin: 10px;
|
|
||||||
text-align: center;
|
|
||||||
border: 3px dashed #dfdfdf;
|
|
||||||
background: #fff;
|
|
||||||
z-index: 100;
|
|
||||||
}
|
|
||||||
|
|
||||||
.upload-attachments h3 {
|
|
||||||
font-size: 18px;
|
|
||||||
font-weight: 200;
|
|
||||||
color: #777;
|
|
||||||
padding: 40px 0 0;
|
|
||||||
margin: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.upload-attachments span {
|
|
||||||
display: block;
|
|
||||||
color: #777;
|
|
||||||
margin: 10px 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.upload-attachments a {
|
|
||||||
display: inline-block;
|
|
||||||
margin: 0 auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
.drag-over .upload-attachments {
|
|
||||||
width: auto;
|
|
||||||
right: 0;
|
|
||||||
border-color: #83B4D8;
|
|
||||||
box-shadow: 0 0 0 10px #fff;
|
|
||||||
}
|
|
||||||
|
|
||||||
.existing-attachments {
|
|
||||||
position: absolute;
|
|
||||||
top: 0;
|
|
||||||
left: 200px;
|
|
||||||
right: 0;
|
|
||||||
bottom: 0;
|
|
||||||
margin: 0 20px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.media-workspace .attachments,
|
|
||||||
.media-workspace .media-toolbar {
|
|
||||||
-webkit-transition-property: left, right, top, bottom, margin;
|
-webkit-transition-property: left, right, top, bottom, margin;
|
||||||
-moz-transition-property: left, right, top, bottom, margin;
|
-moz-transition-property: left, right, top, bottom, margin;
|
||||||
-ms-transition-property: left, right, top, bottom, margin;
|
-ms-transition-property: left, right, top, bottom, margin;
|
||||||
|
@ -172,9 +120,9 @@
|
||||||
transition-duration: 0.2s;
|
transition-duration: 0.2s;
|
||||||
}
|
}
|
||||||
|
|
||||||
.media-workspace .attachments {
|
.media-frame .attachments {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
top: 0;
|
top: 61px;
|
||||||
left: 0;
|
left: 0;
|
||||||
right: 0;
|
right: 0;
|
||||||
bottom: 0;
|
bottom: 0;
|
||||||
|
@ -182,22 +130,21 @@
|
||||||
width: auto;
|
width: auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
.media-workspace.with-toolbar .attachments {
|
.media-frame.hide-toolbar .attachments {
|
||||||
top: 61px;
|
top: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.media-workspace .media-toolbar {
|
.media-frame .media-toolbar {
|
||||||
margin-top: -61px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.media-workspace.with-toolbar .media-toolbar {
|
|
||||||
margin-top: 0;
|
margin-top: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.media-workspace .media-toolbar .add-to-gallery {
|
.media-frame.hide-toolbar .media-toolbar {
|
||||||
display: none;
|
margin-top: -61px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.media-frame .media-toolbar .add-to-gallery {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
/**
|
/**
|
||||||
* Attachments
|
* Attachments
|
||||||
*/
|
*/
|
||||||
|
@ -213,6 +160,7 @@
|
||||||
left: 0;
|
left: 0;
|
||||||
right: 0;
|
right: 0;
|
||||||
height: 50px;
|
height: 50px;
|
||||||
|
padding: 0 10px;
|
||||||
background: #fff;
|
background: #fff;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -242,7 +190,7 @@
|
||||||
right: 0;
|
right: 0;
|
||||||
bottom: 0;
|
bottom: 0;
|
||||||
overflow: auto;
|
overflow: auto;
|
||||||
margin: 0 -10px 20px;
|
margin: 0 0 20px;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -445,12 +393,70 @@
|
||||||
margin: -8px 0 0 -4px;
|
margin: -8px 0 0 -4px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.upload-attachments .media-progress-bar {
|
.uploader-window {
|
||||||
margin-top: 80px;
|
position: fixed;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
bottom: 0;
|
||||||
|
background: rgba( 0, 86, 132, 0.9 );
|
||||||
|
|
||||||
|
/*z-index: -200;*/
|
||||||
|
z-index: 250000;
|
||||||
display: none;
|
display: none;
|
||||||
|
text-align: center;
|
||||||
|
opacity: 0;
|
||||||
|
|
||||||
|
-webkit-transition: opacity 250ms;
|
||||||
|
-moz-transition: opacity 250ms;
|
||||||
|
-ms-transition: opacity 250ms;
|
||||||
|
-o-transition: opacity 250ms;
|
||||||
|
transition: opacity 250ms;
|
||||||
}
|
}
|
||||||
|
|
||||||
.uploading .upload-attachments .media-progress-bar {
|
/*.drag-over .uploader-window {
|
||||||
|
z-index: 250000;
|
||||||
|
}*/
|
||||||
|
|
||||||
|
.uploader-window-content {
|
||||||
|
position: absolute;
|
||||||
|
top: 30px;
|
||||||
|
left: 30px;
|
||||||
|
right: 30px;
|
||||||
|
bottom: 30px;
|
||||||
|
border: 1px dashed #fff;
|
||||||
|
}
|
||||||
|
|
||||||
|
.uploader-window h3 {
|
||||||
|
position: absolute;
|
||||||
|
top: 50%;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
-webkit-transform: translateY( -50% );
|
||||||
|
-moz-transform: translateY( -50% );
|
||||||
|
-ms-transform: translateY( -50% );
|
||||||
|
-o-transform: translateY( -50% );
|
||||||
|
transform: translateY( -50% );
|
||||||
|
|
||||||
|
font-size: 18px;
|
||||||
|
font-weight: 200;
|
||||||
|
color: #fff;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.uploader-window .media-progress-bar {
|
||||||
|
margin-top: 20px;
|
||||||
|
max-width: 300px;
|
||||||
|
background: transparent;
|
||||||
|
border-color: #fff;
|
||||||
|
/*display: none;*/
|
||||||
|
}
|
||||||
|
|
||||||
|
.uploader-window .media-progress-bar div {
|
||||||
|
background: #fff;
|
||||||
|
}
|
||||||
|
|
||||||
|
.uploading .uploader-window .media-progress-bar {
|
||||||
display: block;
|
display: block;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -692,12 +692,11 @@ window.wp = window.wp || {};
|
||||||
return;
|
return;
|
||||||
|
|
||||||
this.workflow = wp.media({
|
this.workflow = wp.media({
|
||||||
view: 'gallery',
|
state: 'gallery',
|
||||||
selection: this.attachments.models,
|
selection: this.attachments.models,
|
||||||
title: mceview.l10n.editGallery,
|
title: mceview.l10n.editGallery,
|
||||||
editing: true,
|
editing: true,
|
||||||
multiple: true,
|
multiple: true
|
||||||
describe: true
|
|
||||||
});
|
});
|
||||||
|
|
||||||
// Create a single-use workflow. If the workflow is closed,
|
// Create a single-use workflow. If the workflow is closed,
|
||||||
|
|
|
@ -14,8 +14,8 @@ window.wp = window.wp || {};
|
||||||
* @return {object} A media workflow.
|
* @return {object} A media workflow.
|
||||||
*/
|
*/
|
||||||
media = wp.media = function( attributes ) {
|
media = wp.media = function( attributes ) {
|
||||||
if ( media.controller.Workflow )
|
if ( media.view.Frame )
|
||||||
return new media.controller.Workflow( attributes ).attach().render();
|
return new media.view.Frame( attributes ).render().attach().open();
|
||||||
};
|
};
|
||||||
|
|
||||||
_.extend( media, { model: {}, view: {}, controller: {} });
|
_.extend( media, { model: {}, view: {}, controller: {} });
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -114,7 +114,7 @@ window.wp = window.wp || {};
|
||||||
if ( active )
|
if ( active )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
dropzone.addClass('drag-over');
|
dropzone.trigger('dropzone:enter').addClass('drag-over');
|
||||||
active = true;
|
active = true;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -126,7 +126,7 @@ window.wp = window.wp || {};
|
||||||
// See http://core.trac.wordpress.org/ticket/21705
|
// See http://core.trac.wordpress.org/ticket/21705
|
||||||
timer = setTimeout( function() {
|
timer = setTimeout( function() {
|
||||||
active = false;
|
active = false;
|
||||||
dropzone.removeClass('drag-over');
|
dropzone.trigger('dropzone:leave').removeClass('drag-over');
|
||||||
}, 0 );
|
}, 0 );
|
||||||
});
|
});
|
||||||
}( this.dropzone, this.supports.dragdrop ));
|
}( this.dropzone, this.supports.dragdrop ));
|
||||||
|
|
|
@ -1299,24 +1299,13 @@ function wp_print_media_templates( $attachment ) {
|
||||||
<div class="media-modal">
|
<div class="media-modal">
|
||||||
<h3 class="media-modal-title"><%- title %></h3>
|
<h3 class="media-modal-title"><%- title %></h3>
|
||||||
<a class="media-modal-close" href="" title="<?php esc_attr_e('Close'); ?>">×</a>
|
<a class="media-modal-close" href="" title="<?php esc_attr_e('Close'); ?>">×</a>
|
||||||
<div class="media-modal-content"></div>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="media-modal-backdrop"></div>
|
<div class="media-modal-backdrop"></div>
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<script type="text/html" id="tmpl-media-workspace">
|
<script type="text/html" id="tmpl-uploader-window">
|
||||||
<div class="upload-attachments">
|
<div class="uploader-window-content">
|
||||||
<% if ( selectOne ) { %>
|
<h3><?php _e( 'Drop files here to upload' ); ?></h3>
|
||||||
<h3><?php _e( 'Drop a file here' ); ?></h3>
|
|
||||||
<span><?php _ex( 'or', 'Uploader: Drop a file here - or - Select a File' ); ?></span>
|
|
||||||
<a href="#" class="button-secondary"><?php _e( 'Select a File' ); ?></a>
|
|
||||||
<% } else { %>
|
|
||||||
<h3><?php _e( 'Drop files here' ); ?></h3>
|
|
||||||
<span><?php _ex( 'or', 'Uploader: Drop files here - or - Select Files' ); ?></span>
|
|
||||||
<a href="#" class="button-secondary"><?php _e( 'Select Files' ); ?></a>
|
|
||||||
<% } %>
|
|
||||||
|
|
||||||
<div class="media-progress-bar"><div></div></div>
|
|
||||||
</div>
|
</div>
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue