dragdropzones.js
上传用户:dawnssy
上传日期:2022-08-06
资源大小:9345k
文件大小:10k
源码类别:

JavaScript

开发平台:

JavaScript

  1. /*!  * Ext JS Library 3.1.0  * Copyright(c) 2006-2009 Ext JS, LLC  * licensing@extjs.com  * http://www.extjs.com/license  */ Ext.onReady(function() {
  2.     var patients = [{
  3.         insuranceCode: '11111',
  4.         name: 'Fred Bloggs',
  5.         address: 'Main Street',
  6.         telephone: '555 1234 123'
  7.     }, {
  8.         insuranceCode: '22222',
  9.         name: 'Fred West',
  10.         address: 'Cromwell Street',
  11.         telephone: '666 666 666'
  12.     }, {
  13.         insuranceCode: '33333',
  14.         name: 'Fred Mercury',
  15.         address: 'Over The Rainbow',
  16.         telephone: '555 321 0987'
  17.     }, {
  18.         insuranceCode: '44444',
  19.         name: 'Fred Forsyth',
  20.         address: 'Blimp Street',
  21.         telephone: '555 111 2222'
  22.     }, {
  23.         insuranceCode: '55555',
  24.         name: 'Fred Douglass',
  25.         address: 'Talbot County, Maryland',
  26.         telephone: 'N/A'
  27.     }];
  28.     var PatientRecord = Ext.data.Record.create([{
  29.         name: 'name'
  30.     }, {
  31.         name: 'address'
  32.     }, {
  33.         name: 'telephone'
  34.     }]);
  35.     var patientStore = new Ext.data.Store({
  36.         data: patients,
  37.         reader: new Ext.data.JsonReader({
  38.             id: 'insuranceCode'
  39.         }, PatientRecord)
  40.     });
  41.     var hospitals = [{
  42.         code: 'AAAAA',
  43.         name: 'Saint Thomas',
  44.         address: 'Westminster Bridge Road, SE1 7EH',
  45.         telephone: '020 7188 7188'
  46.     }, {
  47.         code: 'BBBBB',
  48.         name: 'Queen's Medical Centre',
  49.         address: 'Derby Road, NG7 2UH',
  50.         telephone: '0115 924 9924'
  51.     }, {
  52.         code: 'CCCCC',
  53.         name: 'Saint Bartholomew',
  54.         address: 'West Smithfield, EC1A 7BE',
  55.         telephone: '020 7377 7000'
  56.     }, {
  57.         code: 'DDDDD',
  58.         name: 'Royal London',
  59.         address: 'Whitechapel, E1 1BB',
  60.         telephone: '020 7377 7000'
  61.     }];
  62.     
  63.     var HospitalRecord = Ext.data.Record.create([{
  64.         name: 'name'
  65.     }, {
  66.         name: 'address'
  67.     }, {
  68.         name: 'telephone'
  69.     }]);
  70.     var hospitalStore = new Ext.data.Store({
  71.         data: hospitals,
  72.         reader: new Ext.data.JsonReader({
  73.             id: 'code'
  74.         }, HospitalRecord)
  75.     });
  76.     
  77.     var patientView = new Ext.DataView({
  78.         cls: 'patient-view',
  79.         tpl: '<tpl for=".">' +
  80.                 '<div class="patient-source"><table><tbody>' +
  81.                     '<tr><td class="patient-label">Name</td><td class="patient-name">{name}</td></tr>' +
  82.                     '<tr><td class="patient-label">Address</td><td class="patient-name">{address}</td></tr>' +
  83.                     '<tr><td class="patient-label">Telephone</td><td class="patient-name">{telephone}</td></tr>' +
  84.                 '</tbody></table></div>' +
  85.              '</tpl>',
  86.         itemSelector: 'div.patient-source',
  87.         overClass: 'patient-over',
  88.         selectedClass: 'patient-selected',
  89.         singleSelect: true,
  90.         store: patientStore,
  91.         listeners: {
  92.             render: initializePatientDragZone
  93.         }
  94.     });
  95.     var helpWindow = new Ext.Window({
  96.         title: 'Source code',
  97.         width: 920,
  98.         height: 500,
  99.         closeAction: 'hide',
  100.         bodyCfg: {tag: 'textarea', readonly: true},
  101.         bodyStyle: {
  102.             backgroundColor: 'white',
  103.             margin: '0px',
  104.             border: '0px none'
  105.         },
  106.         listeners: {
  107.             render: function(w) {
  108.                 Ext.Ajax.request({
  109.                     url: 'dragdropzones.js',
  110.                     success: function(r) {
  111.                         w.body.dom.value = r.responseText;
  112.                     }
  113.                 });
  114.             }
  115.         }
  116.     });
  117.     var hospitalGrid = new Ext.grid.GridPanel({
  118.         title: 'Hospitals',
  119.         region: 'center',
  120.         margins: '0 5 5 0',
  121.         bbar: [{
  122.             text: 'View Source',
  123.             handler: function() {
  124.                 helpWindow.show();
  125.             }
  126.         }],
  127.         columns: [{
  128.             dataIndex: 'name',
  129.             header: 'Name',
  130.             width: 200
  131.         }, {
  132.             dataIndex: 'address',
  133.             header: 'Address',
  134.             width: 300
  135.         }, {
  136.             dataIndex: 'telephone',
  137.             header: 'Telephone',
  138.             width: 100
  139.         }],
  140.         viewConfig: {
  141.             tpl: new Ext.XTemplate('<div class="hospital-target">Drop Patient Here</div>'),
  142.             enableRowBody: true,
  143.             getRowClass: function(rec, idx, p, store) {
  144.                 p.body = this.tpl.apply(rec.data);
  145.             }
  146.         },
  147.         store: hospitalStore,
  148.         listeners: {
  149.             render: initializeHospitalDropZone
  150.         }
  151.     });
  152.     new Ext.Viewport({
  153.         layout: 'border',
  154.         items: [{
  155.             cls: 'app-header',
  156.             region: 'north',
  157.             height: 30,
  158.             html: '<h1>Patient Hospital Assignment</h1>',
  159.             margins: '5 5 5 5'
  160.         }, {
  161.             title: 'Patients',
  162.             region: 'west',
  163.             width: 300,
  164.             margins: '0 5 5 5',
  165.             items: patientView
  166.         }, hospitalGrid ]
  167.     });
  168. });
  169. /*
  170.  * Here is where we "activate" the DataView.
  171.  * We have decided that each node with the class "patient-source" encapsulates a single draggable
  172.  * object.
  173.  *
  174.  * So we inject code into the DragZone which, when passed a mousedown event, interrogates
  175.  * the event to see if it was within an element with the class "patient-source". If so, we
  176.  * return non-null drag data.
  177.  *
  178.  * Returning non-null drag data indicates that the mousedown event has begun a dragging process.
  179.  * The data must contain a property called "ddel" which is a DOM element which provides an image
  180.  * of the data being dragged. The actual node clicked on is not dragged, a proxy element is dragged.
  181.  * We can insert any other data into the data object, and this will be used by a cooperating DropZone
  182.  * to perform the drop operation.
  183.  */
  184. function initializePatientDragZone(v) {
  185.     v.dragZone = new Ext.dd.DragZone(v.getEl(), {
  186. //      On receipt of a mousedown event, see if it is within a draggable element.
  187. //      Return a drag data object if so. The data object can contain arbitrary application
  188. //      data, but it should also contain a DOM element in the ddel property to provide
  189. //      a proxy to drag.
  190.         getDragData: function(e) {
  191.             var sourceEl = e.getTarget(v.itemSelector, 10);
  192.             if (sourceEl) {
  193.                 d = sourceEl.cloneNode(true);
  194.                 d.id = Ext.id();
  195.                 return v.dragData = {
  196.                     sourceEl: sourceEl,
  197.                     repairXY: Ext.fly(sourceEl).getXY(),
  198.                     ddel: d,
  199.                     patientData: v.getRecord(sourceEl).data
  200.                 }
  201.             }
  202.         },
  203. //      Provide coordinates for the proxy to slide back to on failed drag.
  204. //      This is the original XY coordinates of the draggable element.
  205.         getRepairXY: function() {
  206.             return this.dragData.repairXY;
  207.         }
  208.     });
  209. }
  210. /*
  211.  * Here is where we "activate" the GridPanel.
  212.  * We have decided that the element with class "hospital-target" is the element which can receieve
  213.  * drop gestures. So we inject a method "getTargetFromEvent" into the DropZone. This is constantly called
  214.  * while the mouse is moving over the DropZone, and it returns the target DOM element if it detects that
  215.  * the mouse if over an element which can receieve drop gestures.
  216.  *
  217.  * Once the DropZone has been informed by getTargetFromEvent that it is over a target, it will then
  218.  * call several "onNodeXXXX" methods at various points. These include:
  219.  *
  220.  * onNodeEnter
  221.  * onNodeOut
  222.  * onNodeOver
  223.  * onNodeDrop
  224.  *
  225.  * We provide implementations of each of these to provide behaviour for these events.
  226.  */
  227. function initializeHospitalDropZone(g) {
  228.     g.dropZone = new Ext.dd.DropZone(g.getView().scroller, {
  229. //      If the mouse is over a target node, return that node. This is
  230. //      provided as the "target" parameter in all "onNodeXXXX" node event handling functions
  231.         getTargetFromEvent: function(e) {
  232.             return e.getTarget('.hospital-target');
  233.         },
  234. //      On entry into a target node, highlight that node.
  235.         onNodeEnter : function(target, dd, e, data){ 
  236.             Ext.fly(target).addClass('hospital-target-hover');
  237.         },
  238. //      On exit from a target node, unhighlight that node.
  239.         onNodeOut : function(target, dd, e, data){ 
  240.             Ext.fly(target).removeClass('hospital-target-hover');
  241.         },
  242. //      While over a target node, return the default drop allowed class which
  243. //      places a "tick" icon into the drag proxy.
  244.         onNodeOver : function(target, dd, e, data){ 
  245.             return Ext.dd.DropZone.prototype.dropAllowed;
  246.         },
  247. //      On node drop, we can interrogate the target node to find the underlying
  248. //      application object that is the real target of the dragged data.
  249. //      In this case, it is a Record in the GridPanel's Store.
  250. //      We can use the data set up by the DragZone's getDragData method to read
  251. //      any data we decided to attach.
  252.         onNodeDrop : function(target, dd, e, data){
  253.             var rowIndex = g.getView().findRowIndex(target);
  254.             var h = g.getStore().getAt(rowIndex);
  255.             var targetEl = Ext.get(target);
  256.             targetEl.update(data.patientData.name+', '+targetEl.dom.innerHTML);
  257.             Ext.Msg.alert('Drop gesture', 'Dropped patient ' + data.patientData.name +
  258.                 ' on hospital ' + h.data.name);
  259.             return true;
  260.         }
  261.     });
  262. }