1 (function(global){ // BEGIN CLOSURE 2 3 var Joint = global.Joint, 4 Element = Joint.dia.Element, 5 point = Joint.point; 6 7 /** 8 * @name Joint.dia.org 9 * @namespace Holds functionality related to Org-charts. 10 */ 11 var org = Joint.dia.org = {}; 12 13 /** 14 * Predefined arrow. You are free to use this arrow as the option parameter to joint method. 15 * @name arrow 16 * @memberOf Joint.dia.org 17 * @example 18 * var arrow = Joint.dia.org.arrow; 19 */ 20 org.arrow = { 21 startArrow: {type: 'none'}, 22 endArrow: {type: 'none'}, 23 attrs: {"stroke-dasharray": "none", 'stroke-width': 2, stroke: 'gray' } 24 }; 25 26 27 /** 28 * Organizational chart member. 29 * @methodOf Joint.dia.org 30 */ 31 org.Member = Element.extend({ 32 object: 'Member', 33 module: 'org', 34 init: function(properties) { 35 var p = Joint.DeepSupplement(this.properties, properties, { 36 attrs: { fill: 'lightgreen', stroke: '#008e09', 'stroke-width': 2 }, 37 name: '', 38 position: '', 39 nameAttrs: { 'font-weight': 'bold' }, 40 positionAttrs: {}, 41 swimlaneAttrs: { 'stroke-width': 1, stroke: 'black' }, 42 labelOffsetY: 10, 43 radius: 10, 44 shadow: true, 45 avatar: '', 46 padding: 5 47 }); 48 this.setWrapper(this.paper.rect(p.rect.x, p.rect.y, p.rect.width, p.rect.height, p.radius).attr(p.attrs)); 49 if (p.avatar) { 50 this.addInner(this.paper.image(p.avatar, p.rect.x + p.padding, p.rect.y + p.padding, p.rect.height - 2*p.padding, p.rect.height - 2*p.padding)); 51 p.labelOffsetX = p.rect.height; 52 } 53 if (p.position) { 54 var positionElement = this.getPositionElement(); 55 this.addInner(positionElement[0]); 56 this.addInner(positionElement[1]); // swimlane 57 } 58 this.addInner(this.getNameElement()); 59 }, 60 getPositionElement: function() { 61 var p = this.properties, 62 bb = this.wrapper.getBBox(), 63 t = this.paper.text(bb.x + bb.width/2, bb.y + bb.height/2, p.position).attr(p.positionAttrs || {}), 64 tbb = t.getBBox(); 65 t.translate(bb.x - tbb.x + p.labelOffsetX, bb.y - tbb.y + tbb.height); 66 tbb = t.getBBox(); 67 var l = this.paper.path(['M', tbb.x, tbb.y + tbb.height + p.padding, 68 'L', tbb.x + tbb.width, tbb.y + tbb.height + p.padding].join(' ')); 69 return [t, l]; 70 }, 71 getNameElement: function() { 72 var p = this.properties, 73 bb = this.wrapper.getBBox(), 74 t = this.paper.text(bb.x + bb.width/2, bb.y + bb.height/2, p.name).attr(p.nameAttrs || {}), 75 tbb = t.getBBox(); 76 t.translate(bb.x - tbb.x + p.labelOffsetX, bb.y - tbb.y + tbb.height*2 + p.labelOffsetY); 77 return t; 78 } 79 }); 80 81 })(this); // END CLOSURE 82