skill_tree.tpl 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373
  1. <script type="text/javascript">
  2. //js settings
  3. var url = '{$url}';
  4. var skills = []; //current window divs
  5. var parents = []; //list of parents normally there should be only 2
  6. var hidden_parent = '';
  7. var duration_value = 500;
  8. //Block settings see the SkillVisualizer Class
  9. var offset_x = {$skill_visualizer->offset_x};
  10. var offset_y = {$skill_visualizer->offset_y};
  11. var space_between_blocks_x = {$skill_visualizer->space_between_blocks_x};
  12. var space_between_blocks_y = {$skill_visualizer->space_between_blocks_y};
  13. var center_x = {$skill_visualizer->center_x};
  14. var block_size = {$skill_visualizer->block_size};
  15. //Setting the parent by default
  16. var parents = ['block_1'];
  17. jsPlumb.bind("ready", function() {
  18. //Open dialog
  19. $("#dialog-form").dialog({
  20. autoOpen: false,
  21. modal : true,
  22. width : 550,
  23. height : 480,
  24. });
  25. //Filling skills select
  26. $.getJSON( "{$url}&a=get_skills", {},
  27. function(data) {
  28. $.each(data, function(n, parent) {
  29. // add a new option with the JSON-specified value and text
  30. $("<option />").attr("value", parent.id).text(parent.name).appendTo("#parent_id");
  31. });
  32. }
  33. );
  34. //Filling gradebook select
  35. $.getJSON( "{$url}&a=get_gradebooks", {},
  36. function(data) {
  37. $.each(data, function(n, gradebook) {
  38. // add a new option with the JSON-specified value and text
  39. $("<option />").attr("value", gradebook.id).text(gradebook.name).appendTo("#gradebook_id");
  40. });
  41. }
  42. );
  43. //Add button
  44. $("#add_item_link").click(function() {
  45. $("#name").attr('value', '');
  46. $("#description").attr('value', '');
  47. $("#parent_id option:selected").removeAttr('selected');
  48. $("#gradebook_id option:selected").removeAttr('selected');
  49. $("#dialog-form").dialog("open");
  50. });
  51. var name = $( "#name" ),
  52. description = $( "#description" ),
  53. allFields = $( [] ).add( name ).add( description ), tips = $(".validateTips");
  54. //Add button process
  55. $("#dialog-form").dialog({
  56. buttons: {
  57. "Add" : function() {
  58. var bValid = true;
  59. bValid = bValid && checkLength( name, "name", 1, 255 );
  60. if (bValid) {
  61. var params = $("#add_item").serialize();
  62. $.ajax({
  63. url: url+'&a=add&'+params,
  64. success:function(data) {
  65. //new window
  66. parent_id = $("#parent_id option:selected").attr('value');
  67. //Great stuff
  68. open_block('block_'+parent_id);
  69. $("#dialog-form").dialog("close");
  70. }
  71. });
  72. }
  73. },
  74. },
  75. close: function() {
  76. $("#name").attr('value', '');
  77. $("#description").attr('value', '');
  78. }
  79. });
  80. //Clicking a box skill (we use live instead of bind because we're creating divs on the fly )
  81. $(".open_block").live('click', function() {
  82. var id = $(this).attr('id');
  83. //if is root
  84. if (parents[0] == id) {
  85. parents = [id];
  86. }
  87. if (parents[1] != id) {
  88. if (parents.length == 2 ) {
  89. hidden_parent = parents[0];
  90. //console.log('deleting: '+parents[0]);
  91. //removing father
  92. for (var i = 0; i < skills.length; i++) {
  93. if ( skills[i].element == parents[0] ) {
  94. //console.log('deleting :'+ skills[i].element + ' here ');
  95. jsPlumb.deleteEndpoint(skills[i].endp);
  96. $("#"+skills[i].element).remove();
  97. //skills.splice(i,1)
  98. }
  99. }
  100. parents.splice(0,1);
  101. parents.push(id);
  102. }
  103. if ($(this).hasClass('first_window')) {
  104. //show the hidden_parent
  105. //if (hidden_parent != '') {
  106. parents = [hidden_parent, id];
  107. // console.log(parents);
  108. open_parent(hidden_parent, id);
  109. //}
  110. }
  111. if (jQuery.inArray(id, parents) == -1) {
  112. parents.push(id);
  113. }
  114. open_block(id);
  115. }
  116. //Setting class
  117. cleanclass($(this));
  118. $(this).addClass('second_window');
  119. parent_div = $("#"+parents[0]);
  120. cleanclass(parent_div);
  121. parent_div.addClass('first_window');
  122. parent_div = $("#"+parents[1]);
  123. cleanclass(parent_div);
  124. parent_div.addClass('second_window');
  125. console.log(parents);
  126. // console.log(skills);
  127. console.log('hidden_parent : ' + hidden_parent);
  128. });
  129. //Skill title click
  130. $(".edit_block").live('click',function() {
  131. var my_id = $(this).attr('id');
  132. my_id = my_id.split('_')[2];
  133. //Cleaning selected
  134. $("#parent_id option:selected").removeAttr('selected');
  135. $("#gradebook_id option:selected").removeAttr('selected');
  136. $.ajax({
  137. url: url+'&a=get_skill_info&id='+my_id,
  138. success: function(json) {
  139. var skill = jQuery.parseJSON(json);
  140. $("#name").attr('value', skill.name);
  141. $("#id").attr('value', skill.id);
  142. $("#description").attr('value', skill.description);
  143. //filling parent_id
  144. $("#parent_id option[value='"+skill.extra.parent_id+"']").attr('selected', 'selected');
  145. //filling the gradebook_id
  146. jQuery.each(skill.gradebooks, function(index, data) {
  147. $("#gradebook_id option[value='"+data.id+"']").attr('selected', 'selected');
  148. });
  149. },
  150. });
  151. $("#gradebook_id").trigger("liszt:updated");
  152. $("#parent_id").trigger("liszt:updated");
  153. $("#dialog-form").dialog("open");
  154. return false;
  155. });
  156. //
  157. $(".window").bind('click', function() {
  158. var id = $(this).attr('id');
  159. id = id.split('_')[1];
  160. //$("#dialog-form").dialog("open");
  161. });
  162. // chrome fix.
  163. document.onselectstart = function () { return false; };
  164. // render mode
  165. var resetRenderMode = function(desiredMode) {
  166. var newMode = jsPlumb.setRenderMode(desiredMode);
  167. jsPlumbDemo.init();
  168. };
  169. resetRenderMode(jsPlumb.CANVAS);
  170. });
  171. ;(function() {
  172. prepare = function(elId, endpoint) {
  173. jsPlumbDemo.initHover(elId);
  174. //jsPlumbDemo.initAnimation(elId);
  175. var e = jsPlumb.addEndpoint(elId, endpoint);
  176. jsPlumbDemo.initjulio(e);
  177. skills.push({
  178. element:elId, endp:e
  179. });
  180. return e;
  181. },
  182. window.jsPlumbDemo = {
  183. initjulio :function(e) {
  184. },
  185. initHover :function(elId) {
  186. $("#" + elId).click(function() {
  187. var all = jsPlumb.getConnections({
  188. source:elId
  189. });
  190. });
  191. /*$("#" + elId).hover(
  192. function() { $(this).addClass("bigdot-hover"); },
  193. function() { $(this).removeClass("bigdot-hover"); }
  194. );*/
  195. },
  196. init : function() {
  197. jsPlumb.Defaults.DragOptions = { cursor: 'pointer', zIndex:2000 };
  198. jsPlumb.Defaults.PaintStyle = { strokeStyle:'#666' };
  199. jsPlumb.Defaults.EndpointStyle = { width:20, height:16, strokeStyle:'#666' };
  200. jsPlumb.Defaults.Endpoint = "Rectangle";
  201. jsPlumb.Defaults.Anchors = ["TopCenter", "TopCenter"];
  202. jsPlumb.bind("jsPlumbConnection", function(e) {
  203. //updateConnections(e.connection);
  204. });
  205. jsPlumb.bind("jsPlumbConnectionDetached", function(e) {
  206. //updateConnections(e.connection, true);
  207. });
  208. jsPlumb.Defaults.Overlays = [
  209. //[ "Arrow", { location:0.5 } ], if you want to add an arrow in the connection
  210. ];
  211. jsPlumb.setMouseEventsEnabled(true);
  212. {$js}
  213. var divsWithWindowClass = jsPlumbDemo.getSelector(".window");
  214. jsPlumb.draggable(divsWithWindowClass);
  215. jsPlumbDemo.attachBehaviour();
  216. }
  217. };
  218. })();
  219. $(document).ready( function() {
  220. //When creating a connection see
  221. //http://jsplumb.org/apidocs/files/jsPlumb-1-3-2-all-js.html#bind
  222. jsPlumb.bind("jsPlumbConnection", function(conn) {
  223. //alert("Connection created " + conn.sourceId + " to " + conn.targetId + " ");
  224. //jsPlumb.detach(conn);
  225. });
  226. //When double clicking a connection
  227. jsPlumb.bind("click", function(conn) {
  228. if (confirm("Delete connection from " + conn.sourceId + " to " + conn.targetId + "?"))
  229. jsPlumb.detach(conn);
  230. });
  231. //When double clicking a connection
  232. jsPlumb.bind("click", function(endpoint) {
  233. if (confirm("Delete connection from " + conn.sourceId + " to " + conn.targetId + "?"))
  234. jsPlumb.detach(conn);
  235. });
  236. $(".chzn-select").chosen();
  237. });
  238. ;(function() {
  239. jsPlumbDemo.getSelector = function(spec) {
  240. return $(spec);
  241. };
  242. jsPlumbDemo.attachBehaviour = function() {
  243. $(".hide").click(function() {
  244. jsPlumb.toggle($(this).attr("rel"));
  245. });
  246. $(".drag").click(function() {
  247. var s = jsPlumb.toggleDraggable($(this).attr("rel"));
  248. $(this).html(s ? 'disable dragging' : 'enable dragging');
  249. if (!s) $("#" + $(this).attr("rel")).addClass('drag-locked'); else $("#" + $(this).attr("rel")).removeClass('drag-locked');
  250. $("#" + $(this).attr("rel")).css("cursor", s ? "pointer" : "default");
  251. });
  252. $(".detach").click(function() {
  253. jsPlumb.detachAll($(this).attr("rel"));
  254. });
  255. $("#clear").click(function() {
  256. jsPlumb.detachEverything(); showConnections();
  257. });
  258. };
  259. })();
  260. </script>
  261. <a class="a_button gray" id="add_item_link" href="#">Add item</a>
  262. {$html}
  263. <div id="dialog-form" style="display:none;">
  264. <p class="validateTips"></p>
  265. <form id="add_item" name="form">
  266. <input type="hidden" name="id" id="id"/>
  267. <div class="row">
  268. <div class="label">
  269. <label for="name">Name</label>
  270. </div>
  271. <div class="formw">
  272. <input type="text" name="name" id="name" size="40" />
  273. </div>
  274. </div>
  275. <div class="row">
  276. <div class="label">
  277. <label for="name">Parent</label>
  278. </div>
  279. <div class="formw">
  280. <select id="parent_id" name="parent_id" />
  281. </select>
  282. </div>
  283. </div>
  284. <div class="row">
  285. <div class="label">
  286. <label for="name">Gradebook</label>
  287. </div>
  288. <div class="formw">
  289. <select id="gradebook_id" name="gradebook_id[]" multiple="multiple"/>
  290. </select>
  291. <span class="help-block">
  292. Gradebook Description
  293. </span>
  294. </div>
  295. </div>
  296. <div class="row">
  297. <div class="label">
  298. <label for="name">Description</label>
  299. </div>
  300. <div class="formw">
  301. <textarea name="description" id="description" cols="40" rows="7"></textarea>
  302. </div>
  303. </div>
  304. </form>
  305. </div>