r89120 MediaWiki - Code Review archive

Repository:MediaWiki
Revision:r89119‎ | r89120 | r89121 >
Date:17:19, 29 May 2011
Author:wikinaut
Status:reverted (Comments)
Tags:
Comment:
added jquery.ui.droppable.js which was missing in jquery.ui.dialog.js;fixes LiquidThreads drag to new location not working bug28407 *hopefully this breaks nothing else* my first commit to core *pls. check that nothing breaks as consequence from this commit
Modified paths:
  • /trunk/phase3/resources/jquery.ui/jquery.ui.dialog.js (modified) (history)

Diff [purge]

Index: trunk/phase3/resources/jquery.ui/jquery.ui.dialog.js
@@ -10,11 +10,12 @@
1111 * Depends:
1212 * jquery.ui.core.js
1313 * jquery.ui.widget.js
14 - * jquery.ui.button.js
 14+ * jquery.ui.button.js
1515 * jquery.ui.draggable.js
1616 * jquery.ui.mouse.js
1717 * jquery.ui.position.js
1818 * jquery.ui.resizable.js
 19+ * jquery.ui.droppable.js
1920 */
2021 (function( $, undefined ) {
2122
@@ -854,4 +855,274 @@
855856 }
856857 });
857858
 859+/* jquery.ui.droppable.js */
 860+
 861+$.widget("ui.droppable", {
 862+ widgetEventPrefix: "drop",
 863+ options: {
 864+ accept: '*',
 865+ activeClass: false,
 866+ addClasses: true,
 867+ greedy: false,
 868+ hoverClass: false,
 869+ scope: 'default',
 870+ tolerance: 'intersect'
 871+ },
 872+ _create: function() {
 873+
 874+ var o = this.options, accept = o.accept;
 875+ this.isover = 0; this.isout = 1;
 876+
 877+ this.accept = $.isFunction(accept) ? accept : function(d) {
 878+ return d.is(accept);
 879+ };
 880+
 881+ //Store the droppable's proportions
 882+ this.proportions = { width: this.element[0].offsetWidth, height: this.element[0].offsetHeight };
 883+
 884+ // Add the reference and positions to the manager
 885+ $.ui.ddmanager.droppables[o.scope] = $.ui.ddmanager.droppables[o.scope] || [];
 886+ $.ui.ddmanager.droppables[o.scope].push(this);
 887+
 888+ (o.addClasses && this.element.addClass("ui-droppable"));
 889+
 890+ },
 891+
 892+ destroy: function() {
 893+ var drop = $.ui.ddmanager.droppables[this.options.scope];
 894+ for ( var i = 0; i < drop.length; i++ )
 895+ if ( drop[i] == this )
 896+ drop.splice(i, 1);
 897+
 898+ this.element
 899+ .removeClass("ui-droppable ui-droppable-disabled")
 900+ .removeData("droppable")
 901+ .unbind(".droppable");
 902+
 903+ return this;
 904+ },
 905+
 906+ _setOption: function(key, value) {
 907+
 908+ if(key == 'accept') {
 909+ this.accept = $.isFunction(value) ? value : function(d) {
 910+ return d.is(value);
 911+ };
 912+ }
 913+ $.Widget.prototype._setOption.apply(this, arguments);
 914+ },
 915+
 916+ _activate: function(event) {
 917+ var draggable = $.ui.ddmanager.current;
 918+ if(this.options.activeClass) this.element.addClass(this.options.activeClass);
 919+ (draggable && this._trigger('activate', event, this.ui(draggable)));
 920+ },
 921+
 922+ _deactivate: function(event) {
 923+ var draggable = $.ui.ddmanager.current;
 924+ if(this.options.activeClass) this.element.removeClass(this.options.activeClass);
 925+ (draggable && this._trigger('deactivate', event, this.ui(draggable)));
 926+ },
 927+
 928+ _over: function(event) {
 929+
 930+ var draggable = $.ui.ddmanager.current;
 931+ if (!draggable || (draggable.currentItem || draggable.element)[0] == this.element[0]) return; // Bail if draggable and droppable are same element
 932+
 933+ if (this.accept.call(this.element[0],(draggable.currentItem || draggable.element))) {
 934+ if(this.options.hoverClass) this.element.addClass(this.options.hoverClass);
 935+ this._trigger('over', event, this.ui(draggable));
 936+ }
 937+
 938+ },
 939+
 940+ _out: function(event) {
 941+
 942+ var draggable = $.ui.ddmanager.current;
 943+ if (!draggable || (draggable.currentItem || draggable.element)[0] == this.element[0]) return; // Bail if draggable and droppable are same element
 944+
 945+ if (this.accept.call(this.element[0],(draggable.currentItem || draggable.element))) {
 946+ if(this.options.hoverClass) this.element.removeClass(this.options.hoverClass);
 947+ this._trigger('out', event, this.ui(draggable));
 948+ }
 949+
 950+ },
 951+
 952+ _drop: function(event,custom) {
 953+
 954+ var draggable = custom || $.ui.ddmanager.current;
 955+ if (!draggable || (draggable.currentItem || draggable.element)[0] == this.element[0]) return false; // Bail if draggable and droppable are same element
 956+
 957+ var childrenIntersection = false;
 958+ this.element.find(":data(droppable)").not(".ui-draggable-dragging").each(function() {
 959+ var inst = $.data(this, 'droppable');
 960+ if(
 961+ inst.options.greedy
 962+ && !inst.options.disabled
 963+ && inst.options.scope == draggable.options.scope
 964+ && inst.accept.call(inst.element[0], (draggable.currentItem || draggable.element))
 965+ && $.ui.intersect(draggable, $.extend(inst, { offset: inst.element.offset() }), inst.options.tolerance)
 966+ ) { childrenIntersection = true; return false; }
 967+ });
 968+ if(childrenIntersection) return false;
 969+
 970+ if(this.accept.call(this.element[0],(draggable.currentItem || draggable.element))) {
 971+ if(this.options.activeClass) this.element.removeClass(this.options.activeClass);
 972+ if(this.options.hoverClass) this.element.removeClass(this.options.hoverClass);
 973+ this._trigger('drop', event, this.ui(draggable));
 974+ return this.element;
 975+ }
 976+
 977+ return false;
 978+
 979+ },
 980+
 981+ ui: function(c) {
 982+ return {
 983+ draggable: (c.currentItem || c.element),
 984+ helper: c.helper,
 985+ position: c.position,
 986+ offset: c.positionAbs
 987+ };
 988+ }
 989+
 990+});
 991+
 992+$.extend($.ui.droppable, {
 993+ version: "1.8.11"
 994+});
 995+
 996+$.ui.intersect = function(draggable, droppable, toleranceMode) {
 997+
 998+ if (!droppable.offset) return false;
 999+
 1000+ var x1 = (draggable.positionAbs || draggable.position.absolute).left, x2 = x1 + draggable.helperProportions.width,
 1001+ y1 = (draggable.positionAbs || draggable.position.absolute).top, y2 = y1 + draggable.helperProportions.height;
 1002+ var l = droppable.offset.left, r = l + droppable.proportions.width,
 1003+ t = droppable.offset.top, b = t + droppable.proportions.height;
 1004+
 1005+ switch (toleranceMode) {
 1006+ case 'fit':
 1007+ return (l <= x1 && x2 <= r
 1008+ && t <= y1 && y2 <= b);
 1009+ break;
 1010+ case 'intersect':
 1011+ return (l < x1 + (draggable.helperProportions.width / 2) // Right Half
 1012+ && x2 - (draggable.helperProportions.width / 2) < r // Left Half
 1013+ && t < y1 + (draggable.helperProportions.height / 2) // Bottom Half
 1014+ && y2 - (draggable.helperProportions.height / 2) < b ); // Top Half
 1015+ break;
 1016+ case 'pointer':
 1017+ var draggableLeft = ((draggable.positionAbs || draggable.position.absolute).left + (draggable.clickOffset || draggable.offset.click).left),
 1018+ draggableTop = ((draggable.positionAbs || draggable.position.absolute).top + (draggable.clickOffset || draggable.offset.click).top),
 1019+ isOver = $.ui.isOver(draggableTop, draggableLeft, t, l, droppable.proportions.height, droppable.proportions.width);
 1020+ return isOver;
 1021+ break;
 1022+ case 'touch':
 1023+ return (
 1024+ (y1 >= t && y1 <= b) || // Top edge touching
 1025+ (y2 >= t && y2 <= b) || // Bottom edge touching
 1026+ (y1 < t && y2 > b) // Surrounded vertically
 1027+ ) && (
 1028+ (x1 >= l && x1 <= r) || // Left edge touching
 1029+ (x2 >= l && x2 <= r) || // Right edge touching
 1030+ (x1 < l && x2 > r) // Surrounded horizontally
 1031+ );
 1032+ break;
 1033+ default:
 1034+ return false;
 1035+ break;
 1036+ }
 1037+
 1038+};
 1039+
 1040+/*
 1041+ This manager tracks offsets of draggables and droppables
 1042+*/
 1043+$.ui.ddmanager = {
 1044+ current: null,
 1045+ droppables: { 'default': [] },
 1046+ prepareOffsets: function(t, event) {
 1047+
 1048+ var m = $.ui.ddmanager.droppables[t.options.scope] || [];
 1049+ var type = event ? event.type : null; // workaround for #2317
 1050+ var list = (t.currentItem || t.element).find(":data(droppable)").andSelf();
 1051+
 1052+ droppablesLoop: for (var i = 0; i < m.length; i++) {
 1053+
 1054+ if(m[i].options.disabled || (t && !m[i].accept.call(m[i].element[0],(t.currentItem || t.element)))) continue; //No disabled and non-accepted
 1055+ for (var j=0; j < list.length; j++) { if(list[j] == m[i].element[0]) { m[i].proportions.height = 0; continue droppablesLoop; } }; //Filter out elements in the current dragged item
 1056+ m[i].visible = m[i].element.css("display") != "none"; if(!m[i].visible) continue; //If the element is not visible, continue
 1057+
 1058+ if(type == "mousedown") m[i]._activate.call(m[i], event); //Activate the droppable if used directly from draggables
 1059+
 1060+ m[i].offset = m[i].element.offset();
 1061+ m[i].proportions = { width: m[i].element[0].offsetWidth, height: m[i].element[0].offsetHeight };
 1062+
 1063+ }
 1064+
 1065+ },
 1066+ drop: function(draggable, event) {
 1067+
 1068+ var dropped = false;
 1069+ $.each($.ui.ddmanager.droppables[draggable.options.scope] || [], function() {
 1070+
 1071+ if(!this.options) return;
 1072+ if (!this.options.disabled && this.visible && $.ui.intersect(draggable, this, this.options.tolerance))
 1073+ dropped = dropped || this._drop.call(this, event);
 1074+
 1075+ if (!this.options.disabled && this.visible && this.accept.call(this.element[0],(draggable.currentItem || draggable.element))) {
 1076+ this.isout = 1; this.isover = 0;
 1077+ this._deactivate.call(this, event);
 1078+ }
 1079+
 1080+ });
 1081+ return dropped;
 1082+
 1083+ },
 1084+ drag: function(draggable, event) {
 1085+
 1086+ //If you have a highly dynamic page, you might try this option. It renders positions every time you move the mouse.
 1087+ if(draggable.options.refreshPositions) $.ui.ddmanager.prepareOffsets(draggable, event);
 1088+
 1089+ //Run through all droppables and check their positions based on specific tolerance options
 1090+ $.each($.ui.ddmanager.droppables[draggable.options.scope] || [], function() {
 1091+
 1092+ if(this.options.disabled || this.greedyChild || !this.visible) return;
 1093+ var intersects = $.ui.intersect(draggable, this, this.options.tolerance);
 1094+
 1095+ var c = !intersects && this.isover == 1 ? 'isout' : (intersects && this.isover == 0 ? 'isover' : null);
 1096+ if(!c) return;
 1097+
 1098+ var parentInstance;
 1099+ if (this.options.greedy) {
 1100+ var parent = this.element.parents(':data(droppable):eq(0)');
 1101+ if (parent.length) {
 1102+ parentInstance = $.data(parent[0], 'droppable');
 1103+ parentInstance.greedyChild = (c == 'isover' ? 1 : 0);
 1104+ }
 1105+ }
 1106+
 1107+ // we just moved into a greedy child
 1108+ if (parentInstance && c == 'isover') {
 1109+ parentInstance['isover'] = 0;
 1110+ parentInstance['isout'] = 1;
 1111+ parentInstance._out.call(parentInstance, event);
 1112+ }
 1113+
 1114+ this[c] = 1; this[c == 'isout' ? 'isover' : 'isout'] = 0;
 1115+ this[c == "isover" ? "_over" : "_out"].call(this, event);
 1116+
 1117+ // we just moved out of a greedy child
 1118+ if (parentInstance && c == 'isout') {
 1119+ parentInstance['isout'] = 0;
 1120+ parentInstance['isover'] = 1;
 1121+ parentInstance._over.call(parentInstance, event);
 1122+ }
 1123+ });
 1124+
 1125+ }
 1126+};
 1127+
 1128+
