recent.js 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. /**
  2. * @fileOverview
  3. *
  4. * 最近文件功能
  5. *
  6. * @author: techird
  7. * @copyright: Baidu FEX, 2014
  8. */
  9. KityMinder.registerUI('menu/open/recent', 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. var recentList = minder.getUI('widget/locallist').use('recent');
  16. var finder = minder.getUI('widget/netdiskfinder');
  17. /* 网盘面板 */
  18. var $panel = $($open.createSub('recent')).addClass('recent-file-panel');
  19. minder.on('uiready', function() {
  20. minder.getUI('topbar/user').requireLogin($panel);
  21. });
  22. /* 标题 */
  23. var $title = $('<h2></h2>')
  24. .text(minder.getLang('ui.recent'))
  25. .appendTo($panel);
  26. var $clear = $('<button></button>')
  27. .addClass('clear-recent-list')
  28. .text(minder.getLang('ui.clearrecent'))
  29. .appendTo($panel);
  30. /* 最近文件列表容器 */
  31. var $ul = $('<ul></ul>')
  32. .addClass('recent-file-list')
  33. .appendTo($panel);
  34. $ul.delegate('.recent-file-item', 'click', function(e) {
  35. if (!doc.checkSaved()) return;
  36. var netdisk = minder.getUI('menu/open/netdisk');
  37. var path = $(e.target)
  38. .closest('.recent-file-item')
  39. .data('path');
  40. netdisk.open(path);
  41. });
  42. $clear.on('click', function() {
  43. if (!window.confirm(minder.getLang('ui.clearrecentconfirm'))) return;
  44. recentList.clear();
  45. renderList();
  46. });
  47. doc.on('docload', addToList);
  48. doc.on('docsave', addToList);
  49. finder.on('mv', trackFileMove);
  50. renderList();
  51. function trackFileMove(from, to) {
  52. var fromPath = from.split('/');
  53. var toPath = to.split('/');
  54. function preCommonLength(a, b) {
  55. var i = 0;
  56. while((i in a) && (i in b) && a[i] == b[i]) i++;
  57. return (i in b) ? 0 : i;
  58. }
  59. recentList.forEach(function(item) {
  60. var originPath = item.path.split('/');
  61. var clen = preCommonLength(originPath, fromPath);
  62. if (clen) {
  63. var movedPath = toPath.concat(originPath.slice(clen));
  64. item.path = movedPath.join('/');
  65. item.filename = toPath.pop();
  66. }
  67. });
  68. renderList();
  69. }
  70. function addToList(doc) {
  71. if (doc.source != 'netdisk') return;
  72. var exist = recentList.findIndex('path', doc.path);
  73. if (~exist) {
  74. recentList.remove(exist);
  75. }
  76. recentList.unshift({
  77. path: doc.path,
  78. filename: fio.file.anlysisPath(doc.path).filename,
  79. title: minder.getMinderTitle(),
  80. time: +new Date()
  81. });
  82. renderList();
  83. }
  84. function renderList() {
  85. $ul.empty();
  86. recentList.forEach(function(item) {
  87. var $li = $('<li></li>')
  88. .addClass('recent-file-item')
  89. .data('path', item.path)
  90. .appendTo($ul);
  91. $('<h4></h4>')
  92. .addClass('file-name')
  93. .text(item.filename)
  94. .appendTo($li);
  95. $('<p></p>')
  96. .addClass('file-title')
  97. .text(item.title)
  98. .appendTo($li);
  99. $('<span></span>')
  100. .addClass('file-time')
  101. .displayFriendlyTime(item.time)
  102. .appendTo($li);
  103. });
  104. }
  105. return {
  106. hasRecent: function() {
  107. return recentList.length;
  108. },
  109. loadLast: function() {
  110. $ul.find('.recent-file-item').eq(0).click();
  111. },
  112. last: function() {
  113. return recentList.get(0) || null;
  114. }
  115. };
  116. });