ddview.js 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. MODx.DataView.dropZone = function(view, config){
  2. config = config || {};
  3. this.view = view;
  4. var ddGroup = config.ddGroup || 'dataviewdd';
  5. var dd;
  6. if (Ext.isArray(ddGroup)){
  7. dd = ddGroup.shift();
  8. } else {
  9. dd = ddGroup;
  10. ddGroup = null;
  11. }
  12. MODx.DataView.dropZone.superclass.constructor.call(this, view.getEl(), { containerScroll: true/*, ddGroup: dd */});
  13. };
  14. Ext.extend(MODx.DataView.dropZone, Ext.dd.DropZone,{
  15. getTargetFromEvent: function(e) {
  16. return e.getTarget('.modx-pb-thumb-wrap');
  17. }
  18. ,onNodeEnter : function(target, dd, e, data) {
  19. Ext.fly(target).addClass('x-view-selected');
  20. }
  21. ,onNodeOut : function(target, dd, e, data) {
  22. Ext.fly(target).removeClass('x-view-selected');
  23. }
  24. ,onNodeOver : function(target, dd, e, data) {
  25. return Ext.dd.DropZone.prototype.dropAllowed && (target != data.nodes[0]);
  26. }
  27. ,onNodeDrop : function(target, dd, e, data) {
  28. var targetNode = this.view.getRecord(target);
  29. var sourceNode = this.view.getRecord(data.nodes[0]);
  30. if (sourceNode == targetNode) { return false; }
  31. var targetElement = Ext.get(target);
  32. var sourceElement = Ext.get(data.nodes[0]);
  33. sourceElement.insertBefore(targetElement);
  34. this.view.fireEvent('sort',{
  35. target: targetNode
  36. ,source: sourceNode
  37. ,event: e
  38. ,dd: dd
  39. });
  40. return true;
  41. }
  42. });
  43. MODx.DataView.dragZone = function(view,config) {
  44. config = config || {};
  45. this.view = view;
  46. MODx.DataView.dragZone.superclass.constructor.call(this,view.getEl());
  47. };
  48. Ext.extend(MODx.DataView.dragZone,Ext.dd.DragZone,{
  49. getDragData : function(e){
  50. var target = e.getTarget('.modx-pb-thumb-wrap');
  51. if(target){
  52. var view = this.view;
  53. if(!view.isSelected(target)){
  54. view.onClick(e);
  55. }
  56. var selNodes = view.getSelectedNodes();
  57. var dragData = {
  58. nodes: selNodes
  59. };
  60. if(selNodes.length == 1){
  61. dragData.ddel = target;
  62. dragData.single = true;
  63. }else{
  64. var div = document.createElement('div'); // create the multi element drag "ghost"
  65. div.className = 'multi-proxy';
  66. for(var i = 0, len = selNodes.length; i < len; i++){
  67. div.appendChild(selNodes[i].firstChild.firstChild.cloneNode(true)); // image nodes only
  68. if((i+1) % 3 == 0){
  69. div.appendChild(document.createElement('br'));
  70. }
  71. }
  72. var count = document.createElement('div'); // selected image count
  73. count.innerHTML = _('gallery.images_selected',{ count: i });
  74. div.appendChild(count);
  75. dragData.ddel = div;
  76. dragData.multi = true;
  77. }
  78. return dragData;
  79. }
  80. return false;
  81. }
  82. // the default action is to "highlight" after a bad drop
  83. // but since an image can't be highlighted, let's frame it
  84. ,afterRepair:function(){
  85. for(var i = 0, len = this.dragData.nodes.length; i < len; i++){
  86. Ext.fly(this.dragData.nodes[i]).frame('#8db2e3', 1);
  87. }
  88. this.dragging = false;
  89. }
  90. // override the default repairXY with one offset for the margins and padding
  91. ,getRepairXY : function(e){
  92. if(!this.dragData.multi){
  93. var xy = Ext.Element.fly(this.dragData.ddel).getXY();
  94. xy[0]+=3;xy[1]+=3;
  95. return xy;
  96. }
  97. return false;
  98. }
  99. })