8581129 }(jQuery));

Follow-up revisions

RevisionCommit summaryAuthorDate
r89121fix for bug28407 - drag to new location not workingwikinaut17:53, 29 May 2011
r89122Revert r89120reedy18:00, 29 May 2011

Comments

#Comment by He7d3r (talk | contribs)   17:41, 29 May 2011

I think there is some way to make this code available to LQT using the version which is at svn:trunk/phase3/resources/jquery.ui/jquery.ui.droppable.js instead of copying it to this file.

Maybe adding it to the list of dependencies of the extension with something like this:

'dependencies' => array( 'jquery.ui.dialog', 'jquery.ui.droppable' ),

(see ResourceLoader/Migration_guide_for_extension_developers#Registering_a_module)

#Comment by Wikinaut (talk | contribs)   17:43, 29 May 2011

I tried this before commit- It did *not* work this maybe due to unknown loading sequences of jQuery (in this case)

#Comment by Wikinaut (talk | contribs)   17:44, 29 May 2011

I tried this before I committed the code.

However, it did *not* work.

#Comment by Wikinaut (talk | contribs)   17:50, 29 May 2011

Okay, you are right.

What I did wrong was: I added 'dependencies' => array( 'jquery.ui.dialog', 'jquery.ui.droppable.js' ), i.e. with ".js" which was wrong. Sorry.

This commit should be ***reverted*** - I will ask someone else to do this in order not to break anything.

Status & tagging log