From c49593171c71f59a2bb50a6ac8b87952a2c678b8 Mon Sep 17 00:00:00 2001
From: life
Date: Tue, 2 Dec 2014 23:20:10 +0800
Subject: [PATCH] note
---
public/js/app/note.js | 1674 +++++++++++++++++++++++++++++++++++++++++
1 file changed, 1674 insertions(+)
create mode 100644 public/js/app/note.js
diff --git a/public/js/app/note.js b/public/js/app/note.js
new file mode 100644
index 0000000..1382460
--- /dev/null
+++ b/public/js/app/note.js
@@ -0,0 +1,1674 @@
+// 1. notebook change
+// notebook一改变, 当前的肯定要保存, ajax是异步的. 此时先清空所有note信息. -> 得到该notebook的notes, 显示出来, 并选中第一个!
+// 在这期间定时器还会保存, curNoteId还没换, 所以会清空curNoteId的content!!!
+
+// 2. note change, save cur, 立即curNoteId = ""!!
+
+// 3. 什么时候设置curNoteId? 是ajax得到内容之后设置
+
+// note
+Note.curNoteId = "";
+
+Note.interval = ""; // 定时器
+
+Note.itemIsBlog = '
';
+// for render
+Note.itemTplNoImg = ''
+Note.itemTplNoImg += Note.itemIsBlog +'';
+
+// 有image
+Note.itemTpl = ''
+Note.itemTpl +=Note.itemIsBlog + '';
+
+// for new
+Note.newItemTpl = ''
+Note.newItemTpl += Note.itemIsBlog + '';
+
+Note.noteItemListO = $("#noteItemList");
+
+// notbeookId => {"updatedTime" => [noteId1, noteId2], "title" => [noteId1, noteId2...]} 排序方式分组
+// 一旦某notebook改变了就清空, 重新排序之. (用js排)
+Note.cacheByNotebookId = {all: {}};
+Note.notebookIds = {}; // notebookId => true
+
+Note.isReadOnly = false;
+// 定时保存信息
+Note.intervalTime = 600000; // 600s, 10mins
+Note.startInterval = function() {
+ Note.interval = setInterval(function() {
+ log("自动保存开始...")
+ changedNote = Note.curChangedSaveIt(false);
+ }, Note.intervalTime); // 600s, 10mins
+}
+// 停止, 当切换note时
+// 但过5000后自动启动
+Note.stopInterval = function() {
+ clearInterval(Note.interval);
+
+ setTimeout(function() {
+ Note.startInterval();
+ }, Note.intervalTime);
+}
+
+// note = {NoteId, Desc, UserId,...}
+Note.addNoteCache = function(note) {
+ Note.cache[note.NoteId] = note;
+ Note.clearCacheByNotebookId(note.NotebookId);
+}
+// content = {NoteId:, Content:}
+// 还可以设置其它的值
+Note.setNoteCache = function(content, clear) {
+ if(!Note.cache[content.NoteId]) {
+ Note.cache[content.NoteId] = content;
+ } else {
+ $.extend(Note.cache[content.NoteId], content);
+ }
+
+ if(clear == undefined) {
+ clear = true;
+ }
+ if(clear) {
+ Note.clearCacheByNotebookId(content.NotebookId);
+ }
+}
+
+// 得到当前的笔记
+Note.getCurNote = function() {
+ var self = this;
+ if(self.curNoteId == "") {
+ return null;
+ }
+ return self.cache[self.curNoteId];
+}
+Note.getNote = function(noteId) {
+ var self = this;
+ return self.cache[noteId];
+}
+
+// 每当有notebookId相应的note改变时都要重新清空之
+// 并设置该notebookId有值
+Note.clearCacheByNotebookId = function(notebookId) {
+ if(notebookId) {
+ Note.cacheByNotebookId[notebookId] = {};
+ Note.cacheByNotebookId["all"] = {};
+ Note.notebookIds[notebookId] = true;
+ }
+}
+
+// notebook是否有notes
+// called by Notebook
+Note.notebookHasNotes = function(notebookId) {
+ var notes = Note.getNotesByNotebookId(notebookId);
+ return !isEmpty(notes);
+}
+
+// 得到notebook下的notes, 按什么排序 updatedTime?
+Note.getNotesByNotebookId = function(notebookId, sortBy, isAsc) {
+ if(!sortBy) {
+ sortBy = "UpdatedTime";
+ }
+ if(isAsc == "undefined") {
+ isAsc = false; // 默认是降序
+ }
+
+ if(!notebookId) {
+ notebookId = "all";
+ }
+
+ if(!Note.cacheByNotebookId[notebookId]) {
+ return [];
+ }
+
+ if(Note.cacheByNotebookId[notebookId][sortBy]) {
+ return Note.cacheByNotebookId[notebookId][sortBy];
+ } else {
+ }
+
+ // 从所有的notes中找到notebookId的, 并排序之
+ var notes = [];
+ var sortBys = [];
+ for(var i in Note.cache) {
+ if(!i) {
+ continue;
+ }
+ var note = Note.cache[i];
+ // 不要trash的not, 共享的也不要
+ if(note.IsTrash || note.IsShared) {
+ continue;
+ }
+ if(notebookId == "all" || note.NotebookId == notebookId) {
+ notes.push(note);
+ }
+ }
+ // 排序之
+ notes.sort(function(a, b) {
+ var t1 = a[sortBy];
+ var t2 = b[sortBy];
+
+ if(isAsc) {
+ if(t1 < t2) {
+ return -1;
+ } else if (t1 > t2) {
+ return 1;
+ }
+ } else {
+ if(t1 < t2) {
+ return 1;
+ } else if (t1 > t2) {
+ return -1;
+ }
+ }
+ return 0;
+ });
+
+ // 缓存之
+ Note.cacheByNotebookId[notebookId][sortBy] = notes;
+ return notes;
+}
+
+// called by Notebook
+// render 所有notes, 和第一个note的content
+Note.renderNotesAndFirstOneContent = function(ret) {
+ // 错误的ret是一个Object
+ if(!isArray(ret)) {
+ return;
+ }
+
+ // note 导航
+ Note.renderNotes(ret);
+ // 渲染第一个
+ if(!isEmpty(ret[0])) {
+ Note.changeNote(ret[0].NoteId);
+ } else {
+ }
+
+}
+
+// 当前的note是否改变过了?
+// 返回已改变的信息
+// force bool true表示content比较是比较HTML, 否则比较text, 默认为true
+// 定时保存用false
+Note.curHasChanged = function(force) {
+ if(force == undefined) {
+ force = true;
+ }
+ var cacheNote = Note.cache[Note.curNoteId] || {};
+ // 收集当前信息, 与cache比对
+ var title = $("#noteTitle").val();
+ var tags = Tag.getTags(); // TODO
+
+ // 如果是markdown返回[content, preview]
+ var contents = getEditorContent(cacheNote.IsMarkdown);
+ var content, preview;
+ var contentText;
+ if (isArray(contents)) {
+ content = contents[0];
+ preview = contents[1];
+ contentText = content;
+ // preview可能没来得到及解析
+ if (content && previewIsEmpty(preview) && Converter) {
+ preview = Converter.makeHtml(content);
+ }
+ if(!content) {
+ preview = "";
+ }
+ cacheNote.Preview = preview; // 仅仅缓存在前台
+ } else {
+ content = contents;
+ try {
+ contentText = $(content).text();
+ } catch(e) {
+ }
+ }
+
+ var hasChanged = {
+ hasChanged: false, // 总的是否有改变
+ IsNew: cacheNote.IsNew, // 是否是新添加的
+ IsMarkdown: cacheNote.IsMarkdown, // 是否是markdown笔记
+ FromUserId: cacheNote.FromUserId, // 是否是共享新建的
+ NoteId: cacheNote.NoteId,
+ NotebookId: cacheNote.NotebookId
+ };
+
+ if(hasChanged.IsNew) {
+ $.extend(hasChanged, cacheNote);
+ }
+
+ if(cacheNote.Title != title) {
+ hasChanged.hasChanged = true; // 本页使用用小写
+ hasChanged.Title = title; // 要传到后台的用大写
+ if(!hasChanged.Title) {
+// alert(1);
+ }
+ }
+
+ if(!arrayEqual(cacheNote.Tags, tags)) {
+ hasChanged.hasChanged = true;
+ hasChanged.Tags = tags;
+ }
+
+ // 比较text, 因为note Nav会添加dom会导致content改变
+ if((force && cacheNote.Content != content) || (!force && $(cacheNote.Content).text() != contentText)) {
+ hasChanged.hasChanged = true;
+ hasChanged.Content = content;
+
+ // 从html中得到...
+ var c = preview || content;
+
+ hasChanged.Desc = Note.genDesc(c);
+ hasChanged.ImgSrc = Note.getImgSrc(c);
+ hasChanged.Abstract = Note.genAbstract(c);
+
+ } else {
+ log("text相同");
+ log(cacheNote.Content == content);
+ }
+
+ hasChanged["UserId"] = cacheNote["UserId"] || "";
+
+ return hasChanged;
+}
+
+// 由content生成desc
+// 换行不要替换
+Note.genDesc = function(content) {
+ if(!content) {
+ return "";
+ }
+
+ // 将,
替换成\n
+ /*
+ var token = "ALEALE";
+ content = content.replace(/<\/p>/g, token);
+ content = content.replace(/<\/div>/g, token);
+ content = content.replace(/<\/?.+?>/g," ");
+
+ pattern = new RegExp(token, "g");
+ content = content.replace(pattern, "
+
+*/
+
+Note.showEditorMask = function() {
+ $("#editorMask").css("z-index", 10).show();
+ // 要判断是否是垃圾筒
+ if(Notebook.curNotebookIsTrashOrAll()) {
+ $("#editorMaskBtns").hide();
+ $("#editorMaskBtnsEmpty").show();
+ } else {
+ $("#editorMaskBtns").show();
+ $("#editorMaskBtnsEmpty").hide();
+ }
+}
+Note.hideEditorMask = function() {
+ $("#editorMask").css("z-index", -10).hide();
+}
+
+// 这里如果notes过多>100个将会很慢!!, 使用setTimeout来分解
+Note.renderNotesC = 0;
+Note.renderNotes = function(notes, forNewNote, isShared) {
+ var renderNotesC = ++Note.renderNotesC;
+
+ // 手机端不用
+ // slimScroll使得手机端滚动不流畅
+ if(!LEA.isMobile && !Mobile.isMobile()) {
+ $("#noteItemList").slimScroll({ scrollTo: '0px', height: "100%", onlyScrollBar: true});
+ }
+
+ if(!notes || typeof notes != "object" || notes.length <= 0) {
+ // 如果没有, 那么是不是应该hide editor?
+ if(!forNewNote) {
+ Note.showEditorMask();
+ }
+ return;
+ }
+ Note.hideEditorMask();
+ // 新建笔记时会先创建一个新笔记, 所以不能清空
+ if(forNewNote == undefined) {
+ forNewNote = false;
+ }
+ if(!forNewNote) {
+ Note.noteItemListO.html(""); // 清空
+ }
+
+ // 20个一次
+ var len = notes.length;
+ var c = Math.ceil(len/20);
+
+ Note._renderNotes(notes, forNewNote, isShared, 1);
+
+ // 先设置缓存
+ for(var i = 0; i < len; ++i) {
+ var note = notes[i];
+ // 不清空
+ // 之前是addNoteCache, 如果是搜索出的, 会把内容都重置了
+ Note.setNoteCache(note, false);
+
+ // 如果是共享的笔记本, 缓存也放在Share下
+ if(isShared) {
+ Share.setCache(note);
+ }
+ }
+
+ for(var i = 1; i < c; ++i) {
+ setTimeout(
+ (function(i) {
+ // 防止还没渲染完就点击另一个notebook了
+ return function() {
+ if(renderNotesC == Note.renderNotesC) {
+ Note._renderNotes(notes, forNewNote, isShared, i+1);
+ }
+ }
+ })(i), i*2000);
+ }
+}
+Note._renderNotes = function(notes, forNewNote, isShared, tang) { // 第几趟
+ var baseClasses = "item-my";
+ if(isShared) {
+ baseClasses = "item-shared";
+ }
+
+ var len = notes.length;
+ for(var i = (tang-1)*20; i < len && i < tang*20; ++i) {
+ var classes = baseClasses;
+ if(!forNewNote && i == 0) {
+ classes += " item-active";
+ }
+ var note = notes[i];
+ var tmp;
+ if(note.ImgSrc) {
+ tmp = tt(Note.itemTpl, classes, note.NoteId, note.ImgSrc, note.Title, Notebook.getNotebookTitle(note.NotebookId), goNowToDatetime(note.UpdatedTime), note.Desc);
+ } else {
+ tmp = tt(Note.itemTplNoImg, classes, note.NoteId, note.Title, Notebook.getNotebookTitle(note.NotebookId), goNowToDatetime(note.UpdatedTime), note.Desc);
+ }
+ if(!note.IsBlog) {
+ tmp = $(tmp);
+ tmp.find(".item-blog").hide();
+ }
+ Note.noteItemListO.append(tmp);
+
+ /*
+ // 共享的note也放在Note的cache一份
+ if(isShared) {
+ note.IsShared = true; // 注明是共享的
+ }
+
+ // 不清空
+ // 之前是addNoteCache, 如果是搜索出的, 会把内容都重置了
+ Note.setNoteCache(note, false);
+
+ // 如果是共享的笔记本, 缓存也放在Share下
+ if(isShared) {
+ Share.setCache(note);
+ }
+ */
+ }
+}
+
+// 新建一个笔记
+// 要切换到当前的notebook下去新建笔记
+// isShare时fromUserId才有用
+// 3.8 add isMarkdown
+Note.newNote = function(notebookId, isShare, fromUserId, isMarkdown) {
+ // 切换编辑器
+ switchEditor(isMarkdown);
+ Note.hideEditorMask();
+
+ // 防止从共享read only跳到添加
+ Note.hideReadOnly();
+
+ Note.stopInterval();
+ // 保存当前的笔记
+ Note.curChangedSaveIt();
+
+ var note = {NoteId: getObjectId(), Title: "", Tags:[], Content:"", NotebookId: notebookId, IsNew: true, FromUserId: fromUserId, IsMarkdown: isMarkdown}; // 是新的
+ // 添加到缓存中
+ Note.addNoteCache(note);
+
+ // 清空附件数
+ Attach.clearNoteAttachNum();
+
+ // 是否是为共享的notebook添加笔记, 如果是, 则还要记录fromUserId
+ var newItem = "";
+
+ var baseClasses = "item-my";
+ if(isShare) {
+ baseClasses = "item-shared";
+ }
+
+ var notebook = Notebook.getNotebook(notebookId);
+ var notebookTitle = notebook ? notebook.Title : "";
+ var curDate = getCurDate();
+ if(isShare) {
+ newItem = tt(Note.newItemTpl, baseClasses, fromUserId, note.NoteId, note.Title, notebookTitle, curDate, "");
+ } else {
+ newItem = tt(Note.newItemTpl, baseClasses, "", note.NoteId, note.Title, notebookTitle, curDate, "");
+ }
+
+ // notebook是否是Blog
+ if(!notebook.IsBlog) {
+ newItem = $(newItem);
+ newItem.find(".item-blog").hide();
+ }
+
+ // 是否在当前notebook下, 不是则切换过去, 并得到该notebook下所有的notes, 追加到后面!
+ if(!Notebook.isCurNotebook(notebookId)) {
+ // 先清空所有
+ Note.clearAll();
+
+ // 插入到第一个位置
+ Note.noteItemListO.prepend(newItem);
+
+ // 改变为当前的notebookId
+ // 会得到该notebookId的其它笔记
+ if(!isShare) {
+ Notebook.changeNotebookForNewNote(notebookId);
+ } else {
+ Share.changeNotebookForNewNote(notebookId);
+ }
+ } else {
+ // 插入到第一个位置
+ Note.noteItemListO.prepend(newItem);
+ }
+
+ Note.selectTarget($(tt('[noteId="?"]', note.NoteId)));
+
+ $("#noteTitle").focus();
+
+ Note.renderNote(note);
+ Note.renderNoteContent(note);
+ Note.curNoteId = note.NoteId;
+
+ // 更新数量
+ Notebook.incrNotebookNumberNotes(notebookId)
+}
+
+// 保存note ctrl + s
+Note.saveNote = function(e) {
+ var num = e.which ? e.which : e.keyCode;
+ // 保存
+ if((e.ctrlKey || e.metaKey) && num == 83 ) { // ctrl + s or command + s
+ Note.curChangedSaveIt();
+ e.preventDefault();
+ return false;
+ } else {
+ }
+};
+
+// 删除或移动笔记后, 渲染下一个或上一个
+Note.changeToNext = function(target) {
+ var $target = $(target);
+ var next = $target.next();
+ if(!next.length) {
+ var prev = $target.prev();
+ if(prev.length) {
+ next = prev;
+ } else {
+ // 就它一个
+ Note.showEditorMask();
+ return;
+ }
+ }
+
+ Note.changeNote(next.attr("noteId"));
+}
+
+// 删除笔记
+// 1. 先隐藏, 成功后再移除DOM
+// 2. ajax之 noteId
+// Share.deleteSharedNote调用
+Note.deleteNote = function(target, contextmenuItem, isShared) {
+ // 如果删除的是已选中的, 赶紧设置curNoteId = null
+ if($(target).hasClass("item-active")) {
+ // -1 停止定时器
+ Note.stopInterval();
+ // 不保存
+ Note.curNoteId = null;
+ // 清空信息
+ Note.clearNoteInfo();
+ }
+
+ noteId = $(target).attr("noteId");
+ if(!noteId) {
+ return;
+ }
+ // 1
+ $(target).hide();
+
+ // 2
+ var note = Note.cache[noteId];
+ var url = "/note/deleteNote"
+ if(note.IsTrash) {
+ url = "/note/deleteTrash";
+ } else {
+ // 减少数量
+ Notebook.minusNotebookNumberNotes(note.NotebookId);
+ }
+
+ ajaxGet(url, {noteId: noteId, userId: note.UserId, isShared: isShared}, function(ret) {
+ if(ret) {
+ Note.changeToNext(target);
+
+ $(target).remove();
+
+ // 删除缓存
+ if(note) {
+ Note.clearCacheByNotebookId(note.NotebookId)
+ delete Note.cache[noteId]
+ }
+
+ showMsg("删除成功!", 500);
+ } else {
+ // 弹出信息 popup 不用点确认的
+ $(target).show();
+ showMsg("删除失败!", 2000);
+ }
+ });
+
+}
+
+// 显示共享信息
+Note.listNoteShareUserInfo = function(target) {
+ var noteId = $(target).attr("noteId");
+ showDialogRemote("share/listNoteShareUserInfo", {noteId: noteId});
+}
+
+// 共享笔记
+Note.shareNote = function(target) {
+ var title = $(target).find(".item-title").text();
+ showDialog("dialogShareNote", {title: getMsg("shareToFriends") + "-" + title});
+
+ setTimeout(function() {
+ $("#friendsEmail").focus();
+ }, 500);
+
+ var noteId = $(target).attr("noteId");
+ shareNoteOrNotebook(noteId, true);
+}
+
+// 历史记录
+Note.listNoteContentHistories = function() {
+ // 弹框
+ $("#leanoteDialog #modalTitle").html(getMsg("history"));
+ $content = $("#leanoteDialog .modal-body");
+ $content.html("");
+ $("#leanoteDialog .modal-footer").html('
');
+ options = {}
+ options.show = true;
+ $("#leanoteDialog").modal(options);
+
+ ajaxGet("noteContentHistory/listHistories", {noteId: Note.curNoteId}, function(re) {
+ if(!isArray(re)) {$content.html(getMsg("noHistories")); return}
+ // 组装成一个tab
+ var str = "
" + getMsg("historiesNum") + '
';
+ note = Note.cache[Note.curNoteId];
+ var s = "div"
+ if(note.IsMarkdown) {
+ s = "pre";
+ }
+ for (i in re) {
+ var content = re[i]
+ content.Ab = Note.genAbstract(content.Content, 200);
+ str += tt('| #? class="each-content">??> ' + getMsg("datetime") + ': ? |
', i, (+i+1), s, content.Ab, s, goNowToDatetime(content.UpdatedTime))
+ }
+ str += "
";
+ $content.html(str);
+ $("#historyList .all").click(function() {
+ $p = $(this).parent().parent();
+ var seq = $p.attr("seq");
+ var $c = $p.find(".each-content");
+ var info = re[seq];
+ if(!info.unfold) { // 默认是折叠的
+ $(this).text(getMsg("fold")); // 折叠
+ $c.html(info.Content);
+ info.unfold = true;
+ } else {
+ $(this).text(getMsg("unfold")); // 展开
+ $c.html(info.Ab);
+ info.unfold = false
+ }
+ });
+
+ // 还原
+ $("#historyList .back").click(function() {
+ $p = $(this).parent().parent();
+ var seq = $p.attr("seq");
+ if(confirm(getMsg("confirmBackup"))) {
+ // 保存当前版本
+ Note.curChangedSaveIt();
+ // 设置之
+ note = Note.cache[Note.curNoteId];
+ setEditorContent(re[seq].Content, note.IsMarkdown);
+ //
+ hideDialog();
+ }
+ });
+
+ });
+}
+
+// 长微博
+Note.html2Image = function(target) {
+ var noteId = $(target).attr("noteId");
+ showDialog("html2ImageDialog", {title: "分享到社区", postShow: function() {
+ ajaxGet("/note/html2Image", {noteId: noteId}, function(ret) {
+ if (typeof ret == "object" && ret.Ok) {
+ $("#leanoteDialog .weibo span").html("生成成功, 右键图片保存到本地.")
+ $("#leanoteDialog .weibo img").attr("src", ret.Id + "?" + ((new Date()).getTime()));
+ $("#leanoteDialog .btn-share").removeClass("disabled");
+ var note = Note.cache[noteId];
+ var pic = UrlPrefix + ret.Id;
+ var title = encodeURI(note.Title + " (" + UserInfo.Username + "分享. 来自leanote.com)");
+ var windowParam = 'width=700, height=580, top=180, left=320, toolbar=no, menubar=no, scrollbars=no, location=yes, resizable=no, status=no';
+ $("#leanoteDialog .sendWeiboBtn").click(function() {
+ var url = "http://service.weibo.com/share/share.php?title=" + title;
+ url += "&pic=" + pic;
+ window.open(url, '分享到新浪微博', windowParam);
+ });
+ $("#leanoteDialog .sendTxWeiboBtn").click(function() {
+ var _appkey = '801542571';
+ var url = "http://share.v.t.qq.com/index.php?c=share&a=index&appkey=" + _appkey +"&title=" + title +"&url=&pic=" + pic
+ window.open(url, '分享到腾讯微博', windowParam);
+ });
+ $("#leanoteDialog .sendQQBtn").click(function() {
+ var url = 'http://sns.qzone.qq.com/cgi-bin/qzshare/cgi_qzshare_onekey?url=' + UrlPrefix + '&title=' + title + '&pics=' + pic;
+ window.open(url, '分享QQ空间', windowParam);
+ });
+ $("#leanoteDialog .sendRRBtn").click(function() {
+ var url = 'http://widget.renren.com/dialog/share?resourceUrl=' + UrlPrefix + '&srcUrl=' + UrlPrefix + '&title=' + title + '&pic=' + pic;
+ window.open(url, '分享人人网', windowParam);
+ });
+ } else {
+ $("#leanoteDialog .weibo").html("对不起, 我们出错了!")
+ }
+ });
+ }});
+}
+
+//--------------
+// read only
+
+Note.showReadOnly = function() {
+ Note.isReadOnly = true;
+ $("#noteRead").show();
+}
+Note.hideReadOnly = function() {
+ Note.isReadOnly = false;
+ $("#noteRead").hide();
+}
+// read only
+Note.renderNoteReadOnly = function(note) {
+ Note.showReadOnly();
+ $("#noteReadTitle").html(note.Title);
+
+ Tag.renderReadOnlyTags(note.Tags);
+
+ $("#noteReadCreatedTime").html(goNowToDatetime(note.CreatedTime));
+ $("#noteReadUpdatedTime").html(goNowToDatetime(note.UpdatedTime));
+}
+Note.renderNoteContentReadOnly = function(note) {
+ if(note.IsMarkdown) {
+ $("#noteReadContent").html('
' + note.Content + "
");
+ } else {
+ $("#noteReadContent").html(note.Content);
+ }
+}
+
+//---------------------------
+// 搜索
+// 有点小复杂, 因为速度过快会导致没加载完, 然后就保存上一个 => 致使标题没有
+// 为什么会标题没有?
+Note.lastSearch = null;
+Note.lastKey = null; // 判断是否与上一个相等, 相等就不查询, 如果是等了很久再按enter?
+Note.lastSearchTime = new Date();
+Note.isOver2Seconds = false;
+Note.isSameSearch = function(key) {
+ // 判断时间是否超过了1秒, 超过了就认为是不同的
+ var now = new Date();
+ var duration = now.getTime() - Note.lastSearchTime.getTime();
+ Note.isOver2Seconds = duration > 2000 ? true : false;
+ if(!Note.lastKey || Note.lastKey != key || duration > 1000) {
+ Note.lastKey = key;
+ Note.lastSearchTime = now;
+ return false;
+ }
+
+ if(key == Note.lastKey) {
+ return true;
+ }
+
+ Note.lastSearchTime = now;
+ Note.lastKey = key;
+ return false;
+}
+
+Note.searchNote = function() {
+ var val = $("#searchNoteInput").val();
+ if(!val) {
+ // 定位到all
+ Notebook.changeNotebook("0");
+ return;
+ }
+ // 判断是否与上一个是相同的搜索, 是则不搜索
+ if(Note.isSameSearch(val)) {
+ return;
+ }
+
+ // 之前有, 还有结束的
+ if(Note.lastSearch) {
+ Note.lastSearch.abort();
+ }
+
+ // 步骤与tag的搜索一样
+ // 1
+ Note.curChangedSaveIt();
+
+ // 2 先清空所有
+ Note.clearAll();
+
+ // 发送请求之
+ // 先取消上一个
+ showLoading();
+ Note.lastSearch = $.post("/note/searchNote", {key: val}, function(notes) {
+ hideLoading();
+ if(notes) {
+ // 成功后设为空
+ Note.lastSearch = null;
+ // renderNotes只是note列表加载, 右侧笔记详情还没加载
+ // 这个时候, 定位第一个, 保存之前的,
+ // 如果: 第一次搜索, renderNotes OK, 还没等到changeNote时
+ // 第二次搜索来到, Note.curChangedSaveIt();
+ // 导致没有标题了
+ // 不是这个原因, 下面的Note.changeNote会导致保存
+
+ // 设空, 防止发生上述情况
+ // Note.curNoteId = "";
+
+ Note.renderNotes(notes);
+ if(!isEmpty(notes)) {
+ Note.changeNote(notes[0].NoteId, false/*, true || Note.isOver2Seconds*/); // isShare, needSaveChanged?, 超过2秒就要保存
+ }
+ } else {
+ // abort的
+ }
+ });
+ // Note.lastSearch.abort();
+}
+
+//----------
+//设为blog/unset
+Note.setNote2Blog = function(target) {
+ var noteId = $(target).attr("noteId");
+ var note = Note.cache[noteId];
+ var isBlog = true;
+ if(note.IsBlog != undefined) {
+ isBlog = !note.IsBlog;
+ }
+ // 标志添加/去掉
+ if(isBlog) {
+ $(target).find(".item-blog").show();
+ } else {
+ $(target).find(".item-blog").hide();
+ }
+ ajaxPost("/note/setNote2Blog", {noteId: noteId, isBlog: isBlog}, function(ret) {
+ if(ret) {
+ Note.setNoteCache({NoteId: noteId, IsBlog: isBlog}, false); // 不清空NotesByNotebookId缓存
+ }
+ });
+}
+
+// 设置notebook的blog状态
+// 当修改notebook是否是blog时调用
+Note.setAllNoteBlogStatus = function(notebookId, isBlog) {
+ if(!notebookId) {
+ return;
+ }
+ var notes = Note.getNotesByNotebookId(notebookId);
+ if(!isArray(notes)) {
+ return;
+ }
+ var len = notes.length;
+ if(len == 0) {
+ for(var i in Note.cache) {
+ if(Note.cache[i].NotebookId == notebookId) {
+ Note.cache[i].IsBlog = isBlog;
+ }
+ }
+ } else {
+ for(var i = 0; i < len; ++i) {
+ notes[i].IsBlog = isBlog;
+ }
+ }
+}
+
+// 移动
+Note.moveNote = function(target, data) {
+ var noteId = $(target).attr("noteId");
+ var note = Note.cache[noteId];
+ var notebookId = data.notebookId;
+
+ if(!note.IsTrash && note.NotebookId == notebookId) {
+ return;
+ }
+
+ // 修改数量
+ Notebook.incrNotebookNumberNotes(notebookId);
+ if(!note.IsTrash) {
+ Notebook.minusNotebookNumberNotes(note.NotebookId);
+ }
+
+ ajaxGet("/note/moveNote", {noteId: noteId, notebookId: notebookId}, function(ret) {
+ if(ret && ret.NoteId) {
+ if(note.IsTrash) {
+ Note.changeToNext(target);
+ $(target).remove();
+ Note.clearCacheByNotebookId(notebookId);
+ } else {
+ // 不是trash, 移动, 那么判断是当前是否是all下
+ // 不在all下, 就删除之
+ // 如果当前是active, 那么clearNoteInfo之
+ if(!Notebook.curActiveNotebookIsAll()) {
+ Note.changeToNext(target);
+ if($(target).hasClass("item-active")) {
+ Note.clearNoteInfo();
+ }
+ $(target).remove();
+ } else {
+ // 不移动, 那么要改变其notebook title
+ $(target).find(".note-notebook").html(Notebook.getNotebookTitle(notebookId));
+ }
+
+ // 重新清空cache 之前的和之后的
+ Note.clearCacheByNotebookId(note.NotebookId);
+ Note.clearCacheByNotebookId(notebookId);
+ }
+
+ // 改变缓存
+ Note.setNoteCache(ret)
+ }
+ });
+}
+
+// 复制
+// data是自动传来的, 是contextmenu数据
+Note.copyNote = function(target, data, isShared) {
+ var noteId = $(target).attr("noteId");
+ var note = Note.cache[noteId];
+ var notebookId = data.notebookId;
+
+ // trash不能复制, 不能复制给自己
+ if(note.IsTrash || note.NotebookId == notebookId) {
+ return;
+ }
+
+ var url = "/note/copyNote";
+ var data = {noteId: noteId, notebookId: notebookId};
+ if(isShared) {
+ url = "/note/copySharedNote";
+ data.fromUserId = note.UserId;
+ }
+
+ ajaxGet(url, data, function(ret) {
+ if(ret && ret.NoteId) {
+ // 重新清空cache 之后的
+ Note.clearCacheByNotebookId(notebookId);
+ // 改变缓存, 添加之
+ Note.setNoteCache(ret)
+ }
+ });
+
+ // 增加数量
+ Notebook.incrNotebookNumberNotes(notebookId)
+}
+
+// 这里速度不慢, 很快
+Note.getContextNotebooks = function(notebooks) {
+ var moves = [];
+ var copys = [];
+ var copys2 = [];
+ for(var i in notebooks) {
+ var notebook = notebooks[i];
+ var move = {text: notebook.Title, notebookId: notebook.NotebookId, action: Note.moveNote}
+ var copy = {text: notebook.Title, notebookId: notebook.NotebookId, action: Note.copyNote}
+ var copy2 = {text: notebook.Title, notebookId: notebook.NotebookId, action: Share.copySharedNote}
+ if(!isEmpty(notebook.Subs)) {
+ var mc = Note.getContextNotebooks(notebook.Subs);
+ move.items = mc[0];
+ copy.items = mc[1];
+ copy2.items = mc[2];
+ move.type = "group";
+ move.width = 150;
+ copy.type = "group";
+ copy.width = 150;
+ copy2.type = "group";
+ copy2.width = 150;
+ }
+ moves.push(move);
+ copys.push(copy);
+ copys2.push(copy2);
+ }
+ return [moves, copys, copys2];
+}
+// Notebook调用
+Note.contextmenu = null;
+Note.notebooksCopy = []; // share会用到
+Note.initContextmenu = function() {
+ var self = Note;
+ if(Note.contextmenu) {
+ Note.contextmenu.destroy();
+ }
+ // 得到可移动的notebook
+ var notebooks = Notebook.everNotebooks;
+ var mc = self.getContextNotebooks(notebooks);
+
+ var notebooksMove = mc[0];
+ var notebooksCopy = mc[1];
+ self.notebooksCopy = mc[2];
+
+ //---------------------
+ // context menu
+ //---------------------
+ var noteListMenu = {
+ width: 180,
+ items: [
+ { text: getMsg("shareToFriends"), alias: 'shareToFriends', icon: "", faIcon: "fa-share-square-o", action: Note.listNoteShareUserInfo},
+ { type: "splitLine" },
+ { text: getMsg("publicAsBlog"), alias: 'set2Blog', faIcon: "fa-bold", action: Note.setNote2Blog },
+ { text: getMsg("cancelPublic"), alias: 'unset2Blog', faIcon: "fa-undo", action: Note.setNote2Blog },
+ //{ type: "splitLine" },
+ //{ text: "分享到社区", alias: 'html2Image', icon: "", action: Note.html2Image},
+ { type: "splitLine" },
+ { text: getMsg("delete"), icon: "", faIcon: "fa-trash-o", action: Note.deleteNote },
+ { text: getMsg("move"), alias: "move", faIcon: "fa-arrow-right",
+ type: "group",
+ width: 180,
+ items: notebooksMove
+ },
+ { text: getMsg("copy"), alias: "copy", icon:"", faIcon: "fa-copy",
+ type: "group",
+ width: 180,
+ items: notebooksCopy
+ }
+ ],
+ onShow: applyrule,
+ onContextMenu: beforeContextMenu,
+
+ parent: "#noteItemList",
+ children: ".item-my",
+ }
+
+ function menuAction(target) {
+ // $('#myModal').modal('show')
+ showDialog("dialogUpdateNotebook", {title: "修改笔记本", postShow: function() {
+ }});
+ }
+ function applyrule(menu) {
+ var noteId = $(this).attr("noteId");
+ var note = Note.cache[noteId];
+ if(!note) {
+ return;
+ }
+ // 要disable的items
+ var items = [];
+
+ // 如果是trash, 什么都不能做
+ if(note.IsTrash) {
+ items.push("shareToFriends");
+ items.push("shareStatus");
+ items.push("unset2Blog");
+ items.push("set2Blog");
+ items.push("copy");
+ } else {
+ // 是否已公开为blog
+ if(!note.IsBlog) {
+ items.push("unset2Blog");
+ } else {
+ items.push("set2Blog");
+ }
+
+ // 移动与复制不能是本notebook下
+ var notebookTitle = Notebook.getNotebookTitle(note.NotebookId);
+ items.push("move." + notebookTitle);
+ items.push("copy." + notebookTitle);
+ }
+
+ menu.applyrule({
+ name: "target..",
+ disable: true,
+ items: items
+ });
+
+ }
+ function beforeContextMenu() {
+ return this.id != "target3";
+ }
+
+ // 这里很慢!!
+ Note.contextmenu = $("#noteItemList .item-my").contextmenu(noteListMenu);
+}
+
+// 附件
+// 笔记的附件需要ajax获取
+// 建一张附件表? attachId, noteId, 其它信息
+// note里有attach_nums字段记录个数
+// [ok]
+var Attach = {
+ loadedNoteAttachs: {}, // noteId => [attch1Info, attach2Info...] // 按笔记
+ attachsMap: {}, // attachId => attachInfo
+ init: function() {
+ var self = this;
+ // 显示attachs
+ $("#showAttach").click(function(){
+ self.renderAttachs(Note.curNoteId);
+ });
+ // 防止点击隐藏
+ self.attachListO.click(function(e) {
+ e.stopPropagation();
+ });
+ // 删除
+ self.attachListO.on("click", ".delete-attach", function(e) {
+ e.stopPropagation();
+ var attachId = $(this).closest('li').data("id");
+ var t = this;
+ if(confirm("Are you sure to delete it ?")) {
+ $(t).button("loading");
+ ajaxPost("/attach/deleteAttach", {attachId: attachId}, function(re) {
+ $(t).button("reset");
+ if(reIsOk(re)) {
+ self.deleteAttach(attachId);
+ } else {
+ alert(re.Msg);
+ }
+ });
+ }
+ });
+ // 下载
+ self.attachListO.on("click", ".download-attach", function(e) {
+ e.stopPropagation();
+ var attachId = $(this).closest('li').data("id");
+ window.open(UrlPrefix + "/attach/download?attachId=" + attachId);
+ // location.href = "/attach/download?attachId=" + attachId;
+ });
+ // 下载全部
+ self.downloadAllBtnO.click(function() {
+ window.open(UrlPrefix + "/attach/downloadAll?noteId=" + Note.curNoteId);
+ // location.href = "/attach/downloadAll?noteId=" + Note.curNoteId;
+ });
+
+ // make link
+ self.attachListO.on("click", ".link-attach", function(e) {
+ e.stopPropagation();
+ var attachId = $(this).closest('li').data("id");
+ var attach = self.attachsMap[attachId];
+ var src = UrlPrefix + "/attach/download?attachId=" + attachId;
+ if(LEA.isMarkdownEditor() && MarkdownEditor) {
+ MarkdownEditor.insertLink(src, attach.Title);
+ } else {
+ tinymce.activeEditor.insertContent('
' + attach.Title + '');
+ }
+ });
+
+ // make all link
+ self.linkAllBtnO.on("click",function(e) {
+ e.stopPropagation();
+ var note = Note.getCurNote();
+ if(!note) {
+ return;
+ }
+ var src = UrlPrefix + "/attach/downloadAll?noteId=" + Note.curNoteId
+ var title = note.Title ? note.Title + ".tar.gz" : "all.tar.gz";
+
+ if(LEA.isMarkdownEditor() && MarkdownEditor) {
+ MarkdownEditor.insertLink(src, title);
+ } else {
+ tinymce.activeEditor.insertContent('
' + title + '');
+ }
+ });
+ },
+ attachListO: $("#attachList"),
+ attachNumO: $("#attachNum"),
+ attachDropdownO: $("#attachDropdown"),
+ downloadAllBtnO: $("#downloadAllBtn"),
+ linkAllBtnO: $("#linkAllBtn"),
+ // 添加笔记时
+ clearNoteAttachNum: function() {
+ var self = this;
+ self.attachNumO.html("").hide();
+ },
+ renderNoteAttachNum: function(noteId, needHide) {
+ var self = this;
+ var note = Note.getNote(noteId);
+ if(note.AttachNum) {
+ self.attachNumO.html("(" + note.AttachNum + ")").show();
+ self.downloadAllBtnO.show();
+ self.linkAllBtnO.show();
+ } else {
+ self.attachNumO.hide();
+ self.downloadAllBtnO.hide();
+ self.linkAllBtnO.hide();
+ }
+
+ // 隐藏掉
+ if(needHide) {
+ self.attachDropdownO.removeClass("open");
+ }
+ },
+ _renderAttachs: function(attachs) {
+ var self = this;
+ // foreach 循环之
+ /*
+
+ leanote官abcefedafadfadfadfadfad方文档.doc
+
+
+
+
+
+ */
+ var html = "";
+ var attachNum = attachs.length;
+ for(var i = 0; i < attachNum; ++i) {
+ var each = attachs[i];
+ html += '
' +
+ '' + each.Title + '
' +
+ ' ' +
+ ' ' +
+ ' ' +
+ ' ' +
+ '
' +
+ '';
+ self.attachsMap[each.AttachId] = each;
+ }
+ self.attachListO.html(html);
+
+ // 设置数量
+ var note = Note.getCurNote();
+ if(note) {
+ note.AttachNum = attachNum;
+ self.renderNoteAttachNum(note.NoteId, false);
+ }
+ },
+ // 渲染noteId的附件
+ // 当点击"附件"时加载,
+ // TODO 判断是否已loaded
+ renderAttachs: function(noteId) {
+ var self = this;
+ if(self.loadedNoteAttachs[noteId]) {
+ self._renderAttachs(self.loadedNoteAttachs[noteId]);
+ return;
+ }
+ // 显示loading
+ self.attachListO.html('

');
+ // ajax获取noteAttachs
+ ajaxGet("/attach/getAttachs", {noteId: noteId}, function(ret) {
+ var list = [];
+ if(ret.Ok) {
+ list = ret.List;
+ if(!list) {
+ list = [];
+ }
+ }
+ // 添加到缓存中
+ self.loadedNoteAttachs[noteId] = list;
+ self._renderAttachs(list);
+ });
+ },
+ // 添加附件, attachment_upload上传调用
+ addAttach: function(attachInfo) {
+ var self = this;
+ if(!self.loadedNoteAttachs[attachInfo.NoteId]) {
+ self.loadedNoteAttachs[attachInfo.NoteId] = [];
+ }
+ self.loadedNoteAttachs[attachInfo.NoteId].push(attachInfo);
+ self.renderAttachs(attachInfo.NoteId);
+ },
+ // 删除
+ deleteAttach: function(attachId) {
+ var self = this;
+ var noteId = Note.curNoteId;
+ var attachs = self.loadedNoteAttachs[noteId];
+ for(var i = 0; i < attachs.length; ++i) {
+ if(attachs[i].AttachId == attachId) {
+ // 删除之, 并render之
+ attachs.splice(i, 1);
+ break;
+ }
+ }
+ // self.loadedNoteAttachs[noteId] = attachs;
+ self.renderAttachs(noteId);
+ },
+
+ // 下载
+ downloadAttach: function(fileId) {
+ var self = this;
+ },
+ downloadAll: function() {
+ }
+}
+
+//------------------- 事件
+$(function() {
+ // 附件初始化
+ Attach.init();
+
+ //-----------------
+ // for list nav
+ $("#noteItemList").on("click", ".item", function(event) {
+ log(event);
+ event.stopPropagation();
+ var noteId = $(this).attr("noteId");
+
+ // 手机端处理
+ Mobile.changeNote(noteId);
+
+ if(!noteId) {
+ return;
+ }
+ // 当前的和所选的是一个, 不改变
+ if(Note.curNoteId != noteId) {
+ Note.changeNote(noteId);
+ }
+ });
+
+ //------------------
+ // 新建笔记
+ // 1. 直接点击新建 OR
+ // 2. 点击nav for new note
+ $("#newNoteBtn, #editorMask .note").click(function() {
+ var notebookId = $("#curNotebookForNewNote").attr('notebookId');
+ Note.newNote(notebookId);
+ });
+ $("#newNoteMarkdownBtn, #editorMask .markdown").click(function() {
+ var notebookId = $("#curNotebookForNewNote").attr('notebookId');
+ Note.newNote(notebookId, false, "", true);
+ });
+ $("#notebookNavForNewNote").on("click", "li div", function() {
+ var notebookId = $(this).attr("notebookId");
+ if($(this).hasClass("new-note-right")) {
+ Note.newNote(notebookId, false, "", true);
+ } else {
+ Note.newNote(notebookId);
+ }
+ });
+ $("#searchNotebookForAdd").click(function(e) {
+ e.stopPropagation();
+ });
+ $("#searchNotebookForAdd").keyup(function() {
+ var key = $(this).val();
+ Notebook.searchNotebookForAddNote(key);
+ });
+ $("#searchNotebookForList").keyup(function() {
+ var key = $(this).val();
+ Notebook.searchNotebookForList(key);
+ });
+
+ //---------------------------
+ // 搜索, 按enter才搜索
+ /*
+ $("#searchNoteInput").on("keyup", function(e) {
+ Note.searchNote();
+ });
+ */
+ $("#searchNoteInput").on("keydown", function(e) {
+ var theEvent = e; // window.event || arguments.callee.caller.arguments[0];
+ if(theEvent.keyCode == 13 || theEvent.keyCode == 108) {
+ theEvent.preventDefault();
+ Note.searchNote();
+ return false;
+ }
+ });
+
+ //--------------------
+ // Note.initContextmenu();
+
+ //------------
+ // 文档历史
+ $("#contentHistory").click(function() {
+ Note.listNoteContentHistories()
+ });
+
+ $("#saveBtn").click(function() {
+ Note.curChangedSaveIt(true);
+ });
+
+ // blog
+ $("#noteItemList").on("click", ".item-blog", function(e) {
+ e.preventDefault();
+ e.stopPropagation();
+ // 得到ID
+ var noteId = $(this).parent().attr('noteId');
+ window.open("/blog/post/" + noteId);
+ });
+
+ // note setting
+ $("#noteItemList").on("click", ".item-my .item-setting", function(e) {
+ e.preventDefault();
+ e.stopPropagation();
+ var $p = $(this).parent();
+ Note.contextmenu.showMenu(e, $p);
+ });
+});
+
+// 定时器启动
+Note.startInterval();
\ No newline at end of file