jenkins-bot has submitted this change and it was merged.
Change subject: SelectFileWidget: Show thumbnail when dropTarget is shown
......................................................................
SelectFileWidget: Show thumbnail when dropTarget is shown
Bug: T115860
Bug: T124571
Change-Id: I3f68bc47209dad469eafdc6b4327dd2ac2d33d3d
---
M demos/pages/icons.js
M src/styles/widgets/SelectFileWidget.less
M src/themes/apex/icons-content.json
M src/themes/apex/icons-editing-advanced.json
A src/themes/apex/images/icons/attachment-ltr.svg
A src/themes/apex/images/icons/attachment-rtl.svg
A src/themes/apex/images/icons/upload-ltr.svg
A src/themes/apex/images/icons/upload-rtl.svg
M src/themes/apex/widgets.less
M src/themes/mediawiki/icons-editing-advanced.json
A src/themes/mediawiki/images/icons/attachment-ltr.svg
A src/themes/mediawiki/images/icons/attachment-rtl.svg
M src/themes/mediawiki/widgets.less
M src/widgets/SelectFileWidget.js
14 files changed, 243 insertions(+), 44 deletions(-)
Approvals:
Esanders: Looks good to me, approved
jenkins-bot: Verified
diff --git a/demos/pages/icons.js b/demos/pages/icons.js
index e21463d..b4a17e3 100644
--- a/demos/pages/icons.js
+++ b/demos/pages/icons.js
@@ -126,6 +126,7 @@
'alignCentre',
'alignLeft',
'alignRight',
+ 'attachment',
'calendar',
'find',
'language',
diff --git a/src/styles/widgets/SelectFileWidget.less
b/src/styles/widgets/SelectFileWidget.less
index 7017681..de84a33 100644
--- a/src/styles/widgets/SelectFileWidget.less
+++ b/src/styles/widgets/SelectFileWidget.less
@@ -76,16 +76,90 @@
&-dropTarget {
cursor: default;
+ height: 5.5em;
+ text-align: left;
+ padding: 0;
+
+ .oo-ui-selectFileWidget-dropLabel,
+ .oo-ui-selectFileWidget-selectButton {
+ display: none;
+ }
+
+ .oo-ui-selectFileWidget-thumbnail {
+ height: 5.5em;
+ width: 5.5em;
+ position: absolute;
+ background-size: cover;
+ background-position: center center;
+
+ &.oo-ui-pendingElement-pending {
+ background-size: auto;
+ }
+
+ > .oo-ui-selectFileWidget-noThumbnail-icon {
+ opacity: 0.4;
+ background-color: #ccc;
+ height: 5.5em;
+ width: 5.5em;
+ }
+ }
+
+ .oo-ui-selectFileWidget-info {
+ border: none;
+ background: none;
+ display: block;
+ height: 100%;
+ width: auto;
+ margin-left: 5.5em;
+
+ > .oo-ui-selectFileWidget-label {
+ position: relative;
+
+ > .oo-ui-selectFileWidget-fileName {
+ display: block;
+ float: none;
+ }
+
+ > .oo-ui-selectFileWidget-fileType {
+ display: block;
+ float: none;
+ }
+ }
+
+ > .oo-ui-selectFileWidget-clearButton {
+ position: absolute;
+ right: 0.5em;
+ }
+ }
}
- &-supported.oo-ui-widget-enabled {
- .oo-ui-selectFileWidget-dropTarget {
- cursor: pointer;
+ &-empty .oo-ui-selectFileWidget-dropTarget {
+ text-align: center;
+
+ .oo-ui-selectFileWidget-dropLabel {
+ display: block
+ }
+
+ .oo-ui-selectFileWidget-thumbnail,
+ .oo-ui-selectFileWidget-info {
+ display: none;
+ }
+
+ .oo-ui-selectFileWidget-selectButton {
+ display: block;
+ margin: 0.7em;
}
}
&-empty,
&-notsupported {
+ .oo-ui-selectFileWidget-dropTarget {
+ text-align: center;
+
+ .oo-ui-selectFileWidget-info {
+ margin: 0;
+ }
+ }
.oo-ui-selectFileWidget-clearButton {
display: none;
}
diff --git a/src/themes/apex/icons-content.json
b/src/themes/apex/icons-content.json
index 0886fa6..c565256 100644
--- a/src/themes/apex/icons-content.json
+++ b/src/themes/apex/icons-content.json
@@ -5,6 +5,10 @@
"articleRedirect": { "file": {
"ltr": "images/icons/articleRedirect-ltr.svg",
"rtl": "images/icons/articleRedirect-rtl.svg"
+ } },
+ "upload": { "file": {
+ "ltr": "images/icons/upload-ltr.svg",
+ "rtl": "images/icons/upload-rtl.svg"
} }
}
}
diff --git a/src/themes/apex/icons-editing-advanced.json
b/src/themes/apex/icons-editing-advanced.json
index ab04d36..aae5201 100644
--- a/src/themes/apex/icons-editing-advanced.json
+++ b/src/themes/apex/icons-editing-advanced.json
@@ -5,6 +5,10 @@
"alignCentre": { "file": "images/icons/align-center.svg" },
"alignLeft": { "file": "images/icons/align-float-left.svg" },
"alignRight": { "file": "images/icons/align-float-right.svg" },
+ "attachment": { "file": {
+ "ltr": "images/icons/attachment-ltr.svg",
+ "rtl": "images/icons/attachment-rtl.svg"
+ } },
"calendar": { "file": {
"ltr": "images/icons/calendar-ltr.svg",
"rtl": "images/icons/calendar-rtl.svg"
diff --git a/src/themes/apex/images/icons/attachment-ltr.svg
b/src/themes/apex/images/icons/attachment-ltr.svg
new file mode 100644
index 0000000..74a4d64
--- /dev/null
+++ b/src/themes/apex/images/icons/attachment-ltr.svg
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-293 385 24 24">
+ <path d="M-274.3 390.9c-1.6-1.6-4.3-1.5-5.8.1l.2.2c.5.5 1.3.7 2.1.4.8-.3
1.7-.1 2.4.6 1 .9.9 2.4 0 3.4l-7.1 7.1c-.9 1-2.4.9-3.4 0s-.9-2.4
0-3.4l4.4-4.4c.3-.3.9-.5 1.3-.1s.2 1-.1 1.3l-3.4 3.4c-.6.6-.6 1.7.1
2.3l4.3-4.3c.8-.8 1.1-1.8.9-2.7-.2-.9-.9-1.6-1.7-1.9-.9-.2-1.9 0-2.6.7l-4.4
4.4c-1.6 1.6-1.6 4.3.1 5.8 1.5 1.6 4.3 1.5 5.8-.1l7-7c.8-.8 1.2-1.9
1.2-3s-.5-2.1-1.3-2.8c-.7-.7.8.7 0 0-.7-.7.8.7 0 0-.7-.7.8.7 0 0-.7-.7.8.7 0
0-.7-.7.8.7 0 0-.7-.7.8.7 0 0-1.5-1.6.8.7 0 0z"/>
+</svg>
diff --git a/src/themes/apex/images/icons/attachment-rtl.svg
b/src/themes/apex/images/icons/attachment-rtl.svg
new file mode 100644
index 0000000..f53f5a4
--- /dev/null
+++ b/src/themes/apex/images/icons/attachment-rtl.svg
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-119 70 24 24">
+ <path d="M-113.3 75.6c-.8.7.7-.7 0 0-.8.7.7-.7 0 0-.8.7.7-.7 0 0-.8.7.7-.7
0 0-.8.7.7-.7 0 0-.8.7.7-.7 0 0-.8.7-1.3 1.7-1.3 2.8 0 1.1.4 2.2 1.2 3l7 7c1.5
1.6 4.3 1.7 5.8.1 1.7-1.5 1.7-4.2.1-5.8l-4.4-4.4c-.7-.7-1.7-.9-2.6-.7-.8.3-1.5
1-1.7 1.9-.2.9.1 1.9.9 2.7l4.3
4.3c.7-.6.7-1.7.1-2.3l-3.4-3.4c-.3-.3-.5-.9-.1-1.3s1-.2 1.3.1l4.4 4.4c.9 1 1
2.5 0 3.4s-2.5 1-3.4 0l-7.1-7.1c-.9-1-1-2.5 0-3.4.7-.7 1.6-.9 2.4-.6.8.3 1.6.1
2.1-.4l.2-.2c-1.5-1.6-4.2-1.8-5.8-.1-.8.7 1.5-1.7 0 0z"/>
+</svg>
diff --git a/src/themes/apex/images/icons/upload-ltr.svg
b/src/themes/apex/images/icons/upload-ltr.svg
new file mode 100644
index 0000000..dc4676f
--- /dev/null
+++ b/src/themes/apex/images/icons/upload-ltr.svg
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24
24">
+ <path d="M10 13c0 1.7 1.3 3 3 3V9h3l-4.5-5L7 9h3v4zm7 0v5H7c-.6
0-1-.4-1-1v-4H4v4c0 1.9 1.3 3 3 3h12v-7h-2z"/>
+</svg>
diff --git a/src/themes/apex/images/icons/upload-rtl.svg
b/src/themes/apex/images/icons/upload-rtl.svg
new file mode 100644
index 0000000..ed3fe77
--- /dev/null
+++ b/src/themes/apex/images/icons/upload-rtl.svg
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24
24">
+ <path d="M13 13c0 1.7-1.3 3-3 3V9H7l4.5-5L16 9h-3v4zm-7 0v5h10c.6 0 1-.4
1-1v-4h2v4c0 1.9-1.3 3-3 3H4v-7h2z"/>
+</svg>
diff --git a/src/themes/apex/widgets.less b/src/themes/apex/widgets.less
index e257476..feade15 100644
--- a/src/themes/apex/widgets.less
+++ b/src/themes/apex/widgets.less
@@ -301,24 +301,13 @@
}
}
- &-dropTarget {
- line-height: 3.5em;
- background-color: @background-color-main;
- border: 1px dashed #aaa;
- padding: 0.5em 1em;
- margin-bottom: 0.5em;
- text-align: center;
- vertical-align: middle;
- }
-
&-supported.oo-ui-widget-enabled {
- .oo-ui-selectFileWidget-dropTarget:hover,
- &.oo-ui-selectFileWidget-canDrop
oo-ui-selectFileWidget-dropTarget {
+ &.oo-ui-selectFileWidget-canDrop
.oo-ui-selectFileWidget-dropTarget {
background-color: #e1f3ff;
}
}
- &.oo-ui-widget-disabled,
+ &-empty.oo-ui-widget-disabled,
&-notsupported {
.oo-ui-selectFileWidget-dropTarget {
color: #ccc;
@@ -327,6 +316,18 @@
background-color: #f3f3f3;
}
}
+
+ &-dropTarget {
+ background-color: @background-color-main;
+ border: 1px solid #aaa;
+ margin-bottom: 0.5em;
+ vertical-align: middle;
+ border-radius: 0.25em;
+ }
+
+ &-empty .oo-ui-selectFileWidget-dropTarget {
+ border-style: dashed;
+ }
}
.theme-oo-ui-inputWidget () {
diff --git a/src/themes/mediawiki/icons-editing-advanced.json
b/src/themes/mediawiki/icons-editing-advanced.json
index dbb3411..50e65d6 100644
--- a/src/themes/mediawiki/icons-editing-advanced.json
+++ b/src/themes/mediawiki/icons-editing-advanced.json
@@ -12,6 +12,10 @@
"alignCentre": { "file": "images/icons/align-center.svg" },
"alignLeft": { "file": "images/icons/align-float-left.svg" },
"alignRight": { "file": "images/icons/align-float-right.svg" },
+ "attachment": { "file": {
+ "ltr": "images/icons/attachment-ltr.svg",
+ "rtl": "images/icons/attachment-rtl.svg"
+ } },
"calendar": { "file": {
"ltr": "images/icons/calendar-ltr.svg",
"rtl": "images/icons/calendar-rtl.svg"
diff --git a/src/themes/mediawiki/images/icons/attachment-ltr.svg
b/src/themes/mediawiki/images/icons/attachment-ltr.svg
new file mode 100644
index 0000000..74a4d64
--- /dev/null
+++ b/src/themes/mediawiki/images/icons/attachment-ltr.svg
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-293 385 24 24">
+ <path d="M-274.3 390.9c-1.6-1.6-4.3-1.5-5.8.1l.2.2c.5.5 1.3.7 2.1.4.8-.3
1.7-.1 2.4.6 1 .9.9 2.4 0 3.4l-7.1 7.1c-.9 1-2.4.9-3.4 0s-.9-2.4
0-3.4l4.4-4.4c.3-.3.9-.5 1.3-.1s.2 1-.1 1.3l-3.4 3.4c-.6.6-.6 1.7.1
2.3l4.3-4.3c.8-.8 1.1-1.8.9-2.7-.2-.9-.9-1.6-1.7-1.9-.9-.2-1.9 0-2.6.7l-4.4
4.4c-1.6 1.6-1.6 4.3.1 5.8 1.5 1.6 4.3 1.5 5.8-.1l7-7c.8-.8 1.2-1.9
1.2-3s-.5-2.1-1.3-2.8c-.7-.7.8.7 0 0-.7-.7.8.7 0 0-.7-.7.8.7 0 0-.7-.7.8.7 0
0-.7-.7.8.7 0 0-.7-.7.8.7 0 0-1.5-1.6.8.7 0 0z"/>
+</svg>
diff --git a/src/themes/mediawiki/images/icons/attachment-rtl.svg
b/src/themes/mediawiki/images/icons/attachment-rtl.svg
new file mode 100644
index 0000000..f53f5a4
--- /dev/null
+++ b/src/themes/mediawiki/images/icons/attachment-rtl.svg
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-119 70 24 24">
+ <path d="M-113.3 75.6c-.8.7.7-.7 0 0-.8.7.7-.7 0 0-.8.7.7-.7 0 0-.8.7.7-.7
0 0-.8.7.7-.7 0 0-.8.7.7-.7 0 0-.8.7-1.3 1.7-1.3 2.8 0 1.1.4 2.2 1.2 3l7 7c1.5
1.6 4.3 1.7 5.8.1 1.7-1.5 1.7-4.2.1-5.8l-4.4-4.4c-.7-.7-1.7-.9-2.6-.7-.8.3-1.5
1-1.7 1.9-.2.9.1 1.9.9 2.7l4.3
4.3c.7-.6.7-1.7.1-2.3l-3.4-3.4c-.3-.3-.5-.9-.1-1.3s1-.2 1.3.1l4.4 4.4c.9 1 1
2.5 0 3.4s-2.5 1-3.4 0l-7.1-7.1c-.9-1-1-2.5 0-3.4.7-.7 1.6-.9 2.4-.6.8.3 1.6.1
2.1-.4l.2-.2c-1.5-1.6-4.2-1.8-5.8-.1-.8.7 1.5-1.7 0 0z"/>
+</svg>
diff --git a/src/themes/mediawiki/widgets.less
b/src/themes/mediawiki/widgets.less
index 12d7ab6..3b48937 100644
--- a/src/themes/mediawiki/widgets.less
+++ b/src/themes/mediawiki/widgets.less
@@ -304,35 +304,39 @@
}
}
- &-dropTarget {
- line-height: 3.5em;
- background-color: @background-color-default;
- border: 1px dashed #ccc;
- padding: 0.5em 1em;
- margin-bottom: 0.5em;
- text-align: center;
- vertical-align: middle;
- }
-
&-supported.oo-ui-widget-enabled {
- .oo-ui-selectFileWidget-dropTarget:hover {
- background-color: #eee;
- }
-
&.oo-ui-selectFileWidget-canDrop
.oo-ui-selectFileWidget-dropTarget {
background: @progressive-fade;
}
}
- &.oo-ui-widget-disabled,
+ &-empty.oo-ui-widget-disabled,
&-notsupported {
.oo-ui-selectFileWidget-dropTarget {
- color: @color-disabled;
- text-shadow: @text-shadow-disabled;
border-color: @border-color-disabled;
background-color: @background-color-disabled;
+
+ .oo-ui-selectFileWidget-info,
+ .oo-ui-selectFileWidget-dropLabel {
+ color: @color-disabled;
+ text-shadow: @text-shadow-disabled;
+ }
}
}
+
+ &-dropTarget {
+ background-color: @background-color-default;
+ border: 1px solid #ccc;
+ margin-bottom: 0.5em;
+ vertical-align: middle;
+ overflow: hidden;
+ border-radius: @border-radius-default;
+ }
+
+ &-empty .oo-ui-selectFileWidget-dropTarget {
+ background-color: #eee;
+ border-style: dashed;
+ }
}
.theme-oo-ui-inputWidget () {
diff --git a/src/widgets/SelectFileWidget.js b/src/widgets/SelectFileWidget.js
index d121dd4..4aceae3 100644
--- a/src/widgets/SelectFileWidget.js
+++ b/src/widgets/SelectFileWidget.js
@@ -26,6 +26,8 @@
* @cfg {boolean} [droppable=true] Whether to accept files by drag and drop.
* @cfg {boolean} [showDropTarget=false] Whether to show a drop target.
Requires droppable to be true.
* @cfg {boolean} [dragDropUI=false] Deprecated alias for showDropTarget
+ * @cfg {Number} [thumbnailSizeLimit=20] File size limit in MiB above which to
not try and show a
+ * preview (for performance)
*/
OO.ui.SelectFileWidget = function OoUiSelectFileWidget( config ) {
var dragHandler;
@@ -41,7 +43,8 @@
placeholder: OO.ui.msg( 'ooui-selectfile-placeholder' ),
notsupported: OO.ui.msg( 'ooui-selectfile-not-supported' ),
droppable: true,
- showDropTarget: false
+ showDropTarget: false,
+ thumbnailSizeLimit: 20
}, config );
// Parent constructor
@@ -55,9 +58,8 @@
// Properties
this.$info = $( '<span>' );
-
- // Properties
this.showDropTarget = config.showDropTarget;
+ this.thumbnailSizeLimit = config.thumbnailSizeLimit;
this.isSupported = this.constructor.static.isSupported();
this.currentFile = null;
if ( Array.isArray( config.accept ) ) {
@@ -78,7 +80,7 @@
this.clearButton = new OO.ui.ButtonWidget( {
classes: [ 'oo-ui-selectFileWidget-clearButton' ],
framed: false,
- icon: 'remove',
+ icon: 'close',
disabled: this.disabled
} );
@@ -101,23 +103,35 @@
// Initialization
this.addInput();
- this.updateUI();
this.$label.addClass( 'oo-ui-selectFileWidget-label' );
this.$info
.addClass( 'oo-ui-selectFileWidget-info' )
.append( this.$icon, this.$label, this.clearButton.$element,
this.$indicator );
- this.$element
- .addClass( 'oo-ui-selectFileWidget' )
- .append( this.$info, this.selectButton.$element );
+
if ( config.droppable && config.showDropTarget ) {
+ this.selectButton.setIcon( 'upload' );
+ this.$thumbnail = $( '<div>' ).addClass(
'oo-ui-selectFileWidget-thumbnail' );
+ this.setPendingElement( this.$thumbnail );
this.$dropTarget = $( '<div>' )
.addClass( 'oo-ui-selectFileWidget-dropTarget' )
- .text( OO.ui.msg(
'ooui-selectfile-dragdrop-placeholder' ) )
.on( {
click: this.onDropTargetClick.bind( this )
- } );
- this.$element.prepend( this.$dropTarget );
+ } )
+ .append(
+ this.$thumbnail,
+ this.$info,
+ this.selectButton.$element,
+ $( '<span>' )
+ .addClass(
'oo-ui-selectFileWidget-dropLabel' )
+ .text( OO.ui.msg(
'ooui-selectfile-dragdrop-placeholder' ) )
+ );
+ this.$element.append( this.$dropTarget );
+ } else {
+ this.$element
+ .addClass( 'oo-ui-selectFileWidget' )
+ .append( this.$info, this.selectButton.$element );
}
+ this.updateUI();
};
/* Setup */
@@ -222,11 +236,75 @@
);
}
this.setLabel( $label );
+
+ if ( this.showDropTarget ) {
+ this.pushPending();
+ this.loadAndGetImageUrl().done( function ( url
) {
+ this.$thumbnail.css(
'background-image', 'url( ' + url + ' )' );
+ }.bind( this ) ).fail( function () {
+ this.$thumbnail.append(
+ new OO.ui.IconWidget( {
+ icon: 'attachment',
+ classes: [
'oo-ui-selectFileWidget-noThumbnail-icon' ]
+ } ).$element
+ );
+ }.bind( this ) ).always( function () {
+ this.popPending();
+ }.bind( this ) );
+ this.$dropTarget.off( 'click' );
+ }
} else {
+ if ( this.showDropTarget ) {
+ this.$dropTarget.off( 'click' );
+ this.$dropTarget.on( {
+ click: this.onDropTargetClick.bind(
this )
+ } );
+ this.$thumbnail
+ .empty()
+ .css( 'background-image', '' );
+ }
this.$element.addClass( 'oo-ui-selectFileWidget-empty'
);
this.setLabel( this.placeholder );
}
}
+};
+
+/**
+ * Get the URL of the image if the selected file is one
+ *
+ * @return {jQuery.Promise} Promise resolves with the image URL
+ */
+OO.ui.SelectFileWidget.prototype.loadAndGetImageUrl = function () {
+ var deferred = $.Deferred(),
+ file = this.currentFile,
+ reader = new FileReader();
+
+ if (
+ file &&
+ ( OO.getProp( file, 'type' ) || '' ).indexOf( 'image/' ) === 0
&&
+ file.size < this.thumbnailSizeLimit * 1024 * 1024
+ ) {
+ reader.onload = function ( event ) {
+ var img = document.createElement( 'img' );
+ img.addEventListener( 'load', function () {
+ if (
+ img.naturalWidth === 0 ||
+ img.naturalHeight === 0 ||
+ img.complete === false
+ ) {
+ deferred.reject();
+ } else {
+ deferred.resolve( event.target.result );
+ }
+ } );
+ img.src = event.target.result;
+ };
+ reader.readAsDataURL( file );
+ } else {
+ deferred.reject();
+ }
+
+ return deferred.promise();
};
/**
@@ -246,6 +324,11 @@
this.$input = $( '<input type="file">' );
this.$input.on( 'change', this.onFileSelectedHandler );
+ this.$input.on( 'click', function ( e ) {
+ // Prevents dropTarget to get clicked which calls
+ // a click on this input
+ e.stopPropagation();
+ } );
this.$input.attr( {
tabindex: -1
} );
--
To view, visit https://gerrit.wikimedia.org/r/265279
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: merged
Gerrit-Change-Id: I3f68bc47209dad469eafdc6b4327dd2ac2d33d3d
Gerrit-PatchSet: 14
Gerrit-Project: oojs/ui
Gerrit-Branch: master
Gerrit-Owner: Prtksxna <[email protected]>
Gerrit-Reviewer: Bartosz DziewoĆski <[email protected]>
Gerrit-Reviewer: Esanders <[email protected]>
Gerrit-Reviewer: Prtksxna <[email protected]>
Gerrit-Reviewer: jenkins-bot <>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits