add IUserFriendlyError adapter for violation of check constraints
This way we get back the same error messages we get from the python
check.
Related to #5154406
/* * jQuery UI Sortable * * Copyright (c) 2008 Paul Bakaus * Dual licensed under the MIT (MIT-LICENSE.txt) * and GPL (GPL-LICENSE.txt) licenses. * * http://docs.jquery.com/UI/Sortables * * Depends: * ui.base.js * * Revision: $Id: ui.sortable.js 5262 2008-04-17 13:13:51Z paul.bakaus $ */;(function($){if(window.Node&&Node.prototype&&!Node.prototype.contains){Node.prototype.contains=function(arg){return!!(this.compareDocumentPosition(arg)&16);};}$.widget("ui.sortableTree",$.extend($.ui.mouse,{init:function(){//Initialize needed constantsvarself=this,o=this.options;this.containerCache={};this.element.addClass("ui-sortableTree");//Get the itemsthis.refresh();//Let's determine the parent's offsetif(!(/(relative|absolute|fixed)/).test(this.element.css('position')))this.element.css('position','relative');this.offset=this.element.offset();//Initialize mouse events for interactionthis.mouseInit();//Prepare cursorAtif(o.cursorAt&&o.cursorAt.constructor==Array)o.cursorAt={left:o.cursorAt[0],top:o.cursorAt[1]};},plugins:{},ui:function(inst){return{helper:(inst||this)["helper"],position:(inst||this)["position"].current,absolutePosition:(inst||this)["position"].absolute,instance:this,options:this.options,element:this.element,item:(inst||this)["currentItem"],sender:inst?inst.element:null};},propagate:function(n,e,inst){$.ui.plugin.call(this,n,[e,this.ui(inst)]);this.element.triggerHandler(n=="sort"?n:"sort"+n,[e,this.ui(inst)],this.options[n]);},serialize:function(o){varitems=$(this.options.items,this.element).not('.ui-sortableTree-helper');//Only the items of the sortable itselfvarstr=[];o=o||{};items.each(function(){varres=($(this).attr(o.attribute||'id')||'').match(o.expression||(/(.+)[-=_](.+)/));if(res)str.push((o.key||res[1])+'[]='+(o.key?res[1]:res[2]));});returnstr.join('&');},toArray:function(attr){varitems=$(this.options.items,this.element).not('.ui-sortableTree-helper');//Only the items of the sortable itselfvarret=[];items.each(function(){ret.push($(this).attr(attr||'id'));});returnret;},enable:function(){this.element.removeClass("ui-sortableTree-disabled");this.options.disabled=false;},disable:function(){this.element.addClass("ui-sortableTree-disabled");this.options.disabled=true;},/* Be careful with the following core functions */intersectsWith:function(item){varx1=this.position.absolute.left-10,x2=x1+10,y1=this.position.absolute.top-10,y2=y1+10;varl=item.left,r=l+item.width,t=item.top,b=t+item.height;return(l<x1+(this.helperProportions.width/2)// Right Half&&x2-(this.helperProportions.width/2)<r// Left Half&&t<y1+(this.helperProportions.height/2)// Bottom Half&&y2-(this.helperProportions.height/2)<b);// Top Half},intersectsWithEdge:function(item){vary1=this.position.absolute.top-10,y2=y1+10;vart=item.top,b=t+item.height;if(!this.intersectsWith(item.item.parents(".ui-sortableTree").data("sortableTree").containerCache))returnfalse;if(!(t<y1+(this.helperProportions.height/2)// Bottom Half&&y2-(this.helperProportions.height/2)<b))returnfalse;// Top Halfif(y2>t&&y1<t)return1;//Crosses top edgeif(y1<b&&y2>b)return2;//Crosses bottom edgereturnfalse;},refresh:function(){this.refreshItems();this.refreshPositions();},refreshItems:function(){this.items=[];this.containers=[this];varitems=this.items;varqueries=[$(this.options.items,this.element)];if(this.options.connectWith){for(vari=this.options.connectWith.length-1;i>=0;i--){varcur=$(this.options.connectWith[i]);for(varj=cur.length-1;j>=0;j--){varinst=$.data(cur[j],'sortableTree');if(inst&&!inst.options.disabled){queries.push($(inst.options.items,inst.element));this.containers.push(inst);}};};}for(vari=queries.length-1;i>=0;i--){queries[i].each(function(){$.data(this,'sortableTree-item',true);// Data for target checking (mouse manager)items.push({item:$(this),width:0,height:0,left:0,top:0});});};},refreshPositions:function(fast){for(vari=this.items.length-1;i>=0;i--){if(!fast)this.items[i].height=this.items[i].item.outerHeight();this.items[i].top=this.items[i].item.offset().top;};for(vari=this.containers.length-1;i>=0;i--){varp=this.containers[i].element.offset();this.containers[i].containerCache.left=p.left;this.containers[i].containerCache.top=p.top;this.containers[i].containerCache.width=this.containers[i].element.outerWidth();this.containers[i].containerCache.height=this.containers[i].element.outerHeight();};},destroy:function(){this.element.removeClass("ui-sortableTree ui-sortableTree-disabled").removeData("sortableTree").unbind(".sortableTree");this.mouseDestroy();for(vari=this.items.length-1;i>=0;i--)this.items[i].item.removeData("sortableTree-item");},contactContainers:function(e){for(vari=this.containers.length-1;i>=0;i--){if(this.intersectsWith(this.containers[i].containerCache)){if(!this.containers[i].containerCache.over){if(this.currentContainer!=this.containers[i]){//When entering a new container, we will find the item with the least distance and append our item near itvardist=10000;varitemWithLeastDistance=null;varbase=this.position.absolute.top;for(varj=this.items.length-1;j>=0;j--){if(!this.containers[i].element[0].contains(this.items[j].item[0]))continue;varcur=this.items[j].top;if(Math.abs(cur-base)<dist){dist=Math.abs(cur-base);itemWithLeastDistance=this.items[j];}}itemWithLeastDistance?this.rearrange(e,itemWithLeastDistance):this.rearrange(e,null,this.containers[i].element);this.propagate("change",e);//Call plugins and callbacksthis.containers[i].propagate("change",e,this);//Call plugins and callbacksthis.currentContainer=this.containers[i];}this.containers[i].propagate("over",e,this);this.containers[i].containerCache.over=1;}}else{if(this.containers[i].containerCache.over){this.containers[i].propagate("out",e,this);this.containers[i].containerCache.over=0;}}};},mouseStart:function(e,el){if(this.options.disabled||this.options.type=='static')returnfalse;//Find out if the clicked node (or one of its parents) is a actual item in this.itemsvarcurrentItem=null,nodes=$(e.target).parents().each(function(){if($.data(this,'sortableTree-item')){currentItem=$(this);returnfalse;}});if($.data(e.target,'sortableTree-item'))currentItem=$(e.target);if(!currentItem)returnfalse;if(this.options.handle){varvalidHandle=false;$(this.options.handle,currentItem).each(function(){if(this==e.target)validHandle=true;});if(!validHandle)returnfalse;}this.currentItem=currentItem;varo=this.options;this.currentContainer=this;this.refresh();//Create and append the visible helperthis.helper=typeofo.helper=='function'?$(o.helper.apply(this.element[0],[e,this.currentItem])):this.currentItem.clone();if(!this.helper.parents('body').length)this.helper.appendTo("body");//Add the helper to the DOM if that didn't happen alreadythis.helper.css({position:'absolute',clear:'both'}).addClass('ui-sortableTree-helper');//Position it absolutely and add a helper class//Prepare variables for position generation$.extend(this,{offsetParent:this.helper.offsetParent(),offsets:{absolute:this.currentItem.offset()}});//Save the first time position$.extend(this,{position:{current:{left:e.pageX,top:e.pageY},absolute:{left:e.pageX,top:e.pageY},dom:this.currentItem.prev()[0]},clickOffset:{left:-5,top:-5}});this.propagate("start",e);//Call plugins and callbacksthis.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()};//Save and store the helper proportionsfor(vari=this.containers.length-1;i>=0;i--){this.containers[i].propagate("activate",e,this);}//Post 'activate' events to possible containers//Prepare possible droppablesif($.ui.ddmanager)$.ui.ddmanager.current=this;if($.ui.ddmanager&&!o.dropBehaviour)$.ui.ddmanager.prepareOffsets(this,e);this.dragging=true;returntrue;},mouseStop:function(e){if(this.newPositionAt)this.options.sortIndication.remove.call(this.currentItem,this.newPositionAt);//remove sort indicatorthis.propagate("stop",e);//Call plugins and trigger callbacks//If we are using droppables, inform the manager about the dropvardropped=($.ui.ddmanager&&!this.options.dropBehaviour)?$.ui.ddmanager.drop(this,e):false;if(!dropped&&this.newPositionAt)this.newPositionAt[this.direction=='down'?'before':'after'](this.currentItem);//Append to element to its new positionif(this.position.dom!=this.currentItem.prev()[0])this.propagate("update",e);//Trigger update callback if the DOM position has changedif(!this.element[0].contains(this.currentItem[0])){//Node was moved out of the current elementthis.propagate("remove",e);for(vari=this.containers.length-1;i>=0;i--){if(this.containers[i].element[0].contains(this.currentItem[0])){this.containers[i].propagate("update",e,this);this.containers[i].propagate("receive",e,this);}};};//Post events to containersfor(vari=this.containers.length-1;i>=0;i--){this.containers[i].propagate("deactivate",e,this);if(this.containers[i].containerCache.over){this.containers[i].propagate("out",e,this);this.containers[i].containerCache.over=0;}}this.dragging=false;if(this.cancelHelperRemoval)returnfalse;this.helper.remove();returnfalse;},mouseDrag:function(e){//Compute the helpers positionthis.position.current={top:e.pageY+5,left:e.pageX+5};this.position.absolute={left:e.pageX+5,top:e.pageY+5};//Interconnect with droppablesif($.ui.ddmanager)$.ui.ddmanager.drag(this,e);varintersectsWithDroppable=false;$.each($.ui.ddmanager.droppables,function(){if(this.isover)intersectsWithDroppable=true;});//Rearrangeif(intersectsWithDroppable){if(this.newPositionAt)this.options.sortIndication.remove.call(this.currentItem,this.newPositionAt);}else{for(vari=this.items.length-1;i>=0;i--){if(this.currentItem[0].contains(this.items[i].item[0]))continue;varintersection=this.intersectsWithEdge(this.items[i]);if(!intersection)continue;this.direction=intersection==1?"down":"up";this.rearrange(e,this.items[i]);this.propagate("change",e);//Call plugins and callbacksbreak;}}//Post events to containersthis.contactContainers(e);this.propagate("sort",e);//Call plugins and callbacksthis.helper.css({left:this.position.current.left+'px',top:this.position.current.top+'px'});// Stick the helper to the cursorreturnfalse;},rearrange:function(e,i,a){if(i){if(this.newPositionAt)this.options.sortIndication.remove.call(this.currentItem,this.newPositionAt);this.newPositionAt=i.item;this.options.sortIndication[this.direction].call(this.currentItem,this.newPositionAt);}else{//Append}}}));$.extend($.ui.sortableTree,{defaults:{items:'> *',zIndex:1000,distance:1},getter:"serialize toArray"});})(jQuery);