diff --git a/package/src/editor/views/BackgroundPositioningImageView.js b/package/src/editor/views/BackgroundPositioningImageView.js
new file mode 100644
index 0000000000..e38844c7db
--- /dev/null
+++ b/package/src/editor/views/BackgroundPositioningImageView.js
@@ -0,0 +1,21 @@
+import Marionette from 'backbone.marionette';
+
+// Renders the image which files point at via
+// `getBackgroundPositioningImageUrl`. Used for all file types which do
+// not bring a positioning view of their own.
+export const BackgroundPositioningImageView = Marionette.ItemView.extend({
+ tagName: 'img',
+ template: () => '',
+
+ className: function() {
+ return 'background_positioning-image-' + this.options.fit;
+ },
+
+ onRender: function() {
+ this.$el.attr('src', this.model.getBackgroundPositioningImageUrl());
+ },
+
+ setPosition: function(x, y) {
+ this.$el.css('object-position', x + '% ' + y + '%');
+ }
+});
diff --git a/package/src/editor/views/BackgroundPositioningPreviewView.js b/package/src/editor/views/BackgroundPositioningPreviewView.js
index 05770878d3..273ecc2e3d 100644
--- a/package/src/editor/views/BackgroundPositioningPreviewView.js
+++ b/package/src/editor/views/BackgroundPositioningPreviewView.js
@@ -16,9 +16,22 @@ export const BackgroundPositioningPreviewView = Marionette.ItemView.extend({
},
onRender: function() {
+ this.renderFile();
this.update();
},
+ // File types can crop the file themselves, which is the only way to
+ // preview files that have no image to position on the server.
+ renderFile: function() {
+ var file = this.file();
+
+ this.positioningView = file && file.createPositioningView({fit: 'cover'});
+
+ if (this.positioningView) {
+ this.appendSubview(this.positioningView, {to: this.ui.image});
+ }
+ },
+
update: function() {
var ratio = this.options.ratio;
var max = this.options.maxSize;
@@ -27,17 +40,20 @@ export const BackgroundPositioningPreviewView = Marionette.ItemView.extend({
this.ui.image.css({
width: width + 'px',
- height: height + 'px',
- backgroundImage: this.imageValue(),
- backgroundPosition: this.model.getFilePosition(this.options.propertyName, 'x') + '% ' +
- this.model.getFilePosition(this.options.propertyName, 'y') + '%'
+ height: height + 'px'
});
+ if (this.positioningView) {
+ this.positioningView.setPosition(
+ this.model.getFilePosition(this.options.propertyName, 'x'),
+ this.model.getFilePosition(this.options.propertyName, 'y')
+ );
+ }
+
this.ui.label.text(this.options.label);
},
- imageValue: function() {
- var file = this.model.getReference(this.options.propertyName, this.options.filesCollection);
- return file ? 'url("' + file.getBackgroundPositioningImageUrl() + '")' : 'none';
+ file: function() {
+ return this.model.getReference(this.options.propertyName, this.options.filesCollection);
}
});
diff --git a/package/src/editor/views/BackgroundPositioningSlidersView.js b/package/src/editor/views/BackgroundPositioningSlidersView.js
index caae8a3af1..129961c511 100644
--- a/package/src/editor/views/BackgroundPositioningSlidersView.js
+++ b/package/src/editor/views/BackgroundPositioningSlidersView.js
@@ -9,6 +9,7 @@ export const BackgroundPositioningSlidersView = Marionette.ItemView.extend({
ui: {
container: '.container',
+ file: '.file',
sliderHorizontal: '.horizontal.slider',
sliderVertical: '.vertical.slider',
@@ -18,7 +19,7 @@ export const BackgroundPositioningSlidersView = Marionette.ItemView.extend({
},
events: {
- 'mousedown img': function(event) {
+ 'mousedown .file': function(event) {
var view = this;
view.saveFromEvent(event);
@@ -37,7 +38,7 @@ export const BackgroundPositioningSlidersView = Marionette.ItemView.extend({
.on('mouseup', onUp);
},
- 'dragstart img': function(event) {
+ 'dragstart .file': function(event) {
event.preventDefault();
}
},
@@ -48,10 +49,8 @@ export const BackgroundPositioningSlidersView = Marionette.ItemView.extend({
onRender: function() {
var view = this;
- var file = this.model.getReference(this.options.propertyName, this.options.filesCollection),
- image = $('
![]()
').attr('src', file.getBackgroundPositioningImageUrl());
- this.ui.container.append(image);
+ this.renderFile();
this.ui.sliderVertical.slider({
orientation: 'vertical',
@@ -88,6 +87,15 @@ export const BackgroundPositioningSlidersView = Marionette.ItemView.extend({
this.update();
},
+ // File types can render the file themselves, which is the only way
+ // to display files that do not have an image to position on the
+ // server.
+ renderFile: function() {
+ var file = this.model.getReference(this.options.propertyName, this.options.filesCollection);
+
+ this.appendSubview(file.createPositioningView({fit: 'contain'}), {to: this.ui.file});
+ },
+
update: function() {
var x = this.model.getFilePosition(this.options.propertyName, 'x');
var y = this.model.getFilePosition(this.options.propertyName, 'y');
diff --git a/package/src/testHelpers/dominos/editor/index.js b/package/src/testHelpers/dominos/editor/index.js
index 1b2257b1a5..7b0ffe8e08 100644
--- a/package/src/testHelpers/dominos/editor/index.js
+++ b/package/src/testHelpers/dominos/editor/index.js
@@ -2,6 +2,7 @@ export * from './DropDownButton'
export * from './FileMetaDataTable'
export * from './FileStageItem'
export * from './FileThumbnail'
+export * from './inputs/FileInput'
export * from './inputs/ReferenceInput'
export * from './StaticThumbnail'
export * from './ThemeItem'
diff --git a/package/src/testHelpers/dominos/editor/inputs/FileInput.js b/package/src/testHelpers/dominos/editor/inputs/FileInput.js
new file mode 100644
index 0000000000..8a285cfc78
--- /dev/null
+++ b/package/src/testHelpers/dominos/editor/inputs/FileInput.js
@@ -0,0 +1,12 @@
+import {Base} from '../../ui/inputs/Base';
+import {DropDownButton} from '../DropDownButton';
+
+export const FileInput = Base.extend({
+ menuItemNames: function() {
+ return DropDownButton.find(this.$el).menuItemNames();
+ },
+
+ selectMenuItemByName: function(name) {
+ DropDownButton.find(this.$el).selectMenuItemByName(name);
+ }
+});