You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

преди 11 години
преди 13 години
преди 13 години
преди 13 години
преди 12 години
преди 13 години
преди 13 години
преди 13 години
преди 11 години
преди 13 години
преди 11 години
преди 13 години
преди 12 години
преди 13 години
преди 13 години
преди 11 години
преди 13 години
преди 11 години
преди 13 години
преди 12 години
преди 13 години
преди 13 години
преди 13 години
преди 11 години
преди 13 години
преди 13 години
преди 13 години
преди 13 години
преди 13 години
преди 13 години
преди 11 години
преди 13 години
преди 13 години
преди 11 години
преди 13 години
преди 11 години
преди 13 години
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. // Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
  2. // MIT License. See license.txt
  3. // for license information please see license.txt
  4. // constructor: parent, label, method, args
  5. wn.ui.Tree = Class.extend({
  6. init: function(args) {
  7. $.extend(this, args);
  8. this.nodes = {};
  9. this.$w = $('<div class="tree">').appendTo(this.parent);
  10. this.rootnode = new wn.ui.TreeNode({
  11. tree: this,
  12. parent: this.$w,
  13. label: this.label,
  14. expandable: true
  15. });
  16. this.set_style();
  17. },
  18. set_style: function() {
  19. wn.dom.set_style("\
  20. .tree li { list-style: none; }\
  21. .tree ul { margin-top: 2px; }\
  22. .tree-link { cursor: pointer; }\
  23. ")
  24. }
  25. })
  26. wn.ui.TreeNode = Class.extend({
  27. init: function(args) {
  28. var me = this;
  29. $.extend(this, args);
  30. this.loaded = false;
  31. this.expanded = false;
  32. this.tree.nodes[this.label] = this;
  33. this.$a = $('<span class="tree-link">')
  34. .click(function() {
  35. if(me.expandable && me.tree.method && !me.loaded) {
  36. me.load()
  37. } else {
  38. me.selectnode();
  39. }
  40. if(me.tree.click) me.tree.click(this);
  41. })
  42. .bind('reload', function() { me.reload(); })
  43. .data('label', this.label)
  44. .appendTo(this.parent);
  45. // label with icon
  46. var icon_html = '<i class="icon-fixed-width icon-file"></i>';
  47. if(this.expandable) {
  48. icon_html = '<i class="icon-fixed-width icon-folder-close"></i>';
  49. }
  50. $(icon_html + ' <a class="tree-label">' + this.label + "</a>").
  51. appendTo(this.$a);
  52. if(this.tree.onrender) {
  53. this.tree.onrender(this);
  54. }
  55. },
  56. selectnode: function() {
  57. // expand children
  58. if(this.$ul) {
  59. this.$ul.toggle();
  60. // open close icon
  61. this.$a.find('i').removeClass();
  62. if(this.$ul.css('display').toLowerCase()=='block') {
  63. this.$a.find('i').addClass('icon-fixed-width icon-folder-open');
  64. } else {
  65. this.$a.find('i').addClass('icon-fixed-width icon-folder-close');
  66. }
  67. }
  68. // select this link
  69. this.tree.$w.find('.selected')
  70. .removeClass('selected');
  71. this.$a.toggleClass('selected');
  72. this.expanded = !this.expanded;
  73. },
  74. reload: function() {
  75. if(this.expanded) {
  76. this.$a.click(); // collapse
  77. }
  78. if(this.$ul) {
  79. this.$ul.empty();
  80. }
  81. this.load();
  82. },
  83. addnode: function(data) {
  84. if(!this.$ul) {
  85. this.$ul = $('<ul>').toggle(false).appendTo(this.parent);
  86. }
  87. return new wn.ui.TreeNode({
  88. tree:this.tree,
  89. parent: $('<li>').appendTo(this.$ul),
  90. label: data.value,
  91. expandable: data.expandable,
  92. data: data
  93. });
  94. },
  95. load: function() {
  96. var me = this;
  97. args = $.extend(this.tree.args || {}, {
  98. parent: this.data ? this.data.value : null
  99. });
  100. $(me.$a).set_working();
  101. return wn.call({
  102. method: this.tree.method,
  103. args: args,
  104. callback: function(r) {
  105. $(me.$a).done_working();
  106. if (r.message) {
  107. $.each(r.message, function(i, v) {
  108. node = me.addnode(v);
  109. node.$a
  110. .data('node-data', v)
  111. .data('node', node);
  112. });
  113. }
  114. me.loaded = true;
  115. // expand
  116. me.selectnode();
  117. }
  118. })
  119. }
  120. })