switch-view.js 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  1. /**
  2. * @fileOverview
  3. *
  4. * 移动端分享页面转换视图按钮
  5. *
  6. * @author: zhangbobell
  7. * @copyright: Baidu FEX, 2014
  8. */
  9. KityMinder.registerUI('topbar/switch-view', function(minder) {
  10. var $switch = $('<span class="switch-view" id="switch-view">转换</span>').appendTo('#panel');
  11. $('<div class="back"></div>').appendTo('#m-logo');
  12. var treeData;
  13. var $curView=$('<div id="curView">');
  14. var $preView=$('<div id="preView">');
  15. minder.on('uiready', function() {
  16. var shareView = minder.getUI('menu/share/m-share');
  17. shareView.ready.then(function(){
  18. treeData = addParentPointer(minder);
  19. renderNodeData(treeData, minder, $curView);
  20. renderNodeData(treeData, minder, $preView);
  21. $('#km-list-view').append($curView);
  22. $('#km-list-view').append($preView);
  23. $preView.css('x', '100%');
  24. $('#km-list-view').css('display', 'none');
  25. });
  26. });
  27. var isListView = false; // mutex : 当前是否是列表视图
  28. $switch.on('click', function(){
  29. if (!isListView ){
  30. $('#kityminder').css('display', 'none');
  31. $('#km-list-view').css('display', 'block');
  32. isListView = true;
  33. } else {
  34. $('#km-list-view').css('display', 'none');
  35. $('#kityminder').css('display', 'block');
  36. isListView = false;
  37. }
  38. });
  39. $('#km-list-view').delegate('li', 'click', function(){
  40. var preViewData = $(this).data();
  41. if (preViewData.children) {
  42. renderNodeData(preViewData, minder, $preView);
  43. // $curView.css('x');
  44. // console.log($preView.css('x'));
  45. $preView.css('x', parseInt($curView.css('x')) + 100 + '%');
  46. // console.log($preView.css('x'));
  47. // $('#km-list-view').css('x', '0');
  48. $('#km-list-view').transition({
  49. x: parseInt($('#km-list-view').css('x')) - 100 + '%',
  50. duration: 200,
  51. easing: 'ease',
  52. complete: function(){
  53. var $temp = $curView;
  54. $curView = $preView;
  55. $preView = $temp;
  56. }
  57. });
  58. if (preViewData.parent){
  59. $('.back').css('display', 'block');
  60. $('#km-cat').css('display', 'none');
  61. }
  62. }
  63. });
  64. $('.back').on('click', function(){
  65. var parentViewData = $('.cur-root', $curView).data();
  66. renderNodeData(parentViewData, minder, $preView);
  67. $preView.css('x', parseInt($curView.css('x')) - 100 + '%');
  68. // $curView.css('x');
  69. // $('#km-list-view').css('x', '-100%');
  70. $('#km-list-view').transition({
  71. x: parseInt($('#km-list-view').css('x')) + 100 + '%',
  72. duration: 200,
  73. easing: 'ease',
  74. complete: function(){
  75. var $temp = $curView;
  76. $curView = $preView;
  77. $preView = $temp;
  78. }
  79. });
  80. if (!parentViewData.parent){
  81. $('.back').css('display', 'none');
  82. $('#km-cat').css('display', 'block');
  83. }
  84. })
  85. return $switch;
  86. });
  87. /**
  88. * addParentPointer - 给 minder 的 json 数据增加 parent 指针
  89. * @param minder - kityminder 实例
  90. * @returns {*} - 增加了 parent 指针之后的 json 结构
  91. */
  92. function addParentPointer(minder){
  93. var root = minder.exportJson();
  94. return AddParent(root);
  95. }
  96. /**
  97. * AddParent - 递归的增加 parent 指针
  98. * @param root - 传入的根节点
  99. * @returns {*}
  100. */
  101. function AddParent(root){
  102. if (root.children){
  103. $.each(root.children, function(idx, ele){
  104. ele.parent = root;
  105. AddParent(ele);
  106. });
  107. }
  108. return root;
  109. }
  110. /**
  111. * creadNodeData - 根据 json 结构创建好视图的 jQuery 对象
  112. * @param node
  113. * @param minder
  114. * @returns {*} - 创建好的 jQuery 对象
  115. */
  116. function renderNodeData(node, minder, $target){
  117. var $curRoot = createRootNode(node, minder);
  118. var $curList = $('<ul class="cur-list">');
  119. if (node.children){
  120. $.each(node.children, function(idx, ele){
  121. var $listNode = createListNode(ele, minder);
  122. $curList.append($listNode);
  123. });
  124. }
  125. // debugger;
  126. return $target.html($curRoot.add($curList));
  127. }
  128. /**
  129. * createRootNode - 创建当前根节点对应的 jQuery 对象
  130. * @param node 节点的 jQuery 对象
  131. * @param minder kityminder 实例
  132. * @returns {*|jQuery|HTMLElement} 当前根节点的 jQuery 对象
  133. */
  134. function createRootNode(node, minder){
  135. var $root = $('<h1 class="cur-root">');
  136. $root.append(getNodeHtml(node, minder));
  137. if (node.parent){
  138. $root.data(node.parent);
  139. }
  140. return $root;
  141. }
  142. /**
  143. * createListNode - 创建子节点对应的 jQuery 对象
  144. * @param node 节点的 json 对象
  145. * @param minder kityminder 实例
  146. * @returns {*|jQuery|HTMLElement} 子节点的 jQuery 对象
  147. */
  148. function createListNode(node, minder){
  149. var $list = $('<li>');
  150. $list.append(getNodeHtml(node, minder));
  151. // 处理子节点
  152. if (node.children){
  153. $list.addClass('clickable');
  154. $list.children().first().before('<span class="next-level"></span>');
  155. $list.data(node);
  156. }
  157. return $list;
  158. }
  159. /**
  160. * getNodeHtml - 根据传入节点的 json 对象创建该节点的 html 数据
  161. * @param node 节点的 json 对象
  162. * @param minder kityminder 实例
  163. * @returns {string} 返回的 html 字符串
  164. */
  165. function getNodeHtml (node, minder){
  166. var data = node.data;
  167. var html = '';
  168. // 处理优先级
  169. if (data.priority){
  170. html += '<div class="priority priority-' + data.priority + '"></div>'
  171. }
  172. // 处理进度
  173. if (data.progress){
  174. html += '<div class="progress progress-' + data.progress + '"></div>'
  175. }
  176. // 处理超链接
  177. if (data.hyperlink) {
  178. html +='<a class="hyperlink" href="'+ data.hyperlink +'" target="_blank"></a>';
  179. }
  180. // 处理资源
  181. if (data.resource){
  182. $.each(data.resource, function(idx, ele){
  183. html += '<span class="resource" style="background-color: '+ minder.getResourceColor(ele).toRGB() +'">' + ele + '</span>' + ' ';
  184. });
  185. }
  186. // 处理文字
  187. if (data.text) {
  188. html += '<span class="text">' + (data.text || '') + '</span>';
  189. }
  190. return html;
  191. }