draft.js 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. /**
  2. * @fileOverview
  3. *
  4. * 草稿箱功能
  5. *
  6. * @author: techird
  7. * @copyright: Baidu FEX, 2014
  8. */
  9. KityMinder.registerUI('menu/open/draft', function(minder) {
  10. var $menu = minder.getUI('menu/menu');
  11. var $open = minder.getUI('menu/open/open');
  12. var $loader = minder.getUI('widget/fileloader');
  13. var frdTime = minder.getUI('widget/friendlytimespan');
  14. var $doc = minder.getUI('doc');
  15. // 旧数据迁移
  16. if (localStorage.drafts) {
  17. var oldDrafts = JSON.parse(localStorage.drafts);
  18. var list = oldDrafts.map(function(draft) {
  19. var ret = {};
  20. ret.json = draft.data;
  21. ret.time = +new Date(draft.update);
  22. ret.title = JSON.parse(draft.data).data.text;
  23. return ret;
  24. });
  25. delete localStorage.drafts;
  26. localStorage.draft = JSON.stringify(list);
  27. }
  28. var draftList = minder.getUI('widget/locallist').use('draft');
  29. /* 网盘面板 */
  30. var $panel = $($open.createSub('draft')).addClass('draft-panel');
  31. /* 标题 */
  32. var $title = $('<h2></h2>')
  33. .text(minder.getLang('ui.menu.draftheader'))
  34. .appendTo($panel);
  35. var $clear = $('<button></button>')
  36. .addClass('clear-draft')
  37. .text(minder.getLang('ui.cleardraft'))
  38. .appendTo($panel);
  39. /* 最近文件列表容器 */
  40. var $ul = $('<ul></ul>')
  41. .addClass('draft-list')
  42. .appendTo($panel);
  43. var current = null,
  44. lastDoc = null;
  45. $ul.delegate('.draft-list-item', 'click', function(e) {
  46. if (!$doc.checkSaved()) return;
  47. var item = $(e.target).closest('.draft-list-item').data('item');
  48. var index = draftList.findIndex(function(finding) {
  49. return finding == item;
  50. });
  51. if (index > -1) {
  52. current = item;
  53. draftList.remove(index);
  54. draftList.unshift(current);
  55. lastDoc = {
  56. title: current.title,
  57. protocol: 'json',
  58. content: current.json,
  59. path: current.path,
  60. source: current.source,
  61. saved: false
  62. };
  63. $doc.load(lastDoc);
  64. }
  65. $menu.hide();
  66. });
  67. $clear.on('click', function() {
  68. if (!window.confirm(minder.getLang('ui.cleardraftconfirm'))) return;
  69. draftList.clear();
  70. current = null;
  71. renderList();
  72. });
  73. $doc.on('docsave', popDraft);
  74. $doc.on('docchange', pushDraft);
  75. renderList();
  76. function pushDraft(doc) {
  77. if (doc.saved) return;
  78. if (doc == lastDoc) {
  79. if (current) {
  80. draftList.remove(0);
  81. }
  82. } else {
  83. current = null;
  84. }
  85. lastDoc = doc;
  86. current = current || {};
  87. current.json = JSON.stringify(minder.exportJson());
  88. current.title = doc.title;
  89. current.time = +new Date();
  90. current.path = doc.path;
  91. current.source = doc.source;
  92. draftList.unshift(current);
  93. renderList();
  94. }
  95. function popDraft() {
  96. if (current) {
  97. draftList.remove(0);
  98. current = null;
  99. }
  100. renderList();
  101. }
  102. function renderList() {
  103. $ul.empty();
  104. draftList.forEach(function(item) {
  105. var $li = $('<li></li>')
  106. .addClass('draft-list-item')
  107. .data('item', item)
  108. .appendTo($ul);
  109. $('<h4></h4>')
  110. .addClass('draft-title')
  111. .text(item.title)
  112. .appendTo($li);
  113. $('<span></span>')
  114. .addClass('file-time')
  115. .displayFriendlyTime(item.time)
  116. .appendTo($li);
  117. });
  118. }
  119. return {
  120. hasDraft: function() {
  121. return draftList.length;
  122. },
  123. openLast: function() {
  124. $ul.find('.draft-list-item').eq(0).click();
  125. },
  126. last: function() {
  127. return draftList.get(0) || null;
  128. }
  129. };
  130. });